Compare commits

...

291 Commits

Author SHA1 Message Date
Antoine Bertin bd61a43b2f Release 1.1.1 2016-01-03 11:22:15 +01:00
Antoine Bertin 7ffa1e6b23 Catch all errors when parsing metadata with enzyme 2016-01-03 10:51:10 +01:00
Antoine Bertin f799137483 Release 1.1 2015-12-29 23:39:28 +01:00
Antoine Bertin 4dadafb87f Fix unittests 2015-12-29 21:19:20 +01:00
Antoine Bertin e85c21f40e Fix pep8 in subscenter 2015-12-29 20:01:28 +01:00
Antoine Bertin e5c50242fa Use pytest-runner 2015-12-29 20:01:06 +01:00
Antoine Bertin 2eda69d429 Keep releases sorted in subscenter 2015-12-28 21:01:40 +01:00
Antoine Bertin 6e027133cc Fix api unittests 2015-12-28 17:02:45 +01:00
Antoine Bertin eb49003bd6 Clean README 2015-12-28 16:25:42 +01:00
Antoine Bertin 707b189ab2 Clean up subscenter 2015-12-28 16:23:49 +01:00
Antoine Bertin dfb0b85877 Remove Podnapisi video_types override 2015-12-28 16:22:12 +01:00
Antoine Bertin e0b7ce46cb Use str instead of string in docstrings 2015-12-28 16:21:37 +01:00
Antoine Bertin 5912f366f8 Remove leftover print statement in unittests 2015-12-28 16:21:18 +01:00
Antoine Bertin 8b3786a875 Fix sanitized_string_equal when passing None 2015-12-28 16:20:24 +01:00
Antoine Bertin 815cee81c5 Merge remote-tracking branch 'ofir123/subscenter_support' into subscenter 2015-12-27 20:25:07 +01:00
Antoine Bertin 3b08b452a0 Disable napiproject 2015-12-27 17:02:28 +01:00
Antoine Bertin b03f97c91e Fix typo in usage documentation 2015-11-07 18:17:04 +01:00
Antoine Bertin d62a09beba Restrict to guessit<2.0 2015-11-05 23:18:10 +01:00
Antoine Bertin 90ebdebe99 Update HISTORY 2015-11-05 23:17:38 +01:00
Antoine Bertin 2e37b94bd3 Add support for searching subtitles in a separate directory 2015-11-05 23:16:46 +01:00
Antoine Bertin f10cbc04e2 Fix shows with colon in name in addic7ed provider 2015-11-05 11:06:14 +01:00
Antoine Bertin 85de66bcf2 Update translations 2015-10-30 21:13:25 +01:00
Antoine Bertin a98b5a2a04 Code style 2015-10-30 21:12:34 +01:00
Antoine Bertin 51cf652fe2 Simplify instructions to generate the po template file 2015-10-30 21:12:19 +01:00
Antoine Bertin ae117cb383 Add support for transifex client 2015-10-30 21:11:27 +01:00
Antoine Bertin 7ec08b2dcb Update translations 2015-10-30 17:51:17 +01:00
Antoine Bertin e721d6c295 Fix logging message in download_best_subtitles 2015-10-30 17:41:43 +01:00
Antoine Bertin 9d9bf92a4f Merge pull request #520 from mouchar/develop
Get enconding from OpenSubtitles provider
2015-10-30 17:30:33 +01:00
Antoine Bertin fadf3d935f Add dev-requirements.txt 2015-10-30 17:23:48 +01:00
Antoine Bertin 06aae43d7f Update unittests and cassettes 2015-10-30 10:10:39 +01:00
Antoine Bertin 9b81449dbd Fix id property in thesubdb provider 2015-10-30 10:09:59 +01:00
Antoine Bertin c369e29975 Fix log messages for downloading subtitles in podnapisi and thesubdb 2015-10-30 09:06:41 +01:00
Antoine Bertin 1a00f6fe9a Add user-agent in requests of napiprojekt provider 2015-10-30 09:05:48 +01:00
Antoine Bertin b2c38e24a2 Merge branch 'develop' of github.com:Diaoul/subliminal into develop 2015-10-30 08:57:37 +01:00
Antoine Bertin 19b3fe8495 Merge pull request #532 from bogdal/fix/napiprojekt-tests
Fix napiprojekt tests
2015-10-30 08:27:22 +01:00
Adam Bogdał 7752b92588 Restore hash of scanned movie file 2015-10-30 02:48:50 +01:00
Adam Bogdał cddeb3e552 Set appropriate subhash 2015-10-30 02:27:11 +01:00
Adam Bogdał 84eb32a4f1 Use real file hash 2015-10-30 02:22:16 +01:00
Antoine Bertin 7779fc0a21 Use new string sanitizing functions in addic7ed provider 2015-10-29 23:30:16 +01:00
Antoine Bertin 1c8f7c1954 Use real name for marvels agents of shield 2015-10-29 23:28:59 +01:00
Antoine Bertin 9fc92ab065 Fix sanitize string logic 2015-10-29 23:27:24 +01:00
Antoine Bertin ea8b646c96 Add a TooManyRequests exception in addic7ed provider 2015-10-29 23:22:59 +01:00
Antoine Bertin bc218fa138 Fix for series name with special characters in addic7ed provider 2015-10-29 22:25:28 +01:00
Antoine Bertin 2ef474960b Improve matching on titles 2015-10-29 22:22:49 +01:00
Robert Moucha fe6cfa663a Get enconding from OpenSubtitles provider
OpenSubtitles returns 'SubEncoding' so we can avoid guess_encoding()

* added condition on encoding to test_download_subtitle
* Safe handling of corrupted encoding names
2015-10-21 14:54:57 +02:00
Antoine Bertin 769b16de83 Support python 3.5 2015-10-20 20:24:31 +02:00
Antoine Bertin 4e8ea6587b Merge pull request #508 from ratoaq2/patch-1
Fix for #507
2015-10-20 20:01:52 +02:00
ofir123 4eb23d6512 Removed title guessing. 2015-10-04 12:57:54 +03:00
ofir123 b756704121 Improved title search and added cache. 2015-10-02 17:59:30 +03:00
allanjones 192b7fce1d Fix for #507: TheSubDB pt is actually pt-BR 2015-09-22 14:29:36 +02:00
ofir123 1c35aac8ce Fixed CR notes. 2015-09-22 15:22:29 +03:00
ofir123 99a071f486 Fixed tests. 2015-09-14 14:44:06 +03:00
Antoine Bertin 62e71e4c75 Created and pushed by LingoHub. Project: 'subliminal' by User: 'diaoulael@gmail.com'. 2015-09-14 07:24:40 +02:00
ofir123 e44944c538 Fixed Python 3.4 compatibility. 2015-09-13 23:34:18 +03:00
ofir123 2dd9409f9c Sorted everything alphabetically. 2015-08-30 01:23:11 +03:00
ofir123 5d2292092f Fixed tests and refreshed all subscenter cassettes. 2015-08-29 20:27:07 +03:00
ofir123 9fb3576bb2 Zipfile and entry point fix. 2015-08-29 19:56:33 +03:00
ofir123 04e3512f71 Updated global test_api file. 2015-08-29 19:11:02 +03:00
ofir123 327a40ea75 Added tests file and cassettes. 2015-08-29 19:05:55 +03:00
ofir123 dc59b44371 Added the new SubsCenter provider, and updated CLI and docs accordingly. 2015-08-29 14:27:44 +03:00
Diaoul 979bc39522 Add gitter badge 2015-08-27 22:56:19 +02:00
Diaoul db1c404a02 Code style 2015-08-27 18:49:58 +02:00
Diaoul e05297b09f Update opensubtitles cassettes 2015-08-27 18:49:54 +02:00
Diaoul b60cb8a81f pep8 for nautilus 2015-08-27 17:27:23 +02:00
Diaoul 835dcd6eec Add contributing notes for translations 2015-08-27 17:09:10 +02:00
Diaoul 26cb66aa45 Add a README to examples 2015-08-27 17:08:51 +02:00
Diaoul d4dc59aeba Update french translations 2015-08-27 17:06:50 +02:00
Diaoul 5258ef400f Code style 2015-08-27 17:06:13 +02:00
Diaoul 50ef6efcfa Discourage use of the single flag 2015-08-27 17:05:40 +02:00
Diaoul 4b1cb36343 Make sure dict keys are unique in nautilus 2015-08-27 11:59:46 +02:00
Diaoul 4324460005 Add nautilus integration 2015-08-27 00:03:48 +02:00
Diaoul 620688d92a Refactor paths in cli 2015-08-26 22:59:10 +02:00
Diaoul 89d5ea929b Add a config class in cli 2015-08-26 22:58:37 +02:00
Diaoul 168004dc89 Describe how to get a debug log file in CONTRIBUTING 2015-08-26 22:57:55 +02:00
Diaoul 1ad88032f2 Switch to dev version 2015-08-26 22:49:56 +02:00
Diaoul 4000f9e894 Fix allow_failures in travis 2015-08-24 15:17:00 +02:00
Diaoul 8b825263d4 Use use the VCR_RECORD_MODE environment variable in napiprojekt tests 2015-08-23 11:43:22 +02:00
Diaoul 7247568d96 Make sure extra pytest opts are passed to the test command 2015-08-23 11:37:09 +02:00
Diaoul 74d5175152 Fix travis matrix 2015-08-23 11:37:09 +02:00
Diaoul 130d961e72 Update tests to use the VCR_RECORD_MODE environment variable 2015-08-23 11:37:09 +02:00
Diaoul 02dd9a77f0 Add a travis configuration for integration tests without cassette 2015-08-23 11:37:09 +02:00
Diaoul f6f40d81a1 Use explicit strings for python versions in travis 2015-08-23 11:37:09 +02:00
Diaoul 79fb0442dd Remove unicode_literals imports 2015-08-23 11:36:32 +02:00
Diaoul 56a8b2c7cf Code style changes and slight refactoring of napiprojekt 2015-08-22 23:20:30 +02:00
Diaoul 71a06d5bbc Normalize some logging messages 2015-08-22 21:41:24 +02:00
Diaoul 55ac0a941b Merge remote-tracking branch 'bogdal/napiprojekt' into develop 2015-08-22 20:51:45 +02:00
Antoine Bertin 0aaa4347f8 Merge pull request #491 from h3llrais3r/develop
Fix logging error
2015-08-22 20:46:32 +02:00
Antoine Bertin 4c11e2d5c1 Merge pull request #492 from h3llrais3r/login-opensubtitles
Login opensubtitles
2015-08-22 20:46:10 +02:00
Diaoul 3bc239ffee Add contributing notes 2015-08-22 20:33:04 +02:00
h3llrais3r e797516468 Updated opensubtitles test for login bad password 2015-08-22 11:36:07 +02:00
h3llrais3r aa67ccd098 Clear token in opensubtitles terminate 2015-08-22 11:35:58 +02:00
h3llrais3r b1c5ca5a00 Cleanup and code formatting 2015-08-22 11:35:53 +02:00
h3llrais3r 050d29a186 Add tests for opensubtitles login 2015-08-22 11:35:50 +02:00
h3llrais3r 7d8ce8bb30 Add support for opensubitles login
Make it possible to specify your own username and password for
downloading from opensubtitles.
2015-08-22 11:35:44 +02:00
h3llrais3r 38f5d303f9 Fix logging error
Fix console error when logging score below min_score
2015-08-22 11:20:47 +02:00
Diaoul 38c86b4cf1 Fix library usage example in README 2015-08-21 17:52:01 +02:00
Adam Bogdał 1da6d181d5 Add NapiProjekt provider 2015-08-18 03:55:56 +02:00
Diaoul e0788be5af Release 1.0.1 2015-07-23 00:44:56 +02:00
Diaoul 52709a3e25 Remove useless dash in cli message 2015-07-23 00:35:05 +02:00
Diaoul 25cf0ac996 Fix scaled score in cli 2015-07-23 00:33:58 +02:00
Diaoul 4c3d7d5b9d Improve CLI
- Convert paths to str
- Add logs
- Catch errors
- Colored output report
2015-07-23 00:11:29 +02:00
Diaoul b4cbfc0de2 Add CLI api doc 2015-07-23 00:05:47 +02:00
Diaoul 600393c12a Fix scan_videos docstring 2015-07-22 19:43:34 +02:00
Diaoul faeeeca39a Switch to dev version 2015-07-22 19:43:07 +02:00
Diaoul 537d33b66a Release 1.0 2015-07-22 01:45:23 +02:00
Diaoul 3933db4936 Add wheel dev dependency 2015-07-22 01:45:12 +02:00
Diaoul 86c6d2c253 Add minimum required version for dependencies 2015-07-21 23:54:00 +02:00
Diaoul 75ffe3767f Skip doctests for python 2 2015-07-21 21:31:10 +02:00
Diaoul 015b7547db Use a session fixture to configure cache region 2015-07-21 21:30:48 +02:00
Diaoul 2a6d861968 Check for files in mkv fixture 2015-07-21 21:29:58 +02:00
Diaoul 0f188e30b0 Update badges and urls 2015-07-21 21:22:52 +02:00
Diaoul 5faf8277f1 Remove pip logs from travis cache 2015-07-21 02:20:31 +02:00
Diaoul b86b4f1405 Add mkv test data to travis cache 2015-07-21 02:09:30 +02:00
Diaoul 98f903174a Merge branch 'master' of github.com:Diaoul/subliminal 2015-07-21 01:56:52 +02:00
Diaoul d8df8a4624 Fix region configuration in tests 2015-07-21 01:56:40 +02:00
Diaoul 0df19e300f Remove --doctest-modules 2015-07-21 01:56:31 +02:00
Antoine Bertin b26bf1c470 Add License badge to README 2015-07-20 23:16:32 +02:00
Diaoul 53cd3f6118 Update documentation and add doctests 2015-07-20 23:00:55 +02:00
Diaoul c23f955b6c Merge branch 'master' of github.com:Diaoul/subliminal 2015-07-20 22:59:04 +02:00
Diaoul 5c5b2656ec Add possible values for min-score in cli help 2015-07-20 22:58:56 +02:00
Diaoul c6278909ff Remove redundant documentation 2015-07-20 22:54:09 +02:00
Diaoul 64d599d6f7 Add compute_score to subliminal namespace 2015-07-20 22:53:40 +02:00
Diaoul 90d638e9c6 Replace DispatchExtensionManager with EnabledExtensionManager 2015-07-20 22:53:13 +02:00
Antoine Bertin 1dabbf78b2 Simplify example in README 2015-07-16 16:18:10 +02:00
Antoine Bertin 58b0b0c756 Improve README readability 2015-07-16 16:13:49 +02:00
Antoine Bertin 1426d9d62d Add more verbosity for travis 2015-07-16 15:58:56 +02:00
Antoine Bertin 85db6c7884 Merge pull request #463 from martinp/python2-fix
Fix for Python 2
2015-07-16 15:30:26 +02:00
Martin Polden 43d02c349f Fix for Python 2
Python 2 doesn't have the exist_ok parameter.
2015-07-16 13:26:55 +02:00
Diaoul c7af4573ca Add cache and sudo directives to travis 2015-07-16 01:41:45 +02:00
Diaoul 73a217eb1b Fix travis build 2015-07-16 01:14:33 +02:00
Diaoul b1854222a0 Merge branch 'master' of github.com:Diaoul/subliminal 2015-07-16 01:05:09 +02:00
Diaoul 7cb72b2bb2 Update to 1.0.dev0 2015-07-16 01:01:38 +02:00
Antoine Bertin 00245dd44d Merge pull request #451 from h3llrais3r/fix_podnapisi_provider
Fix podnapisi provider
2015-05-09 19:22:30 +02:00
h3llrais3r c1972ab26f Fix podnapisi provider
The download url is not longer a link on the page, but it's the
subtitle.page_link appended with '/download'.
2015-05-09 17:59:40 +02:00
Antoine Bertin b86254b0b8 Merge pull request #426 from oxan/addic7ed-codec
Also guess video codec from version in addic7ed provider
2015-01-31 17:51:59 +01:00
Oxan van Leeuwen 00157ee655 Also guess video codec from version in addic7ed provider 2014-12-27 21:17:22 +01:00
Antoine Bertin 6aaece1c44 Merge pull request #403 from h3llrais3r/opensubtitles-query-search
Implemented query search for opensubtitles
2014-09-17 20:27:45 +02:00
h3llrais3r 6445064836 Implemented query search for opensubtitles
Opensubtitles was only using the hash search functionality. For series,
it will now search on series name, season and episode.
2014-09-17 10:17:45 +02:00
Antoine Bertin 9d0c9d93a0 Merge pull request #396 from joseflavio/master
Adding support to proper decode Polish and Bulgarian
2014-08-17 20:09:31 +02:00
Jose Flavio Aguilar 01a06166ff Adding support to proper decode Polish and Bulgarian 2014-08-17 18:49:19 +02:00
Antoine Bertin f41fc2bceb Merge pull request #377 from goll/master
Update for python-guessit 0.7.1
2014-05-07 18:24:10 +02:00
Adrian Goll 5ffa344f1c Update for python-guessit 0.7.1
Latest guessit doesn't require 'autodetect' anymore. Here is a snippet from the usage:

-t TYPE, --type=TYPE  the suggested file type: movie, episode. If undefined, type will be guessed.
2014-05-07 14:18:14 +02:00
Antoine Bertin 31c2b21350 Merge pull request #362 from northerndrifter/p1
Fix hearing impaired flag for podnapisi
2014-03-26 10:36:13 +01:00
northerndrifter b2c6562c64 fixed hearing impaired flag for podnapisi 2014-03-25 21:01:13 +01:00
Antoine Bertin 02a36d9cad Merge pull request #336 from Nikoli/master
Use pysrt 1.0.1: first version migrated from charade to chardet
2014-02-17 10:32:05 +01:00
Nikoli 5dcb1916b2 Use pysrt 1.0.1: first version migrated from charade to chardet 2014-02-14 04:41:09 +04:00
Antoine Bertin c5623ec868 Merge pull request #327 from queeup/master
Fix wrong Turkish subtitle encoding detection #315
2014-02-12 14:58:07 +01:00
queeup 1c17c1987f Fix wrong Turkish subtitle encoding detection #315
Because of chardet Turkish encoding detect issue subliminal can't
recognize Turkish encoding and convert correctly to utf-8 #315
2014-02-12 01:28:57 +02:00
Antoine Bertin b6318bfae0 Update docs and HISTORY 2014-02-11 23:23:00 +01:00
Antoine Bertin 0e8489951d Use bytes for subtitle's content and refactor subtitle validation 2014-02-11 23:22:47 +01:00
Antoine Bertin 21d3a1c1bb Merge pull request #331 from h3llrais3r/master
Add a format to Video and use it for matching
2014-02-09 13:44:36 +01:00
h3llrais3r 9055021282 Added format to hash equation 2014-02-08 23:41:12 +01:00
h3llrais3r 10fcfd21b1 Ignore Pycharm ide files 2014-02-08 22:37:22 +01:00
h3llrais3r c142233ff9 Upgraded guessit to version 0.7 2014-02-08 20:28:30 +01:00
h3llrais3r e660e47265 Fixed unit tests related to format matching (2) 2014-02-07 23:22:36 +01:00
h3llrais3r 40c4c0aeec Fixed unit tests related to format matching 2014-02-07 22:36:44 +01:00
h3llrais3r 97c9a7b025 Updated methods for guess properties 2014-02-07 22:34:18 +01:00
h3llrais3r 9145f2530b Added format for matching on movie 2014-02-07 22:33:37 +01:00
h3llrais3r a1b073e5d6 Fixed guess properties for tvsubtitles 2014-02-07 22:32:03 +01:00
h3llrais3r 7425153760 Use guessit method for partial filenames
Use the correct guessit method when we don't have the complete filename.
We don't fake an episode filename anymore.
2014-02-05 22:37:07 +01:00
h3llrais3r c0836a94a9 Use guessit for matching 2014-01-30 23:11:29 +01:00
h3llrais3r 9dc24951a2 Use format for matching 2014-01-30 21:32:55 +01:00
Antoine Bertin f3eaad8d1c Close xmlrpc in terminate in opensubtitles 2014-01-29 00:17:22 +01:00
Antoine Bertin effde5014e Use little-endian for OpenSubtitles hash 2014-01-28 23:43:35 +01:00
Antoine Bertin 74c4c06a5c Fix cli with new ProviderManager 2014-01-28 21:52:11 +01:00
Antoine Bertin f10b7683c9 Rework provider loading and management
- Rename ProviderManager to ProviderPool
- Add a ProviderManager to manage the entry point
2014-01-27 22:17:00 +01:00
Antoine Bertin 5e26185c9f Fixes for babelfish 0.5.1 2014-01-27 20:58:31 +01:00
Antoine Bertin 2d350f5340 Merge branch 'master' of github.com:Diaoul/subliminal 2014-01-26 14:29:32 +01:00
Antoine Bertin f0519bbefb Update for babelfish 0.5.1 2014-01-26 14:29:20 +01:00
Antoine Bertin 7acfb3f027 More python3 compatibility 2014-01-26 14:27:54 +01:00
Antoine Bertin 24621e15e3 Merge pull request #317 from doron1/patch-1
Update subtitle.py
2014-01-21 13:45:34 -08:00
doron1 3474b2363f Update subtitle.py 2014-01-21 20:45:44 +02:00
Antoine Bertin 560dea3e3e More python3 compatibility 2014-01-19 18:48:50 +01:00
Antoine Bertin f6e5cf91ab Use pysrt 1.0.0 2014-01-19 14:55:19 +01:00
Antoine Bertin 57e8770fda Update HISTORY 2014-01-19 14:45:49 +01:00
Antoine Bertin 7e8f7e41b5 Update unittests 2014-01-19 14:36:37 +01:00
Antoine Bertin 84d890d7b0 Refactor exceptions, add a TimeoutTransport and fix line endings 2014-01-19 14:36:26 +01:00
Antoine Bertin e57c90b97e Respect xdg for cache file 2014-01-19 09:46:00 +01:00
Antoine Bertin 236c43b807 Improve version numbering in documentation 2013-12-13 14:29:58 +01:00
Antoine Bertin bb32c286d9 Fix podnapisi provider 2013-12-12 23:42:37 +01:00
Antoine Bertin f1d4975079 Fix a typo in documentation examples 2013-12-12 22:11:27 +01:00
Antoine Bertin 464b783477 Fix release detection in podnapisi 2013-12-05 20:23:41 +01:00
Antoine Bertin c4756030c7 Fix subtitle re download with single 2013-12-05 20:20:23 +01:00
Antoine Bertin bf538fee32 Add support for directory and encoding in cli 2013-12-03 21:41:20 +01:00
Antoine Bertin cc32c29930 Use debug level for language parsing error in subtitle track name 2013-12-03 21:41:04 +01:00
Antoine Bertin 27b8703949 Add asctime to log file in cli 2013-12-03 21:40:21 +01:00
Antoine Bertin 0d9bbff534 Rename folder_path to directory and add encoding in save_subtitles 2013-12-03 21:39:37 +01:00
Antoine Bertin cad60e73a6 Fix single subtitles saving in cli 2013-12-03 20:36:01 +01:00
Antoine Bertin 1d14d21684 Update addic7ed unittests 2013-12-02 21:10:56 +01:00
Antoine Bertin 0733ef7d32 Fix podnapisi download 2013-12-02 20:29:45 +01:00
Antoine Bertin 143f872166 Remove debug print statement in decode 2013-12-02 20:29:30 +01:00
Antoine Bertin 95abab3c18 Catch more video age detection errors 2013-12-02 20:23:31 +01:00
Antoine Bertin 2e5fb46ebc Fix example in documentation 2013-12-02 00:27:59 +01:00
Antoine Bertin 0d11092178 Improve encoding detection 2013-12-01 22:00:31 +01:00
Antoine Bertin 80589f325a Use lowercase comments 2013-12-01 21:57:02 +01:00
Antoine Bertin 0b6b3d0905 Fix relative links in addic7ed and tvsubtitles for page_link 2013-12-01 18:16:14 +01:00
Antoine Bertin bc97f772b8 Remove bierdopje from the docs 2013-12-01 18:15:30 +01:00
Antoine Bertin efe944a10c Remove extra end of line character in cli 2013-12-01 10:17:57 +01:00
Antoine Bertin 9d9aed2d4b Add a page_link attribute to Subtitle 2013-11-30 23:42:21 +01:00
Antoine Bertin 9cd8b7d593 Use print statement to write to stderr 2013-11-30 23:41:24 +01:00
Antoine Bertin abfd2361d4 Use Video.fromname in cli 2013-11-30 23:41:07 +01:00
Antoine Bertin b10e616ec2 Add traceback to enzyme parsing error log 2013-11-28 21:26:22 +01:00
Antoine Bertin 7dc2a90edc Catch video age detection errors 2013-11-28 21:22:54 +01:00
Antoine Bertin cb53199748 Update cli documentation 2013-11-28 20:48:49 +01:00
Antoine Bertin 7b2402c436 More explicit log messages in api 2013-11-28 20:21:37 +01:00
Antoine Bertin 0715437888 Add support for file logging in cli 2013-11-28 20:21:21 +01:00
Antoine Bertin bea95113e7 Update HISTORY 2013-11-28 00:47:57 +01:00
Antoine Bertin e73e969f58 Remove dead BierDopje provider 2013-11-28 00:47:47 +01:00
Antoine Bertin fd30cf7388 Add year in episode
Used to make a difference between two series with the same name
2013-11-28 00:46:37 +01:00
Antoine Bertin fa9792b280 Fix missing return statement for Video.fromname 2013-11-27 23:33:37 +01:00
Antoine Bertin e93530c7c7 Add a maximum expiration time to cached functions 2013-11-25 23:25:31 +01:00
Antoine Bertin 35d4c37d61 Update to new API
- Add some provider utilities
- Add a ProviderManager class to manage multiple providers
- Add a content attribute to the Subtitle class
- Dissociate download and save functions to give more control to the
user
- Add a fromname classmethod to Video, Episode and Movie classes
- Update unittests
- Update documentation
2013-11-25 22:26:11 +01:00
Antoine Bertin 4d61d3fc42 Switch to 0.8.0 2013-11-22 23:44:02 +01:00
Antoine Bertin a24388137e Remove sphinxcontrib-programoutput 2013-11-22 23:38:17 +01:00
Antoine Bertin 60c7666610 Update badges in README 2013-11-22 21:38:12 +01:00
Antoine Bertin e11f1c4b28 Fix unittests for addic7ed 2013-11-22 21:31:12 +01:00
Antoine Bertin e1b32f237c Merge branch 'develop' 2013-11-22 21:06:04 +01:00
Antoine Bertin fe76634d02 Release 0.7.3 2013-11-22 21:05:49 +01:00
Antoine Bertin b499540bed Sync README and documentation 2013-11-22 20:47:56 +01:00
Antoine Bertin 7b4a9c2060 Fix wrong error catched for babelfish 0.4.0 2013-11-21 23:52:06 +01:00
Antoine Bertin a84cc80a88 Ignore IDE error in cli 2013-11-21 23:51:25 +01:00
Antoine Bertin 241cea9729 Fix podnapisi tests 2013-11-21 23:31:43 +01:00
Antoine Bertin 4b83ddc63e Improve assertions in tests 2013-11-21 23:31:02 +01:00
Antoine Bertin 0b431fbb8d Add Podnapisi to the list of providers in documentation 2013-11-21 00:38:01 +01:00
Antoine Bertin 3736d921a1 Update dogpile.cache to 0.5.2 and use a MutexLock in cli 2013-11-21 00:12:53 +01:00
Antoine Bertin 380fb28d2e Update to babelfish 0.4.0 2013-11-20 22:40:06 +01:00
Antoine Bertin 64c0ee4ccf Add setuptools to dev-requirements.txt 2013-11-20 22:38:55 +01:00
Antoine Bertin 5977bf69fb Improve embedded subtitles language detection 2013-11-14 22:08:48 +01:00
CelestianX 179ae6a24e Updated README with proper information
Section relative to the library was invalid. Missing references and
arguments.
2013-11-14 21:55:24 +01:00
Antoine Bertin 16942ec4c7 Switch to 0.7.3 2013-11-14 21:53:36 +01:00
Antoine Bertin 6f5378ea40 Be more permissive in subtitle validation 2013-11-14 21:51:39 +01:00
Antoine Bertin 02ee2039f4 Skip empty language in addic7ed 2013-11-14 21:51:04 +01:00
Antoine Bertin e7f89c1a19 Release 0.7.2 2013-11-10 11:06:46 +01:00
Antoine Bertin be4f9d92eb Remove unused import 2013-11-10 11:03:37 +01:00
Antoine Bertin ca63b97e79 Parse IETF language format in cli 2013-11-10 10:25:00 +01:00
Antoine Bertin c1ed4a0232 Fix exception handling when validating subtitle 2013-11-10 10:24:23 +01:00
Antoine Bertin b826a0bf08 Use debug level for subtitle track detection 2013-11-10 10:23:41 +01:00
Antoine Bertin fd0d87d719 Use info level when skipping providers 2013-11-10 10:23:24 +01:00
Antoine Bertin 094373f3c1 Add podnapisi provider 2013-11-10 10:22:33 +01:00
Antoine Bertin 5dac623c9f Update to babelfish 0.3.0 2013-11-09 20:25:39 +01:00
Antoine Bertin 57d1e772ec Use more list comprehension 2013-11-09 18:09:19 +01:00
Antoine Bertin 983efbfd9b Reduce debug logging in opensubtitles 2013-11-09 18:06:52 +01:00
Antoine Bertin 1f11e293c1 Add missing docstring 2013-11-09 18:06:17 +01:00
Antoine Bertin bfd278ae1c Change Subtitle repr language format 2013-11-09 18:05:48 +01:00
Antoine Bertin dbe1b9d2af Update guessit requirement 2013-11-09 03:04:13 +01:00
Antoine Bertin d71bc4bf09 Set CLI default cache expiration time to 30 days 2013-11-07 00:33:38 +01:00
Antoine Bertin faf2e1dfa4 Add a CACHE_VERSION to force cache reloading on version change 2013-11-07 00:26:06 +01:00
Antoine Bertin 93360aa1bb Fix find_show_id in tvsubtitles for ambiguous series 2013-11-06 21:08:09 +01:00
Antoine Bertin 8df7780ef9 Switch to 0.7.2 2013-11-06 00:42:44 +01:00
Antoine Bertin c1fda7f44c Release 0.7.1 2013-11-06 00:32:33 +01:00
Antoine Bertin ce42201eee Improve exceptions in addic7ed terminate 2013-11-06 00:31:49 +01:00
Antoine Bertin f65131e5b0 Use the full path to guess in scan_video 2013-11-06 00:20:26 +01:00
Antoine Bertin 8d9efa5dc0 Catch exceptions during provider terminate in api 2013-11-06 00:19:45 +01:00
Antoine Bertin 1a54bfb732 Fix ProviderNotAvailable in list_subtitles 2013-11-06 00:03:53 +01:00
Antoine Bertin a15c1f05b2 Skip links and hidden files and folders in scan_video 2013-11-05 23:25:57 +01:00
Antoine Bertin ccfd341fe9 Fix enzyme track detection 2013-11-05 00:23:24 +01:00
Antoine Bertin aab8e0aa4d Fix spacing around operator 2013-11-04 23:14:25 +01:00
Antoine Bertin 9b669c8a3d Update opensubtitles unittests 2013-11-04 00:56:21 +01:00
Antoine Bertin 50960fed24 Fix single subtitles being always downloaded 2013-11-04 00:43:16 +01:00
Antoine Bertin ff61bc8d2d Add colors to debug log 2013-11-04 00:34:02 +01:00
Antoine Bertin e5d9c229ed Improve CLI 2013-11-04 00:08:20 +01:00
Antoine Bertin b0e38c7e2c Remove unnecessary personal information from addic7ed logging 2013-11-04 00:08:10 +01:00
Antoine Bertin c12dade5ea Add tests for scan_video 2013-11-03 11:53:29 -05:00
Antoine Bertin cb35dabf31 Remove lxml dependency 2013-11-03 11:52:39 -05:00
Antoine Bertin a66cf4b501 Require babelfish 0.2.1 2013-11-03 11:29:42 -05:00
Antoine Bertin c355d6a24a Fix hashes computation for small files 2013-11-03 11:26:34 -05:00
Antoine Bertin 60c1e93037 Scan for und languages and fix download for single 2013-11-01 08:38:24 +01:00
Antoine Bertin 708126aca3 Fix subtitle language filtering of videos 2013-10-31 23:24:49 +01:00
Antoine Bertin bf763a3ad7 Always log found embedded subtitles 2013-10-31 23:23:36 +01:00
Antoine Bertin bb0c3b91a2 Fix the download loop not breaking when done 2013-10-31 22:49:46 +01:00
Antoine Bertin a7c0cd0d19 Fix intersection of sets 2013-10-31 22:49:01 +01:00
Antoine Bertin f315ef9bd0 Fix subtitle language detection in api 2013-10-31 22:32:43 +01:00
Antoine Bertin b262a5491c Fix embedded subtitles always being scanned 2013-10-31 20:47:28 +01:00
Antoine Bertin d7b30336b6 Fix badly encoded subtitles 2013-10-31 20:46:19 +01:00
Antoine Bertin c834bac460 Use absolute paths in cli 2013-10-31 08:37:37 +01:00
Antoine Bertin 36da0a1204 Validate cache-file in cli 2013-10-31 08:37:28 +01:00
Antoine Bertin 6ece9271eb Require absolute paths in scan_video and scan_videos 2013-10-31 08:36:13 +01:00
Antoine Bertin a465058bb3 Catch enzyme and babelfish exceptions in scan_video 2013-10-30 22:47:13 +01:00
Antoine Bertin bad7dbb55c Explicitly use utf-8 for subtitle files encoding 2013-10-30 21:07:18 +01:00
Antoine Bertin 501aaf076e Handle download limit in Addic7ed 2013-10-30 21:05:48 +01:00
Antoine Bertin 49d27cc7e4 Add login support for Addic7ed 2013-10-30 08:40:03 +01:00
Antoine Bertin e3903f77e9 Use babelfish 0.2.0 2013-10-30 08:39:06 +01:00
Antoine Bertin b6ee9b5d7e Fix required language argument in cli 2013-10-30 08:30:11 +01:00
Antoine Bertin e3301cefd7 Fix language extensions loading
The alpha2 converter might not yet be loaded at this point.
When subliminal's converters are loaded, they import subliminal
which import the video module.
2013-10-30 08:29:43 +01:00
Antoine Bertin 74ac38329e Fix None not being a valid language for embedded subtitles 2013-10-30 08:24:15 +01:00
Antoine Bertin 50c39382e6 Improve error logging 2013-10-29 18:07:26 +01:00
Antoine Bertin 9a65708855 Add missing age implementation 2013-10-29 18:06:57 +01:00
Antoine Bertin 4ebcb2cc95 Fix video_types in some providers 2013-10-29 17:26:56 +01:00
Antoine Bertin 0c3c41fb4a Fix unsupported type for timedelta in cli 2013-10-29 17:26:29 +01:00
Antoine Bertin f44942f78e Switch to 0.7.1 2013-10-29 17:23:41 +01:00
Antoine Bertin d7f2211800 Update dev requirements for sphinx documentation upload in pypi 2013-10-29 12:59:50 +01:00
162 changed files with 331659 additions and 2031 deletions
+4 -1
View File
@@ -1,5 +1,8 @@
[report]
exclude_lines =
def __repr__
pragma: no cover
raise NotImplementedError
def __repr__
if __name__ == .__main__.:
omit =
subliminal/cli.py
+48 -27
View File
@@ -1,43 +1,64 @@
*.py[co]
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Packages
*.egg
*.egg-info
dist
build
eggs
parts
bin
var
sdist
develop-eggs
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.tox
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
# Translations
*.mo
*.pot
# Mr Developer
.mr.developer.cfg
# Django stuff:
*.log
# Pydev
.project
.pydevproject
.settings
# Sphinx documentation
docs/_build/
# Rope
.ropeproject
# PyBuilder
target/
# Sphinx
docs/_build
# Pycharm
.idea
# Subliminal unittests
subliminal/tests/*.srt
subliminal/tests/*_files
subliminal/tests/*_cache
# Subliminal
tests/data/mkv/
-3
View File
@@ -1,3 +0,0 @@
[submodule "docs/_themes"]
path = docs/_themes
url = git://github.com/Diaoul/diaoul-sphinx-themes.git
+36 -16
View File
@@ -1,24 +1,44 @@
sudo: false
language: python
python:
- "2.7"
- "3.3"
- "3.4"
- "3.5"
env:
- PARSER=native
- PARSER=lxml
matrix:
include:
- python: "3.4"
env:
- PARSER=native
- VCR_RECORD_MODE=all
- PYTEST_ADDOPTS="-m integration"
allow_failures:
- python: "3.4"
env:
- PARSER=native
- VCR_RECORD_MODE=all
- PYTEST_ADDOPTS="-m integration"
cache:
directories:
- $HOME/.cache/pip
- tests/data/mkv
before_cache:
- rm -f $HOME/.cache/pip/log/debug.log
install:
- pip install coveralls --use-mirrors
- pip install -r requirements.txt --use-mirrors
- pip install -e .[test]
- if [ $PARSER = "lxml" ]; then pip install lxml; fi
- pip install coveralls
script:
- coverage run --source=subliminal setup.py test
script: python setup.py test --addopts "--cov subliminal --verbose $PYTEST_ADDOPTS"
after_success:
- coveralls
notifications:
email: false
irc:
channels:
- "irc.freenode.org#subliminal"
on_success: change
on_failure: always
use_notice: true
skip_join: true
after_success: coveralls
+8
View File
@@ -0,0 +1,8 @@
[main]
host = https://www.transifex.com
[subliminal.subliminal]
source_file = examples/i18n/subliminal.pot
source_lang = en
type = PO
file_filter = examples/i18n/<lang>.po
+19
View File
@@ -0,0 +1,19 @@
Contributing
============
Issues
------
Issues are intended for bug report and feature requests. For any bug report please make sure to include the complete
stack trace and DEBUG level logs as well as reproduce steps.
If you use the CLI, you can create a debug log file with `subliminal --debug [...] 2> debug.log`.
Pull Requests
-------------
You can contribute code and documentation with pull requests. Any code contribution must be unit tested and the pull
request open against the *develop* branch.
Translations
------------
Contribution to translations can be made on [subliminal's transifex page](https://www.transifex.com/subliminal/subliminal/)
Subliminal is configured to work with [transifex-client](http://docs.transifex.com/client/)
+118 -14
View File
@@ -1,8 +1,101 @@
Changelog
=========
---------
1.1.1
^^^^^
**release date:** 2016-01-03
* Fix scanning videos on bad MKV files
1.1
^^^
**release date:** 2015-12-29
* Fix library usage example in README
* Fix for series name with special characters in addic7ed provider
* Fix id property in thesubdb provider
* Improve matching on titles
* Add support for nautilus context menu with translations
* Add support for searching subtitles in a separate directory
* Add subscenter provider
* Add support for python 3.5
1.0.1
^^^^^
**release date:** 2015-07-23
* Fix unicode issues in CLI (python 2 only)
* Fix score scaling in CLI (python 2 only)
* Improve error handling in CLI
* Color collect report in CLI
1.0
^^^
**release date:** 2015-07-22
* Many changes and fixes
* New test suite
* New documentation
* New CLI
* Added support for SubsCenter
0.7.5
^^^^^
**release date:** 2015-03-04
* Update requirements
* Remove BierDopje provider
* Add pre-guessed video optional argument in scan_video
* Improve hearing impaired support
* Fix TVSubtitles and Podnapisi providers
0.7.4
^^^^^
**release date:** 2014-01-27
* Fix requirements for guessit and babelfish
0.7.3
^^^^^
**release date:** 2013-11-22
* Fix windows compatibility
* Improve subtitle validation
* Improve embedded subtitle languages detection
* Improve unittests
0.7.2
^^^^^
**release date:** 2013-11-10
* Fix TVSubtitles for ambiguous series
* Add a CACHE_VERSION to force cache reloading on version change
* Set CLI default cache expiration time to 30 days
* Add podnapisi provider
* Support script for languages e.g. Latn, Cyrl
* Improve logging levels
* Fix subtitle validation in some rare cases
0.7.1
^^^^^
**release date:** 2013-11-06
* Improve CLI
* Add login support for Addic7ed
* Remove lxml dependency
* Many fixes
0.7.0
-----
^^^^^
**release date:** 2013-10-29
**WARNING:** Complete rewrite of subliminal with backward incompatible changes
@@ -19,20 +112,23 @@ Changelog
* Drop a few providers
* And much more...
0.6.4
-----
^^^^^
**release date:** 2013-05-19
* Fix requirements due to enzyme 0.3
0.6.3
-----
^^^^^
**release date:** 2013-01-17
* Fix requirements due to requests 1.0
0.6.2
-----
^^^^^
**release date:** 2012-09-15
* Fix BierDopje
@@ -43,8 +139,9 @@ Changelog
* Add possible services in help message of the CLI
* Allow existing filenames to be passed without the ./ prefix
0.6.1
-----
^^^^^
**release date:** 2012-06-24
* Fix subtitle release name in BierDopje
@@ -61,9 +158,11 @@ Changelog
* Fix guessit.Language in Video.scan
* Fix language detection of subtitles
0.6.0
-----
^^^^^
**release date:** 2012-06-16
**WARNING:** Backward incompatible changes
* Fix --workers option in CLI
@@ -77,13 +176,14 @@ Changelog
0.5.1
-----
^^^^^
**release date:** 2012-03-25
* Improve error handling of enzyme parsing
0.5
---
^^^
**release date:** 2012-03-25
**WARNING:** Backward incompatible changes
@@ -96,15 +196,17 @@ Changelog
* Remove class Subliminal
* Remove permissions handling
0.4
---
^^^
**release date:** 2011-11-11
* Many fixes
* Better error handling
0.3
---
^^^
**release date:** 2011-08-18
* Fix a bug when series is not guessed by guessit
@@ -114,16 +216,18 @@ Changelog
* Add possibility to choose mode of created files
* Add more checks before adjusting permissions
0.2
---
^^^
**release date:** 2011-07-11
* Fix plugin configuration
* Fix some encoding issues
* Remove extra logging
0.1
---
**release date:** not released yet
^^^
**release date:** *private release*
* Initial release
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2013 Antoine Bertin
Copyright (c) 2015 Antoine Bertin
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
+75 -32
View File
@@ -1,56 +1,99 @@
Subliminal
==========
Subtitles, faster than your thoughts.
Subliminal is a python library to search and download subtitles.
It comes with an easy to use CLI (command-line interface) suitable for direct use or cron jobs.
.. image:: https://img.shields.io/pypi/v/subliminal.svg
:target: https://pypi.python.org/pypi/subliminal
:alt: Latest Version
.. image:: https://travis-ci.org/Diaoul/subliminal.png?branch=develop
:target: https://travis-ci.org/Diaoul/subliminal
.. image:: https://travis-ci.org/Diaoul/subliminal.svg?branch=master
:target: https://travis-ci.org/Diaoul/subliminal
:alt: Travis CI build status
.. image:: https://coveralls.io/repos/Diaoul/subliminal/badge.png?branch=develop
:target: https://coveralls.io/r/Diaoul/subliminal?branch=develop
.. image:: https://readthedocs.org/projects/subliminal/badge/?version=latest
:target: https://subliminal.readthedocs.org/
:alt: Documentation Status
.. image:: https://coveralls.io/repos/Diaoul/subliminal/badge.svg?branch=master&service=github
:target: https://coveralls.io/github/Diaoul/subliminal?branch=master
:alt: Code coverage
.. image:: https://img.shields.io/github/license/Diaoul/subliminal.svg
:target: https://github.com/Diaoul/subliminal/blob/master/LICENSE
:alt: License
.. image:: https://img.shields.io/badge/gitter-join%20chat-1dce73.svg
:alt: Join the chat at https://gitter.im/Diaoul/subliminal
:target: https://gitter.im/Diaoul/subliminal
Providers
---------
Subliminal uses multiple providers to give users a vast choice and have a better chance to find the
best matching subtitles. Providers are extensible through a dedicated entry point.
* Addic7ed
* BierDopje
* OpenSubtitles
* TheSubDB
* TvSubtitles
:Project page: https://github.com/Diaoul/subliminal
:Documentation: https://subliminal.readthedocs.org/
Usage
-----
CLI
^^^
Download english subtitles::
Download English subtitles::
$ subliminal -l en -- The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
1 subtitle downloaded
$ subliminal download -l en The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
Collecting videos [####################################] 100%
1 video collected / 0 video ignored / 0 error
Downloading subtitles [####################################] 100%
Downloaded 1 subtitle
Library
^^^^^^^
Download best subtitles in French and English for videos less than one week old in a video folder,
skipping videos that already have subtitles whether they are embedded or not::
Download best subtitles in French and English for videos less than two weeks old in a video folder:
.. code:: python
from datetime import timedelta
from babelfish import Language
from datetime import timedelta
import subliminal
from subliminal import download_best_subtitles, region, save_subtitles, scan_videos
# configure the cache
subliminal.cache_region.configure('dogpile.cache.dbm', arguments={'filename': '/path/to/cachefile.dbm'})
region.configure('dogpile.cache.dbm', arguments={'filename': 'cachefile.dbm'})
# scan for videos in the folder and their subtitles
videos = scan_videos(['/path/to/video/folder'], subtitles=True, embedded_subtitles=True)
# scan for videos newer than 2 weeks and their existing subtitles in a folder
videos = [v for v in scan_videos('/video/folder') if v.age < timedelta(weeks=2)]
# download
subliminal.download_best_subtitles(videos, {Language('eng'), Language('fra')}, age=timedelta(week=1))
# download best subtitles
subtitles = download_best_subtitles(videos, {Language('eng'), Language('fra')})
# save them to disk, next to the video
for v in videos:
save_subtitles(v, subtitles[v])
License
-------
MIT
Nautilus integration
--------------------
Screenshots
^^^^^^^^^^^
.. image:: http://i.imgur.com/NCwELpB.png
:alt: Menu
.. image:: http://i.imgur.com/Y58ky88.png
:alt: Configuration
.. image:: http://i.imgur.com/qem3DGj.png
:alt: Choose subtitles
Install
^^^^^^^
1. Install subliminal on your system
``sudo pip install -U subliminal``
2. Install nautilus-python with your package manager
``sudo apt-get install nautilus-python``
3. Create the extension directory
``mkdir -p ~/.local/share/nautilus-python/extensions/subliminal``
4. Copy the script
``cp examples/nautilus.py ~/.local/share/nautilus-python/extensions/subliminal-nautilus.py``
5. Copy UI files
``cp -R examples/ui ~/.local/share/nautilus-python/extensions/subliminal/``
6. (Optional) Create a translation directory for your language
``mkdir -p ~/.local/share/nautilus-python/extensions/subliminal/locale/fr/LC_MESSAGES``
7. (Optional) Install the translation
``msgfmt examples/i18n/fr.po -o ~/.local/share/nautilus-python/extensions/subliminal/locale/fr/LC_MESSAGES/subliminal.mo``
+1 -3
View File
@@ -1,3 +1 @@
sympy>=0.7.3
sphinx>=1.1.3
sphinxcontrib-programoutput>=0.8
-e .[dev,test]
+17 -2
View File
@@ -2,7 +2,7 @@
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXOPTS = -n -W
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
@@ -19,7 +19,7 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@@ -30,6 +30,7 @@ help:
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@@ -45,6 +46,7 @@ help:
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
@@ -89,6 +91,14 @@ qthelp:
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/subliminal.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@@ -166,6 +176,11 @@ doctest:
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
-4
View File
@@ -1,4 +0,0 @@
<h3>Subliminal</h3>
<p>
Subliminal is a Python library to search and download subtitles.
</p>
Submodule docs/_themes deleted from 24aa9748e4
+4 -5
View File
@@ -1,8 +1,7 @@
API
===
.. module:: subliminal.api
.. automodule:: subliminal.api
.. autodata:: PROVIDERS_ENTRY_POINT
.. autofunction:: list_subtitles
.. autofunction:: download_subtitles
.. autofunction:: download_best_subtitles
.. data:: provider_manager
:class:`~stevedore.extension.ExtensionManager` based on the entry point ``subliminal.providers``
+16 -2
View File
@@ -2,6 +2,20 @@ Cache
=====
.. module:: subliminal.cache
.. autodata:: region
.. autodata:: CACHE_VERSION
:annotation:
Refer to `dogpile.cache's documentation <http://dogpilecache.readthedocs.org>`_ to see how to configure a region
.. autodata:: SHOW_EXPIRATION_TIME
:annotation:
.. autodata:: EPISODE_EXPIRATION_TIME
:annotation:
.. data:: region
:annotation:
The :class:`~dogpile.cache.region.CacheRegion`
Refer to dogpile.cache's `region configuration documentation
<http://dogpilecache.readthedocs.org/en/latest/usage.html#region-configuration>`_ to see how to configure the region
+1 -5
View File
@@ -1,7 +1,3 @@
CLI
===
.. module:: subliminal.cli
subliminal
----------
.. program-output:: subliminal --help
.. automodule:: subliminal.cli
+1 -7
View File
@@ -1,9 +1,3 @@
Exceptions
==========
.. module:: subliminal.exceptions
.. autoclass:: Error
.. autoclass:: ProviderError
.. autoclass:: ProviderConfigurationError
.. autoclass:: ProviderNotAvailable
.. autoclass:: InvalidSubtitle
.. automodule:: subliminal.exceptions
+1 -4
View File
@@ -1,6 +1,3 @@
Providers
=========
.. module:: subliminal.providers
.. autoclass:: Provider
:members:
.. automodule:: subliminal.providers
+1 -4
View File
@@ -1,6 +1,3 @@
Score
=====
.. module:: subliminal.score
.. autofunction:: get_episode_equations
.. autofunction:: get_movie_equations
.. automodule:: subliminal.score
+1 -7
View File
@@ -1,9 +1,3 @@
Subtitle
========
.. module:: subliminal.subtitle
.. autoclass:: Subtitle
:members:
.. autofunction:: get_subtitle_path
.. autofunction:: is_valid_subtitle
.. autofunction:: compute_guess_matches
.. automodule:: subliminal.subtitle
+7 -15
View File
@@ -1,18 +1,10 @@
Video
=====
.. module:: subliminal.video
.. automodule:: subliminal.video
:exclude-members: VIDEO_EXTENSIONS, SUBTITLE_EXTENSIONS
.. autodata:: VIDEO_EXTENSIONS
.. autodata:: SUBTITLE_EXTENSIONS
.. autodata:: LANGUAGE_EXTENSIONS
.. autoclass:: Video
:members:
.. autoclass:: Episode
:members:
.. autoclass:: Movie
:members:
.. autofunction:: hash_opensubtitles
.. autofunction:: hash_thesubdb
.. autofunction:: scan_subtitle_languages
.. autofunction:: scan_video
.. autofunction:: scan_videos
.. autodata:: VIDEO_EXTENSIONS
:annotation:
.. autodata:: SUBTITLE_EXTENSIONS
:annotation:
+280
View File
@@ -0,0 +1,280 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://podnapisi.net/subtitles/search/old?sXML=1&sTS=5&sTE=18&sK=The+Big+Bang+Theory&sL=hu
response:
body: {string: "<html>\r\n<head><title>302 Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>302
Found</h1></center>\r\n<hr><center>nginx/1.8.0</center>\r\n</body>\r\n</html>\r\n"}
headers:
Connection: [keep-alive]
Content-Length: ['160']
Content-Type: [text/html]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
Location: ['http://www.podnapisi.net/subtitles/search/old?sXML=1&sTS=5&sTE=18&sK=The+Big+Bang+Theory&sL=hu']
Server: [nginx/1.8.0]
status: {code: 302, message: Moved Temporarily}
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://www.podnapisi.net/subtitles/search/old?sXML=1&sTS=5&sTE=18&sK=The+Big+Bang+Theory&sL=hu
response:
body: {string: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<!DOCTYPE
results [\n <!ELEMENT results (#PCDATA|pagination|subtitle)*>\n <!ELEMENT
pagination (current, count, results)>\n <!ELEMENT current (#PCDATA)>\n
\ <!ELEMENT count (#PCDATA)>\n <!ELEMENT subtitle (id, title, year,
movieId, url, uploaderId, uploaderName, release, languageId, languageName,
time, tvSeason, tvEpisode, tvSpecial, cds, format, fps, rating, flags, downloads)>\n
\ <!ELEMENT id (#PCDATA)>\n <!ELEMENT pid (#PCDATA)>\n <!ELEMENT
title (#PCDATA)>\n <!ELEMENT year (#PCDATA)>\n <!ELEMENT movieId
(#PCDATA)>\n <!ELEMENT url (#PCDATA)>\n <!ELEMENT uploaderId (#PCDATA)>\n
\ <!ELEMENT uploaderName (#PCDATA)>\n <!ELEMENT release (#PCDATA)>\n
\ <!ELEMENT languageId (#PCDATA)>\n <!ELEMENT languageName (#PCDATA)>\n
\ <!ELEMENT language (#PCDATA)>\n <!ELEMENT time (#PCDATA)>\n <!ELEMENT
tvSeason (#PCDATA)>\n <!ELEMENT tvEpisode (#PCDATA)>\n <!ELEMENT
tvSpecial (#PCDATA)>\n <!ELEMENT cds (#PCDATA)>\n <!ELEMENT format
(#PCDATA)>\n <!ELEMENT fps (#PCDATA)>\n <!ELEMENT rating (#PCDATA)>\n
\ <!ELEMENT flags (#PCDATA)>\n <!ELEMENT new_flags (#PCDATA)>\n <!ELEMENT
flag (#PCDATA)>\n <!ELEMENT downloads (#PCDATA)>\n <!ELEMENT exactHashes
(#PCDATA)>]> <results><pagination><current>1</current><count>1</count><results>2</results></pagination><subtitle><id>1495142</id><pid>ZtAW</pid><title>The
Big Bang Theory</title><year>2007</year><movieId>sY0G</movieId><url>http://www.podnapisi.net/subtitles/hu-the-big-bang-theory-2007-S05E18/ZtAW</url><uploaderId>40156</uploaderId><uploaderName>kvrle</uploaderName><release>The.Big.Bang.Theory.S05E18.HDTV-LOL
The.Big.Bang.Theory.S05E18.720p.HDTV.x264-DIMENSION</release><languageId>15</languageId><languageName>Hungarian</languageName><language>hu</language><time>1330213369</time><tvSeason>5</tvSeason><tvEpisode>18</tvEpisode><tvSpecial>0</tvSpecial><cds
/><format>N/A</format><fps>N/A</fps><rating>0.0</rating><flags>h</flags><new_flags><flag>high_definition</flag></new_flags><downloads>497</downloads><exactHashes
/></subtitle><subtitle><id>1495096</id><pid>ONAW</pid><title>The Big Bang
Theory</title><year>2007</year><movieId>sY0G</movieId><url>http://www.podnapisi.net/subtitles/hu-the-big-bang-theory-2007-S05E18/ONAW</url><uploaderId>1</uploaderId><uploaderName>Anonymous</uploaderName><release>The.Big.Bang.Theory.S05E18.HDTV.XviD-FQM</release><languageId>15</languageId><languageName>Hungarian</languageName><language>hu</language><time>1330134575</time><tvSeason>5</tvSeason><tvEpisode>18</tvEpisode><tvSpecial>0</tvSpecial><cds
/><format>N/A</format><fps>N/A</fps><rating>0.0</rating><flags /><new_flags
/><downloads>347</downloads><exactHashes /></subtitle></results>"}
headers:
Connection: [keep-alive]
Content-Length: ['2792']
Content-Type: [text/xml;charset=utf-8]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
Server: [nginx/1.8.0]
status: {code: 200, message: OK}
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://podnapisi.net/subtitles/ZtAW/download?container=zip
response:
body: {string: "<html>\r\n<head><title>302 Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>302
Found</h1></center>\r\n<hr><center>nginx/1.8.0</center>\r\n</body>\r\n</html>\r\n"}
headers:
Connection: [keep-alive]
Content-Length: ['160']
Content-Type: [text/html]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
Location: ['http://www.podnapisi.net/subtitles/ZtAW/download?container=zip']
Server: [nginx/1.8.0]
status: {code: 302, message: Moved Temporarily}
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://www.podnapisi.net/subtitles/ZtAW/download?container=zip
response:
body:
string: !!binary |
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
headers:
Accept-Ranges: [bytes]
Connection: [keep-alive]
Content-Disposition: [attachment; filename="e638ea178f406cb584f48051501e2cb4db4fce1d.zip"]
Content-Length: ['10541']
Content-Type: [application/octet-stream]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
ETag: ['"4f497ffb-292d"']
Last-Modified: ['Sun, 26 Feb 2012 00:42:35 GMT']
Server: [nginx/1.8.0]
status: {code: 200, message: OK}
version: 1
+90 -44
View File
@@ -1,9 +1,11 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# subliminal documentation build configuration file, created by
# sphinx-quickstart on Wed Oct 23 23:24:28 2013.
# sphinx-quickstart on Sat Jul 11 00:40:28 2015.
#
# This file is execfile()d with the current directory set to its containing dir.
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
@@ -11,28 +13,37 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
import sys
import os
import shlex
import sphinx_rtd_theme
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('..'))
sys.path.append(os.path.abspath('_themes'))
import subliminal
# -- General configuration -----------------------------------------------------
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc', 'sphinxcontrib.programoutput']
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
'sphinx.ext.viewcode',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
@@ -44,19 +55,23 @@ master_doc = 'index'
# General information about the project.
project = subliminal.__title__
copyright = ' '.join(subliminal.__copyright__.split()[1:])
author = subliminal.__copyright__.split(', ')[1]
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = subliminal.__version__
version = subliminal.__version__.split('-')[0]
# The full version, including alpha/beta/rc tags.
release = subliminal.__version__
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
@@ -68,7 +83,8 @@ release = subliminal.__version__
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
@@ -91,29 +107,29 @@ pygments_style = 'sphinx'
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ---------------------------------------------------
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'diaoul'
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {'github_user': 'Diaoul',
'github_repo': 'subliminal',
'github_branch': 'master',
'fork_me': 1,
'flattr': 0,
'gittip': 'Diaoul',
'pypi_downloads': 1,
'pypi_version': 0,
'travis': 0,
'coveralls': 0}
#html_theme_options = {}
# html_theme_options = {
# 'github_user': 'Diaoul',
# 'github_repo': project,
# 'travis_button': True,
# 'gratipay_user': 'Diaoul'
# }
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['_themes']
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
@@ -136,6 +152,11 @@ html_theme_path = ['_themes']
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
@@ -145,12 +166,7 @@ html_static_path = ['_static']
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
html_sidebars = {
'index': ['sidebar-intro.html', 'sidebar-star.html', 'sidebar-pypi.html', 'sidebar-donate.html',
'sourcelink.html', 'searchbox.html'],
'**': ['sidebar-intro.html', 'sidebar-star.html', 'sidebar-pypi.html', 'sidebar-donate.html',
'localtoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html']
}
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
@@ -182,11 +198,24 @@ html_sidebars = {
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'subliminaldoc'
htmlhelp_basename = project + 'doc'
# -- Options for LaTeX output --------------------------------------------------
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
@@ -197,13 +226,17 @@ latex_elements = {
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'subliminal.tex', u'subliminal Documentation',
u'Antoine Bertin', 'manual'),
(master_doc, project + '.tex', project + ' Documentation',
author, 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -227,28 +260,28 @@ latex_documents = [
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'subliminal', u'subliminal Documentation',
[u'Antoine Bertin'], 1)
(master_doc, project, project + ' Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output ------------------------------------------------
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'subliminal', u'subliminal Documentation',
u'Antoine Bertin', 'subliminal', 'One line description of project.',
'Miscellaneous'),
(master_doc, project, project + ' Documentation',
author, project, 'Subtitles, faster than your thoughts',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
@@ -264,6 +297,19 @@ texinfo_documents = [
#texinfo_no_detailmenu = False
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {
'python': ('http://docs.python.org/3.4', None),
'guessit': ('http://guessit.readthedocs.org/en/latest', None),
'babelfish': ('http://babelfish.readthedocs.org/en/latest', None),
'dogpilecache': ('http://dogpilecache.readthedocs.org/en/latest', None),
'dogpilecore': ('http://dogpilecore.readthedocs.org/en/latest', None),
'stevedore': ('http://docs.openstack.org/developer/stevedore', None),
'click': ('http://click.pocoo.org/4', None)
}
# -- Options for autodoc -------------------------------------------------------
autodoc_member_order = 'bysource'
autodoc_default_flags = ['members']
+39
View File
@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
import os
import sys
import pytest
try:
from unittest.mock import Mock
except ImportError:
from mock import Mock
from vcr import VCR
from subliminal.cache import region
vcr = VCR(path_transformer=lambda path: path + '.yaml',
match_on=['method', 'scheme', 'host', 'port', 'path', 'query', 'body'],
cassette_library_dir=os.path.join('docs', 'cassettes'))
@pytest.fixture(autouse=True, scope='session')
def configure_region():
region.configure('dogpile.cache.null')
region.configure = Mock()
@pytest.fixture(autouse=True)
def chdir(tmpdir, monkeypatch):
monkeypatch.chdir(str(tmpdir))
@pytest.yield_fixture(autouse=True)
def use_cassette(request):
with vcr.use_cassette('test_' + request.fspath.purebasename):
yield
@pytest.fixture(autouse=True)
def skip_python_2():
if sys.version_info < (3, 0):
return pytest.skip('Requires python 3')
+24 -77
View File
@@ -1,76 +1,12 @@
.. subliminal documentation master file, created by
sphinx-quickstart on Wed Oct 23 23:24:28 2013.
sphinx-quickstart on Sat Jul 11 00:40:28 2015.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Subliminal
==========
Release v\ |version|
Welcome to subliminal!
======================
Subliminal is a python library to search and download subtitles.
It comes with an easy to use :abbr:`CLI (command-line interface)` suitable for direct use or cron jobs.
Providers
---------
Subliminal uses multiple providers to give users a vast choice and have a better chance to find the
best matching subtitles. Providers are extensible through a dedicated entry point.
* Addic7ed
* BierDopje
* OpenSubtitles
* TheSubDB
* TvSubtitles
Usage
-----
CLI
^^^
Download english subtitles::
$ subliminal -l en -- The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
1 subtitle downloaded
See :mod:`subliminal.cli`
Library
^^^^^^^
Download best subtitles in French and English for videos less than one week old in a video folder,
skipping videos that already have subtitles whether they are embedded or not::
from babelfish import Language
from datetime import timedelta
import subliminal
# configure the cache
subliminal.cache_region.configure('dogpile.cache.dbm', arguments={'filename': '/path/to/cachefile.dbm'})
# scan for videos in the folder and their subtitles
videos = scan_videos(['/path/to/video/folder'], subtitles=True, embedded_subtitles=True)
# download
subliminal.download_best_subtitles(videos, {Language('eng'), Language('fra')}, age=timedelta(week=1))
See :mod:`subliminal.api`, :func:`~subliminal.video.scan_videos` and :func:`~subliminal.video.scan_video`
How it works
------------
Subliminal makes use of various libraries to achieve its goal:
* `enzyme <http://enzyme.readthedocs.org>`_ to detect embedded subtitles in videos and retrieve metadata
* `guessit <http://guessit.readthedocs.org>`_ to guess informations from filenames
* `babelfish <http://babelfish.readthedocs.org>`_ to work with languages
* `requests <http://docs.python-requests.org>`_ to make human readable HTTP requests
* `BeautifulSoup <http://www.crummy.com/software/BeautifulSoup>`_ to parse HTML and XML
* `dogpile.cache <http://dogpilecache.readthedocs.org>`_ to cache intermediate search data
* `charade <https://github.com/sigmavirus24/charade>`_ to detect subtitles' encoding
* `pysrt <https://github.com/byroot/pysrt>`_ to validate downloaded subtitles
License
-------
MIT
It comes with an easy to use yet powerful :abbr:`CLI (command-line interface)` suitable for direct use or cron jobs.
Documentation
@@ -78,25 +14,36 @@ Documentation
.. toctree::
:maxdepth: 2
provider_guide
user/usage
user/how_it_works
user/cli
user/provider_guide
API Documentation
-----------------
If you are looking for information on a specific function, class or method,
this part of the documentation is for you.
If you are looking for information on a specific function, class or method, this part of the documentation is for you.
.. toctree::
:maxdepth: 2
:maxdepth: 1
api/api
api/video
api/subtitle
api/providers
api/cache
api/score
api/cli
api/exceptions
api/providers
api/score
api/subtitle
api/video
.. include:: ../HISTORY.rst
License
-------
MIT
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
+263
View File
@@ -0,0 +1,263 @@
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
set I18NSPHINXOPTS=%SPHINXOPTS% .
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. xml to make Docutils-native XML files
echo. pseudoxml to make pseudoxml-XML files for display purposes
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
echo. coverage to run coverage check of the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
REM Check if sphinx-build is available and fallback to Python version if any
%SPHINXBUILD% 2> nul
if errorlevel 9009 goto sphinx_python
goto sphinx_ok
:sphinx_python
set SPHINXBUILD=python -m sphinx.__init__
%SPHINXBUILD% 2> nul
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
:sphinx_ok
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\subliminal.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\subliminal.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdf" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf
cd %~dp0
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdfja" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf-ja
cd %~dp0
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
if "%1" == "coverage" (
%SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
if errorlevel 1 exit /b 1
echo.
echo.Testing of coverage in the sources finished, look at the ^
results in %BUILDDIR%/coverage/python.txt.
goto end
)
if "%1" == "xml" (
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The XML files are in %BUILDDIR%/xml.
goto end
)
if "%1" == "pseudoxml" (
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
goto end
)
:end
+79
View File
@@ -0,0 +1,79 @@
.. _cli:
CLI
===
subliminal
----------
.. code-block:: none
$ subliminal --help
Usage: subliminal [OPTIONS] COMMAND [ARGS]...
Subtitles, faster than your thoughts.
Options:
--addic7ed USERNAME PASSWORD Addic7ed configuration.
--opensubtitles USERNAME PASSWORD
OpenSubtitles configuration.
--cache-dir DIRECTORY Path to the cache directory. [default:
~/.config/subliminal]
--debug Print useful information for debugging subliminal and for
reporting bugs.
--version Show the version and exit.
--help Show this message and exit.
Commands:
cache Cache management.
download Download best subtitles.
Suggestions and bug reports are greatly appreciated: https://github.com/Diaoul/subliminal/
subliminal download
-------------------
.. code-block:: none
$ subliminal download --help
Usage: subliminal download [OPTIONS] PATH...
Download best subtitles.
PATH can be an directory containing videos, a video file path or a video file name. It can be
used multiple times.
If an existing subtitle is detected (external or embedded) in the correct language, the
download is skipped for the associated video.
Options:
-l, --language LANGUAGE Language as IETF code, e.g. en, pt-BR (can be used multiple
times). [required]
-p, --provider [addic7ed|napiprojekt|opensubtitles|podnapisi|subscenter|thesubdb|tvsubtitles]
Provider to use (can be used multiple times).
-a, --age AGE Filter videos newer than AGE, e.g. 12h, 1w2d.
-d, --directory DIR Directory where to save subtitles, default is next to the video
file.
-e, --encoding ENC Subtitle file encoding, default is to preserve original
encoding.
-s, --single Save subtitle without language code in the file name, i.e. use
.srt extension.
-f, --force Force download even if a subtitle already exist.
-hi, --hearing-impaired Prefer hearing impaired subtitles.
-m, --min-score INTEGER RANGE Minimum score for a subtitle to be downloaded (0 to 100).
-v, --verbose Increase verbosity.
--help Show this message and exit.
subliminal cache
----------------
.. code-block:: none
$ subliminal cache --help
Usage: subliminal cache [OPTIONS]
Cache management.
Options:
--clear-subliminal Clear subliminal's cache. Use this ONLY if your cache is corrupted or if
you experience issues.
--help Show this message and exit.
+50
View File
@@ -0,0 +1,50 @@
How it works
============
Providers
---------
Subliminal uses multiple providers to give users a vast choice and have a better chance to find the best matching
subtitles. Current supported providers are:
* Addic7ed
* NapiProjekt
* OpenSubtitles
* Podnapisi
* SubsCenter
* TheSubDB
* TvSubtitles
Providers all inherit the same :class:`~subliminal.providers.Provider` base class and thus share the same API.
They are registered on the ``subliminal.providers`` entry point and are exposed through the
:data:`~subliminal.api.provider_manager` for easy access.
To make working with multiple providers seamlessly, the :class:`~subliminal.api.ProviderPool` exposes the same API but
distributes it to its providers.
.. _scoring:
Scoring
-------
Rating subtitles and comparing them is probably the most difficult part and this is where subliminal excels with its
powerful scoring algorithm.
Using `guessit <http://guessit.readthedocs.org>`_ and `enzyme <http://enzyme.readthedocs.org>`_, subliminal extracts
properties of the video and match them with the properties of the subtitles found with the providers.
Equations in :mod:`subliminal.score` give a score to each property (called a match). The more matches the video and
the subtitle have the higher the score computed with :func:`~subliminal.subtitle.compute_score` gets.
Libraries
---------
Various libraries are used by subliminal and are key to its success:
* `guessit <http://guessit.readthedocs.org>`_ to guess informations from filenames
* `enzyme <http://enzyme.readthedocs.org>`_ to detect embedded subtitles in videos and read other video metadata
* `babelfish <http://babelfish.readthedocs.org>`_ to work with languages
* `requests <http://docs.python-requests.org>`_ to make human readable HTTP requests
* `BeautifulSoup <http://www.crummy.com/software/BeautifulSoup>`_ to parse HTML and XML
* `dogpile.cache <http://dogpilecache.readthedocs.org>`_ to cache intermediate search results
* `stevedore <http://docs.openstack.org/developer/stevedore/>`_ to manage the provider entry point
* `chardet <http://chardet.readthedocs.org>`_ to detect subtitles' encoding
* `pysrt <https://github.com/byroot/pysrt>`_ to validate downloaded subtitles
@@ -1,6 +1,7 @@
Provider Guide
==============
This guide is going to explain how to add a :class:`~subliminal.providers.Provider` to subliminal
This guide is going to explain how to add a :class:`~subliminal.providers.Provider` to subliminal. You are encouraged
to take a look at the existing providers, it can be a nice base to start your own provider.
Requirements
@@ -33,11 +34,12 @@ Per-user authentication is allowed and must be configured at instantiation as ke
will be done by the user through the `provider_configs` argument of the :func:`~subliminal.api.list_subtitles` and
:func:`~subliminal.api.download_best_subtitles` functions. No network operation must be done during instantiation,
only configuration. Any error in the configuration must raise a
:class:`~subliminal.exceptions.ProviderConfigurationError`.
:class:`~subliminal.exceptions.ConfigurationError`.
Beyond this point, if a network error occurs, a :class:`~subliminal.exceptions.ProviderNotAvailable` exception
must be raised and an unexpected behavior must raise a :class:`~subliminal.exceptions.ProviderError` exception.
Beyond this point, if an error occurs, a generic :class:`~subliminal.exceptions.ProviderError` exception
must be raised. You can also use more explicit exception classes :class:`~subliminal.exceptions.AuthenticationError`
and :class:`~subliminal.exceptions.DownloadLimitExceeded`.
Initialization / Termination
@@ -51,14 +53,16 @@ Caching policy
--------------
To save bandwidth and improve querying time, intermediate data should be cached when possible. Typical use case is
when a query to retrieve show ids is required prior to the query to actually search for subtitles. In that case
the function that gets the show id from the show name must be cached.
the function that gets the show id from the show name must be cached.
Expiration time should be :data:`~subliminal.cache.SHOW_EXPIRATION_TIME` for shows and
:data:`~subliminal.cache.EPISODE_EXPIRATION_TIME` for episodes.
Language
--------
To be able to handle various language codes, subliminal makes use of `babelfish <http://babelfish.readthedocs.org>`_
Language and converters. You must set the attribute :attr:`~subliminal.providers.Provider.languages` with a set of
supported :class:`babelfish.Language`.
supported :class:`~babelfish.language.Language`.
If you cannot find a suitable converter for your provider, you can `make one of your own
<http://babelfish.readthedocs.org/en/latest/#custom-converters>`_.
@@ -67,7 +71,7 @@ If you cannot find a suitable converter for your provider, you can `make one of
Querying
--------
The :meth:`~subliminal.providers.Provider.query` method parameters must include all aspects of provider's querying with
simple types.
primary types.
Subtitle
@@ -79,12 +83,11 @@ It must have relevant attributes that can be used to compute the matches of the
Score computation
-----------------
To be able to compare subtitles coming from different providers between them, the
:meth:`~subliminal.subtitle.Subtitle.compute_matches` method must be implemented.
:meth:`~subliminal.subtitle.Subtitle.get_matches` method must be implemented.
If `guessit <http://guessit.readthedocs.org>`_ is used to extract data from the
:class:`~subliminal.subtitle.Subtitle` subclass, you can use :func:`~subliminal.subtitle.compute_guess_matches`
as a helper to compute matches between the :class:`~subliminal.video.Video` and the :class:`guessit.Guess`.
:class:`~subliminal.subtitle.Subtitle` subclass, you can use :func:`~subliminal.subtitle.guess_matches`
as a helper to compute matches between the :class:`~subliminal.video.Video` and the :class:`~guessit.guess.Guess`.
Refer to the `scores` attribute of :class:`~subliminal.video.Episode` and :class:`~subliminal.video.Movie`
for a list of possible matches.
@@ -92,12 +95,8 @@ for a list of possible matches.
Unittesting
-----------
All possible uses of the :meth:`~subliminal.providers.Provider.query` method must be unittested including the uses
that produce exceptions other than :class:`~subliminal.exceptions.ProviderNotAvailable`.
The :meth:`~subliminal.subtitle.Subtitle.compute_matches` is used to validate the unittests.
As it is not possible to unittest all uses of the :meth:`~subliminal.providers.Provider.list_subtitles`
and :meth:`~subliminal.providers.Provider.download_subtitle` methods, unitests are only required to cover most common
use cases.
See existing unittests for more details on how to proceed.
All possible uses of :meth:`~subliminal.providers.Provider.query`,
:meth:`~subliminal.providers.Provider.list_subtitles` and :meth:`~subliminal.providers.Provider.download_subtitle`
methods must have integration tests. Use `vcrpy <https://github.com/kevin1024/vcrpy>`_ for recording and playback
of network activity.
Other functions must be unittested. If necessary, you can use :mod:`unittest.mock` to mock some functions.
+144
View File
@@ -0,0 +1,144 @@
Usage
=====
CLI
---
Download English subtitles::
$ subliminal download -l en The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
Collecting videos [####################################] 100%
1 video collected / 0 video ignored
Downloading subtitles [####################################] 100%
Downloaded 1 subtitle
.. warning::
For cron usage, make sure to specify a maximum age (with ``--age``) so subtitles are searched for recent videos
only. Otherwise you will get banned from the providers for abuse due to too many requests. If subliminal didn't
find subtitles for an old video, it's unlikely it will find subtitles for that video ever anyway.
See :ref:`cli` for more details on the available commands and options.
High level API
--------------
You can call subliminal in many different ways depending on how much control you want over the process. For most use
cases, you can stick to the standard API.
Common
^^^^^^
Let's start by importing subliminal:
>>> from __future__ import unicode_literals
>>> import os
>>> from babelfish import *
>>> from subliminal import *
Before going further, there are a few things to know about subliminal.
Video
^^^^^
The :class:`~subliminal.video.Movie` and :class:`~subliminal.video.Episode` classes represent a video,
existing or not. You can create a video by name (or path) with :meth:`Video.fromname <subliminal.video.Video.fromname>`,
use :func:`~subliminal.video.scan_video` on an existing file path to get even more information about the video or
use :func:`~subliminal.video.scan_videos` on an existing directory path to scan a whole directory for videos.
>>> video = Video.fromname('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4')
>>> video
<Episode ['The Big Bang Theory', 5x18]>
Here video informations were guessed based on the name of the video, you can access some video attributes:
>>> video.video_codec
'h264'
>>> video.release_group
'LOL'
Configuration
^^^^^^^^^^^^^
Before proceeding to listing and downloading subtitles, you need to configure the cache. Subliminal uses a cache to
reduce repeated queries to providers and improve overall performance with no impact on search quality. For the sake
of this example, we're going to use a memory backend.
>>> my_region = region.configure('dogpile.cache.memory')
.. warning::
Choose a cache that fits your application and prefer persistent over volatile backends. The ``file`` backend is
usually a good choice.
See `dogpile.cache's documentation <http://dogpilecache.readthedocs.org>`_ for more details on backends.
Now that we're done with the basics, let's have some *real* fun.
Listing
^^^^^^^
To list subtitles, subliminal provides a :func:`~subliminal.api.list_subtitles` function that will return all found
subtitles:
>>> subtitles = list_subtitles([video], {Language('hun')}, providers=['podnapisi'])
>>> subtitles[video]
[<PodnapisiSubtitle 'ZtAW' [hu]>, <PodnapisiSubtitle 'ONAW' [hu]>]
.. note::
As you noticed, all parameters are iterables but only contain one item which means you can deal with a lot of
videos, languages and providers at the same time. For the sake of this example, we filter providers to use only one,
pass ``providers=None`` (default) to search on all providers.
Scoring
^^^^^^^
It's usual you have multiple candidates for subtitles. To help you chose which one to download, subliminal can compare
them to the video and tell you exactly what matches with :meth:`~subliminal.subtitle.Subtitle.get_matches`:
>>> for s in subtitles[video]:
... sorted(s.get_matches(video))
['episode', 'format', 'hearing_impaired', 'release_group', 'season', 'series', 'video_codec', 'year']
['episode', 'format', 'hearing_impaired', 'season', 'series', 'year']
And then compute a score with those matches with :func:`~subliminal.subtitle.compute_score`:
>>> for s in subtitles[video]:
... {s: compute_score(s.get_matches(video), video)}
{<PodnapisiSubtitle 'ZtAW' [hu]>: 132}
{<PodnapisiSubtitle 'ONAW' [hu]>: 117}
Now you should have a better idea about which one you should choose.
Downloading
^^^^^^^^^^^
We can settle on the first subtitle and download its content using :func:`~subliminal.api.download_subtitles`:
>>> subtitle = subtitles[video][0]
>>> subtitle.content is None
True
>>> download_subtitles([subtitle])
>>> subtitle.content.split(b'\n')[2]
b'Elszaladok a boltba'
If you want a string instead of bytes, you can access decoded content with the
:attr:`~subliminal.subtitle.Subtitle.text` property:
>>> subtitle.text.split('\n')[3]
'néhány apróságért.'
Downloading best subtitles
^^^^^^^^^^^^^^^^^^^^^^^^^^
Downloading best subtitles is what you want to do in almost all cases, as a shortcut for listing, scoring and
downloading you can use :func:`~subliminal.api.download_best_subtitles`:
>>> best_subtitles = download_best_subtitles([video], {Language('hun')}, providers=['podnapisi'])
>>> best_subtitles[video]
[<PodnapisiSubtitle 'ZtAW' [hu]>]
>>> best_subtitle = best_subtitles[video][0]
>>> best_subtitle.content.split(b'\n')[2]
b'Elszaladok a boltba'
We end up with the same subtitle but with one line of code. Neat.
Save
^^^^
We got ourselves a nice subtitle now we can save it on the file system using :func:`~subliminal.api.save_subtitles`:
>>> save_subtitles(video, [best_subtitle])
[<PodnapisiSubtitle 'ZtAW' [hu]>]
>>> os.listdir()
['The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.hu.srt']
+18
View File
@@ -0,0 +1,18 @@
Examples
========
This directory contains various examples, UI files and translations files.
Refer to subliminal's main README for install instructions.
Translations
------------
This is how to generate the po template file::
# extract strings from ui files
intltool-extract --type=gettext/glade ui/config.glade
intltool-extract --type=gettext/glade ui/choose.glade
# generate subliminal.pot
xgettext -k_ -kN_ -w 120 --from-code=utf-8 -o i18n/subliminal.pot ui/config.glade.h ui/choose.glade.h nautilus.py
# clean up
rm ui/*.h
+117
View File
@@ -0,0 +1,117 @@
# Subliminal language file
#
# Translators:
# Andrej Ebert <mask@mask.ms>, 2015
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-09-09 18:28+0000\n"
"Last-Translator: Antoine Bertin <diaoulael@gmail.com>\n"
"Language-Team: German (http://www.transifex.com/subliminal/subliminal/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Untertitel, schneller als Gedanken"
#: ui/config.glade.h:2
msgid "Name"
msgstr "Name"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Code"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Sprachen"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Konfiguration"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Anbieter"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Nicht benutzen, außer ihr Mediaplayer braucht dies"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Untertitel ohne Sprachcode im Dateinamen speichern, also mit .srt Erweiterung "
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Videos mit eingebetteten Untertiteln ignorieren"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Videos älter als diese Anzahl an Tagen ignorieren"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "Untertitel für hörgeschädigte vorziehen"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "Minimale Bewertung"
#: ui/config.glade.h:15
msgid "General"
msgstr "Allgemein"
#: ui/config.glade.h:16
msgid "About"
msgstr "Über"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - Untertitel auswählen"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Video:"
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Sprache"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Bewertung"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Anbieter"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "Hörgeschädigt"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "Runtergeladen"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Untertitel auswählen"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Untertitel runterladen"
#: nautilus.py:151
msgid "Configure..."
msgstr "Einstellen..."
+117
View File
@@ -0,0 +1,117 @@
# Subliminal language file
#
# Translators:
# Kike Isidoro <heisba@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-10-27 17:05+0000\n"
"Last-Translator: Antoine Bertin <diaoulael@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/subliminal/subliminal/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Subtítulos, más rápido de lo que piensas."
#: ui/config.glade.h:2
msgid "Name"
msgstr "Nombre"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Código"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Idiomas"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Configuración"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Proveedores"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Utilizar esto solamente si tu reproductor multimedia lo requiere"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Guardar subtítulos sin código de idioma en el nombre del archivo\np.e. utilizar la extensión .srt"
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Ignorar vídeos con subtítulos incrustados"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Ignorar vídeos con fecha de modificación superior a este número de días\ncuando se escaneen directorios"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "Priorizar subtítulos para personas con discapacidad auditiva"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "Puntuación de resultados mínima"
#: ui/config.glade.h:15
msgid "General"
msgstr "General"
#: ui/config.glade.h:16
msgid "About"
msgstr "Sobre"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - Elegir subtítulos"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Vídeo: "
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Idioma"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Puntuación"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Proveedor"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "Personas con discapacidad auditiva"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "Descargado"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Elegir subtítulos"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Descargar subtítulos"
#: nautilus.py:151
msgid "Configure..."
msgstr "Configurar..."
+117
View File
@@ -0,0 +1,117 @@
# Subliminal language file
#
# Translators:
# Antoine Bertin <diaoulael@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-08-27 14:44+0000\n"
"Last-Translator: Antoine Bertin <diaoulael@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/subliminal/subliminal/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Des sous-titres, sans y penser."
#: ui/config.glade.h:2
msgid "Name"
msgstr "Nom"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Code"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Langues"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Configuration"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Fournisseurs"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Ne pas utiliser à moins que le lecteur multimédia ne le requiert"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Sauvegarder les sous-titres sans code de langue dans\nle nom du fichier, c.-a-d. utiliser .srt comme extension"
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Ignorer les vidéos avec des sous-titres intégrés"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Ignorer les vidéos plus vieilles que ce nombre\nde jours lors du scan de dossiers"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "Préférer les sous-titres pour malentendants"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "Score de correspondance minimum"
#: ui/config.glade.h:15
msgid "General"
msgstr "Général"
#: ui/config.glade.h:16
msgid "About"
msgstr "À propos"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - Choisir les sous-titres"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Vidéo: "
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Langue"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Score"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Fournisseur"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "Malentendant"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "Téléchargé"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Choisir les sous-titres"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Télécharger les sous-titres"
#: nautilus.py:151
msgid "Configure..."
msgstr "Configurer..."
+117
View File
@@ -0,0 +1,117 @@
# Subliminal language file
#
# Translators:
# Stefano Vetrini <stvnove@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-09-09 18:28+0000\n"
"Last-Translator: Antoine Bertin <diaoulael@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/subliminal/subliminal/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Sottotitola, più veloce della luce."
#: ui/config.glade.h:2
msgid "Name"
msgstr "Nome"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Codice"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Lingue"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Configurazione"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Fornitori"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Non usare a meno che il tuo player video lo richieda"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Salva il sottotitolo senza il codice del linguaggio nel nome del file\nes. solo estensione .srt"
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Ignora i video con sottotitoli incorporati"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Ignora i video più vecchi di questo numero di giorni\nquando ricerchi nelle cartelle"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "Preferisci i sottotitoli per non udenti"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "Valore minimo per il punteggio dell'abbinamento"
#: ui/config.glade.h:15
msgid "General"
msgstr "Generale"
#: ui/config.glade.h:16
msgid "About"
msgstr "Informazioni"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - Scegli i sottotitoli"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Video: "
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Lingua"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Punteggio"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Fornitore"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "Non Udenti"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "Scaricati"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Scegli i sottotitoli"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Scarica i sottotitoli"
#: nautilus.py:151
msgid "Configure..."
msgstr "Configura..."
+117
View File
@@ -0,0 +1,117 @@
# Subliminal language file
#
# Translators:
# João Silva <asmodeo.pt@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-10-25 18:47+0000\n"
"Last-Translator: João Silva <asmodeo.pt@gmail.com>\n"
"Language-Team: Portuguese (http://www.transifex.com/subliminal/subliminal/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Legendas, mais rápido do que os seus pensamentos."
#: ui/config.glade.h:2
msgid "Name"
msgstr "Nome"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Código"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Idiomas"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Configuração"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Fornecedores"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Não use isto a menos que o seu leitor multimédia o exija"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Gravar legenda sem código de idioma no nome de ficheiro\nou seja, usar extensão .srt"
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Ignorar vídeos com legendas embutidas"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Ignorar vídeos com mais do que este número de dias\nquando a verificar pastas"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "Preferir legendas para deficientes auditivos"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "Pontuação mínima correspondente"
#: ui/config.glade.h:15
msgid "General"
msgstr "Geral"
#: ui/config.glade.h:16
msgid "About"
msgstr "Acerca"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - Escolher legendas"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Vídeo:"
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Idioma"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Pontuação"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Fornecedor"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "Deficientes Auditivos"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "Transferida"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Escolher legendas"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Transferir legendas"
#: nautilus.py:151
msgid "Configure..."
msgstr "Configurar..."
+116
View File
@@ -0,0 +1,116 @@
# Subliminal language file
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-10-27 17:05+0000\n"
"Last-Translator: Antoine Bertin <diaoulael@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/subliminal/subliminal/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Legendas, mais rápido do que você imagina."
#: ui/config.glade.h:2
msgid "Name"
msgstr "Nome"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Código"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Idiomas"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Configuração"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Fornecedores"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Usar isto somente se o seu media player precisar"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Salvar legenda sem código de idioma no nome do arquivo\np.e. usar extensão .srt"
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Ignorar vídeos com legendas gravadas"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Ignorar vídeos mais antigos que este número de días\nquando se escaneiem pastas"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "Priorizar legendas para pessoas com deficiência auditiva"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "Nota mínima de resultados"
#: ui/config.glade.h:15
msgid "General"
msgstr "Geral"
#: ui/config.glade.h:16
msgid "About"
msgstr "Acerca"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - Escolher legendas"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Vídeo: "
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Idioma"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Nota"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Fornecedor"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "Pessoas com deficiência auditiva"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "Baixado"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Escolher legendas"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Baixar legendas"
#: nautilus.py:151
msgid "Configure..."
msgstr "Configurar..."
+117
View File
@@ -0,0 +1,117 @@
# Subliminal language file
#
# Translators:
# Andrej Ebert <mask@mask.ms>, 2015
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-09-09 18:28+0000\n"
"Last-Translator: Antoine Bertin <diaoulael@gmail.com>\n"
"Language-Team: Russian (http://www.transifex.com/subliminal/subliminal/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Субтитры - быстрее мысли"
#: ui/config.glade.h:2
msgid "Name"
msgstr "Имя"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Код"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Языки"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Настройки"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Провайдеры(сайты)"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Не нужно, если ваш медиаплеер не требует этого"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Сохранять субтитры без кода языка в имени файла, т.е. просто .srt"
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Игнорировать видеофайлы со вшитыми субтитрами"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Игнорировать видеофайлы старше этого количества дней"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "Предпочитать субтитры для слабослышащих/глухонемых"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "Минимальный рейтинг"
#: ui/config.glade.h:15
msgid "General"
msgstr "Общее"
#: ui/config.glade.h:16
msgid "About"
msgstr "О программе"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - выбор субтитров"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Видео:"
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Язык"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Рейтинг"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Провайдер(сайт)"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "Для сабослышащих/глухонемых"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "Скачано"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Выбор субтитров"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Скачать субтитры"
#: nautilus.py:151
msgid "Configure..."
msgstr "Настроить..."
+117
View File
@@ -0,0 +1,117 @@
# Subliminal language file
#
# Translators:
# Özgür BASKIN, 2015
msgid ""
msgstr ""
"Project-Id-Version: subliminal\n"
"Report-Msgid-Bugs-To: diaoulael@gmail.com\n"
"POT-Creation-Date: 2015-10-30 18:54+0100\n"
"PO-Revision-Date: 2015-08-28 12:30+0000\n"
"Last-Translator: Özgür BASKIN\n"
"Language-Team: Turkish (http://www.transifex.com/subliminal/subliminal/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: ui/config.glade.h:1
msgid "Subtitles, faster than your thoughts."
msgstr "Altyazı, düşüncelerinizden daha hızlı."
#: ui/config.glade.h:2
msgid "Name"
msgstr "Ad"
#: ui/config.glade.h:3
msgid "Code"
msgstr "Kod"
#: ui/config.glade.h:4
msgid "Languages"
msgstr "Dil"
#: ui/config.glade.h:5
msgid "Configuration"
msgstr "Yapılandırma"
#: ui/config.glade.h:6
msgid "Providers"
msgstr "Sağlayıcılar"
#: ui/config.glade.h:7
msgid "Do not use this unless your media player requires it"
msgstr "Medya oynatıcınız için gerekli olmadığı sürece bunu kullanmayın"
#: ui/config.glade.h:8
msgid ""
"Save subtitle without language code in the filename\n"
"i.e. use .srt extension"
msgstr "Altyazıları dosya adına dil kodunu eklemeden kaydet\nyani .srt eklentisini kullan"
#: ui/config.glade.h:10
msgid "Ignore videos with embedded subtitles"
msgstr "Gömülü altyazıları olan videoları yoksay"
#: ui/config.glade.h:11
msgid ""
"Ignore videos older than this number of days\n"
"when scanning folders"
msgstr "Klasörleri tararken bu gün sayısından daha eski\nvideoları yoksay"
#: ui/config.glade.h:13
msgid "Prefer hearing impaired subtitles"
msgstr "İşitme engelli altyazılarını tercih et"
#: ui/config.glade.h:14
msgid "Minimum matching score"
msgstr "En düşük eşleşme puanı"
#: ui/config.glade.h:15
msgid "General"
msgstr "Genel"
#: ui/config.glade.h:16
msgid "About"
msgstr "Hakkında"
#: ui/choose.glade.h:1
msgid "Subliminal - Choose subtitles"
msgstr "Subliminal - Altyazı seç"
#: ui/choose.glade.h:2
msgid "Video: "
msgstr "Video: "
#: ui/choose.glade.h:3
msgid "Language"
msgstr "Dil"
#: ui/choose.glade.h:4
msgid "Score"
msgstr "Puan"
#: ui/choose.glade.h:5
msgid "Provider"
msgstr "Sağlayıcı"
#: ui/choose.glade.h:6
msgid "Hearing Impaired"
msgstr "İşitme Engelliler"
#: ui/choose.glade.h:7
msgid "Downloaded"
msgstr "İndirildi"
#: nautilus.py:141
msgid "Choose subtitles"
msgstr "Altyazıyı seç"
#: nautilus.py:146
msgid "Download subtitles"
msgstr "Altyazıyı indir"
#: nautilus.py:151
msgid "Configure..."
msgstr "Yapılandır..."
+322
View File
@@ -0,0 +1,322 @@
# -*- coding: utf-8 -*-
from __future__ import division
from collections import defaultdict
from datetime import timedelta
import locale
from locale import gettext as _
import os
from babelfish import Language
from gi.repository import GObject, Gtk, Nautilus
from subliminal import (VIDEO_EXTENSIONS, ProviderPool, __copyright__, __version__, check_video, compute_score,
provider_manager, region, save_subtitles, scan_video, scan_videos)
from subliminal.cli import Config, MutexLock, app_dir, cache_file, config_file
locale.bindtextdomain('subliminal', os.path.join(os.path.dirname(__file__), 'subliminal', 'locale'))
locale.textdomain('subliminal')
ignored_languages = {Language(l) for l in (
'ang', 'arc', 'dsb', 'dum', 'enm', 'frm', 'fro', 'gmh', 'goh', 'grc', 'ina', 'mga', 'mis', 'nds', 'non', 'ota',
'peo', 'pro', 'sga', 'und'
)}
class ChooseHandler(object):
"""Signal handler for the choose window.
This class will download the selected subtitle on row-activated signal.
:param config: a configuration object.
:type config: :class:`~subliminal.cli.Config`
:param video: the video.
:type video: :class:`~subliminal.video.Video`
:param subtitles: the available of subtitles.
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
"""
def __init__(self, config, video, subtitles):
self.config = config
self.video = video
self.subtitles = {s.provider_name + '-' + s.id: s for s in subtitles}
def on_subtitles_treeview_row_activated(self, treeview, path, view_column):
model = treeview.get_model()
iter = model.get_iter(path)
# return if already downloaded
if model.get_value(iter, 6):
return
# get the subtitle object
subtitle = self.subtitles[model.get_value(iter, 3).lower() + '-' + model.get_value(iter, 0)]
# download the subtitle
with ProviderPool(providers=self.config.providers, provider_configs=self.config.provider_configs) as pool:
pool.download_subtitle(subtitle)
# save the subtitle
save_subtitles(self.video, [subtitle], single=self.config.single)
# mark the subtitle as downloaded
model.set_value(iter, 6, True)
def on_subtitles_scrolledwindow_delete_event(self, *args):
Gtk.main_quit(*args)
class ConfigHandler(object):
"""Signal handler for the configuration window.
This class converts the values from the window and forward them to the configuration object. When the window is
closed, the configuration is written.
:param config: a configuration object.
:type config: :class:`~subliminal.cli.Config`
"""
def __init__(self, config):
self.config = config
def on_languages_treeview_selection_changed(self, selection):
model, paths = selection.get_selected_rows()
languages = {Language.fromietf(model.get_value(model.get_iter(p), 1)) for p in paths}
if languages:
self.config.languages = languages
def on_providers_treeview_selection_changed(self, selection):
model, paths = selection.get_selected_rows()
providers = [model.get_value(model.get_iter(p), 0).lower() for p in paths]
if providers:
self.config.providers = providers
def on_single_switch_active_notify(self, switch, gparam):
self.config.single = switch.get_active()
def on_embedded_subtitles_switch_active_notify(self, switch, gparam):
self.config.embedded_subtitles = switch.get_active()
def on_age_spinbutton_value_changed(self, spin_button):
self.config.age = timedelta(days=spin_button.get_value())
def on_hearing_impaired_switch_active_notify(self, switch, gparam):
self.config.hearing_impaired = switch.get_active()
def on_min_score_spinbutton_value_changed(self, spin_button):
self.config.min_score = spin_button.get_value()
def on_config_window_delete_event(self, *args):
self.config.write()
Gtk.main_quit(*args)
class SubliminalExtension(GObject.GObject, Nautilus.MenuProvider):
def __init__(self):
# create app directory
try:
os.makedirs(app_dir)
except OSError:
if not os.path.isdir(app_dir):
raise
# open config file
self.config = Config(os.path.join(app_dir, config_file))
self.config.read()
# configure cache
region.configure('dogpile.cache.dbm', expiration_time=timedelta(days=30),
arguments={'filename': os.path.join(app_dir, cache_file), 'lock_factory': MutexLock})
def get_file_items(self, window, files):
# lightweight filter on file type and extension
if not any(f.is_directory() or f.get_name().endswith(VIDEO_EXTENSIONS) for f in files):
return
# create subliminal menu
subliminal_menuitem = Nautilus.MenuItem(name='SubliminalMenu::Subliminal', label='Subliminal')
sub_menus = Nautilus.Menu()
subliminal_menuitem.set_submenu(sub_menus)
# create choose submenu on single file
if len(files) == 1 and not files[0].is_directory():
choose_menuitem = Nautilus.MenuItem(name='SubliminalSubMenu::Choose', label=_('Choose subtitles'))
choose_menuitem.connect('activate', self.choose_callback, files)
sub_menus.append_item(choose_menuitem)
# create download submenu
download_menuitem = Nautilus.MenuItem(name='SubliminalSubMenu::Download', label=_('Download subtitles'))
download_menuitem.connect('activate', self.download_callback, files)
sub_menus.append_item(download_menuitem)
# create configure submenu
configure_menuitem = Nautilus.MenuItem(name='SubliminalSubMenu::Configure', label=_('Configure...'))
configure_menuitem.connect('activate', self.config_callback)
sub_menus.append_item(configure_menuitem)
return subliminal_menuitem,
def get_background_items(self, window, current_folder):
return []
def choose_callback(self, menuitem, files):
# scan and check the video
video = scan_video(files[0].get_location().get_path(), subtitles=True,
embedded_subtitles=self.config.embedded_subtitles)
if not check_video(video, languages=self.config.languages, undefined=self.config.single):
return
# list subtitles
with ProviderPool(providers=self.config.providers, provider_configs=self.config.provider_configs) as pool:
subtitles = pool.list_subtitles(video, self.config.languages)
# load the interface
builder = Gtk.Builder()
builder.set_translation_domain('subliminal')
builder.add_from_file(os.path.join(os.path.dirname(__file__), 'subliminal', 'ui', 'choose.glade'))
# set the video filename
video_filename = builder.get_object('video_filename_label')
video_filename.set_text(files[0].get_name())
# fill the subtitle liststore
subtitle_liststore = builder.get_object('subtitle_liststore')
for s in subtitles:
matches = s.get_matches(video, hearing_impaired=self.config.hearing_impaired)
scaled_score = compute_score(matches, video)
if s.hearing_impaired == self.config.hearing_impaired:
scaled_score -= video.scores['hearing_impaired']
scaled_score *= 100 / video.scores['hash']
subtitle_liststore.append([s.id, nice_language(s.language), scaled_score, s.provider_name.capitalize(),
s.hearing_impaired, s.page_link, False])
subtitle_liststore.set_sort_column_id(2, Gtk.SortType.DESCENDING)
# connect signals
builder.connect_signals(ChooseHandler(self.config, video, subtitles))
# display window
window = builder.get_object('subtitle_window')
window.show_all()
Gtk.main()
def download_callback(self, menuitem, files):
# scan videos
videos = []
for f in files:
# ignore non-writable locations
if not f.can_write():
continue
# directories
if f.is_directory():
try:
scanned_videos = scan_videos(f.get_location().get_path(), subtitles=True,
embedded_subtitles=self.config.embedded_subtitles)
except:
continue
for video in scanned_videos:
if check_video(video, languages=self.config.languages, age=self.config.age,
undefined=self.config.single):
videos.append(video)
continue
# other inputs
try:
video = scan_video(f.get_location().get_path(), subtitles=True,
embedded_subtitles=self.config.embedded_subtitles)
except:
continue
if check_video(video, languages=self.config.languages, undefined=self.config.single):
videos.append(video)
# download best subtitles
downloaded_subtitles = defaultdict(list)
with ProviderPool(providers=self.config.providers, provider_configs=self.config.provider_configs) as pool:
for v in videos:
subtitles = pool.download_best_subtitles(
pool.list_subtitles(v, self.config.languages - v.subtitle_languages),
v, self.config.languages, min_score=v.scores['hash'] * self.config.min_score / 100,
hearing_impaired=self.config.hearing_impaired, only_one=self.config.single
)
downloaded_subtitles[v] = subtitles
# save subtitles
for v, subtitles in downloaded_subtitles.items():
save_subtitles(v, subtitles, single=self.config.single)
def config_callback(self, *args, **kwargs):
# load the interface
builder = Gtk.Builder()
builder.set_translation_domain('subliminal')
builder.add_from_file(os.path.join(os.path.dirname(__file__), 'subliminal', 'ui', 'config.glade'))
# configure the about page
aboutdialog = builder.get_object('aboutdialog')
aboutdialog.set_version(__version__)
aboutdialog.set_copyright(__copyright__)
aboutdialog.vbox.reparent(builder.get_object('about_box'))
# fill the language liststore
available_languages = set()
for provider in provider_manager:
available_languages |= provider.plugin.languages
language_liststore = builder.get_object('language_liststore')
for language in sorted(available_languages - ignored_languages, key=nice_language):
language_liststore.append([nice_language(language), str(language)])
# set language selection
language_treeselection = builder.get_object('language_treeselection')
for language in language_liststore:
if Language.fromietf(language[1]) in self.config.languages:
language_treeselection.select_path(language.path)
# fill the provider liststore
provider_liststore = builder.get_object('provider_liststore')
for provider in sorted([p.name for p in provider_manager]):
provider_liststore.append([provider.capitalize(), str(self.config.provider_configs.get(provider, ''))])
# set provider selection
provider_treeselection = builder.get_object('provider_treeselection')
for provider in provider_liststore:
if provider[0].lower() in self.config.providers:
provider_treeselection.select_iter(provider.iter)
# set single state
single_switch = builder.get_object('single_switch')
single_switch.set_active(self.config.single)
# set embedded subtitles state
embedded_subtitles_switch = builder.get_object('embedded_subtitles_switch')
embedded_subtitles_switch.set_active(self.config.embedded_subtitles)
# set age value
age_spinbutton = builder.get_object('age_spinbutton')
age_spinbutton.set_value(self.config.age.days)
# set hearing impaired state
hearing_impaired_switch = builder.get_object('hearing_impaired_switch')
hearing_impaired_switch.set_active(self.config.hearing_impaired)
# set min score value
min_score_spinbutton = builder.get_object('min_score_spinbutton')
min_score_spinbutton.set_value(self.config.min_score)
# connect signals
builder.connect_signals(ConfigHandler(self.config))
# display window
window = builder.get_object('config_window')
window.show_all()
Gtk.main()
def nice_language(language):
"""Format a :class:`~babelfish.Language` in a nice string with country name if any.
:param language: the language.
:type language: :class:`~babelfish.Language`
:return: a nice representation of the language.
:rtype: str
"""
if language.country is not None:
return '{name} ({country})'.format(name=language.name, country=language.country.name.capitalize())
return language.name
+193
View File
@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3
The MIT License (MIT)
Copyright (c) 2015 Antoine Bertin
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.
Author: Antoine Bertin
-->
<interface domain="subliminal">
<requires lib="gtk+" version="3.12"/>
<!-- interface-license-type mit -->
<!-- interface-name subliminal -->
<!-- interface-description Subtitles, faster than your thoughts -->
<!-- interface-copyright 2015 Antoine Bertin -->
<!-- interface-authors Antoine Bertin -->
<object class="GtkListStore" id="subtitle_liststore">
<columns>
<!-- column-name id -->
<column type="gchararray"/>
<!-- column-name language -->
<column type="gchararray"/>
<!-- column-name score -->
<column type="gint"/>
<!-- column-name provider -->
<column type="gchararray"/>
<!-- column-name hearing_impaired -->
<column type="gboolean"/>
<!-- column-name page_link -->
<column type="gchararray"/>
<!-- column-name downloaded -->
<column type="gboolean"/>
</columns>
</object>
<object class="GtkWindow" id="subtitle_window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Subliminal - Choose subtitles</property>
<child>
<object class="GtkBox" id="subtitle_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox" id="video_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_start">6</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<child>
<object class="GtkLabel" id="video_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Video: </property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_filename_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label">Video filename</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="subtitle_scrolledwindow">
<property name="can_focus">False</property>
<property name="hscrollbar_policy">never</property>
<property name="shadow_type">in</property>
<property name="min_content_height">350</property>
<signal name="delete-event" handler="on_subtitles_scrolledwindow_delete_event" swapped="no"/>
<child>
<object class="GtkTreeView" id="subtitle_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">subtitle_liststore</property>
<signal name="row-activated" handler="on_subtitles_treeview_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="subtitle_treeview_selection"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="language_treeviewcolumn">
<property name="min_width">250</property>
<property name="title" translatable="yes">Language</property>
<property name="expand">True</property>
<property name="sort_column_id">1</property>
<child>
<object class="GtkCellRendererText" id="language_cellrenderertext"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="score_treeviewcolumn">
<property name="title" translatable="yes">Score</property>
<property name="sort_column_id">2</property>
<child>
<object class="GtkCellRendererText" id="score_cellrenderertext"/>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="provider_treeviewcolumn">
<property name="min_width">140</property>
<property name="title" translatable="yes">Provider</property>
<property name="sort_column_id">3</property>
<child>
<object class="GtkCellRendererText" id="provider_cellrenderertext"/>
<attributes>
<attribute name="text">3</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="hearing_impaired_treeviewcolumn">
<property name="title" translatable="yes">Hearing Impaired</property>
<property name="sort_column_id">4</property>
<child>
<object class="GtkCellRendererToggle" id="hearing_impaired_cellrenderertoggle"/>
<attributes>
<attribute name="active">4</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="downloaded_treeviewcolumn">
<property name="title" translatable="yes">Downloaded</property>
<child>
<object class="GtkCellRendererToggle" id="downloaded_cellrenderertoggle"/>
<attributes>
<attribute name="active">6</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
+410
View File
@@ -0,0 +1,410 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3
The MIT License (MIT)
Copyright (c) 2015 Antoine Bertin
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.
Author: Antoine Bertin
-->
<interface domain="subliminal">
<requires lib="gtk+" version="3.12"/>
<!-- interface-license-type mit -->
<!-- interface-name subliminal -->
<!-- interface-description Subtitles, faster than your thoughts -->
<!-- interface-copyright 2015 Antoine Bertin -->
<!-- interface-authors Antoine Bertin -->
<object class="GtkAboutDialog" id="aboutdialog">
<property name="can_focus">False</property>
<property name="type">popup</property>
<property name="type_hint">dialog</property>
<property name="program_name">Subliminal</property>
<property name="comments" translatable="yes">Subtitles, faster than your thoughts.</property>
<property name="website">https://github.com/Diaoul/subliminal</property>
<property name="authors">Antoine Bertin</property>
<property name="logo_icon_name">emblem-favorite</property>
<property name="license_type">mit-x11</property>
<child internal-child="vbox">
<object class="GtkBox" id="aboutdialog_vbox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="aboutdialog-action_area1">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="age_adjustment">
<property name="upper">30</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkListStore" id="language_liststore">
<columns>
<!-- column-name name -->
<column type="gchararray"/>
<!-- column-name code -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkAdjustment" id="min_score_adjustment">
<property name="upper">100</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkListStore" id="provider_liststore">
<columns>
<!-- column-name name -->
<column type="gchararray"/>
<!-- column-name configuration -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkWindow" id="config_window">
<property name="can_focus">False</property>
<property name="title">Subliminal - Configuration</property>
<signal name="delete-event" handler="on_config_window_delete_event" swapped="no"/>
<child>
<object class="GtkNotebook" id="config_notebook">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="show_border">False</property>
<child>
<object class="GtkScrolledWindow" id="language_scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="min_content_height">100</property>
<child>
<object class="GtkTreeView" id="language_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">language_liststore</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="language_treeselection">
<property name="mode">multiple</property>
<signal name="changed" handler="on_languages_treeview_selection_changed" swapped="no"/>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="language_name_treeviewcolumn">
<property name="min_width">250</property>
<property name="title" translatable="yes">Name</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="language_name_cellrenderertext"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="language_code_treeviewcolumn">
<property name="min_width">100</property>
<property name="title" translatable="yes">Code</property>
<child>
<object class="GtkCellRendererText" id="language_code_cellrenderertext"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="languages_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Languages</property>
</object>
<packing>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="provider_scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="min_content_height">100</property>
<child>
<object class="GtkTreeView" id="provider_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">provider_liststore</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="provider_treeselection">
<property name="mode">multiple</property>
<signal name="changed" handler="on_providers_treeview_selection_changed" swapped="no"/>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="provider_name_treeviewcolumn">
<property name="min_width">140</property>
<property name="title" translatable="yes">Name</property>
<child>
<object class="GtkCellRendererText" id="provider_name_cellrenderertext"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="provider_configuration_treeviewcolumn">
<property name="min_width">250</property>
<property name="title" translatable="yes">Configuration</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="provider_configuration_cellrenderertext"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="providers_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Providers</property>
</object>
<packing>
<property name="position">1</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkGrid" id="general_grid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_start">10</property>
<property name="margin_end">10</property>
<property name="margin_top">15</property>
<property name="margin_bottom">15</property>
<property name="row_spacing">20</property>
<property name="column_spacing">50</property>
<child>
<object class="GtkLabel" id="single_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Do not use this unless your media player requires it</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Save subtitle without language code in the filename
i.e. use .srt extension</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="single_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="valign">center</property>
<signal name="notify::active" handler="on_single_switch_active_notify" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="embedded_subtitles_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Ignore videos with embedded subtitles</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="embedded_subtitles_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="valign">center</property>
<signal name="notify::active" handler="on_embedded_subtitles_switch_active_notify" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="age_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Ignore videos older than this number of days
when scanning folders</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="age_spinbutton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="adjustment">age_adjustment</property>
<property name="numeric">True</property>
<signal name="value-changed" handler="on_age_spinbutton_value_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="hearing_impaired_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Prefer hearing impaired subtitles</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="hearing_impaired_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="valign">center</property>
<signal name="notify::active" handler="on_hearing_impaired_switch_active_notify" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="min_score_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Minimum matching score</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="min_score_spinbutton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="adjustment">min_score_adjustment</property>
<property name="numeric">True</property>
<signal name="value-changed" handler="on_min_score_spinbutton_value_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
</packing>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="general_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">General</property>
</object>
<packing>
<property name="position">2</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkBox" id="about_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="about_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">About</property>
</object>
<packing>
<property name="position">3</property>
<property name="tab_fill">False</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
+11
View File
@@ -0,0 +1,11 @@
[pytest]
norecursedirs = build dist env .tox .eggs
addopts = --pep8 --flakes --doctest-glob='*.rst'
pep8maxlinelength = 120
pep8ignore =
docs/conf.py ALL
subliminal/__init__.py E402
flakes-ignore =
docs/conf.py ALL
subliminal/__init__.py UnusedImport
doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL
+1 -10
View File
@@ -1,10 +1 @@
beautifulsoup4>=4.3.2
guessit>=0.6.1
requests>=2.0.0
enzyme>=0.3.1
html5lib>=0.99
dogpile.cache>=0.5.1
babelfish>=0.1.5
lxml>=3.2.3
charade>=1.0.3
pysrt>=0.5.0
-e .
+3
View File
@@ -1,3 +1,6 @@
[aliases]
test=pytest
[build_sphinx]
source-dir = docs/
build-dir = docs/_build
+80 -32
View File
@@ -1,38 +1,86 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import io
import re
import sys
from setuptools import setup, find_packages
# requirements
setup_requirements = ['pytest-runner'] if {'pytest', 'test', 'ptr'}.intersection(sys.argv) else []
install_requirements = ['guessit>=0.9.1,<2.0', 'babelfish>=0.5.2', 'enzyme>=0.4.1', 'beautifulsoup4>=4.2.0',
'requests>=2.0', 'click>=4.0', 'dogpile.cache>=0.5.4', 'stevedore>=1.0.0',
'chardet>=2.3.0', 'pysrt>=1.0.1', 'six>=1.9.0']
test_requirements = ['sympy', 'vcrpy>=1.6.1', 'pytest', 'pytest-pep8', 'pytest-flakes', 'pytest-cov']
if sys.version_info < (3, 3):
test_requirements.append('mock')
dev_requirements = ['tox', 'sphinx', 'transifex-client', 'wheel']
# package informations
with io.open('subliminal/__init__.py', 'r') as f:
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]$', f.read(), re.MULTILINE).group(1)
if not version:
raise RuntimeError('Cannot find version information')
with io.open('README.rst', 'r', encoding='utf-8') as f:
readme = f.read()
with io.open('HISTORY.rst', 'r', encoding='utf-8') as f:
history = f.read()
setup(name='subliminal',
version='0.7.0',
license='MIT',
description='Subtitles, faster than your thoughts',
long_description=open('README.rst').read() + '\n\n' + open('HISTORY.rst').read(),
keywords='subtitle subtitles video movie episode tv show',
url='https://github.com/Diaoul/subliminal',
author='Antoine Bertin',
author_email='diaoulael@gmail.com',
packages=find_packages(),
classifiers=['Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Multimedia :: Video'],
entry_points={
'console_scripts': ['subliminal = subliminal.cli:subliminal'],
'subliminal.providers': ['addic7ed = subliminal.providers.addic7ed:Addic7edProvider',
'bierdopje = subliminal.providers.bierdopje:BierDopjeProvider',
'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider',
'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider',
'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider'],
'babelfish.converters': ['addic7ed = subliminal.converters.addic7ed:Addic7edConverter',
'tvsubtitles = subliminal.converters.tvsubtitles:TVsubtitlesConverter']
},
install_requires=open('requirements.txt').readlines(),
test_suite='subliminal.tests.suite')
version=version,
license='MIT',
description='Subtitles, faster than your thoughts',
long_description=readme + '\n\n' + history,
keywords='subtitle subtitles video movie episode tv show',
url='https://github.com/Diaoul/subliminal',
author='Antoine Bertin',
author_email='diaoulael@gmail.com',
packages=find_packages(),
classifiers=[
'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Multimedia :: Video'
],
entry_points={
'subliminal.providers': [
'addic7ed = subliminal.providers.addic7ed:Addic7edProvider',
'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider',
'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider',
'subscenter = subliminal.providers.subscenter:SubsCenterProvider',
'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider',
'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider'
],
'babelfish.language_converters': [
'addic7ed = subliminal.converters.addic7ed:Addic7edConverter',
'thesubdb = subliminal.converters.thesubdb:TheSubDBConverter',
'tvsubtitles = subliminal.converters.tvsubtitles:TVsubtitlesConverter'
],
'console_scripts': [
'subliminal = subliminal.cli:subliminal'
]
},
setup_requires=setup_requirements,
install_requires=install_requirements,
tests_require=test_requirements,
extras_require={
'test': test_requirements,
'dev': dev_requirements
})
+9 -7
View File
@@ -1,16 +1,18 @@
# -*- coding: utf-8 -*-
__title__ = 'subliminal'
__version__ = '0.7.0'
__version__ = '1.1.1'
__author__ = 'Antoine Bertin'
__license__ = 'MIT'
__copyright__ = 'Copyright 2013 Antoine Bertin'
__copyright__ = 'Copyright 2015, Antoine Bertin'
import logging
from .api import PROVIDERS_ENTRY_POINT, list_subtitles, download_subtitles, download_best_subtitles
from .cache import region as cache_region
from .exceptions import Error, ProviderError, ProviderConfigurationError, ProviderNotAvailable, InvalidSubtitle
from .subtitle import Subtitle
from .video import VIDEO_EXTENSIONS, SUBTITLE_EXTENSIONS, Video, Episode, Movie, scan_videos, scan_video
from .api import (ProviderPool, check_video, provider_manager, download_best_subtitles, download_subtitles,
list_subtitles, save_subtitles)
from .cache import region
from .exceptions import Error, ProviderError
from .providers import Provider
from .subtitle import Subtitle, compute_score
from .video import SUBTITLE_EXTENSIONS, VIDEO_EXTENSIONS, Episode, Movie, Video, scan_video, scan_videos
logging.getLogger(__name__).addHandler(logging.NullHandler())
+389 -225
View File
@@ -1,250 +1,414 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import collections
from collections import defaultdict
import io
import logging
import operator
import pkg_resources
from .exceptions import ProviderNotAvailable, InvalidSubtitle
from .subtitle import get_subtitle_path
import os.path
import socket
from babelfish import Language
import requests
from stevedore import EnabledExtensionManager, ExtensionManager
from .subtitle import compute_score, get_subtitle_path
logger = logging.getLogger(__name__)
#: Entry point for the providers
PROVIDERS_ENTRY_POINT = 'subliminal.providers'
provider_manager = ExtensionManager('subliminal.providers')
def list_subtitles(videos, languages, providers=None, provider_configs=None):
"""List subtitles for `videos` with the given `languages` using the specified `providers`
class ProviderPool(object):
"""A pool of providers with the same API as a single :class:`~subliminal.providers.Provider`.
:param videos: videos to list subtitles for
:type videos: set of :class:`~subliminal.video.Video`
:param languages: languages of subtitles to search for
:type languages: set of :class:`babelfish.Language`
:param providers: providers to use for the search, if not all
:type providers: list of string or None
:param provider_configs: configuration for providers
:type provider_configs: dict of provider name => provider constructor kwargs
:return: found subtitles
:rtype: dict of :class:`~subliminal.video.Video` => [:class:`~subliminal.subtitle.Subtitle`]
It has a few extra features:
* Lazy loads providers when needed and supports the :keyword:`with` statement to :meth:`terminate`
the providers on exit.
* Automatically discard providers on failure.
:param providers: name of providers to use, if not all.
:type providers: list
:param dict provider_configs: provider configuration as keyword arguments per provider name to pass when
instanciating the :class:`~subliminal.providers.Provider`.
"""
provider_configs = provider_configs or {}
subtitles = collections.defaultdict(list)
# filter videos
videos = [v for v in videos if v.subtitle_languages != languages]
if not videos:
logger.info('No video to download subtitles for with languages %r', languages)
return subtitles
for provider_entry_point in pkg_resources.iter_entry_points(PROVIDERS_ENTRY_POINT):
# filter and initialize provider
if providers is not None and provider_entry_point.name not in providers:
logger.debug('Skipping provider %r: not in the list', provider_entry_point.name)
continue
Provider = provider_entry_point.load()
provider_languages = Provider.languages & languages
if not provider_languages:
logger.debug('Skipping provider %r: no language to search for', provider_entry_point.name)
continue
provider_videos = [v for v in videos if Provider.check(v)]
if not provider_videos:
logger.debug('Skipping provider %r: no video to search for', provider_entry_point.name)
continue
def __init__(self, providers=None, provider_configs=None):
#: Name of providers to use
self.providers = providers or provider_manager.names()
# list subtitles with the provider
with Provider(**provider_configs.get(provider_entry_point.name, {})) as provider:
for provider_video in provider_videos:
logger.info('Listing subtitles with provider %r for video %r with languages %r',
provider_entry_point.name, provider_video, provider_languages)
try:
provider_subtitles = provider.list_subtitles(provider_video, provider_languages)
except ProviderNotAvailable:
logger.warning('Provider %r is not available, discarding it', provider_entry_point.name)
break
except:
logger.exception('Unexpected error in provider %r', provider_entry_point.name)
continue
logger.info('Found %d subtitles', len(provider_subtitles))
subtitles[provider_video].extend(provider_subtitles)
return subtitles
#: Provider configuration
self.provider_configs = provider_configs or {}
#: Initialized providers
self.initialized_providers = {}
def download_subtitles(subtitles, provider_configs=None, single=False):
"""Download subtitles
#: Discarded providers
self.discarded_providers = set()
:param subtitles: subtitles to download
:type subtitles: dict of :class:`~subliminal.video.Video` => [:class:`~subliminal.subtitle.Subtitle`]
:param provider_configs: configuration for providers
:type provider_configs: dict of provider name => provider constructor kwargs
:param bool single: download with .srt extension if `True`, add language identifier otherwise
#: Dedicated :data:`provider_manager` as :class:`~stevedore.enabled.EnabledExtensionManager`
self.manager = EnabledExtensionManager(provider_manager.namespace, lambda e: e.name in self.providers)
"""
provider_configs = provider_configs or {}
discarded_providers = set()
providers_by_name = {ep.name: ep.load() for ep in pkg_resources.iter_entry_points(PROVIDERS_ENTRY_POINT)}
initialized_providers = {}
try:
for video, video_subtitles in subtitles.items():
languages = {subtitle.language for subtitle in video_subtitles}
downloaded_languages = set()
for subtitle in video_subtitles:
# filter
if subtitle.language in downloaded_languages:
continue
if subtitle.provider_name in discarded_providers:
logger.debug('Skipping subtitle from discarded provider %r', subtitle.provider_name)
continue
def __enter__(self):
return self
# initialize provider
if subtitle.provider_name in initialized_providers:
provider = initialized_providers[subtitle.provider_name]
else:
provider = providers_by_name[subtitle.provider_name](**provider_configs.get(subtitle.provider_name, {}))
try:
provider.initialize()
except ProviderNotAvailable:
logger.warning('Provider %r is not available, discarding it', subtitle.provider_name)
discarded_providers.add(subtitle.provider_name)
continue
initialized_providers[subtitle.provider_name] = provider
def __exit__(self, exc_type, exc_value, traceback):
self.terminate()
# download subtitles
subtitle_path = get_subtitle_path(video.name, None if single else subtitle.language)
logger.info('Downloading subtitle %r into %r', subtitle, subtitle_path)
try:
subtitle_text = provider.download_subtitle(subtitle)
except ProviderNotAvailable:
logger.warning('Provider %r is not available, discarding it', subtitle.provider_name)
discarded_providers.add(subtitle.provider_name)
continue
except InvalidSubtitle:
logger.info('Invalid subtitle, skipping it')
continue
except:
logger.exception('Unexpected error in provider %r', subtitle.provider_name)
continue
with io.open(subtitle_path, 'w') as f:
f.write(subtitle_text)
downloaded_languages.add(subtitle.language)
if single or downloaded_languages == languages:
break
finally: # terminate providers
for provider in initialized_providers.values():
provider.terminate()
def download_best_subtitles(videos, languages, providers=None, provider_configs=None, single=False, min_score=0,
hearing_impaired=False):
"""Download the best subtitles for `videos` with the given `languages` using the specified `providers`
:param videos: videos to download subtitles for
:type videos: set of :class:`~subliminal.video.Video`
:param languages: languages of subtitles to download
:type languages: set of :class:`babelfish.Language`
:param providers: providers to use for the search, if not all
:type providers: list of string or None
:param provider_configs: configuration for providers
:type provider_configs: dict of provider name => provider constructor kwargs
:param bool single: download with .srt extension if `True`, add language identifier otherwise
:param int min_score: minimum score for subtitles to download
:param bool hearing_impaired: download hearing impaired subtitles
"""
provider_configs = provider_configs or {}
discarded_providers = set()
downloaded_subtitles = collections.defaultdict(list)
# filter videos
videos = [v for v in videos if v.subtitle_languages != languages]
if not videos:
logger.info('No video to download subtitles for with languages %r', languages)
return downloaded_subtitles
# filter and initialize providers
initialized_providers = {}
for provider_entry_point in pkg_resources.iter_entry_points(PROVIDERS_ENTRY_POINT):
if providers is not None and provider_entry_point.name not in providers:
logger.debug('Skipping provider %r: not in the list', provider_entry_point.name)
continue
Provider = provider_entry_point.load()
if not Provider.languages & languages:
logger.debug('Skipping provider %r: no language to search for', provider_entry_point.name)
continue
if not [v for v in videos if Provider.check(v)]:
logger.debug('Skipping provider %r: no video to search for', provider_entry_point.name)
continue
provider = Provider(**provider_configs.get(provider_entry_point.name, {}))
try:
def __getitem__(self, name):
if name not in self.initialized_providers:
logger.info('Initializing provider %s', name)
provider = self.manager[name].plugin(**self.provider_configs.get(name, {}))
provider.initialize()
except ProviderNotAvailable:
logger.warning('Provider %r is not available, discarding it', provider_entry_point.name)
self.initialized_providers[name] = provider
return self.initialized_providers[name]
def __delitem__(self, name):
if name not in self.initialized_providers:
raise KeyError(name)
try:
logger.info('Terminating provider %s', name)
self.initialized_providers[name].terminate()
except (requests.Timeout, socket.timeout):
logger.error('Provider %r timed out, improperly terminated', name)
except:
logger.exception('Provider %r terminated unexpectedly', name)
del self.initialized_providers[name]
def __iter__(self):
return iter(self.initialized_providers)
def list_subtitles(self, video, languages):
"""List subtitles.
:param video: video to list subtitles for.
:type video: :class:`~subliminal.video.Video`
:param languages: languages to search for.
:type languages: set of :class:`~babelfish.language.Language`
:return: found subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
"""
subtitles = []
for name in self.providers:
# check discarded providers
if name in self.discarded_providers:
logger.debug('Skipping discarded provider %r', name)
continue
# check video validity
if not self.manager[name].plugin.check(video):
logger.info('Skipping provider %r: not a valid video', name)
continue
# check supported languages
provider_languages = self.manager[name].plugin.languages & languages
if not provider_languages:
logger.info('Skipping provider %r: no language to search for', name)
continue
# list subtitles
logger.info('Listing subtitles with provider %r and languages %r', name, provider_languages)
try:
provider_subtitles = self[name].list_subtitles(video, provider_languages)
except (requests.Timeout, socket.timeout):
logger.error('Provider %r timed out, discarding it', name)
self.discarded_providers.add(name)
continue
except:
logger.exception('Unexpected error in provider %r, discarding it', name)
self.discarded_providers.add(name)
continue
subtitles.extend(provider_subtitles)
return subtitles
def download_subtitle(self, subtitle):
"""Download `subtitle`'s :attr:`~subliminal.subtitle.Subtitle.content`.
:param subtitle: subtitle to download.
:type subtitle: :class:`~subliminal.subtitle.Subtitle`
:return: `True` if the subtitle has been successfully downloaded, `False` otherwise.
:rtype: bool
"""
# check discarded providers
if subtitle.provider_name in self.discarded_providers:
logger.warning('Provider %r is discarded', subtitle.provider_name)
return False
logger.info('Downloading subtitle %r', subtitle)
try:
self[subtitle.provider_name].download_subtitle(subtitle)
except (requests.Timeout, socket.timeout):
logger.error('Provider %r timed out, discarding it', subtitle.provider_name)
self.discarded_providers.add(subtitle.provider_name)
return False
except:
logger.exception('Unexpected error in provider %r, discarding it', subtitle.provider_name)
self.discarded_providers.add(subtitle.provider_name)
return False
# check subtitle validity
if not subtitle.is_valid():
logger.error('Invalid subtitle')
return False
return True
def download_best_subtitles(self, subtitles, video, languages, min_score=0, hearing_impaired=False, only_one=False,
scores=None):
"""Download the best matching subtitles.
:param subtitles: the subtitles to use.
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
:param video: video to download subtitles for.
:type video: :class:`~subliminal.video.Video`
:param languages: languages to download.
:type languages: set of :class:`~babelfish.language.Language`
:param int min_score: minimum score for a subtitle to be downloaded.
:param bool hearing_impaired: hearing impaired preference.
:param bool only_one: download only one subtitle, not one per language.
:param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are
used.
:return: downloaded subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
"""
# sort subtitles by score
scored_subtitles = sorted([(s, compute_score(s.get_matches(video, hearing_impaired=hearing_impaired), video,
scores=scores))
for s in subtitles], key=operator.itemgetter(1), reverse=True)
# download best subtitles, falling back on the next on error
downloaded_subtitles = []
for subtitle, score in scored_subtitles:
# check score
if score < min_score:
logger.info('Score %d is below min_score (%d)', score, min_score)
break
# check downloaded languages
if subtitle.language in set(s.language for s in downloaded_subtitles):
logger.debug('Skipping subtitle: %r already downloaded', subtitle.language)
continue
# download
logger.info('Downloading subtitle %r with score %d', subtitle, score)
if self.download_subtitle(subtitle):
downloaded_subtitles.append(subtitle)
# stop when all languages are downloaded
if set(s.language for s in downloaded_subtitles) == languages:
logger.debug('All languages downloaded')
break
# stop if only one subtitle is requested
if only_one:
logger.debug('Only one subtitle downloaded')
break
return downloaded_subtitles
def terminate(self):
"""Terminate all the :attr:`initialized_providers`."""
logger.debug('Terminating initialized providers')
for name in list(self.initialized_providers):
del self[name]
def check_video(video, languages=None, age=None, undefined=False):
"""Perform some checks on the `video`.
All the checks are optional. Return `False` if any of this check fails:
* `languages` already exist in `video`'s :attr:`~subliminal.video.Video.subtitle_languages`.
* `video` is older than `age`.
* `video` has an `undefined` language in :attr:`~subliminal.video.Video.subtitle_languages`.
:param video: video to check.
:type video: :class:`~subliminal.video.Video`
:param languages: desired languages.
:type languages: set of :class:`~babelfish.language.Language`
:param datetime.timedelta age: maximum age of the video.
:param bool undefined: fail on existing undefined language.
:return: `True` if the video passes the checks, `False` otherwise.
:rtype: bool
"""
# language test
if languages and not (languages - video.subtitle_languages):
logger.debug('All languages %r exist', languages)
return False
# age test
if age and video.age > age:
logger.debug('Video is older than %r', age)
return False
# undefined test
if undefined and Language('und') in video.subtitle_languages:
logger.debug('Undefined language found')
return False
return True
def list_subtitles(videos, languages, **kwargs):
"""List subtitles.
The `videos` must pass the `languages` check of :func:`check_video`.
All other parameters are passed onwards to the :class:`ProviderPool` constructor.
:param videos: videos to list subtitles for.
:type videos: set of :class:`~subliminal.video.Video`
:param languages: languages to search for.
:type languages: set of :class:`~babelfish.language.Language`
:return: found subtitles per video.
:rtype: dict of :class:`~subliminal.video.Video` to list of :class:`~subliminal.subtitle.Subtitle`
"""
listed_subtitles = defaultdict(list)
# check videos
checked_videos = []
for video in videos:
if not check_video(video, languages=languages):
logger.info('Skipping video %r', video)
continue
initialized_providers[provider_entry_point.name] = provider
try:
for video in videos:
# search for subtitles
subtitles = []
for provider_name, provider in initialized_providers.items():
if provider.check(video):
if provider_name in discarded_providers:
logger.debug('Skipping discarded provider %r', provider_name)
continue
provider_languages = provider.languages & languages
logger.info('Listing subtitles with provider %r for video %r with languages %r',
provider_name, video, provider_languages)
try:
provider_subtitles = provider.list_subtitles(video, provider_languages)
except ProviderNotAvailable:
logger.warning('Provider %r is not available, discarding it', provider_name)
discarded_providers.add(provider_name)
continue
except:
logger.exception('Unexpected error in provider %r', provider_name)
continue
logger.info('Found %d subtitles', len(provider_subtitles))
subtitles.extend(provider_subtitles)
checked_videos.append(video)
# find the best subtitles and download them
downloaded_languages = set()
for subtitle, score in sorted([(s, s.compute_score(video)) for s in subtitles],
key=operator.itemgetter(1), reverse=True):
# filter
if subtitle.provider_name in discarded_providers:
logger.debug('Skipping subtitle from discarded provider %r', subtitle.provider_name)
continue
if subtitle.hearing_impaired != hearing_impaired:
logger.debug('Skipping subtitle: hearing impaired != %r', hearing_impaired)
continue
if score < min_score:
logger.debug('Skipping subtitle: score < %d', min_score)
continue
if subtitle.language in downloaded_languages:
logger.debug('Skipping subtitle: %r already downloaded', subtitle.language)
continue
# return immediatly if no video passed the checks
if not checked_videos:
return listed_subtitles
# list subtitles
with ProviderPool(**kwargs) as pool:
for video in checked_videos:
logger.info('Listing subtitles for %r', video)
subtitles = pool.list_subtitles(video, languages - video.subtitle_languages)
listed_subtitles[video].extend(subtitles)
logger.info('Found %d subtitle(s)', len(subtitles))
return listed_subtitles
def download_subtitles(subtitles, **kwargs):
"""Download :attr:`~subliminal.subtitle.Subtitle.content` of `subtitles`.
All other parameters are passed onwards to the :class:`ProviderPool` constructor.
:param subtitles: subtitles to download.
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
"""
with ProviderPool(**kwargs) as pool:
for subtitle in subtitles:
logger.info('Downloading subtitle %r', subtitle)
pool.download_subtitle(subtitle)
def download_best_subtitles(videos, languages, min_score=0, hearing_impaired=False, only_one=False, scores=None,
**kwargs):
"""List and download the best matching subtitles.
The `videos` must pass the `languages` and `undefined` (`only_one`) checks of :func:`check_video`.
All other parameters are passed onwards to the :class:`ProviderPool` constructor.
:param videos: videos to download subtitles for.
:type videos: set of :class:`~subliminal.video.Video`
:param languages: languages to download.
:type languages: set of :class:`~babelfish.language.Language`
:param int min_score: minimum score for a subtitle to be downloaded.
:param bool hearing_impaired: hearing impaired preference.
:param bool only_one: download only one subtitle, not one per language.
:param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are used.
:return: downloaded subtitles per video.
:rtype: dict of :class:`~subliminal.video.Video` to list of :class:`~subliminal.subtitle.Subtitle`
"""
downloaded_subtitles = defaultdict(list)
# check videos
checked_videos = []
for video in videos:
if not check_video(video, languages=languages, undefined=only_one):
logger.info('Skipping video %r', video)
continue
checked_videos.append(video)
# return immediatly if no video passed the checks
if not checked_videos:
return downloaded_subtitles
# download best subtitles
with ProviderPool(**kwargs) as pool:
for video in checked_videos:
logger.info('Downloading best subtitles for %r', video)
subtitles = pool.download_best_subtitles(pool.list_subtitles(video, languages - video.subtitle_languages),
video, languages, min_score=min_score,
hearing_impaired=hearing_impaired, only_one=only_one,
scores=scores)
logger.info('Downloaded %d subtitle(s)', len(subtitles))
downloaded_subtitles[video].extend(subtitles)
# download
provider = initialized_providers[subtitle.provider_name]
subtitle_path = get_subtitle_path(video.name, None if single else subtitle.language)
logger.info('Downloading subtitle %r with score %d into %r', subtitle, score, subtitle_path)
try:
subtitle_text = provider.download_subtitle(subtitle)
downloaded_subtitles[video].append(subtitle)
except ProviderNotAvailable:
logger.warning('Provider %r is not available, discarding it', subtitle.provider_name)
discarded_providers.add(subtitle.provider_name)
continue
except InvalidSubtitle:
logger.info('Invalid subtitle, skipping it')
continue
except:
logger.exception('Unexpected error in provider %r', subtitle.provider_name)
continue
with io.open(subtitle_path, 'w') as f:
f.write(subtitle_text)
downloaded_languages.add(subtitle.language)
if single or downloaded_languages == languages:
logger.debug('All languages downloaded')
break
finally: # terminate providers
for provider in initialized_providers.values():
provider.terminate()
return downloaded_subtitles
def save_subtitles(video, subtitles, single=False, directory=None, encoding=None):
"""Save subtitles on filesystem.
Subtitles are saved in the order of the list. If a subtitle with a language has already been saved, other subtitles
with the same language are silently ignored.
The extension used is `.lang.srt` by default or `.srt` is `single` is `True`, with `lang` being the IETF code for
the :attr:`~subliminal.subtitle.Subtitle.language` of the subtitle.
:param video: video of the subtitles.
:type video: :class:`~subliminal.video.Video`
:param subtitles: subtitles to save.
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
:param bool single: save a single subtitle, default is to save one subtitle per language.
:param str directory: path to directory where to save the subtitles, default is next to the video.
:param str encoding: encoding in which to save the subtitles, default is to keep original encoding.
:return: the saved subtitles
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
"""
saved_subtitles = []
for subtitle in subtitles:
# check content
if subtitle.content is None:
logger.error('Skipping subtitle %r: no content', subtitle)
continue
# check language
if subtitle.language in set(s.language for s in saved_subtitles):
logger.debug('Skipping subtitle %r: language already saved', subtitle)
continue
# create subtitle path
subtitle_path = get_subtitle_path(video.name, None if single else subtitle.language)
if directory is not None:
subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1])
# save content as is or in the specified encoding
logger.info('Saving %r to %r', subtitle, subtitle_path)
if encoding is None:
with io.open(subtitle_path, 'wb') as f:
f.write(subtitle.content)
else:
with io.open(subtitle_path, 'w', encoding=encoding) as f:
f.write(subtitle.text)
saved_subtitles.append(subtitle)
# check single
if single:
break
return saved_subtitles
+14 -3
View File
@@ -1,6 +1,17 @@
# -*- coding: utf-8 -*-
import dogpile.cache
import datetime
from dogpile.cache import make_region
#: The subliminal's dogpile.cache region
region = dogpile.cache.make_region()
#: Subliminal's cache version
CACHE_VERSION = 1
#: Expiration time for show caching
SHOW_EXPIRATION_TIME = datetime.timedelta(weeks=3).total_seconds()
#: Expiration time for episode caching
EPISODE_EXPIRATION_TIME = datetime.timedelta(days=3).total_seconds()
region = make_region()
+403 -68
View File
@@ -1,91 +1,426 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function
import argparse
import datetime
"""
Subliminal uses `click <http://click.pocoo.org>`_ to provide a powerful :abbr:`CLI (command-line interface)`.
"""
from __future__ import division
from collections import defaultdict
from datetime import timedelta
import json
import logging
import os
import re
import sys
import babelfish
import guessit
import pkg_resources
from subliminal import (__version__, PROVIDERS_ENTRY_POINT, cache_region, Video, Episode, Movie, scan_videos,
download_best_subtitles)
from babelfish import Error as BabelfishError, Language
import click
from dogpile.cache.backends.file import AbstractFileLock
from dogpile.core import ReadWriteMutex
from six.moves import configparser
from subliminal import (Episode, Movie, ProviderPool, Video, __version__, check_video, provider_manager, region,
save_subtitles, scan_video, scan_videos)
from subliminal.subtitle import compute_score
logger = logging.getLogger(__name__)
DEFAULT_CACHE_FILE = os.path.join('~', '.config', 'subliminal.cache.dbm')
class MutexLock(AbstractFileLock):
""":class:`MutexLock` is a thread-based rw lock based on :class:`dogpile.core.ReadWriteMutex`."""
def __init__(self, filename):
self.mutex = ReadWriteMutex()
def acquire_read_lock(self, wait):
ret = self.mutex.acquire_read_lock(wait)
return wait or ret
def acquire_write_lock(self, wait):
ret = self.mutex.acquire_write_lock(wait)
return wait or ret
def release_read_lock(self):
return self.mutex.release_read_lock()
def release_write_lock(self):
return self.mutex.release_write_lock()
def subliminal_parser():
parser = argparse.ArgumentParser(description='Subtitles, faster than your thoughts')
parser.add_argument('-l', '--languages', nargs='+', metavar='LANGUAGE', help='wanted languages as alpha2 code (ISO-639-1)')
parser.add_argument('-p', '--providers', nargs='+', metavar='PROVIDER', help='providers to use from %s (default: all)' % ', '.join(ep.name for ep in pkg_resources.iter_entry_points(PROVIDERS_ENTRY_POINT)))
parser.add_argument('-m', '--min-score', type=int, help='minimum score for subtitles. 0-%d for episodes, 0-%d for movies' % (Episode.scores['hash'], Movie.scores['hash']))
parser.add_argument('-s', '--single', action='store_true', help='download without language code in subtitle\'s filename i.e. .srt only')
parser.add_argument('-f', '--force', action='store_true', help='overwrite existing subtitles')
parser.add_argument('-c', '--cache-file', default=DEFAULT_CACHE_FILE, help='cache file (default: %(default)s)')
parser.add_argument('-a', '--age', help='download subtitles for videos newer than AGE e.g. 12h, 1w2d')
parser.add_argument('--hearing-impaired', action='store_true', help='download hearing impaired subtitles')
group_verbosity = parser.add_mutually_exclusive_group()
group_verbosity.add_argument('-q', '--quiet', action='store_true', help='disable output')
group_verbosity.add_argument('-v', '--verbose', action='store_true', help='verbose output')
parser.add_argument('--version', action='version', version=__version__)
parser.add_argument('paths', nargs='+', metavar='PATH', help='path to video file or folder')
return parser
class Config(object):
"""A :class:`~configparser.SafeConfigParser` wrapper to store configuration.
Interaction with the configuration is done with the properties.
:param str path: path to the configuration file.
"""
def __init__(self, path):
#: Path to the configuration file
self.path = path
#: The underlying configuration object
self.config = configparser.SafeConfigParser()
self.config.add_section('general')
self.config.set('general', 'languages', json.dumps(['en']))
self.config.set('general', 'providers', json.dumps(sorted([p.name for p in provider_manager])))
self.config.set('general', 'single', str(0))
self.config.set('general', 'embedded_subtitles', str(1))
self.config.set('general', 'age', str(int(timedelta(weeks=2).total_seconds())))
self.config.set('general', 'hearing_impaired', str(1))
self.config.set('general', 'min_score', str(0))
def read(self):
"""Read the configuration from :attr:`path`"""
self.config.read(self.path)
def write(self):
"""Write the configuration to :attr:`path`"""
with open(self.path, 'w') as f:
self.config.write(f)
@property
def languages(self):
return {Language.fromietf(l) for l in json.loads(self.config.get('general', 'languages'))}
@languages.setter
def languages(self, value):
self.config.set('general', 'languages', json.dumps(sorted([str(l) for l in value])))
@property
def providers(self):
return json.loads(self.config.get('general', 'providers'))
@providers.setter
def providers(self, value):
self.config.set('general', 'providers', json.dumps(sorted([p.lower() for p in value])))
@property
def single(self):
return self.config.getboolean('general', 'single')
@single.setter
def single(self, value):
self.config.set('general', 'single', str(int(value)))
@property
def embedded_subtitles(self):
return self.config.getboolean('general', 'embedded_subtitles')
@embedded_subtitles.setter
def embedded_subtitles(self, value):
self.config.set('general', 'embedded_subtitles', str(int(value)))
@property
def age(self):
return timedelta(seconds=self.config.getint('general', 'age'))
@age.setter
def age(self, value):
self.config.set('general', 'age', str(int(value.total_seconds())))
@property
def hearing_impaired(self):
return self.config.getboolean('general', 'hearing_impaired')
@hearing_impaired.setter
def hearing_impaired(self, value):
self.config.set('general', 'hearing_impaired', str(int(value)))
@property
def min_score(self):
return self.config.getfloat('general', 'min_score')
@min_score.setter
def min_score(self, value):
self.config.set('general', 'min_score', str(value))
@property
def provider_configs(self):
rv = {}
for provider in provider_manager:
if self.config.has_section(provider.name):
rv[provider.name] = {k: v for k, v in self.config.items(provider.name)}
return rv
@provider_configs.setter
def provider_configs(self, value):
# loop over provider configurations
for provider, config in value.items():
# create the corresponding section if necessary
if not self.config.has_section(provider):
self.config.add_section(provider)
# add config options
for k, v in config.items():
self.config.set(provider, k, v)
def subliminal():
parser = subliminal_parser()
args = parser.parse_args()
class LanguageParamType(click.ParamType):
""":class:`~click.ParamType` for languages that returns a :class:`~babelfish.language.Language`"""
name = 'language'
# parse paths
try:
args.paths = [p.decode('utf-8') for p in args.paths]
except UnicodeDecodeError:
parser.error('argument paths: encodings is not utf-8: %r' % args.paths)
def convert(self, value, param, ctx):
try:
return Language.fromietf(value)
except BabelfishError:
self.fail('%s is not a valid language' % value)
# parse languages
try:
args.languages = {babelfish.Language.fromalpha2(l) for l in args.languages}
except babelfish.Error:
parser.error('argument -l/--languages: codes are not ISO-639-1: %r' % args.languages)
LANGUAGE = LanguageParamType()
# parse age
if args.age is not None:
match = re.match(r'^(?:(?P<weeks>\d+?)w)?(?:(?P<days>\d+?)d)?(?:(?P<hours>\d+?)h)?$', args.age)
class AgeParamType(click.ParamType):
""":class:`~click.ParamType` for age strings that returns a :class:`~datetime.timedelta`
An age string is in the form `number + identifier` with possible identifiers:
* ``w`` for weeks
* ``d`` for days
* ``h`` for hours
The form can be specified multiple times but only with that idenfier ordering. For example:
* ``1w2d4h`` for 1 week, 2 days and 4 hours
* ``2w`` for 2 weeks
* ``3w6h`` for 3 weeks and 6 hours
"""
name = 'age'
def convert(self, value, param, ctx):
match = re.match(r'^(?:(?P<weeks>\d+?)w)?(?:(?P<days>\d+?)d)?(?:(?P<hours>\d+?)h)?$', value)
if not match:
parser.error('argument -a/--age: invalid age: %r' % args.age)
args.age = datetime.timedelta(**match.groupdict())
self.fail('%s is not a valid age' % value)
# setup verbosity
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
elif not args.quiet:
logging.basicConfig(level=logging.WARN)
return timedelta(**{k: int(v) for k, v in match.groupdict(0).items()})
AGE = AgeParamType()
PROVIDER = click.Choice(sorted(provider_manager.names()))
app_dir = click.get_app_dir('subliminal')
cache_file = 'subliminal.dbm'
config_file = 'config.ini'
@click.group(context_settings={'max_content_width': 100}, epilog='Suggestions and bug reports are greatly appreciated: '
'https://github.com/Diaoul/subliminal/')
@click.option('--addic7ed', type=click.STRING, nargs=2, metavar='USERNAME PASSWORD', help='Addic7ed configuration.')
@click.option('--opensubtitles', type=click.STRING, nargs=2, metavar='USERNAME PASSWORD',
help='OpenSubtitles configuration.')
@click.option('--subscenter', type=click.STRING, nargs=2, metavar='USERNAME PASSWORD', help='SubsCenter configuration.')
@click.option('--cache-dir', type=click.Path(writable=True, resolve_path=True, file_okay=False), default=app_dir,
show_default=True, expose_value=True, help='Path to the cache directory.')
@click.option('--debug', is_flag=True, help='Print useful information for debugging subliminal and for reporting bugs.')
@click.version_option(__version__)
@click.pass_context
def subliminal(ctx, addic7ed, opensubtitles, subscenter, cache_dir, debug):
"""Subtitles, faster than your thoughts."""
# create cache directory
try:
os.makedirs(cache_dir)
except OSError:
if not os.path.isdir(cache_dir):
raise
# configure cache
cache_region.configure('dogpile.cache.dbm', arguments={'filename': os.path.expanduser(args.cache_file)})
region.configure('dogpile.cache.dbm', expiration_time=timedelta(days=30),
arguments={'filename': os.path.join(cache_dir, cache_file), 'lock_factory': MutexLock})
# configure logging
if debug:
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(logging.BASIC_FORMAT))
logging.getLogger('subliminal').addHandler(handler)
logging.getLogger('subliminal').setLevel(logging.DEBUG)
# provider configs
ctx.obj = {'provider_configs': {}}
if addic7ed:
ctx.obj['provider_configs']['addic7ed'] = {'username': addic7ed[0], 'password': addic7ed[1]}
if opensubtitles:
ctx.obj['provider_configs']['opensubtitles'] = {'username': opensubtitles[0], 'password': opensubtitles[1]}
if subscenter:
ctx.obj['provider_configs']['subscenter'] = {'username': subscenter[0], 'password': subscenter[1]}
@subliminal.command()
@click.option('--clear-subliminal', is_flag=True, help='Clear subliminal\'s cache. Use this ONLY if your cache is '
'corrupted or if you experience issues.')
@click.pass_context
def cache(ctx, clear_subliminal):
"""Cache management."""
if clear_subliminal:
os.remove(os.path.join(ctx.parent.params['cache_dir'], cache_file))
click.echo('Subliminal\'s cache cleared.')
else:
click.echo('Nothing done.')
@subliminal.command()
@click.option('-l', '--language', type=LANGUAGE, required=True, multiple=True, help='Language as IETF code, '
'e.g. en, pt-BR (can be used multiple times).')
@click.option('-p', '--provider', type=PROVIDER, multiple=True, help='Provider to use (can be used multiple times).')
@click.option('-a', '--age', type=AGE, help='Filter videos newer than AGE, e.g. 12h, 1w2d.')
@click.option('-d', '--directory', type=click.STRING, metavar='DIR', help='Directory where to save subtitles, '
'default is next to the video file.')
@click.option('-e', '--encoding', type=click.STRING, metavar='ENC', help='Subtitle file encoding, default is to '
'preserve original encoding.')
@click.option('-s', '--single', is_flag=True, default=False, help='Save subtitle without language code in the file '
'name, i.e. use .srt extension. Do not use this unless your media player requires it.')
@click.option('-f', '--force', is_flag=True, default=False, help='Force download even if a subtitle already exist.')
@click.option('-hi', '--hearing-impaired', is_flag=True, default=False, help='Prefer hearing impaired subtitles.')
@click.option('-m', '--min-score', type=click.IntRange(0, 100), default=0, help='Minimum score for a subtitle '
'to be downloaded (0 to 100).')
@click.option('-v', '--verbose', count=True, help='Increase verbosity.')
@click.argument('path', type=click.Path(), required=True, nargs=-1)
@click.pass_obj
def download(obj, provider, language, age, directory, encoding, single, force, hearing_impaired, min_score, verbose,
path):
"""Download best subtitles.
PATH can be an directory containing videos, a video file path or a video file name. It can be used multiple times.
If an existing subtitle is detected (external or embedded) in the correct language, the download is skipped for
the associated video.
"""
# process parameters
language = set(language)
# scan videos
videos = scan_videos([p for p in args.paths if os.path.exists(p)], subtitles=not args.force, age=args.age)
videos = []
ignored_videos = []
errored_paths = []
with click.progressbar(path, label='Collecting videos', item_show_func=lambda p: p or '') as bar:
for p in bar:
logger.debug('Collecting path %s', p)
# guess videos
videos.extend([Video.fromguess(os.path.split(p)[1], guessit.guess_file_info(p, 'autodetect')) for p in args.paths
if not os.path.exists(p)])
# non-existing
if not os.path.exists(p):
try:
video = Video.fromname(p)
except:
logger.exception('Unexpected error while collecting non-existing path %s', p)
errored_paths.append(p)
continue
videos.append(video)
continue
# directories
if os.path.isdir(p):
try:
scanned_videos = scan_videos(p, subtitles=not force, embedded_subtitles=not force,
subtitles_dir=directory)
except:
logger.exception('Unexpected error while collecting directory path %s', p)
errored_paths.append(p)
continue
for video in scanned_videos:
if check_video(video, languages=language, age=age, undefined=single):
videos.append(video)
else:
ignored_videos.append(video)
continue
# other inputs
try:
video = scan_video(p, subtitles=not force, embedded_subtitles=not force, subtitles_dir=directory)
except:
logger.exception('Unexpected error while collecting path %s', p)
errored_paths.append(p)
continue
if check_video(video, languages=language, age=age, undefined=single):
videos.append(video)
else:
ignored_videos.append(video)
# output errored paths
if verbose > 0:
for p in errored_paths:
click.secho('%s errored' % p, fg='red')
# output ignored videos
if verbose > 1:
for video in ignored_videos:
click.secho('%s ignored - subtitles: %s / age: %d day%s' % (
os.path.split(video.name)[1],
', '.join(str(s) for s in video.subtitle_languages) or 'none',
video.age.days,
's' if video.age.days > 1 else ''
), fg='yellow')
# report collected videos
click.echo('%s video%s collected / %s video%s ignored / %s error%s' % (
click.style(str(len(videos)), bold=True, fg='green' if videos else None),
's' if len(videos) > 1 else '',
click.style(str(len(ignored_videos)), bold=True, fg='yellow' if ignored_videos else None),
's' if len(ignored_videos) > 1 else '',
click.style(str(len(errored_paths)), bold=True, fg='red' if errored_paths else None),
's' if len(errored_paths) > 1 else '',
))
# exit if no video collected
if not videos:
return
# download best subtitles
subtitles = download_best_subtitles(videos, args.languages, providers=args.providers, provider_configs=None,
single=args.single, min_score=args.min_score,
hearing_impaired=args.hearing_impaired)
downloaded_subtitles = defaultdict(list)
with ProviderPool(providers=provider, provider_configs=obj['provider_configs']) as pool:
with click.progressbar(videos, label='Downloading subtitles',
item_show_func=lambda v: os.path.split(v.name)[1] if v is not None else '') as bar:
for v in bar:
subtitles = pool.download_best_subtitles(pool.list_subtitles(v, language - v.subtitle_languages),
v, language, min_score=v.scores['hash'] * min_score / 100,
hearing_impaired=hearing_impaired, only_one=single)
downloaded_subtitles[v] = subtitles
# output result
if not subtitles:
if not args.quiet:
sys.stderr.write('No subtitles downloaded\n')
exit(1)
if not args.quiet:
subtitles_count = sum([len(s) for s in subtitles.values()])
if subtitles_count == 1:
print('%d subtitle downloaded' % subtitles_count)
else:
print('%d subtitles downloaded' % subtitles_count)
# save subtitles
total_subtitles = 0
for v, subtitles in downloaded_subtitles.items():
saved_subtitles = save_subtitles(v, subtitles, single=single, directory=directory, encoding=encoding)
total_subtitles += len(saved_subtitles)
if verbose > 0:
click.echo('%s subtitle%s downloaded for %s' % (click.style(str(len(saved_subtitles)), bold=True),
's' if len(saved_subtitles) > 1 else '',
os.path.split(v.name)[1]))
if verbose > 1:
for s in saved_subtitles:
matches = s.get_matches(v, hearing_impaired=hearing_impaired)
score = compute_score(matches, v)
# score color
score_color = None
if isinstance(v, Movie):
if score < v.scores['title']:
score_color = 'red'
elif score < v.scores['title'] + v.scores['year'] + v.scores['release_group']:
score_color = 'yellow'
else:
score_color = 'green'
elif isinstance(v, Episode):
if score < v.scores['series'] + v.scores['season'] + v.scores['episode']:
score_color = 'red'
elif score < (v.scores['series'] + v.scores['season'] + v.scores['episode'] +
v.scores['release_group']):
score_color = 'yellow'
else:
score_color = 'green'
# scale score from 0 to 100 taking out preferences
scaled_score = score
if s.hearing_impaired == hearing_impaired:
scaled_score -= v.scores['hearing_impaired']
scaled_score *= 100 / v.scores['hash']
# echo some nice colored output
click.echo(' - [{score}] {language} subtitle from {provider_name} (match on {matches})'.format(
score=click.style('{:5.1f}'.format(scaled_score), fg=score_color, bold=score >= v.scores['hash']),
language=s.language.name if s.language.country is None else '%s (%s)' % (s.language.name,
s.language.country.name),
provider_name=s.provider_name,
matches=', '.join(sorted(matches, key=v.scores.get, reverse=True))
))
if verbose == 0:
click.echo('Downloaded %s subtitle%s' % (click.style(str(total_subtitles), bold=True),
's' if total_subtitles > 1 else ''))
+21 -18
View File
@@ -1,29 +1,32 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from babelfish.converters.name import NameConverter
from babelfish import LanguageReverseConverter, language_converters
class Addic7edConverter(NameConverter):
class Addic7edConverter(LanguageReverseConverter):
def __init__(self):
super(Addic7edConverter, self).__init__()
self.from_addic7ed = {'Català': ('cat', None), 'Chinese (Simplified)': ('zho', None),
'Chinese (Traditional)': ('zho', None), 'Euskera': ('eus', None),
'Galego': ('glg', None), 'Greek': ('ell', None),
'Malay': ('msa', None), 'Portuguese (Brazilian)': ('por', 'BR'),
'Serbian (Cyrillic)': ('srp', None), 'Serbian (Latin)': ('srp', None),
'Spanish (Latin America)': ('spa', None), 'Spanish (Spain)': ('spa', None)}
self.to_addic7ed = {('cat', None): 'Català', ('zho', None): 'Chinese (Simplified)',
('eus', None): 'Euskera', ('glg', None): 'Galego',
('ell', None): 'Greek', ('msa', None): 'Malay',
('por', 'BR'): 'Portuguese (Brazilian)', ('srp', None): 'Serbian (Cyrillic)'}
self.codes |= set(self.from_addic7ed.keys())
self.name_converter = language_converters['name']
self.from_addic7ed = {u'Català': ('cat',), 'Chinese (Simplified)': ('zho',), 'Chinese (Traditional)': ('zho',),
'Euskera': ('eus',), 'Galego': ('glg',), 'Greek': ('ell',), 'Malay': ('msa',),
'Portuguese (Brazilian)': ('por', 'BR'), 'Serbian (Cyrillic)': ('srp', None, 'Cyrl'),
'Serbian (Latin)': ('srp',), 'Spanish (Latin America)': ('spa',),
'Spanish (Spain)': ('spa',)}
self.to_addic7ed = {('cat',): 'Català', ('zho',): 'Chinese (Simplified)', ('eus',): 'Euskera',
('glg',): 'Galego', ('ell',): 'Greek', ('msa',): 'Malay',
('por', 'BR'): 'Portuguese (Brazilian)', ('srp', None, 'Cyrl'): 'Serbian (Cyrillic)'}
self.codes = self.name_converter.codes | set(self.from_addic7ed.keys())
def convert(self, alpha3, country=None):
def convert(self, alpha3, country=None, script=None):
if (alpha3, country, script) in self.to_addic7ed:
return self.to_addic7ed[(alpha3, country, script)]
if (alpha3, country) in self.to_addic7ed:
return self.to_addic7ed[(alpha3, country)]
return super(Addic7edConverter, self).convert(alpha3, country)
if (alpha3,) in self.to_addic7ed:
return self.to_addic7ed[(alpha3,)]
return self.name_converter.convert(alpha3, country, script)
def reverse(self, addic7ed):
if addic7ed in self.from_addic7ed:
return self.from_addic7ed[addic7ed]
return super(Addic7edConverter, self).reverse(addic7ed)
return self.name_converter.reverse(addic7ed)
+25
View File
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
from babelfish import LanguageReverseConverter
from subliminal.exceptions import ConfigurationError
class TheSubDBConverter(LanguageReverseConverter):
def __init__(self):
self.from_thesubdb = {'en': ('eng',), 'es': ('spa',), 'fr': ('fra',), 'it': ('ita',), 'nl': ('nld',),
'pl': ('pol',), 'pt': ('por', 'BR'), 'ro': ('ron',), 'sv': ('swe',), 'tr': ('tur',)}
self.to_thesubdb = {v: k for k, v in self.from_thesubdb.items()}
self.codes = set(self.from_thesubdb.keys())
def convert(self, alpha3, country=None, script=None):
if (alpha3, country) in self.to_thesubdb:
return self.to_thesubdb[(alpha3, country)]
if (alpha3,) in self.to_thesubdb:
return self.to_thesubdb[(alpha3,)]
raise ConfigurationError('Unsupported language for thesubdb: %s, %s, %s' % (alpha3, country, script))
def reverse(self, thesubdb):
if thesubdb in self.from_thesubdb:
return self.from_thesubdb[thesubdb]
raise ConfigurationError('Unsupported language code for thesubdb: %s' % thesubdb)
+14 -11
View File
@@ -1,22 +1,25 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from babelfish.converters.alpha2 import Alpha2Converter
from babelfish import LanguageReverseConverter, language_converters
class TVsubtitlesConverter(Alpha2Converter):
class TVsubtitlesConverter(LanguageReverseConverter):
def __init__(self):
super(TVsubtitlesConverter, self).__init__()
self.from_tvsubtitles = {'br': ('por', 'BR'), 'ua': ('ukr', None), 'gr': ('ell', None), 'cn': ('zho', None),
'jp': ('jpn', None), 'cz': ('ces', None)}
self.to_tvsubtitles = {v: k for k, v in self.from_tvsubtitles}
self.codes |= set(self.from_tvsubtitles.keys())
self.alpha2_converter = language_converters['alpha2']
self.from_tvsubtitles = {'br': ('por', 'BR'), 'ua': ('ukr',), 'gr': ('ell',), 'cn': ('zho',), 'jp': ('jpn',),
'cz': ('ces',)}
self.to_tvsubtitles = {v: k for k, v in self.from_tvsubtitles.items()}
self.codes = self.alpha2_converter.codes | set(self.from_tvsubtitles.keys())
def convert(self, alpha3, country=None):
def convert(self, alpha3, country=None, script=None):
if (alpha3, country) in self.to_tvsubtitles:
return self.to_tvsubtitles[(alpha3, country)]
return super(TVsubtitlesConverter, self).convert(alpha3, country)
if (alpha3,) in self.to_tvsubtitles:
return self.to_tvsubtitles[(alpha3,)]
return self.alpha2_converter.convert(alpha3, country, script)
def reverse(self, tvsubtitles):
if tvsubtitles in self.from_tvsubtitles:
return self.from_tvsubtitles[tvsubtitles]
return super(TVsubtitlesConverter, self).reverse(tvsubtitles)
return self.alpha2_converter.reverse(tvsubtitles)
+13 -11
View File
@@ -1,27 +1,29 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
class Error(Exception):
"""Base class for exceptions in subliminal"""
"""Base class for exceptions in subliminal."""
pass
class ProviderError(Error):
"""Exception raised by providers"""
"""Exception raised by providers."""
pass
class ProviderConfigurationError(ProviderError):
"""Exception raised by providers when badly configured"""
class ConfigurationError(ProviderError):
"""Exception raised by providers when badly configured."""
pass
class ProviderNotAvailable(ProviderError):
"""Exception raised by providers when unavailable"""
class AuthenticationError(ProviderError):
"""Exception raised by providers when authentication failed."""
pass
class InvalidSubtitle(ProviderError):
"""Exception raised by providers when the downloaded subtitle is invalid"""
class TooManyRequests(ProviderError):
"""Exception raised by providers when too many requests are made."""
pass
class DownloadLimitExceeded(ProviderError):
"""Exception raised by providers when download limit is exceeded."""
pass
+95 -54
View File
@@ -1,19 +1,76 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import babelfish
import logging
from bs4 import BeautifulSoup, FeatureNotFound
from six.moves.xmlrpc_client import SafeTransport
from ..video import Episode, Movie
logger = logging.getLogger(__name__)
def get_version(version):
"""Put the `version` in the major.minor form.
:param str version: the full version.
:return: the major.minor form of the `version`.
:rtype: str
"""
return '.'.join(version.split('.')[:2])
class TimeoutSafeTransport(SafeTransport):
"""Timeout support for ``xmlrpc.client.SafeTransport``."""
def __init__(self, timeout, *args, **kwargs):
SafeTransport.__init__(self, *args, **kwargs)
self.timeout = timeout
def make_connection(self, host):
c = SafeTransport.make_connection(self, host)
c.timeout = self.timeout
return c
class ParserBeautifulSoup(BeautifulSoup):
"""A ``bs4.BeautifulSoup`` that picks the first parser available in `parsers`.
:param markup: markup for the ``bs4.BeautifulSoup``.
:param list parsers: parser names, in order of preference
"""
def __init__(self, markup, parsers, **kwargs):
# reject features
if set(parsers).intersection({'fast', 'permissive', 'strict', 'xml', 'html', 'html5'}):
raise ValueError('Features not allowed, only parser names')
# reject some kwargs
if 'features' in kwargs:
raise ValueError('Cannot use features kwarg')
if 'builder' in kwargs:
raise ValueError('Cannot use builder kwarg')
# pick the first parser available
for parser in parsers:
try:
super(ParserBeautifulSoup, self).__init__(markup, parser, **kwargs)
return
except FeatureNotFound:
pass
raise FeatureNotFound
class Provider(object):
"""Base class for providers
"""Base class for providers.
If any configuration is possible for the provider, like credentials, it must take place during instantiation
If any configuration is possible for the provider, like credentials, it must take place during instantiation.
:param \*\*kwargs: configuration
:raise: :class:`~subliminal.exceptions.ProviderConfigurationError` if there is a configuration error
:raise: :class:`~subliminal.exceptions.ConfigurationError` if there is a configuration error
"""
#: Supported BabelFish languages
#: Supported set of :class:`~babelfish.language.Language`
languages = set()
#: Supported video types
@@ -22,53 +79,46 @@ class Provider(object):
#: Required hash, if any
required_hash = None
def __init__(self, **kwargs):
pass
def __enter__(self):
self.initialize()
return self
def __exit__(self, *args):
def __exit__(self, exc_type, exc_value, traceback):
self.terminate()
def initialize(self):
"""Initialize the provider
"""Initialize the provider.
Must be called when starting to work with the provider. This is the place for network initialization
or login operations.
.. note:
This is called automatically if you use the :keyword:`with` statement
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable` if the provider is unavailable
.. note::
This is called automatically when entering the :keyword:`with` statement
"""
pass
raise NotImplementedError
def terminate(self):
"""Terminate the provider
"""Terminate the provider.
Must be called when done with the provider. This is the place for network shutdown or logout operations.
.. note:
This is called automatically if you use the :keyword:`with` statement
.. note::
This is called automatically when exiting the :keyword:`with` statement
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable` if the provider is unavailable
"""
pass
raise NotImplementedError
@classmethod
def check(cls, video):
"""Check if the `video` can be processed
"""Check if the `video` can be processed.
The video is considered invalid if not an instance of :attr:`video_types` or if the :attr:`required_hash` is
not present in :attr:`~subliminal.video.Video`'s `hashes` attribute.
The `video` is considered invalid if not an instance of :attr:`video_types` or if the :attr:`required_hash` is
not present in :attr:`~subliminal.video.Video.hashes` attribute of the `video`.
:param video: the video to check
:param video: the video to check.
:type video: :class:`~subliminal.video.Video`
:return: `True` if the `video` and `languages` are valid, `False` otherwise
:return: `True` if the `video` is valid, `False` otherwise.
:rtype: bool
"""
@@ -76,53 +126,44 @@ class Provider(object):
return False
if cls.required_hash is not None and cls.required_hash not in video.hashes:
return False
return True
def query(self, languages, *args, **kwargs):
"""Query the provider for subtitles
def query(self, *args, **kwargs):
"""Query the provider for subtitles.
This method arguments match as much as possible the actual parameters for querying the provider
Arguments should match as much as possible the actual parameters for querying the provider
:param languages: languages to search for
:type languages: set of :class:`babelfish.Language`
:param \*args: other required arguments
:param \*\*kwargs: other optional arguments
:return: the subtitles
:return: found subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable` if the provider is unavailable
:raise: :class:`~subliminal.exceptions.ProviderError` if something unexpected occured
:raise: :class:`~subliminal.exceptions.ProviderError`
"""
raise NotImplementedError
def list_subtitles(self, video, languages):
"""List subtitles for the `video` with the given `languages`
"""List subtitles for the `video` with the given `languages`.
This is a proxy for the :meth:`query` method. The parameters passed to the :meth:`query` method may
vary depending on the amount of information available in the `video`
This will call the :meth:`query` method internally. The parameters passed to the :meth:`query` method may
vary depending on the amount of information available in the `video`.
:param video: video to list subtitles for
:param video: video to list subtitles for.
:type video: :class:`~subliminal.video.Video`
:param languages: languages to search for
:type languages: set of :class:`babelfish.Language`
:return: the subtitles
:param languages: languages to search for.
:type languages: set of :class:`~babelfish.language.Language`
:return: found subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable` if the provider is unavailable
:raise: :class:`~subliminal.exceptions.ProviderError` if something unexpected occured
:raise: :class:`~subliminal.exceptions.ProviderError`
"""
raise NotImplementedError
def download_subtitle(self, subtitle):
"""Download the `subtitle`
"""Download `subtitle`'s :attr:`~subliminal.subtitle.Subtitle.content`.
:param subtitle: subtitle to download
:param subtitle: subtitle to download.
:type subtitle: :class:`~subliminal.subtitle.Subtitle`
:return: the subtitle text
:rtype: string
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable` if the provider is unavailable
:raise: :class:`~subliminal.exceptions.InvalidSubtitle` if the downloaded subtitle is invalid
:raise: :class:`~subliminal.exceptions.ProviderError` if something unexpected occured
:raise: :class:`~subliminal.exceptions.ProviderError`
"""
raise NotImplementedError
+208 -95
View File
@@ -1,38 +1,46 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
import babelfish
import bs4
import charade
import requests
from . import Provider
import re
from babelfish import Language
from requests import Session
from . import ParserBeautifulSoup, Provider, get_version
from .. import __version__
from ..cache import region
from ..exceptions import InvalidSubtitle, ProviderNotAvailable
from ..subtitle import Subtitle, is_valid_subtitle
from ..cache import SHOW_EXPIRATION_TIME, region
from ..exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, TooManyRequests
from ..subtitle import (Subtitle, fix_line_ending, guess_matches, guess_properties, sanitize_string,
sanitized_string_equal)
from ..video import Episode
logger = logging.getLogger(__name__)
series_year_re = re.compile('^(?P<series>[ \w\'.:]+)(?: \((?P<year>\d{4})\))?$')
class Addic7edSubtitle(Subtitle):
provider_name = 'addic7ed'
def __init__(self, language, series, season, episode, title, version, hearing_impaired, download_link, referer):
super(Addic7edSubtitle, self).__init__(language, hearing_impaired)
def __init__(self, language, hearing_impaired, page_link, series, season, episode, title, year, version,
download_link):
super(Addic7edSubtitle, self).__init__(language, hearing_impaired, page_link)
self.series = series
self.season = season
self.episode = episode
self.title = title
self.year = year
self.version = version
self.download_link = download_link
self.referer = referer
def compute_matches(self, video):
matches = set()
@property
def id(self):
return self.download_link
def get_matches(self, video, hearing_impaired=False):
matches = super(Addic7edSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# series
if video.series and self.series == video.series:
if video.series and sanitized_string_equal(self.series, video.series):
matches.add('series')
# season
if video.season and self.season == video.season:
@@ -41,120 +49,225 @@ class Addic7edSubtitle(Subtitle):
if video.episode and self.episode == video.episode:
matches.add('episode')
# title
if video.title and self.title.lower() == video.title.lower():
if video.title and sanitized_string_equal(self.title, video.title):
matches.add('title')
# year
if video.year == self.year:
matches.add('year')
# release_group
if video.release_group and self.version and video.release_group.lower() in self.version.lower():
matches.add('release_group')
# resolution
if video.resolution and self.version and video.resolution in self.version.lower():
matches.add('resolution')
# format
if video.format and self.version and video.format.lower() in self.version.lower():
matches.add('format')
# other properties
matches |= guess_matches(video, guess_properties(self.version), partial=True)
return matches
class Addic7edProvider(Provider):
languages = {babelfish.Language('por', 'BR')} | {babelfish.Language(l)
for l in ['ara', 'aze', 'ben', 'bos', 'bul', 'cat', 'ces', 'dan', 'deu', 'ell', 'eng', 'eus', 'fas',
'fin', 'fra', 'glg', 'heb', 'hrv', 'hun', 'hye', 'ind', 'ita', 'jpn', 'kor', 'mkd', 'msa',
'nld', 'nor', 'pol', 'por', 'ron', 'rus', 'slk', 'slv', 'spa', 'sqi', 'srp', 'swe', 'tha',
'tur', 'ukr', 'vie', 'zho']}
videos = (Episode,)
server = 'http://www.addic7ed.com'
languages = {Language('por', 'BR')} | {Language(l) for l in [
'ara', 'aze', 'ben', 'bos', 'bul', 'cat', 'ces', 'dan', 'deu', 'ell', 'eng', 'eus', 'fas', 'fin', 'fra', 'glg',
'heb', 'hrv', 'hun', 'hye', 'ind', 'ita', 'jpn', 'kor', 'mkd', 'msa', 'nld', 'nor', 'pol', 'por', 'ron', 'rus',
'slk', 'slv', 'spa', 'sqi', 'srp', 'swe', 'tha', 'tur', 'ukr', 'vie', 'zho'
]}
video_types = (Episode,)
server_url = 'http://www.addic7ed.com/'
def __init__(self, username=None, password=None):
if username is not None and password is None or username is None and password is not None:
raise ConfigurationError('Username and password must be specified')
self.username = username
self.password = password
self.logged_in = False
def initialize(self):
self.session = requests.Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % __version__}
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
# login
if self.username is not None and self.password is not None:
logger.info('Logging in')
data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'}
r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10)
if r.status_code != 302:
raise AuthenticationError(self.username)
logger.debug('Logged in')
self.logged_in = True
def terminate(self):
# logout
if self.logged_in:
logger.info('Logging out')
r = self.session.get(self.server_url + 'logout.php', timeout=10)
r.raise_for_status()
logger.debug('Logged out')
self.logged_in = False
self.session.close()
def get(self, url, params=None):
"""Make a GET request on `url` with the given parameters
@region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
def _get_show_ids(self):
"""Get the ``dict`` of show ids per series by querying the `shows.php` page.
:param string url: part of the URL to reach with the leading slash
:param params: params of the request
:return: the response
:rtype: :class:`bs4.BeautifulSoup`
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable`
"""
try:
r = self.session.get(self.server + url, params=params, timeout=10)
except requests.Timeout:
raise ProviderNotAvailable('Timeout after 10 seconds')
if r.status_code != 200:
raise ProviderNotAvailable('Request failed with status code %d' % r.status_code)
return bs4.BeautifulSoup(r.content, ['permissive'])
@region.cache_on_arguments()
def get_show_ids(self):
"""Load the shows page with default series to show ids mapping
:return: series to show ids
:return: show id per series, lower case and without quotes.
:rtype: dict
"""
soup = self.get('/shows.php')
# get the show page
logger.info('Getting show ids')
r = self.session.get(self.server_url + 'shows.php', timeout=10)
r.raise_for_status()
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# populate the show ids
show_ids = {}
for html_show in soup.select('td.version > h3 > a[href^="/show/"]'):
show_ids[html_show.string.lower()] = int(html_show['href'][6:])
for show in soup.select('td.version > h3 > a[href^="/show/"]'):
show_ids[sanitize_string(show.text).lower()] = int(show['href'][6:])
logger.debug('Found %d show ids', len(show_ids))
return show_ids
@region.cache_on_arguments()
def find_show_id(self, series):
"""Find a show id from the series
@region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
def _search_show_id(self, series, year=None):
"""Search the show id from the `series` and `year`.
Use this only if the series is not in the dict returned by :meth:`get_show_ids`
:param string series: series of the episode
:return: the show id, if any
:param str series: series of the episode.
:param year: year of the series, if any.
:type year: int or None
:return: the show id, if found.
:rtype: int or None
"""
params = {'search': series, 'Submit': 'Search'}
logger.debug('Searching series %r', params)
suggested_shows = self.get('/search.php', params).select('span.titulo > a[href^="/show/"]')
if not suggested_shows:
logger.info('Series %r not found', series)
return None
return int(suggested_shows[0]['href'][6:])
# build the params
series_year = '%s %d' % (series, year) if year is not None else series
params = {'search': sanitize_string(series_year, replacement=' '), 'Submit': 'Search'}
def query(self, series, season):
show_ids = self.get_show_ids()
if series.lower() in show_ids:
show_id = show_ids[series.lower()]
else:
show_id = self.find_show_id(series.lower())
if show_id is None:
return []
params = {'show_id': show_id, 'season': season}
logger.debug('Searching subtitles %r', params)
link = '/show/{show_id}&season={season}'.format(**params)
soup = self.get(link)
# make the search
logger.info('Searching show ids with %r', params)
r = self.session.get(self.server_url + 'search.php', params=params, timeout=10)
r.raise_for_status()
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# get the suggestion
suggestion = soup.select('span.titulo > a[href^="/show/"]')
if not suggestion:
logger.warning('Show id not found: no suggestion')
return None
if not sanitized_string_equal(suggestion[0].i.text, series_year):
logger.warning('Show id not found: suggestion does not match')
return None
show_id = int(suggestion[0]['href'][6:])
logger.debug('Found show id %d', show_id)
return show_id
def get_show_id(self, series, year=None, country_code=None):
"""Get the best matching show id for `series`, `year` and `country_code`.
First search in the result of :meth:`_get_show_ids` and fallback on a search with :meth:`_search_show_id`
:param str series: series of the episode.
:param year: year of the series, if any.
:type year: int or None
:param country_code: country code of the series, if any.
:type country_code: str or None
:return: the show id, if found.
:rtype: int or None
"""
series_sanitized = sanitize_string(series).lower()
show_ids = self._get_show_ids()
show_id = None
# attempt with country
if not show_id and country_code:
logger.debug('Getting show id with country')
show_id = show_ids.get('%s %s' % (series_sanitized, country_code.lower()))
# attempt with year
if not show_id and year:
logger.debug('Getting show id with year')
show_id = show_ids.get('%s %d' % (series_sanitized, year))
# attempt clean
if not show_id:
logger.debug('Getting show id')
show_id = show_ids.get(series_sanitized)
# search as last resort
if not show_id:
logger.warning('Series not found in show ids')
show_id = self._search_show_id(series)
return show_id
def query(self, series, season, year=None, country=None):
# get the show id
show_id = self.get_show_id(series, year, country)
if show_id is None:
logger.error('No show id found for %r (%r)', series, {'year': year, 'country': country})
return []
# get the page of the season of the show
logger.info('Getting the page of show id %d, season %d', show_id, season)
r = self.session.get(self.server_url + 'show/%d' % show_id, params={'season': season}, timeout=10)
r.raise_for_status()
if r.status_code == 304:
raise TooManyRequests()
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# loop over subtitle rows
match = series_year_re.match(soup.select('#header font')[0].text.strip()[:-10])
series = match.group('series')
year = int(match.group('year')) if match.group('year') else None
subtitles = []
for row in soup('tr', class_='epeven completed'):
for row in soup.select('tr.epeven'):
cells = row('td')
if cells[5].string != 'Completed':
logger.debug('Skipping incomplete subtitle')
# ignore incomplete subtitles
status = cells[5].text
if status != 'Completed':
logger.debug('Ignoring subtitle with status %s', status)
continue
subtitles.append(Addic7edSubtitle(babelfish.Language.fromaddic7ed(cells[3].string), series, season,
int(cells[1].string), cells[2].string, cells[4].string,
bool(cells[6].string), cells[9].a['href'], link))
# read the item
language = Language.fromaddic7ed(cells[3].text)
hearing_impaired = bool(cells[6].text)
page_link = self.server_url + cells[2].a['href'][1:]
season = int(cells[0].text)
episode = int(cells[1].text)
title = cells[2].text
version = cells[4].text
download_link = cells[9].a['href'][1:]
subtitle = Addic7edSubtitle(language, hearing_impaired, page_link, series, season, episode, title, year,
version, download_link)
logger.debug('Found subtitle %r', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
return [s for s in self.query(video.series, video.season)
return [s for s in self.query(video.series, video.season, video.year)
if s.language in languages and s.episode == video.episode]
def download_subtitle(self, subtitle):
try:
r = self.session.get(self.server + subtitle.download_link, timeout=10,
headers={'Referer': self.server + subtitle.referer})
except requests.Timeout:
raise ProviderNotAvailable('Timeout after 10 seconds')
if r.status_code != 200:
raise ProviderNotAvailable('Request failed with status code %d' % r.status_code)
subtitle_text = r.content.decode(charade.detect(r.content)['encoding'])
if not is_valid_subtitle(subtitle_text):
raise InvalidSubtitle
return subtitle_text
# download the subtitle
logger.info('Downloading subtitle %r', subtitle)
r = self.session.get(self.server_url + subtitle.download_link, headers={'Referer': subtitle.page_link},
timeout=10)
r.raise_for_status()
# detect download limit exceeded
if r.headers['Content-Type'] == 'text/html':
raise DownloadLimitExceeded
subtitle.content = fix_line_ending(r.content)
-138
View File
@@ -1,138 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
import urllib
import babelfish
import bs4
import charade
import guessit
import requests
from . import Provider
from .. import __version__
from ..cache import region
from ..exceptions import InvalidSubtitle, ProviderNotAvailable, ProviderError
from ..subtitle import Subtitle, is_valid_subtitle, compute_guess_matches
from ..video import Episode
logger = logging.getLogger(__name__)
class BierDopjeSubtitle(Subtitle):
provider_name = 'bierdopje'
def __init__(self, language, season, episode, tvdb_id, series, filename, download_link):
super(BierDopjeSubtitle, self).__init__(language)
self.season = season
self.episode = episode
self.tvdb_id = tvdb_id
self.series = series
self.filename = filename
self.download_link = download_link
def compute_matches(self, video):
matches = set()
# tvdb_id
if video.tvdb_id and self.tvdb_id == video.tvdb_id:
matches.add('tvdb_id')
# series
if video.series and self.series == video.series:
matches.add('series')
# season
if video.season and self.season == video.season:
matches.add('season')
# episode
if video.episode and self.episode == video.episode:
matches.add('episode')
matches |= compute_guess_matches(video, guessit.guess_episode_info(self.filename + '.mkv'))
return matches
class BierDopjeProvider(Provider):
languages = {babelfish.Language(l) for l in ['eng', 'nld']}
video_types = (Episode,)
def initialize(self):
self.session = requests.Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % __version__}
def terminate(self):
self.session.close()
def get(self, url, **params):
"""Make a GET request on the `url` formatted with `**params`
:param string url: API part of the URL to reach without the leading slash
:param \*\*params: format specs for the `url`
:return: the response
:rtype: :class:`bs4.BeautifulSoup`
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable`
"""
try:
r = self.session.get('http://api.bierdopje.com/A2B638AC5D804C2E/' + url.format(**params), timeout=10)
except requests.Timeout:
raise ProviderNotAvailable('Timeout after 10 seconds')
if r.status_code == 429:
raise ProviderNotAvailable('Too Many Requests')
elif r.status_code != 200:
raise ProviderError('Request failed with status code %d' % r.status_code)
return bs4.BeautifulSoup(r.content, ['xml'])
@region.cache_on_arguments()
def find_show_id(self, series):
"""Find the show id from series name
:param string series: series of the episode
:return: show id
:rtype: int
"""
logger.debug('Searching for series %r', series)
soup = self.get('FindShowByName/{series}', series=urllib.quote(series))
if soup.status.contents[0] == 'false':
logger.info('Series %r not found', series)
return None
return int(soup.showid.contents[0])
def query(self, language, season, episode, tvdb_id=None, series=None):
params = {'language': language.alpha2, 'season': season, 'episode': episode}
if tvdb_id is not None:
params['showid'] = tvdb_id
params['istvdbid'] = 'true'
elif series is not None:
show_id = self.find_show_id(series)
if show_id is None:
return []
params['showid'] = show_id
params['istvdbid'] = 'false'
else:
raise ValueError('Missing parameter tvdb_id or series')
logger.debug('Searching subtitles %r', params)
soup = self.get('GetAllSubsFor/{showid}/{season}/{episode}/{language}/{istvdbid}', **params)
if soup.status.contents[0] == 'false':
logger.debug('No subtitle found')
return []
logger.debug('Found subtitles %r', soup.results('result'))
return [BierDopjeSubtitle(language, season, episode, tvdb_id, series, result.filename.contents[0],
result.downloadlink.contents[0]) for result in soup.results('result')]
def list_subtitles(self, video, languages):
subtitles = []
for language in languages:
subtitles.extend(self.query(language, video.season, video.episode, video.tvdb_id, video.series))
return subtitles
def download_subtitle(self, subtitle):
try:
r = self.session.get(subtitle.download_link, timeout=10)
except requests.Timeout:
raise ProviderNotAvailable('Timeout after 10 seconds')
if r.status_code == 429:
raise ProviderNotAvailable('Too Many Requests')
elif r.status_code != 200:
raise ProviderError('Request failed with status code %d' % r.status_code)
subtitle_text = r.content.decode(charade.detect(r.content)['encoding'])
if not is_valid_subtitle(subtitle_text):
raise InvalidSubtitle
return subtitle_text
+101
View File
@@ -0,0 +1,101 @@
# -*- coding: utf-8 -*-
import logging
from babelfish import Language
from requests import Session
from . import Provider, get_version
from .. import __version__
from ..subtitle import Subtitle
logger = logging.getLogger(__name__)
def get_subhash(hash):
"""Get a second hash based on napiprojekt's hash.
:param str hash: napiprojekt's hash.
:return: the subhash.
:rtype: str
"""
idx = [0xe, 0x3, 0x6, 0x8, 0x2]
mul = [2, 2, 5, 4, 3]
add = [0, 0xd, 0x10, 0xb, 0x5]
b = []
for i in range(len(idx)):
a = add[i]
m = mul[i]
i = idx[i]
t = a + int(hash[i], 16)
v = int(hash[t:t + 2], 16)
b.append(('%x' % (v * m))[-1])
return ''.join(b)
class NapiProjektSubtitle(Subtitle):
provider_name = 'napiprojekt'
def __init__(self, language, hash):
super(NapiProjektSubtitle, self).__init__(language)
self.hash = hash
@property
def id(self):
return self.hash
def get_matches(self, video, hearing_impaired=False):
matches = super(NapiProjektSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# hash
if 'napiprojekt' in video.hashes and video.hashes['napiprojekt'] == self.hash:
matches.add('hash')
return matches
class NapiProjektProvider(Provider):
languages = {Language.fromalpha2(l) for l in ['pl']}
required_hash = 'napiprojekt'
server_url = 'http://napiprojekt.pl/unit_napisy/dl.php'
def initialize(self):
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
def terminate(self):
self.session.close()
def query(self, language, hash):
params = {
'v': 'dreambox',
'kolejka': 'false',
'nick': '',
'pass': '',
'napios': 'Linux',
'l': language.alpha2.upper(),
'f': hash,
't': get_subhash(hash)}
logger.info('Searching subtitle %r', params)
response = self.session.get(self.server_url, params=params, timeout=10)
response.raise_for_status()
# handle subtitles not found and errors
if response.content[:4] == b'NPc0':
logger.debug('No subtitles found')
return None
subtitle = NapiProjektSubtitle(language, hash)
subtitle.content = response.content
logger.debug('Found subtitle %r', subtitle)
return subtitle
def list_subtitles(self, video, languages):
return [s for s in [self.query(l, video.hashes['napiprojekt']) for l in languages] if s is not None]
def download_subtitle(self, subtitle):
# there is no download step, content is already filled from listing subtitles
pass
+184 -81
View File
@@ -1,20 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import base64
import logging
import os
import re
import xmlrpclib
import zlib
import babelfish
import charade
import guessit
from . import Provider
from .. import __version__
from ..exceptions import ProviderError, ProviderNotAvailable, InvalidSubtitle
from ..subtitle import Subtitle, is_valid_subtitle, compute_guess_matches
from ..video import Episode, Movie
from babelfish import Language, language_converters
from guessit import guess_episode_info, guess_movie_info
from six.moves.xmlrpc_client import ServerProxy
from . import Provider, TimeoutSafeTransport, get_version
from .. import __version__
from ..exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, ProviderError
from ..subtitle import Subtitle, fix_line_ending, guess_matches, sanitized_string_equal
from ..video import Episode, Movie
logger = logging.getLogger(__name__)
@@ -23,10 +22,10 @@ class OpenSubtitlesSubtitle(Subtitle):
provider_name = 'opensubtitles'
series_re = re.compile('^"(?P<series_name>.*)" (?P<series_title>.*)$')
def __init__(self, language, hearing_impaired, id, matched_by, movie_kind, hash, movie_name, movie_release_name, movie_year,
movie_imdb_id, series_season, series_episode):
super(OpenSubtitlesSubtitle, self).__init__(language, hearing_impaired)
self.id = id
def __init__(self, language, hearing_impaired, page_link, subtitle_id, matched_by, movie_kind, hash, movie_name,
movie_release_name, movie_year, movie_imdb_id, series_season, series_episode, encoding):
super(OpenSubtitlesSubtitle, self).__init__(language, hearing_impaired, page_link, encoding)
self.subtitle_id = subtitle_id
self.matched_by = matched_by
self.movie_kind = movie_kind
self.hash = hash
@@ -37,6 +36,10 @@ class OpenSubtitlesSubtitle(Subtitle):
self.series_season = series_season
self.series_episode = series_episode
@property
def id(self):
return str(self.subtitle_id)
@property
def series_name(self):
return self.series_re.match(self.movie_name).group('series_name')
@@ -45,12 +48,13 @@ class OpenSubtitlesSubtitle(Subtitle):
def series_title(self):
return self.series_re.match(self.movie_name).group('series_title')
def compute_matches(self, video):
matches = set()
def get_matches(self, video, hearing_impaired=False):
matches = super(OpenSubtitlesSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# episode
if isinstance(video, Episode) and self.movie_kind == 'episode':
# series
if video.series and self.series_name.lower() == video.series.lower():
if video.series and sanitized_string_equal(self.series_name, video.series):
matches.add('series')
# season
if video.season and self.series_season == video.season:
@@ -58,102 +62,201 @@ class OpenSubtitlesSubtitle(Subtitle):
# episode
if video.episode and self.series_episode == video.episode:
matches.add('episode')
# title
if video.title and sanitized_string_equal(self.series_title, video.title):
matches.add('title')
# guess
matches |= compute_guess_matches(video, guessit.guess_episode_info(self.movie_release_name + '.mkv'))
matches |= guess_matches(video, guess_episode_info(self.movie_release_name + '.mkv'))
# movie
elif isinstance(video, Movie) and self.movie_kind == 'movie':
# title
if video.title and sanitized_string_equal(self.movie_name, video.title):
matches.add('title')
# year
if video.year and self.movie_year == video.year:
matches.add('year')
# guess
matches |= compute_guess_matches(video, guessit.guess_movie_info(self.movie_release_name + '.mkv'))
matches |= guess_matches(video, guess_movie_info(self.movie_release_name + '.mkv'))
else:
logger.info('%r is not a valid movie_kind for %r', self.movie_kind, video)
logger.info('%r is not a valid movie_kind', self.movie_kind)
return matches
# hash
if 'opensubtitles' in video.hashes and self.hash == video.hashes['opensubtitles']:
matches.add('hash')
# imdb_id
if video.imdb_id and self.movie_imdb_id == video.imdb_id:
matches.add('imdb_id')
# title
if video.title and self.movie_name.lower() == video.title.lower():
matches.add('title')
return matches
class OpenSubtitlesProvider(Provider):
languages = {babelfish.Language.fromopensubtitles(l) for l in babelfish.CONVERTERS['opensubtitles'].codes}
languages = {Language.fromopensubtitles(l) for l in language_converters['opensubtitles'].codes}
def __init__(self):
self.server = xmlrpclib.ServerProxy('http://api.opensubtitles.org/xml-rpc')
def __init__(self, username=None, password=None):
self.server = ServerProxy('https://api.opensubtitles.org/xml-rpc', TimeoutSafeTransport(10))
if username and not password or not username and password:
raise ConfigurationError('Username and password must be specified')
# None values not allowed for logging in, so replace it by ''
self.username = username or ''
self.password = password or ''
self.token = None
def initialize(self):
try:
response = self.server.LogIn('', '', 'eng', 'subliminal v%s' % __version__)
except xmlrpclib.ProtocolError:
raise ProviderNotAvailable
if response['status'] != '200 OK':
raise ProviderError('Login failed with status %r' % response['status'])
logger.info('Logging in')
response = checked(self.server.LogIn(self.username, self.password, 'eng',
'subliminal v%s' % get_version(__version__)))
self.token = response['token']
logger.debug('Logged in with token %r', self.token)
def terminate(self):
try:
response = self.server.LogOut(self.token)
except xmlrpclib.ProtocolError:
raise ProviderNotAvailable
if response['status'] != '200 OK':
raise ProviderError('Logout failed with status %r' % response['status'])
logger.info('Logging out')
checked(self.server.LogOut(self.token))
self.server.close()
self.token = None
logger.debug('Logged out')
def query(self, languages, hash=None, size=None, imdb_id=None, query=None):
searches = []
def no_operation(self):
logger.debug('No operation')
checked(self.server.NoOperation(self.token))
def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None):
# fill the search criteria
criteria = []
if hash and size:
searches.append({'moviehash': hash, 'moviebytesize': str(size)})
criteria.append({'moviehash': hash, 'moviebytesize': str(size)})
if imdb_id:
searches.append({'imdbid': imdb_id})
if query:
searches.append({'query': query})
if not searches:
raise ValueError('One or more parameter missing')
for search in searches:
search['sublanguageid'] = ','.join(l.opensubtitles for l in languages)
logger.debug('Searching subtitles %r', searches)
try:
response = self.server.SearchSubtitles(self.token, searches)
except xmlrpclib.ProtocolError:
raise ProviderNotAvailable
if response['status'] != '200 OK':
raise ProviderError('Search failed with status %r' % response['status'])
criteria.append({'imdbid': imdb_id})
if query and season and episode:
criteria.append({'query': query.replace('\'', ''), 'season': season, 'episode': episode})
elif query:
criteria.append({'query': query.replace('\'', '')})
if not criteria:
raise ValueError('Not enough information')
# add the language
for criterion in criteria:
criterion['sublanguageid'] = ','.join(sorted(l.opensubtitles for l in languages))
# query the server
logger.info('Searching subtitles %r', criteria)
response = checked(self.server.SearchSubtitles(self.token, criteria))
subtitles = []
# exit if no data
if not response['data']:
logger.debug('No subtitle found')
return []
logger.debug('Found subtitles %r', response['data'])
return [OpenSubtitlesSubtitle(babelfish.Language.fromopensubtitles(r['SubLanguageID']),
bool(int(r['SubHearingImpaired'])), r['IDSubtitleFile'], r['MatchedBy'],
r['MovieKind'], r['MovieHash'], r['MovieName'], r['MovieReleaseName'],
int(r['MovieYear']) if r['MovieYear'] else None, int(r['IDMovieImdb']),
int(r['SeriesSeason']) if r['SeriesSeason'] else None,
int(r['SeriesEpisode']) if r['SeriesEpisode'] else None)
for r in response['data']]
logger.debug('No subtitles found')
return subtitles
# loop over subtitle items
for subtitle_item in response['data']:
# read the item
language = Language.fromopensubtitles(subtitle_item['SubLanguageID'])
hearing_impaired = bool(int(subtitle_item['SubHearingImpaired']))
page_link = subtitle_item['SubtitlesLink']
subtitle_id = int(subtitle_item['IDSubtitleFile'])
matched_by = subtitle_item['MatchedBy']
movie_kind = subtitle_item['MovieKind']
hash = subtitle_item['MovieHash']
movie_name = subtitle_item['MovieName']
movie_release_name = subtitle_item['MovieReleaseName']
movie_year = int(subtitle_item['MovieYear']) if subtitle_item['MovieYear'] else None
movie_imdb_id = int(subtitle_item['IDMovieImdb'])
series_season = int(subtitle_item['SeriesSeason']) if subtitle_item['SeriesSeason'] else None
series_episode = int(subtitle_item['SeriesEpisode']) if subtitle_item['SeriesEpisode'] else None
encoding = subtitle_item.get('SubEncoding') or None
subtitle = OpenSubtitlesSubtitle(language, hearing_impaired, page_link, subtitle_id, matched_by, movie_kind,
hash, movie_name, movie_release_name, movie_year, movie_imdb_id,
series_season, series_episode, encoding)
logger.debug('Found subtitle %r', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
query = None
if ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id:
query = season = episode = None
if isinstance(video, Episode):
query = video.series
season = video.season
episode = video.episode
elif ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id:
query = video.name.split(os.sep)[-1]
return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id, query=query)
return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id,
query=query, season=season, episode=episode)
def download_subtitle(self, subtitle):
try:
response = self.server.DownloadSubtitles(self.token, [subtitle.id])
except xmlrpclib.ProtocolError:
raise ProviderNotAvailable
if response['status'] != '200 OK':
raise ProviderError('Download failed with status %r' % response['status'])
if not response['data']:
raise ProviderError('Nothing to download')
subtitle_bytes = zlib.decompress(base64.b64decode(response['data'][0]['data']), 47)
subtitle_text = subtitle_bytes.decode(charade.detect(subtitle_bytes)['encoding'])
if not is_valid_subtitle(subtitle_text):
raise InvalidSubtitle
return subtitle_text
logger.info('Downloading subtitle %r', subtitle)
response = checked(self.server.DownloadSubtitles(self.token, [str(subtitle.subtitle_id)]))
subtitle.content = fix_line_ending(zlib.decompress(base64.b64decode(response['data'][0]['data']), 47))
class OpenSubtitlesError(ProviderError):
"""Base class for non-generic :class:`OpenSubtitlesProvider` exceptions."""
pass
class Unauthorized(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '401 Unauthorized'."""
pass
class NoSession(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '406 No session'."""
pass
class DownloadLimitReached(OpenSubtitlesError, DownloadLimitExceeded):
"""Exception raised when status is '407 Download limit reached'."""
pass
class InvalidImdbid(OpenSubtitlesError):
"""Exception raised when status is '413 Invalid ImdbID'."""
pass
class UnknownUserAgent(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '414 Unknown User Agent'."""
pass
class DisabledUserAgent(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '415 Disabled user agent'."""
pass
class ServiceUnavailable(OpenSubtitlesError):
"""Exception raised when status is '503 Service Unavailable'."""
pass
def checked(response):
"""Check a response status before returning it.
:param response: a response from a XMLRPC call to OpenSubtitles.
:return: the response.
:raise: :class:`OpenSubtitlesError`
"""
status_code = int(response['status'][:3])
if status_code == 401:
raise Unauthorized
if status_code == 406:
raise NoSession
if status_code == 407:
raise DownloadLimitReached
if status_code == 413:
raise InvalidImdbid
if status_code == 414:
raise UnknownUserAgent
if status_code == 415:
raise DisabledUserAgent
if status_code == 503:
raise ServiceUnavailable
if status_code != 200:
raise OpenSubtitlesError(response['status'])
return response
+173
View File
@@ -0,0 +1,173 @@
# -*- coding: utf-8 -*-
import io
import logging
import re
from babelfish import Language, language_converters
from guessit import guess_episode_info, guess_movie_info
try:
from lxml import etree
except ImportError:
try:
import xml.etree.cElementTree as etree
except ImportError:
import xml.etree.ElementTree as etree
from requests import Session
from zipfile import ZipFile
from . import Provider, get_version
from .. import __version__
from ..exceptions import ProviderError
from ..subtitle import Subtitle, fix_line_ending, guess_matches, sanitized_string_equal
from ..video import Episode, Movie
logger = logging.getLogger(__name__)
class PodnapisiSubtitle(Subtitle):
provider_name = 'podnapisi'
def __init__(self, language, hearing_impaired, page_link, pid, releases, title, season=None, episode=None,
year=None):
super(PodnapisiSubtitle, self).__init__(language, hearing_impaired, page_link)
self.pid = pid
self.releases = releases
self.title = title
self.season = season
self.episode = episode
self.year = year
@property
def id(self):
return self.pid
def get_matches(self, video, hearing_impaired=False):
matches = super(PodnapisiSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# episode
if isinstance(video, Episode):
# series
if video.series and sanitized_string_equal(self.title, video.series):
matches.add('series')
# season
if video.season and self.season == video.season:
matches.add('season')
# episode
if video.episode and self.episode == video.episode:
matches.add('episode')
# guess
for release in self.releases:
matches |= guess_matches(video, guess_episode_info(release + '.mkv'))
# movie
elif isinstance(video, Movie):
# title
if video.title and sanitized_string_equal(self.title, video.title):
matches.add('title')
# guess
for release in self.releases:
matches |= guess_matches(video, guess_movie_info(release + '.mkv'))
# year
if video.year and self.year == video.year:
matches.add('year')
return matches
class PodnapisiProvider(Provider):
languages = ({Language('por', 'BR'), Language('srp', script='Latn')} |
{Language.fromalpha2(l) for l in language_converters['alpha2'].codes})
server_url = 'http://podnapisi.net/subtitles/'
def initialize(self):
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
def terminate(self):
self.session.close()
def query(self, language, keyword, season=None, episode=None, year=None):
# set parameters, see http://www.podnapisi.net/forum/viewtopic.php?f=62&t=26164#p212652
params = {'sXML': 1, 'sL': str(language), 'sK': keyword}
is_episode = False
if season and episode:
is_episode = True
params['sTS'] = season
params['sTE'] = episode
if year:
params['sY'] = year
# loop over paginated results
logger.info('Searching subtitles %r', params)
subtitles = []
pids = set()
while True:
# query the server
xml = etree.fromstring(self.session.get(self.server_url + 'search/old', params=params, timeout=10).content)
# exit if no results
if not int(xml.find('pagination/results').text):
logger.debug('No subtitles found')
break
# loop over subtitles
for subtitle_xml in xml.findall('subtitle'):
# read xml elements
language = Language.fromietf(subtitle_xml.find('language').text)
hearing_impaired = 'n' in (subtitle_xml.find('flags').text or '')
page_link = subtitle_xml.find('url').text
pid = subtitle_xml.find('pid').text
releases = []
if subtitle_xml.find('release').text:
for release in subtitle_xml.find('release').text.split():
release = re.sub(r'\.+$', '', release) # remove trailing dots
release = ''.join(filter(lambda x: ord(x) < 128, release)) # remove non-ascii characters
releases.append(release)
title = subtitle_xml.find('title').text
season = int(subtitle_xml.find('tvSeason').text)
episode = int(subtitle_xml.find('tvEpisode').text)
year = int(subtitle_xml.find('year').text)
if is_episode:
subtitle = PodnapisiSubtitle(language, hearing_impaired, page_link, pid, releases, title,
season=season, episode=episode, year=year)
else:
subtitle = PodnapisiSubtitle(language, hearing_impaired, page_link, pid, releases, title,
year=year)
# ignore duplicates, see http://www.podnapisi.net/forum/viewtopic.php?f=62&t=26164&start=10#p213321
if pid in pids:
continue
logger.debug('Found subtitle %r', subtitle)
subtitles.append(subtitle)
pids.add(pid)
# stop on last page
if int(xml.find('pagination/current').text) >= int(xml.find('pagination/count').text):
break
# increment current page
params['page'] = int(xml.find('pagination/current').text) + 1
logger.debug('Getting page %d', params['page'])
return subtitles
def list_subtitles(self, video, languages):
if isinstance(video, Episode):
return [s for l in languages for s in self.query(l, video.series, season=video.season,
episode=video.episode, year=video.year)]
elif isinstance(video, Movie):
return [s for l in languages for s in self.query(l, video.title, year=video.year)]
def download_subtitle(self, subtitle):
# download as a zip
logger.info('Downloading subtitle %r', subtitle)
r = self.session.get(self.server_url + subtitle.pid + '/download', params={'container': 'zip'}, timeout=10)
r.raise_for_status()
# open the zip
with ZipFile(io.BytesIO(r.content)) as zf:
if len(zf.namelist()) > 1:
raise ProviderError('More than one file to unzip')
subtitle.content = fix_line_ending(zf.read(zf.namelist()[0]))
+228
View File
@@ -0,0 +1,228 @@
# -*- coding: utf-8 -*-
import bisect
import io
import json
import logging
import zipfile
from babelfish import Language
from guessit import guess_episode_info, guess_movie_info
from requests import Session
from . import ParserBeautifulSoup, Provider, get_version
from .. import __version__
from ..cache import SHOW_EXPIRATION_TIME, region
from ..exceptions import AuthenticationError, ConfigurationError, ProviderError
from ..subtitle import Subtitle, fix_line_ending, guess_matches, sanitized_string_equal
from ..video import Episode, Movie
logger = logging.getLogger(__name__)
class SubsCenterSubtitle(Subtitle):
provider_name = 'subscenter'
def __init__(self, language, hearing_impaired, page_link, series, season, episode, title, subtitle_id, subtitle_key,
downloaded, releases):
super(SubsCenterSubtitle, self).__init__(language, hearing_impaired, page_link)
self.series = series
self.season = season
self.episode = episode
self.title = title
self.subtitle_id = subtitle_id
self.subtitle_key = subtitle_key
self.downloaded = downloaded
self.releases = releases
@property
def id(self):
return str(self.subtitle_id)
def get_matches(self, video, hearing_impaired=False):
matches = super(SubsCenterSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# episode
if isinstance(video, Episode):
# series
if video.series and sanitized_string_equal(self.series, video.series):
matches.add('series')
# season
if video.season and self.season == video.season:
matches.add('season')
# episode
if video.episode and self.episode == video.episode:
matches.add('episode')
# guess
for release in self.releases:
matches |= guess_matches(video, guess_episode_info(release + '.mkv'))
# movie
elif isinstance(video, Movie):
# guess
for release in self.releases:
matches |= guess_matches(video, guess_movie_info(release + '.mkv'))
# title
if video.title and sanitized_string_equal(self.title, video.title):
matches.add('title')
return matches
class SubsCenterProvider(Provider):
languages = {Language.fromalpha2(l) for l in ['he']}
server = 'http://subscenter.cinemast.com/he/'
def __init__(self, username=None, password=None):
if username is not None and password is None or username is None and password is not None:
raise ConfigurationError('Username and password must be specified')
self.username = username
self.password = password
self.logged_in = False
def initialize(self):
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
# login
if self.username is not None and self.password is not None:
logger.debug('Logging in')
url = self.server + 'subscenter/accounts/login/'
# retrieve CSRF token
self.session.get(url)
csrf_token = self.session.cookies['csrftoken']
# actual login
data = {'username': self.username, 'password': self.password, 'csrfmiddlewaretoken': csrf_token}
r = self.session.post(url, data, allow_redirects=False, timeout=10)
if r.status_code != 302:
raise AuthenticationError(self.username)
logger.info('Logged in')
self.logged_in = True
def terminate(self):
# logout
if self.logged_in:
logger.info('Logging out')
r = self.session.get(self.server + 'subscenter/accounts/logout/', timeout=10)
r.raise_for_status()
logger.info('Logged out')
self.logged_in = False
self.session.close()
@region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
def _search_url_title(self, title, kind):
"""Search the URL title for the given `title`.
:param str title: title to search for.
:param str kind: kind of the title, ``movie`` or ``series``.
:return: the URL version of the title.
:rtype: str or None
"""
# make the search
logger.info('Searching title name for %r', title)
r = self.session.get(self.server + 'subtitle/search/', params={'q': title}, allow_redirects=False, timeout=10)
r.raise_for_status()
# if redirected, get the url title from the Location header
if r.is_redirect:
parts = r.headers['Location'].split('/')
# check kind
if parts[-3] == kind:
return parts[-2]
return None
# otherwise, get the first valid suggestion
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
suggestions = soup.select('#processes div.generalWindowTop a')
logger.debug('Found %d suggestions', len(suggestions))
for suggestion in suggestions:
parts = suggestion.attrs['href'].split('/')
# check kind
if parts[-3] == kind:
return parts[-2]
def query(self, series=None, season=None, episode=None, title=None):
# set the correct parameters depending on the kind
if series and season and episode:
url_series = self._search_url_title(series, 'series')
url = self.server + 'cinemast/data/series/sb/{}/{}/{}/'.format(url_series, season, episode)
page_link = self.server + 'subtitle/series/{}/{}/{}/'.format(url_series, season, episode)
elif title:
url_title = self._search_url_title(title, 'movie')
url = self.server + 'cinemast/data/movie/sb/{}/'.format(url_title)
page_link = self.server + 'subtitle/movie/{}/'.format(url_title)
else:
raise ValueError('One or more parameters are missing')
# get the list of subtitles
logger.debug('Getting the list of subtitles')
r = self.session.get(url)
r.raise_for_status()
results = json.loads(r.text)
# loop over results
subtitles = {}
for language_code, language_data in results.items():
for quality_data in language_data.values():
for quality, subtitles_data in quality_data.items():
for subtitle_item in subtitles_data.values():
# read the item
language = Language.fromalpha2(language_code)
hearing_impaired = bool(subtitle_item['hearing_impaired'])
subtitle_id = subtitle_item['id']
subtitle_key = subtitle_item['key']
downloaded = subtitle_item['downloaded']
release = subtitle_item['subtitle_version']
# add the release and increment downloaded count if we already have the subtitle
if subtitle_id in subtitles:
logger.debug('Found additional release %r for subtitle %d', release, subtitle_id)
bisect.insort_left(subtitles[subtitle_id].releases, release) # deterministic order
subtitles[subtitle_id].downloaded += downloaded
continue
# otherwise create it
subtitle = SubsCenterSubtitle(language, hearing_impaired, page_link, series, season, episode,
title, subtitle_id, subtitle_key, downloaded, [release])
logger.debug('Found subtitle %r', subtitle)
subtitles[subtitle_id] = subtitle
return subtitles.values()
def list_subtitles(self, video, languages):
series = None
season = None
episode = None
title = video.title
if isinstance(video, Episode):
series = video.series
season = video.season
episode = video.episode
return [s for s in self.query(series, season, episode, title) if s.language in languages]
def download_subtitle(self, subtitle):
# download
url = self.server + 'subtitle/download/{}/{}/'.format(subtitle.language.alpha2, subtitle.subtitle_id)
params = {'v': subtitle.releases[0], 'key': subtitle.subtitle_key}
r = self.session.get(url, params=params, headers={'Referer': subtitle.page_link}, timeout=10)
r.raise_for_status()
# open the zip
with zipfile.ZipFile(io.BytesIO(r.content)) as zf:
# remove some filenames from the namelist
namelist = [n for n in zf.namelist() if not n.endswith('.txt')]
if len(namelist) > 1:
raise ProviderError('More than one file to unzip')
subtitle.content = fix_line_ending(zf.read(namelist[0]))
+41 -43
View File
@@ -1,14 +1,12 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
import babelfish
import charade
import requests
from . import Provider
from babelfish import Language, language_converters
from requests import Session
from . import Provider, get_version
from .. import __version__
from ..exceptions import InvalidSubtitle, ProviderNotAvailable, ProviderError
from ..subtitle import Subtitle, is_valid_subtitle
from ..video import Episode, Movie
from ..subtitle import Subtitle, fix_line_ending
logger = logging.getLogger(__name__)
@@ -21,63 +19,63 @@ class TheSubDBSubtitle(Subtitle):
super(TheSubDBSubtitle, self).__init__(language)
self.hash = hash
def compute_matches(self, video):
matches = set()
@property
def id(self):
return self.hash + '-' + str(self.language)
def get_matches(self, video, hearing_impaired=False):
matches = super(TheSubDBSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# hash
if 'thesubdb' in video.hashes and video.hashes['thesubdb'] == self.hash:
matches.add('hash')
return matches
class TheSubDBProvider(Provider):
languages = {babelfish.Language.fromalpha2(l) for l in ['en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro', 'sv', 'tr']}
video_types = (Episode, Movie)
languages = {Language.fromthesubdb(l) for l in language_converters['thesubdb'].codes}
required_hash = 'thesubdb'
server_url = 'http://api.thesubdb.com/'
def initialize(self):
self.session = requests.Session()
self.session = Session()
self.session.headers = {'User-Agent': 'SubDB/1.0 (subliminal/%s; https://github.com/Diaoul/subliminal)' %
__version__}
get_version(__version__)}
def terminate(self):
self.session.close()
def get(self, params):
"""Make a GET request on the server with the given parameters
:param params: params of the request
:return: the response
:rtype: :class:`requests.Response`
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable`
"""
try:
r = self.session.get('http://api.thesubdb.com', params=params, timeout=10)
except requests.Timeout:
raise ProviderNotAvailable('Timeout after 10 seconds')
return r
def query(self, hash):
# make the query
params = {'action': 'search', 'hash': hash}
logger.debug('Searching subtitles %r', params)
r = self.get(params)
logger.info('Searching subtitles %r', params)
r = self.session.get(self.server_url, params=params, timeout=10)
# handle subtitles not found and errors
if r.status_code == 404:
logger.debug('No subtitle found')
logger.debug('No subtitles found')
return []
elif r.status_code != 200:
raise ProviderError('Request failed with status code %d' % r.status_code)
return [TheSubDBSubtitle(language, hash) for language in
{babelfish.Language.fromalpha2(l) for l in r.content.split(',')}]
r.raise_for_status()
# loop over languages
subtitles = []
for language_code in r.text.split(','):
language = Language.fromthesubdb(language_code)
subtitle = TheSubDBSubtitle(language, hash)
logger.debug('Found subtitle %r', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
return [s for s in self.query(video.hashes['thesubdb']) if s.language in languages]
def download_subtitle(self, subtitle):
logger.info('Downloading subtitle %r', subtitle)
params = {'action': 'download', 'hash': subtitle.hash, 'language': subtitle.language.alpha2}
r = self.get(params)
if r.status_code != 200:
raise ProviderError('Request failed with status code %d' % r.status_code)
subtitle_text = r.content.decode(charade.detect(r.content)['encoding'])
if not is_valid_subtitle(subtitle_text):
raise InvalidSubtitle
return subtitle_text
r = self.session.get(self.server_url, params=params, timeout=10)
r.raise_for_status()
subtitle.content = fix_line_ending(r.content)
+136 -101
View File
@@ -1,40 +1,47 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import io
import logging
import re
import zipfile
import babelfish
import bs4
import charade
import requests
from . import Provider
from zipfile import ZipFile
from babelfish import Language
from requests import Session
from . import ParserBeautifulSoup, Provider, get_version
from .. import __version__
from ..cache import region
from ..exceptions import InvalidSubtitle, ProviderNotAvailable, ProviderError
from ..subtitle import Subtitle, is_valid_subtitle
from ..cache import EPISODE_EXPIRATION_TIME, SHOW_EXPIRATION_TIME, region
from ..exceptions import ProviderError
from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_properties, sanitized_string_equal
from ..video import Episode
logger = logging.getLogger(__name__)
link_re = re.compile('^(?P<series>.+?)(?: \(?\d{4}\)?| \((?:US|UK)\))? \((?P<first_year>\d{4})-\d{4}\)$')
episode_id_re = re.compile('^episode-\d+\.html$')
class TVsubtitlesSubtitle(Subtitle):
provider_name = 'tvsubtitles'
def __init__(self, language, series, season, episode, id, rip, release):
super(TVsubtitlesSubtitle, self).__init__(language)
def __init__(self, language, page_link, subtitle_id, series, season, episode, year, rip, release):
super(TVsubtitlesSubtitle, self).__init__(language, page_link=page_link)
self.subtitle_id = subtitle_id
self.series = series
self.season = season
self.episode = episode
self.id = id
self.year = year
self.rip = rip
self.release = release
def compute_matches(self, video):
matches = set()
@property
def id(self):
return str(self.subtitle_id)
def get_matches(self, video, hearing_impaired=False):
matches = super(TVsubtitlesSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# series
if video.series and self.series == video.series:
if video.series and sanitized_string_equal(self.series, video.series):
matches.add('series')
# season
if video.season and self.season == video.season:
@@ -42,125 +49,153 @@ class TVsubtitlesSubtitle(Subtitle):
# episode
if video.episode and self.episode == video.episode:
matches.add('episode')
# year
if self.year == video.year:
matches.add('year')
# release_group
if video.release_group and self.release and video.release_group.lower() in self.release.lower():
matches.add('release_group')
# video_codec
if video.video_codec and self.release and (video.video_codec in self.release.lower()
or video.video_codec == 'h264' and 'x264' in self.release.lower()):
matches.add('video_codec')
# resolution
if video.resolution and self.rip and video.resolution in self.rip.lower():
matches.add('resolution')
# other properties
if self.release:
matches |= guess_matches(video, guess_properties(self.release), partial=True)
if self.rip:
matches |= guess_matches(video, guess_properties(self.rip), partial=True)
return matches
class TVsubtitlesProvider(Provider):
languages = {babelfish.Language('por', 'BR')} | {babelfish.Language(l)
for l in ['ara', 'bul', 'ces', 'dan', 'deu', 'ell', 'eng', 'fin', 'fra', 'hun', 'ita', 'jpn', 'kor',
'nld', 'pol', 'por', 'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho']}
videos = (Episode,)
server = 'http://www.tvsubtitles.net'
episode_id_re = re.compile('^episode-(\d+)\.html$')
subtitle_re = re.compile('^\/subtitle-(\d+)\.html$')
languages = {Language('por', 'BR')} | {Language(l) for l in [
'ara', 'bul', 'ces', 'dan', 'deu', 'ell', 'eng', 'fin', 'fra', 'hun', 'ita', 'jpn', 'kor', 'nld', 'pol', 'por',
'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho'
]}
video_types = (Episode,)
server_url = 'http://www.tvsubtitles.net/'
def initialize(self):
self.session = requests.Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % __version__}
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
def terminate(self):
self.session.close()
def request(self, url, params=None, data=None, method='GET'):
"""Make a `method` request on `url` with the given parameters
@region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
def search_show_id(self, series, year=None):
"""Search the show id from the `series` and `year`.
:param string url: part of the URL to reach with the leading slash
:param dict params: params of the request
:param dict data: data of the request
:return: the response
:rtype: :class:`bs4.BeautifulSoup`
:raise: :class:`~subliminal.exceptions.ProviderNotAvailable`
"""
try:
r = self.session.request(method, self.server + url, params=params, data=data, timeout=10)
except requests.Timeout:
raise ProviderNotAvailable('Timeout after 10 seconds')
if r.status_code != 200:
raise ProviderNotAvailable('Request failed with status code %d' % r.status_code)
return bs4.BeautifulSoup(r.content, ['permissive'])
@region.cache_on_arguments()
def find_show_id(self, series):
"""Find a show id from the series
:param string series: series of the episode
:return: the show id, if any
:param str series: series of the episode.
:param year: year of the series, if any.
:type year: int or None
:return: the show id, if any.
:rtype: int or None
"""
data = {'q': series}
logger.debug('Searching series %r', data)
soup = self.request('/search.php', data=data, method='POST')
links = soup.select('div.left li div a[href^="/tvshow-"]')
if not links:
logger.info('Series %r not found', series)
return None
return int(links[0]['href'][8:-5])
# make the search
logger.info('Searching show id for %r', series)
r = self.session.post(self.server_url + 'search.php', data={'q': series}, timeout=10)
r.raise_for_status()
@region.cache_on_arguments()
def find_episode_ids(self, show_id, season):
"""Find episode ids from the show id and the season
# get the series out of the suggestions
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
show_id = None
for suggestion in soup.select('div.left li div a[href^="/tvshow-"]'):
match = link_re.match(suggestion.text)
if not match:
logger.error('Failed to match %s', suggestion.text)
continue
:param int show_id: show id
:param int season: season of the episode
:return: episode ids per episode number
if match.group('series').lower() == series.lower():
if year is not None and int(match.group('first_year')) != year:
logger.debug('Year does not match')
continue
show_id = int(suggestion['href'][8:-5])
logger.debug('Found show id %d', show_id)
break
return show_id
@region.cache_on_arguments(expiration_time=EPISODE_EXPIRATION_TIME)
def get_episode_ids(self, show_id, season):
"""Get episode ids from the show id and the season.
:param int show_id: show id.
:param int season: season of the episode.
:return: episode ids per episode number.
:rtype: dict
"""
params = {'show_id': show_id, 'season': season}
logger.debug('Searching episodes %r', params)
soup = self.request('/tvshow-{show_id}-{season}.html'.format(**params))
# get the page of the season of the show
logger.info('Getting the page of show id %d, season %d', show_id, season)
r = self.session.get(self.server_url + 'tvshow-%d-%d.html' % (show_id, season), timeout=10)
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# loop over episode rows
episode_ids = {}
for row in soup.select('table#table5 tr'):
if not row('a', href=self.episode_id_re):
# skip rows that do not have a link to the episode page
if not row('a', href=episode_id_re):
continue
# extract data from the cells
cells = row('td')
episode_ids[int(cells[0].string.split('x')[1])] = int(cells[1].a['href'][8:-5])
episode = int(cells[0].text.split('x')[1])
episode_id = int(cells[1].a['href'][8:-5])
episode_ids[episode] = episode_id
if episode_ids:
logger.debug('Found episode ids %r', episode_ids)
else:
logger.warning('No episode ids found')
return episode_ids
def query(self, series, season, episode):
show_id = self.find_show_id(series.lower())
def query(self, series, season, episode, year=None):
# search the show id
show_id = self.search_show_id(series, year)
if show_id is None:
logger.error('No show id found for %r (%r)', series, {'year': year})
return []
episode_ids = self.find_episode_ids(show_id, season)
# get the episode ids
episode_ids = self.get_episode_ids(show_id, season)
if episode not in episode_ids:
logger.info('Episode %d not found', episode)
logger.error('Episode %d not found', episode)
return []
params = {'episode_id': episode_ids[episode]}
logger.debug('Searching episode %r', params)
soup = self.request('/episode-{episode_id}.html'.format(**params))
return [TVsubtitlesSubtitle(babelfish.Language.fromtvsubtitles(row.h5.img['src'][13:-4]), series, season,
episode, row['href'][10:-5], row.find('p', title='rip').text.strip() or None,
row.find('p', title='release').text.strip() or None)
for row in soup('a', href=self.subtitle_re)]
# get the episode page
logger.info('Getting the page for episode %d', episode_ids[episode])
r = self.session.get(self.server_url + 'episode-%d.html' % episode_ids[episode], timeout=10)
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# loop over subtitles rows
subtitles = []
for row in soup.select('.subtitlen'):
# read the item
language = Language.fromtvsubtitles(row.h5.img['src'][13:-4])
subtitle_id = int(row.parent['href'][10:-5])
page_link = self.server_url + 'subtitle-%d.html' % subtitle_id
rip = row.find('p', title='rip').text.strip() or None
release = row.find('p', title='release').text.strip() or None
subtitle = TVsubtitlesSubtitle(language, page_link, subtitle_id, series, season, episode, year, rip,
release)
logger.debug('Found subtitle %s', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
return [s for s in self.query(video.series, video.season, video.episode) if s.language in languages]
return [s for s in self.query(video.series, video.season, video.episode, video.year) if s.language in languages]
def download_subtitle(self, subtitle):
try:
r = self.session.get(self.server + '/download-{subtitle_id}.html'.format(subtitle_id=subtitle.id),
timeout=10)
except requests.Timeout:
raise ProviderNotAvailable('Timeout after 10 seconds')
if r.status_code != 200:
raise ProviderNotAvailable('Request failed with status code %d' % r.status_code)
with zipfile.ZipFile(io.BytesIO(r.content)) as zf:
# download as a zip
logger.info('Downloading subtitle %r', subtitle)
r = self.session.get(self.server_url + 'download-%d.html' % subtitle.subtitle_id, timeout=10)
r.raise_for_status()
# open the zip
with ZipFile(io.BytesIO(r.content)) as zf:
if len(zf.namelist()) > 1:
raise ProviderError('More than one file to unzip')
subtitle_bytes = zf.read(zf.namelist()[0])
subtitle_text = subtitle_bytes.decode(charade.detect(subtitle_bytes)['encoding'])
if not is_valid_subtitle(subtitle_text):
raise InvalidSubtitle
return subtitle_text
subtitle.content = fix_line_ending(zf.read(zf.namelist()[0]))
+101 -60
View File
@@ -1,84 +1,125 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
from sympy import Eq, symbols, solve
"""
This module is responsible for calculating the :attr:`~subliminal.video.Video.scores` dicts
(:attr:`Episode.scores <subliminal.video.Episode.scores>` and :attr:`Movie.scores <subliminal.video.Movie.scores>`)
by assigning a score to a match.
.. note::
To avoid unnecessary dependency on `sympy <http://www.sympy.org/>`_ and boost subliminal's import time, the
resulting scores are hardcoded in their respective classes and manually updated when the set of equations change.
Available matches:
* hearing_impaired
* format
* release_group
* resolution
* video_codec
* audio_codec
* imdb_id
* hash
* title
* year
* series
* season
* episode
* tvdb_id
The :meth:`Subtitle.get_matches <subliminal.subtitle.Subtitle.get_matches>` method get the matches between the
:class:`~subliminal.subtitle.Subtitle` and the :class:`~subliminal.video.Video` and
:func:`~subliminal.subtitle.compute_score` computes the score.
"""
from __future__ import print_function
from sympy import Eq, solve, symbols
# Symbols
release_group, resolution, video_codec, audio_codec = symbols('release_group resolution video_codec audio_codec')
imdb_id, hash, title, series, tvdb_id, season, episode = symbols('imdb_id hash title series tvdb_id season episode')
year = symbols('year')
hearing_impaired, format, release_group, resolution = symbols('hearing_impaired format release_group resolution')
video_codec, audio_codec, imdb_id, hash, title, year = symbols('video_codec audio_codec imdb_id hash title year')
series, season, episode, tvdb_id = symbols('series season episode tvdb_id')
def get_episode_equations():
"""Get the score equations for a :class:`~subliminal.video.Episode`
def solve_episode_equations():
"""Solve the score equations for an :class:`~subliminal.video.Episode`.
The equations are the following:
1. hash = resolution + video_codec + audio_codec + series + season + episode + release_group
2. series = resolution + video_codec + audio_codec + season + episode + 1
3. tvdb_id = series
4. season = resolution + video_codec + audio_codec + 1
5. imdb_id = series + season + episode
6. resolution = video_codec
7. video_codec = 2 * audio_codec
8. title = season + episode
9. season = episode
10. release_group = season
11. audio_codec = 1
1. hash = resolution + format + video_codec + audio_codec + series + season + episode + year + release_group
2. series = resolution + video_codec + audio_codec + season + episode + release_group + 1
3. year = series
4. tvdb_id = series + year
5. season = resolution + video_codec + audio_codec + 1
6. imdb_id = series + season + episode + year
7. format = video_codec + audio_codec
8. resolution = video_codec
9. video_codec = 2 * audio_codec
10. title = season + episode
11. season = episode
12. release_group = season
13. audio_codec = 2 * hearing_impaired
14. hearing_impaired = 1
:return: the score equations for an episode
:rtype: list of :class:`sympy.Eq`
:return: the result of the equations.
:rtype: dict
"""
equations = []
equations.append(Eq(hash, resolution + video_codec + audio_codec + series + season + episode + release_group))
equations.append(Eq(series, resolution + video_codec + audio_codec + season + episode + release_group))
equations.append(Eq(tvdb_id, series))
equations.append(Eq(season, resolution + video_codec + audio_codec + 1))
equations.append(Eq(imdb_id, series + season + episode))
equations.append(Eq(resolution, video_codec))
equations.append(Eq(video_codec, 2 * audio_codec))
equations.append(Eq(title, season + episode))
equations.append(Eq(season, episode))
equations.append(Eq(release_group, season))
equations.append(Eq(audio_codec, 1))
return equations
equations = [
Eq(hash, resolution + format + video_codec + audio_codec + series + season + episode + year + release_group),
Eq(series, resolution + video_codec + audio_codec + season + episode + release_group + 1),
Eq(year, series),
Eq(tvdb_id, series + year),
Eq(season, resolution + video_codec + audio_codec + 1),
Eq(imdb_id, series + season + episode + year),
Eq(format, video_codec + audio_codec),
Eq(resolution, video_codec),
Eq(video_codec, 2 * audio_codec),
Eq(title, season + episode),
Eq(season, episode),
Eq(release_group, season),
Eq(audio_codec, 2 * hearing_impaired),
Eq(hearing_impaired, 1)
]
return solve(equations, [hearing_impaired, format, release_group, resolution, video_codec, audio_codec, imdb_id,
hash, series, season, episode, title, year, tvdb_id])
def get_movie_equations():
"""Get the score equations for a :class:`~subliminal.video.Movie`
def solve_movie_equations():
"""Solve the score equations for a :class:`~subliminal.video.Movie`.
The equations are the following:
1. hash = resolution + video_codec + audio_codec + title + year + release_group
1. hash = resolution + format + video_codec + audio_codec + title + year + release_group
2. imdb_id = hash
3. resolution = video_codec
4. video_codec = 2 * audio_codec
5. title = resolution + video_codec + audio_codec + year + 1
6. release_group = resolution + video_codec + audio_codec + 1
7. year = release_group + 1
8. audio_codec = 1
5. format = video_codec + audio_codec
6. title = resolution + video_codec + audio_codec + year + 1
7. release_group = resolution + video_codec + audio_codec + 1
8. year = release_group + 1
9. audio_codec = 2 * hearing_impaired
10. hearing_impaired = 1
:return: the score equations for a movie
:rtype: list of :class:`sympy.Eq`
:return: the result of the equations.
:rtype: dict
"""
equations = []
equations.append(Eq(hash, resolution + video_codec + audio_codec + title + year + release_group))
equations.append(Eq(imdb_id, hash))
equations.append(Eq(resolution, video_codec))
equations.append(Eq(video_codec, 2 * audio_codec))
equations.append(Eq(title, resolution + video_codec + audio_codec + year + 1))
equations.append(Eq(video_codec, 2 * audio_codec))
equations.append(Eq(release_group, resolution + video_codec + audio_codec + 1))
equations.append(Eq(year, release_group + 1))
equations.append(Eq(audio_codec, 1))
return equations
equations = [
Eq(hash, resolution + format + video_codec + audio_codec + title + year + release_group),
Eq(imdb_id, hash),
Eq(resolution, video_codec),
Eq(video_codec, 2 * audio_codec),
Eq(format, video_codec + audio_codec),
Eq(title, resolution + video_codec + audio_codec + year + 1),
Eq(release_group, resolution + video_codec + audio_codec + 1),
Eq(year, release_group + 1),
Eq(audio_codec, 2 * hearing_impaired),
Eq(hearing_impaired, 1)
]
if __name__ == '__main__':
print(solve(get_episode_equations(), [release_group, resolution, video_codec, audio_codec, imdb_id,
hash, series, tvdb_id, season, episode, title]))
print(solve(get_movie_equations(), [release_group, resolution, video_codec, audio_codec, imdb_id,
hash, title, year]))
return solve(equations, [hearing_impaired, format, release_group, resolution, video_codec, audio_codec, imdb_id,
hash, title, year])
+281 -93
View File
@@ -1,153 +1,341 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
import os.path
import babelfish
import pysrt
from .video import Episode, Movie
import os
import re
import chardet
from guessit.matchtree import MatchTree
from guessit.plugins.transformers import get_transformer
from codecs import lookup
import pysrt
from .video import Episode, Movie
logger = logging.getLogger(__name__)
class Subtitle(object):
"""Base class for subtitle
"""Base class for subtitle.
:param language: language of the subtitle
:type language: :class:`babelfish.Language`
:param bool hearing_impaired: `True` if the subtitle is hearing impaired, `False` otherwise
:param language: language of the subtitle.
:type language: :class:`~babelfish.language.Language`
:param bool hearing_impaired: whether or not the subtitle is hearing impaired.
:param page_link: URL of the web page from which the subtitle can be downloaded.
:type page_link: str
:param encoding: Text encoding of the subtitle
:type encoding: str
"""
def __init__(self, language, hearing_impaired=False):
#: Name of the provider that returns that class of subtitle
provider_name = ''
def __init__(self, language, hearing_impaired=False, page_link=None, encoding=None):
#: Language of the subtitle
self.language = language
#: Whether or not the subtitle is hearing impaired
self.hearing_impaired = hearing_impaired
def compute_matches(self, video):
"""Compute the matches of the subtitle against the `video`
#: URL of the web page from which the subtitle can be downloaded
self.page_link = page_link
:param video: the video to compute the matches against
#: Content as bytes
self.content = None
#: Encoding to decode with when accessing :attr:`text`
if encoding:
try:
# set encoding to canonical codec name
self.encoding = lookup(encoding).name
except (TypeError, LookupError):
logger.debug('Unsupported encoding "%s", setting to None', encoding)
self.encoding = None
else:
self.encoding = None
@property
def id(self):
"""Unique identifier of the subtitle."""
raise NotImplementedError
@property
def text(self):
"""Content as string.
If :attr:`encoding` is None, the encoding is guessed with :meth:`guess_encoding`
"""
if not self.content:
return
try:
return self.content.decode(self.encoding, errors='replace')
except (TypeError, LookupError):
# Failback to guess_encoding if empty or unknown encoding provided
return self.content.decode(self.guess_encoding(), errors='replace')
def is_valid(self):
"""Check if a :attr:`text` is a valid SubRip format.
:return: whether or not the subtitle is valid.
:rtype: bool
"""
if not self.text:
return False
try:
pysrt.from_string(self.text, error_handling=pysrt.ERROR_RAISE)
except pysrt.Error as e:
if e.args[0] < 80:
return False
return True
def guess_encoding(self):
"""Guess encoding using the language, falling back on chardet.
:return: the guessed encoding.
:rtype: str
"""
logger.info('Guessing encoding for language %s', self.language)
# always try utf-8 first
encodings = ['utf-8']
# add language-specific encodings
if self.language.alpha3 == 'zho':
encodings.extend(['gb18030', 'big5'])
elif self.language.alpha3 == 'jpn':
encodings.append('shift-jis')
elif self.language.alpha3 == 'ara':
encodings.append('windows-1256')
elif self.language.alpha3 == 'heb':
encodings.append('windows-1255')
elif self.language.alpha3 == 'tur':
encodings.extend(['iso-8859-9', 'windows-1254'])
elif self.language.alpha3 == 'pol':
# Eastern European Group 1
encodings.extend(['windows-1250'])
elif self.language.alpha3 == 'bul':
# Eastern European Group 2
encodings.extend(['windows-1251'])
else:
# Western European (windows-1252)
encodings.append('latin-1')
# try to decode
logger.debug('Trying encodings %r', encodings)
for encoding in encodings:
try:
self.content.decode(encoding)
except UnicodeDecodeError:
pass
else:
logger.info('Guessed encoding %s', encoding)
return encoding
logger.warning('Could not guess encoding from language')
# fallback on chardet
encoding = chardet.detect(self.content)['encoding']
logger.info('Chardet found encoding %s', encoding)
return encoding
def get_matches(self, video, hearing_impaired=False):
"""Get the matches against the `video`.
:param video: the video to get the matches with.
:type video: :class:`~subliminal.video.Video`
:return: matches of the subtitle
:param bool hearing_impaired: hearing impaired preference.
:return: matches of the subtitle.
:rtype: set
"""
raise NotImplementedError
matches = set()
def compute_score(self, video):
"""Compute the score of the subtitle against the `video`
# hearing_impaired
if self.hearing_impaired == hearing_impaired:
matches.add('hearing_impaired')
There are equivalent matches so that a provider can match one element or its equivalent. This is
to give all provider a chance to have a score in the same range without hurting quality.
return matches
* Matching :class:`~subliminal.video.Video`'s `hashes` is equivalent to matching everything else
* Matching :class:`~subliminal.video.Episode`'s `season` and `episode`
is equivalent to matching :class:`~subliminal.video.Episode`'s `title`
* Matching :class:`~subliminal.video.Episode`'s `tvdb_id` is equivalent to matching
:class:`~subliminal.video.Episode`'s `series`
:param video: the video to compute the score against
:type video: :class:`~subliminal.video.Video`
:return: score of the subtitle
:rtype: int
"""
score = 0
# compute matches
initial_matches = self.compute_matches(video)
matches = initial_matches.copy()
# hash is the perfect match
if 'hash' in matches:
score = video.scores['hash']
else:
# remove equivalences
if isinstance(video, Episode):
if 'imdb_id' in matches:
matches -= {'series', 'tvdb_id', 'season', 'episode', 'title'}
if 'tvdb_id' in matches:
matches -= {'series'}
if 'title' in matches:
matches -= {'season', 'episode'}
# add other scores
score += sum((video.scores[match] for match in matches))
logger.info('Computed score %d with matches %r', score, initial_matches)
return score
def __hash__(self):
return hash(self.provider_name + '-' + self.id)
def __repr__(self):
return '<%s [%r]>' % (self.__class__.__name__, self.language)
return '<%s %r [%s]>' % (self.__class__.__name__, self.id, self.language)
def get_subtitle_path(video_path, language=None):
"""Create the subtitle path from the given `video_path` and `language`
def compute_score(matches, video, scores=None):
"""Compute the score of the `matches` against the `video`.
:param string video_path: path to the video
:param language: language of the subtitle to put in the path
:type language: :class:`babelfish.Language` or None
:return: path of the subtitle
:rtype: string
Some matches count as much as a combination of others in order to level the final score:
* `hash` removes everything else
* For :class:`~subliminal.video.Episode`
* `imdb_id` removes `series`, `tvdb_id`, `season`, `episode`, `title` and `year`
* `tvdb_id` removes `series` and `year`
* `title` removes `season` and `episode`
:param video: the video to get the score with.
:type video: :class:`~subliminal.video.Video`
:param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are used.
:return: score of the subtitle.
:rtype: int
"""
subtitle_path = os.path.splitext(video_path)[0]
if language is not None:
try:
return subtitle_path + '.%s.%s' % (language.alpha2, 'srt')
except babelfish.NoConversionError:
return subtitle_path + '.%s.%s' % (language.alpha3, 'srt')
return subtitle_path + '.srt'
final_matches = matches.copy()
scores = scores or video.scores
logger.info('Computing score for matches %r and %r', matches, video)
# remove equivalent match combinations
if 'hash' in final_matches:
final_matches &= {'hash', 'hearing_impaired'}
elif isinstance(video, Episode):
if 'imdb_id' in final_matches:
final_matches -= {'series', 'tvdb_id', 'season', 'episode', 'title', 'year'}
if 'tvdb_id' in final_matches:
final_matches -= {'series', 'year'}
if 'title' in final_matches:
final_matches -= {'season', 'episode'}
# compute score
logger.debug('Final matches: %r', final_matches)
score = sum((scores[match] for match in final_matches))
logger.info('Computed score %d', score)
# ensure score is capped by the best possible score (hash + preferences)
assert score <= scores['hash'] + scores['hearing_impaired']
return score
def is_valid_subtitle(subtitle_text):
"""Check if a subtitle text is a valid SubRip format
def get_subtitle_path(video_path, language=None, extension='.srt'):
"""Get the subtitle path using the `video_path` and `language`.
:return: `True` if the subtitle is valid, `False` otherwise
:param str video_path: path to the video.
:param language: language of the subtitle to put in the path.
:type language: :class:`~babelfish.language.Language`
:param str extension: extension of the subtitle.
:return: path of the subtitle.
:rtype: str
"""
subtitle_root = os.path.splitext(video_path)[0]
if language:
subtitle_root += '.' + str(language)
return subtitle_root + extension
def sanitize_string(string, replacement=''):
"""Replace any special characters from a string.
:param str string: the string to sanitize.
:param str replacement: the replacement for special characters.
:return: the sanitized string.
:rtype: str
"""
return re.sub('[^ a-zA-Z0-9]', replacement, string)
def sanitized_string_equal(string1, string2):
"""Test two strings for equality case insensitively and ignoring special characters.
:param str string1: the first string to compare.
:param str string2: the second string to compare.
:return: `True` if the two strings are equal, `False` otherwise.
:rtype: bool
"""
try:
pysrt.from_string(subtitle_text, error_handling=pysrt.ERROR_RAISE)
return True
except pysrt.Error:
return False
return string1 and string2 and sanitize_string(string1).lower() == sanitize_string(string2).lower()
def compute_guess_matches(video, guess):
"""Compute matches between a `video` and a `guess`
def guess_matches(video, guess, partial=False):
"""Get matches between a `video` and a `guess`.
:param video: the video to compute the matches on
If a guess is `partial`, the absence information won't be counted as a match.
:param video: the video.
:type video: :class:`~subliminal.video.Video`
:param guess: the guess to compute the matches on
:type guess: :class:`guessit.Guess`
:return: matches of the `guess`
:param guess: the guess.
:type guess: dict
:param bool partial: whether or not the guess is partial.
:return: matches between the `video` and the `guess`.
:rtype: set
"""
matches = set()
if isinstance(video, Episode):
# Series
if video.series and 'series' in guess and guess['series'].lower() == video.series.lower():
# series
if video.series and 'series' in guess and sanitized_string_equal(guess['series'], video.series):
matches.add('series')
# Season
if video.season and 'seasonNumber' in guess and guess['seasonNumber'] == video.season:
# season
if video.season and 'season' in guess and guess['season'] == video.season:
matches.add('season')
# Episode
# episode
if video.episode and 'episodeNumber' in guess and guess['episodeNumber'] == video.episode:
matches.add('episode')
elif isinstance(video, Movie):
# Year
# year
if video.year and 'year' in guess and guess['year'] == video.year:
matches.add('year')
# Title
if video.title and 'title' in guess and guess['title'].lower() == video.title.lower():
# count "no year" as an information
if not partial and video.year is None and 'year' not in guess:
matches.add('year')
elif isinstance(video, Movie):
# year
if video.year and 'year' in guess and guess['year'] == video.year:
matches.add('year')
# title
if video.title and 'title' in guess and sanitized_string_equal(guess['title'], video.title):
matches.add('title')
# Release group
# release_group
if video.release_group and 'releaseGroup' in guess and guess['releaseGroup'].lower() == video.release_group.lower():
matches.add('release_group')
# Screen size
# resolution
if video.resolution and 'screenSize' in guess and guess['screenSize'] == video.resolution:
matches.add('resolution')
# Video codec
# format
if video.format and 'format' in guess and guess['format'].lower() == video.format.lower():
matches.add('format')
# video_codec
if video.video_codec and 'videoCodec' in guess and guess['videoCodec'] == video.video_codec:
matches.add('video_codec')
# Audio codec
# audio_codec
if video.audio_codec and 'audioCodec' in guess and guess['audioCodec'] == video.audio_codec:
matches.add('audio_codec')
return matches
def guess_properties(string):
"""Extract properties from `string` using guessit's `guess_properties` transformer.
:param str string: the string potentially containing properties.
:return: the guessed properties.
:rtype: dict
"""
mtree = MatchTree(string)
get_transformer('guess_properties').process(mtree)
return mtree.matched()
def fix_line_ending(content):
"""Fix line ending of `content` by changing it to \n.
:param bytes content: content of the subtitle.
:return: the content with fixed line endings.
:rtype: bytes
"""
return content.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
-14
View File
@@ -1,14 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from unittest import TextTestRunner, TestSuite
from subliminal import cache_region
from . import test_providers, test_subliminal
cache_region.configure('dogpile.cache.memory', expiration_time=60 * 30)
suite = TestSuite([test_providers.suite(), test_subliminal.suite()])
if __name__ == '__main__':
TextTestRunner().run(suite)
-19
View File
@@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from subliminal import Movie, Episode
MOVIES = [Movie('Man of Steel (2013)/man.of.steel.2013.720p.bluray.x264-felony.mkv', 'Man of Steel',
release_group='felony', resolution='720p', video_codec='h264', audio_codec='DTS', imdb_id=770828,
size=7033732714, year=2013,
hashes={'opensubtitles': '5b8f8f4e41ccb21e', 'thesubdb': 'ad32876133355929d814457537e12dc2'})]
EPISODES = [Episode('The Big Bang Theory/Season 07/The.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.mkv',
'The Big Bang Theory', 7, 5, release_group='DIMENSION', resolution='720p', video_codec='h264',
audio_codec='AC3', imdb_id=3229392, size=501910737, title='The Workplace Proximity',
tvdb_id=80379,
hashes={'opensubtitles': '6878b3ef7c1bd19e', 'thesubdb': '9dbbfb7ba81c9a6237237dae8589fccc'}),
Episode('Game of Thrones/Season 03/Game.of.Thrones.S03E10.Mhysa.720p.WEB-DL.DD5.1.H.264-NTb.mkv',
'Game of Thrones', 3, 10, release_group='NTb', resolution='720p', video_codec='h264',
audio_codec='AC3', imdb_id=2178796, size=2142810931, title='Mhysa', tvdb_id=121361,
hashes={'opensubtitles': 'b850baa096976c22', 'thesubdb': 'b1f899c77f4c960b84b8dbf840d4e42d'})]
-377
View File
@@ -1,377 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
from unittest import TestCase, TestSuite, TestLoader, TextTestRunner
from babelfish import Language
from pkg_resources import iter_entry_points
from subliminal import PROVIDERS_ENTRY_POINT
from subliminal.subtitle import is_valid_subtitle
from subliminal.tests.common import MOVIES, EPISODES
class ProviderTestCase(TestCase):
provider_name = ''
def setUp(self):
for provider_entry_point in iter_entry_points(PROVIDERS_ENTRY_POINT, self.provider_name):
self.Provider = provider_entry_point.load()
break
class Addic7edProviderTestCase(ProviderTestCase):
provider_name = 'addic7ed'
def test_find_show_id(self):
with self.Provider() as provider:
show_id = provider.find_show_id('The Big Bang')
self.assertTrue(show_id == 126)
def test_find_show_id_error(self):
with self.Provider() as provider:
show_id = provider.find_show_id('the big how i met your mother')
self.assertTrue(show_id is None)
def test_get_show_ids(self):
with self.Provider() as provider:
show_ids = provider.get_show_ids()
self.assertTrue('the big bang theory' in show_ids and show_ids['the big bang theory'] == 126)
def test_query_episode_0(self):
video = EPISODES[0]
languages = {Language('tur'), Language('rus'), Language('heb'), Language('ita'), Language('fra'),
Language('ron'), Language('nld'), Language('eng'), Language('deu'), Language('ell'),
Language('por', 'BR'), Language('bul')}
matches = {frozenset(['episode', 'release_group', 'title', 'series', 'resolution', 'season']),
frozenset(['series', 'resolution', 'season']),
frozenset(['series', 'episode', 'season', 'title']),
frozenset(['series', 'release_group', 'season']),
frozenset(['series', 'episode', 'season', 'release_group', 'title']),
frozenset(['series', 'season'])}
with self.Provider() as provider:
subtitles = provider.query(video.series, video.season)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_episode_1(self):
video = EPISODES[1]
languages = {Language('ind'), Language('spa'), Language('hrv'), Language('ita'), Language('fra'),
Language('cat'), Language('ell'), Language('nld'), Language('eng'), Language('fas'),
Language('por'), Language('nor'), Language('deu'), Language('ron'), Language('por', 'BR'),
Language('bul')}
matches = {frozenset(['series', 'episode', 'resolution', 'season', 'title']),
frozenset(['series', 'resolution', 'season']),
frozenset(['series', 'episode', 'season', 'title']),
frozenset(['series', 'release_group', 'season']),
frozenset(['series', 'resolution', 'release_group', 'season']),
frozenset(['series', 'episode', 'season', 'release_group', 'title']),
frozenset(['series', 'season'])}
with self.Provider() as provider:
subtitles = provider.query(video.series, video.season)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_list_subtitles(self):
video = EPISODES[0]
languages = {Language('eng'), Language('fra')}
matches = {frozenset(['series', 'episode', 'season', 'release_group', 'title']),
frozenset(['series', 'episode', 'season', 'title'])}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_download_subtitle(self):
video = EPISODES[0]
languages = {Language('eng'), Language('fra')}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
subtitle_text = provider.download_subtitle(subtitles[0])
self.assertTrue(is_valid_subtitle(subtitle_text))
class BierDopjeProviderTestCase(ProviderTestCase):
provider_name = 'bierdopje'
def test_query_episode_0(self):
video = EPISODES[0]
language = Language('eng')
matches = {frozenset(['series', 'video_codec', 'resolution', 'episode', 'season']),
frozenset(['season', 'video_codec', 'episode', 'series']),
frozenset(['episode', 'video_codec', 'season', 'series', 'resolution', 'release_group'])}
with self.Provider() as provider:
subtitles = provider.query(language, video.season, video.episode, series=video.series)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == {language})
def test_query_episode_1(self):
video = EPISODES[1]
language = Language('nld')
matches = {frozenset(['series', 'video_codec', 'resolution', 'episode', 'season']),
frozenset(['season', 'video_codec', 'episode', 'series']),
frozenset(['series', 'episode', 'season']),
frozenset(['season', 'video_codec', 'episode', 'release_group', 'series']),
frozenset(['episode', 'video_codec', 'season', 'series', 'resolution', 'release_group'])}
with self.Provider() as provider:
subtitles = provider.query(language, video.season, video.episode, series=video.series)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == {language})
def test_query_episode_0_tvdb_id(self):
video = EPISODES[0]
language = Language('eng')
matches = {frozenset(['video_codec', 'tvdb_id', 'episode', 'season', 'series']),
frozenset(['episode', 'video_codec', 'series', 'season', 'tvdb_id', 'resolution', 'release_group']),
frozenset(['episode', 'series', 'video_codec', 'tvdb_id', 'resolution', 'season'])}
with self.Provider() as provider:
subtitles = provider.query(language, video.season, video.episode, tvdb_id=video.tvdb_id)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == {language})
def test_list_subtitles(self):
video = EPISODES[1]
languages = {Language('eng'), Language('nld')}
matches = {frozenset(['series', 'video_codec', 'tvdb_id', 'episode', 'season']),
frozenset(['episode', 'video_codec', 'season', 'series', 'tvdb_id', 'resolution', 'release_group']),
frozenset(['season', 'tvdb_id', 'episode', 'series']),
frozenset(['episode', 'video_codec', 'season', 'series', 'tvdb_id', 'resolution']),
frozenset(['episode', 'video_codec', 'season', 'series', 'tvdb_id', 'release_group'])}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_download_subtitle(self):
video = EPISODES[0]
languages = {Language('eng'), Language('nld')}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
subtitle_text = provider.download_subtitle(subtitles[0])
self.assertTrue(is_valid_subtitle(subtitle_text))
class OpenSubtitlesProviderTestCase(ProviderTestCase):
provider_name = 'opensubtitles'
def test_query_movie_0_query(self):
video = MOVIES[0]
languages = {Language('eng')}
matches = {frozenset([]), frozenset(['imdb_id', 'resolution', 'title', 'year']),
frozenset(['imdb_id', 'title', 'year']),
frozenset(['imdb_id', 'video_codec', 'title', 'year']),
frozenset(['imdb_id', 'resolution', 'title', 'video_codec', 'year']),
frozenset(['imdb_id', 'title', 'year', 'video_codec', 'resolution', 'release_group'])}
with self.Provider() as provider:
subtitles = provider.query(languages, query=video.title)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_episode_0_query(self):
video = EPISODES[0]
languages = {Language('eng')}
matches = {frozenset(['series', 'episode', 'season', 'imdb_id']),
frozenset(['series', 'imdb_id', 'video_codec', 'episode', 'season']),
frozenset(['episode', 'title', 'series', 'imdb_id', 'video_codec', 'season'])}
with self.Provider() as provider:
subtitles = provider.query(languages, query=video.name.split(os.sep)[-1])
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_episode_1_query(self):
video = EPISODES[1]
languages = {Language('eng'), Language('fra')}
matches = {frozenset(['episode', 'title', 'series', 'imdb_id', 'video_codec', 'season']),
frozenset(['series', 'imdb_id', 'title', 'episode', 'season']),
frozenset(['series', 'imdb_id', 'video_codec', 'episode', 'season']),
frozenset(['episode', 'video_codec', 'series', 'imdb_id', 'resolution', 'season']),
frozenset(['series', 'imdb_id', 'resolution', 'episode', 'season']),
frozenset(['series', 'episode', 'season', 'imdb_id'])}
with self.Provider() as provider:
subtitles = provider.query(languages, query=video.name.split(os.sep)[-1])
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_movie_0_imdb_id(self):
video = MOVIES[0]
languages = {Language('eng'), Language('fra')}
matches = {frozenset(['imdb_id', 'video_codec', 'title', 'year']),
frozenset(['imdb_id', 'resolution', 'title', 'video_codec', 'year']),
frozenset(['imdb_id', 'title', 'year', 'video_codec', 'resolution', 'release_group']),
frozenset(['imdb_id', 'title', 'year']),
frozenset(['imdb_id', 'resolution', 'title', 'year'])}
with self.Provider() as provider:
subtitles = provider.query(languages, imdb_id=video.imdb_id)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_episode_0_imdb_id(self):
video = EPISODES[0]
languages = {Language('eng'), Language('fra')}
matches = {frozenset(['series', 'episode', 'season', 'imdb_id']),
frozenset(['episode', 'release_group', 'video_codec', 'series', 'imdb_id', 'resolution', 'season']),
frozenset(['series', 'imdb_id', 'video_codec', 'episode', 'season']),
frozenset(['episode', 'title', 'series', 'imdb_id', 'video_codec', 'season'])}
with self.Provider() as provider:
subtitles = provider.query(languages, imdb_id=video.imdb_id)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_movie_0_hash(self):
video = MOVIES[0]
languages = {Language('eng')}
matches = {frozenset(['imdb_id', 'title', 'hash', 'year']),
frozenset(['imdb_id', 'hash', 'title', 'year', 'video_codec', 'resolution']),
frozenset(['imdb_id', 'video_codec', 'hash', 'title', 'year']),
frozenset(['imdb_id', 'hash', 'title', 'year', 'video_codec', 'resolution', 'release_group'])}
with self.Provider() as provider:
subtitles = provider.query(languages, hash=video.hashes['opensubtitles'], size=video.size)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_episode_0_hash(self):
video = EPISODES[0]
languages = {Language('eng')}
matches = {frozenset(['series', 'hash']),
frozenset(['episode', 'season', 'series', 'imdb_id', 'video_codec', 'hash']),
frozenset(['series', 'episode', 'season', 'hash', 'imdb_id']),
frozenset(['series', 'resolution', 'hash', 'video_codec'])}
with self.Provider() as provider:
subtitles = provider.query(languages, hash=video.hashes['opensubtitles'], size=video.size)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_list_subtitles(self):
video = MOVIES[0]
languages = {Language('eng'), Language('fra')}
matches = {frozenset(['imdb_id', 'title', 'hash', 'year']),
frozenset(['imdb_id', 'resolution', 'title', 'year']),
frozenset(['imdb_id', 'title', 'year']),
frozenset(['imdb_id', 'video_codec', 'title', 'year']),
frozenset(['imdb_id', 'resolution', 'title', 'video_codec', 'year']),
frozenset(['imdb_id', 'hash', 'title', 'year', 'video_codec', 'resolution', 'release_group']),
frozenset(['imdb_id', 'video_codec', 'hash', 'title', 'year']),
frozenset(['imdb_id', 'title', 'year', 'video_codec', 'resolution', 'release_group']),
frozenset(['imdb_id', 'hash', 'title', 'year', 'video_codec', 'resolution'])}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_download_subtitle(self):
video = MOVIES[0]
languages = {Language('eng'), Language('fra')}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
subtitle_text = provider.download_subtitle(subtitles[0])
self.assertTrue(is_valid_subtitle(subtitle_text))
class TheSubDBProviderTestCase(ProviderTestCase):
provider_name = 'thesubdb'
def test_query_episode_0(self):
video = EPISODES[0]
languages = {Language('eng'), Language('spa'), Language('por')}
matches = {frozenset(['hash'])}
with self.Provider() as provider:
subtitles = provider.query(video.hashes['thesubdb'])
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_episode_1(self):
video = EPISODES[1]
languages = {Language('eng'), Language('por')}
matches = {frozenset(['hash'])}
with self.Provider() as provider:
subtitles = provider.query(video.hashes['thesubdb'])
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_list_subtitles(self):
video = MOVIES[0]
languages = {Language('eng'), Language('por')}
matches = {frozenset(['hash'])}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_download_subtitle(self):
video = MOVIES[0]
languages = {Language('eng'), Language('por')}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
subtitle_text = provider.download_subtitle(subtitles[0])
self.assertTrue(is_valid_subtitle(subtitle_text))
class TVsubtitlesProviderTestCase(ProviderTestCase):
provider_name = 'tvsubtitles'
def test_find_show_id(self):
with self.Provider() as provider:
show_id = provider.find_show_id('The Big Bang')
self.assertTrue(show_id == 154)
def test_find_show_id_error(self):
with self.Provider() as provider:
show_id = provider.find_show_id('the big gaming')
self.assertTrue(show_id is None)
def test_find_episode_ids(self):
with self.Provider() as provider:
episode_ids = provider.find_episode_ids(154, 5)
self.assertTrue(set(episode_ids.keys()) == set(range(1, 25)))
def test_query_episode_0(self):
video = EPISODES[0]
languages = {Language('fra'), Language('por'), Language('hun'), Language('ron'), Language('eng')}
matches = {frozenset(['series', 'episode', 'season', 'video_codec']),
frozenset(['series', 'episode', 'season'])}
with self.Provider() as provider:
subtitles = provider.query(video.series, video.season, video.episode)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_query_episode_1(self):
video = EPISODES[1]
languages = {Language('fra'), Language('ell'), Language('ron'), Language('eng'), Language('hun'),
Language('por'), Language('por', 'BR')}
matches = {frozenset(['series', 'episode', 'resolution', 'season']),
frozenset(['series', 'episode', 'season', 'video_codec']),
frozenset(['series', 'episode', 'season'])}
with self.Provider() as provider:
subtitles = provider.query(video.series, video.season, video.episode)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_list_subtitles(self):
video = EPISODES[0]
languages = {Language('eng'), Language('fra')}
matches = {frozenset(['series', 'episode', 'season'])}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
self.assertTrue({frozenset(subtitle.compute_matches(video)) for subtitle in subtitles} == matches)
self.assertTrue({subtitle.language for subtitle in subtitles} == languages)
def test_download_subtitle(self):
video = EPISODES[0]
languages = {Language('hun')}
with self.Provider() as provider:
subtitles = provider.list_subtitles(video, languages)
subtitle_text = provider.download_subtitle(subtitles[0])
self.assertTrue(is_valid_subtitle(subtitle_text))
def suite():
suite = TestSuite()
suite.addTest(TestLoader().loadTestsFromTestCase(Addic7edProviderTestCase))
suite.addTest(TestLoader().loadTestsFromTestCase(BierDopjeProviderTestCase))
suite.addTest(TestLoader().loadTestsFromTestCase(OpenSubtitlesProviderTestCase))
suite.addTest(TestLoader().loadTestsFromTestCase(TheSubDBProviderTestCase))
suite.addTest(TestLoader().loadTestsFromTestCase(TVsubtitlesProviderTestCase))
return suite
if __name__ == '__main__':
TextTestRunner().run(suite())
-109
View File
@@ -1,109 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
import shutil
from unittest import TestCase, TestSuite, TestLoader, TextTestRunner
from babelfish import Language
from subliminal import list_subtitles, download_subtitles, download_best_subtitles
from subliminal.tests.common import MOVIES, EPISODES
TEST_DIR = 'test_data'
class ApiTestCase(TestCase):
def setUp(self):
os.mkdir(TEST_DIR)
def tearDown(self):
shutil.rmtree(TEST_DIR)
def test_list_subtitles_movie_0(self):
videos = [MOVIES[0]]
languages = {Language('eng')}
subtitles = list_subtitles(videos, languages)
self.assertTrue(len(subtitles) == len(videos))
self.assertTrue(len(subtitles[videos[0]]) > 0)
def test_list_subtitles_movie_0_por_br(self):
videos = [MOVIES[0]]
languages = {Language('por', 'BR')}
subtitles = list_subtitles(videos, languages)
self.assertTrue(len(subtitles) == len(videos))
self.assertTrue(len(subtitles[videos[0]]) > 0)
def test_list_subtitles_episodes(self):
videos = [EPISODES[0], EPISODES[1]]
languages = {Language('eng'), Language('fra')}
subtitles = list_subtitles(videos, languages)
self.assertTrue(len(subtitles) == len(videos))
self.assertTrue(len(subtitles[videos[0]]) > 0)
def test_download_subtitles(self):
videos = [EPISODES[0], EPISODES[1]]
for video in videos:
video.name = os.path.join(TEST_DIR, video.name.split(os.sep)[-1])
languages = {Language('eng'), Language('fra')}
subtitles = list_subtitles(videos, languages)
download_subtitles(subtitles)
for video in videos:
self.assertTrue(os.path.exists(os.path.splitext(video.name)[0] + '.en.srt'))
self.assertTrue(os.path.exists(os.path.splitext(video.name)[0] + '.fr.srt'))
def test_download_subtitles_single(self):
videos = [EPISODES[0], EPISODES[1]]
for video in videos:
video.name = os.path.join(TEST_DIR, video.name.split(os.sep)[-1])
languages = {Language('eng'), Language('fra')}
subtitles = list_subtitles(videos, languages)
download_subtitles(subtitles, single=True)
for video in videos:
self.assertTrue(os.path.exists(os.path.splitext(video.name)[0] + '.srt'))
def test_download_best_subtitles(self):
videos = [EPISODES[0], EPISODES[1]]
for video in videos:
video.name = os.path.join(TEST_DIR, video.name.split(os.sep)[-1])
languages = {Language('eng'), Language('fra')}
subtitles = download_best_subtitles(videos, languages)
for video in videos:
self.assertTrue(video in subtitles and len(subtitles[video]) == 2)
self.assertTrue(os.path.exists(os.path.splitext(video.name)[0] + '.en.srt'))
self.assertTrue(os.path.exists(os.path.splitext(video.name)[0] + '.fr.srt'))
def test_download_best_subtitles_single(self):
videos = [EPISODES[0], EPISODES[1]]
for video in videos:
video.name = os.path.join(TEST_DIR, video.name.split(os.sep)[-1])
languages = {Language('eng'), Language('fra')}
subtitles = download_best_subtitles(videos, languages, single=True)
for video in videos:
self.assertTrue(video in subtitles and len(subtitles[video]) == 1)
self.assertTrue(os.path.exists(os.path.splitext(video.name)[0] + '.srt'))
def test_download_best_subtitles_min_score(self):
videos = [MOVIES[0]]
for video in videos:
video.name = os.path.join(TEST_DIR, video.name.split(os.sep)[-1])
languages = {Language('eng'), Language('fra')}
subtitles = download_best_subtitles(videos, languages, min_score=1000)
self.assertTrue(len(subtitles) == 0)
def test_download_best_subtitles_hearing_impaired(self):
videos = [MOVIES[0]]
for video in videos:
video.name = os.path.join(TEST_DIR, video.name.split(os.sep)[-1])
languages = {Language('eng')}
subtitles = download_best_subtitles(videos, languages, hearing_impaired=True)
self.assertTrue(subtitles[videos[0]][0].hearing_impaired == True)
def suite():
suite = TestSuite()
suite.addTest(TestLoader().loadTestsFromTestCase(ApiTestCase))
return suite
if __name__ == '__main__':
TextTestRunner().run(suite())
+360 -168
View File
@@ -1,13 +1,14 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import division
from datetime import datetime, timedelta
import hashlib
import logging
import os
import struct
import babelfish
import enzyme
import guessit
from babelfish import Error as BabelfishError, Language
from enzyme import Error as EnzymeError, MKV
from guessit import guess_episode_info, guess_file_info, guess_movie_info
logger = logging.getLogger(__name__)
@@ -23,50 +24,99 @@ VIDEO_EXTENSIONS = ('.3g2', '.3gp', '.3gp2', '.3gpp', '.60d', '.ajp', '.asf', '.
#: Subtitle extensions
SUBTITLE_EXTENSIONS = ('.srt', '.sub', '.smi', '.txt', '.ssa', '.ass', '.mpl')
#: Language extensions
LANGUAGE_EXTENSIONS = tuple('.' + c for c in babelfish.CONVERTERS['alpha2'].codes)
class Video(object):
"""Base class for videos
"""Base class for videos.
Represent a video, existing or not, with various properties that defines it.
Each property has an associated score based on equations that are described in
subclasses.
Represent a video, existing or not. Attributes have an associated score based on equations defined in
:mod:`~subliminal.score`.
:param string name: name or path of the video
:param string release_group: release group of the video
:param string resolution: screen size of the video stream (480p, 720p, 1080p or 1080i)
:param string video_codec: codec of the video stream
:param string audio_codec: codec of the main audio stream
:param int imdb_id: IMDb id of the video
:param dict hashes: hashes of the video file by provider names
:param int size: byte size of the video file
:param str name: name or path of the video.
:param str format: format of the video (HDTV, WEB-DL, BluRay, ...).
:param str release_group: release group of the video.
:param str resolution: resolution of the video stream (480p, 720p, 1080p or 1080i).
:param str video_codec: codec of the video stream.
:param str audio_codec: codec of the main audio stream.
:param int imdb_id: IMDb id of the video.
:param dict hashes: hashes of the video file by provider names.
:param int size: size of the video file in bytes.
:param set subtitle_languages: existing subtitle languages
"""
#: Score by match property
scores = {}
def __init__(self, name, release_group=None, resolution=None, video_codec=None, audio_codec=None, imdb_id=None,
hashes=None, size=None, subtitle_languages=None):
def __init__(self, name, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None,
imdb_id=None, hashes=None, size=None, subtitle_languages=None):
#: Name or path of the video
self.name = name
#: Format of the video (HDTV, WEB-DL, BluRay, ...)
self.format = format
#: Release group of the video
self.release_group = release_group
#: Resolution of the video stream (480p, 720p, 1080p or 1080i)
self.resolution = resolution
#: Codec of the video stream
self.video_codec = video_codec
#: Codec of the main audio stream
self.audio_codec = audio_codec
#: IMDb id of the video
self.imdb_id = imdb_id
#: Hashes of the video file by provider names
self.hashes = hashes or {}
#: Size of the video file in bytes
self.size = size
#: Existing subtitle languages
self.subtitle_languages = subtitle_languages or set()
@property
def exists(self):
"""Test whether the video exists."""
return os.path.exists(self.name)
@property
def age(self):
"""Age of the video."""
if self.exists:
return datetime.utcnow() - datetime.utcfromtimestamp(os.path.getmtime(self.name))
return timedelta()
@classmethod
def fromguess(cls, name, guess):
"""Create an :class:`Episode` or a :class:`Movie` with the given `name` based on the `guess`.
:param str name: name of the video.
:param dict guess: guessed data, like a :class:`~guessit.guess.Guess` instance.
:raise: :class:`ValueError` if the `type` of the `guess` is invalid
"""
if guess['type'] == 'episode':
return Episode.fromguess(name, guess)
if guess['type'] == 'movie':
return Movie.fromguess(name, guess)
raise ValueError('The guess must be an episode or a movie guess')
@classmethod
def fromname(cls, name):
"""Shortcut for :meth:`fromguess` with a `guess` guessed from the `name`.
:param str name: name of the video.
"""
return cls.fromguess(name, guess_file_info(name))
def __repr__(self):
return '<%s [%r]>' % (self.__class__.__name__, self.name)
@@ -75,251 +125,393 @@ class Video(object):
class Episode(Video):
"""Episode :class:`Video`
"""Episode :class:`Video`.
Scores are defined by a set of equations, see :func:`~subliminal.score.get_episode_equations`
Scores are defined by a set of equations, see :func:`~subliminal.score.solve_episode_equations`
:param string series: series of the episode
:param int season: season number of the episode
:param int episode: episode number of the episode
:param string title: title of the episode
:param int tvdb_id: TheTVDB id of the episode
:param str series: series of the episode.
:param int season: season number of the episode.
:param int episode: episode number of the episode.
:param str title: title of the episode.
:param int year: year of series.
:param int tvdb_id: TVDB id of the episode
"""
scores = {'title': 12, 'video_codec': 2, 'imdb_id': 35, 'audio_codec': 1, 'tvdb_id': 23, 'resolution': 2,
'season': 6, 'release_group': 6, 'series': 23, 'episode': 6, 'hash': 46}
#: Score by match property
scores = {'hash': 137, 'imdb_id': 110, 'tvdb_id': 88, 'series': 44, 'year': 44, 'title': 22, 'season': 11,
'episode': 11, 'release_group': 11, 'format': 6, 'video_codec': 4, 'resolution': 4, 'audio_codec': 2,
'hearing_impaired': 1}
def __init__(self, name, series, season, episode, release_group=None, resolution=None, video_codec=None,
audio_codec=None, imdb_id=None, hashes=None, size=None, subtitle_languages=None, title=None,
tvdb_id=None):
super(Episode, self).__init__(name, release_group, resolution, video_codec, audio_codec, imdb_id, hashes,
size, subtitle_languages)
def __init__(self, name, series, season, episode, format=None, release_group=None, resolution=None,
video_codec=None, audio_codec=None, imdb_id=None, hashes=None, size=None, subtitle_languages=None,
title=None, year=None, tvdb_id=None):
super(Episode, self).__init__(name, format, release_group, resolution, video_codec, audio_codec, imdb_id,
hashes, size, subtitle_languages)
#: Series of the episode
self.series = series
#: Season number of the episode
self.season = season
#: Episode number of the episode
self.episode = episode
#: Title of the episode
self.title = title
#: Year of series
self.year = year
#: TVDB id of the episode
self.tvdb_id = tvdb_id
@classmethod
def fromguess(cls, name, guess):
if guess['type'] != 'episode':
raise ValueError('The guess must be an episode guess')
if 'series' not in guess or 'season' not in guess or 'episodeNumber' not in guess:
raise ValueError('Insufficient data to process the guess')
return cls(name, guess['series'], guess['season'], guess['episodeNumber'],
return cls(name, guess['series'], guess['season'], guess['episodeNumber'], format=guess.get('format'),
release_group=guess.get('releaseGroup'), resolution=guess.get('screenSize'),
video_codec=guess.get('videoCodec'), audio_codec=guess.get('audioCodec'),
title=guess.get('title'))
title=guess.get('title'), year=guess.get('year'))
@classmethod
def fromname(cls, name):
return cls.fromguess(name, guess_episode_info(name))
def __repr__(self):
return '<%s [%r, %rx%r]>' % (self.__class__.__name__, self.series, self.season, self.episode)
if self.year is None:
return '<%s [%r, %dx%d]>' % (self.__class__.__name__, self.series, self.season, self.episode)
return '<%s [%r, %d, %dx%d]>' % (self.__class__.__name__, self.series, self.year, self.season, self.episode)
class Movie(Video):
"""Movie :class:`Video`
"""Movie :class:`Video`.
Scores are defined by a set of equations, see :func:`~subliminal.score.get_movie_equations`
Scores are defined by a set of equations, see :func:`~subliminal.score.solve_movie_equations`
:param string title: title of the movie
:param str title: title of the movie.
:param int year: year of the movie
"""
scores = {'title': 13, 'video_codec': 2, 'resolution': 2, 'audio_codec': 1, 'year': 7, 'imdb_id': 31,
'release_group': 6, 'hash': 31}
#: Score by match property
scores = {'hash': 62, 'imdb_id': 62, 'title': 23, 'year': 12, 'release_group': 11, 'format': 6, 'video_codec': 4,
'resolution': 4, 'audio_codec': 2, 'hearing_impaired': 1}
def __init__(self, name, title, release_group=None, resolution=None, video_codec=None, audio_codec=None,
imdb_id=None, hashes=None, size=None, subtitle_languages=None, year=None):
super(Movie, self).__init__(name, release_group, resolution, video_codec, audio_codec, imdb_id, hashes,
def __init__(self, name, title, format=None, release_group=None, resolution=None, video_codec=None,
audio_codec=None, imdb_id=None, hashes=None, size=None, subtitle_languages=None, year=None):
super(Movie, self).__init__(name, format, release_group, resolution, video_codec, audio_codec, imdb_id, hashes,
size, subtitle_languages)
#: Title of the movie
self.title = title
#: Year of the movie
self.year = year
@classmethod
def fromguess(cls, name, guess):
if guess['type'] != 'movie':
raise ValueError('The guess must be a movie guess')
if 'title' not in guess:
raise ValueError('Insufficient data to process the guess')
return cls(name, guess['title'], release_group=guess.get('releaseGroup'), resolution=guess.get('screenSize'),
video_codec=guess.get('videoCodec'), audio_codec=guess.get('audioCodec'),
year=guess.get('year'))
return cls(name, guess['title'], format=guess.get('format'), release_group=guess.get('releaseGroup'),
resolution=guess.get('screenSize'), video_codec=guess.get('videoCodec'),
audio_codec=guess.get('audioCodec'), year=guess.get('year'))
@classmethod
def fromname(cls, name):
return cls.fromguess(name, guess_movie_info(name))
def __repr__(self):
if self.year is None:
return '<%s [%r]>' % (self.__class__.__name__, self.title)
return '<%s [%r, %r]>' % (self.__class__.__name__, self.title, self.year)
return '<%s [%r, %d]>' % (self.__class__.__name__, self.title, self.year)
def scan_subtitle_languages(path):
"""Search for subtitles with alpha2 extension from a video `path` and return their language
def search_external_subtitles(path, directory=None):
"""Search for external subtitles from a video `path` and their associated language.
:param string path: path to the video
:return: found subtitle languages
:rtype: set
Unless `directory` is provided, search will be made in the same directory as the video file.
:param str path: path to the video.
:param str directory: directory to search for subtitles.
:return: found subtitles with their languages.
:rtype: dict
"""
dirpath, filename = os.path.split(path)
subtitles = {babelfish.Language.fromalpha2(os.path.splitext(p)[0][-2:]) for p in os.listdir(dirpath)
if not isinstance(p, bytes) and p.startswith(os.path.splitext(filename)[0])
and os.path.splitext(p)[0].endswith(LANGUAGE_EXTENSIONS)}
dirpath = dirpath or '.'
fileroot, fileext = os.path.splitext(filename)
subtitles = {}
for p in os.listdir(directory or dirpath):
# keep only valid subtitle filenames
if not p.startswith(fileroot) or not p.endswith(SUBTITLE_EXTENSIONS):
continue
# extract the potential language code
language_code = p[len(fileroot):-len(os.path.splitext(p)[1])].replace(fileext, '').replace('_', '-')[1:]
# default language is undefined
language = Language('und')
# attempt to parse
if language_code:
try:
language = Language.fromietf(language_code)
except ValueError:
logger.error('Cannot parse language code %r', language_code)
subtitles[p] = language
logger.debug('Found subtitles %r', subtitles)
return subtitles
def scan_video(path, subtitles=True, embedded_subtitles=True):
"""Scan a video and its subtitle languages from a video `path`
def scan_video(path, subtitles=True, embedded_subtitles=True, subtitles_dir=None):
"""Scan a video and its subtitle languages from a video `path`.
:param string path: path to the video
:param bool subtitles: scan for subtitles with the same name
:param bool embedded_subtitles: scan for embedded subtitles
:return: the scanned video
:param str path: existing path to the video.
:param bool subtitles: scan for subtitles with the same name.
:param bool embedded_subtitles: scan for embedded subtitles.
:param str subtitles_dir: directory to search for subtitles.
:return: the scanned video.
:rtype: :class:`Video`
:raise: ValueError if cannot guess enough information from the path
"""
# check for non-existing path
if not os.path.exists(path):
raise ValueError('Path does not exist')
# check video extension
if not path.endswith(VIDEO_EXTENSIONS):
raise ValueError('%s is not a valid video extension' % os.path.splitext(path)[1])
dirpath, filename = os.path.split(path)
logger.info('Scanning video %r in %r', filename, dirpath)
video = Video.fromguess(path, guessit.guess_file_info(filename, 'autodetect'))
# mkv container
if filename.endswith('.mkv'):
with open(path, 'rb') as f:
mkv = enzyme.MKV(f)
video_track = mkv.video_tracks[0]
audio_track = mkv.audio_tracks[0]
# resolution
if video_track.height in (480, 720, 1080):
if video_track.interlaced:
video.resolution = '%di' % video_track.height
logger.debug('Found resolution %s with enzyme', video.resolution)
else:
video.resolution = '%dp' % video_track.height
logger.debug('Found resolution %s with enzyme', video.resolution)
# video codec
if video_track.codec_id == 'V_MPEG4/ISO/AVC':
video.video_codec = 'h264'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
elif video_track.codec_id == 'V_MPEG4/ISO/SP':
video.video_codec = 'DivX'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
elif video_track.codec_id == 'V_MPEG4/ISO/ASP':
video.video_codec = 'XviD'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
# audio codec
if audio_track.codec_id == 'A_AC3':
video.audio_codec = 'AC3'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
elif audio_track.codec_id == 'A_DTS':
video.audio_codec = 'DTS'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
elif audio_track.codec_id == 'A_AAC':
video.audio_codec = 'AAC'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
# embedded subtitles
if embedded_subtitles:
embedded_subtitle_languages = {babelfish.Language.fromalpha3b(st.language) for st in
mkv.subtitle_tracks if st.language != 'und'}
if embedded_subtitle_languages:
logger.debug('Found embedded subtitle %r with enzyme', embedded_subtitle_languages)
video.subtitle_languages |= embedded_subtitle_languages
# guess
video = Video.fromguess(path, guess_file_info(path))
# size and hashes
video.size = os.path.getsize(path)
logger.debug('Size is %d', video.size)
video.hashes['opensubtitles'] = hash_opensubtitles(path)
video.hashes['thesubdb'] = hash_thesubdb(path)
logger.debug('Computed hashes %r', video.hashes)
# add subtitles
if video.size > 10485760:
logger.debug('Size is %d', video.size)
video.hashes['opensubtitles'] = hash_opensubtitles(path)
video.hashes['thesubdb'] = hash_thesubdb(path)
video.hashes['napiprojekt'] = hash_napiprojekt(path)
logger.debug('Computed hashes %r', video.hashes)
else:
logger.warning('Size is lower than 10MB: hashes not computed')
# external subtitles
if subtitles:
video.subtitle_languages |= scan_subtitle_languages(path)
video.subtitle_languages |= set(search_external_subtitles(path, directory=subtitles_dir).values())
# video metadata with enzyme
try:
if filename.endswith('.mkv'):
with open(path, 'rb') as f:
mkv = MKV(f)
# main video track
if mkv.video_tracks:
video_track = mkv.video_tracks[0]
# resolution
if video_track.height in (480, 720, 1080):
if video_track.interlaced:
video.resolution = '%di' % video_track.height
else:
video.resolution = '%dp' % video_track.height
logger.debug('Found resolution %s with enzyme', video.resolution)
# video codec
if video_track.codec_id == 'V_MPEG4/ISO/AVC':
video.video_codec = 'h264'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
elif video_track.codec_id == 'V_MPEG4/ISO/SP':
video.video_codec = 'DivX'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
elif video_track.codec_id == 'V_MPEG4/ISO/ASP':
video.video_codec = 'XviD'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
else:
logger.warning('MKV has no video track')
# main audio track
if mkv.audio_tracks:
audio_track = mkv.audio_tracks[0]
# audio codec
if audio_track.codec_id == 'A_AC3':
video.audio_codec = 'AC3'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
elif audio_track.codec_id == 'A_DTS':
video.audio_codec = 'DTS'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
elif audio_track.codec_id == 'A_AAC':
video.audio_codec = 'AAC'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
else:
logger.warning('MKV has no audio track')
# subtitle tracks
if mkv.subtitle_tracks:
if embedded_subtitles:
embedded_subtitle_languages = set()
for st in mkv.subtitle_tracks:
if st.language:
try:
embedded_subtitle_languages.add(Language.fromalpha3b(st.language))
except BabelfishError:
logger.error('Embedded subtitle track language %r is not a valid language', st.language)
embedded_subtitle_languages.add(Language('und'))
elif st.name:
try:
embedded_subtitle_languages.add(Language.fromname(st.name))
except BabelfishError:
logger.debug('Embedded subtitle track name %r is not a valid language', st.name)
embedded_subtitle_languages.add(Language('und'))
else:
embedded_subtitle_languages.add(Language('und'))
logger.debug('Found embedded subtitle %r with enzyme', embedded_subtitle_languages)
video.subtitle_languages |= embedded_subtitle_languages
else:
logger.debug('MKV has no subtitle track')
except:
logger.exception('Parsing video metadata with enzyme failed')
return video
def scan_videos(paths, subtitles=True, embedded_subtitles=True, age=None):
"""Scan `paths` for videos and their subtitle languages
def scan_videos(path, subtitles=True, embedded_subtitles=True, subtitles_dir=None):
"""Scan `path` for videos and their subtitles.
:params paths: paths to scan for videos
:type paths: list of string
:param bool subtitles: scan for subtitles with the same name
:param bool embedded_subtitles: scan for embedded subtitles
:param age: age of the video, if any
:type age: datetime.timedelta or None
:return: the scanned videos
:param str path: existing directory path to scan.
:param bool subtitles: scan for subtitles with the same name.
:param bool embedded_subtitles: scan for embedded subtitles.
:param str subtitles_dir: directory to search for subtitles.
:return: the scanned videos.
:rtype: list of :class:`Video`
"""
# check for non-existing path
if not os.path.exists(path):
raise ValueError('Path does not exist')
# check for non-directory path
if not os.path.isdir(path):
raise ValueError('Path is not a directory')
# walk the path
videos = []
# scan files
for filepath in [p for p in paths if os.path.isfile(p)]:
try:
videos.append(scan_video(filepath, subtitles))
except ValueError as e:
logger.info('Skipping video: %s', e)
continue
# scan directories
for path in [p for p in paths if os.path.isdir(p)]:
logger.info('Scanning directory %r', path)
for dirpath, _, filenames in os.walk(path):
# skip badly encoded directories and files
if isinstance(dirpath, bytes):
logger.error('Skipping badly encoded directory %r', dirpath.decode('utf-8', errors='replace'))
for dirpath, dirnames, filenames in os.walk(path):
logger.debug('Walking directory %s', dirpath)
# remove badly encoded and hidden dirnames
for dirname in list(dirnames):
if dirname.startswith('.'):
logger.debug('Skipping hidden dirname %r in %r', dirname, dirpath)
dirnames.remove(dirname)
# scan for videos
for filename in filenames:
# filter on videos
if not filename.endswith(VIDEO_EXTENSIONS):
continue
safe_filenames = []
for filename in filenames:
if isinstance(filename, bytes):
logger.error('Skipping badly encoded filename %r', filename.decode('utf-8', errors='replace'))
continue
safe_filenames.append(filename)
# scan for videos
for video_filename in [f for f in safe_filenames if f.endswith(VIDEO_EXTENSIONS)]:
try:
video = scan_video(os.path.join(dirpath, video_filename), subtitles=subtitles)
except ValueError as e:
logger.info('Skipping video: %s', e)
continue
videos.append(video)
# skip hidden files
if filename.startswith('.'):
logger.debug('Skipping hidden filename %r in %r', filename, dirpath)
continue
# reconstruct the file path
filepath = os.path.join(dirpath, filename)
# skip links
if os.path.islink(filepath):
logger.debug('Skipping link %r in %r', filename, dirpath)
continue
# scan video
try:
video = scan_video(filepath, subtitles=subtitles, embedded_subtitles=embedded_subtitles,
subtitles_dir=subtitles_dir)
except ValueError: # pragma: no cover
logger.exception('Error scanning video')
continue
videos.append(video)
return videos
def hash_opensubtitles(video_path):
"""Compute a hash using OpenSubtitles' algorithm
"""Compute a hash using OpenSubtitles' algorithm.
:param string video_path: path of the video
:return: the hash
:rtype: string
:param str video_path: path of the video.
:return: the hash.
:rtype: str
"""
bytesize = struct.calcsize(b'q')
bytesize = struct.calcsize(b'<q')
with open(video_path, 'rb') as f:
filesize = os.path.getsize(video_path)
filehash = filesize
if filesize < 65536 * 2:
return None
for _ in range(65536 / bytesize):
return
for _ in range(65536 // bytesize):
filebuffer = f.read(bytesize)
(l_value,) = struct.unpack(b'q', filebuffer)
(l_value,) = struct.unpack(b'<q', filebuffer)
filehash += l_value
filehash = filehash & 0xFFFFFFFFFFFFFFFF # to remain as 64bit number
filehash &= 0xFFFFFFFFFFFFFFFF # to remain as 64bit number
f.seek(max(0, filesize - 65536), 0)
for _ in range(65536 / bytesize):
for _ in range(65536 // bytesize):
filebuffer = f.read(bytesize)
(l_value,) = struct.unpack(b'q', filebuffer)
(l_value,) = struct.unpack(b'<q', filebuffer)
filehash += l_value
filehash = filehash & 0xFFFFFFFFFFFFFFFF
filehash &= 0xFFFFFFFFFFFFFFFF
returnedhash = '%016x' % filehash
return returnedhash
def hash_thesubdb(video_path):
"""Compute a hash using TheSubDB's algorithm
"""Compute a hash using TheSubDB's algorithm.
:param string video_path: path of the video
:return: the hash
:rtype: string
:param str video_path: path of the video.
:return: the hash.
:rtype: str
"""
readsize = 64 * 1024
if os.path.getsize(video_path) < readsize:
return None
return
with open(video_path, 'rb') as f:
data = f.read(readsize)
f.seek(-readsize, os.SEEK_END)
data += f.read(readsize)
return hashlib.md5(data).hexdigest().decode('ascii')
return hashlib.md5(data).hexdigest()
def hash_napiprojekt(video_path):
"""Compute a hash using NapiProjekt's algorithm.
:param str video_path: path of the video.
:return: the hash.
:rtype: str
"""
readsize = 1024 * 1024 * 10
with open(video_path, 'rb') as f:
data = f.read(readsize)
return hashlib.md5(data).hexdigest()
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+370
View File
@@ -0,0 +1,370 @@
interactions:
- request:
body: username=subliminal&password=subliminal&Submit=Log+in
headers:
Content-Length: ['53']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [Subliminal/1.1]
method: POST
uri: http://www.addic7ed.com/dologin.php
response:
body: {string: !!python/unicode "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0\
\ Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\
>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"\
Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>Addic7ed.com\
\ - For all those TV Series Addic7s: Subtitles, Tv Series and Movies Talk,\
\ Forum and more -</title>\n<link href=\"css/wikisubtitles.css\" rel=\"stylesheet\"\
\ title=\"default\" type=\"text/css\" media=\"screen\"/>\n</head>\n\n<body>\n\
<center><br />\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"\
/\"><img height=\"200\" width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\"\
\ border=\"0\" title=\"Addic7ed.com - Quality Subtitles for TV Shows and\
\ movies\" alt=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\"\
\ /></a></td>\n</tr>\n<tr><td align=\"center\" colspan=\"2\">\n<h1><small>Download\
\ free subtitles for TV Shows and Movies.</small>&nbsp; \n<select name=\"\
applang\" class=\"inputCool\" onchange=\"changeAppLang();\" id=\"comboLang\"\
><option value=\"ar\">Arabic</option><option value=\"ca\">Catala</option><option\
\ selected=\"selected\" value=\"en\">English</option><option value=\"eu\"\
>Euskera</option><option value=\"fr\">French</option><option value=\"ga\"\
>Galician</option><option value=\"de\">German</option><option value=\"gr\"\
>Greek</option><option value=\"hu\">Hungarian</option><option value=\"it\"\
>Italian</option><option value=\"fa\">Persian</option><option value=\"pl\"\
>Polish</option><option value=\"pt\">Portuguese</option><option value=\"br\"\
>Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n\n<script language=\"javascript\">\nvar url=\"/msgspopup.php?count=1\"\
;\t\teditwin = window.open(url, \"msgswin\", 'height=200,width=350,toolbar=0,location=0,statusbar=0,menubar=0');\
\ \n\t\tif (editwin.focus) {editwin.focus()}\n</script>\n<div id=\"hBar\"\
>\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button white\" href=\"/panel.php\"\
>My Panel</a></li><li><a class=\"button white\" href=\"/newsub.php\">Upload</a></li>\t\
\t\t<li><a class=\"button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\
\t\t<li><a class=\"button white\" href=\"/allshows/a\">Air dates</a></li>\n\
\t\t\t\t<li><a class=\"button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\
\t\t\t\t<li><a class=\"button white\" href=\"/logout.php\">Logout</a></li>\n\
\t\t\t </ul>\n\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone\
\ size=\"medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\"\
\ target=\"_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n\n<center><table border=\"0\" width=\"90%\"\
>\n<tr>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body>\n</html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:19 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
location: [/]
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=k44iirltupujnmaku1el93ddc0; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 302, message: Moved Temporarily}
- request:
body: null
headers:
Cookie: [PHPSESSID=k44iirltupujnmaku1el93ddc0]
User-Agent: [Subliminal/1.1]
method: GET
uri: http://www.addic7ed.com/panel.php
response:
body: {string: !!python/unicode " \n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML\
\ 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\
>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n\n<meta http-equiv=\"\
Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>Addic7ed.com\
\ - For all those TV Series Addic7s: Subtitles, Tv Series and Movies Talk,\
\ Forum and more -</title>\n<link href=\"css/wikisubtitles.css\" rel=\"stylesheet\"\
\ title=\"default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"\
favicon.ico\" /> \n<link rel=\"stylesheet\" type=\"text/css\" href=\"css/panel.css\"\
\ >\n</head>\n<body>\n\n<center><br />\n<table border=\"0\">\n<tr>\n <td\
\ rowspan=\"9\"><a href=\"/\"><img height=\"200\" width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\"\
\ border=\"0\" title=\"Addic7ed.com - Quality Subtitles for TV Shows and\
\ movies\" alt=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\"\
\ /></a></td>\n</tr>\n<tr><td align=\"center\" colspan=\"2\">\n<h1><small>Download\
\ free subtitles for TV Shows and Movies.</small>&nbsp; \n<select name=\"\
applang\" class=\"inputCool\" onchange=\"changeAppLang();\" id=\"comboLang\"\
><option value=\"ar\">Arabic</option><option value=\"ca\">Catala</option><option\
\ selected=\"selected\" value=\"en\">English</option><option value=\"eu\"\
>Euskera</option><option value=\"fr\">French</option><option value=\"ga\"\
>Galician</option><option value=\"de\">German</option><option value=\"gr\"\
>Greek</option><option value=\"hu\">Hungarian</option><option value=\"it\"\
>Italian</option><option value=\"fa\">Persian</option><option value=\"pl\"\
>Polish</option><option value=\"pt\">Portuguese</option><option value=\"br\"\
>Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n\n<script language=\"javascript\">\nvar url=\"/msgspopup.php?count=1\"\
;\t\teditwin = window.open(url, \"msgswin\", 'height=200,width=350,toolbar=0,location=0,statusbar=0,menubar=0');\
\ \n\t\tif (editwin.focus) {editwin.focus()}\n</script>\n<div id=\"hBar\"\
>\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button white\" href=\"/panel.php\"\
>My Panel</a></li><li><a class=\"button white\" href=\"/newsub.php\">Upload</a></li>\t\
\t\t<li><a class=\"button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\
\t\t<li><a class=\"button white\" href=\"/allshows/a\">Air dates</a></li>\n\
\t\t\t\t<li><a class=\"button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\
\t\t\t\t<li><a class=\"button white\" href=\"/logout.php\">Logout</a></li>\n\
\t\t\t </ul>\n\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone\
\ size=\"medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\"\
\ target=\"_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n\n\n<table width=\"94%\" border=\"0\" cellpadding=\"\
0\" cellspacing=\"0\">\n <tr bgcolor=\"#FFFFFF\">\n <th width=\"14%\"\
\ height=\"37\" bgcolor=\"#009BCA\" scope=\"row\"></th>\n \n <td width=\"\
83%\" height=\"37\"><center>\n<div id=\"container\"> \n \t<table class=\"\
tabel\" border=\"0\">\n \t<tr> <!-- table header -->\n \t\
<td class=\"tablecorner\"><img src=\"images/tl.gif\" /></td>\n \
\ <td></td>\n <td class=\"tablecorner\"><img src=\"images/tr.gif\"\
\ /></td>\n </tr>\n <tr>\n \t<td></td>\n\
\ <td><div class=\"subItem\"><big><center>subliminal - </center></div>\n\
</td>\n <td></td>\n </tr>\n <tr> <!--\
\ table footer -->\n \t<td class=\"tablecorner\"><img src=\"images/bl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"images/br.gif\" /></td>\n </tr>\n </table>\n\
\ </div></td>\n </tr>\n<tr><td><img src=\"images/invisible.gif\"></td></tr>\n\
\ <tr>\n<th height=\"58\" bgcolor=\"#009BCA\" scope=\"row\"><div class=\"\
navbar\">\r\n<!-- *********************************Start Menu******************************\
\ -->\r\n<div class=\"mainDiv\" >\r\n<div class=\"topItem\" >Personal</div>\r\
\n<div class=\"dropMenu\" ><!-- -->\r\n <div class=\"subMenu\" style=\"\
display:inline;\">\r\n <div class=\"subItem\"><a href=\"/panel_edit_profile.php\"\
>Edit Profile</a></div>\r\n <div class=\"subItem\"><a href=\"\
/mydownloads.php\">My Downloads</a></div>\r\n <div class=\"\
subItem\"><a href=\"/following.php\">I'm Following</a></div>\r\n \
\ <div class=\"subItem\"><a href=\"/myviews.php\">I've Viewed</a></div>\r\
\n </div>\r\n</div>\r\n</div>\r\n<!-- *********************************End\
\ Menu****************************** --></th>\r\n <td bgcolor=\"#009BCA\"\
\ align=\"center\">\n<div id=\"container\"> \n \t<table class=\"tabel70\"\
\ border=0\">\n \t<tr> <!-- table header -->\n \t<td class=\"\
tablecorner\"><img src=\"/images/tl.gif\" /></td>\n <td></td>\n\
\ <td class=\"tablecorner\"><img src=\"/images/tr.gif\" /></td>\n\
\ </tr>\n <tr>\n \t<td></td>\n \
\ <td>\n<table class=\"tabel\" border=\"0\" align=\"center\">\n \
\ <tr>\n <td align=\"center\" rowspan=\"10\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=db74435d70e361342a19ce6de59db4ff&size=100&rating=X&border=FF0000\"\
\ width=\"100\" height=\"100\" /></td>\n <td></td>\n </tr>\n \
\ <tr>\n <td class=\"topItem\">Addict Since</td>\n <td>2015-06-30\
\ 16:35:35</td>\n <td></td>\n </tr>\n <tr>\n <td class=\"\
topItem\">Web site</td>\n <td></td>\n <td></td>\n </tr>\n\
\ <tr>\n <td class=\"topItem\">Signature</td>\n <td></td>\n\
\ <td></td>\n </tr>\n <tr>\n <td class=\"topItem\"\
>Gender</td>\n <td>Male</td>\n <td></td>\n </tr>\n \
\ <tr>\n <td class=\"topItem\">Downloads by User Today</td>\n \
\ <td><a href='mydownloads.php'>0 of 40</a></td>\n <td></td>\n \
\ </tr>\n <tr>\n <td class=\"topItem\">Downloads from IP Today</td>\n\
\ <td><a href='log.php?mode=ip&ip=5.51.3.145'>1</a></td>\n <td></td>\n\
\ </tr>\n <tr>\n <td class=\"topItem\">Class</td>\n \
\ \t<td>Regular</td>\n <td></td>\n </tr>\n <tr>\n \
\ <td class=\"topItem\">Last Seen</td>\n <td>2015-10-29 23:04:19</td>\n\
\ <td></td>\n </tr>\n <tr>\n <td class=\"topItem\"\
>Last IP</td>\n <td><a href='log.php?mode=ip&ip=5.51.3.145'>5.51.3.145</a></td>\n\
\ <td></td>\n </tr>\n <tr>\n <td class=\"topItem\"\
>Episodes created</td>\n <td>0</td>\n <td></td>\n </tr>\n\
\ </table>\n</td>\n <td></td>\n </tr>\n \
\ <tr> <!-- table footer -->\n \t<td class=\"tablecorner\"\
><img src=\"/images/bl.gif\" /></td>\n <td></td>\n \
\ <td class=\"tablecorner\"><img src=\"/images/br.gif\" /></td>\n \
\ </tr>\n </table>\n </div>\n</td>\n \n<tr\
\ bgcolor=\"#009BCA\">\n <th height=\"80\" scope=\"row\"><div class=\"\
navbar\">\n<!-- *********************************Start Menu******************************\
\ -->\n<div class=\"mainDiv\" >\n<div class=\"topItem\" >Messages</div> \
\ \n<div class=\"dropMenu\" ><!-- -->\n\t<div class=\"subMenu\" style=\"\
display:inline;\">\n\t\t<div class=\"subItem\"><a href=\"msginbox.php\">Inbox</a></div>\n\
\t <div class=\"subItem\"><a href=\"msgoutbox.php\">Outbox</a></div>\n\
\t\t<div class=\"subItem\"><a href=\"msgcreate.php\">Compose</a></div>\n\t\
</div>\n</div>\n</div>\n<!-- *********************************End Menu******************************\
\ --></th>\n <td colspan=\"2\" bgcolor=\"#009BCA\"></td>\n </tr>\n <tr\
\ bgcolor=\"#009BCA\">\n <th height=\"74\" bgcolor=\"#009BCA\" scope=\"\
row\"><div class=\"navbar\">\n<!-- *********************************Start\
\ Menu****************************** -->\n<div class=\"mainDiv\" >\n<div class=\"\
topItem\" >RSS Feeds</div> \n<div class=\"dropMenu\" ><!-- -->\n\t\
<div class=\"subMenu\" style=\"display:inline;\">\n\t\t<div class=\"subItem\"\
><a href=\"/log.php?mode=news\">Latest News</a></div>\n\t\t<div class=\"subItem\"\
><a href=\"/rss.php?mode=hotspot\">New Releases</a></div>\n\t <div class=\"\
subItem\"><a href=\"/rss.php?mode=completed\">Latest Files</a></div>\n\t\t\
<div class=\"subItem\"><a href=\"/rss.php?mode=edited\">Latest Edited Files</a></div>\n\
\t\t<div class=\"subItem\"><a href=\"/rss.php?mode=translated\">Latest Started\
\ Translations</a></div>\n\t\t<div class=\"subItem\"><a href=\"/rss.php?mode=versions\"\
>Latest New Versions</a></div>\n\t</div>\n</div>\n</div>\n<!-- *********************************End\
\ Menu****************************** --></th>\n <td colspan=\"2\" rowspan=\"\
5\"></td>\n </tr>\n <tr bgcolor=\"#FFFFFF\">\n <th height=\"75\" bgcolor=\"\
#009BCA\" scope=\"row\"><div class=\"navbar\">\n <!-- *********************************Start\
\ Menu****************************** -->\n <div class=\"mainDiv\" >\n <div\
\ class=\"topItem\" >Support Addic7ed</div> \n <div class=\"dropMenu\"\
\ ><!-- -->\n <div class=\"subMenu\" style=\"display:inline;\">\n \
\ <div class=\"subItem\"><a href=\"/contact.php\">Donations</a></div>\n \
\ </div>\n </div>\n </div>\n <!-- *********************************End\
\ Menu****************************** --></th>\n </tr>\n <tr bgcolor=\"#009BCA\"\
>\n <th height=\"70\" scope=\"row\"><div class=\"navbar\">\n <!-- *********************************Start\
\ Menu****************************** -->\n <div class=\"mainDiv\" >\n <div\
\ class=\"topItem\" >Help & Contact</div> \n <div class=\"dropMenu\"\
\ ><!-- -->\n <div class=\"subMenu\" style=\"display:inline;\">\n \
\ <div class=\"subItem\"><a href=\"http://www.sub-talk.net/\">Forums</a></div>\n\
\ <div class=\"subItem\"><a href=\"/contact.php\">Contact</a></div> \
\ \n </div>\n </div>\n </div>\n <!-- *********************************End\
\ Menu****************************** --></th>\n </tr>\n <tr bgcolor=\"#009BCA\"\
>\n <th height=\"98\" scope=\"row\"><div class=\"navbar\">\n <!-- *********************************Start\
\ Menu****************************** -->\n <div class=\"mainDiv\" >\n <div\
\ class=\"topItem\" >Miscellaneous</div> \n <div class=\"dropMenu\"\
\ ><!-- -->\n <div class=\"subMenu\" style=\"display:inline;\">\n \
\ <div class=\"subItem\"><a href=\"/shows-schedule\">Shows Schedule</a></div>\n\
\ <div class=\"subItem\"><a href=\"http://www.twitter.com/addic7ed\"\
>Addic7ed@Twitter</a></div>\n <div class=\"subItem\"><a href=\"irc://irc.efnet.net/addic7ed\"\
>Addic7ed on IRC</a></div>\n <div class=\"subItem\"><a href=\"http://chat.mibbit.com/?server=irc.umich.edu&channel=%23addic7ed\"\
>Addic7ed - IRC (WebChat)</a></div>\n <div class=\"subItem\"><a href=\"\
http://www.facebook.com/pages/Addic7ed-Subtitles/103460216722?ref=nf\">Addic7ed\
\ on Facebook</a></div>\n </div>\n </div>\n </div>\n <!-- *********************************End\
\ Menu****************************** --></th>\n </tr>\n \n\n</table>\n<script\
\ type=\"text/javascript\" src=\"/xpmenuv21.js\"></script>\n</div>\n\n<center><table\
\ border=\"0\" width=\"90%\">\n<tr>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"\
\ src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body>\n</html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:20 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,131 @@
interactions:
- request:
body: username=subliminal&password=lanimilbus&Submit=Log+in
headers:
Content-Length: ['53']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [Subliminal/1.1]
method: POST
uri: http://www.addic7ed.com/dologin.php
response:
body: {string: !!python/unicode "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0\
\ Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\
>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"\
Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>Addic7ed.com\
\ - For all those TV Series Addic7s: Subtitles, Tv Series and Movies Talk,\
\ Forum and more -</title>\n<link href=\"css/wikisubtitles.css\" rel=\"stylesheet\"\
\ title=\"default\" type=\"text/css\" media=\"screen\"/>\n</head>\n\n<body>\n\
<center><br />\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"\
/\"><img height=\"200\" width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\"\
\ border=\"0\" title=\"Addic7ed.com - Quality Subtitles for TV Shows and\
\ movies\" alt=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\"\
\ /></a></td>\n</tr>\n<tr><td align=\"center\" colspan=\"2\">\n<h1><small>Download\
\ free subtitles for TV Shows and Movies.</small>&nbsp; \n<select name=\"\
applang\" class=\"inputCool\" onchange=\"changeAppLang();\" id=\"comboLang\"\
><option value=\"ar\">Arabic</option><option value=\"ca\">Catala</option><option\
\ selected=\"selected\" value=\"en\">English</option><option value=\"eu\"\
>Euskera</option><option value=\"fr\">French</option><option value=\"ga\"\
>Galician</option><option value=\"de\">German</option><option value=\"gr\"\
>Greek</option><option value=\"hu\">Hungarian</option><option value=\"it\"\
>Italian</option><option value=\"fa\">Persian</option><option value=\"pl\"\
>Polish</option><option value=\"pt\">Portuguese</option><option value=\"br\"\
>Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\
\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"\
medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\" target=\"\
_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n<p align=\"center\">Wrong password </p>\n<center><table\
\ border=\"0\" width=\"90%\">\n<tr>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"\
\ src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body>\n</html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:20 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=834fibc11mnq6patrf6dm2cj44; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,763 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://www.addic7ed.com/search.php?search=The+Big+Bang+Theory&Submit=Search
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
\ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"\
http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\"\
\ content=\"text/html; charset=utf-8\" />\n<title>\nSearch \"The Big Bang\
\ Theory\" Subtitle Download - Addic7ed.com - For all those TV Series Addic7s:\
\ Subtitles, Tv Series and Movies Talk, Forum and more -</title>\n<link href=\"\
http://www.addic7ed.com/css/wikisubtitles.css\" rel=\"stylesheet\" title=\"\
default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"\
\ /> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"\
></script>\n\n</head>\n<body>\n<center><br />\n<table border=\"0\">\n<tr>\n\
\ <td rowspan=\"9\"><a href=\"/\"><img height=\"200\" width=\"350\" src=\"\
http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\" title=\"\
Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com\
\ - Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td\
\ align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for\
\ TV Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"\
\ onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option\
\ value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option\
\ value=\"eu\">Euskera</option><option value=\"fr\">French</option><option\
\ value=\"ga\">Galician</option><option value=\"de\">German</option><option\
\ value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option\
\ value=\"it\">Italian</option><option value=\"fa\">Persian</option><option\
\ value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option\
\ value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\
\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"\
medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\" target=\"\
_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start\
\ -->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\"\
>\n <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"\
\ target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"\
\ target=\"_blank\">Loading...</a> \n </div>\n \
\ <script>\n window.MGWidgetTitle13385\
\ = \"Promoted Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
MarketGidScriptRootC13385\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- MarketGidComposite\
\ End -->\n\n<script data-cfasync=false src=\"//s.ato.mx/p.js#id=7869&type=popunder&cap=1:24\"\
></script>\n</center><br />\n\n<div id=\"container\"> \n \t<table class=\"\
tabel70\" border=\"0\">\n \t<tr> <!-- table header -->\n \
\ \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/tr.gif\" /></td>\n </tr>\n\
\ <tr>\n \t<td></td>\n <td>\n<form action=\"\
/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"\
\ type=\"text\" id=\"search\" size=\"50\" value=\"The Big Bang Theory\" class=\"\
inputCool\"/>&nbsp;\n <input name=\"Submit\" type=\"submit\" class=\"coolBoton\"\
\ value=\"Search\" /></form><br />\n\n<b>193 results found</b> </div><br />\n\
\n<br />\n\t<center>\n\n</center>\n<br />\n<center>&nbsp;&nbsp;<img src=\"\
http://www.addic7ed.com/images/database.png\" /> <span class=\"titulo\">\n\
Are you looking for <a href=\"/show/126\" >Show <i>The Big Bang Theory</i></a>&nbsp;?</span></center><br\
\ /><br />\n\n<table class=\"tabel\" align=\"center\" width=\"80%\" border=\"\
0\">\n<tr><td><img src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a\
\ href=\"serie/The_Big_Bang_Theory/1/0/Unaired_Pilot\" debug=\"27979\">The\
\ Big Bang Theory - 01x00 - Unaired Pilot</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/1/Pilot\"\
\ debug=\"2354\">The Big Bang Theory - 01x01 - Pilot</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/2/The_big_bran_hypothesis\" debug=\"2420\">The\
\ Big Bang Theory - 01x02 - The big bran hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/3/The_fuzzy_boots_collorary\" debug=\"2563\">The\
\ Big Bang Theory - 01x03 - The fuzzy boots collorary</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/4/The_luminous_fish_effect\" debug=\"2795\">The\
\ Big Bang Theory - 01x04 - The luminous fish effect</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/5/The_hamburger_postulate\" debug=\"2937\">The\
\ Big Bang Theory - 01x05 - The hamburger postulate</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/6/The_middle_earth_paradigm\" debug=\"3025\">The\
\ Big Bang Theory - 01x06 - The middle earth paradigm</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/7/The_dumpling_paradox\" debug=\"3161\">The Big\
\ Bang Theory - 01x07 - The dumpling paradox</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/8/The_grasshopper_experiment\" debug=\"3365\"\
>The Big Bang Theory - 01x08 - The grasshopper experiment</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/9/The_Cooper_Hofstadter_polarization\" debug=\"\
7863\">The Big Bang Theory - 01x09 - The Cooper Hofstadter polarization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/10/The_Loobenfeld_decay\" debug=\"7943\">The Big\
\ Bang Theory - 01x10 - The Loobenfeld decay</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/11/The_pancake_batter_anomaly\" debug=\"8069\"\
>The Big Bang Theory - 01x11 - The pancake batter anomaly</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/12/The_Jerusalem_duality\" debug=\"8415\">The\
\ Big Bang Theory - 01x12 - The Jerusalem duality</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/13/The_Bat_Jar_Conjceture\" debug=\"8561\">The\
\ Big Bang Theory - 01x13 - The Bat Jar Conjceture</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/14/The_Nerdvana_Annihilation\" debug=\"8672\"\
>The Big Bang Theory - 01x14 - The Nerdvana Annihilation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/15/The_Shiksa_Indeterminacy\" debug=\"8792\">The\
\ Big Bang Theory - 01x15 - The Shiksa Indeterminacy</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/16/The_Peanut_Reaction\" debug=\"8979\">The Big\
\ Bang Theory - 01x16 - The Peanut Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/17/The_Tangerine_Factor\" debug=\"11375\">The\
\ Big Bang Theory - 01x17 - The Tangerine Factor</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/1/The_Bad_Fish_Paradigm\" debug=\"9593\">The Big\
\ Bang Theory - 02x01 - The Bad Fish Paradigm</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/2/The_Codpiece_Topology\" debug=\"9596\">The Big\
\ Bang Theory - 02x02 - The Codpiece Topology</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/3/The_Barbarian_Sublimation\" debug=\"10093\"\
>The Big Bang Theory - 02x03 - The Barbarian Sublimation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/4/The_Griffin_Equivalency\" debug=\"10094\">The\
\ Big Bang Theory - 02x04 - The Griffin Equivalency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/5/The_Euclid_Alternative\" debug=\"10095\">The\
\ Big Bang Theory - 02x05 - The Euclid Alternative</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/6/The_Cooper-Nowitzki_Theorem\" debug=\"10096\"\
>The Big Bang Theory - 02x06 - The Cooper-Nowitzki Theorem</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/7/The_Panty_Pi%C3%B1ata_Polarization\" debug=\"\
9600\">The Big Bang Theory - 02x07 - The Panty Pi\xF1ata Polarization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/8/The_Lizard-Spock_Expansion\" debug=\"10099\"\
>The Big Bang Theory - 02x08 - The Lizard-Spock Expansion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/9/The_White_Asparagus_Triangulation\" debug=\"\
9602\">The Big Bang Theory - 02x09 - The White Asparagus Triangulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/10/The_Vartabedian_Conundrum\" debug=\"9605\"\
>The Big Bang Theory - 02x10 - The Vartabedian Conundrum</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/11/The_Bath_Item_Gift_Hypothesis\" debug=\"9608\"\
>The Big Bang Theory - 02x11 - The Bath Item Gift Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/12/The_Killer_Robot_Instability\" debug=\"10100\"\
>The Big Bang Theory - 02x12 - The Killer Robot Instability</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/13/The_Friendship_Algorithm\" debug=\"10102\"\
>The Big Bang Theory - 02x13 - The Friendship Algorithm</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/14/The_Financial_Permeability\" debug=\"10552\"\
>The Big Bang Theory - 02x14 - The Financial Permeability</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/15/The_Maternal_Capacitance\" debug=\"10631\"\
>The Big Bang Theory - 02x15 - The Maternal Capacitance</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/16/The_Cushion_Saturation\" debug=\"11144\">The\
\ Big Bang Theory - 02x16 - The Cushion Saturation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/17/The_Terminator_Decoupling\" debug=\"11339\"\
>The Big Bang Theory - 02x17 - The Terminator Decoupling</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/18/The_Work_Song_Nanocluster\" debug=\"11418\"\
>The Big Bang Theory - 02x18 - The Work Song Nanocluster</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/19/The_Dead_Hooker_Juxtaposition\" debug=\"11809\"\
>The Big Bang Theory - 02x19 - The Dead Hooker Juxtaposition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/20/The_Hofstadter_Isotope\" debug=\"11989\">The\
\ Big Bang Theory - 02x20 - The Hofstadter Isotope</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/21/The_Vegas_Renormalization\" debug=\"12156\"\
>The Big Bang Theory - 02x21 - The Vegas Renormalization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/22/The_Classified_Materials_Turbulence\" debug=\"\
12320\">The Big Bang Theory - 02x22 - The Classified Materials Turbulence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/23/The_Monopolar_Expedition\" debug=\"12769\"\
>The Big Bang Theory - 02x23 - The Monopolar Expedition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/1/The_Electric_Can_Opener_Fluctuation\" debug=\"\
20679\">The Big Bang Theory - 03x01 - The Electric Can Opener Fluctuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/2/The_Jiminy_Conjecture\" debug=\"20792\">The\
\ Big Bang Theory - 03x02 - The Jiminy Conjecture</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/3/The_Gothowitz_Deviation\" debug=\"21229\">The\
\ Big Bang Theory - 03x03 - The Gothowitz Deviation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/4/The_Pirate_Solution\" debug=\"21404\">The Big\
\ Bang Theory - 03x04 - The Pirate Solution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/5/The_Creepy_Candy_Coating_Corollary\" debug=\"\
22031\">The Big Bang Theory - 03x05 - The Creepy Candy Coating Corollary</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/6/The_Cornhusker_Vortex\" debug=\"22315\">The\
\ Big Bang Theory - 03x06 - The Cornhusker Vortex</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/7/The_Guitarist_Amplification\" debug=\"22479\"\
>The Big Bang Theory - 03x07 - The Guitarist Amplification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/8/The_Adhesive_Duck_Deficiency\" debug=\"22733\"\
>The Big Bang Theory - 03x08 - The Adhesive Duck Deficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/9/The_Vengeance_Formulation\" debug=\"23240\"\
>The Big Bang Theory - 03x09 - The Vengeance Formulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/10/The_Gorilla_Experiment\" debug=\"23507\">The\
\ Big Bang Theory - 03x10 - The Gorilla Experiment</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/11/The_Maternal_Congruence\" debug=\"23645\">The\
\ Big Bang Theory - 03x11 - The Maternal Congruence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/12/The_Psychic_Vortex\" debug=\"23974\">The Big\
\ Bang Theory - 03x12 - The Psychic Vortex</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/13/The_Bozeman_Reaction\"\
\ debug=\"24082\">The Big Bang Theory - 03x13 - The Bozeman Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/14/The_Einstein_Approximation\" debug=\"24334\"\
>The Big Bang Theory - 03x14 - The Einstein Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/15/The_Large_Hadron_Collision\" debug=\"24335\"\
>The Big Bang Theory - 03x15 - The Large Hadron Collision</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/16/The_Excelsior_Acquisition\" debug=\"24337\"\
>The Big Bang Theory - 03x16 - The Excelsior Acquisition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/17/The_Precious_Fragmentation\" debug=\"24352\"\
>The Big Bang Theory - 03x17 - The Precious Fragmentation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/18/The_Pants_Alternative\" debug=\"24339\">The\
\ Big Bang Theory - 03x18 - The Pants Alternative</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/19/The_Wheaton_Recurrence\" debug=\"25230\">The\
\ Big Bang Theory - 03x19 - The Wheaton Recurrence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/20/The_Spaghetti_Catalyst\" debug=\"26996\">The\
\ Big Bang Theory - 03x20 - The Spaghetti Catalyst</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/21/The_Plimpton_Stimulation\" debug=\"27303\"\
>The Big Bang Theory - 03x21 - The Plimpton Stimulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/22/The_Staircase_Implementation\" debug=\"27531\"\
>The Big Bang Theory - 03x22 - The Staircase Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/23/The_Lunar_Excitation\" debug=\"27712\">The\
\ Big Bang Theory - 03x23 - The Lunar Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/1/The_Robotic_Manipulation\" debug=\"32678\">The\
\ Big Bang Theory - 04x01 - The Robotic Manipulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/2/The_Cruciferous_Vegetable_Amplification\" debug=\"\
33395\">The Big Bang Theory - 04x02 - The Cruciferous Vegetable Amplification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/3/The_Zazzy_Substitution\" debug=\"33712\">The\
\ Big Bang Theory - 04x03 - The Zazzy Substitution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/4/The_Hot_Troll_Deviation\" debug=\"33944\">The\
\ Big Bang Theory - 04x04 - The Hot Troll Deviation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/5/The_Desperation_Emanation\" debug=\"34325\"\
>The Big Bang Theory - 04x05 - The Desperation Emanation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/6/The_Irish_Pub_Formulation\" debug=\"34542\"\
>The Big Bang Theory - 04x06 - The Irish Pub Formulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/7/The_Apology_Insufficiency\" debug=\"34799\"\
>The Big Bang Theory - 04x07 - The Apology Insufficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/8/The_21_Second_Excitation\" debug=\"35076\">The\
\ Big Bang Theory - 04x08 - The 21 Second Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/9/The_Boyfriend_Complexity\" debug=\"35418\">The\
\ Big Bang Theory - 04x09 - The Boyfriend Complexity</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/10/The_Alien_Parasite_Hypothesis\" debug=\"36421\"\
>The Big Bang Theory - 04x10 - The Alien Parasite Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/11/The_Justice_League_Recombination\" debug=\"\
36591\">The Big Bang Theory - 04x11 - The Justice League Recombination</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/12/The_Bus_Pants_Utilization\" debug=\"37789\"\
>The Big Bang Theory - 04x12 - The Bus Pants Utilization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/13/The_Love_Car_Displacement\" debug=\"38686\"\
>The Big Bang Theory - 04x13 - The Love Car Displacement</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/14/The_Thespian_Catalyst\" debug=\"39279\">The\
\ Big Bang Theory - 04x14 - The Thespian Catalyst</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/15/The_Benefactor_Factor\" debug=\"39696\">The\
\ Big Bang Theory - 04x15 - The Benefactor Factor</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/16/The_Cohabitation_Formulation\" debug=\"40060\"\
>The Big Bang Theory - 04x16 - The Cohabitation Formulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/17/The_Toast_Derivation\" debug=\"40369\">The\
\ Big Bang Theory - 04x17 - The Toast Derivation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/17/The_toast_derivation\" debug=\"70619\">The\
\ Big Bang Theory - 04x17 - The toast derivation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/18/The_Prestidigitation_Approximation\" debug=\"\
41307\">The Big Bang Theory - 04x18 - The Prestidigitation Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/19/The_Zarnecki_Incursion\" debug=\"42144\">The\
\ Big Bang Theory - 04x19 - The Zarnecki Incursion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/20/The_Herb_Garden_Germination\" debug=\"42506\"\
>The Big Bang Theory - 04x20 - The Herb Garden Germination</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/21/The_Agreement_Dissection\" debug=\"43453\"\
>The Big Bang Theory - 04x21 - The Agreement Dissection</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/22/The_Wildebeest_Implementation\" debug=\"43963\"\
>The Big Bang Theory - 04x22 - The Wildebeest Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/23/The_Engagement_Reaction\" debug=\"44298\">The\
\ Big Bang Theory - 04x23 - The Engagement Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/24/The_Roommate_Transmogrification\" debug=\"\
45211\">The Big Bang Theory - 04x24 - The Roommate Transmogrification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/99/It_All_Started_With_A_Big_Bang\" debug=\"61471\"\
>The Big Bang Theory - 04x99 - It All Started With A Big Bang</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/0/Access_All_Areas\" debug=\"61470\">The Big Bang\
\ Theory - 05x00 - Access All Areas</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/The_Big_Bang_Theory/5/1/The_Skank_Reflex_Analysis\"\
\ debug=\"50098\">The Big Bang Theory - 05x01 - The Skank Reflex Analysis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/2/The_Infestation_Hypothesis\" debug=\"50100\"\
>The Big Bang Theory - 05x02 - The Infestation Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/3/The_Pulled_Groin_Extrapolation\" debug=\"50464\"\
>The Big Bang Theory - 05x03 - The Pulled Groin Extrapolation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/4/The_Wiggly_Finger_Catalyst\" debug=\"50787\"\
>The Big Bang Theory - 05x04 - The Wiggly Finger Catalyst</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/5/The_Russian_Rocket_Reaction\" debug=\"51286\"\
>The Big Bang Theory - 05x05 - The Russian Rocket Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/6/The_Rhinitis_Revelation\" debug=\"52502\">The\
\ Big Bang Theory - 05x06 - The Rhinitis Revelation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/7/The_Good_Guy_Fluctuation\" debug=\"53602\">The\
\ Big Bang Theory - 05x07 - The Good Guy Fluctuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/8/The_Isolation_Permutation\" debug=\"54479\"\
>The Big Bang Theory - 05x08 - The Isolation Permutation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/9/The_Ornithophobia_Diffusion\" debug=\"54953\"\
>The Big Bang Theory - 05x09 - The Ornithophobia Diffusion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/10/The_Flaming_Spittoon_Acquisition\" debug=\"\
55214\">The Big Bang Theory - 05x10 - The Flaming Spittoon Acquisition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/11/The_Speckerman_Recurrence\" debug=\"56382\"\
>The Big Bang Theory - 05x11 - The Speckerman Recurrence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/12/The_Shiny_Trinket_Maneuver\" debug=\"58784\"\
>The Big Bang Theory - 05x12 - The Shiny Trinket Maneuver</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/13/The_Recombination_Hypothesis\" debug=\"59003\"\
>The Big Bang Theory - 05x13 - The Recombination Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/14/The_Beta_Test_Initiation\" debug=\"59196\"\
>The Big Bang Theory - 05x14 - The Beta Test Initiation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/15/The_Friendship_Contraction\" debug=\"59388\"\
>The Big Bang Theory - 05x15 - The Friendship Contraction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/16/The_Vacation_Solution\" debug=\"59650\">The\
\ Big Bang Theory - 05x16 - The Vacation Solution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/17/The_Rothman_Disintegration\" debug=\"59867\"\
>The Big Bang Theory - 05x17 - The Rothman Disintegration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/18/The_Werewolf_Transformation\" debug=\"60147\"\
>The Big Bang Theory - 05x18 - The Werewolf Transformation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/19/The_Weekend_Vortex\" debug=\"60580\">The Big\
\ Bang Theory - 05x19 - The Weekend Vortex</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/20/The_Transporter_Malfunction\"\
\ debug=\"61153\">The Big Bang Theory - 05x20 - The Transporter Malfunction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/21/The_Hawking_Excitation\" debug=\"61378\">The\
\ Big Bang Theory - 05x21 - The Hawking Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/22/The_Stag_Convergence\" debug=\"61967\">The\
\ Big Bang Theory - 05x22 - The Stag Convergence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/23/The_Launch_Acceleration\" debug=\"62208\">The\
\ Big Bang Theory - 05x23 - The Launch Acceleration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/24/The_Countdown_Reflection\" debug=\"62389\"\
>The Big Bang Theory - 05x24 - The Countdown Reflection</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/1/The_Date_Night_Variable\" debug=\"67050\">The\
\ Big Bang Theory - 06x01 - The Date Night Variable</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/2/The_Decoupling_Fluctuation\" debug=\"67274\"\
>The Big Bang Theory - 06x02 - The Decoupling Fluctuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/3/The_Higgs_Boson_Observation\" debug=\"67718\"\
>The Big Bang Theory - 06x03 - The Higgs Boson Observation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/4/The_Re_Entry_Minimization\" debug=\"67942\"\
>The Big Bang Theory - 06x04 - The Re Entry Minimization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/5/The_Holographic_Excitation\" debug=\"68166\"\
>The Big Bang Theory - 06x05 - The Holographic Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/6/The_Extract_Obliteration\" debug=\"68409\">The\
\ Big Bang Theory - 06x06 - The Extract Obliteration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/7/The_Habitation_Configuration\" debug=\"68645\"\
>The Big Bang Theory - 06x07 - The Habitation Configuration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/8/The_43_Peculiarity\" debug=\"68891\">The Big\
\ Bang Theory - 06x08 - The 43 Peculiarity</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/9/The_Parking_Spot_Escalation\"\
\ debug=\"69291\">The Big Bang Theory - 06x09 - The Parking Spot Escalation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/10/The_Fish_Guts_Displacement\" debug=\"69486\"\
>The Big Bang Theory - 06x10 - The Fish Guts Displacement</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/11/The_Santa_Simulation\" debug=\"69725\">The\
\ Big Bang Theory - 06x11 - The Santa Simulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/12/The_Egg_Salad_Equivalency\" debug=\"70156\"\
>The Big Bang Theory - 06x12 - The Egg Salad Equivalency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/13/The_Bakersfield_Expedition\" debug=\"70438\"\
>The Big Bang Theory - 06x13 - The Bakersfield Expedition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/14/The_Cooper_Kripke_Inversion\" debug=\"71175\"\
>The Big Bang Theory - 06x14 - The Cooper Kripke Inversion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/15/The_Spoiler_Alert_Segmentation\" debug=\"71445\"\
>The Big Bang Theory - 06x15 - The Spoiler Alert Segmentation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/16/The_Tangible_Affection_Proof\" debug=\"71783\"\
>The Big Bang Theory - 06x16 - The Tangible Affection Proof</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/17/The_Monster_Isolation\" debug=\"72089\">The\
\ Big Bang Theory - 06x17 - The Monster Isolation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/18/The_Contractual_Obligation_Implementation\"\
\ debug=\"72726\">The Big Bang Theory - 06x18 - The Contractual Obligation\
\ Implementation</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/The_Big_Bang_Theory/6/19/The_Closet_Reconfiguration\"\
\ debug=\"73084\">The Big Bang Theory - 06x19 - The Closet Reconfiguration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/20/The_Tenure_Turbulence\" debug=\"73969\">The\
\ Big Bang Theory - 06x20 - The Tenure Turbulence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/21/The_Closure_Alternative\" debug=\"74818\">The\
\ Big Bang Theory - 06x21 - The Closure Alternative</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/22/The_Proton_Resurgence\" debug=\"75066\">The\
\ Big Bang Theory - 06x22 - The Proton Resurgence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/23/The_Love_Spell_Potential\" debug=\"75335\"\
>The Big Bang Theory - 06x23 - The Love Spell Potential</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/24/The_Bon_Voyage_Reaction\" debug=\"75567\">The\
\ Big Bang Theory - 06x24 - The Bon Voyage Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/1/The_Hofstadter_Insufficiency\" debug=\"79523\"\
>The Big Bang Theory - 07x01 - The Hofstadter Insufficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/2/The_Deception_Verification\" debug=\"79524\"\
>The Big Bang Theory - 07x02 - The Deception Verification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/3/The_Scavenger_Vortex\" debug=\"79722\">The Big\
\ Bang Theory - 07x03 - The Scavenger Vortex</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/4/The_Raiders_Minimization\" debug=\"80031\">The\
\ Big Bang Theory - 07x04 - The Raiders Minimization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/5/The_Workplace_Proximity\" debug=\"80254\">The\
\ Big Bang Theory - 07x05 - The Workplace Proximity</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/6/The_Romance_Resonance\" debug=\"80518\">The\
\ Big Bang Theory - 07x06 - The Romance Resonance</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/7/The_Proton_Displacement\" debug=\"81067\">The\
\ Big Bang Theory - 07x07 - The Proton Displacement</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/8/The_Itchy_Brain_Simulation\" debug=\"81272\"\
>The Big Bang Theory - 07x08 - The Itchy Brain Simulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/9/The_Thanksgiving_Decoupling\" debug=\"81525\"\
>The Big Bang Theory - 07x09 - The Thanksgiving Decoupling</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/10/The_Discovery_Dissipation\" debug=\"82096\"\
>The Big Bang Theory - 07x10 - The Discovery Dissipation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/11/The_Cooper_Extraction\" debug=\"82274\">The\
\ Big Bang Theory - 07x11 - The Cooper Extraction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/12/The_Hesitation_Ramification\" debug=\"82674\"\
>The Big Bang Theory - 07x12 - The Hesitation Ramification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/13/The_Occupation_Recalibration\" debug=\"82916\"\
>The Big Bang Theory - 07x13 - The Occupation Recalibration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/14/The_Convention_Conundrum\" debug=\"83752\"\
>The Big Bang Theory - 07x14 - The Convention Conundrum</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/15/The_Locomotive_Manipulation\" debug=\"83978\"\
>The Big Bang Theory - 07x15 - The Locomotive Manipulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/16/The_Table_Polarization\" debug=\"84736\">The\
\ Big Bang Theory - 07x16 - The Table Polarization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/17/The_Friendship_Turbulence\" debug=\"85106\"\
>The Big Bang Theory - 07x17 - The Friendship Turbulence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/18/The_Mommy_Observation\" debug=\"85542\">The\
\ Big Bang Theory - 07x18 - The Mommy Observation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/19/The_Indecision_Amalgamation\" debug=\"86494\"\
>The Big Bang Theory - 07x19 - The Indecision Amalgamation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/20/The_Relationship_Diremption\" debug=\"86744\"\
>The Big Bang Theory - 07x20 - The Relationship Diremption</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/21/The_Anything_Can_Happen_Recurrence\" debug=\"\
87403\">The Big Bang Theory - 07x21 - The Anything Can Happen Recurrence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/22/The_Proton_Transmogrification\" debug=\"87725\"\
>The Big Bang Theory - 07x22 - The Proton Transmogrification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/23/The_Gorilla_Dissolution\" debug=\"87935\">The\
\ Big Bang Theory - 07x23 - The Gorilla Dissolution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/24/The_Status_Quo_Combustion\" debug=\"88184\"\
>The Big Bang Theory - 07x24 - The Status Quo Combustion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/1/The_Locomotion_Interruption\" debug=\"92140\"\
>The Big Bang Theory - 08x01 - The Locomotion Interruption</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/2/The_Junior_Professor_Solution\" debug=\"92142\"\
>The Big Bang Theory - 08x02 - The Junior Professor Solution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/3/The_First_Pitch_Insufficiency\" debug=\"92307\"\
>The Big Bang Theory - 08x03 - The First Pitch Insufficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/4/The_Hook-up_Reverberation\" debug=\"92545\"\
>The Big Bang Theory - 08x04 - The Hook-up Reverberation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/5/The_Focus_Attenuation\" debug=\"92757\">The\
\ Big Bang Theory - 08x05 - The Focus Attenuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/6/The_Expedition_Approximation\" debug=\"93043\"\
>The Big Bang Theory - 08x06 - The Expedition Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/7/The_Misinterpretation_Agitation\" debug=\"93361\"\
>The Big Bang Theory - 08x07 - The Misinterpretation Agitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/8/The_Prom_Equivalency\" debug=\"93612\">The Big\
\ Bang Theory - 08x08 - The Prom Equivalency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/9/The_Septum_Deviation\" debug=\"93873\">The Big\
\ Bang Theory - 08x09 - The Septum Deviation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/10/The_Champagne_Reflection\" debug=\"94116\"\
>The Big Bang Theory - 08x10 - The Champagne Reflection</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/11/The_Clean_Room_Infiltration\" debug=\"94911\"\
>The Big Bang Theory - 08x11 - The Clean Room Infiltration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/12/The_Space_Probe_Disintegration\" debug=\"95594\"\
>The Big Bang Theory - 08x12 - The Space Probe Disintegration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/13/The_Anxiety_Optimization\" debug=\"96388\"\
>The Big Bang Theory - 08x13 - The Anxiety Optimization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/14/The_Troll_Manifestation\" debug=\"96654\">The\
\ Big Bang Theory - 08x14 - The Troll Manifestation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/15/The_Comic_Book_Store_Regeneration\" debug=\"\
97289\">The Big Bang Theory - 08x15 - The Comic Book Store Regeneration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/16/The_Intimacy_Acceleration\" debug=\"97610\"\
>The Big Bang Theory - 08x16 - The Intimacy Acceleration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/17/The_Colonization_Application\" debug=\"97863\"\
>The Big Bang Theory - 08x17 - The Colonization Application</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/18/The_Leftover_Thermalization\" debug=\"98196\"\
>The Big Bang Theory - 08x18 - The Leftover Thermalization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/19/The_Skywalker_Incursion\" debug=\"99011\">The\
\ Big Bang Theory - 08x19 - The Skywalker Incursion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/20/The_Fortification_Implementation\" debug=\"\
99310\">The Big Bang Theory - 08x20 - The Fortification Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/21/The_Communication_Deterioration\" debug=\"\
99595\">The Big Bang Theory - 08x21 - The Communication Deterioration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/22/The_Graduation_Transmission\" debug=\"99816\"\
>The Big Bang Theory - 08x22 - The Graduation Transmission</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/23/The_Maternal_Combustion\" debug=\"100083\"\
>The Big Bang Theory - 08x23 - The Maternal Combustion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/24/The_Commitment_Determination\" debug=\"100419\"\
>The Big Bang Theory - 08x24 - The Commitment Determination</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/1/The_Matrimonial_Momentum\" debug=\"104184\"\
>The Big Bang Theory - 09x01 - The Matrimonial Momentum</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/2/The_Separation_Oscillation\" debug=\"104383\"\
>The Big Bang Theory - 09x02 - The Separation Oscillation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/3/The_Bachelor_Party_Corrosion\" debug=\"104631\"\
>The Big Bang Theory - 09x03 - The Bachelor Party Corrosion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/4/The_2003_Approximation\" debug=\"104867\">The\
\ Big Bang Theory - 09x04 - The 2003 Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/5/The_Perspiration_Implementation\" debug=\"105116\"\
>The Big Bang Theory - 09x05 - The Perspiration Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/6/The_Helium_Insufficiency\" debug=\"105378\"\
>The Big Bang Theory - 09x06 - The Helium Insufficiency</a></td></tr><tr><p>\n\
<p>\n</table>\n</td>\n <td></td>\n </tr>\n \
\ <tr> <!-- table footer -->\n \t<td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/bl.gif\" /></td>\n \
\ <td></td>\n <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/br.gif\"\
\ /></td>\n </tr>\n </table>\n </div>\n<!-- AdskeeperComposite\
\ Start -->\n<div id=\"AdskeeperScriptRootC23244\">\n <div id=\"AdskeeperPreloadC23244\"\
>\n <a id=\"mg_add23244\" href=\"\" target=\"_blank\">Place your\
\ ad here</a><br> <a href=\"http://adskeeper.co.uk/\" target=\"_blank\"\
>Loading...</a> \n </div>\n <script>\n\
\ window.MGWidgetTitle23244 = \"Promoted\
\ Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
AdskeeperScriptRootC23244\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"AdskeeperScriptRootC23244\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=23244;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.adskeeper.co.uk/a/d/addic7ed.com.23244.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- AdskeeperComposite\
\ End -->\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td class=\"\
NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body></html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:22 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=p7bm6d4g2rvp61s48cmpmgvup7; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,190 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://www.addic7ed.com/search.php?search=The+Big+How+I+Met+Your+Mother&Submit=Search
response:
body: {string: !!python/unicode "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0\
\ Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\
>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"\
Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch \"\
The Big How I Met Your Mother\" Subtitle Download - Addic7ed.com - For all\
\ those TV Series Addic7s: Subtitles, Tv Series and Movies Talk, Forum and\
\ more -</title>\n<link href=\"http://www.addic7ed.com/css/wikisubtitles.css\"\
\ rel=\"stylesheet\" title=\"default\" type=\"text/css\" />\n<link rel=\"\
SHORTCUT ICON\" href=\"favicon.ico\" /> \n<script type=\"text/javascript\"\
\ src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n\
<body>\n<center><br />\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a\
\ href=\"/\"><img height=\"200\" width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\"\
\ border=\"0\" title=\"Addic7ed.com - Quality Subtitles for TV Shows and\
\ movies\" alt=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\"\
\ /></a></td>\n</tr>\n<tr><td align=\"center\" colspan=\"2\">\n<h1><small>Download\
\ free subtitles for TV Shows and Movies.</small>&nbsp; \n<select name=\"\
applang\" class=\"inputCool\" onchange=\"changeAppLang();\" id=\"comboLang\"\
><option value=\"ar\">Arabic</option><option value=\"ca\">Catala</option><option\
\ selected=\"selected\" value=\"en\">English</option><option value=\"eu\"\
>Euskera</option><option value=\"fr\">French</option><option value=\"ga\"\
>Galician</option><option value=\"de\">German</option><option value=\"gr\"\
>Greek</option><option value=\"hu\">Hungarian</option><option value=\"it\"\
>Italian</option><option value=\"fa\">Persian</option><option value=\"pl\"\
>Polish</option><option value=\"pt\">Portuguese</option><option value=\"br\"\
>Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\
\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"\
medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\" target=\"\
_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start\
\ -->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\"\
>\n <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"\
\ target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"\
\ target=\"_blank\">Loading...</a> \n </div>\n \
\ <script>\n window.MGWidgetTitle13385\
\ = \"Promoted Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
MarketGidScriptRootC13385\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- MarketGidComposite\
\ End -->\n\n<script data-cfasync=false src=\"//s.ato.mx/p.js#id=7869&type=popunder&cap=1:24\"\
></script>\n</center><br />\n\n<div id=\"container\"> \n \t<table class=\"\
tabel70\" border=\"0\">\n \t<tr> <!-- table header -->\n \
\ \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/tr.gif\" /></td>\n </tr>\n\
\ <tr>\n \t<td></td>\n <td>\n<form action=\"\
/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"\
\ type=\"text\" id=\"search\" size=\"50\" value=\"The Big How I Met Your Mother\"\
\ class=\"inputCool\"/>&nbsp;\n <input name=\"Submit\" type=\"submit\" class=\"\
coolBoton\" value=\"Search\" /></form><br />\n\n<b>1 results found</b> </div><br\
\ />\n\n<br />\n\t<center>\n\n</center>\n<br />\n\n<table class=\"tabel\"\
\ align=\"center\" width=\"80%\" border=\"0\">\n<tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/The_Big_Bang_Theory/3/3/The_Gothowitz_Deviation\"\
\ debug=\"21229\">The Big Bang Theory - 03x03 - The Gothowitz Deviation</a></td></tr><tr><p>\n\
<p>\n</table>\n</td>\n <td></td>\n </tr>\n \
\ <tr> <!-- table footer -->\n \t<td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/bl.gif\" /></td>\n \
\ <td></td>\n <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/br.gif\"\
\ /></td>\n </tr>\n </table>\n </div>\n<!-- AdskeeperComposite\
\ Start -->\n<div id=\"AdskeeperScriptRootC23244\">\n <div id=\"AdskeeperPreloadC23244\"\
>\n <a id=\"mg_add23244\" href=\"\" target=\"_blank\">Place your\
\ ad here</a><br> <a href=\"http://adskeeper.co.uk/\" target=\"_blank\"\
>Loading...</a> \n </div>\n <script>\n\
\ window.MGWidgetTitle23244 = \"Promoted\
\ Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
AdskeeperScriptRootC23244\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"AdskeeperScriptRootC23244\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=23244;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.adskeeper.co.uk/a/d/addic7ed.com.23244.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- AdskeeperComposite\
\ End -->\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td class=\"\
NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body></html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:25 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=kbac8sgntls3797q3tv920lit3; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,771 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://www.addic7ed.com/search.php?search=The+Big+Bang&Submit=Search
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
\ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"\
http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\"\
\ content=\"text/html; charset=utf-8\" />\n<title>\nSearch \"The Big Bang\"\
\ Subtitle Download - Addic7ed.com - For all those TV Series Addic7s: Subtitles,\
\ Tv Series and Movies Talk, Forum and more -</title>\n<link href=\"http://www.addic7ed.com/css/wikisubtitles.css\"\
\ rel=\"stylesheet\" title=\"default\" type=\"text/css\" />\n<link rel=\"\
SHORTCUT ICON\" href=\"favicon.ico\" /> \n<script type=\"text/javascript\"\
\ src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n\
<body>\n<center><br />\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a\
\ href=\"/\"><img height=\"200\" width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\"\
\ border=\"0\" title=\"Addic7ed.com - Quality Subtitles for TV Shows and\
\ movies\" alt=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\"\
\ /></a></td>\n</tr>\n<tr><td align=\"center\" colspan=\"2\">\n<h1><small>Download\
\ free subtitles for TV Shows and Movies.</small>&nbsp; \n<select name=\"\
applang\" class=\"inputCool\" onchange=\"changeAppLang();\" id=\"comboLang\"\
><option value=\"ar\">Arabic</option><option value=\"ca\">Catala</option><option\
\ selected=\"selected\" value=\"en\">English</option><option value=\"eu\"\
>Euskera</option><option value=\"fr\">French</option><option value=\"ga\"\
>Galician</option><option value=\"de\">German</option><option value=\"gr\"\
>Greek</option><option value=\"hu\">Hungarian</option><option value=\"it\"\
>Italian</option><option value=\"fa\">Persian</option><option value=\"pl\"\
>Polish</option><option value=\"pt\">Portuguese</option><option value=\"br\"\
>Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\
\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"\
medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\" target=\"\
_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start\
\ -->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\"\
>\n <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"\
\ target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"\
\ target=\"_blank\">Loading...</a> \n </div>\n \
\ <script>\n window.MGWidgetTitle13385\
\ = \"Promoted Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
MarketGidScriptRootC13385\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- MarketGidComposite\
\ End -->\n\n<script data-cfasync=false src=\"//s.ato.mx/p.js#id=7869&type=popunder&cap=1:24\"\
></script>\n</center><br />\n\n<div id=\"container\"> \n \t<table class=\"\
tabel70\" border=\"0\">\n \t<tr> <!-- table header -->\n \
\ \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/tr.gif\" /></td>\n </tr>\n\
\ <tr>\n \t<td></td>\n <td>\n<form action=\"\
/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"\
\ type=\"text\" id=\"search\" size=\"50\" value=\"The Big Bang\" class=\"\
inputCool\"/>&nbsp;\n <input name=\"Submit\" type=\"submit\" class=\"coolBoton\"\
\ value=\"Search\" /></form><br />\n\n<b>196 results found</b> </div><br />\n\
\n<br />\n\t<center>\n\n</center>\n<br />\n<center>&nbsp;&nbsp;<img src=\"\
http://www.addic7ed.com/images/database.png\" /> <span class=\"titulo\">\n\
Are you looking for <a href=\"/show/126\" >Show <i>The Big Bang Theory</i></a>&nbsp;?</span></center><br\
\ /><br />\n\n<table class=\"tabel\" align=\"center\" width=\"80%\" border=\"\
0\">\n<tr><td><img src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a\
\ href=\"serie/The_Big_Bang_Theory/1/0/Unaired_Pilot\" debug=\"27979\">The\
\ Big Bang Theory - 01x00 - Unaired Pilot</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/1/Pilot\"\
\ debug=\"2354\">The Big Bang Theory - 01x01 - Pilot</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/2/The_big_bran_hypothesis\" debug=\"2420\">The\
\ Big Bang Theory - 01x02 - The big bran hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/3/The_fuzzy_boots_collorary\" debug=\"2563\">The\
\ Big Bang Theory - 01x03 - The fuzzy boots collorary</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/4/The_luminous_fish_effect\" debug=\"2795\">The\
\ Big Bang Theory - 01x04 - The luminous fish effect</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/5/The_hamburger_postulate\" debug=\"2937\">The\
\ Big Bang Theory - 01x05 - The hamburger postulate</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/6/The_middle_earth_paradigm\" debug=\"3025\">The\
\ Big Bang Theory - 01x06 - The middle earth paradigm</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/7/The_dumpling_paradox\" debug=\"3161\">The Big\
\ Bang Theory - 01x07 - The dumpling paradox</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/8/The_grasshopper_experiment\" debug=\"3365\"\
>The Big Bang Theory - 01x08 - The grasshopper experiment</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/9/The_Cooper_Hofstadter_polarization\" debug=\"\
7863\">The Big Bang Theory - 01x09 - The Cooper Hofstadter polarization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/10/The_Loobenfeld_decay\" debug=\"7943\">The Big\
\ Bang Theory - 01x10 - The Loobenfeld decay</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/11/The_pancake_batter_anomaly\" debug=\"8069\"\
>The Big Bang Theory - 01x11 - The pancake batter anomaly</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/12/The_Jerusalem_duality\" debug=\"8415\">The\
\ Big Bang Theory - 01x12 - The Jerusalem duality</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/13/The_Bat_Jar_Conjceture\" debug=\"8561\">The\
\ Big Bang Theory - 01x13 - The Bat Jar Conjceture</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/14/The_Nerdvana_Annihilation\" debug=\"8672\"\
>The Big Bang Theory - 01x14 - The Nerdvana Annihilation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/15/The_Shiksa_Indeterminacy\" debug=\"8792\">The\
\ Big Bang Theory - 01x15 - The Shiksa Indeterminacy</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/16/The_Peanut_Reaction\" debug=\"8979\">The Big\
\ Bang Theory - 01x16 - The Peanut Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/1/17/The_Tangerine_Factor\" debug=\"11375\">The\
\ Big Bang Theory - 01x17 - The Tangerine Factor</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/1/The_Bad_Fish_Paradigm\" debug=\"9593\">The Big\
\ Bang Theory - 02x01 - The Bad Fish Paradigm</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/2/The_Codpiece_Topology\" debug=\"9596\">The Big\
\ Bang Theory - 02x02 - The Codpiece Topology</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/3/The_Barbarian_Sublimation\" debug=\"10093\"\
>The Big Bang Theory - 02x03 - The Barbarian Sublimation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/4/The_Griffin_Equivalency\" debug=\"10094\">The\
\ Big Bang Theory - 02x04 - The Griffin Equivalency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/5/The_Euclid_Alternative\" debug=\"10095\">The\
\ Big Bang Theory - 02x05 - The Euclid Alternative</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/6/The_Cooper-Nowitzki_Theorem\" debug=\"10096\"\
>The Big Bang Theory - 02x06 - The Cooper-Nowitzki Theorem</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/7/The_Panty_Pi%C3%B1ata_Polarization\" debug=\"\
9600\">The Big Bang Theory - 02x07 - The Panty Pi\xF1ata Polarization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/8/The_Lizard-Spock_Expansion\" debug=\"10099\"\
>The Big Bang Theory - 02x08 - The Lizard-Spock Expansion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/9/The_White_Asparagus_Triangulation\" debug=\"\
9602\">The Big Bang Theory - 02x09 - The White Asparagus Triangulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/10/The_Vartabedian_Conundrum\" debug=\"9605\"\
>The Big Bang Theory - 02x10 - The Vartabedian Conundrum</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/11/The_Bath_Item_Gift_Hypothesis\" debug=\"9608\"\
>The Big Bang Theory - 02x11 - The Bath Item Gift Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/12/The_Killer_Robot_Instability\" debug=\"10100\"\
>The Big Bang Theory - 02x12 - The Killer Robot Instability</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/13/The_Friendship_Algorithm\" debug=\"10102\"\
>The Big Bang Theory - 02x13 - The Friendship Algorithm</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/14/The_Financial_Permeability\" debug=\"10552\"\
>The Big Bang Theory - 02x14 - The Financial Permeability</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/15/The_Maternal_Capacitance\" debug=\"10631\"\
>The Big Bang Theory - 02x15 - The Maternal Capacitance</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/16/The_Cushion_Saturation\" debug=\"11144\">The\
\ Big Bang Theory - 02x16 - The Cushion Saturation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/17/The_Terminator_Decoupling\" debug=\"11339\"\
>The Big Bang Theory - 02x17 - The Terminator Decoupling</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/18/The_Work_Song_Nanocluster\" debug=\"11418\"\
>The Big Bang Theory - 02x18 - The Work Song Nanocluster</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/19/The_Dead_Hooker_Juxtaposition\" debug=\"11809\"\
>The Big Bang Theory - 02x19 - The Dead Hooker Juxtaposition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/20/The_Hofstadter_Isotope\" debug=\"11989\">The\
\ Big Bang Theory - 02x20 - The Hofstadter Isotope</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/21/The_Vegas_Renormalization\" debug=\"12156\"\
>The Big Bang Theory - 02x21 - The Vegas Renormalization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/22/The_Classified_Materials_Turbulence\" debug=\"\
12320\">The Big Bang Theory - 02x22 - The Classified Materials Turbulence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/2/23/The_Monopolar_Expedition\" debug=\"12769\"\
>The Big Bang Theory - 02x23 - The Monopolar Expedition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/1/The_Electric_Can_Opener_Fluctuation\" debug=\"\
20679\">The Big Bang Theory - 03x01 - The Electric Can Opener Fluctuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/2/The_Jiminy_Conjecture\" debug=\"20792\">The\
\ Big Bang Theory - 03x02 - The Jiminy Conjecture</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/3/The_Gothowitz_Deviation\" debug=\"21229\">The\
\ Big Bang Theory - 03x03 - The Gothowitz Deviation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/4/The_Pirate_Solution\" debug=\"21404\">The Big\
\ Bang Theory - 03x04 - The Pirate Solution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/5/The_Creepy_Candy_Coating_Corollary\" debug=\"\
22031\">The Big Bang Theory - 03x05 - The Creepy Candy Coating Corollary</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/6/The_Cornhusker_Vortex\" debug=\"22315\">The\
\ Big Bang Theory - 03x06 - The Cornhusker Vortex</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/7/The_Guitarist_Amplification\" debug=\"22479\"\
>The Big Bang Theory - 03x07 - The Guitarist Amplification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/8/The_Adhesive_Duck_Deficiency\" debug=\"22733\"\
>The Big Bang Theory - 03x08 - The Adhesive Duck Deficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/9/The_Vengeance_Formulation\" debug=\"23240\"\
>The Big Bang Theory - 03x09 - The Vengeance Formulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/10/The_Gorilla_Experiment\" debug=\"23507\">The\
\ Big Bang Theory - 03x10 - The Gorilla Experiment</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/11/The_Maternal_Congruence\" debug=\"23645\">The\
\ Big Bang Theory - 03x11 - The Maternal Congruence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/12/The_Psychic_Vortex\" debug=\"23974\">The Big\
\ Bang Theory - 03x12 - The Psychic Vortex</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/13/The_Bozeman_Reaction\"\
\ debug=\"24082\">The Big Bang Theory - 03x13 - The Bozeman Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/14/The_Einstein_Approximation\" debug=\"24334\"\
>The Big Bang Theory - 03x14 - The Einstein Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/15/The_Large_Hadron_Collision\" debug=\"24335\"\
>The Big Bang Theory - 03x15 - The Large Hadron Collision</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/16/The_Excelsior_Acquisition\" debug=\"24337\"\
>The Big Bang Theory - 03x16 - The Excelsior Acquisition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/17/The_Precious_Fragmentation\" debug=\"24352\"\
>The Big Bang Theory - 03x17 - The Precious Fragmentation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/18/The_Pants_Alternative\" debug=\"24339\">The\
\ Big Bang Theory - 03x18 - The Pants Alternative</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/19/The_Wheaton_Recurrence\" debug=\"25230\">The\
\ Big Bang Theory - 03x19 - The Wheaton Recurrence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/20/The_Spaghetti_Catalyst\" debug=\"26996\">The\
\ Big Bang Theory - 03x20 - The Spaghetti Catalyst</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/21/The_Plimpton_Stimulation\" debug=\"27303\"\
>The Big Bang Theory - 03x21 - The Plimpton Stimulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/22/The_Staircase_Implementation\" debug=\"27531\"\
>The Big Bang Theory - 03x22 - The Staircase Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/3/23/The_Lunar_Excitation\" debug=\"27712\">The\
\ Big Bang Theory - 03x23 - The Lunar Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/1/The_Robotic_Manipulation\" debug=\"32678\">The\
\ Big Bang Theory - 04x01 - The Robotic Manipulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/2/The_Cruciferous_Vegetable_Amplification\" debug=\"\
33395\">The Big Bang Theory - 04x02 - The Cruciferous Vegetable Amplification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/3/The_Zazzy_Substitution\" debug=\"33712\">The\
\ Big Bang Theory - 04x03 - The Zazzy Substitution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/4/The_Hot_Troll_Deviation\" debug=\"33944\">The\
\ Big Bang Theory - 04x04 - The Hot Troll Deviation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/5/The_Desperation_Emanation\" debug=\"34325\"\
>The Big Bang Theory - 04x05 - The Desperation Emanation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/6/The_Irish_Pub_Formulation\" debug=\"34542\"\
>The Big Bang Theory - 04x06 - The Irish Pub Formulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/7/The_Apology_Insufficiency\" debug=\"34799\"\
>The Big Bang Theory - 04x07 - The Apology Insufficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/8/The_21_Second_Excitation\" debug=\"35076\">The\
\ Big Bang Theory - 04x08 - The 21 Second Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/9/The_Boyfriend_Complexity\" debug=\"35418\">The\
\ Big Bang Theory - 04x09 - The Boyfriend Complexity</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/10/The_Alien_Parasite_Hypothesis\" debug=\"36421\"\
>The Big Bang Theory - 04x10 - The Alien Parasite Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/11/The_Justice_League_Recombination\" debug=\"\
36591\">The Big Bang Theory - 04x11 - The Justice League Recombination</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/12/The_Bus_Pants_Utilization\" debug=\"37789\"\
>The Big Bang Theory - 04x12 - The Bus Pants Utilization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/13/The_Love_Car_Displacement\" debug=\"38686\"\
>The Big Bang Theory - 04x13 - The Love Car Displacement</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/14/The_Thespian_Catalyst\" debug=\"39279\">The\
\ Big Bang Theory - 04x14 - The Thespian Catalyst</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/15/The_Benefactor_Factor\" debug=\"39696\">The\
\ Big Bang Theory - 04x15 - The Benefactor Factor</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/16/The_Cohabitation_Formulation\" debug=\"40060\"\
>The Big Bang Theory - 04x16 - The Cohabitation Formulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/17/The_Toast_Derivation\" debug=\"40369\">The\
\ Big Bang Theory - 04x17 - The Toast Derivation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/17/The_toast_derivation\" debug=\"70619\">The\
\ Big Bang Theory - 04x17 - The toast derivation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/18/The_Prestidigitation_Approximation\" debug=\"\
41307\">The Big Bang Theory - 04x18 - The Prestidigitation Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/19/The_Zarnecki_Incursion\" debug=\"42144\">The\
\ Big Bang Theory - 04x19 - The Zarnecki Incursion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/20/The_Herb_Garden_Germination\" debug=\"42506\"\
>The Big Bang Theory - 04x20 - The Herb Garden Germination</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/21/The_Agreement_Dissection\" debug=\"43453\"\
>The Big Bang Theory - 04x21 - The Agreement Dissection</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/22/The_Wildebeest_Implementation\" debug=\"43963\"\
>The Big Bang Theory - 04x22 - The Wildebeest Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/23/The_Engagement_Reaction\" debug=\"44298\">The\
\ Big Bang Theory - 04x23 - The Engagement Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/24/The_Roommate_Transmogrification\" debug=\"\
45211\">The Big Bang Theory - 04x24 - The Roommate Transmogrification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/4/99/It_All_Started_With_A_Big_Bang\" debug=\"61471\"\
>The Big Bang Theory - 04x99 - It All Started With A Big Bang</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/0/Access_All_Areas\" debug=\"61470\">The Big Bang\
\ Theory - 05x00 - Access All Areas</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/The_Big_Bang_Theory/5/1/The_Skank_Reflex_Analysis\"\
\ debug=\"50098\">The Big Bang Theory - 05x01 - The Skank Reflex Analysis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/2/The_Infestation_Hypothesis\" debug=\"50100\"\
>The Big Bang Theory - 05x02 - The Infestation Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/3/The_Pulled_Groin_Extrapolation\" debug=\"50464\"\
>The Big Bang Theory - 05x03 - The Pulled Groin Extrapolation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/4/The_Wiggly_Finger_Catalyst\" debug=\"50787\"\
>The Big Bang Theory - 05x04 - The Wiggly Finger Catalyst</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/5/The_Russian_Rocket_Reaction\" debug=\"51286\"\
>The Big Bang Theory - 05x05 - The Russian Rocket Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/6/The_Rhinitis_Revelation\" debug=\"52502\">The\
\ Big Bang Theory - 05x06 - The Rhinitis Revelation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/7/The_Good_Guy_Fluctuation\" debug=\"53602\">The\
\ Big Bang Theory - 05x07 - The Good Guy Fluctuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/8/The_Isolation_Permutation\" debug=\"54479\"\
>The Big Bang Theory - 05x08 - The Isolation Permutation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/9/The_Ornithophobia_Diffusion\" debug=\"54953\"\
>The Big Bang Theory - 05x09 - The Ornithophobia Diffusion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/10/The_Flaming_Spittoon_Acquisition\" debug=\"\
55214\">The Big Bang Theory - 05x10 - The Flaming Spittoon Acquisition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/11/The_Speckerman_Recurrence\" debug=\"56382\"\
>The Big Bang Theory - 05x11 - The Speckerman Recurrence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/12/The_Shiny_Trinket_Maneuver\" debug=\"58784\"\
>The Big Bang Theory - 05x12 - The Shiny Trinket Maneuver</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/13/The_Recombination_Hypothesis\" debug=\"59003\"\
>The Big Bang Theory - 05x13 - The Recombination Hypothesis</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/14/The_Beta_Test_Initiation\" debug=\"59196\"\
>The Big Bang Theory - 05x14 - The Beta Test Initiation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/15/The_Friendship_Contraction\" debug=\"59388\"\
>The Big Bang Theory - 05x15 - The Friendship Contraction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/16/The_Vacation_Solution\" debug=\"59650\">The\
\ Big Bang Theory - 05x16 - The Vacation Solution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/17/The_Rothman_Disintegration\" debug=\"59867\"\
>The Big Bang Theory - 05x17 - The Rothman Disintegration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/18/The_Werewolf_Transformation\" debug=\"60147\"\
>The Big Bang Theory - 05x18 - The Werewolf Transformation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/19/The_Weekend_Vortex\" debug=\"60580\">The Big\
\ Bang Theory - 05x19 - The Weekend Vortex</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/20/The_Transporter_Malfunction\"\
\ debug=\"61153\">The Big Bang Theory - 05x20 - The Transporter Malfunction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/21/The_Hawking_Excitation\" debug=\"61378\">The\
\ Big Bang Theory - 05x21 - The Hawking Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/22/The_Stag_Convergence\" debug=\"61967\">The\
\ Big Bang Theory - 05x22 - The Stag Convergence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/23/The_Launch_Acceleration\" debug=\"62208\">The\
\ Big Bang Theory - 05x23 - The Launch Acceleration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/5/24/The_Countdown_Reflection\" debug=\"62389\"\
>The Big Bang Theory - 05x24 - The Countdown Reflection</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/1/The_Date_Night_Variable\" debug=\"67050\">The\
\ Big Bang Theory - 06x01 - The Date Night Variable</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/2/The_Decoupling_Fluctuation\" debug=\"67274\"\
>The Big Bang Theory - 06x02 - The Decoupling Fluctuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/3/The_Higgs_Boson_Observation\" debug=\"67718\"\
>The Big Bang Theory - 06x03 - The Higgs Boson Observation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/4/The_Re_Entry_Minimization\" debug=\"67942\"\
>The Big Bang Theory - 06x04 - The Re Entry Minimization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/5/The_Holographic_Excitation\" debug=\"68166\"\
>The Big Bang Theory - 06x05 - The Holographic Excitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/6/The_Extract_Obliteration\" debug=\"68409\">The\
\ Big Bang Theory - 06x06 - The Extract Obliteration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/7/The_Habitation_Configuration\" debug=\"68645\"\
>The Big Bang Theory - 06x07 - The Habitation Configuration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/8/The_43_Peculiarity\" debug=\"68891\">The Big\
\ Bang Theory - 06x08 - The 43 Peculiarity</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/9/The_Parking_Spot_Escalation\"\
\ debug=\"69291\">The Big Bang Theory - 06x09 - The Parking Spot Escalation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/10/The_Fish_Guts_Displacement\" debug=\"69486\"\
>The Big Bang Theory - 06x10 - The Fish Guts Displacement</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/11/The_Santa_Simulation\" debug=\"69725\">The\
\ Big Bang Theory - 06x11 - The Santa Simulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/12/The_Egg_Salad_Equivalency\" debug=\"70156\"\
>The Big Bang Theory - 06x12 - The Egg Salad Equivalency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/13/The_Bakersfield_Expedition\" debug=\"70438\"\
>The Big Bang Theory - 06x13 - The Bakersfield Expedition</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/14/The_Cooper_Kripke_Inversion\" debug=\"71175\"\
>The Big Bang Theory - 06x14 - The Cooper Kripke Inversion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/15/The_Spoiler_Alert_Segmentation\" debug=\"71445\"\
>The Big Bang Theory - 06x15 - The Spoiler Alert Segmentation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/16/The_Tangible_Affection_Proof\" debug=\"71783\"\
>The Big Bang Theory - 06x16 - The Tangible Affection Proof</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/17/The_Monster_Isolation\" debug=\"72089\">The\
\ Big Bang Theory - 06x17 - The Monster Isolation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/18/The_Contractual_Obligation_Implementation\"\
\ debug=\"72726\">The Big Bang Theory - 06x18 - The Contractual Obligation\
\ Implementation</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/The_Big_Bang_Theory/6/19/The_Closet_Reconfiguration\"\
\ debug=\"73084\">The Big Bang Theory - 06x19 - The Closet Reconfiguration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/20/The_Tenure_Turbulence\" debug=\"73969\">The\
\ Big Bang Theory - 06x20 - The Tenure Turbulence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/21/The_Closure_Alternative\" debug=\"74818\">The\
\ Big Bang Theory - 06x21 - The Closure Alternative</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/22/The_Proton_Resurgence\" debug=\"75066\">The\
\ Big Bang Theory - 06x22 - The Proton Resurgence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/23/The_Love_Spell_Potential\" debug=\"75335\"\
>The Big Bang Theory - 06x23 - The Love Spell Potential</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/6/24/The_Bon_Voyage_Reaction\" debug=\"75567\">The\
\ Big Bang Theory - 06x24 - The Bon Voyage Reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/1/The_Hofstadter_Insufficiency\" debug=\"79523\"\
>The Big Bang Theory - 07x01 - The Hofstadter Insufficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/2/The_Deception_Verification\" debug=\"79524\"\
>The Big Bang Theory - 07x02 - The Deception Verification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/3/The_Scavenger_Vortex\" debug=\"79722\">The Big\
\ Bang Theory - 07x03 - The Scavenger Vortex</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/4/The_Raiders_Minimization\" debug=\"80031\">The\
\ Big Bang Theory - 07x04 - The Raiders Minimization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/5/The_Workplace_Proximity\" debug=\"80254\">The\
\ Big Bang Theory - 07x05 - The Workplace Proximity</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/6/The_Romance_Resonance\" debug=\"80518\">The\
\ Big Bang Theory - 07x06 - The Romance Resonance</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/7/The_Proton_Displacement\" debug=\"81067\">The\
\ Big Bang Theory - 07x07 - The Proton Displacement</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/8/The_Itchy_Brain_Simulation\" debug=\"81272\"\
>The Big Bang Theory - 07x08 - The Itchy Brain Simulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/9/The_Thanksgiving_Decoupling\" debug=\"81525\"\
>The Big Bang Theory - 07x09 - The Thanksgiving Decoupling</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/10/The_Discovery_Dissipation\" debug=\"82096\"\
>The Big Bang Theory - 07x10 - The Discovery Dissipation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/11/The_Cooper_Extraction\" debug=\"82274\">The\
\ Big Bang Theory - 07x11 - The Cooper Extraction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/12/The_Hesitation_Ramification\" debug=\"82674\"\
>The Big Bang Theory - 07x12 - The Hesitation Ramification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/13/The_Occupation_Recalibration\" debug=\"82916\"\
>The Big Bang Theory - 07x13 - The Occupation Recalibration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/14/The_Convention_Conundrum\" debug=\"83752\"\
>The Big Bang Theory - 07x14 - The Convention Conundrum</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/15/The_Locomotive_Manipulation\" debug=\"83978\"\
>The Big Bang Theory - 07x15 - The Locomotive Manipulation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/16/The_Table_Polarization\" debug=\"84736\">The\
\ Big Bang Theory - 07x16 - The Table Polarization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/17/The_Friendship_Turbulence\" debug=\"85106\"\
>The Big Bang Theory - 07x17 - The Friendship Turbulence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/18/The_Mommy_Observation\" debug=\"85542\">The\
\ Big Bang Theory - 07x18 - The Mommy Observation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/19/The_Indecision_Amalgamation\" debug=\"86494\"\
>The Big Bang Theory - 07x19 - The Indecision Amalgamation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/20/The_Relationship_Diremption\" debug=\"86744\"\
>The Big Bang Theory - 07x20 - The Relationship Diremption</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/21/The_Anything_Can_Happen_Recurrence\" debug=\"\
87403\">The Big Bang Theory - 07x21 - The Anything Can Happen Recurrence</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/22/The_Proton_Transmogrification\" debug=\"87725\"\
>The Big Bang Theory - 07x22 - The Proton Transmogrification</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/23/The_Gorilla_Dissolution\" debug=\"87935\">The\
\ Big Bang Theory - 07x23 - The Gorilla Dissolution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/7/24/The_Status_Quo_Combustion\" debug=\"88184\"\
>The Big Bang Theory - 07x24 - The Status Quo Combustion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/1/The_Locomotion_Interruption\" debug=\"92140\"\
>The Big Bang Theory - 08x01 - The Locomotion Interruption</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/2/The_Junior_Professor_Solution\" debug=\"92142\"\
>The Big Bang Theory - 08x02 - The Junior Professor Solution</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/3/The_First_Pitch_Insufficiency\" debug=\"92307\"\
>The Big Bang Theory - 08x03 - The First Pitch Insufficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/4/The_Hook-up_Reverberation\" debug=\"92545\"\
>The Big Bang Theory - 08x04 - The Hook-up Reverberation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/5/The_Focus_Attenuation\" debug=\"92757\">The\
\ Big Bang Theory - 08x05 - The Focus Attenuation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/6/The_Expedition_Approximation\" debug=\"93043\"\
>The Big Bang Theory - 08x06 - The Expedition Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/7/The_Misinterpretation_Agitation\" debug=\"93361\"\
>The Big Bang Theory - 08x07 - The Misinterpretation Agitation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/8/The_Prom_Equivalency\" debug=\"93612\">The Big\
\ Bang Theory - 08x08 - The Prom Equivalency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/9/The_Septum_Deviation\" debug=\"93873\">The Big\
\ Bang Theory - 08x09 - The Septum Deviation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/10/The_Champagne_Reflection\" debug=\"94116\"\
>The Big Bang Theory - 08x10 - The Champagne Reflection</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/11/The_Clean_Room_Infiltration\" debug=\"94911\"\
>The Big Bang Theory - 08x11 - The Clean Room Infiltration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/12/The_Space_Probe_Disintegration\" debug=\"95594\"\
>The Big Bang Theory - 08x12 - The Space Probe Disintegration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/13/The_Anxiety_Optimization\" debug=\"96388\"\
>The Big Bang Theory - 08x13 - The Anxiety Optimization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/14/The_Troll_Manifestation\" debug=\"96654\">The\
\ Big Bang Theory - 08x14 - The Troll Manifestation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/15/The_Comic_Book_Store_Regeneration\" debug=\"\
97289\">The Big Bang Theory - 08x15 - The Comic Book Store Regeneration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/16/The_Intimacy_Acceleration\" debug=\"97610\"\
>The Big Bang Theory - 08x16 - The Intimacy Acceleration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/17/The_Colonization_Application\" debug=\"97863\"\
>The Big Bang Theory - 08x17 - The Colonization Application</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/18/The_Leftover_Thermalization\" debug=\"98196\"\
>The Big Bang Theory - 08x18 - The Leftover Thermalization</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/19/The_Skywalker_Incursion\" debug=\"99011\">The\
\ Big Bang Theory - 08x19 - The Skywalker Incursion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/20/The_Fortification_Implementation\" debug=\"\
99310\">The Big Bang Theory - 08x20 - The Fortification Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/21/The_Communication_Deterioration\" debug=\"\
99595\">The Big Bang Theory - 08x21 - The Communication Deterioration</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/22/The_Graduation_Transmission\" debug=\"99816\"\
>The Big Bang Theory - 08x22 - The Graduation Transmission</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/23/The_Maternal_Combustion\" debug=\"100083\"\
>The Big Bang Theory - 08x23 - The Maternal Combustion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/8/24/The_Commitment_Determination\" debug=\"100419\"\
>The Big Bang Theory - 08x24 - The Commitment Determination</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/1/The_Matrimonial_Momentum\" debug=\"104184\"\
>The Big Bang Theory - 09x01 - The Matrimonial Momentum</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/2/The_Separation_Oscillation\" debug=\"104383\"\
>The Big Bang Theory - 09x02 - The Separation Oscillation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/3/The_Bachelor_Party_Corrosion\" debug=\"104631\"\
>The Big Bang Theory - 09x03 - The Bachelor Party Corrosion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/4/The_2003_Approximation\" debug=\"104867\">The\
\ Big Bang Theory - 09x04 - The 2003 Approximation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/5/The_Perspiration_Implementation\" debug=\"105116\"\
>The Big Bang Theory - 09x05 - The Perspiration Implementation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Big_Bang_Theory/9/6/The_Helium_Insufficiency\" debug=\"105378\"\
>The Big Bang Theory - 09x06 - The Helium Insufficiency</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Closer/6/1/The_Big_Bang\" debug=\"28952\">The Closer - 06x01 - The\
\ Big Bang</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/The_New_Adventures_of_Old_Christine/3/1/The_big_bang\"\
\ debug=\"6773\">The New Adventures of Old Christine - 03x01 - The big bang</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/The_Universe/1/14/Beyond_the_Big_Bang\" debug=\"19618\">The Universe\
\ - 01x14 - Beyond the Big Bang</a></td></tr><tr><p>\n<p>\n</table>\n</td>\n\
\ <td></td>\n </tr>\n <tr> <!-- table\
\ footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n\
\ </table>\n </div>\n<!-- AdskeeperComposite Start -->\n<div id=\"\
AdskeeperScriptRootC23244\">\n <div id=\"AdskeeperPreloadC23244\">\n \
\ <a id=\"mg_add23244\" href=\"\" target=\"_blank\">Place your ad\
\ here</a><br> <a href=\"http://adskeeper.co.uk/\" target=\"_blank\"\
>Loading...</a> \n </div>\n <script>\n\
\ window.MGWidgetTitle23244 = \"Promoted\
\ Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
AdskeeperScriptRootC23244\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"AdskeeperScriptRootC23244\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=23244;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.adskeeper.co.uk/a/d/addic7ed.com.23244.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- AdskeeperComposite\
\ End -->\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td class=\"\
NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body></html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:23 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=c4igbqtlgfe65hsh3j7k72ns95; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,600 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://www.addic7ed.com/search.php?search=Dallas&Submit=Search
response:
body: {string: !!python/unicode "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0\
\ Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\
>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"\
Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch \"\
Dallas\" Subtitle Download - Addic7ed.com - For all those TV Series Addic7s:\
\ Subtitles, Tv Series and Movies Talk, Forum and more -</title>\n<link href=\"\
http://www.addic7ed.com/css/wikisubtitles.css\" rel=\"stylesheet\" title=\"\
default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"\
\ /> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"\
></script>\n\n</head>\n<body>\n<center><br />\n<table border=\"0\">\n<tr>\n\
\ <td rowspan=\"9\"><a href=\"/\"><img height=\"200\" width=\"350\" src=\"\
http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\" title=\"\
Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com\
\ - Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td\
\ align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for\
\ TV Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"\
\ onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option\
\ value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option\
\ value=\"eu\">Euskera</option><option value=\"fr\">French</option><option\
\ value=\"ga\">Galician</option><option value=\"de\">German</option><option\
\ value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option\
\ value=\"it\">Italian</option><option value=\"fa\">Persian</option><option\
\ value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option\
\ value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\
\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"\
medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\" target=\"\
_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start\
\ -->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\"\
>\n <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"\
\ target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"\
\ target=\"_blank\">Loading...</a> \n </div>\n \
\ <script>\n window.MGWidgetTitle13385\
\ = \"Promoted Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
MarketGidScriptRootC13385\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- MarketGidComposite\
\ End -->\n\n<script data-cfasync=false src=\"//s.ato.mx/p.js#id=7869&type=popunder&cap=1:24\"\
></script>\n</center><br />\n\n<div id=\"container\"> \n \t<table class=\"\
tabel70\" border=\"0\">\n \t<tr> <!-- table header -->\n \
\ \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/tr.gif\" /></td>\n </tr>\n\
\ <tr>\n \t<td></td>\n <td>\n<form action=\"\
/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"\
\ type=\"text\" id=\"search\" size=\"50\" value=\"Dallas\" class=\"inputCool\"\
/>&nbsp;\n <input name=\"Submit\" type=\"submit\" class=\"coolBoton\" value=\"\
Search\" /></form><br />\n\n<b>181 results found</b> </div><br />\n\n<br />\n\
\t<center>\n\n</center>\n<br />\n<center>&nbsp;&nbsp;<img src=\"http://www.addic7ed.com/images/database.png\"\
\ /> <span class=\"titulo\">\nAre you looking for <a href=\"/show/802\" >Show\
\ <i>Dallas</i></a>&nbsp;?</span></center><br /><br />\n\n<table class=\"\
tabel\" align=\"center\" width=\"80%\" border=\"0\">\n<tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/1/1/Digger%27s_Daughter\"\
\ debug=\"31856\">Dallas - 01x01 - Digger's Daughter</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/1/2/Lessons\" debug=\"31855\">Dallas - 01x02 - Lessons</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/1/3/Spy_in_the_House\" debug=\"31854\">Dallas - 01x03 - Spy in\
\ the House</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/1/4/Winds_of_Vengeance\" debug=\"31853\"\
>Dallas - 01x04 - Winds of Vengeance</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/1/5/Barbecue\"\
\ debug=\"31852\">Dallas - 01x05 - Barbecue</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/2/1/Reunion__%281%29\" debug=\"31906\">Dallas - 02x01 - Reunion\
\ (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/2/Reunion__%282%29\" debug=\"31905\"\
>Dallas - 02x02 - Reunion (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/3/Old_Acquaintance\" debug=\"31904\"\
>Dallas - 02x03 - Old Acquaintance</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/4/Bypass\" debug=\"31903\">Dallas -\
\ 02x04 - Bypass</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/5/Black_Market_Baby\" debug=\"31901\"\
>Dallas - 02x05 - Black Market Baby</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/6/Double_Wedding\" debug=\"31900\">Dallas\
\ - 02x06 - Double Wedding</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/7/Runaway\" debug=\"31899\">Dallas -\
\ 02x07 - Runaway</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/8/Election\" debug=\"31898\">Dallas\
\ - 02x08 - Election</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/9/Survival\" debug=\"31897\">Dallas\
\ - 02x09 - Survival</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/10/Act_of_Love\" debug=\"31896\">Dallas\
\ - 02x10 - Act of Love</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/11/Triangle\" debug=\"31895\">Dallas\
\ - 02x11 - Triangle</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/12/Fallen_Idol\" debug=\"31894\">Dallas\
\ - 02x12 - Fallen Idol</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/13/Kidnapped\" debug=\"31893\">Dallas\
\ - 02x13 - Kidnapped</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/14/Home_Again\" debug=\"31892\">Dallas\
\ - 02x14 - Home Again</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/15/For_Love_or_Money\" debug=\"31891\"\
>Dallas - 02x15 - For Love or Money</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/16/Julie%27s_Return\" debug=\"31890\"\
>Dallas - 02x16 - Julie's Return</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/17/The_Red_File__%281%29\" debug=\"\
31889\">Dallas - 02x17 - The Red File (1)</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/2/18/The_Red_File__%282%29\"\
\ debug=\"31888\">Dallas - 02x18 - The Red File (2)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/2/19/Sue_Ellen%27s_Sister\" debug=\"31887\">Dallas - 02x19 -\
\ Sue Ellen's Sister</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/20/Call_Girl\" debug=\"31886\">Dallas\
\ - 02x20 - Call Girl</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/21/Royal_Marriage\" debug=\"31885\"\
>Dallas - 02x21 - Royal Marriage</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/22/The_Outsiders\" debug=\"31884\">Dallas\
\ - 02x22 - The Outsiders</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/2/23/John_Ewing_III__%281%29\" debug=\"\
31883\">Dallas - 02x23 - John Ewing III (1)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/2/24/John_Ewing_III_%282%29\" debug=\"31882\">Dallas - 02x24\
\ - John Ewing III (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/1/Whatever_Happened_to_Baby_John%3F__%281%29\"\
\ debug=\"31858\">Dallas - 03x01 - Whatever Happened to Baby John? (1)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/3/2/Whatever_Happened_to_Baby_John%3F__%282%29\" debug=\"31857\"\
>Dallas - 03x02 - Whatever Happened to Baby John? (2)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/3/3/The_Silent_Killer\" debug=\"31881\">Dallas - 03x03 - The\
\ Silent Killer</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/4/Secrets\" debug=\"31880\">Dallas -\
\ 03x04 - Secrets</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/5/The_Kristin_Affair\" debug=\"31879\"\
>Dallas - 03x05 - The Kristin Affair</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/3/6/The_Dove_Hunt\"\
\ debug=\"31878\">Dallas - 03x06 - The Dove Hunt</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/3/7/The_Lost_Child\" debug=\"31877\">Dallas - 03x07 - The Lost\
\ Child</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/8/Rodeo\" debug=\"31876\">Dallas - 03x08\
\ - Rodeo</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/9/Mastectomy__%281%29\" debug=\"31875\"\
>Dallas - 03x09 - Mastectomy (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/10/Mastectomy__%282%29\" debug=\"31874\"\
>Dallas - 03x10 - Mastectomy (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/11/The_Heiress\" debug=\"31873\">Dallas\
\ - 03x11 - The Heiress</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/12/Ellie_Saves_the_Day\" debug=\"31872\"\
>Dallas - 03x12 - Ellie Saves the Day</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/3/13/Mother_of_the_Year\"\
\ debug=\"31871\">Dallas - 03x13 - Mother of the Year</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/3/14/Return_Engagements\" debug=\"31870\">Dallas - 03x14 - Return\
\ Engagements</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/15/Love_and_Marriage\" debug=\"31869\"\
>Dallas - 03x15 - Love and Marriage</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/16/Power_Play\" debug=\"31868\">Dallas\
\ - 03x16 - Power Play</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/17/Paternity_Suit\" debug=\"31867\"\
>Dallas - 03x17 - Paternity Suit</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/18/Jenna%27s_Return\" debug=\"31866\"\
>Dallas - 03x18 - Jenna's Return</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/19/Sue_Ellen%27s_Choice\" debug=\"31865\"\
>Dallas - 03x19 - Sue Ellen's Choice</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/3/20/Second_Thoughts\"\
\ debug=\"31864\">Dallas - 03x20 - Second Thoughts</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/3/21/Divorce___Ewing_Style\" debug=\"31863\">Dallas - 03x21 -\
\ Divorce Ewing Style</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/22/Jock%27s_Trial__%281%29\" debug=\"\
31862\">Dallas - 03x22 - Jock's Trial (1)</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/3/23/Jock%27s_Trial__%282%29\"\
\ debug=\"31861\">Dallas - 03x23 - Jock's Trial (2)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/3/24/The_Wheeler_Dealer\" debug=\"31860\">Dallas - 03x24 - The\
\ Wheeler Dealer</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/3/25/A_House_Divided\" debug=\"31859\"\
>Dallas - 03x25 - A House Divided</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/8/1/Killer_at_Large\" debug=\"69652\"\
>Dallas - 08x01 - Killer at Large</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/1/The_Family_Ewing\" debug=\"31937\"\
>Dallas - 09x01 - The Family Ewing</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/2/Rock_Bottom\" debug=\"31936\">Dallas\
\ - 09x02 - Rock Bottom</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/3/Those_Eyes\" debug=\"31935\">Dallas\
\ - 09x03 - Those Eyes</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/4/Resurrection\" debug=\"31934\">Dallas\
\ - 09x04 - Resurrection</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/5/Saving_Grace\" debug=\"31933\">Dallas\
\ - 09x05 - Saving Grace</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/6/Mothers\" debug=\"31932\">Dallas -\
\ 09x06 - Mothers</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/7/The_Wind_of_Change\" debug=\"31931\"\
>Dallas - 09x07 - The Wind of Change</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/9/8/Quandary\"\
\ debug=\"31930\">Dallas - 09x08 - Quandary</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/9/Close_Encounters\" debug=\"31929\">Dallas - 09x09 - Close\
\ Encounters</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/10/Suffer_the_Little_Children\" debug=\"\
31928\">Dallas - 09x10 - Suffer the Little Children</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/11/The_Prize\" debug=\"31927\">Dallas - 09x11 - The Prize</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/12/En_Passant\" debug=\"31926\">Dallas - 09x12 - En Passant</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/13/Goodbye%2C_Farewell%2C_and_Amen\" debug=\"31925\">Dallas\
\ - 09x13 - Goodbye, Farewell, and Amen</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/9/14/Curiosity_Killed_the_Cat\"\
\ debug=\"31924\">Dallas - 09x14 - Curiosity Killed the Cat</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/15/The_Missing_Link\" debug=\"31923\">Dallas - 09x15 - The\
\ Missing Link</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/16/Twenty_Four_Hours\" debug=\"31922\"\
>Dallas - 09x16 - Twenty Four Hours</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/17/The_Deadly_Game\" debug=\"31921\"\
>Dallas - 09x17 - The Deadly Game</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/18/Blame_it_on_Bogota\" debug=\"31920\"\
>Dallas - 09x18 - Blame it on Bogota</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/9/19/Shadow_Games\"\
\ debug=\"31919\">Dallas - 09x19 - Shadow Games</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/20/Missing\" debug=\"31918\">Dallas - 09x20 - Missing</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/21/Dire_Straits\" debug=\"31917\">Dallas - 09x21 - Dire Straits</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/22/Overture\" debug=\"31916\">Dallas - 09x22 - Overture</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/23/Sitting_Ducks\" debug=\"31915\">Dallas - 09x23 - Sitting\
\ Ducks</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/24/Masquerade\" debug=\"31914\">Dallas\
\ - 09x24 - Masquerade</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/25/Just_Desserts\" debug=\"31913\">Dallas\
\ - 09x25 - Just Desserts</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/26/Nothing%27s_Ever_Perfect\" debug=\"\
31912\">Dallas - 09x26 - Nothing's Ever Perfect</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/27/J.R._Rising\" debug=\"31911\">Dallas - 09x27 - J.R. Rising</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/28/Serendipity\" debug=\"31910\">Dallas - 09x28 - Serendipity</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/29/Thrice_in_a_Lifetime\" debug=\"31909\">Dallas - 09x29 -\
\ Thrice in a Lifetime</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/9/30/Hello%2C_Goodbye%2C_Hello\" debug=\"\
31908\">Dallas - 09x30 - Hello, Goodbye, Hello</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/9/31/Blast_From_the_Past\" debug=\"31907\">Dallas - 09x31 - Blast\
\ From the Past</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/1/Carousel\" debug=\"25485\">Dallas\
\ - 12x01 - Carousel</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/2/No_Greater_Love\" debug=\"25486\"\
>Dallas - 12x02 - No Greater Love</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/3/The_Call_of_the_Wild\" debug=\"25487\"\
>Dallas - 12x03 - The Call of the Wild</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/12/4/Out_of_the_Frying_Pan\"\
\ debug=\"25488\">Dallas - 12x04 - Out of the Frying Pan</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/5/Road_Work\" debug=\"25489\">Dallas - 12x05 - Road Work</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/6/War_and_Love_and_the_Whole_Damned_Thing\" debug=\"25490\"\
>Dallas - 12x06 - War and Love and the Whole Damned Thing</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/7/Showdown_at_the_Ewing_Corral\" debug=\"25491\">Dallas -\
\ 12x07 - Showdown at the Ewing Corral</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/12/8/Deception\"\
\ debug=\"25492\">Dallas - 12x08 - Deception</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/9/Counter_Attack\" debug=\"25493\">Dallas - 12x09 - Counter\
\ Attack</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/10/The_Sting\" debug=\"25494\">Dallas\
\ - 12x10 - The Sting</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/11/The_Two_Mrs._Ewings\" debug=\"25495\"\
>Dallas - 12x11 - The Two Mrs. Ewings</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/12/12/The_Switch\"\
\ debug=\"25496\">Dallas - 12x12 - The Switch</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/13/Here%27s_Papa%21\" debug=\"25497\">Dallas - 12x13 - Here's\
\ Papa!</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/14/Comings_and_Goings\" debug=\"25498\"\
>Dallas - 12x14 - Comings and Goings</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/12/15/Country_Girl\"\
\ debug=\"25499\">Dallas - 12x15 - Country Girl</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/16/Wedding_Bell_Blues\" debug=\"25500\">Dallas - 12x16 - Wedding\
\ Bell Blues</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/17/The_Way_We_Were\" debug=\"25501\"\
>Dallas - 12x17 - The Way We Were</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/18/The_Serpent%27s_Tooth\" debug=\"\
25502\">Dallas - 12x18 - The Serpent's Tooth</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/19/Three_Hundred\" debug=\"25503\">Dallas - 12x19 - Three\
\ Hundred</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/20/April_Showers\" debug=\"25504\"\
>Dallas - 12x20 - April Showers</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/21/And_Away_We_Go%21\" debug=\"25505\"\
>Dallas - 12x21 - And Away We Go!</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/22/Yellow_Brick_Road\" debug=\"25506\"\
>Dallas - 12x22 - Yellow Brick Road</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/23/The_Sound_of_Money\" debug=\"25507\"\
>Dallas - 12x23 - The Sound of Money</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/12/24/The_Great_Texas_Waltz\"\
\ debug=\"25508\">Dallas - 12x24 - The Great Texas Waltz</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/12/25/Mission_to_Moscow\" debug=\"25510\">Dallas - 12x25 - Mission\
\ to Moscow</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/12/26/Reel_Life\" debug=\"25511\">Dallas\
\ - 12x26 - Reel Life</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/1/Phantom_of_the_Oil_Rig\" debug=\"\
26320\">Dallas - 13x01 - Phantom of the Oil Rig</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/2/The_Leopard%27s_Spots\" debug=\"26321\">Dallas - 13x02 -\
\ The Leopard's Spots</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/3/Cry_Me_a_River_of_Oil\" debug=\"\
26322\">Dallas - 13x03 - Cry Me a River of Oil</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/4/Ka-Booooom%21\" debug=\"26323\">Dallas - 13x04 - Ka-Booooom!</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/5/Sunrise%2C_Sunset\" debug=\"26324\">Dallas - 13x05 - Sunrise,\
\ Sunset</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/6/Pride_and_Prejudice\" debug=\"26325\"\
>Dallas - 13x06 - Pride and Prejudice</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/13/7/Fathers_and_Other_Strangers\"\
\ debug=\"26326\">Dallas - 13x07 - Fathers and Other Strangers</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/8/Black_Tide\" debug=\"26327\">Dallas - 13x08 - Black Tide</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/9/Daddy_Dearest\" debug=\"26328\">Dallas - 13x09 - Daddy Dearest</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/10/Hell%27s_Fury\" debug=\"26329\">Dallas - 13x10 - Hell's\
\ Fury</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/11/Cally_on_a_Hot_Tin_Roof\" debug=\"\
26330\">Dallas - 13x11 - Cally on a Hot Tin Roof</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/12/Sex%2C_Lies_and_Videotape\" debug=\"26331\">Dallas - 13x12\
\ - Sex, Lies and Videotape</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/13/Tale_of_Two_Cities\" debug=\"26332\"\
>Dallas - 13x13 - Tale of Two Cities</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/13/14/Judgment_Day\"\
\ debug=\"26333\">Dallas - 13x14 - Judgment Day</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/15/Unchain_My_Heart\" debug=\"26334\">Dallas - 13x15 - Unchain\
\ My Heart</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/16/I_Dream_of_Jeannie\" debug=\"26335\"\
>Dallas - 13x16 - I Dream of Jeannie</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/13/17/After_Midnight\"\
\ debug=\"26336\">Dallas - 13x17 - After Midnight</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/18/The_Crucible\" debug=\"26337\">Dallas - 13x18 - The Crucible</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/19/Dear_Hearts_and_Gentle_People\" debug=\"26338\">Dallas\
\ - 13x19 - Dear Hearts and Gentle People</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/13/20/Paradise_Lost\"\
\ debug=\"26339\">Dallas - 13x20 - Paradise Lost</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/21/Will_Power\" debug=\"26340\">Dallas - 13x21 - Will Power</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/22/The_Smiling_Cobra\" debug=\"26341\">Dallas - 13x22 - The\
\ Smiling Cobra</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/23/Jessica_Redux\" debug=\"26346\"\
>Dallas - 13x23 - Jessica Redux</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/24/Family_Plot\" debug=\"26342\">Dallas\
\ - 13x24 - Family Plot</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/25/The_Southfork_Wedding_Jinx\" debug=\"\
26343\">Dallas - 13x25 - The Southfork Wedding Jinx</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas/13/26/Three%2C_Three%2C_Three_%281%29\" debug=\"26344\">Dallas\
\ - 13x26 - Three, Three, Three (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas/13/27/Three%2C_Three%2C_Three_%282%29\"\
\ debug=\"26345\">Dallas - 13x27 - Three, Three, Three (2)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/film.png\" /></td><td><a href=\"movie/88544\"\
\ debug=\"88544\">Dallas (1950)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/1/1/Changing_of_the_Guard\"\
\ debug=\"63362\">Dallas (2012) - 01x01 - Changing of the Guard</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/2/Hedging_Your_Bets\" debug=\"63364\">Dallas (2012)\
\ - 01x02 - Hedging Your Bets</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/1/3/The_Price_You_Pay\" debug=\"\
63827\">Dallas (2012) - 01x03 - The Price You Pay</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/4/The_Last_Hurrah\" debug=\"63994\">Dallas (2012)\
\ - 01x04 - The Last Hurrah</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/1/5/Truth_and_consequences\"\
\ debug=\"64210\">Dallas (2012) - 01x05 - Truth and consequences</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/6/The_Enemy_of_My_Enemy\" debug=\"64512\">Dallas\
\ (2012) - 01x06 - The Enemy of My Enemy</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/7/Collateral_Damage\"\
\ debug=\"64686\">Dallas (2012) - 01x07 - Collateral Damage</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/8/No_Good_Deed\" debug=\"64933\">Dallas (2012) -\
\ 01x08 - No Good Deed</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/1/9/Family_Business\" debug=\"\
65100\">Dallas (2012) - 01x09 - Family Business</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/10/Revelations\" debug=\"65276\">Dallas (2012) -\
\ 01x10 - Revelations</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/1/Battle_Lines\" debug=\"\
71069\">Dallas (2012) - 02x01 - Battle Lines</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/2/Venomous_Creatures\" debug=\"71070\">Dallas (2012)\
\ - 02x02 - Venomous Creatures</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/3/Sins_of_the_Father\" debug=\"\
71358\">Dallas (2012) - 02x03 - Sins of the Father</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/4/False_Confessions\" debug=\"71644\">Dallas (2012)\
\ - 02x04 - False Confessions</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/5/Trial_and_Error\" debug=\"\
71949\">Dallas (2012) - 02x05 - Trial and Error</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/6/Blame_Game\" debug=\"72265\">Dallas (2012) - 02x06\
\ - Blame Game</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/7/The_Furious_and_the_Fast\"\
\ debug=\"72625\">Dallas (2012) - 02x07 - The Furious and the Fast</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/8/J.R.%27s_Masterpiece\" debug=\"72969\">Dallas\
\ (2012) - 02x08 - J.R.'s Masterpiece</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/9/Ewings_Unite%21\"\
\ debug=\"73242\">Dallas (2012) - 02x09 - Ewings Unite!</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/10/Guilt_And_Innocence\" debug=\"73578\">Dallas\
\ (2012) - 02x10 - Guilt And Innocence</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/11/Let_Me_In\"\
\ debug=\"73846\">Dallas (2012) - 02x11 - Let Me In</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/12/A_Call_to_Arms\" debug=\"74098\">Dallas (2012)\
\ - 02x12 - A Call to Arms</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/13/Love_%40_Family\" debug=\"\
74099\">Dallas (2012) - 02x13 - Love & Family</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/14/Guilt_By_Association\" debug=\"74342\">Dallas\
\ (2012) - 02x14 - Guilt By Association</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/15/Legacies\"\
\ debug=\"74347\">Dallas (2012) - 02x15 - Legacies</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/1/The_Return\" debug=\"84652\">Dallas (2012) - 03x01\
\ - The Return</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/2/Trust_Me\" debug=\"84941\"\
>Dallas (2012) - 03x02 - Trust Me</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/3/Playing_Chicken\" debug=\"\
85388\">Dallas (2012) - 03x03 - Playing Chicken</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/4/Lifting_the_Veil\" debug=\"85735\">Dallas (2012)\
\ - 03x04 - Lifting the Veil</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/5/D.T.R.\" debug=\"86033\"\
>Dallas (2012) - 03x05 - D.T.R.</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/6/Like_Father%2C_Like_Son\"\
\ debug=\"86406\">Dallas (2012) - 03x06 - Like Father, Like Son</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/7/Like_a_Bad_Penny\" debug=\"86664\">Dallas (2012)\
\ - 03x07 - Like a Bad Penny</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/8/Where_There%27s_Smoke\"\
\ debug=\"86948\">Dallas (2012) - 03x08 - Where There's Smoke</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/9/Denial%2C_Anger%2C_Acceptance\" debug=\"91222\"\
>Dallas (2012) - 03x09 - Denial, Anger, Acceptance</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/10/Dead_Reckoning\" debug=\"91469\">Dallas (2012)\
\ - 03x10 - Dead Reckoning</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/11/Hurt\" debug=\"91634\"\
>Dallas (2012) - 03x11 - Hurt</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/12/Victims_of_Love\" debug=\"\
91837\">Dallas (2012) - 03x12 - Victims of Love</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/13/Boxed_In\" debug=\"91959\">Dallas (2012) - 03x13\
\ - Boxed In</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/14/Endgame\" debug=\"92148\"\
>Dallas (2012) - 03x14 - Endgame</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/15/Brave_New_World\" debug=\"\
92160\">Dallas (2012) - 03x15 - Brave New World</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/film.png\" /></td><td><a href=\"movie/82717\"\
\ debug=\"82717\">Dallas Buyers Club (2013)</a></td></tr><tr><p>\n<p>\n</table>\n\
</td>\n <td></td>\n </tr>\n <tr> <!--\
\ table footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n\
\ </table>\n </div>\n<!-- AdskeeperComposite Start -->\n<div id=\"\
AdskeeperScriptRootC23244\">\n <div id=\"AdskeeperPreloadC23244\">\n \
\ <a id=\"mg_add23244\" href=\"\" target=\"_blank\">Place your ad\
\ here</a><br> <a href=\"http://adskeeper.co.uk/\" target=\"_blank\"\
>Loading...</a> \n </div>\n <script>\n\
\ window.MGWidgetTitle23244 = \"Promoted\
\ Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
AdskeeperScriptRootC23244\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"AdskeeperScriptRootC23244\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=23244;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.adskeeper.co.uk/a/d/addic7ed.com.23244.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- AdskeeperComposite\
\ End -->\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td class=\"\
NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body></html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:23 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=sejdbmcf4iiv1ikc9pmv4nma52; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,704 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://www.addic7ed.com/search.php?search=Grey+s+Anatomy&Submit=Search
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
\ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"\
http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\"\
\ content=\"text/html; charset=utf-8\" />\n<title>\nSearch \"Grey s Anatomy\"\
\ Subtitle Download - Addic7ed.com - For all those TV Series Addic7s: Subtitles,\
\ Tv Series and Movies Talk, Forum and more -</title>\n<link href=\"http://www.addic7ed.com/css/wikisubtitles.css\"\
\ rel=\"stylesheet\" title=\"default\" type=\"text/css\" />\n<link rel=\"\
SHORTCUT ICON\" href=\"favicon.ico\" /> \n<script type=\"text/javascript\"\
\ src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n\
<body>\n<center><br />\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a\
\ href=\"/\"><img height=\"200\" width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\"\
\ border=\"0\" title=\"Addic7ed.com - Quality Subtitles for TV Shows and\
\ movies\" alt=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\"\
\ /></a></td>\n</tr>\n<tr><td align=\"center\" colspan=\"2\">\n<h1><small>Download\
\ free subtitles for TV Shows and Movies.</small>&nbsp; \n<select name=\"\
applang\" class=\"inputCool\" onchange=\"changeAppLang();\" id=\"comboLang\"\
><option value=\"ar\">Arabic</option><option value=\"ca\">Catala</option><option\
\ selected=\"selected\" value=\"en\">English</option><option value=\"eu\"\
>Euskera</option><option value=\"fr\">French</option><option value=\"ga\"\
>Galician</option><option value=\"de\">German</option><option value=\"gr\"\
>Greek</option><option value=\"hu\">Hungarian</option><option value=\"it\"\
>Italian</option><option value=\"fa\">Persian</option><option value=\"pl\"\
>Polish</option><option value=\"pt\">Portuguese</option><option value=\"br\"\
>Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\
\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"\
medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\" target=\"\
_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start\
\ -->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\"\
>\n <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"\
\ target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"\
\ target=\"_blank\">Loading...</a> \n </div>\n \
\ <script>\n window.MGWidgetTitle13385\
\ = \"Promoted Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
MarketGidScriptRootC13385\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- MarketGidComposite\
\ End -->\n\n<script data-cfasync=false src=\"//s.ato.mx/p.js#id=7869&type=popunder&cap=1:24\"\
></script>\n</center><br />\n\n<div id=\"container\"> \n \t<table class=\"\
tabel70\" border=\"0\">\n \t<tr> <!-- table header -->\n \
\ \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/tr.gif\" /></td>\n </tr>\n\
\ <tr>\n \t<td></td>\n <td>\n<form action=\"\
/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"\
\ type=\"text\" id=\"search\" size=\"50\" value=\"Grey s Anatomy\" class=\"\
inputCool\"/>&nbsp;\n <input name=\"Submit\" type=\"submit\" class=\"coolBoton\"\
\ value=\"Search\" /></form><br />\n\n<b>Over <b><b>200 results found</b>\
\ </div><br />\n\n<br />\n\t<center>\n\n</center>\n<br />\n<center>&nbsp;&nbsp;<img\
\ src=\"http://www.addic7ed.com/images/database.png\" /> <span class=\"titulo\"\
>\nAre you looking for <a href=\"/show/30\" >Show <i>Grey's Anatomy</i></a>&nbsp;?</span></center><br\
\ /><br />\n\n<table class=\"tabel\" align=\"center\" width=\"80%\" border=\"\
0\">\n<tr><td><img src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a\
\ href=\"serie/Grey%27s_Anatomy/1/2/The_first_cut_is_the_deepest\" debug=\"\
3319\">Grey's Anatomy - 01x02 - The first cut is the deepest</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/1/3/Winning_a_battle_losing_the_war\" debug=\"3320\"\
>Grey's Anatomy - 01x03 - Winning a battle losing the war</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/1/4/No_man%27s_land\" debug=\"3322\">Grey's Anatomy\
\ - 01x04 - No man's land</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/1/5/Shake_your_groove_thing\"\
\ debug=\"3323\">Grey's Anatomy - 01x05 - Shake your groove thing</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/1/6/If_tomorrow_never_comes\" debug=\"3324\">Grey's\
\ Anatomy - 01x06 - If tomorrow never comes</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/1/7/The_self_destruction_button\" debug=\"3325\">Grey's\
\ Anatomy - 01x07 - The self destruction button</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/1/8/Save_me\" debug=\"3326\">Grey's Anatomy - 01x08\
\ - Save me</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/1/9/Who%27s_zoomin%27_who\"\
\ debug=\"3329\">Grey's Anatomy - 01x09 - Who's zoomin' who</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/1/Raindrops_keep_falling_on_my_head\" debug=\"3274\"\
>Grey's Anatomy - 02x01 - Raindrops keep falling on my head</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/2/Enough_is_enough_%28no_more_tears%29\" debug=\"\
3275\">Grey's Anatomy - 02x02 - Enough is enough (no more tears)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/3/Make_me_lose_control\" debug=\"3276\">Grey's Anatomy\
\ - 02x03 - Make me lose control</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/4/Deny%2C_deny%2C_deny\" debug=\"\
3277\">Grey's Anatomy - 02x04 - Deny, deny, deny</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/5/Bring_the_pain\" debug=\"3278\">Grey's Anatomy\
\ - 02x05 - Bring the pain</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/6/Into_you_like_a_train\"\
\ debug=\"3279\">Grey's Anatomy - 02x06 - Into you like a train</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/7/Something_to_talk_about\" debug=\"3281\">Grey's\
\ Anatomy - 02x07 - Something to talk about</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/8/Let_it_be\" debug=\"3282\">Grey's Anatomy - 02x08\
\ - Let it be</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/9/Thanks_for_the_memories\"\
\ debug=\"3283\">Grey's Anatomy - 02x09 - Thanks for the memories</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/10/Much_too_much\" debug=\"3284\">Grey's Anatomy\
\ - 02x10 - Much too much</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/11/Owner_of_a_lonely_heart\"\
\ debug=\"3285\">Grey's Anatomy - 02x11 - Owner of a lonely heart</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/12/Grandma_got_run_over_by_a_reindeer\" debug=\"\
3286\">Grey's Anatomy - 02x12 - Grandma got run over by a reindeer</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/13/Begin_the_begin\" debug=\"3287\">Grey's Anatomy\
\ - 02x13 - Begin the begin</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/14/Tell_me_sweet_little_lies\"\
\ debug=\"3288\">Grey's Anatomy - 02x14 - Tell me sweet little lies</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/15/Break_on_through\" debug=\"3289\">Grey's Anatomy\
\ - 02x15 - Break on through</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/16/It%27s_the_end_of_the_world\"\
\ debug=\"3290\">Grey's Anatomy - 02x16 - It's the end of the world</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/17/As_we_know_it\" debug=\"3291\">Grey's Anatomy\
\ - 02x17 - As we know it</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/18/Yesterday\" debug=\"3292\"\
>Grey's Anatomy - 02x18 - Yesterday</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/19/What_have_I_done_to_deserve_this%3F\"\
\ debug=\"3293\">Grey's Anatomy - 02x19 - What have I done to deserve this?</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/21/Superstition\" debug=\"3295\">Grey's Anatomy -\
\ 02x21 - Superstition</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/22/The_name_of_the_game\"\
\ debug=\"3296\">Grey's Anatomy - 02x22 - The name of the game</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/23/Blues_for_sister_someone\" debug=\"3297\">Grey's\
\ Anatomy - 02x23 - Blues for sister someone</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/24/Damage_case\" debug=\"3298\">Grey's Anatomy -\
\ 02x24 - Damage case</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/25/17_seconds\" debug=\"3300\"\
>Grey's Anatomy - 02x25 - 17 seconds</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/2/26/Deterioration_of_the_fight_or_flight_response\"\
\ debug=\"3301\">Grey's Anatomy - 02x26 - Deterioration of the fight or flight\
\ response</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/2/27/Losing_my_religion\" debug=\"\
3302\">Grey's Anatomy - 02x27 - Losing my religion</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/1/Time_has_come_today\" debug=\"397\">Grey's Anatomy\
\ - 03x01 - Time has come today</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/2/I_am_a_tree\" debug=\"398\"\
>Grey's Anatomy - 03x02 - I am a tree</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/3/3/Sometimes_a_fantasy\"\
\ debug=\"399\">Grey's Anatomy - 03x03 - Sometimes a fantasy</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/4/What_I_am\" debug=\"400\">Grey's Anatomy - 03x04\
\ - What I am</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/5/Oh%2C_the_guilt\" debug=\"\
401\">Grey's Anatomy - 03x05 - Oh, the guilt</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/6/Let_the_angels_commit\" debug=\"402\">Grey's Anatomy\
\ - 03x06 - Let the angels commit</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/7/Where_the_boys_are\" debug=\"\
403\">Grey's Anatomy - 03x07 - Where the boys are</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/8/Staring_at_the_sun\" debug=\"404\">Grey's Anatomy\
\ - 03x08 - Staring at the sun</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/9/From_a_whisper_to_a_scream\"\
\ debug=\"405\">Grey's Anatomy - 03x09 - From a whisper to a scream</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/10/Don%27t_stand_so_close_to_me\" debug=\"406\">Grey's\
\ Anatomy - 03x10 - Don't stand so close to me</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/11/Six_days_%28I%29\" debug=\"407\">Grey's Anatomy\
\ - 03x11 - Six days (I)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/12/Six_days_%28II%29\" debug=\"\
408\">Grey's Anatomy - 03x12 - Six days (II)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/13/Great_expectations\" debug=\"409\">Grey's Anatomy\
\ - 03x13 - Great expectations</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/14/Wishin%27_and_hopin%27\"\
\ debug=\"410\">Grey's Anatomy - 03x14 - Wishin' and hopin'</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/15/Walk_on_water\" debug=\"411\">Grey's Anatomy -\
\ 03x15 - Walk on water</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/16/Drowning_on_dry_land\"\
\ debug=\"412\">Grey's Anatomy - 03x16 - Drowning on dry land</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/17/Some_kind_of_miracle\" debug=\"413\">Grey's Anatomy\
\ - 03x17 - Some kind of miracle</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/18/Scars_and_souvenirs\" debug=\"\
414\">Grey's Anatomy - 03x18 - Scars and souvenirs</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/19/My_favorite_mistake\" debug=\"415\">Grey's Anatomy\
\ - 03x19 - My favorite mistake</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/20/Time_after_time\" debug=\"\
723\">Grey's Anatomy - 03x20 - Time after time</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/21/Desire\" debug=\"778\">Grey's Anatomy - 03x21\
\ - Desire</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/22/The_other_side_of_this_life_%28part_1%29\"\
\ debug=\"822\">Grey's Anatomy - 03x22 - The other side of this life (part\
\ 1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/23/The_other_side_of_this_life_%28part_2%29\"\
\ debug=\"823\">Grey's Anatomy - 03x23 - The other side of this life (part\
\ 2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/3/25/Didn%27t_we_almost_have_it_all%3F\"\
\ debug=\"1064\">Grey's Anatomy - 03x25 - Didn't we almost have it all?</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/0/Come_rain_or_come_shine%3A_From_Grey%27s_Anatomy_to_Private_Practice\"\
\ debug=\"6479\">Grey's Anatomy - 04x00 - Come rain or come shine: From Grey's\
\ Anatomy to Private Practice</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/4/1/A_change_is_gonna_come\"\
\ debug=\"2374\">Grey's Anatomy - 04x01 - A change is gonna come</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/3/Sometimes_a_fantasy\" debug=\"2587\">Grey's Anatomy\
\ - 04x03 - Sometimes a fantasy</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/4/4/The_heart_of_the_matter\"\
\ debug=\"2807\">Grey's Anatomy - 04x04 - The heart of the matter</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/5/Haunt_you_everyday\" debug=\"2942\">Grey's Anatomy\
\ - 04x05 - Haunt you everyday</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/4/6/Kung_fu_fighting\" debug=\"\
3077\">Grey's Anatomy - 04x06 - Kung fu fighting</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/7/Physical_attraction..._chemical_reaction\" debug=\"\
3234\">Grey's Anatomy - 04x07 - Physical attraction... chemical reaction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/8/Forever_young\" debug=\"3492\">Grey's Anatomy -\
\ 04x08 - Forever young</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/4/9/Crash_into_me_%28Part_1%29\"\
\ debug=\"3810\">Grey's Anatomy - 04x09 - Crash into me (Part 1)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/10/Crash_into_me_%28Part_2%29\" debug=\"4390\">Grey's\
\ Anatomy - 04x10 - Crash into me (Part 2)</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/4/11/Lay_your_hands_on_me\"\
\ debug=\"5798\">Grey's Anatomy - 04x11 - Lay your hands on me</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/12/Where_The_Wild_Things_Are\" debug=\"8585\">Grey's\
\ Anatomy - 04x12 - Where The Wild Things Are</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/13/Piece_of_My_Heart\" debug=\"8741\">Grey's Anatomy\
\ - 04x13 - Piece of My Heart</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/4/14/The_Becoming\" debug=\"\
8856\">Grey's Anatomy - 04x14 - The Becoming</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/15/Losing_My_Mind\" debug=\"9078\">Grey's Anatomy\
\ - 04x15 - Losing My Mind</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/10/19/I%27m_Winning\" debug=\"\
86778\">Grey's Anatomy - 10x19 - I'm Winning</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/10/20/Go_It_Alone\" debug=\"87067\">Grey's Anatomy\
\ - 10x20 - Go It Alone</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/10/21/Change_of_Heart\" debug=\"\
87427\">Grey's Anatomy - 10x21 - Change of Heart</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/10/22/We_Are_Never_Ever_Getting_Back_Together\" debug=\"\
87737\">Grey's Anatomy - 10x22 - We Are Never Ever Getting Back Together</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/10/23/Everything_I_Try_to_Do%2C_Nothing_Seems_to_Turn_Out_Right\"\
\ debug=\"87969\">Grey's Anatomy - 10x23 - Everything I Try to Do, Nothing\
\ Seems to Turn Out Right</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/10/24/Fear_%28of_the_Unknown%29\"\
\ debug=\"88200\">Grey's Anatomy - 10x24 - Fear (of the Unknown)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/1/I_Must_Have_Lost_It_on_the_Wind\" debug=\"92229\"\
>Grey's Anatomy - 11x01 - I Must Have Lost It on the Wind</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/2/Puzzle_With_a_Piece_Missing\" debug=\"92449\"\
>Grey's Anatomy - 11x02 - Puzzle With a Piece Missing</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/3/Got_To_Be_Real\" debug=\"92639\">Grey's Anatomy\
\ - 11x03 - Got To Be Real</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/11/4/Only_Mama_Knows\" debug=\"\
92884\">Grey's Anatomy - 11x04 - Only Mama Knows</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/5/Bend_and_Break\" debug=\"93163\">Grey's Anatomy\
\ - 11x05 - Bend and Break</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/11/6/Don%27t_Let%27s_Start\"\
\ debug=\"93580\">Grey's Anatomy - 11x06 - Don't Let's Start</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/7/Could_We_Start_Again%2C_Please\" debug=\"93851\"\
>Grey's Anatomy - 11x07 - Could We Start Again, Please</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/8/Risk\" debug=\"94097\">Grey's Anatomy - 11x08\
\ - Risk</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/11/9/Where_Do_We_Go_From_Here\"\
\ debug=\"96403\">Grey's Anatomy - 11x09 - Where Do We Go From Here</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/10/The_Bed%27s_Too_Big_Without_You\" debug=\"96670\"\
>Grey's Anatomy - 11x10 - The Bed's Too Big Without You</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/11/All_I_Could_Do_Was_Cry\" debug=\"96983\">Grey's\
\ Anatomy - 11x11 - All I Could Do Was Cry</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/11/12/The_Great_Pretender\"\
\ debug=\"97330\">Grey's Anatomy - 11x12 - The Great Pretender</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/13/Staring_at_the_End\" debug=\"97621\">Grey's Anatomy\
\ - 11x13 - Staring at the End</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/11/14/The_Distance\" debug=\"\
97880\">Grey's Anatomy - 11x14 - The Distance</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/15/I_Feel_the_Earth_Move\" debug=\"98204\">Grey's\
\ Anatomy - 11x15 - I Feel the Earth Move</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/11/16/Don%27t_Dream_It%27s_Over\"\
\ debug=\"98464\">Grey's Anatomy - 11x16 - Don't Dream It's Over</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/17/With_or_Without_You\" debug=\"98780\">Grey's\
\ Anatomy - 11x17 - With or Without You</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/11/18/When_I_Grow_Up\"\
\ debug=\"99029\">Grey's Anatomy - 11x18 - When I Grow Up</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/19/Crazy_Love\" debug=\"99326\">Grey's Anatomy -\
\ 11x19 - Crazy Love</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/11/20/One_Flight_Down\" debug=\"\
99621\">Grey's Anatomy - 11x20 - One Flight Down</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/21/How_to_Save_a_Life\" debug=\"99850\">Grey's Anatomy\
\ - 11x21 - How to Save a Life</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/11/22/She%27s_Leaving_Home\"\
\ debug=\"100099\">Grey's Anatomy - 11x22 - She's Leaving Home</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/11/23/Time_Stops\" debug=\"100428\">Grey's Anatomy\
\ - 11x23 - Time Stops</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/11/24/You%27re_My_Home\" debug=\"\
100708\">Grey's Anatomy - 11x24 - You're My Home</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/12/1/Sledgehammer\" debug=\"104266\">Grey's Anatomy\
\ - 12x01 - Sledgehammer</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/12/2/Walking_Tall\" debug=\"\
104484\">Grey's Anatomy - 12x02 - Walking Tall</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/12/3/I_Choose_You\" debug=\"104737\">Grey's Anatomy\
\ - 12x03 - I Choose You</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/12/4/Old_Time_Rock_and_Roll\"\
\ debug=\"104995\">Grey's Anatomy - 12x04 - Old Time Rock and Roll</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/12/5/Guess_Who%E2%80%99s_Coming_to_Dinner\" debug=\"\
105233\">Grey's Anatomy - 12x05 - Guess Who\u2019s Coming to Dinner</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/0/\" debug=\"673\">Grey's Anatomy - Special Every\
\ Moment Counts</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/1/1/A_Hard_Day%27s_Night\" debug=\"\
3317\">Greys Anatomy - 01x01 - A Hard Day's Night</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/0/Special_Recap_Straight_To_The_Heart\" debug=\"\
57939\">Greys Anatomy - 02x00 - Special Recap Straight To The Heart</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/2/20/Band_Aid_Covers_The_Bullet_Hole\" debug=\"3294\"\
>Greys Anatomy - 02x20 - Band Aid Covers The Bullet Hole</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/3/24/Testing_1_2_3\" debug=\"943\">Greys Anatomy -\
\ 03x24 - Testing 1 2 3</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/4/2/Love_Addiction\" debug=\"\
2455\">Greys Anatomy - 04x02 - Love Addiction</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/4/16/Freedom\" debug=\"14983\">Greys Anatomy - 04x16\
\ - Freedom</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/4/17/Freedom\" debug=\"14981\"\
>Greys Anatomy - 04x17 - Freedom</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/1/Dream_a_Little_Dream_of_Me\"\
\ debug=\"9530\">Greys Anatomy - 05x01 - Dream a Little Dream of Me</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/2/Dream_a_Little_Dream_of_Me_%282%29\" debug=\"9531\"\
>Greys Anatomy - 05x02 - Dream a Little Dream of Me (2)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/3/Here_Comes_The_Flood\" debug=\"9532\">Greys Anatomy\
\ - 05x03 - Here Comes The Flood</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/4/Brave_New_World\" debug=\"\
9533\">Greys Anatomy - 05x04 - Brave New World</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/5/There_s_No_I_In_Team\" debug=\"9534\">Greys Anatomy\
\ - 05x05 - There s No I In Team</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/6/Life_During_Wartime\" debug=\"\
9535\">Greys Anatomy - 05x06 - Life During Wartime</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/7/Rise_Up\" debug=\"9536\">Greys Anatomy - 05x07\
\ - Rise Up</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/8/These_Ties_That_Bind\" debug=\"\
9537\">Greys Anatomy - 05x08 - These Ties That Bind</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/9/In_the_Midnight_Hour\" debug=\"9538\">Greys Anatomy\
\ - 05x09 - In the Midnight Hour</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/10/All_By_Myself\" debug=\"\
9539\">Greys Anatomy - 05x10 - All By Myself</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/11/Wish_You_Were_Here\" debug=\"9540\">Greys Anatomy\
\ - 05x11 - Wish You Were Here</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/12/Sympathy_For_The_Devil\"\
\ debug=\"9541\">Greys Anatomy - 05x12 - Sympathy For The Devil</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/13/Stairway_To_Heaven\" debug=\"9799\">Greys Anatomy\
\ - 05x13 - Stairway To Heaven</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/14/Beat_Your_Heart_Out\" debug=\"\
10598\">Greys Anatomy - 05x14 - Beat Your Heart Out</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/15/Before_and_After\" debug=\"10696\">Greys Anatomy\
\ - 05x15 - Before and After</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/16/An_Honest_Mistake\" debug=\"\
10916\">Greys Anatomy - 05x16 - An Honest Mistake</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/17/I_Will_Follow_You_Into_The_Dark\" debug=\"11385\"\
>Greys Anatomy - 05x17 - I Will Follow You Into The Dark</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/18/Stand_By_Me\" debug=\"11574\">Greys Anatomy -\
\ 05x18 - Stand By Me</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/19/Elevator_Love_Letter\"\
\ debug=\"11720\">Greys Anatomy - 05x19 - Elevator Love Letter</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/20/Sweet_Surrender\" debug=\"12120\">Greys Anatomy\
\ - 05x20 - Sweet Surrender</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/5/21/No_Good_At_Saying_Sorry\"\
\ debug=\"12187\">Greys Anatomy - 05x21 - No Good At Saying Sorry</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/22/What_A_Difference_A_Day_Makes\" debug=\"12604\"\
>Greys Anatomy - 05x22 - What A Difference A Day Makes</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/5/23/Here_s_to_Future_Days\" debug=\"12815\">Greys\
\ Anatomy - 05x23 - Here s to Future Days</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/5/24/Now_or_Never\"\
\ debug=\"19654\">Greys Anatomy - 05x24 - Now or Never</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/1/Good_Mourning\" debug=\"20730\">Greys Anatomy -\
\ 06x01 - Good Mourning</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/2/Goodbye\" debug=\"20734\"\
>Greys Anatomy - 06x02 - Goodbye</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/3/I_Always_Feel_Like_Somebody%27s_Watchin%27_Me\"\
\ debug=\"20845\">Greys Anatomy - 06x03 - I Always Feel Like Somebody's Watchin'\
\ Me</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/4/Tainted_Obligation\" debug=\"\
21278\">Greys Anatomy - 06x04 - Tainted Obligation</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/5/Invasion\" debug=\"21821\">Greys Anatomy - 06x05\
\ - Invasion</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/6/I_Saw_What_I_Saw\" debug=\"\
22077\">Greys Anatomy - 06x06 - I Saw What I Saw</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/7/Give_Peace_a_Chance\" debug=\"22186\">Greys Anatomy\
\ - 06x07 - Give Peace a Chance</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/8/Invest_In_Love\" debug=\"\
22372\">Greys Anatomy - 06x08 - Invest In Love</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/9/New_History\" debug=\"22551\">Greys Anatomy - 06x09\
\ - New History</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/10/Holidaze\" debug=\"22987\"\
>Greys Anatomy - 06x10 - Holidaze</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/11/Blink\" debug=\"24025\"\
>Greys Anatomy - 06x11 - Blink</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/12/I_Like_You_So_Much_Better_When_You%27re_Naked\"\
\ debug=\"24149\">Greys Anatomy - 06x12 - I Like You So Much Better When You're\
\ Naked</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/13/State_of_Love_and_Trust\"\
\ debug=\"24356\">Greys Anatomy - 06x13 - State of Love and Trust</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/14/Valentine%27s_Day_Massacre\" debug=\"24357\">Greys\
\ Anatomy - 06x14 - Valentine's Day Massacre</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/15/The_Time_Warp\" debug=\"24358\">Greys Anatomy\
\ - 06x15 - The Time Warp</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/16/Perfect_Little_Accident\"\
\ debug=\"24360\">Greys Anatomy - 06x16 - Perfect Little Accident</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/17/Push\" debug=\"24361\">Greys Anatomy - 06x17 -\
\ Push</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/18/Suicide_Is_Painless\" debug=\"\
24363\">Greys Anatomy - 06x18 - Suicide Is Painless</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/19/Sympathy_for_the_Parents\" debug=\"24364\">Greys\
\ Anatomy - 06x19 - Sympathy for the Parents</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/20/Hook%2C_Line_and_Sinner\" debug=\"26829\">Greys\
\ Anatomy - 06x20 - Hook, Line and Sinner</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/6/21/How_Insensitive\"\
\ debug=\"27124\">Greys Anatomy - 06x21 - How Insensitive</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/6/22/Shiny_Happy_People\" debug=\"27440\">Greys Anatomy\
\ - 06x22 - Shiny Happy People</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/23/Sanctuary\" debug=\"27642\"\
>Greys Anatomy - 06x23 - Sanctuary</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/6/24/Death_and_All_His_Friends\"\
\ debug=\"27643\">Greys Anatomy - 06x24 - Death and All His Friends</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/1/With_You_I%27m_Born_Again\" debug=\"32691\">Greys\
\ Anatomy - 07x01 - With You I'm Born Again</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/2/Shock_to_the_System\" debug=\"33409\">Greys Anatomy\
\ - 07x02 - Shock to the System</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/3/Superfreak\" debug=\"33724\"\
>Greys Anatomy - 07x03 - Superfreak</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/4/Can%27t_Fight_Biology\"\
\ debug=\"33951\">Greys Anatomy - 07x04 - Can't Fight Biology</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/5/Almost_Grown\" debug=\"34333\">Greys Anatomy -\
\ 07x05 - Almost Grown</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/6/These_Arms_of_Mine\" debug=\"\
34547\">Greys Anatomy - 07x06 - These Arms of Mine</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/7/That%27s_me_Trying\" debug=\"34806\">Greys Anatomy\
\ - 07x07 - That's me Trying</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/8/Something%27s_Gotta_Give\"\
\ debug=\"35082\">Greys Anatomy - 07x08 - Something's Gotta Give</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/9/Slow_night%2C_so_long\" debug=\"35409\">Greys Anatomy\
\ - 07x09 - Slow night, so long</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/10/Adrift_and_at_Peace\" debug=\"\
36178\">Greys Anatomy - 07x10 - Adrift and at Peace</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/11/Disarm\" debug=\"37827\">Greys Anatomy - 07x11\
\ - Disarm</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/12/Start_Me_Up\" debug=\"\
38194\">Greys Anatomy - 07x12 - Start Me Up</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/13/Don%27t_Deceive_Me_%28Please_Don%27t_Go%29\" debug=\"\
39294\">Greys Anatomy - 07x13 - Don't Deceive Me (Please Don't Go)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/14/P.Y.T._%28Pretty_Young_Thing%29\" debug=\"39718\"\
>Greys Anatomy - 07x14 - P.Y.T. (Pretty Young Thing)</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/15/Golden_Hour\" debug=\"40076\">Greys Anatomy -\
\ 07x15 - Golden Hour</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/16/Not_Responsible\" debug=\"\
40384\">Greys Anatomy - 07x16 - Not Responsible</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/17/This_Is_How_We_Do_It\" debug=\"41874\">Greys Anatomy\
\ - 07x17 - This Is How We Do It</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/18/Song_Beneath_the_Song\"\
\ debug=\"42165\">Greys Anatomy - 07x18 - Song Beneath the Song</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/19/It%27s_A_Long_Way_Back\" debug=\"43554\">Greys\
\ Anatomy - 07x19 - It's A Long Way Back</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/7/20/White_Wedding\"\
\ debug=\"43984\">Greys Anatomy - 07x20 - White Wedding</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/7/21/I_Will_Survive\" debug=\"44315\">Greys Anatomy\
\ - 07x21 - I Will Survive</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/7/22/Unaccompanied_Minor\" debug=\"\
45220\">Greys Anatomy - 07x22 - Unaccompanied Minor</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/1/Free_Falling_and_She%27s_Gone\" debug=\"50161\"\
>Greys Anatomy - 08x01 - Free Falling and She's Gone</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/2/She%27s_Gone\" debug=\"50165\">Greys Anatomy -\
\ 08x02 - She's Gone</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/8/3/Take_the_Lead\" debug=\"\
50493\">Greys Anatomy - 08x03 - Take the Lead</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/4/What_Is_It_About_Men\" debug=\"50820\">Greys Anatomy\
\ - 08x04 - What Is It About Men</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/8/5/Love%2C_Loss_and_Legacy\"\
\ debug=\"51303\">Greys Anatomy - 08x05 - Love, Loss and Legacy</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/6/Poker_Face\" debug=\"52562\">Greys Anatomy - 08x06\
\ - Poker Face</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/8/7/Put_Me_In%2C_Coach\" debug=\"\
53639\">Greys Anatomy - 08x07 - Put Me In, Coach</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/8/Heart_Shaped_Box\" debug=\"54497\">Greys Anatomy\
\ - 08x08 - Heart Shaped Box</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/8/9/Dark_Was_the_Night\" debug=\"\
54975\">Greys Anatomy - 08x09 - Dark Was the Night</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/10/Suddenly\" debug=\"58595\">Greys Anatomy - 08x10\
\ - Suddenly</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Grey%27s_Anatomy/8/11/This_Magic_Moment\" debug=\"\
58830\">Greys Anatomy - 08x11 - This Magic Moment</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/12/Hope_For_The_Hopeless\" debug=\"59022\">Greys\
\ Anatomy - 08x12 - Hope For The Hopeless</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Grey%27s_Anatomy/8/13/If%2C_Then\"\
\ debug=\"59416\">Greys Anatomy - 08x13 - If, Then</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Grey%27s_Anatomy/8/14/All_You_Need_Is_Love\" debug=\"59675\">Greys Anatomy\
\ - 08x14 - All You Need Is Love</a></td></tr><tr><p>\n<p>\n</table>\n</td>\n\
\ <td></td>\n </tr>\n <tr> <!-- table\
\ footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n\
\ </table>\n </div>\n<!-- AdskeeperComposite Start -->\n<div id=\"\
AdskeeperScriptRootC23244\">\n <div id=\"AdskeeperPreloadC23244\">\n \
\ <a id=\"mg_add23244\" href=\"\" target=\"_blank\">Place your ad\
\ here</a><br> <a href=\"http://adskeeper.co.uk/\" target=\"_blank\"\
>Loading...</a> \n </div>\n <script>\n\
\ window.MGWidgetTitle23244 = \"Promoted\
\ Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
AdskeeperScriptRootC23244\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"AdskeeperScriptRootC23244\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=23244;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.adskeeper.co.uk/a/d/addic7ed.com.23244.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- AdskeeperComposite\
\ End -->\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td class=\"\
NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body></html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:26 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=sk6d26tm76rqcrmi22ho89kiu6; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,287 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://www.addic7ed.com/search.php?search=Dallas+2012&Submit=Search
response:
body: {string: !!python/unicode "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0\
\ Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\
>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"\
Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch \"\
Dallas 2012\" Subtitle Download - Addic7ed.com - For all those TV Series Addic7s:\
\ Subtitles, Tv Series and Movies Talk, Forum and more -</title>\n<link href=\"\
http://www.addic7ed.com/css/wikisubtitles.css\" rel=\"stylesheet\" title=\"\
default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"\
\ /> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"\
></script>\n\n</head>\n<body>\n<center><br />\n<table border=\"0\">\n<tr>\n\
\ <td rowspan=\"9\"><a href=\"/\"><img height=\"200\" width=\"350\" src=\"\
http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\" title=\"\
Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com\
\ - Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td\
\ align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for\
\ TV Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"\
\ onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option\
\ value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option\
\ value=\"eu\">Euskera</option><option value=\"fr\">French</option><option\
\ value=\"ga\">Galician</option><option value=\"de\">German</option><option\
\ value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option\
\ value=\"it\">Italian</option><option value=\"fa\">Persian</option><option\
\ value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option\
\ value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option\
\ value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option\
\ value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"\
center\" colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"\
button white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\
\t\t\t </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"\
medium\"></g:plusone>\n <a href=\"http://twitter.com/addic7ed\" target=\"\
_blank\"><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\"\
\ alt=\"Twitter\" border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"\
><img width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"\
\ alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\"\
>\n\n </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"\
\ scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden;\
\ width:80px; height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n\
\ </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if lt IE 7]>\n <style type=\"\
text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)\
\ }\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start\
\ -->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\"\
>\n <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"\
\ target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"\
\ target=\"_blank\">Loading...</a> \n </div>\n \
\ <script>\n window.MGWidgetTitle13385\
\ = \"Promoted Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
MarketGidScriptRootC13385\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- MarketGidComposite\
\ End -->\n\n<script data-cfasync=false src=\"//s.ato.mx/p.js#id=7869&type=popunder&cap=1:24\"\
></script>\n</center><br />\n\n<div id=\"container\"> \n \t<table class=\"\
tabel70\" border=\"0\">\n \t<tr> <!-- table header -->\n \
\ \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tl.gif\"\
\ /></td>\n <td></td>\n <td class=\"tablecorner\"\
><img src=\"http://www.addic7ed.com/images/tr.gif\" /></td>\n </tr>\n\
\ <tr>\n \t<td></td>\n <td>\n<form action=\"\
/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"\
\ type=\"text\" id=\"search\" size=\"50\" value=\"Dallas 2012\" class=\"inputCool\"\
/>&nbsp;\n <input name=\"Submit\" type=\"submit\" class=\"coolBoton\" value=\"\
Search\" /></form><br />\n\n<b>40 results found</b> </div><br />\n\n<br />\n\
\t<center>\n\n</center>\n<br />\n<center>&nbsp;&nbsp;<img src=\"http://www.addic7ed.com/images/database.png\"\
\ /> <span class=\"titulo\">\nAre you looking for <a href=\"/show/2559\"\
\ >Show <i>Dallas (2012)</i></a>&nbsp;?</span></center><br /><br />\n\n<table\
\ class=\"tabel\" align=\"center\" width=\"80%\" border=\"0\">\n<tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/1/Changing_of_the_Guard\" debug=\"63362\">Dallas\
\ (2012) - 01x01 - Changing of the Guard</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/2/Hedging_Your_Bets\"\
\ debug=\"63364\">Dallas (2012) - 01x02 - Hedging Your Bets</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/3/The_Price_You_Pay\" debug=\"63827\">Dallas (2012)\
\ - 01x03 - The Price You Pay</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/1/4/The_Last_Hurrah\" debug=\"\
63994\">Dallas (2012) - 01x04 - The Last Hurrah</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/5/Truth_and_consequences\" debug=\"64210\">Dallas\
\ (2012) - 01x05 - Truth and consequences</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/6/The_Enemy_of_My_Enemy\"\
\ debug=\"64512\">Dallas (2012) - 01x06 - The Enemy of My Enemy</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/7/Collateral_Damage\" debug=\"64686\">Dallas (2012)\
\ - 01x07 - Collateral Damage</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/1/8/No_Good_Deed\" debug=\"\
64933\">Dallas (2012) - 01x08 - No Good Deed</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/1/9/Family_Business\" debug=\"65100\">Dallas (2012)\
\ - 01x09 - Family Business</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/1/10/Revelations\" debug=\"\
65276\">Dallas (2012) - 01x10 - Revelations</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/1/Battle_Lines\" debug=\"71069\">Dallas (2012) -\
\ 02x01 - Battle Lines</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/2/Venomous_Creatures\" debug=\"\
71070\">Dallas (2012) - 02x02 - Venomous Creatures</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/3/Sins_of_the_Father\" debug=\"71358\">Dallas (2012)\
\ - 02x03 - Sins of the Father</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/4/False_Confessions\" debug=\"\
71644\">Dallas (2012) - 02x04 - False Confessions</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/5/Trial_and_Error\" debug=\"71949\">Dallas (2012)\
\ - 02x05 - Trial and Error</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/6/Blame_Game\" debug=\"72265\"\
>Dallas (2012) - 02x06 - Blame Game</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/7/The_Furious_and_the_Fast\"\
\ debug=\"72625\">Dallas (2012) - 02x07 - The Furious and the Fast</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/8/J.R.%27s_Masterpiece\" debug=\"72969\">Dallas\
\ (2012) - 02x08 - J.R.'s Masterpiece</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/9/Ewings_Unite%21\"\
\ debug=\"73242\">Dallas (2012) - 02x09 - Ewings Unite!</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/10/Guilt_And_Innocence\" debug=\"73578\">Dallas\
\ (2012) - 02x10 - Guilt And Innocence</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/11/Let_Me_In\"\
\ debug=\"73846\">Dallas (2012) - 02x11 - Let Me In</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/12/A_Call_to_Arms\" debug=\"74098\">Dallas (2012)\
\ - 02x12 - A Call to Arms</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/2/13/Love_%40_Family\" debug=\"\
74099\">Dallas (2012) - 02x13 - Love & Family</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/2/14/Guilt_By_Association\" debug=\"74342\">Dallas\
\ (2012) - 02x14 - Guilt By Association</a></td></tr><tr><tr><td><img src=\"\
http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/15/Legacies\"\
\ debug=\"74347\">Dallas (2012) - 02x15 - Legacies</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/1/The_Return\" debug=\"84652\">Dallas (2012) - 03x01\
\ - The Return</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/2/Trust_Me\" debug=\"84941\"\
>Dallas (2012) - 03x02 - Trust Me</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/3/Playing_Chicken\" debug=\"\
85388\">Dallas (2012) - 03x03 - Playing Chicken</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/4/Lifting_the_Veil\" debug=\"85735\">Dallas (2012)\
\ - 03x04 - Lifting the Veil</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/5/D.T.R.\" debug=\"86033\"\
>Dallas (2012) - 03x05 - D.T.R.</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/6/Like_Father%2C_Like_Son\"\
\ debug=\"86406\">Dallas (2012) - 03x06 - Like Father, Like Son</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/7/Like_a_Bad_Penny\" debug=\"86664\">Dallas (2012)\
\ - 03x07 - Like a Bad Penny</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/8/Where_There%27s_Smoke\"\
\ debug=\"86948\">Dallas (2012) - 03x08 - Where There's Smoke</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/9/Denial%2C_Anger%2C_Acceptance\" debug=\"91222\"\
>Dallas (2012) - 03x09 - Denial, Anger, Acceptance</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/10/Dead_Reckoning\" debug=\"91469\">Dallas (2012)\
\ - 03x10 - Dead Reckoning</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/11/Hurt\" debug=\"91634\"\
>Dallas (2012) - 03x11 - Hurt</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/12/Victims_of_Love\" debug=\"\
91837\">Dallas (2012) - 03x12 - Victims of Love</a></td></tr><tr><tr><td><img\
\ src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"\
serie/Dallas_%282012%29/3/13/Boxed_In\" debug=\"91959\">Dallas (2012) - 03x13\
\ - Boxed In</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/14/Endgame\" debug=\"92148\"\
>Dallas (2012) - 03x14 - Endgame</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"\
\ /></td><td><a href=\"serie/Dallas_%282012%29/3/15/Brave_New_World\" debug=\"\
92160\">Dallas (2012) - 03x15 - Brave New World</a></td></tr><tr><p>\n<p>\n\
</table>\n</td>\n <td></td>\n </tr>\n \
\ <tr> <!-- table footer -->\n \t<td class=\"tablecorner\"><img\
\ src=\"http://www.addic7ed.com/images/bl.gif\" /></td>\n <td></td>\n\
\ <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/br.gif\"\
\ /></td>\n </tr>\n </table>\n </div>\n<!-- AdskeeperComposite\
\ Start -->\n<div id=\"AdskeeperScriptRootC23244\">\n <div id=\"AdskeeperPreloadC23244\"\
>\n <a id=\"mg_add23244\" href=\"\" target=\"_blank\">Place your\
\ ad here</a><br> <a href=\"http://adskeeper.co.uk/\" target=\"_blank\"\
>Loading...</a> \n </div>\n <script>\n\
\ window.MGWidgetTitle23244 = \"Promoted\
\ Content\"; (function(){\n \
\ var D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n\
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"\
AdskeeperScriptRootC23244\")[ac](i);try{var iw=i.contentWindow.document;iw.open();iw.writeln(\"\
<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var c=iw[b];}\n\
\ catch(e){var\
\ iw=d;var c=d[gi](\"AdskeeperScriptRootC23244\");}var dv=iw[ce]('div');dv.id=\"\
MG_ID\";dv[st][ds]=n;dv.innerHTML=23244;c[ac](dv);\n \
\ var s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"\
//jsc.adskeeper.co.uk/a/d/addic7ed.com.23244.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n\
\ \
\ </script>\n \
\ </div>\n \
\ <!-- AdskeeperComposite\
\ End -->\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td class=\"\
NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Popular\
\ Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"\
http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"\
\ alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"\
20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img\
\ src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Forums</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse By Shows</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/4906\">12 Monkeys</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV Shows Schedule</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\"\
>Site Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/movie-subtitles\">Browse By Movies</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\"\
>Frequently Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support\
\ Us</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/top-uploaders\"\
>Top Uploaders</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/620\"\
>Modern Family</a></div></td>\n<td><div id=\"footermenu\">RSS Feeds</div></td>\n\
<td><div id=\"footermenu\">Premium Accounts</div></td>\n</tr>\n<tr>\n<td><div\
\ id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top Downloads</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td\
\ class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"\
\ alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"\
\ \"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\"\
>Video Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"/log.php?mode=news\">All News</a></div></td>\n<td><div id=\"footermenu\"\
><a href=\"/show/450\">Parks and Recreation</a></div></td>\n<td><div id=\"\
footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\"\
>How to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently\
\ Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a\
\ href=\"http://www.sub-talk.net\">Sub-Talk Forums</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"/show/1277\">Shameless (US)</a></div></td>\n\
<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div id=\"footermenu\"\
><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows Talk</a></div></td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest\
\ Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\"\
>The Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation\
\ Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\"\
>Movies Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"\
http://www.vreaubagaj.ro/troler/\" title=\"Trolere ieftine\" alt=\"Trolere\
\ ieftine\">Trolere ieftine</a></div></td>\n<td><div id=\"footermenu\"><a\
\ href=\"/show/130\">Family Guy</a></div></td>\n<td><div id=\"footermenu\"\
>Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img width=\"\
20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"\
TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \"\
\ />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\"\
>How to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n\
</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n\
<td><div id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div\
\ id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\"\
\ title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n\
</center>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\"\
\ == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\n\
document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js'\
\ type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"\
text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\"\
);\npageTracker._trackPageview();\n} catch(err) {}</script>\n\n\n<script type=\"\
text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n\
\ \
\ \n</body></html>\n"}
headers:
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
connection: [keep-alive]
content-type: [text/html]
date: ['Thu, 29 Oct 2015 22:04:24 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [nginx]
set-cookie: [PHPSESSID=2krcj2c1nf1ds4risaji3dkf41; path=/]
x-powered-by: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,843 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://napiprojekt.pl/unit_napisy/dl.php?f=6303e7ee6a835e9fcede9fb2fb00cb36&pass=&l=PL&nick=&kolejka=false&t=0ce4a&napios=Linux&v=dreambox
response:
body:
string: !!binary |
ezExODl9ezEyNzF9VLN1bWFjemVuaWU6fHNpbnU2DQp7MzE0Nn17MzE4OX0vTmllIHJvenVtaWVj
aWU/DQp7MzE4OX17MzI0NH0vSrlkcm8gS3J5cHRvbmEgc2nqIHJvenBhZGEuDQp7MzI0NH17MzI5
OX1UbyBrd2VzdGlhIHR5Z29kbmkuDQp7MzI5OX17MzM5MH1Pc3RyemVnYbNlbSwgv2UgZWtzcGxv
YXRhY2phIGq5ZHJhfHRvIHNhbW9i82pzdHdvLg0KezMzOTd9ezM0NDV9VG8gamVkeW5pZSBwcnp5
c3BpZXN6ebNvIGltcGxvemrqLg0KezM0NDh9ezM1NTh9UmV6ZXJ3eSBlbmVyZ2V0eWN6bmUgYnmz
eSBuYSB3eWN6ZXJwYW5pdS58Q28gbWllbGmcbXkgenJvYmnmLCBFbD8NCnszNTU4fXszNjQ0fVp3
cvNjaeYgc2nqIGt1IGd3aWF6ZG9tLnxKYWsgbmFzaSBwcnpvZGtvd2llLg0KezM2NDR9ezM2OTV9
U7kgdGFtIJx3aWF0eSx8bmFkYWq5Y2Ugc2nqIGRvIHphbWllc3prYW5pYS4NCnszNjk3fXszNzQ1
fU1vv2VteSB6YWN6ueZ8b2QgbmFzenljaCBkYXdueWNoIGtvbG9uaWkuDQp7Mzc0NX17MzgyOX1O
YXByYXdk6iBzdWdlcnVqZXN6fGV3YWt1YWNq6iBjYbNlaiBwbGFuZXR5Pw0KezM4Mjl9ezM5MTN9
TmllLiBMb3MgamVqIG1pZXN6a2HxY/N3fGplc3QganW/IHByemVzuWR6b255Lg0KezM5Mzd9ezQw
NDV9UHJ6ZWthv2NpZSBtaSBrb250cm9s6iBuYWQgS29kZXhlbS58WmFwZXduaeogcHJ6ZXRyd2Fu
aWUgbmFzemVqIHJhc3kuDQp7NDA0NX17NDE2OX1XY2m5vyBqZXN0IG5hZHppZWphLnxUcnp5bWGz
ZW0garkgdyByYW1pb25hY2guDQp7NDQ5OH17NDYxNX0tIE5pbmllanN6eW0gUmFkYSB6b3N0YWpl
IHJvendpuXphbmEufC0gWiBjenlqZWdvIHJvemthenU/DQp7NDYxOH17NDY2Nn1Nb2plZ28uDQp7
NDcyOH17NDgyMn1SZXN6dGEgem9zdGFuaWUgb3O5ZHpvbmEgaSB1a2FyYW5hLg0KezQ4NzB9ezQ5
MjV9Q28gdHkgd3lwcmF3aWFzeiwgWm9kPyF8VG8gc3phbGXxc3R3byENCns0OTI1fXs0OTY4fVBv
d2luaWVuZW0gdG8genJvYmnmIGp1vyBkYXduby4NCns0OTY4fXs1MDgxfVByemV6IGljaCBuaWVr
b/FjerljZSBzaeogZGViYXR5fGRvcHJvd2FkemlsaSBLcnlwdG9uYSBkbyB6Z3VieSENCns1MTM4
fXs1MjI0fVByemVqbXVqZXN6IHezYWR66iBzabO5P3xOaWUgYupkemllc3ogbWlhsyBraW0gcnq5
ZHpp5i4NCns1MjI0fXs1MzM3fVBvbfO/IG1pIHdp6mMgb2NhbGnmIG5hc3q5IHJhc+oufFphY3pu
aWVteSBuYSBub3dvLg0KezUzMzd9ezU0NDB9V3lwbGVuaW15IGRlZ2VuZXJhdPN3LHxrdPNyenkg
ZG9wcm93YWR6aWxpIGRvIHVwYWRrdS4NCns1NDQwfXs1NTI5fUEga3RvIHpkZWN5ZHVqZSwga29n
byBvc3pjeupkemnmPw0KezU1NjB9ezU2MDN9VHk/DQp7NTYzNH17NTc0MH1OaWUgcvNiIHRlZ28s
IEVsLiBOaWUgY2hj6ix8YnmcbXkgc3RhbGkgc2nqIHdyb2dhbWkuDQp7NTc0NX17NTgxMn1as2Ft
YbNlnCBvYm93abl6dWq5Y2UgbmFzIHphc2FkeS4NCns1ODE3fXs1ODkxfVBvZG5pb3OzZZwgbWll
Y3p8cHJ6ZWNpd2tvIHezYXNuZW11IGx1ZG93aS4NCns1OTA1fXs2MDM1fVVzemFudWrqIGN6s293
aWVrYSwga3TzcnltIGtpZWR5nCBiebNlnC58TmllIHBvdHdvcmEsIGpha2ltIHNp6iBzdGGzZZwu
DQp7NjExNn17NjE3MX1aYWJyYeYgZ28uDQp7NjI5NH17NjM2Nn0vLSBXc3p5c3RrbyB3IHBvcnq5
ZGt1P3wtIFogZHJvZ2khDQp7NjM5Mn17NjQyOH1Qb3dpZWR6aWGzZW0uLi4NCns2ODA5fXs2OTI3
fS0gUG+zuWN6IG1uaWUgeiBMYXK5LnwvLSBaYSB0b2K5LCBKb3IhDQp7NzAxMX17NzEzMH1MYXJh
LCBwcnp5Z290dWogc3RhcnQufFByenli6mTqIGphayBuYWpzenliY2llai4NCns3NDU5fXs3NTA0
fUgnUmFrYSENCns4NDI4fXs4NDkyfS0gV2lkemlhs2GcIEtvZGV4P3wvLSBKZXN0IHBvZCByYXR1
c3plbS4NCns4NDkyfXs4NTg4fS9Pc3RyemVnYW0sIL9lIHplapxjaWUgdGFtfC9qZXN0IHByemVz
dOpwc3R3ZW0ga2xhc3kgQi4uLg0Kezg1ODh9ezg2OTh9VG8ganW/IG5pZXdhv25lLCBLZWxleC58
jHdpYXQgc2nqIGtv8WN6eS4NCnsxMDIyOH17MTAzNTN9Sm9yLUVsLCB6IHJvemthenUgZ2VuZXJh
s2EgWm9kYSx8bWFzeiBvZGRh5iBLb2RleC4NCnsxMTUxMX17MTE1NjZ9U3Bva29qbmllLCBIJ3Jh
a2EuDQp7MTIwNDF9ezEyMTA4fS0gWm5hbGWfbGmcY2llIGp1vyCcd2lhdD98LSBUYWsuDQp7MTIx
MTN9ezEyMTk5fS9Lcrm/eSB3b2vzsyC/87N0ZWogZ3dpYXpkeXwvY2m5Z3UgZ7Pzd25lZ28uDQp7
MTIyMzB9ezEyMjc2fU2zb2RhIGd3aWF6ZGEuDQp7MTIyNzZ9ezEyMzM4fUplZ28ga29t83JraSBi
6mS5IGN6ZXJwYeZ8eiBuaWVqIGVuZXJnaeouDQp7MTIzOTF9ezEyNDUxfVd5Z2y5ZGEgbmEgdG8s
fL9lIG1hIGludGVsaWdlbnRuuSBwb3B1bGFjauouDQp7MTI0NjV9ezEyNTQyfULqZHppZSB3eXJ6
dXRraWVtLCBkeml3b2y5Z2llbS4NCnsxMjU4M317MTI2NDB9LSBaYWJparkgZ28ufC0gSmFrPw0K
ezEyNjU5fXsxMjcyOX1C6mR6aWUgZGxhIG5pY2ggYm9naWVtLg0KezEyNzQ2fXsxMjgwMX1BIGpl
nGxpIHN0YXRlayBuaWUgZG9sZWNpPw0KezEyODI1fXsxMjg3OH1PbiB6Z2luaWUgZ2R6aWWcIHRh
bS4uLg0KezEyODc4fXsxMjkyNX13IHNhbW90bm+cY2kuDQp7MTI5NTR9ezEyOTk1fU5pZSBtb2fq
Lg0KezEyOTk1fXsxMzA3OX1NeZxsYbNhbSwgv2UgcG90cmFmaeosIGFsZS4uLnxraWVkeSBqdb8g
c2nqIHVyb2R6abMuLi4NCnsxMzA5MX17MTMyMjB9S3J5cHRvbmEgY3pla2EgemFns2FkYS58VG8g
ZGxhIG5pZWdvIGplZHluYSBzemFuc2EuDQp7MTMyMjN9ezEzMjk1fUkgZGxhIG5hc3plZ28gbHVk
dS4NCnsxMzMwMn17MTMzMjN9TyBjbyBjaG9kemksIEtlZWxleD8NCnsxMzMyM317MTMzODZ9L1Bp
6uYgc3RhdGvzdyBib2pvd3ljaHwvbmFkbGF0dWplIHplIHdzY2hvZHUuDQp7MTMzODZ9ezEzNDQz
fS9aZXNrYW5vd2FsaSBzeXN0ZW15IG9icm9ubmUgY3l0YWRlbGkuDQp7MTM0NDN9ezEzNTEzfS0g
WmGzYWR1auogS29kZXgufC0gWmFjemVrYWouDQp7MTM1NjZ9ezEzNjM1fURhaiBtaSBuYSBuaWVn
byBwb3BhdHJ6ZeYuDQp7MTM3MTJ9ezEzNzgxfU5pZSB6b2JhY3rqLHxqYWsgc3Rhd2lhIHBpZXJ3
c3plIGtyb2tpLg0KezEzODI3fXsxMzg4OX1OaWUgdXOzeXN66ix8amFrIHd5bWF3aWEgbmFzemUg
aW1pb25hLg0KezE0MDA3fXsxNDA5MX1UYW0sIHBvnHLzZCBnd2lhemQuLi4NCnsxNDEyMn17MTQx
OTR9YupkemllIL95sy4NCnsxNTU0OH17MTU1ODR9r2VnbmFqLCBzeW51Lg0KezE1NjExfXsxNTY3
M31aYWJpZXJ6IHplIHNvYrkgbWFyemVuaWEuDQp7MTY1OTl9ezE2Njc4fU9zdHJ6ZWxh5iBns/N3
bmUgd2VqnGNpZS4NCnsxNzA0Mn17MTcxMDl9L0xhZHkgTGFybywgbmFw6mQgZ290b3d5IGRvIHN0
YXJ0dS4NCnsxNzEwOX17MTcxNTB9VXJ1Y2hvbSBzaWxuaWtpLg0KezE3MTU3fXsxNzE4NH1HZW5l
cmFsZS4NCnsxNzE4Nn17MTcyNzd9WmFyZWplc3Ryb3dhbGmcbXkgb2RwYWxlbmllIHNpbG5pa/N3
fHdld265dHJ6IGN5dGFkZWxpLg0KezE3Mjk0fXsxNzMzMn1TdGFydHVquS4NCnsxNzM1Nn17MTc0
MTR9T2JzdGF3Y2llIHTqIHBsYXRmb3Jt6i4NCnsxNzcwNn17MTc4NTN9V2llbSwgv2UgdWtyYWSz
ZZwgS29kZXgufFp3cvPmIGdvLCBhIGRhcnVq6iBjaSC/eWNpZS4NCnsxNzg3OX17MTc5NDR9VG8g
ZHJ1Z2Egc3phbnNhIGRsYSBjYbNlZ28gS3J5cHRvbmEuDQp7MTc5NDZ9ezE4MDExfU5pZSB0eWxr
byBkbGEgdHljaCx8a3TzcnljaCB1em5hc3ogemEgZ29kbnljaC4NCnsxODAzNX17MTgxMzh9LSBD
b5wgdHkgenJvYmmzP3wtIE1hbXkgZHppZWNrbywgWm9kLg0KezE4MTUwfXsxODE4Nn1DaLNvcGNh
Lg0KezE4MTg4fXsxODI2NX1QaWVyd3N6ZSBuYXR1cmFsbmUgdXJvZHplbmllIG9kIHN0dWxlY2ku
DQp7MTgyODR9ezE4MzkwfULqZHppZSB3b2xueS58U2FtIHpkZWN5ZHVqZSBvIHN3b2plaiBwcnp5
c3qzb5xjaS4NCnsxODQxOH17MTg0NTR9SGVyZXpqYSENCnsxODQ5M317MTg1Mjl9Wm5pc3pjennm
IGdvIQ0KezE5ODAyfXsxOTg2NH1Qb3OzdWNoYWogbW5pZSwgTGFybyENCnsxOTg2NH17MTk5NDN9
S29kZXggamVzdCBwcnp5c3qzb5xjabkgS3J5cHRvbmEuDQp7MTk5NjB9ezIwMDA4fVByemVyd2lq
IHN0YXJ0IQ0KezIwNDc4fXsyMDUyOH1OaWUhDQp7MjEyMzN9ezIxMzYzfVdhc3ogc3luLi4ufERv
a7lkIGdvIHd5c7Nhs2GcPw0KezIxNDI1fXsyMTU1MH1NYSBuYSBpbWnqIEthbCwgc3luIEVsYS4N
CnsyMTYzNH17MjE3MjJ9SmVzdCBwb3phIHR3b2ltIHphc2nqZ2llbS4NCnsyMTk0NX17MjIwMjB9
WmVzdHJ6ZWxp5iB0ZW4gc3RhdGVrLg0KezIyMTc1fXsyMjIxMX0vQ2VsIG5hbWllcnpvbnkuDQp7
MjI0OTd9ezIyNTg4fS9SenXmY2llIGJyb/EufC9KZXN0ZZxjaWUgb3RvY3plbmkuDQp7MjI4MjV9
ezIyOTM1fS9HZW5lcmFsZSBab2QsfC96YSBtb3JkZXJzdHdvIGkgemRyYWTqLA0KezIyOTQwfXsy
MzA0OH0vUmFkYSBza2F6dWplIGNpZWJpZXxpIHBvem9zdGGzeWNoIHJlYmVsaWFudPN3DQp7MjMw
NDh9ezIzMTQ5fW5hIDMwMCBjeWtsaSBvZG5vd3kgc29tYXR5Y3puZWouDQp7MjMxNjN9ezIzMjI4
fU1hc3ogamFraWWcIG9zdGF0bmllIHOzb3dvPw0KezIzMjc2fXsyMzM2OX1OaWUgemFiaWplY2ll
IG5hcyx8v2VieSBuaWUgcG9icnVkemnmIHNvYmllIHK5aywNCnsyMzM2OX17MjM0NTN9emEgdG8g
enN5s2FjaWUgbmFzfHcgb3RjaLNh8SBuYSB3aWVjem5vnOYhDQp7MjM0OTJ9ezIzNTc4fUpvci1F
bCBzs3Vzem5pZSBva3JlnGxpsyB3YXN8YmFuZLkgZ7N1cGPzdy4NCnsyMzU4MH17MjM2NDB9Q28g
ZG8gamVkbmVnbyENCnsyMzY0NX17MjM2NzJ9QSB0eS4uLg0KezIzNzEyfXsyMzc4NH1XaWVyenlz
eiwgv2UgdHfzaiBzeW4gamVzdCBiZXpwaWVjem55Pw0KezIzNzk0fXsyMzgyNX1PZG5hamTqIGdv
Lg0KezIzODM3fXsyMzkxNn1PZHp5c2thbSB0byx8Y28gbmFtIHphYnJhbGmcY2llIQ0KezIzOTc0
fXsyNDAxMH1PZG5hamTqIGdvLg0KezI0MDQzfXsyNDEwMX1PZG5hamTqLCBMYXJvLg0KezI0MTcw
fXsyNDIyMX1PZG5hamTqIGdvIQ0KezI2NjU3fXsyNjc0MH0vTGFkeSBMYXJvLHwvcG93aW5uYSBw
YW5pIHBvc3p1a2HmIHNjaHJvbmllbmlhLg0KezI2NzUyfXsyNjgxMn1OaWUgbWEgZ2R6aWUgc2nq
IHNrcnnmLCBLZWxvci4NCnsyNjg0NH17MjY5MDZ9Sm9yLUVsIG1pYbMgcmFjauouDQp7MjY5NDd9
ezI2OTk1fVRvIGtvbmllYy4NCnsyNzI3MH17MjczNjl9TmllY2ggdHfzaiCcd2lhdHxi6mR6aWUg
bGVwc3p5LCBLYWwuDQp7Mjk1NDZ9ezI5NjQ0fVV3Yb9haiwgZ7N1cGt1LHxibyB6b3N0YW5pZSB6
IGNpZWJpZSBtb2tyYSBwbGFtYSENCnsyOTY5OX17Mjk3OTB9U2u5ZCBvbmkgY2nqIHd5dHJ6YXNu
6mxpLCBts29keT8NCnsyOTgwOX17Mjk4NTB9L1phYmV6cGllY3p55iBwb2uzYWQhDQp7Mjk4NTB9
ezI5OTMyfU9kZWJyYWxpnG15IHdlendhbmllIG8gcG9tb2N8eiBwbGF0Zm9ybXkgbmEgd3NjaPNk
IG9kIG5hcy4NCnsyOTkzMn17Mjk5Nzd9WmFiZXpwaWVjennmIHBva7NhZCENCnszMDA3NX17MzAx
MjN9L0plZG5vc3RraSBjeXdpbG5lLCBuaWUgemJsab9h5iBzaeohDQp7MzAxMjN9ezMwMTgzfS9V
c3prb2R6b255IGplc3QgamVkZW4geiB6YXdvcvN3LnwvUGxhdGZvcm1hIG1vv2Ugd3lidWNobrnm
Lg0KezMwMTgzfXszMDI1M31acm96dW1pYbNlbS58QSBjbyB6IGx1ZJ9taT8NCnszMDI1NX17MzAz
NTF9Ly0gTmllIG1harkgc3phbnMufC0gTbNvZHksIHByenluaWWcIG1pIGxvcm5ldGvqLg0KezMw
Mzk3fXszMDQ0Mn1Ns29keSENCnszMDYzNH17MzA3MjN9VG8gb3N0YXRuaWEgYnV0bGEhfE5pZSB3
eXRyenltYW15IGSzdb9laiENCnszMDk0M317MzA5ODR9L1R1IHN0cmG/IHd5YnJ6Zb9hLg0KezMw
OTg0fXszMTA2M30vWnJvYmlteSBqZXN6Y3plIGplZGVuIHByemVsb3R8L2kgd3lub3NpbXkgc2nq
IHN0uWQuDQp7MzEwOTR9ezMxMTU0fUN6ZWthamNpZSwgd2lkeuogbHVkemkgbmEgbLlkb3dpc2t1
IQ0KezMxNjUxfXszMTcxMX0vRGF3YWogdGVnbyBvc3RhdG5pZWdvLnwvTXVzaW15IHN0YXJ0b3dh
5iENCnszMTcxMX17MzE3NzV9V3NrYWt1aiF8Q28gdHkgd3lwcmF3aWFzej8hDQp7MzE4OTV9ezMx
OTMxfVN0YXJ0dWplbXkhDQp7MzI4NDV9ezMyOTE0fS9LaWVkeSBLYW5zYXMgc3Rhs28gc2nqIHRl
cnl0b3JpdW0uLi4NCnszMjk0OH17MzI5ODF9L0NsYXJrIQ0KezMzMDI5fXszMzA3Mn1Vd2G/YXN6
LCBDbGFyaz8NCnszMzE3MX17MzMyNTV9U3B5dGGzYW0gY2nqfG8gcGllcndzenljaCBvc2Fkbmlr
83cgdyBLYW5zYXMuDQp7MzM1NjZ9ezMzNjE3fURvYnJ6ZSBzaeogY3p1amVzeiwgQ2xhcms/DQp7
MzM3ODl9ezMzODIzfUNsYXJrIQ0KezMzOTY5fXszNDAwM31DbGFyayENCnszNDA3NX17MzQxNjN9
LSBXeWpknywgQ2xhcmshfC0gWm9zdGF3Y2llIG1uaWUuDQp7MzQxNzN9ezM0MjE5fVdlendhs2Ft
IHR3b2q5IG1hdGvqLg0KezM0MzUwfXszNDQyMH1KZXN0ZW0hfENsYXJrLCBjbyBzaeogc3Rhs28s
IHNrYXJiaWU/DQp7MzQ0ODV9ezM0NTQyfS8tIE90d29yenlzeiBkcnp3aT98Ly0gQ28gbXUgb2Ri
abNvPw0KezM0NTQyfXszNDU4NX0vLSBUbyBkeml3YWsufC8tIE1hemdhai4NCnszNDU4OH17MzQ2
NDV9L1JvZHppY2UgbmllIHBvendhbGFquSBtdXwvYmF3aeYgc2nqIHogaW5ueW1pIGR6aWXmbWku
DQp7MzQ2NDh9ezM0Njg0fS9XaWVtLg0KezM0Njg2fXszNDc4OX1Ta2FyYmllISBKYWsgbWFtIGNp
IHBvbfNjLHxza29ybyBtbmllIG5pZSB3cHWcY2lzej8NCnszNDc5NH17MzQ4NTZ9jHdpYXQgamVz
dCB6Ynl0IGR1v3ksIG1hbW8uDQp7MzQ4NTZ9ezM0OTA0fS9UbyBnbyB6bW5pZWpzei4NCnszNDk1
MH17MzQ5OTh9UG8gcHJvc3R1Li4uDQp7MzUwNDN9ezM1MTAxfXNrdXAgc2nqIG5hIG1vaW0gZ7Nv
c2llLg0KezM1MTMyfXszNTE5NH0vVWRhd2FqLCC/ZSB0byB3eXNwYS4NCnszNTE5NH17MzUyNDd9
L0dkemllnCBuYSBvY2VhbmllLg0KezM1MjY2fXszNTMxOX1XaWR6aXN6IGq5Pw0KezM1Mzg0fXsz
NTQyMn1XaWR66i4NCnszNTQ0MX17MzU0OTR9ULN58SB3IGplaiBraWVydW5rdSwga29jaGFuaWUu
DQp7MzU4MDN9ezM1ODY2fUNvIG1pIGplc3QsIG1hbW8/DQp7MzU5MTh9ezM1OTY2fUNsYXJrLg0K
ezM3OTY4fXszODA0OH1IZWosIHBpZXJkb7NvIXxPZ2y5ZGGzZZwgbWVjej8NCnszODA2NH17Mzgx
MzZ9LSBab3N0YXcgZ28sIFBldGUufC0gQSB0eSBjbz8gSmVnbyBkemlld2N6eW5hPw0KezM4MTM5
fXszODE5MX1DaGPqIHVzs3lzemXmLHxjbyBtYSBkbyBwb3dpZWR6ZW5pYS4NCnszODIyNX17Mzgy
NzB9Tm8gc7N1Y2hhbSwgY2lvs2t1Lg0KezQwNjgyfXs0MDgxOX0vTfNqIHN5biBiebMgdyBhdXRv
YnVzaWUufC9XaWR6aWGzLCBjbyB6cm9iabMgQ2xhcmsuDQp7NDA4MjZ9ezQwOTE1fVdpZW0ufFRv
LCBjbyBtdSBzaeogd3lkYXdhs28uLi4NCns0MDkxN317NDA5ODl9VG8gYnmzYSBy6mthIGJvc2th
Lg0KezQwOTg5fXs0MTAzN31UbyBiebNhIGJvv2Egb3BhdHJ6bm+c5i4NCns0MTE0MH17NDEyMjd9
LSBDaHliYSB0cm9jaOogd3lvbGJyenltaWFzei58LSBXY2FsZSBuaWUuDQp7NDEyNDF9ezQxMzAx
fUxhbmEgaSBGb3JueSB0Zb8gdG8gd2lkemllbGkuDQp7NDEzMDF9ezQxMzkyfS9OaWUgcGllcndz
enkgcmF6fC9DbGFyayB6cm9iabMgY2+cIHRha2llZ28uDQp7NDE3NTJ9ezQxODkxfS0gSmEgdHls
a28gY2hjaWGzZW0gcG9t82MufC0gV2llbSwgYWxlIGp1vyBvIHR5bSByb3ptYXdpYWxpnG15Lg0K
ezQxOTE3fXs0MTk4N31Sb3ptYXdpYWxpnG15IG8gdHltLnxNdXNpc3ouLi4NCns0MTk5Mn17NDIw
ODN9TXVzaXN6IHphY2hvd2HmfHN382ogZGFyIHcgdGFqZW1uaWN5Lg0KezQyMDkwfXs0MjE3MX1N
aWGzZW0gcG96d29saeYgaW0gdW1yemXmPw0KezQyMjk2fXs0MjM0NH1Nb79lLg0KezQyMzgyfXs0
MjQ3OH1UdSBjaG9kemkgbyBjb5wgd2nqY2VqfG5pvyC/eWNpZSBuYXN6ZSBpIG5hc3p5Y2ggYmxp
c2tpY2guDQp7NDI1NDN9ezQyNTg5fUtpZWR5IJx3aWF0Li4uDQp7NDI1OTh9ezQyNjk5fUtpZWR5
IJx3aWF0IGRvd2llIHNp6iwgY28gcG90cmFmaXN6LHx0byB3c3p5c3RrbyB6bWllbmkuDQp7NDI3
MDF9ezQyNzQ5fU5hc3q5IHdpYXLqLCBwb2dsuWR5Li4uDQp7NDI3Njh9ezQyODQwfXpuYWN6ZW5p
ZSBjerNvd2llY3pl8XN0d2EsIHdzenlzdGtvLg0KezQyODQzfXs0Mjk2M31XaWR6aWGzZZwgcmVh
a2Nq6iBtYW15IFBldGUnYS58T25hIHNp6iBjaWViaWUgYm9pLg0KezQzMDAxfXs0MzA0NH1EbGFj
emVnbz8NCns0MzA2MX17NDMxMzV9THVkemllIGJvarkgc2nqIHRlZ28sfGN6ZWdvIG5pZSByb3p1
bWllarkuDQp7NDMxMzh9ezQzMTg4fU1hIHJhY2rqPw0KezQzMjA1fXs0MzI4MX1UbyBkYXIgb2Qg
Qm9nYT8NCns0MzI5MX17NDMzMjB9UG93aWVkei4NCns0MzY4NH17NDM3MzB9VyB0eW0gY2nqIHpu
YWxln2xpnG15Lg0KezQzNzczfXs0Mzg0N31CeWxpnG15IHBld25pLHy/ZSB6amF3aSBzaeoga3Rv
nCB6IHJ6uWR1Lg0KezQzODUwfXs0Mzg5OH1BbGUgbmlrdCBuaWUgcHJ6eXN6ZWSzLg0KezQ0MjM4
fXs0NDMyMH1UbyB6bmFsYXqzZW0gcHJ6eSB0b2JpZS4NCns0NDM0Nn17NDQ0MTN9WmFicmGzZW0g
dG8gZG8gbWV0YWx1cmdhfHcgS2Fuc2FzIFN0YXRlLg0KezQ0NDE2fXs0NDQ4NX1Qb3dpZWR6aWGz
LCC/ZSB6IGN6ZWdva29sd2lla3x0byBiebNvIHpyb2Jpb25lLi4uDQp7NDQ0OTd9ezQ0NTY5fXRv
IG5pZSBtYSB0ZWdvfHcgdGFibGljeSBwaWVyd2lhc3Rr83cuDQp7NDQ2MTl9ezQ0NzE1fUlubnlt
aSBzs293eSwgdG8gbmllIHBvY2hvZHppfHogbmFzemVnbyCcd2lhdGEuDQp7NDQ3NTF9ezQ0ODIx
fVR5IHLzd25pZb8uDQp7NDQ4NDd9ezQ0OTY3fUplc3RlnCBvZHBvd2llZHppuSBuYSBweXRhbmll
OnwiQ3p5IGplc3RlnG15IHNhbWkgd2Ugd3N6ZWNonHdpZWNpZT8iLg0KezQ1MDAxfXs0NTA4OX0t
IEFsZSBqYSBuaWUgY2hj6i58LSBXY2FsZSBjaeogbmllIHdpbmnqLg0KezQ1MDkyfXs0NTE4M31U
byBiebNvYnkgb2dyb21uZSBicnplbWnqIGRsYSBrYb9kZWdvLHxhbGUgdHkgbmllIGplc3RlnCB6
d3lrs3ltIGN6s293aWVraWVtLg0KezQ1MTgzfXs0NTI1MH1XaWVyeuosIL9lLi4uDQp7NDUyNzZ9
ezQ1MzM5fXd5c7Nhbm8gY2nqIHR1fHogamFraWVnb5wgcG93b2R1Lg0KezQ1MzQ4fXs0NTQyMH1U
ZSB3c3p5c3RraWUgem1pYW55LHxrdPNyeWNoIGRvnHdpYWRjemFzeiwNCns0NTQyMH17NDU1NDB9
a2llZHmcIG9rYb+5IHNp6iBis29nb3OzYXdpZfFzdHdlbS58Qupkemllc3ogbXVzaWGzIHd0ZWR5
IGRva29uYeYgd3lib3J1Lg0KezQ1NTUwfXs0NTY0OH1Denkgc3RhbrnmIGR1bW5pZXxwcnplZCBs
dWR6a7kgcmFzuSwgY3p5IHRlvyBuaWUuDQp7NDU2ODF9ezQ1NzUzfU5pZSBt82ezYnltIHBvIHBy
b3N0dXx1ZGF3YeYgdHdvamVnbyBzeW5hPw0KezQ1NzY4fXs0NTgyMX1KZXN0ZZwgbW9pbSBzeW5l
bS4NCns0NTkxOX17NDYwMTB9QWxlIGdkemllnCB0YW18bWFzeiB0Zb8gZHJ1Z2llZ28gb2pjYSwN
Cns0NjAxMH17NDYwNjd9a3TzcnkgZGGzIGNpIGlubmUgaW1p6i4NCns0NjEzNX17NDYyMTF9UHJ6
eXOzYbMgY2nqIHR1fHogamFraWVnb5wgcG93b2R1Lg0KezQ2MjUwfXs0NjMwN31JIGNob+ZieSBt
aWGzbyBjaSB0b3x6YWq55iBjYbNlIL95Y2llLA0KezQ2MzA3fXs0NjM4NH1tdXNpc3ogcG96bmHm
IHRlbiBwb3fzZC4NCns0Njc2OH17NDY4NTZ9LSBUbyBuaWUgbWlhs3kgYnnmIOZ3aWN6ZW5pYT98
LSBabWlhbmEgcGxhbvN3Lg0KezQ2ODU2fXs0NjkzMX1abmFsZZ9saSBjb5wgZHppd25lZ298bmEg
V3lzcGllIEVsbGVzbWVyZSdhLg0KezQ2OTMxfXs0NzAwNX0tIENhs3kgdHlkemll8SByb2JpuSB0
YW0genJ6dXR5LnwtIERvIHRlaiBwaXBpZPN3eT8NCns0NzAwNX17NDcwNTN9TmllerN5IG9kamF6
ZCwgY28/DQp7NDcwNTN9ezQ3MTA2fUFtZXJ5a2FuaWUgdGW/IHByenlqZWNoYWxpLnxDYbNhIG1h
c2EuDQp7NDcxMDZ9ezQ3MTc4fU5henl3YWq5IHRvIGFub21hbGm5LHxjb2tvbHdpZWsgdG8gem5h
Y3p5Lg0KezQ3MTgwfXs0NzI2MX0tIE9kd2FsIHNp6iwgbfN3aeogcG93Yb9uaWUufC0gTm8gY28g
dHksIENocmlzc3kuDQp7NDcyNjF9ezQ3MzA3fS0gU3BhZGFqIXwtIFVzablkny4NCns0NzMwN317
NDc0MDN9LSBQdXN6Y3phaiF8LSBab3N0YXcgarkuDQp7NDc0Njh9ezQ3NTIwfUJvIGNvLCB0d2Fy
ZHppZWx1Pw0KezQ3NTIwfXs0NzYwN31CbyBi6mTqIG11c2lhsyBwb3Byb3Np5ix8v2VieZwgd3lz
emVksy4NCns0NzYzMX17NDc3MzF9V3lqZOosIGtpZWR5IGLqZOogbWlhs3xuYSB0byBvY2hvdOou
DQp7NDc5NDJ9ezQ3OTk1fVphY3p5bmEgc2nqLg0KezQ4MTU2fXs0ODIzM31OaWUgd2FydG8uDQp7
NDgzOTZ9ezQ4NDk5fU5pZSB6YXBvbW5paiBuYXBpd2t1LCBkdXBrdS4NCns0OTc1N317NDk3ODR9
RHpp6mtpLg0KezQ5ODEwfXs0OTgzOX1DemWc5i4NCns0OTg1MX17NDk4OTl9V2l0YW0sIHBhbm5v
IExhbmUuDQp7NDk5MTF9ezUwMDIxfS0gSmVkIEV1YmFua3MsICJBcmN0aWMgQ2FyZ28iLnwtIERh
bGVrbyBkbyBiYXp5Pw0KezUwMDIxfXs1MDA3Nn1PYvN6IGplc3QgemEgd3puaWVzaWVuaWVtLnxa
YXByb3dhZHrqIHBhbmm5Lg0KezUwMDc2fXs1MDA5OH2Md2lldG5pZS4NCns1MDA5OH17NTAxNTN9
Sm9lIHphYmllcnplIHBhbmkgYmFnYb9lLg0KezUwMTU4fXs1MDI3M30tIFBvbfO/IGplai58LSBP
c3Ryb79uaWUsIHO5IGNp6r9raWUuDQp7NTAzMTR9ezUwNDMxfVN6Y3plcnplIG3zd2m5Yyx8bmll
IHByemVwYWRhbSB6YSAiVGhlIERhaWx5IFBsYW5ldCIuDQp7NTA0Mzh9ezUwNTI1fUFsZSB0ZW4g
cmVwb3J0Yb8sfGt083J5IHpyb2Jps2EgcGFuaSB6IDEuIGR5d2l6arkuLi4NCns1MDUzOX17NTA1
ODd9QnmzZW0gcG9kIHdyYb9lbmllbS4NCns1MDU4OX17NTA3MDd9TmFqbGVwaWVqIHBpc3plIG1p
IHNp6nx3IGthbWl6ZWxjZSBrdWxvb2Rwb3JuZWouDQp7NTA4MjJ9ezUwODQ0fS9QYW5ubyBMYW5l
Lg0KezUwODQ4fXs1MDk0NH1QdbNrb3duaWsgSGFyZHkgeiBkb3fzZHp0d2EsfGEgdG8gZHIgRW1p
bCBIYW1pbHRvbi4NCns1MDk0NH17NTEwMjN9U3BvZHppZXdhbGmcbXkgc2nqIHBhbml8ZG9waWVy
byBqdXRyby4NCns1MTAyM317NTEwOTV9V7NhnG5pZSBkbGF0ZWdvIHByenlsZWNpYbNhbSBkemlz
aWFqLg0KezUxMDk4fXs1MTE2Mn1XeWphnG5pam15IHNvYmllIGplZG5vLg0KezUxMTYyfXs1MTIy
NX1KZXN0ZW0gdHUgdHlsa28gZGxhdGVnbyx8v2UgdG8gdGVyZW55IEthbmFkeSwNCns1MTIyN317
NTEzMTZ9YSBzuWQgYXBlbGFjeWpueSBvZHJ6dWNps3x3YXN6IHduaW9zZWsgbyB6YWthemFuaWUg
bWkgd3N06nB1Lg0KezUxMzI1fXs1MTQ0NX1Ta29ybyBtaWVyemVuaWUgZml1dPN3IG1hbXkgemEg
c29iuSx8bW+/ZWNpZSBtaSBwb2themHmLCBjbyB6bmFsZZ9saZxjaWU/DQp7NTE0OTN9ezUxNTgy
fVNhdGVsaXR5IE5BU0Egd3lrcnmzeSBhbm9tYWxp6i4NCns1MTU4Mn17NTE2NzF9ULN5dHkgbG9k
b3dlIGJsb2t1arkgc3lnbmGzLHxhbGUgeiBwZXdub5xjabkgY2+cIHRhbSBqZXN0Lg0KezUxNjcx
fXs1MTc1N30tIE1vv2UgcmFkemllY2thILPzZJ8gcG9kd29kbmE/fC0gV7l0cGxpd2UuIFRvIG1h
IDMwMCBtZXRy83cuDQp7NTE3NTl9ezUxODI3fU8gd2llbGUgd2nqa3N6ZXxuab8gb2ty6nR5IHog
dGFtdHljaCBjemFz83cuDQp7NTE4MzZ9ezUxODg2fUEgdGVyYXogbmFqZHppd25pZWpzemUuDQp7
NTE4OTh9ezUyMDI2fUzzZCwga3Tzcnkgb3RhY3phIHRlbiBvYmlla3QsfG1hIHByYXdpZSAyMCB0
eXNp6mN5IGxhdC4NCns1MjA3Nn17NTIxMTR9L1Bhbm5vIExhbmUhDQp7NTIxMjZ9ezUyMTYyfVBy
b3N66iBzaeogbmllIHdhs+pzYeYuDQp7NTIxNjJ9ezUyMjI3fU5vY7kgdGVtcGVyYXR1cmEgc3Bh
ZGEgdHUgZG8gLTQwLg0KezUyMjM3fXs1MjI5Nn1OaWUgem5hbGWfbGlieZxteSBwYW5pfGG/IGRv
IHdpb3NueS4NCns1MjM3MX17NTI0MTJ9UHJvc3rqIGJhcmR6by4NCns1MjQ4MX17NTI1Nzl9LSBB
IGplnGxpIGLqZOogY2hjaWGzYSBzaXVzaXU/fC0gVyBruWNpZSBzdG9pIHdpYWRyby4NCns1MzQw
N317NTM0Njl9QSB0eSBkb2u5ZCBzaeogd3licmGzZZw/DQp7NTg4Nzh9ezU4OTU5fUp1vyBkb2Jy
emUuDQp7NTkzMDB9ezU5MzU1fU1hc3oga3J3b3RvayB3ZXdu6nRyem55Lg0KezU5MzU1fXs1OTQy
MH1KZZxsaSBnbyBuaWUgemF0YW11auouLi4NCns1OTQ1Nn17NTk1Mzd9VW1pZW0gcm9iaeYgcnpl
Y3p5LHxrdPNyeWNoIGlubmkgbmllIHBvdHJhZmm5Lg0KezU5NTM3fXs1OTU4NX1Ucnp5bWFqIG1u
aWUgemEgcupr6i4NCns1OTU4NX17NTk2MzF9QupkemllIGJvbGGzby4NCns2MTEwNX17NjExOTl9
L1RvLCBjbyBwdbNrb3duaWsgSGFyZHkgaSBqZWdvIHplc3Dzs3wvdXpuYWxpIHphIHJhZHppZWNr
uSCz82SfIHBvZHdvZG65LA0KezYxMTk5fXs2MTI2MX0vYnmzbyB6ZGVjeWRvd2FuaWUgYmFyZHpp
ZWogZWd6b3R5Y3puZS4NCns2MTI2OH17NjEzMjh9L0FuYWxpemEgaXpvdG9wb3dhfC9sb2R1IHdv
a/OzIG9iaWVrdHUgd3lrYXphs2EsDQp7NjEzMzF9ezYxNDQ4fS+/ZSBiebMgb24gdyBuaW0gdXdp
6nppb255fC9vZCAxOCB0eXNp6mN5IGxhdC4NCns2MTQ1OH17NjE1NTR9L0NvIGRvIG1vamVnbyB3
eWJhd2N5LHwvem5pa265syB3cmF6IHogb2Rsb3RlbSBvYmlla3R1Lg0KezYxNTY4fXs2MTY4NX0v
T2themGzbyBzaeosfC+/ZSBqZWdvIHRvv3NhbW+c5iBiebNhIGZhs3N6eXdhLg0KezYxNjg4fXs2
MTgwMX0vSmVnbyBpc3RuaWVuaWV8L3JvZHppIHByemVyYb9harljZSBweXRhbmlhLA0KezYxODAx
fXs2MTg2MH0vamVkbmFrIHdpZW0sIGNvIHdpZHppYbNhbS4NCns2MTg3N317NjE5OTV9RG9zemxp
IGRvIHduaW9za3UsfGm/IG9iaWVrdCBpIGplZ28gcGFzYb9lcg0KezYxOTk3fXs2MjA0N31uaWUg
cG9jaG9kerkgeiBaaWVtaS4NCns2MjA4OH17NjIxNTV9TmllIHd5ZHJ1a3Vq6iB0ZWdvLnxUbyBt
b2e5IGJ55iB0eWxrbyB0d29qZSB1cm9qZW5pYS4NCns2MjE1OH17NjIyMzB9Q3l3aWxuaSBwcmFj
b3duaWN5fHBvdHdpZXJkemlsaSBtb2q5IHdlcnNq6i4NCns2MjIzMH17NjIyOTJ9UGVudGFnb24g
emFwcnplY3phIGlzdG5pZW5pdSBzdGF0a3UuDQp7NjIyOTR9ezYyMzg4fUJvIFBlbnRhZ29uIG9k
IHRlZ28gamVzdCx8v2VieSB6YXByemVjemHmLg0KezYyNDAwfXs2MjQ4NH1UbyBqYSwgUGVycnku
fERvc3Rhs2FtIFB1bGl0emVyYS4NCns2MjQ4NH17NjI1NDR9LSBXaepjIHphY2hvd3VqIHNp6iBz
dG9zb3duaWUufC0gRHJ1a3VqZXN6IGFsYm8gb2RjaG9keuouDQp7NjI1NDZ9ezYyNjIxfU5pZSBt
b79lc3oufFdpub9lIGNp6iB1bW93YS4NCns2MjY1NH17NjI3Njd9TmllIHd5cHVzemN66iBoaXN0
b3JpaXxvIG9iY3ljaCB3nHLzZCBuYXMuDQp7NjI5MDh9ezYyOTU5fU5pYyB6IHRlZ28uDQp7NjMw
MDl9ezYzMDY2fVN6a29ja2EgZGxhIHBhbmkuDQp7NjMwNzZ9ezYzMTIyfVd5c3mzYW0gY2kgb3J5
Z2luYbMuDQp7NjMxMjJ9ezYzMjE1fU5hY3plbG55IGdvIG5pZSB3eWRydWt1amUsfGFsZSBnZHli
eSB0YWsgd3ljaWVrsyBkbyBzaWVjaS4uLg0KezYzMjIyfXs2MzMwNn1DenkgbmllIG9waXNhs2Gc
IGtpZWR5nHxtb2plaiBzdHJvbnkgc7Nvd2FtaToNCns2MzMxM317NjM0MDl9LSAib5xsaXpns3kg
cmFrIG9is3VkeSI/fC0gTmFkYWwgdGFrIHV3Yb9hbSwgV29vZGJ1cm4uDQp7NjM0MTJ9ezYzNDg0
fS0gQWxlIHRvIG11c2kgd3lqnOYgbmEgamF3LnwtIERsYWN6ZWdvPw0KezYzNDkxfXs2MzU5Mn1O
aWVjaCBt82ogdGFqZW1uaWN6eSB3eWJhd2ljaWVsIHdpZSx8v2Ugem5hbSBwcmF3ZOouDQp7NjM5
MTV9ezY0MDMwfS9EaWFnbm9zdHlrYSB6YWtv8WN6b25hLnwvVG+/c2Ftb5zmIHBvdHdpZXJkem9u
YS4NCns2NDA0MH17NjQxMTl9L1dzenlzdGtpZSBzeXN0ZW15IHNwcmF3bmUuDQp7NjQzOTV9ezY0
NTA1fVdpZHppZeYgY2nqfGpha28gZG9yb3OzZWdvIG3qv2N6eXpu6i4NCns2NDU0Nn17NjQ2NTZ9
LSBHZHlieSB0eWxrbyBMYXJhIG1vZ7NhIHRvIHpvYmFjennmLnwtIEtpbSBqZXN0ZZw/DQp7NjQ2
NjZ9ezY0NzMwfUplc3RlbSB0d29pbSBvamNlbSwgS2FsLg0KezY0NzQyfXs2NDgzOH1BIHezYZxj
aXdpZSBqZWdvIGNpZW5pZW0sIJx3aWFkb21vnGNpuS4NCns2NDg4NH17NjQ5NzB9TmF6eXdhbSBz
aeogSm9yLUVsLg0KezY1MDI1fXs2NTA4MH1BIEthbD8NCns2NTEzNn17NjUxNzR9VG8gbW9qZSBp
bWnqLg0KezY1MTg4fXs2NTI0OH1LYWwtRWwsIHcgcnplY3p5IHNhbWVqLg0KezY1Mjg3fXs2NTM0
OX1NYW0gdHlsZSBweXRh8S4NCns2NTM5N317NjU1MzZ9U2u5ZCBwb2Nob2R66j98RGxhY3plZ28g
bW5pZSB0dSB3eXOzYbNlnD8NCns2NTUzOH17NjU1ODJ9UG9jaG9kemlzeiB6IEtyeXB0b25hLg0K
ezY1NjQ0fXs2NTc2OX1aZSCcd2lhdGEgbyBiYXJkemllaiBzdXJvd3ltfJxyb2Rvd2lza3Ugbmm/
IHppZW1za2llLg0KezY1ODM2fXs2NjAxM31EYXdubyB0ZW11LCB3IGVyemUgZWtzcGFuc2ppLHxu
YXN6YSByYXNhIHBvbGVjaWGzYSBrdSBnd2lhemRvbSwNCns2NjAyM317NjYwOTJ9dyBwb3N6dWtp
d2FuaXUgbm93eWNoIHNpZWRsaXNrLg0KezY2MTE5fXs2NjI0Nn1UZW4gc3RhdGVrIGJ5syBqZWRu
eW0geiB3aWVsdXx3eXOzYW55Y2ggdyBiZXprcmVzLg0KezY2MjY1fXs2NjMyN31TdHdvcnp5bGmc
bXkgcGxhY/N3a2l8bmEgaW5ueWNoIHBsYW5ldGFjaCwNCns2NjMyN317NjY0MzV9db95d2FquWMg
bWFjaGluLHxieSBkb3N0b3Nvd2HmIJxyb2Rvd2lza28uDQp7NjY0Njl9ezY2NTk4fVByemV6IHN0
byB0eXNp6mN5IGxhdHxuYXN6YSBjeXdpbGl6YWNqYSBiebNhIHcgcm96a3dpY2llLg0KezY2NTk4
fXs2NjcyM30tIERva29ueXdhbGmcbXkgY3Vk83cufC0gQ28gc2nqIHN0YbNvPw0KezY2NzY0fXs2
Njg1N31Vc3Rhbm93aW9ubyBzenR1Y3puuSBrb250cm9s6iB1cm9kemXxLg0KezY2ODU5fXs2Njk1
NX1Qb3J6dWNvbm8gcGxhY/N3a2kgdyBrb3Ntb3NpZS4NCns2Njk1NX17NjcwMTh9V3ljemVycGFs
aZxteSBuYXN6ZSB6YXNvYnkgbmF0dXJhbG5lLg0KezY3MDIzfXs2NzE0Mn1Ta3V0a2llbSBiebNh
fGRlc3RhYmlsaXphY2phIGq5ZHJhIHBsYW5ldHkuDQp7NjcxODZ9ezY3MzAxfU5hc3ogd29qc2tv
d3kgcHJ6eXfzZGNhLHxnZW5lcmGzIFpvZCwNCns2NzMwM317NjczNTh9ZG9rb25hsyB6YW1hY2h1
IHN0YW51Li4uDQp7NjczOTd9ezY3NDUyfWFsZSBiebNvIGp1vyB6YSBw859uby4NCns2NzQ4MH17
Njc1NTB9UmF6ZW0geiB0d29quSBtYXRruXxwcnpld2lkemllbGmcbXkga2F0YXN0cm9m6g0KezY3
NTUwfXs2NzYyNH1pIHBvZGrqbGmcbXkga3Jva2ksfGJ5IHphcGV3bmnmIGNpIHByemV0cndhbmll
Lg0KezY3NjU4fXs2NzcxOH1UbyBqZXN0IGtvbW9yYSBuYXJvZHppbi4NCns2NzcxOH17Njc3OTl9
V3N6eXNjeSBLcnlwdG9uaWFuaWV8dyB0YWtpZWogc2nqIHBvY3rqbGkuDQp7Njc4MDJ9ezY3ODkz
fUthv2RlIGR6aWVja28gbWlhs28gc3Bls25p5nxva3JlnGxvbrkgcm9s6iB3IHNwb7NlY3pl8XN0
d2llLg0KezY3OTAwfXs2Nzk5MX1KYWtvIHJvYm90bmlrLCB3b2pvd25payx8cHJ6eXfzZGNhIGkg
dGFrIGRhbGVqLg0KezY4MDAzfXs2ODA4N31SYXplbSB6IHR3b2q5IG1hdGu5IHdpZXJ6eWxpnG15
LHy/ZSBLcnlwdG9uIHV0cmFjabMgY2+cIGNlbm5lZ28uDQp7NjgwODd9ezY4MTU5fUVsZW1lbnQg
d3lib3J1LCBzemFuc3kuDQp7NjgxNTl9ezY4MjY3fUEgamWcbGkgZHppZWNrbyBtYXJ6ebNvLHxi
eSB6b3N0YeYga2ltnCBpbm55bSwgbmm/IHphcGxhbm93YW5vPw0KezY4MzEwfXs2ODM5Mn1BIGpl
nGxpIG1hcnp5s28gbyB3eb9zenljaCBjZWxhY2g/DQp7NjgzOTR9ezY4NDQyfUJ5s2WcIHVjaWVs
ZZxuaWVuaWVtfG5hc3plaiB3aWFyeSwgS2FsLg0KezY4NDQ0fXs2ODUyMX1QaWVyd3N6ZSBuYXR1
cmFsbmUgbmFyb2R6aW55fG9kIHdpZWvzdy4NCns2ODUyOH17Njg2MTJ9RGxhdGVnbyBwb5x3aepj
aWxpnG15IHdzenlzdGtvLHxieZwgb2NhbGGzLg0KezY4NjIyfXs2ODY3OX1EbGFjemVnbyBuaWUg
cG9sZWNpZWxpnGNpZSB6ZSBtbrk/DQp7Njg3Mzl9ezY4Nzc4fU5pZSBtb2dsaZxteS4NCns2ODgx
MX17Njg4NzF9TWltbyB0ZWdvLHxqYWsgYmFyZHpvIGNoY2llbGmcbXksDQp7Njg4NzZ9ezY4OTM4
fWphayBiYXJkem8gY2nqIGtvY2hhbGmcbXkuLi4NCns2ODkzOH17NjkwNjB9QnlsaZxteSB3eXR3
b3JlbSBuaWVwb3dvZHpl8XxuYXN6ZWdvIJx3aWF0YSwgcG9kb2JuaWUgamFrIFpvZC4NCns2OTA2
M317NjkxMTF9WndpuXphbmkgemUgc3d5bSBsb3NlbS4NCns2OTExM317NjkxNjR9LSBaYXRlbSB6
b3N0YbNlbSBzYW0ufC0gTmllLg0KezY5MjAwfXs2OTI4OH1KZXN0ZZwgbmEgcvN3bml8ZHppZWNr
aWVtIFppZW1pIGkgS3J5cHRvbmEuDQp7NjkyOTN9ezY5Mzc1fU1vv2VzeiB1b3NhYmlh5iB0byx8
Y28gdyBvYnUgnHdpYXRhY2ggbmFqbGVwc3plLg0KezY5Mzc1fXs2OTQ2M31Nb79lc3ogYnnmIG1h
cnplbmllbSx8emEga3TzcmUgb2RkYWxpnG15IHogbWF0a7kgv3ljaWUuDQp7Njk1NzF9ezY5NjUz
fVRvIHByYXdkYSwgv2UgbWllc3prYfFjeSBaaWVtaXxy879uabkgc2nqIG9kIG5hcy4NCns2OTY1
M317Njk3MTV9QWxlIHdpZXJ66iwgv2UgdG8gZG9icnplLg0KezY5NzE1fXs2OTc4OX1OaWUgcG9w
ZbNuabkgdHljaCBzYW15Y2ggYrPqZPN3LHxjbyBteS4NCns2OTc4OX17Njk4NTl9TyBpbGUgaWNo
IHBvcHJvd2FkemlzeiwgS2FsLg0KezY5ODczfXs2OTk0OH1PIGlsZSBkYXN6IGltIG5hZHppZWrq
Lg0KezcwMDA1fXs3MDA3MH1UbyB3s2GcbmllIG96bmFjemEgdGVuIHN5bWJvbC4NCns3MDA3Mn17
NzAxMzl9U3ltYm9sIHJvZHppbnkgRWwgb3puYWN6YSBuYWR6aWVq6i4NCns3MDEzOX17NzAyOTV9
TmFkemllamEgdG8gcG9kc3Rhd2EsfGJ5IHcgbHVkemlhY2ggb2RuYWxln+YgZG9icm8uDQp7NzAz
Mjl9ezcwNDA4fVRvIHezYZxuaWUgbW+/ZXN6IGltIGRh5i4NCns3MDg1NH17NzA5MDl9L0RsYWN6
ZWdvIHRhayBzaeogb2QgbmljaCBy879uaeo/DQp7NzA5MzN9ezcxMDMxfS9JY2ggU7Nv8WNlIGpl
c3QgbbNvZHN6ZXwvaSBqYZxuaWVqc3plIG5pvyBuYXN6ZS4NCns3MTAzNn17NzEwOTZ9L1R3b2pl
IGtvbfNya2l8L2N6ZXJwabkgeiBuaWVnbyBlbmVyZ2nqLA0KezcxMDk2fXs3MTE4N30vd3ptYWNu
aWFquWMgdHdvamUgbWnqnG5pZSx8L3Nr83LqIGkgem15c7N5Lg0KezcxMjA2fXs3MTMzNn0vWmll
bXNrYSBncmF3aXRhY2phIGplc3Qgc7NhYnN6YSx8L2EgYXRtb3NmZXJhIGJhcmR6aWVqIG+/eXdj
emEuDQp7NzEzMzZ9ezcxNDEzfS9XeXJvc7NlnCBzaWxuaWVqc3p5fC9wb25hZCBtb2plIHd5b2Jy
Yb9lbmlhLg0KezcxNDIwfXs3MTU1Nn0vQnkgc2nqIGRvd2llZHppZeYsIGphayBzaWxueSx8L211
c2lzeiBzaeogd2Npub8gc3ByYXdkemHmLg0KezcyODA2fXs3MjkxMX0vUG9rYb9lc3ogbWllc3pr
YfFjb20gWmllbWkgaWRlYbMsfC9kbyBrdPNyZWdvIGLqZLkgZLm/eeYuDQp7NzI5NDJ9ezczMDU1
fS9C6mS5IHBy82Jvd2HmIGNp6iBnb25p5ix8L2LqZLkgc2nqIHBvdHlrYeYsIHVwYWRh5i4NCns3
MzA1N317NzMxMDV9L0FsZSB6IGN6YXNlbS4uLg0KezczMTMyfXs3MzIwNH0vZG+zuWN6uSBkbyBj
aWViaWUsfC9raWVkeSB3c3RhbmllIHOzb/FjZS4NCns3MzIzMH17NzMzNTl9L1ogY3phc2VtLHwv
cG9tb79lc3ogaW0gY3p5bmnmIGN1ZGEuDQp7NzUzMjN9ezc1NDMzfS9KYWsgem5hbGWf5iBrb2dv
nCx8L2t0byBjYbNlIL95Y2llIHNp6iB1a3J5d2GzPw0Kezc1NDMzfXs3NTUwOH0vVHJ6ZWJhIHN6
dWth5nwvd5xy82QgbWllanNraWNoIGxlZ2VuZC4NCns3NTUxN317NzU1OTZ9L1eccvNkIHpuYWpv
bXljaCB6bmFqb21lZ28sfC9rdPNyenkgamFrb2J5IGdvIHdpZHppZWxpLg0Kezc1NjEzfXs3NTY4
M30vRGxhIG5pZWt083J5Y2ggYnmzIGFuaW+zZW0gc3Ry879lbS4NCns3NTY4M317NzU3Nzl9L0Rs
YSBpbm55Y2ggamVkeW5pZSBkdWNoZW0uDQp7NzU4MjR9ezc1OTQ5fS9JbSBkYWxlaiB3IGN6YXNp
ZSx8L3R5bSBiYXJkemllaiB3c3p5c3RrbyB6YWN66rNvIHNp6iB6YXrqYmlh5i4NCns3NTk0OX17
NzYwMzd9LSBabmEgcGFuIG1vv2UgUGV0ZSdhIFJvc3NhP3wtIFByYWN1amUgdyBJSG9wLg0Kezc2
MDQyfXs3NjA5NX1Q82pkemllIHBhbmkgdyB0YW10eW0ga2llcnVua3UuLi4NCns3NjEwOX17NzYx
NTd9UGV0ZSBSb3NzPw0Kezc2MTg0fXs3NjMxM31DaGNpYbNhYnltIHBvcm96bWF3aWHmIG8gYXV0
b2J1c2llLHxrdPNyeSB3cGFksyBkbyByemVraS4NCns3NjQ1NX17NzY1MDN9UnVzdHkhDQp7NzY1
MTB9ezc2NTQzfVBhbmkgS2VudD8NCns3NjU1NX17NzY2MjV9SmVzdGVtIExvaXMgTGFuZXx6ICJU
aGUgRGFpbHkgUGxhbmV0Ii4NCns3NjYzN317NzY2ODV9U3Bva/NqIQ0Kezc2NjkwfXs3Njc3Nn1D
aGNpYbNhYnltIHBvcm96bWF3aWHmIG8gcGFuaSBzeW51Lg0Kezc2ODI5fXs3NjkxM31KT05BVEhB
TiBLRU5UfFVLT0NIQU5ZIE2lryBJIE9KQ0lFQw0Kezc3MjAzfXs3NzMwNn1XaWVkemlhs2FtLCC/
ZSB3IGtv8WN1fG1uaWUgem5hamR6aWVzei4NCns3NzQzM317Nzc0OTB9U2u5ZCBqZXN0ZZw/DQp7
Nzc0OTB9ezc3NTQ4fUNoY+ogb3Bvd2llZHppZeYgnHdpYXR1IHR3b2q5IGhpc3RvcmnqLg0Kezc3
NTQ4fXs3NzY4Mn0tIEEgamWcbGkgamEgdGVnbyBuaWUgY2hj6j98LSBUbyBuaWV1bmlrbmlvbmUu
DQp7Nzc2ODV9ezc3NzU5fUt0b5wgenJvYmkgemRq6mNpZSx8ZG93aWUgc2nqLCBnZHppZSBtaWVz
emthc3ouDQp7Nzc3NTl9ezc3Nzk1fVd0ZWR5IHpub3d1IHpuaWtu6i4NCns3Nzc5N317Nzc4NzJ9
VWRhs29ieSBjaSBzaeogdG8sfGdkeWJ5nCBwcnplc3RhsyBwb21hZ2HmIGx1ZHppb20sDQp7Nzc4
NzR9ezc3OTYwfWFsZSBjenVq6ix8v2UgdG8gbmllIHdjaG9kemkgdyByYWNodWLqLg0Kezc4MDMw
fXs3ODA3NX1N82ogb2pjaWVjIHdpZXJ6ebMsDQp7NzgwNzV9ezc4MTU1fb9lIGplnGxpIGx1ZHpp
ZSBkb3dpZWR6uSBzaeosfGtpbSBqZXN0ZW0uLi4NCns3ODE4MX17NzgyNDZ9d3lyemVrbrkgc2nq
IG1uaWUsIHplIHN0cmFjaHUuDQp7NzgzMDF9ezc4MzUxfS9NYW0ganW/IGRvnOYgdWtyeXdhbmlh
IHNp6i4NCns3ODM1MX17Nzg0MDJ9Q2hj6iByb2Jp5iBjb5wgcG+/eXRlY3puZWdvLg0Kezc4NDAy
fXs3ODQ3MX1QcmFjYSBuYSBmYXJtaWV8bmllIGplc3QgcG+/eXRlY3puYT8NCns3ODQ3M317Nzg1
MDJ9VGVnbyBuaWUgcG93aWVkemlhs2VtLg0Kezc4NTAyfXs3ODU3Mn1OYXN6YSByb2R6aW5hIHBy
YWN1amUgbmEgcm9saXxvZCBwaepjaXUgcG9rb2xl8S4NCns3ODU3NH17Nzg2MzR9V2FzemEsIGFs
ZSBuaWUgbW9qYS4NCns3ODYzNH17Nzg3MzJ9TmF3ZXQgbmllIGplc3RlnCBtb2ltIG9qY2VtLnxU
eSB0eWxrbyBtbmllIHpuYWxherNlnC4NCns3ODczMn17Nzg3NjR9Q2xhcmshDQp7Nzg4MTZ9ezc4
ODc0fU5pYyBzaeogbmllIHN0YbNvLg0Kezc4OTAwfXs3ODk2NX1DbGFyayBtYSByYWNq6i4NCns3
ODk3MH17NzkwMzJ9TmllIGplc3RlnG15IHR3b2ltaSByb2R6aWNhbWkuDQp7NzkwNDJ9ezc5MTM1
fUFsZSBvZCBzYW1lZ28gcG9jerl0a3V8ZG9rs2FkYWxpnG15IHdzemVsa2ljaCBzdGFyYfEuDQp7
NzkxMzV9ezc5MjYwfU1vv2UgdG8ganW/IG5pZSB3eXN0YXJjenkuDQp7NzkzNDl9ezc5NDIzfS0g
UG9zs3VjaGFqLCB0YXRvLi4ufC0gQ3pla2FqLg0Kezc5OTEyfXs3OTk3N31OYSBlc3Rha2Fk6i4N
Cns3OTk5Nn17ODAwNDF9SWSfY2llIG5hIGVzdGFrYWTqIQ0KezgwMDc3fXs4MDEwOX1LcnlqY2ll
IHNp6iENCns4MDEyNX17ODAxNzF9SWSfY2llIHphIG5pbSENCns4MDI3Nn17ODAzMDh9VXRrbuqz
YSENCns4MDM1MX17ODAzOTJ9WmEgbW65IQ0KezgwNDA2fXs4MDQ4MH1IYW5rIHpvc3RhsyB3IHdv
emllIQ0KezgwNTE0fXs4MDU2NH0tIFDzamTqIHBvIG5pZWdvLnwtIE5pZS4NCns4MDU4MX17ODA2
Mzh9WmFiaWVyeiBtYW3qIG5hIGVzdGFrYWTqLg0KezgxMzMxfXs4MTM4N30tIEpvbmF0aGFuIXwt
IE5pYyBtdSBuaWUgamVzdC4NCns4MTg2OH17ODE5MDd9LSBKb25hdGhhbiF8LSBab3N0YfEsIG1h
bW8uDQp7ODI1MjV9ezgyNTY2fS9UYXRvIQ0KezgyNjQ1fXs4MjczNn0vUG96d29sabNlbSB6Z2lu
ueYgb2pjdSx8L2JvIG11IHVmYbNlbS4NCns4MjczOX17ODI4Mzl9QnmzIHByemVrb25hbnksfL9l
IGJ5s28gemEgd2N6ZZxuaWUuDQp7ODI4NTZ9ezgyOTE2fYx3aWF0IG5pZSBiebMgbmEgbW5pZSBn
b3Tzdy4NCns4Mjk1MH17ODMwMTV9QSB0eSBqYWsgdXdhv2Fzej8NCns4MzA5OH17ODMxNTR9TGVw
aWVqIHV3Yb9haiwgTG9pcy4NCns4MzE3OH17ODMyMTF9UGVycnkgY2nqIHphYmlqZS4NCns4MzIx
Nn17ODMyODN9V2llLCC/ZSB0byB0eSBqZXN0ZZx8YW5vbmltb3d5bSCfcvNks2VtIFdvb2RidXJu
YS4NCns4MzI4OH17ODMzMzZ9Um96ZXJ3aWUgY2nqIG5hIHN0cnrqcHkuDQp7ODMzNjB9ezgzMzkz
fVBhdHJ6Y2llIG5hIG5puS4NCns4MzQ0NH17ODM1MDh9TmllIHd5ZGGzZW0gbmEgdG8gemV6d29s
ZW5pYS4NCns4MzUwOH17ODM1NzN9RGGzYZwgdG8gV29vZGJ1cm5vd2ksfL9lYnkgcHWcY2mzIHRv
IHcgSW50ZXJuZWNpZS4NCns4MzU3Nn17ODM2NTV9V3lkYXdjeSC/uWRharksfL9lYnltIGNp6iBw
b3p3YbMuDQp7ODM2NTd9ezgzNzE5fUkgdGFrIHRvIHJ6dWNhbS4NCns4MzcyMn17ODM3ODJ9LSBU
YWsgcG8gcHJvc3R1P3wtIFezYZxuaWUuDQp7ODM4MDh9ezgzODc1fS0gQSB0d29qZSBwcnplY3p1
Y2lhP3wtIE5pZSBzcHJhd2R6abN5IHNp6i4NCns4Mzg3NX17ODM5MDZ9VGEgaGlzdG9yaWEgdG8g
bmlld3lwYbMuDQp7ODM5MDl9ezgzOTkzfUEgbW+/ZSBuaWUgYnmzYSB0YWsgY2lla2F3YSx8amFr
IHNp6iBzcG9kemlld2GzYZwuDQp7ODQwMTR9ezg0MDkxfUR3YSB0eWdvZG5pZSBiZXpws2F0bmVn
byB1cmxvcHUuDQp7ODQwOTF9ezg0MTU4fUplc3pjemUgamVkZW4gdGFraSB3eXNrb2ssfHRvIGNp
6iB6d29sbmnqLg0Kezg0MTU4fXs4NDE4MH1Eb2JyemUuDQp7ODQxODV9ezg0Mjc4fVNrb3JvIG1h
bSB0d29quSB6Z29k6ix8bmllY2ggYupkuSB0cnp5IHR5Z29kbmllLg0Kezg0MzI0fXs4NDM4NH1X
aWVyeuosIL9lIGNvnCB3aWR6aWGzYZwsDQp7ODQzODR9ezg0NDU1fWFsZSBuaWUgdXdpZXJ66ix8
v2UgcHJ6ZWN6dWNpZSBjaeogbXlsabNvLg0Kezg0NDU4fXs4NDU2OH1aIGpha2llZ29rb2x3aWVr
IHBvd29kdXxwb3J6dWNhc3ogdOogc3ByYXfqLi4uDQp7ODQ1NzF9ezg0NjUwfS0gdXdhv2FtLCC/
ZSBwb3N06nB1amVzeiBzs3Vzem5pZS58LSBEbGFjemVnbz8NCns4NDY4Nn17ODQ3ODR9V3lvYnJh
v2FzeiBzb2JpZSByZWFrY2rqIGx1ZHppLi4uDQp7ODQ3ODl9ezg0OTA5fWdkeWJ5IGRvd2llZHpp
ZWxpIHNp6nxvIGlzdG5pZW5pdSBrb2dvnCB0YWtpZWdvPw0Kezg1MzUwfXs4NTM4OH1CaWVyeiBn
byENCns4NTUzNH17ODU1ODB9UG9wYXRyemNpZSB0eWxrbyENCns4NTk4MH17ODYwMzF9QnmzYSB0
dSBkemllbm5pa2Fya2EuDQp7ODYwNDN9ezg2MTEyfVNwb2tvam5pZSwgdG8gcHJ6eWphY2nzs2th
Lg0Kezg2MTc1fXs4NjIzMn0tIE1hbW8ufC0gQ28/DQp7ODYyNjh9ezg2MzI2fS0gWm5hbGF6s2Vt
IGljaC58LSBLb2dvPw0Kezg2MzUyfXs4NjM5NX1Nb2ljaCByb2R6aWPzdy4NCns4NjQxNH17ODY0
NTV9TfNqIGx1ZC4NCns4NjQ2N317ODY1NDl9V2llbSwgc2u5ZCBwb2Nob2R66i4NCns4NjYzN317
ODY2ODB9VG8gd3NwYW5pYWxlLg0Kezg2NzI2fXs4Njc3NH1CYXJkem8gc2nqIGNpZXN66i4NCns4
Njk5NX17ODcwNjl9LSBPIGNvIGNob2R6aT98LSBPIG5pYy4NCns4NzExNH17ODcyMDN9R2R5IGJ5
s2WcIG1hbHV0a2ksfGuzYWSzYW0gc2nqIHByenkga2+zeXNjZS4NCns4NzIwM317ODcyNTN9V3Oz
dWNoaXdhs2FtIHNp6iB3IHR382ogb2RkZWNoLg0Kezg3MjczfXs4NzMyOH1CebNvIGNpIGNp6r9r
by4NCns4NzM0Mn17ODc0MzF9TepjenmzZZwgc2nqLHxhIGphIHNp6iB6YW1hcnR3aWGzYW0uDQp7
ODc0MzF9ezg3NTEwfUJhs2GcIHNp6iwgv2Uga3RvnCBwb3puYSBwcmF3ZOouDQp7ODc1MTB9ezg3
NjMwfU5pZS58UHJhd2RhIG8gdG9iaWUgamVzdCBjdWRvd25hLg0Kezg3NjM3fXs4NzcxNH1XaWVk
emllbGmcbXkgdG8sfGdkeSB0eWxrbyBjaeogdWpyemVsaZxteS4NCns4Nzc3MX17ODc5MDN9V2ll
ZHppZWxpnG15LCC/ZSBraWVkeZx8Y2GzeSCcd2lhdCB0byB6cm96dW1pZS4NCns4NzkzMH17ODc5
Nzh9UG8gcHJvc3R1hQ0Kezg3OTgwfXs4ODA1NH1ib2rqIHNp6iwgv2UgbWkgY2llYmllIHphYmlv
crkuDQp7ODgwOTB9ezg4MTQ4fU5pZ2R6aWUgc2nqIG5pZSB3eWJpZXJhbSwgbWFtby4NCns4ODE5
MX17ODgyMzl9T2JpZWN1auouDQp7ODgzNjh9ezg4NTIyfS0gUGFuaWUgZ2VuZXJhbGUufC0gVG8g
a29tZXRhPyBBc3Rlcm9pZGE/DQp7ODg1NDN9ezg4NjU0fUtvbWV0eSBuaWUgZG9rb251arkga29y
ZWt0eSBrdXJzdS4NCns4ODcwOX17ODg4MjF9Q2hjaWGzZW0sIL9lYnkgcGFuIHRvIHpvYmFjenmz
LHx6YW5pbSBrdG+cIHd5d2+zYSBvZ/Nsbm+cd2lhdG93uSBwYW5pa+ouDQp7ODg4NDN9ezg4OTQx
fVN0YXRlayBqZXN0IG5hIG9yYmljaWUgb2tvs29rc2nqv3ljb3dlai4NCns4ODk1Nn17ODkwMDF9
TmllIHdpYWRvbW8gcG8gY28uDQp7ODkwMTN9ezg5MDkyfVBy82Jvd2FsaZxjaWUga29udGFrdHU/
DQp7ODkwOTV9ezg5MTYyfUphayBuYSByYXppZSBuaWUgb2Rwb3dpYWRharkuDQp7ODkyMTB9ezg5
MjY1fVRvIHR5bGtvIHByenlwdXN6Y3plbmlhLA0Kezg5Mjc3fXs4OTM5N31hbGUga3Rva29sd2ll
ayB0eW0gcHJ6eWxlY2lhsyx8Y2hjZSB3eXdyemXmIG5hIG5hcyB3cmG/ZW5pZS4NCns4OTUzMX17
ODk2MDN9S3RvnCB3aWUsfGdkemllIG1hbXkgemFwYXNvd2UgdG9uZXJ5Pw0Kezg5NjAzfXs4OTY2
M30tIE8gY28gY2hvZHppP3wtIEplc3QgbmEgd3N6eXN0a2ljaCBrYW5hs2FjaC4NCns4OTY2M317
ODk3MTF9TXVzaXN6IHRvIHpvYmFjennmLg0KezkwMzUxfXs5MDM5MH1DbGFyayENCns5MDM5MH17
OTA0NDB9SWTqLg0KezkxNTE0fXs5MTU2Mn0vTmllIGplc3RlnGNpZSBzYW1pLg0KezkxNjA1fXs5
MTY2M30vTmllLi4uIGplc3QuLi4gc2EuLi4NCns5MTcwM317OTE3Njh9L05pZSBqZXN0ZZxjaWUg
c2FtaS4NCns5MjU4M317OTI2NzJ9LSBUbyBpZHppZSBwcnpleiBSU1MufC8tIE5pZSBqZXN0ZZxj
aWUgc2FtaS4NCns5MjY4NH17OTI3NDZ9TmEgdGVsZWZvbmllIHRlvyB0byBtYW0uDQp7OTI3ODB9
ezkyODQ3fS9KZXN0ZW0gZ2VuZXJhsyBab2QuDQp7OTI4ODF9ezkyOTc0fS9Qcnp5Ynl3YW0geiBv
ZGxlZ7NlaiBwbGFuZXR5Lg0KezkyOTgxfXs5MzEwMX0vUHJ6ZWJ5s2VtIGRvIHdhc3wvY2GzeSBv
Y2VhbiBnd2lhemQuDQp7OTMxMjV9ezkzMjMzfS9PZCBqYWtpZWdvnCBjemFzdSB3YXN6IJx3aWF0
fC9nb5xjaSBuYXN6ZWdvIG9ieXdhdGVsYS4NCns5MzIzNX17OTMzNjV9L6+5ZGFtLCBieZxjaWUg
d3lkYWxpIGdvfC9wb2QgbW9quSBwaWVjeuouDQp7OTMzNzd9ezkzNTI4fS9aIG5pZXpuYW55Y2gg
cHJ6eWN6eW58L3Bvc3Rhbm93abMgdWtyeeYgcHJ6ZWQgd2FtaSBzd2UgaXN0bmllbmllLg0Kezkz
NTUwfXs5MzYzMX0vVWN6eW5pIHdzenlzdGtvLHwvYnkgd3RvcGnmIHNp6iB3IG90b2N6ZW5pZS4N
Cns5MzYzMX17OTM2OTZ9L1Vwb2RvYm5pIHNp6iBkbyB3YXMuDQp7OTM2OTZ9ezkzNzU2fS9KZWRu
YWsgbmllIGplc3QgamVkbnltIHogd2FzLg0KezkzNzg5fXs5NDAyOX0vSmWcbGkgem5hc3ogbWll
anNjZSBqZWdvIHBvYnl0dSx8L2xvcyBaaWVtaSBqZXN0IHcgdHdvaWNoIHLqa2FjaC4NCns5NDA1
MX17OTQxMTV9L1OzdWNoYWogbW5pZSwgS2FsLUVsLg0Kezk0MTY4fXs5NDI2OX0vUG9kZGFqIHNp
6iB3IGNpuWd1IDI0IGdvZHppbi4uLg0Kezk0MzE3fXs5NDQyNX0vYWxibyBwYXRyeix8L2phayB0
ZW4gnHdpYXQgYupkemllIGNpZXJwaWGzLg0Kezk0NzU4fXs5NDgyMH0vTmljIG8gbmltIG5pZSB3
aWVteS4NCns5NDgyMH17OTQ5NTB9L0plnGxpIG1hIG5hIHd6Z2zqZHppZSBuYXN6ZSBkb2Jybyx8
L3Bvd2luaWVuIG9kZGHmIHNp6iB3IGljaCBy6mNlLg0Kezk0OTUwfXs5NTAzMX0vSmWcbGkgZ28g
bmEgdG8gbmllIHN0YeYsfC9tb79lIHBvd2lubmmcbXkgZ28gd3lkYeYuDQp7OTUwMzF9ezk1MTQy
fS9Qb3dpbm5pnG15IHNweXRh5iBMb2lzIExhbmUsfC9rdPNyYSB6bmEgamVnbyB0b79zYW1vnOYu
DQp7OTUxNDZ9ezk1MjExfS9Ud2llcmR6aSBwYW4sfC+/ZSBMb2lzIExhbmUgd2llLi4uDQp7OTUy
MjN9ezk1MzAwfU9nbLlkYXN6IHRvP3xQdXN6Y3pharkgb2Qgc2FtZWdvIHJhbmEuDQp7OTUzMDB9
ezk1MzY1fVBpZXJ3c3p5IHJheiBzaeogeiBuaW0gemdhZHphbS58V2lkemlhs2GcIGdvPw0Kezk1
MzcyfXs5NTQyOX1OaWUgaSBuaWdkeSBieW0gY2kgbyB0eW18bmllIHBvd2llZHppYbNhLg0Kezk1
NDI5fXs5NTUzMH1UbyB6YWdyb79lbmllIGRsYSBjYbNlZ28gnHdpYXRhLg0Kezk1NTQwfXs5NTYy
OH0vTmllIGN6YXMgemFzs2FuaWHmIHNp6nwvZHppZW5uaWthcnNruSBldHlruS4NCns5NTYzNX17
OTU3NTN9L1RvIHBvd2G/bmEgc3ByYXdhLnwvRkJJIHJ6dWNhIHR1IG9za2Fyv2VuaWFtaSBvIHpk
cmFk6i4NCns5NTc1M317OTU3OTl9TXVzeuoga2/xY3p55i4NCns5NjE4MH17OTYyNjR9RkJJLCBy
6mNlIGRvIGfzcnkhfFJ6deYgYmFnYb8hDQp7OTY0MjJ9ezk2NTA2fS9PIG5hc3p5Y2ggZ2+cY2lh
Y2h8L3dpZW15IG5hIHJhemllIGJhcmR6byBuaWV3aWVsZS4NCns5NjUwOH17OTY2MjF9L1dlZLN1
ZyBvcGluaWkgcnq5ZG93eWNoIGVrc3BlcnTzd3wvbmllIHN0YW5vd2m5IHphZ3Jvv2VuaWEsDQp7
OTY2MjF9ezk2Njc4fS9taW1vIHqzb3dyb2dpZWdvIHRvbnV8L2ljaCBwcnpla2F6dS4NCns5NjY3
OH17OTY3OTF9L1dzenlzY3kgamVkbmFrIHphZGFquSBzb2JpZSBweXRhbmllOnwvS2ltIGplc3Qg
S2FsLUVsPw0Kezk2NzkxfXs5Njg5NH0vQ3p5IG5hcHJhd2TqIGlzdG5pZWplP3wvSmFrIG3zZ7Mg
dGFrIGSzdWdvIHBvem9zdGF3YeYgdyB1a3J5Y2l1Pw0Kezk3MDA3fXs5NzA1NX1ObyBjaG9knywg
S2VudC4NCns5NzE5Nn17OTcyMzd9V2FsY3ohDQp7OTcyNDR9ezk3MjkyfVdzdGF3YWouDQp7OTcz
NTB9ezk3MzkzfVRvIHdzenlzdGtvPw0Kezk3NDA3fXs5NzQ1OH1UeWxrbyBuYSB0eWxlIGNp6iBz
dGHmPw0Kezk3NDc0fXs5NzUyMH1ObyBkYWxlaiwgS2VudC4NCns5NzU0Mn17OTc1NzV9V2FsY3oh
DQp7OTgyNjh9ezk4MzU5fS0gWnJvYmlsaSBjaSBrcnp5d2TqP3wtIFByemVjaWW/IHdpZXN6LCC/
ZSBuaWUgbW9nuS4NCns5ODM2OX17OTg0MzF9UHl0YbNlbSwgY3p5IHdzenlzdGtvIGdyYT8NCns5
ODQ2MH17OTg1NzB9LSBUYWsgYmFyZHpvIGNoY2lhs2VtIG11IHByenl3YWxp5i58LSBXaWVtLg0K
ezk4NTgyfXs5ODY3MX1UZb8gY2hjaWGzZW0sfL9lYnmcIHRvIHpyb2JpsywgYWxlIGNvIHBvdGVt
Pw0Kezk4NjczfXs5ODczMX1Qb2N6dbNieZwgc2nqIGxlcGllaj8NCns5ODc3Mn17OTg4ODd9TXVz
aXN6IHpkZWN5ZG93YeYsfG5hIGpha2llZ28gY3qzb3dpZWthIHd5cm+cbmllc3ouDQp7OTg4ODd9
ezk4OTYxfUJvIHRlbiBjerNvd2llaywgZG9icnkgY3p5IHqzeS4uLg0Kezk5MDA0fXs5OTA3MX1v
ZG1pZW5pIJx3aWF0Lg0Kezk5MTg0fXs5OTIzMn0vQ28gY2nqIGdu6mJpPw0Kezk5MzU5fXs5OTQ1
NX0tIE5pZSB3aWVtLCBvZCBjemVnbyB6YWN6ueYufC0gT2QgY3plZ28gY2hjZXN6Lg0Kezk5NDkx
fXs5OTU2NX1UZW4gc3RhdGVrLCBrdPNyeSBzaeogcG9qYXdpsy4uLg0Kezk5NTcwfXs5OTYzMn1U
byBtbmllIHN6dWtharkuDQp7OTk3MjN9ezk5ODM4fS0gV2llc3osIGN6ZWdvIG9kIGNpZWJpZSBj
aGO5P3wtIE5pZS4NCns5OTg0MX17OTk5NzN9TmF3ZXQgamWcbGkgc2nqIHBvZGRhbSx8Z2VuZXJh
syBab2QgbW+/ZSBuaWUgZG90cnp5bWHmIHOzb3dhLg0Kezk5OTg1fXsxMDAxMDB9SmWcbGkgb2Rk
YWq5YyBzaeogdyBpY2ggcupjZXxtb2fqIG9jYWxp5iBaaWVtaeouLi4NCnsxMDAxMTR9ezEwMDE2
Mn1jenkgbmllIHBvd2luaWVuZW0gdGVnbyB1Y3p5bmnmPw0KezEwMDE4MX17MTAwMjg3fS0gQ28g
cG9kcG93aWFkYSBjaSBpbnR1aWNqYT98LSBab2Rvd2kgbmllIG1vv25hIHVmYeYuDQp7MTAwMzQy
fXsxMDA0NzZ9UHJvYmxlbSB3IHR5bS4uLny/ZSBuaWUgcG90cmFmaeogdGW/IHphdWZh5iBsdWR6
aW9tLg0KezEwMDY1OH17MTAwNzQ3fUN6YXNhbWkgdHJ6ZWJhIHV3aWVyennmLi4uDQp7MTAwNzcx
fXsxMDA4Mjl9YSB6YXVmYW5pZSBwcnp5amR6aWUgeiBjemFzZW0uDQp7MTAxNDAyfXsxMDE0NjR9
VWRhs28gY2kgc2nqfHByenljablnbrnmIG5hc3q5IHV3YWfqLg0KezEwMTQ2OX17MTAxNTUwfS0g
Q3plZ28gY2hjZXN6P3wtIENoY+ogcm96bWF3aWHmIHogTG9pcyBMYW5lLg0KezEwMTU1OH17MTAx
NjA4fVNruWQgcG9teXOzLCC/ZSBqZXN0IHogbmFtaT8NCnsxMDE2MDh9ezEwMTY5NH1OaWUgYmF3
bXkgc2nqIHcgY2l1Y2l1YmFia+oufFBvZGRhbSBzaeouDQp7MTAxNjk3fXsxMDE3ODF9UG9kIHdh
cnVua2llbSx8v2UgemFnd2FyYW50dWplY2llIGplaiB3b2xub5zmLg0KezEwMTk5Mn17MTAyMDYx
fS9EbGFjemVnbyBvZGRhamVzeiBzaeogdyBy6mNlIFpvZGE/DQp7MTAyMDcxfXsxMDIxNTl9T2Rk
YWrqIHNp6iB3IHLqY2UgbHVkemtvnGNpLHx0byBy879uaWNhLg0KezEwMjE4Nn17MTAyMjM2fVBv
endvbGmzZZwgc2nqIHNrdeYuDQp7MTAyMjQ4fXsxMDIzMzd9SW5hY3plaiBuaWUgd3lnbLlkYbNv
YnkgdG8gd2lhcnlnb2RuaWUuDQp7MTAyMzQ0fXsxMDI0NzF9U2tvcm8gcG9jenVsaSBzaeogYmV6
cGllY3puaWVqc2ksfHRvIHR5bSBsZXBpZWouDQp7MTAyNTY5fXsxMDI2NjB9Q28gb3puYWN6YSB0
YSBsaXRlcmEgIlMiPw0KezEwMjY4N317MTAyNzQ0fVRvIG5pZSBsaXRlcmEuDQp7MTAyNzU2fXsx
MDI4MjZ9VyBtb2ltIJx3aWVjaWUgdG8gc3ltYm9sIG5hZHppZWkuDQp7MTAyODM4fXsxMDI5MzR9
QSB3IG5hc3p5bSB0byBsaXRlcmEgIlMiLg0KezEwMjk3Mn17MTAzMDQ2fUEgbW+/ZS4uLg0KezEw
MzExNn17MTAzMTgxfS0gU3VwZXIuLi58Ly0gV2l0YW0uDQp7MTAzMTk1fXsxMDMyNzd9LSBKZXN0
ZW0gZG9rdG9yLi4ufC8tIEVtaWwgSGFtaWx0b24sIHdpZW0uDQp7MTAzMjg0fXsxMDMzMzl9V2lk
euogaWRlbnR5ZmlrYXRvcnx3IHBh8XNraWVqIGtpZXN6ZW5pLg0KezEwMzM0MX17MTAzNDEzfUkg
bmFwb2N66nRlIG9wYWtvd2FuaWUgZHJvcHPzdy4NCnsxMDM0MjB9ezEwMzUzM30vV2lkeuogdGW/
IHphIHdhbWl8L29kZHppYbMgv2+zbmllcnp5IHogcGFyYWxpemF0b3JlbS4NCnsxMDM1MzN9ezEw
MzU2N31OaWUgYupkemllIHBvdHJ6ZWJueS4NCnsxMDM1Njd9ezEwMzY1NX1NdXNpbXkgc2nqIGph
a2+cIHphYmV6cGllY3p55i4NCnsxMDM2NTV9ezEwMzcxOH1Nb79lIHBhbiBieeYgbm9zaWNpZWxl
bXxqYWtpZWdvnCB3aXJ1c2EuDQp7MTAzNzIzfXsxMDM3OTd9r3lq6iB0dSBvZCAzMyBsYXR8aSBq
ZXN6Y3plIG5pa29nbyBuaWUgemFyYXpps2VtLg0KezEwMzgwNH17MTAzODk4fUFsYm8gbyB0eW0g
bmllIHdpZXN6LnxNYW15IHBvZHN0YXd5IGRvIG9iYXcuDQp7MTAzODk4fXsxMDQwMTd9V3lqYXdp
s2WcIHN3b2q5IHRvv3NhbW+c5iBwYW5uaWUgTGFuZS58L0RsYWN6ZWdvIG5pZSB3eWphd2lzeiBq
ZWogbmFtPw0KezEwNDA0NH17MTA0MTExfUthcnR5IG5hIHN087MsIGdlbmVyYWxlLg0KezEwNDEy
OH17MTA0MTkzfUJvaWNpZSBzaeogbW5pZSx8Ym8gbmllIG1vv2VjaWUgbW5pZSBrb250cm9sb3dh
5i4NCnsxMDQxOTN9ezEwNDI2NH1OaWdkeSBuaWUgYupkemllY2llIG1vZ2xpLg0KezEwNDI3Nn17
MTA0MzI5fUFsZSB0byBuaWUgb3puYWN6YSx8v2UgamVzdGVtIHdhc3p5bSB3cm9naWVtLg0KezEw
NDMzMn17MTA0NDAzfUEga3RvIG5pbSBqZXN0PyBab2Q/DQp7MTA0NDE4fXsxMDQ1MTZ9LSBUZWdv
IHezYZxuaWUgc2nqIG9iYXdpYW0ufC0gVGFrIGN6eSBpbmFjemVqLA0KezEwNDUxOX17MTA0NjAw
fXd5ZGGzZW0gcm96a2F6LHxieSBjaeogZG8gbmllZ28gZG9wcm93YWR6b25vLg0KezEwNDYwN317
MTA0NjcwfU5pZWNoIHBhbiByb2JpIHN3b2plLCBnZW5lcmFsZS4NCnsxMDQ3NzV9ezEwNDg1N30t
IER6aeprdWrqLnwtIFphIGNvPw0KezEwNDg3MX17MTA0OTI5fVphIHRvLCC/ZSB3ZSBtbmllIHV3
aWVyenmzYZwuDQp7MTA0OTgxfXsxMDUwNDF9SSB0YWsgbmllIG1hIHRvIHpuYWN6ZW5pYS4NCnsx
MDUwNTF9ezEwNTA5NH1EbGEgbW5pZSBtYS4NCnsxMDU1ODN9ezEwNTYzM31OYWRsYXR1arkuDQp7
MTA1NjMzfXsxMDU2ODF9UG93aW5uYZwganW/IGmc5i4NCnsxMDU3Mjl9ezEwNTc4MH1PZGVqZJ8s
IExvaXMuDQp7MTA3NDgyfXsxMDc1OTB9S2FsLUVsLCBqZXN0ZW0gcG9kZG9382RjYSBGYW9yYS1V
bC4NCnsxMDc1OTJ9ezEwNzY4OH1XIGltaWVuaXUgZ2VuZXJhs2EgWm9kYXxwcnpla2F6dWrqIGNp
IHBvemRyb3dpZW5pYS4NCnsxMDc4MDN9ezEwNzg3NX0tIFBhbiB0dSBkb3dvZHppP3wtIE93c3pl
bS4NCnsxMDc4Nzh9ezEwNzk4OH1HZW5lcmGzIFpvZCBjaGNlLHxieSB0YSBrb2JpZXRhIG1pIHRv
d2FyenlzenmzYS4NCnsxMDgwMTR9ezEwODEyOX1DaGNpZWxpnGNpZSBvYmNlZ28ufE5pZSBiebNv
IG1vd3kgbyBqZWRueW0geiBuYXMuDQp7MTA4MTMyfXsxMDgyMjV9TWFtIHByemVrYXph5iBnZW5l
cmGzb3dpLHy/ZSBvZG1hd2lhY2llPw0KezEwODIzMH17MTA4MjkyfU5pZSBvYmNob2R6aSBtbmll
LHxjbyBtdSBwcnpla2G/ZXN6Lg0KezEwODM0MH17MTA4Mzk1fVcgcG9yerlka3UuDQp7MTA4NDAz
fXsxMDg0NDF9UPNqZOouDQp7MTA5NDYyfXsxMDk1NjF9QXRtb3NmZXJhIG5hIHN0YXRrdXxuaWUg
amVzdCBwcnp5c3Rvc293YW5hIGRsYSBsdWR6aS4NCnsxMDk1NjN9ezEwOTY0OX1C6mR6aWVzeiBt
dXNpYbNhIHphs2+/eeYgbWFza+ouDQp7MTEwMjUxfXsxMTAyODJ9S2FsLUVsLg0KezExMDMxMX17
MTEwNDEyfU5pZSBtYXN6IHBvaupjaWEsfGphayBks3VnbyBjaeogc3p1a2FsaZxteS4NCnsxMTA0
MTd9ezExMDQ5Nn0tIFpvZCwgamFrIHJvenVtaWVtLnwtIEdlbmVyYbMgWm9kLCBuYXN6IGRvd/Nk
Y2EuDQp7MTEwNDk4fXsxMTA1OTR9VyBwb3J6uWRrdSwgRmFvcmEufE1vv25hIG11IHd5YmFjennm
IGJyYWsgbWFuaWVyLg0KezExMDU5OX17MTEwNjQ5fU5pZSB6bmEgbmFzenljaCB6d3ljemFq83cu
DQp7MTEwNjUyfXsxMTA3Njd9VG8gY2h3aWxhIG5hIJx3aep0b3dhbmllLHxhIG5pZSBuYSBrs/N0
bmllLg0KezExMDg2N317MTEwOTMwfUN6dWrqIHNp6iBkeml3bmllLg0KezExMDk5Mn17MTExMDQw
fVOzYWJvIG1pLg0KezExMTA4OH17MTExMTYyfS0gQ28gbXUgamVzdD98LSBPZHJ6dWNhIG5hc3q5
IGF0bW9zZmVy6i4NCnsxMTExOTN9ezExMTMwMX1aYWFkYXB0b3dhs2WcIHNp6iBkbyB6aWVtc2tp
Y2ggd2FydW5r83csfG5pZSBkbyBuYXN6eWNoLg0KezExMTMwNn17MTExNDA5fS0gUG9t878gbXUu
fC0gTmllIG1vZ+ouIE11c2kgc2FtbyBwcnplapzmLg0KezExMTQ1NX17MTExNTAzfVBvbfO/Y2ll
IG11IQ0KezExMTUyOX17MTExNTc3fVBvbfO/Y2llIQ0KezExMTgzNn17MTExODcyfVdpdGFqLCBL
YWwuDQp7MTExOTIwfXsxMTE5NzN9QSBtb79lIHdvbGlzeiAiQ2xhcmsiPw0KezExMTk4NX17MTEy
MDU0fVRha2llIGltaeogY2kgbmFkYWxpLCBjenm/IG5pZT8NCnsxMTIwODV9ezExMjE5Nn1CebNl
bSBuYSBLcnlwdG9uaWUgZG9382RjuSBhcm1paSx8YSB0d/NqIG9qY2llYyAtIG5hc3p5bSBuYWp3
aeprc3p5bSB1Y3pvbnltLg0KezExMjE5Nn17MTEyMjg0fVpnYWR6YWxpnG15IHNp6iBjbyBkbyB0
ZWdvLHy/ZSBLcnlwdG9uIHVtaWVyYS4NCnsxMTIyODl9ezExMjQyMX1XIHphbWlhbiB6YSBwcvNi
6iBvY2FsZW5pYXxuYXN6ZWogY3l3aWxpemFjamkgaSBwbGFuZXR5LA0KezExMjQzMX17MTEyNTM0
fXdyYXogeiBtb2ltaSBvZmljZXJhbWl8em9zdGFsaZxteSB6ZXOzYW5pIGRvIFN0cmVmeSBXaWRt
by4NCnsxMTI1OTR9ezExMjcxNH0vWmFns2FkYSBuYXN6ZWdvIJx3aWF0YXwvdXdvbG5ps2EgbmFz
Lg0KezExMjg0NX17MTEyODkzfS9Ecnlmb3dhbGmcbXkuDQp7MTEyOTAxfXsxMTMwMjN9L1NrYXph
bmkgbmEgnG1pZXLmIGezb2Rvd7l8L3eccvNkIHN6Y3q5dGvzdyBuYXN6ZWogcGxhbmV0eS4NCnsx
MTMwNDR9ezExMzA5NX0vSmFrIHRyYWZpbGmcY2llIG5hIFppZW1p6j8NCnsxMTMxMDB9ezExMzE5
OH0vV3lrb3J6eXN0YWxpnG15IHByb2pla3RvciBmYW50b21vd3l8L2RvIGJ1ZG93eSBoaXBlcm5h
cOpkdS4NCnsxMTMyMTV9ezExMzMyMH0vVGFruSBzYW25IG1vZHlmaWthY2rqfC9vamNpZWMgemFt
b250b3dhsyB3IHR3b2ltIHN0YXRrdS4NCnsxMTMzNDJ9ezExMzQxNH0vVGFrIG90byBuYXJ66mR6
aWUgbmFzemVqIHpndWJ5Li4uDQp7MTEzNDU3fXsxMTM1MTJ9L3N0YbNvIHNp6iBuYXN6eW0gd3li
YXdpZW5pZW0uDQp7MTEzNjE3fXsxMTM3MjN9L1NwcmF3ZHphbGmcbXkgbmFzemUgZGF3bmUga29s
b25pZXwvdyBwb3N6dWtpd2FuaXUgb3puYWsgv3ljaWEuDQp7MTEzODA0fXsxMTM4Njd9L1puYWxl
n2xpnG15IGplZHluaWUgnG1pZXLmLg0KezExMzg4OH17MTEzOTk0fS9PZGNp6nRlIG9kIEtyeXB0
b25hLHwvcGxhY/N3a2kgZGF3bm8gd3ltYXKzeS4NCnsxMTQwMTh9ezExNDEyM30vVXJhdG93YWxp
nG15LCBjbyBzaeogZGGzbzp8L3picm9qZSwgYnJv8S4NCnsxMTQxMjZ9ezExNDE5M30vTmF3ZXQg
amVkbrkgTWFjaGlu6iCMd2lhdPN3Lg0KezExNDIxMH17MTE0Mjg2fS9QcnpleiAzMyBsYXRhfC9j
enluaWxpnG15IHByenlnb3Rvd2FuaWEsDQp7MTE0MjkxfXsxMTQzNjN9L2G/IHcga2/xY3Ugb2Rl
YnJhbGmcbXl8L3N5Z25hsyBhbGFybW93eSwNCnsxMTQzNjZ9ezExNDQ3M30va3TzcnkgYWt0eXdv
d2GzZZx8L25hIHN0YXJ5bSBzdGF0a3UgendpYWRvd2N6eW0uDQp7MTE0NDkwfXsxMTQ1NjB9VHkg
bmFzIHR1IHNwcm93YWR6abNlnCwgS2FsLg0KezExNDU5M317MTE0Njk2fVcgdHdvamVqIG1vY3kg
bGW/eXxvY2FsZW5pZSBuYXN6ZWogcmFzeS4NCnsxMTQ4MjZ9ezExNDkxMn1OYSBLcnlwdG9uaWUs
IGtvZCBnZW5ldHljem55LHxtYWq5Y3ljaCBzaeogbmFyb2R6aeYgb3NvYm5pa/N3LA0KezExNDkx
NX17MTE0OTg5fXphcGlzYW55IGJ5syB3IFJlamVzdHJ6ZSBPYnl3YXRlbGkuDQp7MTE1MDA2fXsx
MTUxMzN9VHfzaiBvamNpZWMgc2tyYWSzIEtvZGV4fGkgdWtyebMgZ28gdyB0d29qZWoga2Fwc3Vs
ZS4NCnsxMTUxNDV9ezExNTE4OH1QbyBjbz8NCnsxMTUxOTN9ezExNTI3NH1CeSBLcnlwdG9uIG3z
Z7MgenJvZHpp5iBzaep8bmEgbm93by4uLg0KezExNTI4MX17MTE1MzIyfW5hIFppZW1pLg0KezEx
NTc5Mn17MTE1ODQyfUdkemllIGplc3QgS29kZXg/DQp7MTE1ODgxfXsxMTU5NDN9SmWcbGkgS3J5
cHRvbiBzaeogb2Ryb2R6aS4uLg0KezExNTk1NX17MTE2MDAxfWNvIHN0YW5pZSBzaeogeiBaaWVt
abk/DQp7MTE2MDEzfXsxMTYwOTR9RG8gb2RidWRvd3kgcG90cnplYmEgZnVuZGFtZW5083cuDQp7
MTE2MTAxfXsxMTYxODF9TmF3ZXQgdHfzaiBvamNpZWMgdG8gd2llZHppYbMuDQp7MTE2MzIyfXsx
MTYzNzV9TmllLg0KezExNjQxNX17MTE2NTA5fS0gTmllIHByenljenluaeogc2nqIGRvIHRlZ28u
fC0gQSBkbyBjemVnbyBzaeogcHJ6eWN6eW5pc3o/DQp7MTE2NTExfXsxMTY1MzV9TmllIQ0KezEx
NjU3MX17MTE2NTk1fVByemVzdGHxIQ0KezExNjg0OX17MTE2OTU1fVR382ogb2pjaWVjIG9kc3pl
ZLMgeiBob25vcmVtLg0KezExNzAwMH17MTE3MTAxfS0gWmFiabNlnCBnbz98LSBUYWsuDQp7MTE3
MTA0fXsxMTcyMTF9UHJ6ZZxsYWR1amUgbW5pZSB0b3xrYb9kZWdvIGRuaWEuDQp7MTE3MjIxfXsx
MTczNjV9QWxlIHpyb2Jps2J5bSB0byBwb25vd25pZS58TWFtIG9ib3dpuXplayB3b2JlYyBtb2pl
Z28gbHVkdS4NCnsxMTczNjd9ezExNzQ5MH1OaWtvbXUgbmllIHBvendvbOosfGJ5IG1uaWUgb2Qg
dGVnbyBvZHdp82SzLg0KezExNzg1NH17MTE3OTA3fUNvIHNp6iBkemllamUsIG1ham9yemU/DQp7
MTE3OTA5fXsxMTgwMDB9RHdhIG9iaWVrdHl8d3lzdGFydG93YbN5IHogb2ty6nR1IG9iY3ljaC4N
CnsxMTgwMzR9ezExODA2NX1UbyBvbmUuDQp7MTE4MDY3fXsxMTgxNDd9V3lrb3J6eXN0YWpjaWUg
SS1Db20gNC58TXVzeuogd2llZHppZeYgY2+cIHdp6mNlai4NCnsxMTgxNTl9ezExODIxOH1Lb2Qg
bmEgZHppc2lhaiB0byAiVHLzanq5YiIuDQp7MTE4MjIxfXsxMTgzMTl9LSBOYWRsYXR1arkgZHdh
IHN0YXRraSBvYmN5Y2gufC0gTWFteSBkYW5lIHogSS1Db20gNC4NCnsxMTgzMjR9ezExODQ0MX0t
IFBy6mRrb5zmP3wtIDM4MCB36nqz83cuIE5pZSBvZHBvd2lhZGFquSBuYSB3ZXp3YW5pYS4NCnsx
MTg0NTF9ezExODUwNH1TemtvZGEgd3lzabNrdS4NCnsxMTg1MjN9ezExODY0M31TabNhLCBrdPNy
uSBjemVycGllc3ogemUgU7Nv8WNhLHxuYSBuYXN6eW0gc3RhdGt1IG5pZSBkemlhs2EuDQp7MTE4
NjQ1fXsxMTg3ODd9VyB0eW0gnHJvZG93aXNrdXxqZXN0ZZwgdHlsa28gend5a7N5bSBjerNvd2ll
a2llbS4NCnsxMjAxNzN9ezEyMDI2OH0tIFNruWQgc2nqIHd6abmzZZw/fC0gS2x1Y3osIHBhbm5v
IExhbmUuDQp7MTIwMjczfXsxMjAzNTd9WmGzYWRvd2GzYZwgbW5pZSBkbyBwYW1p6mNpIGtvbXB1
dGVyYS4NCnsxMjAzNjJ9ezEyMDQ0M30tIEtpbSBqZXN0ZZw/fC0gT2pjZW0gS2FsYS4NCnsxMjA0
Nzl9ezEyMDU4MH0tIE1vv2VzeiBuYW0gcG9t82M/fC0gWmJ1ZG93YbNlbSB0ZW4gc3RhdGVrLg0K
ezEyMDU5NH17MTIwNjg2fU1vZ+ogcHJ6eXN0b3Nvd2HmfGplZ28gYXRtb3NmZXLqIGRsYSBsdWR6
aS4NCnsxMjA3MDB9ezEyMDc5Nn1Nb79lbXkgaWNoIHBvd3N0cnp5bWHmLnxPZGVzs2HmIHogcG93
cm90ZW0gZG8gU3RyZWZ5IFdpZG1vLg0KezEyMDgxMH17MTIwODY1fS0gSmFrP3wtIFBva2G/6iBj
aS4NCnsxMjA4NzB9ezEyMDk3OH1BIHR5IHBva2G/ZXN6IEthbG93aS58UG9tb79lc3ogbWk/DQp7
MTIxMjk3fXsxMjEzNTd9WmGzb2dhIHN0YXRrdSBqdb8gd2llLnxNdXNpbXkgc2nqIHBvc3BpZXN6
eeYuDQp7MTIxMzU5fXsxMjE0MDd9V3ljablnbmlqIGtsdWN6Lg0KezEyMTU4MH17MTIxNjQ1fS0g
VHkgdG8genJvYmmzZZw/fC0gVGFrLiBQb2RuaWWcIGJyb/EuDQp7MTIxODgwfXsxMjE5MjN9Q28g
c2nqIGR6aWVqZT8NCnsxMjI0MjF9ezEyMjQ2OX1QbyB0d29qZWogcHJhd2VqLiBPZ25pYSENCnsx
MjI0OTZ9ezEyMjU0NH1aYSB0b2K5IQ0KezEyMjgzMX17MTIyODkxfVdzablknyBkbyBrYXBzdbN5
IHJhdHVua293ZWouDQp7MTIyOTAzfXsxMjI5NTF9QmV6cGllY3puZWogcG9kcvO/eS4NCnsxMjI5
NTR9ezEyMzAyOH1aYXBld25lIHdp6mNlaiBzaeogbmllIHpvYmFjenlteS4NCnsxMjMwNDJ9ezEy
MzExOX1QYW1p6nRhaiwga2x1Y3pvd3kgZG8gaWNoIHBvd3N0cnp5bWFuaWF8amVzdCBuYXDqZCBm
YW50b21vd3kuDQp7MTIzMTQ2fXsxMjMxOTN9R7Nvd2EgdyBsZXdvLg0KezEyMzgyNn17MTIzOTAx
fVpvZCBt83dpsyBwcmF3ZOogbyBLb2RleGllPw0KezEyMzkwMX17MTIzOTQ5fVJvemJpaiB0ZW4g
cGFuZWwuDQp7MTI0MDMwfXsxMjQxMDl9Q2hjaWVsaZxteSwgYnmcIHdwaWVyd3xuYXVjenmzIHNp
6iBieeYgY3qzb3dpZWtpZW0uDQp7MTI0MTE5fXsxMjQxODR9QnmcLCB3ZSB3s2GcY2l3eW0gY3ph
c2llLA0KezEyNDE4OH17MTI0MjY1fW3zZ7MgYnnmIHBvbW9zdGVtfG1p6mR6eSBkd2llbWEgcmFz
YW1pLg0KezEyNDMyNX17MTI0MzczfVNw82pyei4NCnsxMjQ0MjN9ezEyNDQ2Mn1Mb2lzLg0KezEy
NDQ2NH17MTI0NTE5fU1vv2VzeiBquSBvY2FsaeYuDQp7MTI0NTY1fXsxMjQ2MjJ9TW+/ZXN6IG9j
YWxp5iBpY2ggd3N6eXN0a2ljaC4NCnsxMjY0OTd9ezEyNjU2Mn1UdSBi6mR6aWVzeiBiZXpwaWVj
em5hLg0KezEyNjU5MX17MTI2NjgyfS0gV3N6eXN0a28gdyBwb3J6uWRrdT98LSBUYWsuDQp7MTI2
NzM1fXsxMjY4ODN9TmllIGNoY2lhs2FtIGltIG5pYyBwb3dpZWR6aWXmLHxhbGUgamFrb5wgd25p
a27qbGkgZG8gbW9qZWogZ7Nvd3kuLi4NCnsxMjY4ODN9ezEyNjk2N31Kdb8gZG9icnplLCBMb2lz
LnxaZSBtbrkgenJvYmlsaSB0byBzYW1vLg0KezEyNzI3Mn17MTI3MzIwfUNsYXJrIQ0KezEyNzUy
MX17MTI3NjE1fUdkemllIHN0YXRlaywgdyBrdPNyeW0gcHJ6eWJ5sz8NCnsxMjc2NTN9ezEyNzcx
M31JZJ8gZG8gZGlhYrNhLg0KezEyNzk1MH17MTI3OTk4fVRhbS4NCnsxMjg1MjF9ezEyODU4Nn1L
b2RleHUgdGFtIG5pZSBtYS4NCnsxMjg3MzR9ezEyODc4N30tIEdkemllIGdvIHVrcnmzP3wtIE5p
ZSB3aWVtLg0KezEyODc4N317MTI4ODQ5fUdkemllIGplc3QgS29kZXg/IQ0KezEyOTE4N317MTI5
MjYyfUphayCcbWllc3ogc3RyYXN6eeYgbW9quSBtYXRr6j8hDQp7MTMwMjQyfXsxMzAyODF9Q2+c
IHR5IG1pIHpyb2Jpsz8NCnsxMzAyODF9ezEzMDM3N31Sb2R6aWNlIG5hdWN6eWxpIG1uaWUsfGph
ayB3eW9zdHJ6eeYgem15c7N5Lg0KezEzMDQyMH17MTMwNTE2fUphayBza3VwaeYgc2nqIG5hIHR5
bSx8Y28gY2hj6iB6b2JhY3p55i4NCnsxMzA1MTh9ezEzMDYwMn1CZXogaGWzbXUgb2RiaWVyYXN6
IHdzenlzdGtpZSBib2SfY2UuDQp7MTMwNjE2fXsxMzA3MDB9Qm9sZXNuZSwgcHJhd2RhPw0KezEz
MTc4Mn17MTMxODI1fS9PZGVqZJ9jaWUgb2Qgb2tpZW4hDQp7MTMxODg3fXsxMzE5NjJ9U2Nob3dh
amNpZSBzaeoufFR1IG5pZSBqZXN0IGJlenBpZWN6bmllLg0KezEzMjA0M317MTMyMTE3fS9UdSBT
dHJhv25paywgdGVyZW4gY3p5c3R5Lg0KezEzMjEyMn17MTMyMjQyfU1pYbNlbSBqdb8gZG8gY3p5
bmllbmlhfHogdHltaSBpc3RvdGFtaS4NCnsxMzIyNDd9ezEzMjM0MH0vU7kgYmFyZHpvIG5pZWJl
enBpZWN6bmUufC9NYW15IHByYXdvIHW/eeYgYnJvbmkuDQp7MTMyNDAzfXsxMzI0NTh9L1Byenlq
ubNlbS58L1pibGm/YW15IHNp6iBkbyBjZWx1Lg0KezEzMjU4Mn17MTMyNjY2fS8tIEdvdG93aSBk
byBvc3RyemGzdS58Ly0gMS0xLCBwcnp5armzZW0uDQp7MTMyNzMxfXsxMzI3OTh9L1R1IEdyb20g
MS0xLnwvTmFtaWVyenmzZW0gdHJ6eSBjZWxlLg0KezEzMzE4OX17MTMzMjcxfVBvdHdpZXJkemFt
IHRyYWZpZW5pZS58TmF0eWNobWlhc3QgcG93dPNyeiBvc3RyemGzLg0KezEzMzI3NX17MTMzMzkz
fS9Qcnp5armzZW0ufC9Sb2JpbXkgZHJ1Z2llIHBvZGVqnGNpZS4NCnsxMzM1NTh9ezEzMzY1N30v
R3JvbSAxLTEsIGthdGFwdWx0dWpjaWUgc2nqIQ0KezEzMzkxNn17MTMzOTgwfS9OYWRsYXR1amUg
bmllemlkZW50eWZpa293YW55IG9iaWVrdCENCnsxMzQ0NDF9ezEzNDQ5M31KZXN0ZZwgc7NhYnks
IHN5bnUgRWxhLg0KezEzNDQ5M317MTM0NTQ5fUJyYWsgY2kgcGV3bm+cY2kgc2llYmllLg0KezEz
NDY1NH17MTM0NzY0fUZha3QsIL9lIG1hY2llIHBvY3p1Y2llIG1vcmFsbm+cY2ksfGt083JlZ28g
bmFtIGJyYWssDQp7MTM0NzY3fXsxMzQ4NDh9ZGFqZSBuYW0gcHJ6ZXdhZ+ogdyBld29sdWNqaS4N
CnsxMzQ5MjN9ezEzNDk5NH1BIGplnGxpIGhpc3RvcmlhIGN6ZWdva29sd2llayBkb3dvZHppLi4u
DQp7MTM1MjE1fXsxMzUzMDR9dG8gd7NhnG5pZSB0ZWdvLHy/ZSBld29sdWNqYSB6YXdzemUgd3ln
cnl3YS4NCnsxMzU4MTB9ezEzNTg5NH0vUG9kY2hvZHppbXkgZG8gbLlkb3dhbmlhLg0KezEzNjg5
Nn17MTM2OTY4fURvIHdzenlzdGtpY2gsfG1hY2llIG5hd2m5emHmIHdhbGvqLg0KezEzNjk2OH17
MTM3MDM3fUEgY28geiBnb5xjaWVtIHcgbmllYmllc2tpbT8NCnsxMzcwNDB9ezEzNzEwMn0vU3Ry
emVsYeYgZG8gd3N6eXN0a2ljaCENCnsxMzczNjZ9ezEzNzQxNH0vS29udGFrdCENCnsxMzc2Mzd9
ezEzNzY4MH1KZXN0ZZwgY2GzeT8NCnsxMzc3OTV9ezEzNzg0M31TcGFkYW15IQ0KezEzNzg2Mn17
MTM3OTQxfS9Qcnp5Z290b3dh5iBzaeogbmEgdWRlcnplbmllIQ0KezEzODA4NX17MTM4MTkwfS9U
dSBVcGFks3kgQW5pb7MufC9TdHJhv25payB6ZXN0cnplbG9ueS4NCnsxMzg3MTZ9ezEzODgwOX0v
R3JvbSAxLTIgZG8gU3RyYb9uaWthLCBvZGJp83I/DQp7MTM4ODA5fXsxMzg5MzF9RGFqY2llIHpt
YXNvd2FueSBvc3RyemGzfG5hIG1varkgcG96eWNq6i4NCnsxMzg5MzF9ezEzODk5Nn1acm96dW1p
YbNlbSwgcG93b2R6ZW5pYS4NCnsxMzk5Njl9ezE0MDA3N31BIG5hZ3JvZLkgamVnbyAtIGhvbm9y
b3dhIJxtaWVy5i4NCnsxNDAzNjV9ezE0MDQxOH1OaWUgd3lncmFzei4NCnsxNDA0Mjd9ezE0MDUy
MX1aYSBrYb9kZWdvIG9jYWxvbmVnbyBjerNvd2lla2EsfHphYmlqZW15IG1pbGlvbiBpbm55Y2gu
DQp7MTQxNzY4fXsxNDE4MzV9L1RlcmVuIHphYmV6cGllY3pvbnk/DQp7MTQxODQwfXsxNDE5MzZ9
L0Rydb95bmEgQWxmYSwgc7N5c3p5Y2llIG1uaWU/DQp7MTQzMTMwfXsxNDMxOTd9VGVuIGN6s293
aWVrfG5pZSBqZXN0IG5hc3p5bSB3cm9naWVtLg0KezE0MzIzN317MTQzMjg1fUR6aeprdWrqLCBw
dbNrb3duaWt1Lg0KezE0MzcxMH17MTQzNzM5fS9NYW1vPw0KezE0Mzc1M317MTQzODA2fU5pYyBt
aSBuaWUgamVzdCENCnsxNDQwODZ9ezE0NDEzNH2jYWRueSBrb3N0aXVtLg0KezE0NDE1OH17MTQ0
MjA2fVByenlrcm8gbWkuDQp7MTQ0MjExfXsxNDQyNTl9VG8gdHlsa28gcHJ6ZWRtaW90eS4NCnsx
NDQzMDR9ezE0NDM2Mn1aYXdzemUgbW+/bmEgamUgemFzdLlwaeYuDQp7MTQ0NDE3fXsxNDQ0Njd9
QWxlIHdhcyBuaWUgbW+/bmEuDQp7MTQ0NDc5fXsxNDQ1MTF9TWFtby4uLg0KezE0NDUxMX17MTQ0
NjA0fVpvZCBwb3dpZWR6aWGzLCC/ZSB0ZW4gS29kZXh8bW+/ZSBzcHJvd2FkemnmIG3zaiBsdWQu
DQp7MTQ0NjA5fXsxNDQ2NTd9VG8gY2h5YmEgZG9icnplPw0KezE0NDc1MH17MTQ0ODI1fU9uaSBj
aHliYSBuaWUgemFtaWVyemFquXxkemllbGnmIHNp6iB0eW0gnHdpYXRlbS4NCnsxNDQ4MjV9ezE0
NDg3MH1DbGFyayENCnsxNDQ5Mzd9ezE0NDk5NX1XaWVtLCBqYWsgaWNoIHBvd3N0cnp5bWHmLg0K
ezE0NTAzM317MTQ1MTYwfS0gQ28gdGFtIHNp6iBzdGGzbz98LSBPa2F6YbMgY2h3aWxvd7kgc7Nh
Ym+c5i4NCnsxNDUxNjN9ezE0NTI5N31UbyBiZXogem5hY3plbmlhLHxwb25pZXdhvyB6bG9rYWxp
em93YbNlbSBLb2RleC4NCnsxNDUzMjZ9ezE0NTM5MH1OaWdkeSBuaWUgYnmzbyBnbyB3IGthcHN1
bGUuDQp7MTQ1MzkwfXsxNDU0ODl9L0pvci1FbCBnbyB6YWJyYbMufC9ETkEgbWlsaWFyZPN3IGx1
ZHppLg0KezE0NTQ4OX17MTQ1NTc1fS9TY2FsabMgZ28geiBrb23zcmthbWkgd7Nhc25lZ28gc3lu
YS4NCnsxNDU1Nzd9ezE0NTcwNX0vV3N6eXNjeSBzcGFka29iaWVyY3kgS3J5cHRvbmF8L795arkg
dyBjaWVsZSBqZWRuZWdvIHVjaG9kn2N5Lg0KezE0NTgxMH17MTQ1OTQ3fUN6eSBLYWwtRWwgbXVz
aSBieeYgv3l3eSx8Ynkgb2R6eXNrYeYgS29kZXggeiBqZWdvIGtvbfNyZWs/DQp7MTQ1OTY4fXsx
NDYwMDJ9TmllLg0KezE0NjEzOX17MTQ2MTk0fVVydWNob21p5iBNYWNoaW7qIIx3aWF083cuDQp7
MTQ2OTY2fXsxNDcwMTh9LSBDbyBzaeogZHppZWplP3wtIFN0YXRlayBzaeogcm96ZHppZWxpsy4N
CnsxNDcwMTh9ezE0NzEwMn1QaWVyd3N6eSBjerNvbiBwb3J1c3phIHNp6iBuYSB3c2No82QsfGRy
dWdpIGplc3QgbmFkIHBvs3Vkbmlvd7kgcPOza3VsuS4NCnsxNDcxMDV9ezE0NzIwOH0tIEphayBz
enlia28gbGVjaT98LSBNYWNoIDI0IGkgcHJ6eXNwaWVzemEuDQp7MTQ3MjA4fXsxNDczMDl9UHJh
d2RvcG9kb2JuaWUgdWRlcnp5fHcgcG+zdWRuaW93eW0gcmVqb25pZSBPY2VhbnUgSW5keWpza2ll
Z28uDQp7MTQ3NzMxfXsxNDc4MzR9LSBSZXN6dGEgc3RhdGt1IGplc3QgY29yYXogYmxpv2VqLnwt
IERhaiB0byBuYSBla3Jhbi4NCnsxNDc4NDh9ezE0Nzg4Nn1Cb79lIQ0KezE0ODg2MH17MTQ4OTQ0
fVVydWNob21p5iBzaWxuaWsgZmFudG9tb3d5IQ0KezE0OTQ1MH17MTQ5NTIyfUplc3RlnG15IHBv
ZLO5Y3plbmkgZG8gTWFjaGlueS4NCnsxNDk1MzZ9ezE0OTU4Nn1aYWN6eW5hbXkuDQp7MTUwMzY4
fXsxNTA0MzB9Q28gdG8gamVzdD8NCnsxNTA0MzB9ezE1MDU2Mn1XeWdsuWRhIG5hIGpha7mcIGJy
b/EgZ3Jhd2l0YWN5am65LnxEemlhs2EgdyBwYXJ6ZSB6ZSBzdGF0a2llbS4NCnsxNTA1Njl9ezE1
MDYzNH1XIGpha2mcIHNwb3PzYnx6d2nqa3N6YWq5IG1hc+ogWmllbWksDQp7MTUwNjM0fXsxNTA3
MDR9c2tyYXBsYWq5YyBhdG1vc2ZlcuouDQp7MTUwNzQyfXsxNTA3OTB9Qm+/ZSENCnsxNTA4MTZ9
ezE1MDg4OH0tIFRvIHRlcnJhZm9ybWFjamEufC0gQ28gdG8gdGFraWVnbz8NCnsxNTA5MDB9ezE1
MDk5Nn1Jbr95bmllcmlhIHBsYW5ldGFybmEsfG1vZHlmaWt1arljYSBhdG1vc2ZlcuogaSB0b3Bv
Z3JhZmnqIFppZW1pLg0KezE1MDk5Nn17MTUxMDU2fVphbWllbmlharkgWmllbWnqIHcgS3J5cHRv
bmEuDQp7MTUxMDU4fXsxNTExNDJ9LSBBIGNvIHogbmFtaT98LSBaIHR5Y2ggb2Rjenl083cgd3lu
aWthLA0KezE1MTE0N317MTUxMTkwfb9lIG5pZSBi6mR6aWUgv2FkbnljaCAibmFzIi4NCnsxNTEx
OTN9ezE1MTMyMn1QYW5pZSBnZW5lcmFsZS58UHWza293bmlrIEhhcmR5IGplZHppZSB0dSB6IFN1
cGVybWFuZW0uDQp7MTUxMzMyfXsxNTEzNzJ9U3VwZXJtYW5lbT8NCnsxNTEzNzV9ezE1MTQ1Nn1U
eW0gb2JjeW0ufFRhayBnbyBuYXp5d2FquS4NCnsxNTE1OTN9ezE1MTY3OX0tIE1hbXkgcGxhbiwg
Z2VuZXJhbGUufC0gQ3p5IHRvIGplc3QgdG8sIGNvIG15nGzqPw0KezE1MTY5MX17MTUxNzQ0fVRv
IHN0YXRlaywga3TzcnltIHByenlsZWNpYbMuDQp7MTUxNzczfXsxNTE4Mzh9U3RhdGVrIG5hcOpk
emFueSBqZXN0fHNpbG5pa2llbSBmYW50b21vd3ltLg0KezE1MTg0MH17MTUxOTI5fVphZ2luYSBw
cnplc3RyemXxLnxTdGF0ZWsgWm9kYSB1v3l3YSB0ZWogc2FtZWogdGVjaG5vbG9naWkuDQp7MTUx
OTI5fXsxNTE5ODl9SmWcbGkgemRlcnp5bXkgemUgc29iuXxkd2EgbmFw6mR5Li4uDQp7MTUxOTg5
fXsxNTIwNTN9LSBNb79lIHBvd3N0YeYgb3NvYmxpd2+c5i58LSBDb5wgamFrIGN6YXJuYSBkeml1
cmE/DQp7MTUyMDUzfXsxNTIxNjZ9VGFrLiBKZZxsaSBvdHdvcnp5IHNp6iBwcnplapxjaWUsfHBv
d2lubmkgem9zdGHmIGRvIG5pZWdvIHdjablnbmnqY2kuDQp7MTUyMTY4fXsxNTIyMjZ9TWFteSBp
Y2ggdHltIHpib21iYXJkb3dh5j8NCnsxNTIyMjZ9ezE1MjMxMH1KZZxsaSBzdGF0ZWsgd2G/eSBt
bmllanxuab8gOCB0b24sDQp7MTUyMzEwfXsxNTIzOTl9bW+/ZW15IHpyenVjaeYgZ28geiBDLTE3
LnxUbyB3eWtvbmFsbmUuDQp7MTUyMzk5fXsxNTI0NjN9SmWcbGkgbmllIHBvd3N0cnp5bWFtfHRl
aiBtYXN6eW55IG5hZCBvY2VhbmVtLA0KezE1MjQ2Nn17MTUyNTQwfXNps2EgZ3Jhd2l0YWNqaSBi
6mR6aWUgcm9zbrnmLg0KezE1MjY3NH17MTUyNzYxfUplnGxpIHRhIG1hc3p5bmF8dXBvZGFibmlh
IFppZW1p6iBkbyBLcnlwdG9uYSwNCnsxNTI3NjF9ezE1MjgyMX1i6mR6aWVzeiBzs2Fic3p5IHcg
amVqIHBvYmxpv3U/DQp7MTUyODI1fXsxNTI5NjB9TW+/bGl3ZSwgYWxlIHRvIG1uaWUgbmllIHBv
d3N0cnp5bWEuDQp7MTUyOTYyfXsxNTMwMzR9TGVwaWVqIHNp6iBvZHN18S4NCnsxNTMwNjN9ezE1
MzExM31Ucm9jaOogZGFsZWouDQp7MTUzODczfXsxNTM5NTB9LSBGYW9yYSwgcHJ6ZWptaWogZG93
b2R6ZW5pZS58LSBUYWsgamVzdC4NCnsxNTM5NTB9ezE1NDA5MX1NdXN66iB6YWJlenBpZWN6eeYg
a29tb3LqIG5hcm9kemlufGkgerNvv3nmIGhvs2Qgc3RhcmVtdSBwcnp5amFjaWVsb3dpLg0KezE1
NDI3Nn17MTU0Mzc3fS9TdHJhv25payB3IGRyb2R6ZSBkbyBNZXRyb3BvbGlzLnxNYW15ILNhZHVu
ZWsuDQp7MTU0NTA2fXsxNTQ2Mjh9Ri0zNSBsZWO5IG5hIG1pZWpzY2Ugc3BvdGthbmlhLg0KezE1
NTY5NX17MTU1ODAzfS9LbHVjeiBwcnp5aup0eS58L1ezuWN6YW0ga29tb3LqIG5hcm9kemluLg0K
ezE1NTgwNn17MTU1ODkwfS9QcnplcndpaiB0bywgWm9kLHwvcPNraSBqZXN6Y3plIGN6YXMuDQp7
MTU1OTIzfXsxNTYwMTJ9TmF3ZXQgcG8gnG1pZXJjaXxuaWUgcHJ6ZXN0YWplc3ogbW5pZSBwb3Vj
emHmLg0KezE1NjAxNH17MTU2MDYwfU5pZSBwb3p3b2zqIHW/eeYgS29kZXh1fHcgdGFraW0gY2Vs
dS4NCnsxNTYwNjB9ezE1NjEwNX1OaWUgbW+/ZXN6IG1uaWUgcG93c3RyenltYeYuDQp7MTU2MTA1
fXsxNTYxODR9S2x1Y3osIGt083J5IHdwcm93YWR6abNlbSx8em5vc2kgdHdvamUgdXByYXduaWVu
aWEuDQp7MTU2MTg0fXsxNTYyNTR9VGVyYXogamEga29udHJvbHVq6iB0ZW4gc3RhdGVrLg0KezE1
NzAxNn17MTU3MDg4fS9Cs3lza2F3aWNhIDEgZG8gZG9382R6dHdhLnwvUHJvc3rqIG8gemV6d29s
ZW5pZSBuYSBhdGFrLg0KezE1NzA4OH17MTU3MjA2fVVkemllbGFtIHplendvbGVuaWEufFpkYXdh
aiByYXBvcnQgbyB6bmlzemN6ZW5pYWNoLg0KezE1NzUzMH17MTU3NTczfS9Bd2lvbmlrYSB3YXJp
dWplLg0KezE1NzU3NX17MTU3NjU0fS9HcmF3aXRhY2phIJxjablnYSByYWtpZXR5IHcgZPOzLnwv
TXVzaW15IHBvZGxlY2ll5iBibGm/ZWouDQp7MTU3Nzc0fXsxNTc4ODl9V3N6eXNjeSBvcHVzemN6
YW15IGJ1ZHluZWshDQp7MTU4NDI2fXsxNTg0NzR9L1N0cmFjabNlbSBza3J6eWSzb3dlZ28hDQp7
MTU4NTE3fXsxNTg1NjN9L01heWRheSwgbWF5ZGF5LCBtYXlkYXkhDQp7MTU4ODE5fXsxNTg4ODJ9
VOpkeSENCnsxNTg4ODR9ezE1ODk4N31TenliY2llaiENCnsxNTkxMTR9ezE1OTE2N31KZW5ueSEN
CnsxNTkyMjd9ezE1OTI1M31Cb79lIQ0KezE1OTI2NX17MTU5Mjk5fVBlcnJ5IQ0KezE1OTM5N317
MTU5NDMzfVTqZHkhDQp7MTU5NTkxfXsxNTk2Mzd9TmFzemUgcmFzeSBtb2e5IGtvZWd6eXN0b3dh
5i4NCnsxNTk2Mzd9ezE1OTczOH2vZWJ5nG15IGNpZXJwaWVsaSx8cHLzYnVquWMgc2nqIHByenlz
dG9zb3dh5iBqYWsgdHfzaiBzeW4/DQp7MTU5NzQwfXsxNTk3ODN9VG8gbHVkb2LzanN0d28uDQp7
MTU5NzgzfXsxNTk4NzJ9T3dzemVtLiBBIHJvenRyerlzYW18amVnbyB6YXNhZG5vnOYgeiBkdWNo
ZW0uDQp7MTU5OTAxfXsxNTk5ODl9T2JhaiBqZXN0ZZxteSBkdWNoYW1pLCBab2QufE5pZSByb3p1
bWllc3ogdGVnbz8NCnsxNTk5OTJ9ezE2MDAzMH1Ud29qZWdvIEtyeXB0b25hIGp1vyBuaWUgbWEu
DQp7MTYwMDMwfXsxNjAxMTR9U3RhdGVrLCB3aWVzeiwgamFrIHBvemJ55iBzaep8dGVqIG5hcGFz
dGxpd2VqIGludGVsaWdlbmNqaT8NCnsxNjAxMTR9ezE2MDE2N30vLSBUYWsgamVzdC58LSBQcnp5
Z290dWogc2nqIGRvIGplaiB3ebO5Y3plbmlhLg0KezE2MDE2N317MTYwMjcwfS0gTWFtIGRvnOYg
dGVqIGRlYmF0eS58LSBVY2lzemVuaWUgbW5pZSBuaWN6ZWdvIG5pZSB6bWllbmkuDQp7MTYwMzA0
fXsxNjAzNjF9TfNqIHN5bi4uLg0KezE2MDM2M317MTYwNDI4fWplc3QgbGVwc3p5IG9kIGNpZWJp
ZS4NCnsxNjA0NTB9ezE2MDQ5OH1Eb2tv8WN6eSB0bywgY28gemFjeupsaZxteS4NCnsxNjA1Mjd9
ezE2MDU5NH1Nb2fqIGNpIHRvIG9iaWVjYeYuDQp7MTYwNjcwfXsxNjA4MTl9UG9zaWFkYXN6IHdz
cG9tbmllbmlhfGkgnHdpYWRvbW+c5iBKb3ItRWxhLg0KezE2MDgxOX17MTYwODgxfUN6eSBtb79l
c3ogZG+cd2lhZGN6eeYgamVnbyBi82x1Pw0KezE2MDkwOH17MTYxMDE4fVd5cnfqIEtvZGV4IHpl
IHp3s29rIHR3b2plZ28gc3luYS4NCnsxNjEwMjB9ezE2MTE1N31PZGJ1ZHVq6iBLcnlwdG9uIG5h
IGplZ28gcHJvY2hhY2guDQp7MTYyNTI0fXsxNjI1ODh9SmVubnksIGdkemllIGplc3RlnD8hDQp7
MTYyNTk4fXsxNjI2ODJ9LSBUdXRhaiF8LSBUcnp5bWFqIHNp6i4NCnsxNjI2OTR9ezE2Mjc1Nn1V
dGtu6rNhbSwgbmllIG1vZ+ogc2nqIHV3b2xuaeYuDQp7MTYyNzU2fXsxNjI4MTR9V3ljablnbmll
bXkgY2nqIHN0uWQufE5pZSBydXN6YWogc2nqLg0KezE2MjgzM317MTYyOTAzfS0gTmllIHpvc3Rh
d2lhaiBtbmllLCBwcm9zeuohfC0gTmllIHpvc3Rhd2lteSBjaeouDQp7MTYyOTI3fXsxNjMwMTB9
LSBMb21iYXJkLCBwb23zvyBtaSF8LSBOaWVjaCB0byBzemxhZy4NCnsxNjMwNzN9ezE2MzExOH0t
IE11c2lteSB0byBwcnplc3VuueYufC0gVHJ6eW1hai4NCnsxNjMxMTh9ezE2MzE3Nn1Qb2R3Yb8s
IGEgamEgYupk6iBwY2hhsy4NCnsxNjMyOTN9ezE2MzM0NH1QY2hhaiENCnsxNjMzNDR9ezE2MzM4
OX1aYmxpv2Egc2nqISBQY2hhaiENCnsxNjM0MTh9ezE2MzQ5Mn1TdHJhv25payBkbyBkb3fzZHp0
d2EsfGN6eSBtb79lc3ogZG9rb25h5iB6cnp1dHU/DQp7MTYzNDkyfXsxNjM1Mzh9T2RtYXdpYW0u
DQp7MTY1NDE1fXsxNjU0NjN9VWRhs28gbXUgc2nqLg0KezE2NTUwNH17MTY1NTkzfVN0cmG/bmlr
IGRvIGRvd/NkenR3YSx8amVzdGWcbXkgZ290b3dpIGRvIHpyenV0dS4NCnsxNjU1OTN9ezE2NTY3
OX1Qb3dvZHplbmlhLiBVemJyb2nmILNhZHVuZWsufE1hY2llIHplendvbGVuaWUgbmEgenJ6dXQu
DQp7MTY1Njg5fXsxNjU3MzR9VG8gb3N0YXRuaWUgcG9kZWqcY2llLg0KezE2NTc1OH17MTY1ODI4
fVRlcmF6IHdzenlzdGtvIHphbGW/eXxvZCBjaWViaWUgaSBIYW1pbHRvbmEuDQp7MTY2NzUzfXsx
NjY3ODR9VG8gY2h5YmEgamFraZwgv2FydC4NCnsxNjY3ODR9ezE2Njg4MH0tIKNhZHVuZWsgdXpi
cm9qb255PyBNb79lbXkgenJ6dWNh5j98LSBOaWUgbW+/ZW15IQ0KezE2Njg4N317MTY2OTQwfUNv
nCBqZXN0IG5pZSB0YWsufFRvIG5pZSBwb3dpbm5vIHRhayByb2Jp5i4NCnsxNjY5NDB9ezE2NzAy
OX0tIEEgamFrIHBvd2lubm8/fC0gUG93aW5ubyB3ZWqc5iBkbyBrb/FjYS4NCnsxNjcwMjl9ezE2
NzExNX0tIE5pZWNoIHNp6iBwcnp5anJ66i58LSBQcnplam1paiBzdGVyeS4NCnsxNjcxMjB9ezE2
NzE2OH1Qcnplam11auogc3RlcnkuDQp7MTY3MzE5fXsxNjczODF9RGxhY3plZ28gbmllIGplc3Rl
nG15fGdvdG93aSBkbyB6cnp1dHU/DQp7MTY3Mzg0fXsxNjc0MzJ9TWFteSB0dSBkcm9ibnkgcHJv
YmxlbS4NCnsxNjc3OTF9ezE2Nzg0OX1OYW1pZXJ6eeYgb2JpZWt0Lg0KezE2NzkyMX17MTY3OTU5
fS9DZWwgbmFtaWVyem9ueS4NCnsxNjgxOTR9ezE2ODIyM31TdPNqIQ0KezE2ODIyM317MTY4MzM4
fUplnGxpIHpuaXN6Y3p5c3ogdGVuIHN0YXRlayx8em5pc3pjenlzeiBy83duaWW/IEtyeXB0b25h
IQ0KezE2ODQxNX17MTY4NDcyfUtyeXB0b24gbWlhsyBzd29quSBzemFuc+ohDQp7MTY5NzUyfXsx
Njk4NTN9UGFubm8gTGFuZSF8VGFtIGplc3QgbmllYmV6cGllY3puaWUhDQp7MTcwNTU4fXsxNzA1
OTl9UnVzemFqIQ0KezE3MTA5OH17MTcxMTkxfUEgbmFncm9kuSBqZWdvIC0gaG9ub3Jvd2EgnG1p
ZXLmLg0KezE3MjY2Nn17MTcyNzIzfVpuaWtu6mxpPw0KezE3MjczNX17MTcyNzg1fUNoeWJhIHRh
ay4NCnsxNzI4MDl9ezE3Mjg0OH1PbiBuYXMgb2NhbGmzLg0KezE3MzQ0NX17MTczNTUzfU3zd2m5
LCC/ZSBwbyBwaWVyd3N6eW0gcG9jYbN1bmt1fGplc3QganW/IHogZ/Nya2kuDQp7MTczNjEwfXsx
NzM3MDl9VHlsa28gd3RlZHksfGplnGxpIGNhs3VqZXN6IGN6s293aWVrYS4NCnsxNzQzODd9ezE3
NDQzMH1TcPNqcnouDQp7MTc0NDgxfXsxNzQ1Nzl9TmEgdHltIHB5bGUgbW9nbGmcbXkgemJ1ZG93
YeZ8bm93ZWdvIEtyeXB0b25hLg0KezE3NDU4MX17MTc0NjY1fUplZG5hayBwcnplZLNvv3mzZZwg
bHVkeml8cG9uYWQgbmFzLg0KezE3NDY4NH17MTc0Nzk1fUNlbGVtIG1vamVqIGVnenlzdGVuY2pp
fGplc3Qgb2Nocm9uYSBLcnlwdG9uYS4NCnsxNzQ4MzN9ezE3NDkzNH1UYWtpIGNlbCBvdHJ6eW1h
s2VtIHByenkgbmFyb2R6aW5hY2guDQp7MTc0OTU1fXsxNzUwNjZ9S2G/ZGUgZHppYbNhbmllLHxv
Ym9q6nRuaWUgamFrIGJydXRhbG5lLA0KezE3NTA2OH17MTc1MTk3fWphayBva3J1dG5lLHxwb2Rl
am11auogdyBpbWnqIHd5v3N6ZWdvIGRvYnJhLi4uDQp7MTc1MjAwfXsxNzUyNTN9bW9qZWdvIGx1
ZHUuDQp7MTc1MzUxfXsxNzU0NTJ9QSB0ZXJheiBuaWUgbWFtIHN3b2plZ28gbHVkdS4NCnsxNzU1
MzF9ezE3NTYwN31Nb2phIGR1c3phLi4uDQp7MTc1NjEwfXsxNzU3Mzd9T2RlYnJhs2WcIG1pIGq5
IQ0KezE3NTkxNH17MTc2MDE1fVNwcmF3aeosIL9lIGx1ZHppZSx8a3TzcnljaCBwcnp5Z2Fybrmz
ZZwsIGLqZLkgY2llcnBpZeYuDQp7MTc2MDE3fXsxNzYxNDJ9LSBPZGJpb3LqIGNpIGljaCwgamVk
bmVnbyBwbyBkcnVnaW0ufC0gSmVzdGWcIHBvdHdvcmVtLCBab2QuDQp7MTc2MTk3fXsxNzYyNjR9
SSB6YW1pZXJ6YW0gY2nqIHBvd3N0cnp5bWHmLg0KezE3ODY2Mn17MTc4NzI3fVRvIHNp6iBtb79l
IHNrb/FjennmfHR5bGtvIHcgamVkZW4gc3Bvc/NiIQ0KezE3ODcyN317MTc4ODAxfYxtaWVyY2m5
IGplZG5lZ28geiBuYXMhDQp7MTc5NTM1fXsxNzk2MjF9VXJvZHpps2VtIHNp6iB3b2pvd25pa2ll
bSwgS2FsLg0KezE3OTYyM317MTc5NzIyfUNhs2Ugv3ljaWUgdHJlbm93YbNlbSBtb2plIHpteXOz
eS4NCnsxNzk3MjR9ezE3OTgxMH1BIGdkemllIHR5IHRyZW5vd2GzZZw/fE5hIGZhcm1pZT8hDQp7
MTgyOTAzfXsxODMwMDZ9U2tvcm8gdGFrIGJhcmR6byBpY2gga29jaGFzei4uLg0KezE4MzAxOH17
MTgzMDkzfW1vv2VzeiB6YWN6ueYgaWNoIG9ws2FraXdh5i4NCnsxODMxNzl9ezE4MzIzMn1OaWUg
cvNiIHRlZ28hDQp7MTgzMjg3fXsxODMzMzJ9UHJ6ZXN0YfEhDQp7MTgzNDU1fXsxODM1MDh9Tmll
IQ0KezE4MzUzNH17MTgzNTY1fU5pZ2R5Lg0KezE4NTgzMX17MTg1OTE3fS0gT2RiabNvIGNpPyF8
LSBKZWRlbiB6IHR3b2ljaCBkcm9u83cgendpYWRvd2N6eWNoLg0KezE4NTkxOX17MTg2MDI1fS0g
VG8gamVzdCB3YXJ0ZSAxMiBtaWxpb27zdyF8LSBCebNvLg0KezE4NjAyN317MTg2MTAyfVdpZW0s
IL9lIHBy82J1amVzeiB3eZxsZWR6aeYsfGdkemllIG9kd2llc3phbSBwZWxlcnlu6i4NCnsxODYx
MDJ9ezE4NjE4MX0tIE5pYyB6IHRlZ28ufC0gWmF0ZW0gemFkYW0gY2kgb2N6eXdpc3RlIHB5dGFu
aWU6DQp7MTg2MTg4fXsxODYyNjd9U2u5ZCBwZXdub5zmLCC/ZSBraWVkeZx8bmllIHp3cvNjaXN6
IHNp6iBwcnplY2l3a28gQW1lcnljZT8NCnsxODYyNzB9ezE4NjM4N31XeWNob3dhs2VtIHNp6iB3
IEthbnNhcy58SnW/IGJhcmR6aWVqIEFtZXJ5a2FuaW5lbSBieeYgbmllIG1vv25hLg0KezE4NjM4
OX17MTg2NTE0fUplc3RlbSB0dSwgYnkgcG9tYWdh5ix8YWxlIG5hIG1vaWNoIHdhcnVua2FjaC4N
CnsxODY1MTZ9ezE4NjYxN30tIE11c2kgcGFuIHByemVrb25h5iBXYXN6eW5ndG9uLnwtIE5hd2V0
IGdkeWJ5bSBjaGNpYbMgc3By82Jvd2HmLi4uDQp7MTg2NjI3fXsxODY3NTR9LSBza7lkIHdpZXN6
LCC/ZSBtbmllIHd5c7N1Y2hhark/fC0gTmllIHdpZW0uDQp7MTg2NzU2fXsxODY4MDl9Q2h5YmEg
Yupk6iBtdXNpYbMgcGFudSB6YXVmYeYuDQp7MTg3MDMwfXsxODcxMjV9LSBaIGN6ZWdvnCBzaeog
cGFuaSBjaWVzenksIGthcGl0YW5pZT98LSBaIG5pY3plZ28uDQp7MTg3MTg4fXsxODcyNDh9UG8g
cHJvc3R1IG5pZXqzZSB6IG5pZWdvIGNpYWNoby4NCnsxODcyNzd9ezE4NzM0NH0tIERvIHdvenUs
IGthcGl0YW5pZS58LSBUYWsgamVzdC4NCnsxODc1NzF9ezE4NzY2MH1aYXdzemUgd2llcnp5syx8
v2UgamVzdGWcIHN0d29yem9ueSBkbyB3eb9zenljaCBjZWzzdy4NCnsxODc2NjV9ezE4Nzc3OH1B
IGtpZWR5IG5hZGVqZHppZSBkemll8Sx8dWSfd2lnbmllc3ogc3dvamUgYnJ6ZW1p6i4NCnsxODc4
MDJ9ezE4NzkyNn0tIENoY2lhs2J5bSwgv2VieSBt82ezIHRvIHpvYmFjennmLnwtIFdpZHppYbMg
dG8sIHV3aWVyeiBtaS4NCnsxODkwNTZ9ezE4OTEzNX0vQ28gYupkemllc3ogcm9iabMsfC9raWVk
eSBuaWUgYupkemllc3ogemJhd2lhsyCcd2lhdGE/DQp7MTg5MTM1fXsxODkyMDl9LSBNeZxsYbNl
nCBqdb8gbyB0eW0/fC0gTXmcbGGzZW0uDQp7MTg5MjU5fXsxODkzOTR9UG9zenVrYW0gcHJhY3ks
fHcga3TzcmVqIGLqZOogYmxpc2tvIHd5ZGFyemXxLg0KezE4OTQ4Mn17MTg5NTk1fS9XIGt083Jl
aiBuaWtvZ28gbmllIHpkeml3aSx8L79lIHd5c3Rhd2lhbSBzaeogbmEgbmllYmV6cGllY3pl8XN0
d28sDQp7MTg5NjA5fXsxODk2NjJ9L2FsYm8gv2UgemFkYWrqIHB5dGFuaWEuDQp7MTg5OTcxfXsx
OTAwNTh9S2llZHkgdyBrb/FjdXxkYXN6IHNp6iB6YXByb3Np5iwgTG9pcz8NCnsxOTAwNzJ9ezE5
MDE0Nn1OYWpsZXBzemUgbWllanNjYSBuYSBkemlzaWVqc3p5IG1lY3oufENvIHR5IG5hIHRvPw0K
ezE5MDE0OX17MTkwMjc2fUxlcGllaiBzcHLzYnVqIHplIHN0Yb95c3RrYW1pLnxOYSBwZXdubyBt
YXN6IHdp6mtzemUgc3phbnNlLg0KezE5MDI4MX17MTkwMzI0fVByemVwcmFzemFtLg0KezE5MDM1
N317MTkwNDI3fS0gTmFqbGVwc3plIG1pZWpzY2E/fC0gTmllIHLzYiB0ZWdvLg0KezE5MDQzNH17
MTkwNTMwfU9wcm93YWSfY2llIG5hc3plZ28gbm93ZWdvIHJlcG9ydGVyYS4NCnsxOTA1MzB9ezE5
MDYxMn1QcnplZHN0YXdpYW0gQ2xhcmthIEtlbnRhLnxQb3dvZHplbmlhLCBts29keS4NCnsxOTA2
NTB9ezE5MDcxMH0tIEN6ZZzmLCBqZXN0ZW0gU3RldmUufC0gTWmzbyBtaS4NCnsxOTA3MjJ9ezE5
MDc1M31DemWc5i4NCnsxOTA3NjN9ezE5MDg2Nn1Mb2lzIExhbmUsIHdpdGFqIHcgVGhlIFBsYW5l
dC4NCnsxOTA5NDJ9ezE5MTAwNX1DaWVzeuogc2nqLCC/ZSB0dSBqZXN0ZW0uDQp7MTkxMTIwfXsx
OTExOTJ9Q1qjT1dJRUsgWkUgU1RBTEkNCnsxOTEyMDR9ezE5MTI2NH1Us3VtYWN6ZW5pZTogc2lu
dTYNCnsxOTEyNzh9ezE5MTMyNH0+PiBSZWxlYXNlMjQucGwgPDwNCg==
headers:
cache-control: [public]
connection: [close]
content-type: [text/html]
date: ['Fri, 30 Oct 2015 08:02:30 GMT']
server: [Apache]
vary: [Accept-Encoding]
x-powered-by: [PleskLin]
status: {code: 200, message: OK}
version: 1
+843
View File
@@ -0,0 +1,843 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://napiprojekt.pl/unit_napisy/dl.php?f=6303e7ee6a835e9fcede9fb2fb00cb36&pass=&l=PL&nick=&kolejka=false&t=0ce4a&napios=Linux&v=dreambox
response:
body:
string: !!binary |
ezExODl9ezEyNzF9VLN1bWFjemVuaWU6fHNpbnU2DQp7MzE0Nn17MzE4OX0vTmllIHJvenVtaWVj
aWU/DQp7MzE4OX17MzI0NH0vSrlkcm8gS3J5cHRvbmEgc2nqIHJvenBhZGEuDQp7MzI0NH17MzI5
OX1UbyBrd2VzdGlhIHR5Z29kbmkuDQp7MzI5OX17MzM5MH1Pc3RyemVnYbNlbSwgv2UgZWtzcGxv
YXRhY2phIGq5ZHJhfHRvIHNhbW9i82pzdHdvLg0KezMzOTd9ezM0NDV9VG8gamVkeW5pZSBwcnp5
c3BpZXN6ebNvIGltcGxvemrqLg0KezM0NDh9ezM1NTh9UmV6ZXJ3eSBlbmVyZ2V0eWN6bmUgYnmz
eSBuYSB3eWN6ZXJwYW5pdS58Q28gbWllbGmcbXkgenJvYmnmLCBFbD8NCnszNTU4fXszNjQ0fVp3
cvNjaeYgc2nqIGt1IGd3aWF6ZG9tLnxKYWsgbmFzaSBwcnpvZGtvd2llLg0KezM2NDR9ezM2OTV9
U7kgdGFtIJx3aWF0eSx8bmFkYWq5Y2Ugc2nqIGRvIHphbWllc3prYW5pYS4NCnszNjk3fXszNzQ1
fU1vv2VteSB6YWN6ueZ8b2QgbmFzenljaCBkYXdueWNoIGtvbG9uaWkuDQp7Mzc0NX17MzgyOX1O
YXByYXdk6iBzdWdlcnVqZXN6fGV3YWt1YWNq6iBjYbNlaiBwbGFuZXR5Pw0KezM4Mjl9ezM5MTN9
TmllLiBMb3MgamVqIG1pZXN6a2HxY/N3fGplc3QganW/IHByemVzuWR6b255Lg0KezM5Mzd9ezQw
NDV9UHJ6ZWthv2NpZSBtaSBrb250cm9s6iBuYWQgS29kZXhlbS58WmFwZXduaeogcHJ6ZXRyd2Fu
aWUgbmFzemVqIHJhc3kuDQp7NDA0NX17NDE2OX1XY2m5vyBqZXN0IG5hZHppZWphLnxUcnp5bWGz
ZW0garkgdyByYW1pb25hY2guDQp7NDQ5OH17NDYxNX0tIE5pbmllanN6eW0gUmFkYSB6b3N0YWpl
IHJvendpuXphbmEufC0gWiBjenlqZWdvIHJvemthenU/DQp7NDYxOH17NDY2Nn1Nb2plZ28uDQp7
NDcyOH17NDgyMn1SZXN6dGEgem9zdGFuaWUgb3O5ZHpvbmEgaSB1a2FyYW5hLg0KezQ4NzB9ezQ5
MjV9Q28gdHkgd3lwcmF3aWFzeiwgWm9kPyF8VG8gc3phbGXxc3R3byENCns0OTI1fXs0OTY4fVBv
d2luaWVuZW0gdG8genJvYmnmIGp1vyBkYXduby4NCns0OTY4fXs1MDgxfVByemV6IGljaCBuaWVr
b/FjerljZSBzaeogZGViYXR5fGRvcHJvd2FkemlsaSBLcnlwdG9uYSBkbyB6Z3VieSENCns1MTM4
fXs1MjI0fVByemVqbXVqZXN6IHezYWR66iBzabO5P3xOaWUgYupkemllc3ogbWlhsyBraW0gcnq5
ZHpp5i4NCns1MjI0fXs1MzM3fVBvbfO/IG1pIHdp6mMgb2NhbGnmIG5hc3q5IHJhc+oufFphY3pu
aWVteSBuYSBub3dvLg0KezUzMzd9ezU0NDB9V3lwbGVuaW15IGRlZ2VuZXJhdPN3LHxrdPNyenkg
ZG9wcm93YWR6aWxpIGRvIHVwYWRrdS4NCns1NDQwfXs1NTI5fUEga3RvIHpkZWN5ZHVqZSwga29n
byBvc3pjeupkemnmPw0KezU1NjB9ezU2MDN9VHk/DQp7NTYzNH17NTc0MH1OaWUgcvNiIHRlZ28s
IEVsLiBOaWUgY2hj6ix8YnmcbXkgc3RhbGkgc2nqIHdyb2dhbWkuDQp7NTc0NX17NTgxMn1as2Ft
YbNlnCBvYm93abl6dWq5Y2UgbmFzIHphc2FkeS4NCns1ODE3fXs1ODkxfVBvZG5pb3OzZZwgbWll
Y3p8cHJ6ZWNpd2tvIHezYXNuZW11IGx1ZG93aS4NCns1OTA1fXs2MDM1fVVzemFudWrqIGN6s293
aWVrYSwga3TzcnltIGtpZWR5nCBiebNlnC58TmllIHBvdHdvcmEsIGpha2ltIHNp6iBzdGGzZZwu
DQp7NjExNn17NjE3MX1aYWJyYeYgZ28uDQp7NjI5NH17NjM2Nn0vLSBXc3p5c3RrbyB3IHBvcnq5
ZGt1P3wtIFogZHJvZ2khDQp7NjM5Mn17NjQyOH1Qb3dpZWR6aWGzZW0uLi4NCns2ODA5fXs2OTI3
fS0gUG+zuWN6IG1uaWUgeiBMYXK5LnwvLSBaYSB0b2K5LCBKb3IhDQp7NzAxMX17NzEzMH1MYXJh
LCBwcnp5Z290dWogc3RhcnQufFByenli6mTqIGphayBuYWpzenliY2llai4NCns3NDU5fXs3NTA0
fUgnUmFrYSENCns4NDI4fXs4NDkyfS0gV2lkemlhs2GcIEtvZGV4P3wvLSBKZXN0IHBvZCByYXR1
c3plbS4NCns4NDkyfXs4NTg4fS9Pc3RyemVnYW0sIL9lIHplapxjaWUgdGFtfC9qZXN0IHByemVz
dOpwc3R3ZW0ga2xhc3kgQi4uLg0Kezg1ODh9ezg2OTh9VG8ganW/IG5pZXdhv25lLCBLZWxleC58
jHdpYXQgc2nqIGtv8WN6eS4NCnsxMDIyOH17MTAzNTN9Sm9yLUVsLCB6IHJvemthenUgZ2VuZXJh
s2EgWm9kYSx8bWFzeiBvZGRh5iBLb2RleC4NCnsxMTUxMX17MTE1NjZ9U3Bva29qbmllLCBIJ3Jh
a2EuDQp7MTIwNDF9ezEyMTA4fS0gWm5hbGWfbGmcY2llIGp1vyCcd2lhdD98LSBUYWsuDQp7MTIx
MTN9ezEyMTk5fS9Lcrm/eSB3b2vzsyC/87N0ZWogZ3dpYXpkeXwvY2m5Z3UgZ7Pzd25lZ28uDQp7
MTIyMzB9ezEyMjc2fU2zb2RhIGd3aWF6ZGEuDQp7MTIyNzZ9ezEyMzM4fUplZ28ga29t83JraSBi
6mS5IGN6ZXJwYeZ8eiBuaWVqIGVuZXJnaeouDQp7MTIzOTF9ezEyNDUxfVd5Z2y5ZGEgbmEgdG8s
fL9lIG1hIGludGVsaWdlbnRuuSBwb3B1bGFjauouDQp7MTI0NjV9ezEyNTQyfULqZHppZSB3eXJ6
dXRraWVtLCBkeml3b2y5Z2llbS4NCnsxMjU4M317MTI2NDB9LSBaYWJparkgZ28ufC0gSmFrPw0K
ezEyNjU5fXsxMjcyOX1C6mR6aWUgZGxhIG5pY2ggYm9naWVtLg0KezEyNzQ2fXsxMjgwMX1BIGpl
nGxpIHN0YXRlayBuaWUgZG9sZWNpPw0KezEyODI1fXsxMjg3OH1PbiB6Z2luaWUgZ2R6aWWcIHRh
bS4uLg0KezEyODc4fXsxMjkyNX13IHNhbW90bm+cY2kuDQp7MTI5NTR9ezEyOTk1fU5pZSBtb2fq
Lg0KezEyOTk1fXsxMzA3OX1NeZxsYbNhbSwgv2UgcG90cmFmaeosIGFsZS4uLnxraWVkeSBqdb8g
c2nqIHVyb2R6abMuLi4NCnsxMzA5MX17MTMyMjB9S3J5cHRvbmEgY3pla2EgemFns2FkYS58VG8g
ZGxhIG5pZWdvIGplZHluYSBzemFuc2EuDQp7MTMyMjN9ezEzMjk1fUkgZGxhIG5hc3plZ28gbHVk
dS4NCnsxMzMwMn17MTMzMjN9TyBjbyBjaG9kemksIEtlZWxleD8NCnsxMzMyM317MTMzODZ9L1Bp
6uYgc3RhdGvzdyBib2pvd3ljaHwvbmFkbGF0dWplIHplIHdzY2hvZHUuDQp7MTMzODZ9ezEzNDQz
fS9aZXNrYW5vd2FsaSBzeXN0ZW15IG9icm9ubmUgY3l0YWRlbGkuDQp7MTM0NDN9ezEzNTEzfS0g
WmGzYWR1auogS29kZXgufC0gWmFjemVrYWouDQp7MTM1NjZ9ezEzNjM1fURhaiBtaSBuYSBuaWVn
byBwb3BhdHJ6ZeYuDQp7MTM3MTJ9ezEzNzgxfU5pZSB6b2JhY3rqLHxqYWsgc3Rhd2lhIHBpZXJ3
c3plIGtyb2tpLg0KezEzODI3fXsxMzg4OX1OaWUgdXOzeXN66ix8amFrIHd5bWF3aWEgbmFzemUg
aW1pb25hLg0KezE0MDA3fXsxNDA5MX1UYW0sIHBvnHLzZCBnd2lhemQuLi4NCnsxNDEyMn17MTQx
OTR9YupkemllIL95sy4NCnsxNTU0OH17MTU1ODR9r2VnbmFqLCBzeW51Lg0KezE1NjExfXsxNTY3
M31aYWJpZXJ6IHplIHNvYrkgbWFyemVuaWEuDQp7MTY1OTl9ezE2Njc4fU9zdHJ6ZWxh5iBns/N3
bmUgd2VqnGNpZS4NCnsxNzA0Mn17MTcxMDl9L0xhZHkgTGFybywgbmFw6mQgZ290b3d5IGRvIHN0
YXJ0dS4NCnsxNzEwOX17MTcxNTB9VXJ1Y2hvbSBzaWxuaWtpLg0KezE3MTU3fXsxNzE4NH1HZW5l
cmFsZS4NCnsxNzE4Nn17MTcyNzd9WmFyZWplc3Ryb3dhbGmcbXkgb2RwYWxlbmllIHNpbG5pa/N3
fHdld265dHJ6IGN5dGFkZWxpLg0KezE3Mjk0fXsxNzMzMn1TdGFydHVquS4NCnsxNzM1Nn17MTc0
MTR9T2JzdGF3Y2llIHTqIHBsYXRmb3Jt6i4NCnsxNzcwNn17MTc4NTN9V2llbSwgv2UgdWtyYWSz
ZZwgS29kZXgufFp3cvPmIGdvLCBhIGRhcnVq6iBjaSC/eWNpZS4NCnsxNzg3OX17MTc5NDR9VG8g
ZHJ1Z2Egc3phbnNhIGRsYSBjYbNlZ28gS3J5cHRvbmEuDQp7MTc5NDZ9ezE4MDExfU5pZSB0eWxr
byBkbGEgdHljaCx8a3TzcnljaCB1em5hc3ogemEgZ29kbnljaC4NCnsxODAzNX17MTgxMzh9LSBD
b5wgdHkgenJvYmmzP3wtIE1hbXkgZHppZWNrbywgWm9kLg0KezE4MTUwfXsxODE4Nn1DaLNvcGNh
Lg0KezE4MTg4fXsxODI2NX1QaWVyd3N6ZSBuYXR1cmFsbmUgdXJvZHplbmllIG9kIHN0dWxlY2ku
DQp7MTgyODR9ezE4MzkwfULqZHppZSB3b2xueS58U2FtIHpkZWN5ZHVqZSBvIHN3b2plaiBwcnp5
c3qzb5xjaS4NCnsxODQxOH17MTg0NTR9SGVyZXpqYSENCnsxODQ5M317MTg1Mjl9Wm5pc3pjennm
IGdvIQ0KezE5ODAyfXsxOTg2NH1Qb3OzdWNoYWogbW5pZSwgTGFybyENCnsxOTg2NH17MTk5NDN9
S29kZXggamVzdCBwcnp5c3qzb5xjabkgS3J5cHRvbmEuDQp7MTk5NjB9ezIwMDA4fVByemVyd2lq
IHN0YXJ0IQ0KezIwNDc4fXsyMDUyOH1OaWUhDQp7MjEyMzN9ezIxMzYzfVdhc3ogc3luLi4ufERv
a7lkIGdvIHd5c7Nhs2GcPw0KezIxNDI1fXsyMTU1MH1NYSBuYSBpbWnqIEthbCwgc3luIEVsYS4N
CnsyMTYzNH17MjE3MjJ9SmVzdCBwb3phIHR3b2ltIHphc2nqZ2llbS4NCnsyMTk0NX17MjIwMjB9
WmVzdHJ6ZWxp5iB0ZW4gc3RhdGVrLg0KezIyMTc1fXsyMjIxMX0vQ2VsIG5hbWllcnpvbnkuDQp7
MjI0OTd9ezIyNTg4fS9SenXmY2llIGJyb/EufC9KZXN0ZZxjaWUgb3RvY3plbmkuDQp7MjI4MjV9
ezIyOTM1fS9HZW5lcmFsZSBab2QsfC96YSBtb3JkZXJzdHdvIGkgemRyYWTqLA0KezIyOTQwfXsy
MzA0OH0vUmFkYSBza2F6dWplIGNpZWJpZXxpIHBvem9zdGGzeWNoIHJlYmVsaWFudPN3DQp7MjMw
NDh9ezIzMTQ5fW5hIDMwMCBjeWtsaSBvZG5vd3kgc29tYXR5Y3puZWouDQp7MjMxNjN9ezIzMjI4
fU1hc3ogamFraWWcIG9zdGF0bmllIHOzb3dvPw0KezIzMjc2fXsyMzM2OX1OaWUgemFiaWplY2ll
IG5hcyx8v2VieSBuaWUgcG9icnVkemnmIHNvYmllIHK5aywNCnsyMzM2OX17MjM0NTN9emEgdG8g
enN5s2FjaWUgbmFzfHcgb3RjaLNh8SBuYSB3aWVjem5vnOYhDQp7MjM0OTJ9ezIzNTc4fUpvci1F
bCBzs3Vzem5pZSBva3JlnGxpsyB3YXN8YmFuZLkgZ7N1cGPzdy4NCnsyMzU4MH17MjM2NDB9Q28g
ZG8gamVkbmVnbyENCnsyMzY0NX17MjM2NzJ9QSB0eS4uLg0KezIzNzEyfXsyMzc4NH1XaWVyenlz
eiwgv2UgdHfzaiBzeW4gamVzdCBiZXpwaWVjem55Pw0KezIzNzk0fXsyMzgyNX1PZG5hamTqIGdv
Lg0KezIzODM3fXsyMzkxNn1PZHp5c2thbSB0byx8Y28gbmFtIHphYnJhbGmcY2llIQ0KezIzOTc0
fXsyNDAxMH1PZG5hamTqIGdvLg0KezI0MDQzfXsyNDEwMX1PZG5hamTqLCBMYXJvLg0KezI0MTcw
fXsyNDIyMX1PZG5hamTqIGdvIQ0KezI2NjU3fXsyNjc0MH0vTGFkeSBMYXJvLHwvcG93aW5uYSBw
YW5pIHBvc3p1a2HmIHNjaHJvbmllbmlhLg0KezI2NzUyfXsyNjgxMn1OaWUgbWEgZ2R6aWUgc2nq
IHNrcnnmLCBLZWxvci4NCnsyNjg0NH17MjY5MDZ9Sm9yLUVsIG1pYbMgcmFjauouDQp7MjY5NDd9
ezI2OTk1fVRvIGtvbmllYy4NCnsyNzI3MH17MjczNjl9TmllY2ggdHfzaiCcd2lhdHxi6mR6aWUg
bGVwc3p5LCBLYWwuDQp7Mjk1NDZ9ezI5NjQ0fVV3Yb9haiwgZ7N1cGt1LHxibyB6b3N0YW5pZSB6
IGNpZWJpZSBtb2tyYSBwbGFtYSENCnsyOTY5OX17Mjk3OTB9U2u5ZCBvbmkgY2nqIHd5dHJ6YXNu
6mxpLCBts29keT8NCnsyOTgwOX17Mjk4NTB9L1phYmV6cGllY3p55iBwb2uzYWQhDQp7Mjk4NTB9
ezI5OTMyfU9kZWJyYWxpnG15IHdlendhbmllIG8gcG9tb2N8eiBwbGF0Zm9ybXkgbmEgd3NjaPNk
IG9kIG5hcy4NCnsyOTkzMn17Mjk5Nzd9WmFiZXpwaWVjennmIHBva7NhZCENCnszMDA3NX17MzAx
MjN9L0plZG5vc3RraSBjeXdpbG5lLCBuaWUgemJsab9h5iBzaeohDQp7MzAxMjN9ezMwMTgzfS9V
c3prb2R6b255IGplc3QgamVkZW4geiB6YXdvcvN3LnwvUGxhdGZvcm1hIG1vv2Ugd3lidWNobrnm
Lg0KezMwMTgzfXszMDI1M31acm96dW1pYbNlbS58QSBjbyB6IGx1ZJ9taT8NCnszMDI1NX17MzAz
NTF9Ly0gTmllIG1harkgc3phbnMufC0gTbNvZHksIHByenluaWWcIG1pIGxvcm5ldGvqLg0KezMw
Mzk3fXszMDQ0Mn1Ns29keSENCnszMDYzNH17MzA3MjN9VG8gb3N0YXRuaWEgYnV0bGEhfE5pZSB3
eXRyenltYW15IGSzdb9laiENCnszMDk0M317MzA5ODR9L1R1IHN0cmG/IHd5YnJ6Zb9hLg0KezMw
OTg0fXszMTA2M30vWnJvYmlteSBqZXN6Y3plIGplZGVuIHByemVsb3R8L2kgd3lub3NpbXkgc2nq
IHN0uWQuDQp7MzEwOTR9ezMxMTU0fUN6ZWthamNpZSwgd2lkeuogbHVkemkgbmEgbLlkb3dpc2t1
IQ0KezMxNjUxfXszMTcxMX0vRGF3YWogdGVnbyBvc3RhdG5pZWdvLnwvTXVzaW15IHN0YXJ0b3dh
5iENCnszMTcxMX17MzE3NzV9V3NrYWt1aiF8Q28gdHkgd3lwcmF3aWFzej8hDQp7MzE4OTV9ezMx
OTMxfVN0YXJ0dWplbXkhDQp7MzI4NDV9ezMyOTE0fS9LaWVkeSBLYW5zYXMgc3Rhs28gc2nqIHRl
cnl0b3JpdW0uLi4NCnszMjk0OH17MzI5ODF9L0NsYXJrIQ0KezMzMDI5fXszMzA3Mn1Vd2G/YXN6
LCBDbGFyaz8NCnszMzE3MX17MzMyNTV9U3B5dGGzYW0gY2nqfG8gcGllcndzenljaCBvc2Fkbmlr
83cgdyBLYW5zYXMuDQp7MzM1NjZ9ezMzNjE3fURvYnJ6ZSBzaeogY3p1amVzeiwgQ2xhcms/DQp7
MzM3ODl9ezMzODIzfUNsYXJrIQ0KezMzOTY5fXszNDAwM31DbGFyayENCnszNDA3NX17MzQxNjN9
LSBXeWpknywgQ2xhcmshfC0gWm9zdGF3Y2llIG1uaWUuDQp7MzQxNzN9ezM0MjE5fVdlendhs2Ft
IHR3b2q5IG1hdGvqLg0KezM0MzUwfXszNDQyMH1KZXN0ZW0hfENsYXJrLCBjbyBzaeogc3Rhs28s
IHNrYXJiaWU/DQp7MzQ0ODV9ezM0NTQyfS8tIE90d29yenlzeiBkcnp3aT98Ly0gQ28gbXUgb2Ri
abNvPw0KezM0NTQyfXszNDU4NX0vLSBUbyBkeml3YWsufC8tIE1hemdhai4NCnszNDU4OH17MzQ2
NDV9L1JvZHppY2UgbmllIHBvendhbGFquSBtdXwvYmF3aeYgc2nqIHogaW5ueW1pIGR6aWXmbWku
DQp7MzQ2NDh9ezM0Njg0fS9XaWVtLg0KezM0Njg2fXszNDc4OX1Ta2FyYmllISBKYWsgbWFtIGNp
IHBvbfNjLHxza29ybyBtbmllIG5pZSB3cHWcY2lzej8NCnszNDc5NH17MzQ4NTZ9jHdpYXQgamVz
dCB6Ynl0IGR1v3ksIG1hbW8uDQp7MzQ4NTZ9ezM0OTA0fS9UbyBnbyB6bW5pZWpzei4NCnszNDk1
MH17MzQ5OTh9UG8gcHJvc3R1Li4uDQp7MzUwNDN9ezM1MTAxfXNrdXAgc2nqIG5hIG1vaW0gZ7Nv
c2llLg0KezM1MTMyfXszNTE5NH0vVWRhd2FqLCC/ZSB0byB3eXNwYS4NCnszNTE5NH17MzUyNDd9
L0dkemllnCBuYSBvY2VhbmllLg0KezM1MjY2fXszNTMxOX1XaWR6aXN6IGq5Pw0KezM1Mzg0fXsz
NTQyMn1XaWR66i4NCnszNTQ0MX17MzU0OTR9ULN58SB3IGplaiBraWVydW5rdSwga29jaGFuaWUu
DQp7MzU4MDN9ezM1ODY2fUNvIG1pIGplc3QsIG1hbW8/DQp7MzU5MTh9ezM1OTY2fUNsYXJrLg0K
ezM3OTY4fXszODA0OH1IZWosIHBpZXJkb7NvIXxPZ2y5ZGGzZZwgbWVjej8NCnszODA2NH17Mzgx
MzZ9LSBab3N0YXcgZ28sIFBldGUufC0gQSB0eSBjbz8gSmVnbyBkemlld2N6eW5hPw0KezM4MTM5
fXszODE5MX1DaGPqIHVzs3lzemXmLHxjbyBtYSBkbyBwb3dpZWR6ZW5pYS4NCnszODIyNX17Mzgy
NzB9Tm8gc7N1Y2hhbSwgY2lvs2t1Lg0KezQwNjgyfXs0MDgxOX0vTfNqIHN5biBiebMgdyBhdXRv
YnVzaWUufC9XaWR6aWGzLCBjbyB6cm9iabMgQ2xhcmsuDQp7NDA4MjZ9ezQwOTE1fVdpZW0ufFRv
LCBjbyBtdSBzaeogd3lkYXdhs28uLi4NCns0MDkxN317NDA5ODl9VG8gYnmzYSBy6mthIGJvc2th
Lg0KezQwOTg5fXs0MTAzN31UbyBiebNhIGJvv2Egb3BhdHJ6bm+c5i4NCns0MTE0MH17NDEyMjd9
LSBDaHliYSB0cm9jaOogd3lvbGJyenltaWFzei58LSBXY2FsZSBuaWUuDQp7NDEyNDF9ezQxMzAx
fUxhbmEgaSBGb3JueSB0Zb8gdG8gd2lkemllbGkuDQp7NDEzMDF9ezQxMzkyfS9OaWUgcGllcndz
enkgcmF6fC9DbGFyayB6cm9iabMgY2+cIHRha2llZ28uDQp7NDE3NTJ9ezQxODkxfS0gSmEgdHls
a28gY2hjaWGzZW0gcG9t82MufC0gV2llbSwgYWxlIGp1vyBvIHR5bSByb3ptYXdpYWxpnG15Lg0K
ezQxOTE3fXs0MTk4N31Sb3ptYXdpYWxpnG15IG8gdHltLnxNdXNpc3ouLi4NCns0MTk5Mn17NDIw
ODN9TXVzaXN6IHphY2hvd2HmfHN382ogZGFyIHcgdGFqZW1uaWN5Lg0KezQyMDkwfXs0MjE3MX1N
aWGzZW0gcG96d29saeYgaW0gdW1yemXmPw0KezQyMjk2fXs0MjM0NH1Nb79lLg0KezQyMzgyfXs0
MjQ3OH1UdSBjaG9kemkgbyBjb5wgd2nqY2VqfG5pvyC/eWNpZSBuYXN6ZSBpIG5hc3p5Y2ggYmxp
c2tpY2guDQp7NDI1NDN9ezQyNTg5fUtpZWR5IJx3aWF0Li4uDQp7NDI1OTh9ezQyNjk5fUtpZWR5
IJx3aWF0IGRvd2llIHNp6iwgY28gcG90cmFmaXN6LHx0byB3c3p5c3RrbyB6bWllbmkuDQp7NDI3
MDF9ezQyNzQ5fU5hc3q5IHdpYXLqLCBwb2dsuWR5Li4uDQp7NDI3Njh9ezQyODQwfXpuYWN6ZW5p
ZSBjerNvd2llY3pl8XN0d2EsIHdzenlzdGtvLg0KezQyODQzfXs0Mjk2M31XaWR6aWGzZZwgcmVh
a2Nq6iBtYW15IFBldGUnYS58T25hIHNp6iBjaWViaWUgYm9pLg0KezQzMDAxfXs0MzA0NH1EbGFj
emVnbz8NCns0MzA2MX17NDMxMzV9THVkemllIGJvarkgc2nqIHRlZ28sfGN6ZWdvIG5pZSByb3p1
bWllarkuDQp7NDMxMzh9ezQzMTg4fU1hIHJhY2rqPw0KezQzMjA1fXs0MzI4MX1UbyBkYXIgb2Qg
Qm9nYT8NCns0MzI5MX17NDMzMjB9UG93aWVkei4NCns0MzY4NH17NDM3MzB9VyB0eW0gY2nqIHpu
YWxln2xpnG15Lg0KezQzNzczfXs0Mzg0N31CeWxpnG15IHBld25pLHy/ZSB6amF3aSBzaeoga3Rv
nCB6IHJ6uWR1Lg0KezQzODUwfXs0Mzg5OH1BbGUgbmlrdCBuaWUgcHJ6eXN6ZWSzLg0KezQ0MjM4
fXs0NDMyMH1UbyB6bmFsYXqzZW0gcHJ6eSB0b2JpZS4NCns0NDM0Nn17NDQ0MTN9WmFicmGzZW0g
dG8gZG8gbWV0YWx1cmdhfHcgS2Fuc2FzIFN0YXRlLg0KezQ0NDE2fXs0NDQ4NX1Qb3dpZWR6aWGz
LCC/ZSB6IGN6ZWdva29sd2lla3x0byBiebNvIHpyb2Jpb25lLi4uDQp7NDQ0OTd9ezQ0NTY5fXRv
IG5pZSBtYSB0ZWdvfHcgdGFibGljeSBwaWVyd2lhc3Rr83cuDQp7NDQ2MTl9ezQ0NzE1fUlubnlt
aSBzs293eSwgdG8gbmllIHBvY2hvZHppfHogbmFzemVnbyCcd2lhdGEuDQp7NDQ3NTF9ezQ0ODIx
fVR5IHLzd25pZb8uDQp7NDQ4NDd9ezQ0OTY3fUplc3RlnCBvZHBvd2llZHppuSBuYSBweXRhbmll
OnwiQ3p5IGplc3RlnG15IHNhbWkgd2Ugd3N6ZWNonHdpZWNpZT8iLg0KezQ1MDAxfXs0NTA4OX0t
IEFsZSBqYSBuaWUgY2hj6i58LSBXY2FsZSBjaeogbmllIHdpbmnqLg0KezQ1MDkyfXs0NTE4M31U
byBiebNvYnkgb2dyb21uZSBicnplbWnqIGRsYSBrYb9kZWdvLHxhbGUgdHkgbmllIGplc3RlnCB6
d3lrs3ltIGN6s293aWVraWVtLg0KezQ1MTgzfXs0NTI1MH1XaWVyeuosIL9lLi4uDQp7NDUyNzZ9
ezQ1MzM5fXd5c7Nhbm8gY2nqIHR1fHogamFraWVnb5wgcG93b2R1Lg0KezQ1MzQ4fXs0NTQyMH1U
ZSB3c3p5c3RraWUgem1pYW55LHxrdPNyeWNoIGRvnHdpYWRjemFzeiwNCns0NTQyMH17NDU1NDB9
a2llZHmcIG9rYb+5IHNp6iBis29nb3OzYXdpZfFzdHdlbS58Qupkemllc3ogbXVzaWGzIHd0ZWR5
IGRva29uYeYgd3lib3J1Lg0KezQ1NTUwfXs0NTY0OH1Denkgc3RhbrnmIGR1bW5pZXxwcnplZCBs
dWR6a7kgcmFzuSwgY3p5IHRlvyBuaWUuDQp7NDU2ODF9ezQ1NzUzfU5pZSBt82ezYnltIHBvIHBy
b3N0dXx1ZGF3YeYgdHdvamVnbyBzeW5hPw0KezQ1NzY4fXs0NTgyMX1KZXN0ZZwgbW9pbSBzeW5l
bS4NCns0NTkxOX17NDYwMTB9QWxlIGdkemllnCB0YW18bWFzeiB0Zb8gZHJ1Z2llZ28gb2pjYSwN
Cns0NjAxMH17NDYwNjd9a3TzcnkgZGGzIGNpIGlubmUgaW1p6i4NCns0NjEzNX17NDYyMTF9UHJ6
eXOzYbMgY2nqIHR1fHogamFraWVnb5wgcG93b2R1Lg0KezQ2MjUwfXs0NjMwN31JIGNob+ZieSBt
aWGzbyBjaSB0b3x6YWq55iBjYbNlIL95Y2llLA0KezQ2MzA3fXs0NjM4NH1tdXNpc3ogcG96bmHm
IHRlbiBwb3fzZC4NCns0Njc2OH17NDY4NTZ9LSBUbyBuaWUgbWlhs3kgYnnmIOZ3aWN6ZW5pYT98
LSBabWlhbmEgcGxhbvN3Lg0KezQ2ODU2fXs0NjkzMX1abmFsZZ9saSBjb5wgZHppd25lZ298bmEg
V3lzcGllIEVsbGVzbWVyZSdhLg0KezQ2OTMxfXs0NzAwNX0tIENhs3kgdHlkemll8SByb2JpuSB0
YW0genJ6dXR5LnwtIERvIHRlaiBwaXBpZPN3eT8NCns0NzAwNX17NDcwNTN9TmllerN5IG9kamF6
ZCwgY28/DQp7NDcwNTN9ezQ3MTA2fUFtZXJ5a2FuaWUgdGW/IHByenlqZWNoYWxpLnxDYbNhIG1h
c2EuDQp7NDcxMDZ9ezQ3MTc4fU5henl3YWq5IHRvIGFub21hbGm5LHxjb2tvbHdpZWsgdG8gem5h
Y3p5Lg0KezQ3MTgwfXs0NzI2MX0tIE9kd2FsIHNp6iwgbfN3aeogcG93Yb9uaWUufC0gTm8gY28g
dHksIENocmlzc3kuDQp7NDcyNjF9ezQ3MzA3fS0gU3BhZGFqIXwtIFVzablkny4NCns0NzMwN317
NDc0MDN9LSBQdXN6Y3phaiF8LSBab3N0YXcgarkuDQp7NDc0Njh9ezQ3NTIwfUJvIGNvLCB0d2Fy
ZHppZWx1Pw0KezQ3NTIwfXs0NzYwN31CbyBi6mTqIG11c2lhsyBwb3Byb3Np5ix8v2VieZwgd3lz
emVksy4NCns0NzYzMX17NDc3MzF9V3lqZOosIGtpZWR5IGLqZOogbWlhs3xuYSB0byBvY2hvdOou
DQp7NDc5NDJ9ezQ3OTk1fVphY3p5bmEgc2nqLg0KezQ4MTU2fXs0ODIzM31OaWUgd2FydG8uDQp7
NDgzOTZ9ezQ4NDk5fU5pZSB6YXBvbW5paiBuYXBpd2t1LCBkdXBrdS4NCns0OTc1N317NDk3ODR9
RHpp6mtpLg0KezQ5ODEwfXs0OTgzOX1DemWc5i4NCns0OTg1MX17NDk4OTl9V2l0YW0sIHBhbm5v
IExhbmUuDQp7NDk5MTF9ezUwMDIxfS0gSmVkIEV1YmFua3MsICJBcmN0aWMgQ2FyZ28iLnwtIERh
bGVrbyBkbyBiYXp5Pw0KezUwMDIxfXs1MDA3Nn1PYvN6IGplc3QgemEgd3puaWVzaWVuaWVtLnxa
YXByb3dhZHrqIHBhbmm5Lg0KezUwMDc2fXs1MDA5OH2Md2lldG5pZS4NCns1MDA5OH17NTAxNTN9
Sm9lIHphYmllcnplIHBhbmkgYmFnYb9lLg0KezUwMTU4fXs1MDI3M30tIFBvbfO/IGplai58LSBP
c3Ryb79uaWUsIHO5IGNp6r9raWUuDQp7NTAzMTR9ezUwNDMxfVN6Y3plcnplIG3zd2m5Yyx8bmll
IHByemVwYWRhbSB6YSAiVGhlIERhaWx5IFBsYW5ldCIuDQp7NTA0Mzh9ezUwNTI1fUFsZSB0ZW4g
cmVwb3J0Yb8sfGt083J5IHpyb2Jps2EgcGFuaSB6IDEuIGR5d2l6arkuLi4NCns1MDUzOX17NTA1
ODd9QnmzZW0gcG9kIHdyYb9lbmllbS4NCns1MDU4OX17NTA3MDd9TmFqbGVwaWVqIHBpc3plIG1p
IHNp6nx3IGthbWl6ZWxjZSBrdWxvb2Rwb3JuZWouDQp7NTA4MjJ9ezUwODQ0fS9QYW5ubyBMYW5l
Lg0KezUwODQ4fXs1MDk0NH1QdbNrb3duaWsgSGFyZHkgeiBkb3fzZHp0d2EsfGEgdG8gZHIgRW1p
bCBIYW1pbHRvbi4NCns1MDk0NH17NTEwMjN9U3BvZHppZXdhbGmcbXkgc2nqIHBhbml8ZG9waWVy
byBqdXRyby4NCns1MTAyM317NTEwOTV9V7NhnG5pZSBkbGF0ZWdvIHByenlsZWNpYbNhbSBkemlz
aWFqLg0KezUxMDk4fXs1MTE2Mn1XeWphnG5pam15IHNvYmllIGplZG5vLg0KezUxMTYyfXs1MTIy
NX1KZXN0ZW0gdHUgdHlsa28gZGxhdGVnbyx8v2UgdG8gdGVyZW55IEthbmFkeSwNCns1MTIyN317
NTEzMTZ9YSBzuWQgYXBlbGFjeWpueSBvZHJ6dWNps3x3YXN6IHduaW9zZWsgbyB6YWthemFuaWUg
bWkgd3N06nB1Lg0KezUxMzI1fXs1MTQ0NX1Ta29ybyBtaWVyemVuaWUgZml1dPN3IG1hbXkgemEg
c29iuSx8bW+/ZWNpZSBtaSBwb2themHmLCBjbyB6bmFsZZ9saZxjaWU/DQp7NTE0OTN9ezUxNTgy
fVNhdGVsaXR5IE5BU0Egd3lrcnmzeSBhbm9tYWxp6i4NCns1MTU4Mn17NTE2NzF9ULN5dHkgbG9k
b3dlIGJsb2t1arkgc3lnbmGzLHxhbGUgeiBwZXdub5xjabkgY2+cIHRhbSBqZXN0Lg0KezUxNjcx
fXs1MTc1N30tIE1vv2UgcmFkemllY2thILPzZJ8gcG9kd29kbmE/fC0gV7l0cGxpd2UuIFRvIG1h
IDMwMCBtZXRy83cuDQp7NTE3NTl9ezUxODI3fU8gd2llbGUgd2nqa3N6ZXxuab8gb2ty6nR5IHog
dGFtdHljaCBjemFz83cuDQp7NTE4MzZ9ezUxODg2fUEgdGVyYXogbmFqZHppd25pZWpzemUuDQp7
NTE4OTh9ezUyMDI2fUzzZCwga3Tzcnkgb3RhY3phIHRlbiBvYmlla3QsfG1hIHByYXdpZSAyMCB0
eXNp6mN5IGxhdC4NCns1MjA3Nn17NTIxMTR9L1Bhbm5vIExhbmUhDQp7NTIxMjZ9ezUyMTYyfVBy
b3N66iBzaeogbmllIHdhs+pzYeYuDQp7NTIxNjJ9ezUyMjI3fU5vY7kgdGVtcGVyYXR1cmEgc3Bh
ZGEgdHUgZG8gLTQwLg0KezUyMjM3fXs1MjI5Nn1OaWUgem5hbGWfbGlieZxteSBwYW5pfGG/IGRv
IHdpb3NueS4NCns1MjM3MX17NTI0MTJ9UHJvc3rqIGJhcmR6by4NCns1MjQ4MX17NTI1Nzl9LSBB
IGplnGxpIGLqZOogY2hjaWGzYSBzaXVzaXU/fC0gVyBruWNpZSBzdG9pIHdpYWRyby4NCns1MzQw
N317NTM0Njl9QSB0eSBkb2u5ZCBzaeogd3licmGzZZw/DQp7NTg4Nzh9ezU4OTU5fUp1vyBkb2Jy
emUuDQp7NTkzMDB9ezU5MzU1fU1hc3oga3J3b3RvayB3ZXdu6nRyem55Lg0KezU5MzU1fXs1OTQy
MH1KZZxsaSBnbyBuaWUgemF0YW11auouLi4NCns1OTQ1Nn17NTk1Mzd9VW1pZW0gcm9iaeYgcnpl
Y3p5LHxrdPNyeWNoIGlubmkgbmllIHBvdHJhZmm5Lg0KezU5NTM3fXs1OTU4NX1Ucnp5bWFqIG1u
aWUgemEgcupr6i4NCns1OTU4NX17NTk2MzF9QupkemllIGJvbGGzby4NCns2MTEwNX17NjExOTl9
L1RvLCBjbyBwdbNrb3duaWsgSGFyZHkgaSBqZWdvIHplc3Dzs3wvdXpuYWxpIHphIHJhZHppZWNr
uSCz82SfIHBvZHdvZG65LA0KezYxMTk5fXs2MTI2MX0vYnmzbyB6ZGVjeWRvd2FuaWUgYmFyZHpp
ZWogZWd6b3R5Y3puZS4NCns2MTI2OH17NjEzMjh9L0FuYWxpemEgaXpvdG9wb3dhfC9sb2R1IHdv
a/OzIG9iaWVrdHUgd3lrYXphs2EsDQp7NjEzMzF9ezYxNDQ4fS+/ZSBiebMgb24gdyBuaW0gdXdp
6nppb255fC9vZCAxOCB0eXNp6mN5IGxhdC4NCns2MTQ1OH17NjE1NTR9L0NvIGRvIG1vamVnbyB3
eWJhd2N5LHwvem5pa265syB3cmF6IHogb2Rsb3RlbSBvYmlla3R1Lg0KezYxNTY4fXs2MTY4NX0v
T2themGzbyBzaeosfC+/ZSBqZWdvIHRvv3NhbW+c5iBiebNhIGZhs3N6eXdhLg0KezYxNjg4fXs2
MTgwMX0vSmVnbyBpc3RuaWVuaWV8L3JvZHppIHByemVyYb9harljZSBweXRhbmlhLA0KezYxODAx
fXs2MTg2MH0vamVkbmFrIHdpZW0sIGNvIHdpZHppYbNhbS4NCns2MTg3N317NjE5OTV9RG9zemxp
IGRvIHduaW9za3UsfGm/IG9iaWVrdCBpIGplZ28gcGFzYb9lcg0KezYxOTk3fXs2MjA0N31uaWUg
cG9jaG9kerkgeiBaaWVtaS4NCns2MjA4OH17NjIxNTV9TmllIHd5ZHJ1a3Vq6iB0ZWdvLnxUbyBt
b2e5IGJ55iB0eWxrbyB0d29qZSB1cm9qZW5pYS4NCns2MjE1OH17NjIyMzB9Q3l3aWxuaSBwcmFj
b3duaWN5fHBvdHdpZXJkemlsaSBtb2q5IHdlcnNq6i4NCns2MjIzMH17NjIyOTJ9UGVudGFnb24g
emFwcnplY3phIGlzdG5pZW5pdSBzdGF0a3UuDQp7NjIyOTR9ezYyMzg4fUJvIFBlbnRhZ29uIG9k
IHRlZ28gamVzdCx8v2VieSB6YXByemVjemHmLg0KezYyNDAwfXs2MjQ4NH1UbyBqYSwgUGVycnku
fERvc3Rhs2FtIFB1bGl0emVyYS4NCns2MjQ4NH17NjI1NDR9LSBXaepjIHphY2hvd3VqIHNp6iBz
dG9zb3duaWUufC0gRHJ1a3VqZXN6IGFsYm8gb2RjaG9keuouDQp7NjI1NDZ9ezYyNjIxfU5pZSBt
b79lc3oufFdpub9lIGNp6iB1bW93YS4NCns2MjY1NH17NjI3Njd9TmllIHd5cHVzemN66iBoaXN0
b3JpaXxvIG9iY3ljaCB3nHLzZCBuYXMuDQp7NjI5MDh9ezYyOTU5fU5pYyB6IHRlZ28uDQp7NjMw
MDl9ezYzMDY2fVN6a29ja2EgZGxhIHBhbmkuDQp7NjMwNzZ9ezYzMTIyfVd5c3mzYW0gY2kgb3J5
Z2luYbMuDQp7NjMxMjJ9ezYzMjE1fU5hY3plbG55IGdvIG5pZSB3eWRydWt1amUsfGFsZSBnZHli
eSB0YWsgd3ljaWVrsyBkbyBzaWVjaS4uLg0KezYzMjIyfXs2MzMwNn1DenkgbmllIG9waXNhs2Gc
IGtpZWR5nHxtb2plaiBzdHJvbnkgc7Nvd2FtaToNCns2MzMxM317NjM0MDl9LSAib5xsaXpns3kg
cmFrIG9is3VkeSI/fC0gTmFkYWwgdGFrIHV3Yb9hbSwgV29vZGJ1cm4uDQp7NjM0MTJ9ezYzNDg0
fS0gQWxlIHRvIG11c2kgd3lqnOYgbmEgamF3LnwtIERsYWN6ZWdvPw0KezYzNDkxfXs2MzU5Mn1O
aWVjaCBt82ogdGFqZW1uaWN6eSB3eWJhd2ljaWVsIHdpZSx8v2Ugem5hbSBwcmF3ZOouDQp7NjM5
MTV9ezY0MDMwfS9EaWFnbm9zdHlrYSB6YWtv8WN6b25hLnwvVG+/c2Ftb5zmIHBvdHdpZXJkem9u
YS4NCns2NDA0MH17NjQxMTl9L1dzenlzdGtpZSBzeXN0ZW15IHNwcmF3bmUuDQp7NjQzOTV9ezY0
NTA1fVdpZHppZeYgY2nqfGpha28gZG9yb3OzZWdvIG3qv2N6eXpu6i4NCns2NDU0Nn17NjQ2NTZ9
LSBHZHlieSB0eWxrbyBMYXJhIG1vZ7NhIHRvIHpvYmFjennmLnwtIEtpbSBqZXN0ZZw/DQp7NjQ2
NjZ9ezY0NzMwfUplc3RlbSB0d29pbSBvamNlbSwgS2FsLg0KezY0NzQyfXs2NDgzOH1BIHezYZxj
aXdpZSBqZWdvIGNpZW5pZW0sIJx3aWFkb21vnGNpuS4NCns2NDg4NH17NjQ5NzB9TmF6eXdhbSBz
aeogSm9yLUVsLg0KezY1MDI1fXs2NTA4MH1BIEthbD8NCns2NTEzNn17NjUxNzR9VG8gbW9qZSBp
bWnqLg0KezY1MTg4fXs2NTI0OH1LYWwtRWwsIHcgcnplY3p5IHNhbWVqLg0KezY1Mjg3fXs2NTM0
OX1NYW0gdHlsZSBweXRh8S4NCns2NTM5N317NjU1MzZ9U2u5ZCBwb2Nob2R66j98RGxhY3plZ28g
bW5pZSB0dSB3eXOzYbNlnD8NCns2NTUzOH17NjU1ODJ9UG9jaG9kemlzeiB6IEtyeXB0b25hLg0K
ezY1NjQ0fXs2NTc2OX1aZSCcd2lhdGEgbyBiYXJkemllaiBzdXJvd3ltfJxyb2Rvd2lza3Ugbmm/
IHppZW1za2llLg0KezY1ODM2fXs2NjAxM31EYXdubyB0ZW11LCB3IGVyemUgZWtzcGFuc2ppLHxu
YXN6YSByYXNhIHBvbGVjaWGzYSBrdSBnd2lhemRvbSwNCns2NjAyM317NjYwOTJ9dyBwb3N6dWtp
d2FuaXUgbm93eWNoIHNpZWRsaXNrLg0KezY2MTE5fXs2NjI0Nn1UZW4gc3RhdGVrIGJ5syBqZWRu
eW0geiB3aWVsdXx3eXOzYW55Y2ggdyBiZXprcmVzLg0KezY2MjY1fXs2NjMyN31TdHdvcnp5bGmc
bXkgcGxhY/N3a2l8bmEgaW5ueWNoIHBsYW5ldGFjaCwNCns2NjMyN317NjY0MzV9db95d2FquWMg
bWFjaGluLHxieSBkb3N0b3Nvd2HmIJxyb2Rvd2lza28uDQp7NjY0Njl9ezY2NTk4fVByemV6IHN0
byB0eXNp6mN5IGxhdHxuYXN6YSBjeXdpbGl6YWNqYSBiebNhIHcgcm96a3dpY2llLg0KezY2NTk4
fXs2NjcyM30tIERva29ueXdhbGmcbXkgY3Vk83cufC0gQ28gc2nqIHN0YbNvPw0KezY2NzY0fXs2
Njg1N31Vc3Rhbm93aW9ubyBzenR1Y3puuSBrb250cm9s6iB1cm9kemXxLg0KezY2ODU5fXs2Njk1
NX1Qb3J6dWNvbm8gcGxhY/N3a2kgdyBrb3Ntb3NpZS4NCns2Njk1NX17NjcwMTh9V3ljemVycGFs
aZxteSBuYXN6ZSB6YXNvYnkgbmF0dXJhbG5lLg0KezY3MDIzfXs2NzE0Mn1Ta3V0a2llbSBiebNh
fGRlc3RhYmlsaXphY2phIGq5ZHJhIHBsYW5ldHkuDQp7NjcxODZ9ezY3MzAxfU5hc3ogd29qc2tv
d3kgcHJ6eXfzZGNhLHxnZW5lcmGzIFpvZCwNCns2NzMwM317NjczNTh9ZG9rb25hsyB6YW1hY2h1
IHN0YW51Li4uDQp7NjczOTd9ezY3NDUyfWFsZSBiebNvIGp1vyB6YSBw859uby4NCns2NzQ4MH17
Njc1NTB9UmF6ZW0geiB0d29quSBtYXRruXxwcnpld2lkemllbGmcbXkga2F0YXN0cm9m6g0KezY3
NTUwfXs2NzYyNH1pIHBvZGrqbGmcbXkga3Jva2ksfGJ5IHphcGV3bmnmIGNpIHByemV0cndhbmll
Lg0KezY3NjU4fXs2NzcxOH1UbyBqZXN0IGtvbW9yYSBuYXJvZHppbi4NCns2NzcxOH17Njc3OTl9
V3N6eXNjeSBLcnlwdG9uaWFuaWV8dyB0YWtpZWogc2nqIHBvY3rqbGkuDQp7Njc4MDJ9ezY3ODkz
fUthv2RlIGR6aWVja28gbWlhs28gc3Bls25p5nxva3JlnGxvbrkgcm9s6iB3IHNwb7NlY3pl8XN0
d2llLg0KezY3OTAwfXs2Nzk5MX1KYWtvIHJvYm90bmlrLCB3b2pvd25payx8cHJ6eXfzZGNhIGkg
dGFrIGRhbGVqLg0KezY4MDAzfXs2ODA4N31SYXplbSB6IHR3b2q5IG1hdGu5IHdpZXJ6eWxpnG15
LHy/ZSBLcnlwdG9uIHV0cmFjabMgY2+cIGNlbm5lZ28uDQp7NjgwODd9ezY4MTU5fUVsZW1lbnQg
d3lib3J1LCBzemFuc3kuDQp7NjgxNTl9ezY4MjY3fUEgamWcbGkgZHppZWNrbyBtYXJ6ebNvLHxi
eSB6b3N0YeYga2ltnCBpbm55bSwgbmm/IHphcGxhbm93YW5vPw0KezY4MzEwfXs2ODM5Mn1BIGpl
nGxpIG1hcnp5s28gbyB3eb9zenljaCBjZWxhY2g/DQp7NjgzOTR9ezY4NDQyfUJ5s2WcIHVjaWVs
ZZxuaWVuaWVtfG5hc3plaiB3aWFyeSwgS2FsLg0KezY4NDQ0fXs2ODUyMX1QaWVyd3N6ZSBuYXR1
cmFsbmUgbmFyb2R6aW55fG9kIHdpZWvzdy4NCns2ODUyOH17Njg2MTJ9RGxhdGVnbyBwb5x3aepj
aWxpnG15IHdzenlzdGtvLHxieZwgb2NhbGGzLg0KezY4NjIyfXs2ODY3OX1EbGFjemVnbyBuaWUg
cG9sZWNpZWxpnGNpZSB6ZSBtbrk/DQp7Njg3Mzl9ezY4Nzc4fU5pZSBtb2dsaZxteS4NCns2ODgx
MX17Njg4NzF9TWltbyB0ZWdvLHxqYWsgYmFyZHpvIGNoY2llbGmcbXksDQp7Njg4NzZ9ezY4OTM4
fWphayBiYXJkem8gY2nqIGtvY2hhbGmcbXkuLi4NCns2ODkzOH17NjkwNjB9QnlsaZxteSB3eXR3
b3JlbSBuaWVwb3dvZHpl8XxuYXN6ZWdvIJx3aWF0YSwgcG9kb2JuaWUgamFrIFpvZC4NCns2OTA2
M317NjkxMTF9WndpuXphbmkgemUgc3d5bSBsb3NlbS4NCns2OTExM317NjkxNjR9LSBaYXRlbSB6
b3N0YbNlbSBzYW0ufC0gTmllLg0KezY5MjAwfXs2OTI4OH1KZXN0ZZwgbmEgcvN3bml8ZHppZWNr
aWVtIFppZW1pIGkgS3J5cHRvbmEuDQp7NjkyOTN9ezY5Mzc1fU1vv2VzeiB1b3NhYmlh5iB0byx8
Y28gdyBvYnUgnHdpYXRhY2ggbmFqbGVwc3plLg0KezY5Mzc1fXs2OTQ2M31Nb79lc3ogYnnmIG1h
cnplbmllbSx8emEga3TzcmUgb2RkYWxpnG15IHogbWF0a7kgv3ljaWUuDQp7Njk1NzF9ezY5NjUz
fVRvIHByYXdkYSwgv2UgbWllc3prYfFjeSBaaWVtaXxy879uabkgc2nqIG9kIG5hcy4NCns2OTY1
M317Njk3MTV9QWxlIHdpZXJ66iwgv2UgdG8gZG9icnplLg0KezY5NzE1fXs2OTc4OX1OaWUgcG9w
ZbNuabkgdHljaCBzYW15Y2ggYrPqZPN3LHxjbyBteS4NCns2OTc4OX17Njk4NTl9TyBpbGUgaWNo
IHBvcHJvd2FkemlzeiwgS2FsLg0KezY5ODczfXs2OTk0OH1PIGlsZSBkYXN6IGltIG5hZHppZWrq
Lg0KezcwMDA1fXs3MDA3MH1UbyB3s2GcbmllIG96bmFjemEgdGVuIHN5bWJvbC4NCns3MDA3Mn17
NzAxMzl9U3ltYm9sIHJvZHppbnkgRWwgb3puYWN6YSBuYWR6aWVq6i4NCns3MDEzOX17NzAyOTV9
TmFkemllamEgdG8gcG9kc3Rhd2EsfGJ5IHcgbHVkemlhY2ggb2RuYWxln+YgZG9icm8uDQp7NzAz
Mjl9ezcwNDA4fVRvIHezYZxuaWUgbW+/ZXN6IGltIGRh5i4NCns3MDg1NH17NzA5MDl9L0RsYWN6
ZWdvIHRhayBzaeogb2QgbmljaCBy879uaeo/DQp7NzA5MzN9ezcxMDMxfS9JY2ggU7Nv8WNlIGpl
c3QgbbNvZHN6ZXwvaSBqYZxuaWVqc3plIG5pvyBuYXN6ZS4NCns3MTAzNn17NzEwOTZ9L1R3b2pl
IGtvbfNya2l8L2N6ZXJwabkgeiBuaWVnbyBlbmVyZ2nqLA0KezcxMDk2fXs3MTE4N30vd3ptYWNu
aWFquWMgdHdvamUgbWnqnG5pZSx8L3Nr83LqIGkgem15c7N5Lg0KezcxMjA2fXs3MTMzNn0vWmll
bXNrYSBncmF3aXRhY2phIGplc3Qgc7NhYnN6YSx8L2EgYXRtb3NmZXJhIGJhcmR6aWVqIG+/eXdj
emEuDQp7NzEzMzZ9ezcxNDEzfS9XeXJvc7NlnCBzaWxuaWVqc3p5fC9wb25hZCBtb2plIHd5b2Jy
Yb9lbmlhLg0KezcxNDIwfXs3MTU1Nn0vQnkgc2nqIGRvd2llZHppZeYsIGphayBzaWxueSx8L211
c2lzeiBzaeogd2Npub8gc3ByYXdkemHmLg0KezcyODA2fXs3MjkxMX0vUG9rYb9lc3ogbWllc3pr
YfFjb20gWmllbWkgaWRlYbMsfC9kbyBrdPNyZWdvIGLqZLkgZLm/eeYuDQp7NzI5NDJ9ezczMDU1
fS9C6mS5IHBy82Jvd2HmIGNp6iBnb25p5ix8L2LqZLkgc2nqIHBvdHlrYeYsIHVwYWRh5i4NCns3
MzA1N317NzMxMDV9L0FsZSB6IGN6YXNlbS4uLg0KezczMTMyfXs3MzIwNH0vZG+zuWN6uSBkbyBj
aWViaWUsfC9raWVkeSB3c3RhbmllIHOzb/FjZS4NCns3MzIzMH17NzMzNTl9L1ogY3phc2VtLHwv
cG9tb79lc3ogaW0gY3p5bmnmIGN1ZGEuDQp7NzUzMjN9ezc1NDMzfS9KYWsgem5hbGWf5iBrb2dv
nCx8L2t0byBjYbNlIL95Y2llIHNp6iB1a3J5d2GzPw0Kezc1NDMzfXs3NTUwOH0vVHJ6ZWJhIHN6
dWth5nwvd5xy82QgbWllanNraWNoIGxlZ2VuZC4NCns3NTUxN317NzU1OTZ9L1eccvNkIHpuYWpv
bXljaCB6bmFqb21lZ28sfC9rdPNyenkgamFrb2J5IGdvIHdpZHppZWxpLg0Kezc1NjEzfXs3NTY4
M30vRGxhIG5pZWt083J5Y2ggYnmzIGFuaW+zZW0gc3Ry879lbS4NCns3NTY4M317NzU3Nzl9L0Rs
YSBpbm55Y2ggamVkeW5pZSBkdWNoZW0uDQp7NzU4MjR9ezc1OTQ5fS9JbSBkYWxlaiB3IGN6YXNp
ZSx8L3R5bSBiYXJkemllaiB3c3p5c3RrbyB6YWN66rNvIHNp6iB6YXrqYmlh5i4NCns3NTk0OX17
NzYwMzd9LSBabmEgcGFuIG1vv2UgUGV0ZSdhIFJvc3NhP3wtIFByYWN1amUgdyBJSG9wLg0Kezc2
MDQyfXs3NjA5NX1Q82pkemllIHBhbmkgdyB0YW10eW0ga2llcnVua3UuLi4NCns3NjEwOX17NzYx
NTd9UGV0ZSBSb3NzPw0Kezc2MTg0fXs3NjMxM31DaGNpYbNhYnltIHBvcm96bWF3aWHmIG8gYXV0
b2J1c2llLHxrdPNyeSB3cGFksyBkbyByemVraS4NCns3NjQ1NX17NzY1MDN9UnVzdHkhDQp7NzY1
MTB9ezc2NTQzfVBhbmkgS2VudD8NCns3NjU1NX17NzY2MjV9SmVzdGVtIExvaXMgTGFuZXx6ICJU
aGUgRGFpbHkgUGxhbmV0Ii4NCns3NjYzN317NzY2ODV9U3Bva/NqIQ0Kezc2NjkwfXs3Njc3Nn1D
aGNpYbNhYnltIHBvcm96bWF3aWHmIG8gcGFuaSBzeW51Lg0Kezc2ODI5fXs3NjkxM31KT05BVEhB
TiBLRU5UfFVLT0NIQU5ZIE2lryBJIE9KQ0lFQw0Kezc3MjAzfXs3NzMwNn1XaWVkemlhs2FtLCC/
ZSB3IGtv8WN1fG1uaWUgem5hamR6aWVzei4NCns3NzQzM317Nzc0OTB9U2u5ZCBqZXN0ZZw/DQp7
Nzc0OTB9ezc3NTQ4fUNoY+ogb3Bvd2llZHppZeYgnHdpYXR1IHR3b2q5IGhpc3RvcmnqLg0Kezc3
NTQ4fXs3NzY4Mn0tIEEgamWcbGkgamEgdGVnbyBuaWUgY2hj6j98LSBUbyBuaWV1bmlrbmlvbmUu
DQp7Nzc2ODV9ezc3NzU5fUt0b5wgenJvYmkgemRq6mNpZSx8ZG93aWUgc2nqLCBnZHppZSBtaWVz
emthc3ouDQp7Nzc3NTl9ezc3Nzk1fVd0ZWR5IHpub3d1IHpuaWtu6i4NCns3Nzc5N317Nzc4NzJ9
VWRhs29ieSBjaSBzaeogdG8sfGdkeWJ5nCBwcnplc3RhsyBwb21hZ2HmIGx1ZHppb20sDQp7Nzc4
NzR9ezc3OTYwfWFsZSBjenVq6ix8v2UgdG8gbmllIHdjaG9kemkgdyByYWNodWLqLg0Kezc4MDMw
fXs3ODA3NX1N82ogb2pjaWVjIHdpZXJ6ebMsDQp7NzgwNzV9ezc4MTU1fb9lIGplnGxpIGx1ZHpp
ZSBkb3dpZWR6uSBzaeosfGtpbSBqZXN0ZW0uLi4NCns3ODE4MX17NzgyNDZ9d3lyemVrbrkgc2nq
IG1uaWUsIHplIHN0cmFjaHUuDQp7NzgzMDF9ezc4MzUxfS9NYW0ganW/IGRvnOYgdWtyeXdhbmlh
IHNp6i4NCns3ODM1MX17Nzg0MDJ9Q2hj6iByb2Jp5iBjb5wgcG+/eXRlY3puZWdvLg0Kezc4NDAy
fXs3ODQ3MX1QcmFjYSBuYSBmYXJtaWV8bmllIGplc3QgcG+/eXRlY3puYT8NCns3ODQ3M317Nzg1
MDJ9VGVnbyBuaWUgcG93aWVkemlhs2VtLg0Kezc4NTAyfXs3ODU3Mn1OYXN6YSByb2R6aW5hIHBy
YWN1amUgbmEgcm9saXxvZCBwaepjaXUgcG9rb2xl8S4NCns3ODU3NH17Nzg2MzR9V2FzemEsIGFs
ZSBuaWUgbW9qYS4NCns3ODYzNH17Nzg3MzJ9TmF3ZXQgbmllIGplc3RlnCBtb2ltIG9qY2VtLnxU
eSB0eWxrbyBtbmllIHpuYWxherNlnC4NCns3ODczMn17Nzg3NjR9Q2xhcmshDQp7Nzg4MTZ9ezc4
ODc0fU5pYyBzaeogbmllIHN0YbNvLg0Kezc4OTAwfXs3ODk2NX1DbGFyayBtYSByYWNq6i4NCns3
ODk3MH17NzkwMzJ9TmllIGplc3RlnG15IHR3b2ltaSByb2R6aWNhbWkuDQp7NzkwNDJ9ezc5MTM1
fUFsZSBvZCBzYW1lZ28gcG9jerl0a3V8ZG9rs2FkYWxpnG15IHdzemVsa2ljaCBzdGFyYfEuDQp7
NzkxMzV9ezc5MjYwfU1vv2UgdG8ganW/IG5pZSB3eXN0YXJjenkuDQp7NzkzNDl9ezc5NDIzfS0g
UG9zs3VjaGFqLCB0YXRvLi4ufC0gQ3pla2FqLg0Kezc5OTEyfXs3OTk3N31OYSBlc3Rha2Fk6i4N
Cns3OTk5Nn17ODAwNDF9SWSfY2llIG5hIGVzdGFrYWTqIQ0KezgwMDc3fXs4MDEwOX1LcnlqY2ll
IHNp6iENCns4MDEyNX17ODAxNzF9SWSfY2llIHphIG5pbSENCns4MDI3Nn17ODAzMDh9VXRrbuqz
YSENCns4MDM1MX17ODAzOTJ9WmEgbW65IQ0KezgwNDA2fXs4MDQ4MH1IYW5rIHpvc3RhsyB3IHdv
emllIQ0KezgwNTE0fXs4MDU2NH0tIFDzamTqIHBvIG5pZWdvLnwtIE5pZS4NCns4MDU4MX17ODA2
Mzh9WmFiaWVyeiBtYW3qIG5hIGVzdGFrYWTqLg0KezgxMzMxfXs4MTM4N30tIEpvbmF0aGFuIXwt
IE5pYyBtdSBuaWUgamVzdC4NCns4MTg2OH17ODE5MDd9LSBKb25hdGhhbiF8LSBab3N0YfEsIG1h
bW8uDQp7ODI1MjV9ezgyNTY2fS9UYXRvIQ0KezgyNjQ1fXs4MjczNn0vUG96d29sabNlbSB6Z2lu
ueYgb2pjdSx8L2JvIG11IHVmYbNlbS4NCns4MjczOX17ODI4Mzl9QnmzIHByemVrb25hbnksfL9l
IGJ5s28gemEgd2N6ZZxuaWUuDQp7ODI4NTZ9ezgyOTE2fYx3aWF0IG5pZSBiebMgbmEgbW5pZSBn
b3Tzdy4NCns4Mjk1MH17ODMwMTV9QSB0eSBqYWsgdXdhv2Fzej8NCns4MzA5OH17ODMxNTR9TGVw
aWVqIHV3Yb9haiwgTG9pcy4NCns4MzE3OH17ODMyMTF9UGVycnkgY2nqIHphYmlqZS4NCns4MzIx
Nn17ODMyODN9V2llLCC/ZSB0byB0eSBqZXN0ZZx8YW5vbmltb3d5bSCfcvNks2VtIFdvb2RidXJu
YS4NCns4MzI4OH17ODMzMzZ9Um96ZXJ3aWUgY2nqIG5hIHN0cnrqcHkuDQp7ODMzNjB9ezgzMzkz
fVBhdHJ6Y2llIG5hIG5puS4NCns4MzQ0NH17ODM1MDh9TmllIHd5ZGGzZW0gbmEgdG8gemV6d29s
ZW5pYS4NCns4MzUwOH17ODM1NzN9RGGzYZwgdG8gV29vZGJ1cm5vd2ksfL9lYnkgcHWcY2mzIHRv
IHcgSW50ZXJuZWNpZS4NCns4MzU3Nn17ODM2NTV9V3lkYXdjeSC/uWRharksfL9lYnltIGNp6iBw
b3p3YbMuDQp7ODM2NTd9ezgzNzE5fUkgdGFrIHRvIHJ6dWNhbS4NCns4MzcyMn17ODM3ODJ9LSBU
YWsgcG8gcHJvc3R1P3wtIFezYZxuaWUuDQp7ODM4MDh9ezgzODc1fS0gQSB0d29qZSBwcnplY3p1
Y2lhP3wtIE5pZSBzcHJhd2R6abN5IHNp6i4NCns4Mzg3NX17ODM5MDZ9VGEgaGlzdG9yaWEgdG8g
bmlld3lwYbMuDQp7ODM5MDl9ezgzOTkzfUEgbW+/ZSBuaWUgYnmzYSB0YWsgY2lla2F3YSx8amFr
IHNp6iBzcG9kemlld2GzYZwuDQp7ODQwMTR9ezg0MDkxfUR3YSB0eWdvZG5pZSBiZXpws2F0bmVn
byB1cmxvcHUuDQp7ODQwOTF9ezg0MTU4fUplc3pjemUgamVkZW4gdGFraSB3eXNrb2ssfHRvIGNp
6iB6d29sbmnqLg0Kezg0MTU4fXs4NDE4MH1Eb2JyemUuDQp7ODQxODV9ezg0Mjc4fVNrb3JvIG1h
bSB0d29quSB6Z29k6ix8bmllY2ggYupkuSB0cnp5IHR5Z29kbmllLg0Kezg0MzI0fXs4NDM4NH1X
aWVyeuosIL9lIGNvnCB3aWR6aWGzYZwsDQp7ODQzODR9ezg0NDU1fWFsZSBuaWUgdXdpZXJ66ix8
v2UgcHJ6ZWN6dWNpZSBjaeogbXlsabNvLg0Kezg0NDU4fXs4NDU2OH1aIGpha2llZ29rb2x3aWVr
IHBvd29kdXxwb3J6dWNhc3ogdOogc3ByYXfqLi4uDQp7ODQ1NzF9ezg0NjUwfS0gdXdhv2FtLCC/
ZSBwb3N06nB1amVzeiBzs3Vzem5pZS58LSBEbGFjemVnbz8NCns4NDY4Nn17ODQ3ODR9V3lvYnJh
v2FzeiBzb2JpZSByZWFrY2rqIGx1ZHppLi4uDQp7ODQ3ODl9ezg0OTA5fWdkeWJ5IGRvd2llZHpp
ZWxpIHNp6nxvIGlzdG5pZW5pdSBrb2dvnCB0YWtpZWdvPw0Kezg1MzUwfXs4NTM4OH1CaWVyeiBn
byENCns4NTUzNH17ODU1ODB9UG9wYXRyemNpZSB0eWxrbyENCns4NTk4MH17ODYwMzF9QnmzYSB0
dSBkemllbm5pa2Fya2EuDQp7ODYwNDN9ezg2MTEyfVNwb2tvam5pZSwgdG8gcHJ6eWphY2nzs2th
Lg0Kezg2MTc1fXs4NjIzMn0tIE1hbW8ufC0gQ28/DQp7ODYyNjh9ezg2MzI2fS0gWm5hbGF6s2Vt
IGljaC58LSBLb2dvPw0Kezg2MzUyfXs4NjM5NX1Nb2ljaCByb2R6aWPzdy4NCns4NjQxNH17ODY0
NTV9TfNqIGx1ZC4NCns4NjQ2N317ODY1NDl9V2llbSwgc2u5ZCBwb2Nob2R66i4NCns4NjYzN317
ODY2ODB9VG8gd3NwYW5pYWxlLg0Kezg2NzI2fXs4Njc3NH1CYXJkem8gc2nqIGNpZXN66i4NCns4
Njk5NX17ODcwNjl9LSBPIGNvIGNob2R6aT98LSBPIG5pYy4NCns4NzExNH17ODcyMDN9R2R5IGJ5
s2WcIG1hbHV0a2ksfGuzYWSzYW0gc2nqIHByenkga2+zeXNjZS4NCns4NzIwM317ODcyNTN9V3Oz
dWNoaXdhs2FtIHNp6iB3IHR382ogb2RkZWNoLg0Kezg3MjczfXs4NzMyOH1CebNvIGNpIGNp6r9r
by4NCns4NzM0Mn17ODc0MzF9TepjenmzZZwgc2nqLHxhIGphIHNp6iB6YW1hcnR3aWGzYW0uDQp7
ODc0MzF9ezg3NTEwfUJhs2GcIHNp6iwgv2Uga3RvnCBwb3puYSBwcmF3ZOouDQp7ODc1MTB9ezg3
NjMwfU5pZS58UHJhd2RhIG8gdG9iaWUgamVzdCBjdWRvd25hLg0Kezg3NjM3fXs4NzcxNH1XaWVk
emllbGmcbXkgdG8sfGdkeSB0eWxrbyBjaeogdWpyemVsaZxteS4NCns4Nzc3MX17ODc5MDN9V2ll
ZHppZWxpnG15LCC/ZSBraWVkeZx8Y2GzeSCcd2lhdCB0byB6cm96dW1pZS4NCns4NzkzMH17ODc5
Nzh9UG8gcHJvc3R1hQ0Kezg3OTgwfXs4ODA1NH1ib2rqIHNp6iwgv2UgbWkgY2llYmllIHphYmlv
crkuDQp7ODgwOTB9ezg4MTQ4fU5pZ2R6aWUgc2nqIG5pZSB3eWJpZXJhbSwgbWFtby4NCns4ODE5
MX17ODgyMzl9T2JpZWN1auouDQp7ODgzNjh9ezg4NTIyfS0gUGFuaWUgZ2VuZXJhbGUufC0gVG8g
a29tZXRhPyBBc3Rlcm9pZGE/DQp7ODg1NDN9ezg4NjU0fUtvbWV0eSBuaWUgZG9rb251arkga29y
ZWt0eSBrdXJzdS4NCns4ODcwOX17ODg4MjF9Q2hjaWGzZW0sIL9lYnkgcGFuIHRvIHpvYmFjenmz
LHx6YW5pbSBrdG+cIHd5d2+zYSBvZ/Nsbm+cd2lhdG93uSBwYW5pa+ouDQp7ODg4NDN9ezg4OTQx
fVN0YXRlayBqZXN0IG5hIG9yYmljaWUgb2tvs29rc2nqv3ljb3dlai4NCns4ODk1Nn17ODkwMDF9
TmllIHdpYWRvbW8gcG8gY28uDQp7ODkwMTN9ezg5MDkyfVBy82Jvd2FsaZxjaWUga29udGFrdHU/
DQp7ODkwOTV9ezg5MTYyfUphayBuYSByYXppZSBuaWUgb2Rwb3dpYWRharkuDQp7ODkyMTB9ezg5
MjY1fVRvIHR5bGtvIHByenlwdXN6Y3plbmlhLA0Kezg5Mjc3fXs4OTM5N31hbGUga3Rva29sd2ll
ayB0eW0gcHJ6eWxlY2lhsyx8Y2hjZSB3eXdyemXmIG5hIG5hcyB3cmG/ZW5pZS4NCns4OTUzMX17
ODk2MDN9S3RvnCB3aWUsfGdkemllIG1hbXkgemFwYXNvd2UgdG9uZXJ5Pw0Kezg5NjAzfXs4OTY2
M30tIE8gY28gY2hvZHppP3wtIEplc3QgbmEgd3N6eXN0a2ljaCBrYW5hs2FjaC4NCns4OTY2M317
ODk3MTF9TXVzaXN6IHRvIHpvYmFjennmLg0KezkwMzUxfXs5MDM5MH1DbGFyayENCns5MDM5MH17
OTA0NDB9SWTqLg0KezkxNTE0fXs5MTU2Mn0vTmllIGplc3RlnGNpZSBzYW1pLg0KezkxNjA1fXs5
MTY2M30vTmllLi4uIGplc3QuLi4gc2EuLi4NCns5MTcwM317OTE3Njh9L05pZSBqZXN0ZZxjaWUg
c2FtaS4NCns5MjU4M317OTI2NzJ9LSBUbyBpZHppZSBwcnpleiBSU1MufC8tIE5pZSBqZXN0ZZxj
aWUgc2FtaS4NCns5MjY4NH17OTI3NDZ9TmEgdGVsZWZvbmllIHRlvyB0byBtYW0uDQp7OTI3ODB9
ezkyODQ3fS9KZXN0ZW0gZ2VuZXJhsyBab2QuDQp7OTI4ODF9ezkyOTc0fS9Qcnp5Ynl3YW0geiBv
ZGxlZ7NlaiBwbGFuZXR5Lg0KezkyOTgxfXs5MzEwMX0vUHJ6ZWJ5s2VtIGRvIHdhc3wvY2GzeSBv
Y2VhbiBnd2lhemQuDQp7OTMxMjV9ezkzMjMzfS9PZCBqYWtpZWdvnCBjemFzdSB3YXN6IJx3aWF0
fC9nb5xjaSBuYXN6ZWdvIG9ieXdhdGVsYS4NCns5MzIzNX17OTMzNjV9L6+5ZGFtLCBieZxjaWUg
d3lkYWxpIGdvfC9wb2QgbW9quSBwaWVjeuouDQp7OTMzNzd9ezkzNTI4fS9aIG5pZXpuYW55Y2gg
cHJ6eWN6eW58L3Bvc3Rhbm93abMgdWtyeeYgcHJ6ZWQgd2FtaSBzd2UgaXN0bmllbmllLg0Kezkz
NTUwfXs5MzYzMX0vVWN6eW5pIHdzenlzdGtvLHwvYnkgd3RvcGnmIHNp6iB3IG90b2N6ZW5pZS4N
Cns5MzYzMX17OTM2OTZ9L1Vwb2RvYm5pIHNp6iBkbyB3YXMuDQp7OTM2OTZ9ezkzNzU2fS9KZWRu
YWsgbmllIGplc3QgamVkbnltIHogd2FzLg0KezkzNzg5fXs5NDAyOX0vSmWcbGkgem5hc3ogbWll
anNjZSBqZWdvIHBvYnl0dSx8L2xvcyBaaWVtaSBqZXN0IHcgdHdvaWNoIHLqa2FjaC4NCns5NDA1
MX17OTQxMTV9L1OzdWNoYWogbW5pZSwgS2FsLUVsLg0Kezk0MTY4fXs5NDI2OX0vUG9kZGFqIHNp
6iB3IGNpuWd1IDI0IGdvZHppbi4uLg0Kezk0MzE3fXs5NDQyNX0vYWxibyBwYXRyeix8L2phayB0
ZW4gnHdpYXQgYupkemllIGNpZXJwaWGzLg0Kezk0NzU4fXs5NDgyMH0vTmljIG8gbmltIG5pZSB3
aWVteS4NCns5NDgyMH17OTQ5NTB9L0plnGxpIG1hIG5hIHd6Z2zqZHppZSBuYXN6ZSBkb2Jybyx8
L3Bvd2luaWVuIG9kZGHmIHNp6iB3IGljaCBy6mNlLg0Kezk0OTUwfXs5NTAzMX0vSmWcbGkgZ28g
bmEgdG8gbmllIHN0YeYsfC9tb79lIHBvd2lubmmcbXkgZ28gd3lkYeYuDQp7OTUwMzF9ezk1MTQy
fS9Qb3dpbm5pnG15IHNweXRh5iBMb2lzIExhbmUsfC9rdPNyYSB6bmEgamVnbyB0b79zYW1vnOYu
DQp7OTUxNDZ9ezk1MjExfS9Ud2llcmR6aSBwYW4sfC+/ZSBMb2lzIExhbmUgd2llLi4uDQp7OTUy
MjN9ezk1MzAwfU9nbLlkYXN6IHRvP3xQdXN6Y3pharkgb2Qgc2FtZWdvIHJhbmEuDQp7OTUzMDB9
ezk1MzY1fVBpZXJ3c3p5IHJheiBzaeogeiBuaW0gemdhZHphbS58V2lkemlhs2GcIGdvPw0Kezk1
MzcyfXs5NTQyOX1OaWUgaSBuaWdkeSBieW0gY2kgbyB0eW18bmllIHBvd2llZHppYbNhLg0Kezk1
NDI5fXs5NTUzMH1UbyB6YWdyb79lbmllIGRsYSBjYbNlZ28gnHdpYXRhLg0Kezk1NTQwfXs5NTYy
OH0vTmllIGN6YXMgemFzs2FuaWHmIHNp6nwvZHppZW5uaWthcnNruSBldHlruS4NCns5NTYzNX17
OTU3NTN9L1RvIHBvd2G/bmEgc3ByYXdhLnwvRkJJIHJ6dWNhIHR1IG9za2Fyv2VuaWFtaSBvIHpk
cmFk6i4NCns5NTc1M317OTU3OTl9TXVzeuoga2/xY3p55i4NCns5NjE4MH17OTYyNjR9RkJJLCBy
6mNlIGRvIGfzcnkhfFJ6deYgYmFnYb8hDQp7OTY0MjJ9ezk2NTA2fS9PIG5hc3p5Y2ggZ2+cY2lh
Y2h8L3dpZW15IG5hIHJhemllIGJhcmR6byBuaWV3aWVsZS4NCns5NjUwOH17OTY2MjF9L1dlZLN1
ZyBvcGluaWkgcnq5ZG93eWNoIGVrc3BlcnTzd3wvbmllIHN0YW5vd2m5IHphZ3Jvv2VuaWEsDQp7
OTY2MjF9ezk2Njc4fS9taW1vIHqzb3dyb2dpZWdvIHRvbnV8L2ljaCBwcnpla2F6dS4NCns5NjY3
OH17OTY3OTF9L1dzenlzY3kgamVkbmFrIHphZGFquSBzb2JpZSBweXRhbmllOnwvS2ltIGplc3Qg
S2FsLUVsPw0Kezk2NzkxfXs5Njg5NH0vQ3p5IG5hcHJhd2TqIGlzdG5pZWplP3wvSmFrIG3zZ7Mg
dGFrIGSzdWdvIHBvem9zdGF3YeYgdyB1a3J5Y2l1Pw0Kezk3MDA3fXs5NzA1NX1ObyBjaG9knywg
S2VudC4NCns5NzE5Nn17OTcyMzd9V2FsY3ohDQp7OTcyNDR9ezk3MjkyfVdzdGF3YWouDQp7OTcz
NTB9ezk3MzkzfVRvIHdzenlzdGtvPw0Kezk3NDA3fXs5NzQ1OH1UeWxrbyBuYSB0eWxlIGNp6iBz
dGHmPw0Kezk3NDc0fXs5NzUyMH1ObyBkYWxlaiwgS2VudC4NCns5NzU0Mn17OTc1NzV9V2FsY3oh
DQp7OTgyNjh9ezk4MzU5fS0gWnJvYmlsaSBjaSBrcnp5d2TqP3wtIFByemVjaWW/IHdpZXN6LCC/
ZSBuaWUgbW9nuS4NCns5ODM2OX17OTg0MzF9UHl0YbNlbSwgY3p5IHdzenlzdGtvIGdyYT8NCns5
ODQ2MH17OTg1NzB9LSBUYWsgYmFyZHpvIGNoY2lhs2VtIG11IHByenl3YWxp5i58LSBXaWVtLg0K
ezk4NTgyfXs5ODY3MX1UZb8gY2hjaWGzZW0sfL9lYnmcIHRvIHpyb2JpsywgYWxlIGNvIHBvdGVt
Pw0Kezk4NjczfXs5ODczMX1Qb2N6dbNieZwgc2nqIGxlcGllaj8NCns5ODc3Mn17OTg4ODd9TXVz
aXN6IHpkZWN5ZG93YeYsfG5hIGpha2llZ28gY3qzb3dpZWthIHd5cm+cbmllc3ouDQp7OTg4ODd9
ezk4OTYxfUJvIHRlbiBjerNvd2llaywgZG9icnkgY3p5IHqzeS4uLg0Kezk5MDA0fXs5OTA3MX1v
ZG1pZW5pIJx3aWF0Lg0Kezk5MTg0fXs5OTIzMn0vQ28gY2nqIGdu6mJpPw0Kezk5MzU5fXs5OTQ1
NX0tIE5pZSB3aWVtLCBvZCBjemVnbyB6YWN6ueYufC0gT2QgY3plZ28gY2hjZXN6Lg0Kezk5NDkx
fXs5OTU2NX1UZW4gc3RhdGVrLCBrdPNyeSBzaeogcG9qYXdpsy4uLg0Kezk5NTcwfXs5OTYzMn1U
byBtbmllIHN6dWtharkuDQp7OTk3MjN9ezk5ODM4fS0gV2llc3osIGN6ZWdvIG9kIGNpZWJpZSBj
aGO5P3wtIE5pZS4NCns5OTg0MX17OTk5NzN9TmF3ZXQgamWcbGkgc2nqIHBvZGRhbSx8Z2VuZXJh
syBab2QgbW+/ZSBuaWUgZG90cnp5bWHmIHOzb3dhLg0Kezk5OTg1fXsxMDAxMDB9SmWcbGkgb2Rk
YWq5YyBzaeogdyBpY2ggcupjZXxtb2fqIG9jYWxp5iBaaWVtaeouLi4NCnsxMDAxMTR9ezEwMDE2
Mn1jenkgbmllIHBvd2luaWVuZW0gdGVnbyB1Y3p5bmnmPw0KezEwMDE4MX17MTAwMjg3fS0gQ28g
cG9kcG93aWFkYSBjaSBpbnR1aWNqYT98LSBab2Rvd2kgbmllIG1vv25hIHVmYeYuDQp7MTAwMzQy
fXsxMDA0NzZ9UHJvYmxlbSB3IHR5bS4uLny/ZSBuaWUgcG90cmFmaeogdGW/IHphdWZh5iBsdWR6
aW9tLg0KezEwMDY1OH17MTAwNzQ3fUN6YXNhbWkgdHJ6ZWJhIHV3aWVyennmLi4uDQp7MTAwNzcx
fXsxMDA4Mjl9YSB6YXVmYW5pZSBwcnp5amR6aWUgeiBjemFzZW0uDQp7MTAxNDAyfXsxMDE0NjR9
VWRhs28gY2kgc2nqfHByenljablnbrnmIG5hc3q5IHV3YWfqLg0KezEwMTQ2OX17MTAxNTUwfS0g
Q3plZ28gY2hjZXN6P3wtIENoY+ogcm96bWF3aWHmIHogTG9pcyBMYW5lLg0KezEwMTU1OH17MTAx
NjA4fVNruWQgcG9teXOzLCC/ZSBqZXN0IHogbmFtaT8NCnsxMDE2MDh9ezEwMTY5NH1OaWUgYmF3
bXkgc2nqIHcgY2l1Y2l1YmFia+oufFBvZGRhbSBzaeouDQp7MTAxNjk3fXsxMDE3ODF9UG9kIHdh
cnVua2llbSx8v2UgemFnd2FyYW50dWplY2llIGplaiB3b2xub5zmLg0KezEwMTk5Mn17MTAyMDYx
fS9EbGFjemVnbyBvZGRhamVzeiBzaeogdyBy6mNlIFpvZGE/DQp7MTAyMDcxfXsxMDIxNTl9T2Rk
YWrqIHNp6iB3IHLqY2UgbHVkemtvnGNpLHx0byBy879uaWNhLg0KezEwMjE4Nn17MTAyMjM2fVBv
endvbGmzZZwgc2nqIHNrdeYuDQp7MTAyMjQ4fXsxMDIzMzd9SW5hY3plaiBuaWUgd3lnbLlkYbNv
YnkgdG8gd2lhcnlnb2RuaWUuDQp7MTAyMzQ0fXsxMDI0NzF9U2tvcm8gcG9jenVsaSBzaeogYmV6
cGllY3puaWVqc2ksfHRvIHR5bSBsZXBpZWouDQp7MTAyNTY5fXsxMDI2NjB9Q28gb3puYWN6YSB0
YSBsaXRlcmEgIlMiPw0KezEwMjY4N317MTAyNzQ0fVRvIG5pZSBsaXRlcmEuDQp7MTAyNzU2fXsx
MDI4MjZ9VyBtb2ltIJx3aWVjaWUgdG8gc3ltYm9sIG5hZHppZWkuDQp7MTAyODM4fXsxMDI5MzR9
QSB3IG5hc3p5bSB0byBsaXRlcmEgIlMiLg0KezEwMjk3Mn17MTAzMDQ2fUEgbW+/ZS4uLg0KezEw
MzExNn17MTAzMTgxfS0gU3VwZXIuLi58Ly0gV2l0YW0uDQp7MTAzMTk1fXsxMDMyNzd9LSBKZXN0
ZW0gZG9rdG9yLi4ufC8tIEVtaWwgSGFtaWx0b24sIHdpZW0uDQp7MTAzMjg0fXsxMDMzMzl9V2lk
euogaWRlbnR5ZmlrYXRvcnx3IHBh8XNraWVqIGtpZXN6ZW5pLg0KezEwMzM0MX17MTAzNDEzfUkg
bmFwb2N66nRlIG9wYWtvd2FuaWUgZHJvcHPzdy4NCnsxMDM0MjB9ezEwMzUzM30vV2lkeuogdGW/
IHphIHdhbWl8L29kZHppYbMgv2+zbmllcnp5IHogcGFyYWxpemF0b3JlbS4NCnsxMDM1MzN9ezEw
MzU2N31OaWUgYupkemllIHBvdHJ6ZWJueS4NCnsxMDM1Njd9ezEwMzY1NX1NdXNpbXkgc2nqIGph
a2+cIHphYmV6cGllY3p55i4NCnsxMDM2NTV9ezEwMzcxOH1Nb79lIHBhbiBieeYgbm9zaWNpZWxl
bXxqYWtpZWdvnCB3aXJ1c2EuDQp7MTAzNzIzfXsxMDM3OTd9r3lq6iB0dSBvZCAzMyBsYXR8aSBq
ZXN6Y3plIG5pa29nbyBuaWUgemFyYXpps2VtLg0KezEwMzgwNH17MTAzODk4fUFsYm8gbyB0eW0g
bmllIHdpZXN6LnxNYW15IHBvZHN0YXd5IGRvIG9iYXcuDQp7MTAzODk4fXsxMDQwMTd9V3lqYXdp
s2WcIHN3b2q5IHRvv3NhbW+c5iBwYW5uaWUgTGFuZS58L0RsYWN6ZWdvIG5pZSB3eWphd2lzeiBq
ZWogbmFtPw0KezEwNDA0NH17MTA0MTExfUthcnR5IG5hIHN087MsIGdlbmVyYWxlLg0KezEwNDEy
OH17MTA0MTkzfUJvaWNpZSBzaeogbW5pZSx8Ym8gbmllIG1vv2VjaWUgbW5pZSBrb250cm9sb3dh
5i4NCnsxMDQxOTN9ezEwNDI2NH1OaWdkeSBuaWUgYupkemllY2llIG1vZ2xpLg0KezEwNDI3Nn17
MTA0MzI5fUFsZSB0byBuaWUgb3puYWN6YSx8v2UgamVzdGVtIHdhc3p5bSB3cm9naWVtLg0KezEw
NDMzMn17MTA0NDAzfUEga3RvIG5pbSBqZXN0PyBab2Q/DQp7MTA0NDE4fXsxMDQ1MTZ9LSBUZWdv
IHezYZxuaWUgc2nqIG9iYXdpYW0ufC0gVGFrIGN6eSBpbmFjemVqLA0KezEwNDUxOX17MTA0NjAw
fXd5ZGGzZW0gcm96a2F6LHxieSBjaeogZG8gbmllZ28gZG9wcm93YWR6b25vLg0KezEwNDYwN317
MTA0NjcwfU5pZWNoIHBhbiByb2JpIHN3b2plLCBnZW5lcmFsZS4NCnsxMDQ3NzV9ezEwNDg1N30t
IER6aeprdWrqLnwtIFphIGNvPw0KezEwNDg3MX17MTA0OTI5fVphIHRvLCC/ZSB3ZSBtbmllIHV3
aWVyenmzYZwuDQp7MTA0OTgxfXsxMDUwNDF9SSB0YWsgbmllIG1hIHRvIHpuYWN6ZW5pYS4NCnsx
MDUwNTF9ezEwNTA5NH1EbGEgbW5pZSBtYS4NCnsxMDU1ODN9ezEwNTYzM31OYWRsYXR1arkuDQp7
MTA1NjMzfXsxMDU2ODF9UG93aW5uYZwganW/IGmc5i4NCnsxMDU3Mjl9ezEwNTc4MH1PZGVqZJ8s
IExvaXMuDQp7MTA3NDgyfXsxMDc1OTB9S2FsLUVsLCBqZXN0ZW0gcG9kZG9382RjYSBGYW9yYS1V
bC4NCnsxMDc1OTJ9ezEwNzY4OH1XIGltaWVuaXUgZ2VuZXJhs2EgWm9kYXxwcnpla2F6dWrqIGNp
IHBvemRyb3dpZW5pYS4NCnsxMDc4MDN9ezEwNzg3NX0tIFBhbiB0dSBkb3dvZHppP3wtIE93c3pl
bS4NCnsxMDc4Nzh9ezEwNzk4OH1HZW5lcmGzIFpvZCBjaGNlLHxieSB0YSBrb2JpZXRhIG1pIHRv
d2FyenlzenmzYS4NCnsxMDgwMTR9ezEwODEyOX1DaGNpZWxpnGNpZSBvYmNlZ28ufE5pZSBiebNv
IG1vd3kgbyBqZWRueW0geiBuYXMuDQp7MTA4MTMyfXsxMDgyMjV9TWFtIHByemVrYXph5iBnZW5l
cmGzb3dpLHy/ZSBvZG1hd2lhY2llPw0KezEwODIzMH17MTA4MjkyfU5pZSBvYmNob2R6aSBtbmll
LHxjbyBtdSBwcnpla2G/ZXN6Lg0KezEwODM0MH17MTA4Mzk1fVcgcG9yerlka3UuDQp7MTA4NDAz
fXsxMDg0NDF9UPNqZOouDQp7MTA5NDYyfXsxMDk1NjF9QXRtb3NmZXJhIG5hIHN0YXRrdXxuaWUg
amVzdCBwcnp5c3Rvc293YW5hIGRsYSBsdWR6aS4NCnsxMDk1NjN9ezEwOTY0OX1C6mR6aWVzeiBt
dXNpYbNhIHphs2+/eeYgbWFza+ouDQp7MTEwMjUxfXsxMTAyODJ9S2FsLUVsLg0KezExMDMxMX17
MTEwNDEyfU5pZSBtYXN6IHBvaupjaWEsfGphayBks3VnbyBjaeogc3p1a2FsaZxteS4NCnsxMTA0
MTd9ezExMDQ5Nn0tIFpvZCwgamFrIHJvenVtaWVtLnwtIEdlbmVyYbMgWm9kLCBuYXN6IGRvd/Nk
Y2EuDQp7MTEwNDk4fXsxMTA1OTR9VyBwb3J6uWRrdSwgRmFvcmEufE1vv25hIG11IHd5YmFjennm
IGJyYWsgbWFuaWVyLg0KezExMDU5OX17MTEwNjQ5fU5pZSB6bmEgbmFzenljaCB6d3ljemFq83cu
DQp7MTEwNjUyfXsxMTA3Njd9VG8gY2h3aWxhIG5hIJx3aep0b3dhbmllLHxhIG5pZSBuYSBrs/N0
bmllLg0KezExMDg2N317MTEwOTMwfUN6dWrqIHNp6iBkeml3bmllLg0KezExMDk5Mn17MTExMDQw
fVOzYWJvIG1pLg0KezExMTA4OH17MTExMTYyfS0gQ28gbXUgamVzdD98LSBPZHJ6dWNhIG5hc3q5
IGF0bW9zZmVy6i4NCnsxMTExOTN9ezExMTMwMX1aYWFkYXB0b3dhs2WcIHNp6iBkbyB6aWVtc2tp
Y2ggd2FydW5r83csfG5pZSBkbyBuYXN6eWNoLg0KezExMTMwNn17MTExNDA5fS0gUG9t878gbXUu
fC0gTmllIG1vZ+ouIE11c2kgc2FtbyBwcnplapzmLg0KezExMTQ1NX17MTExNTAzfVBvbfO/Y2ll
IG11IQ0KezExMTUyOX17MTExNTc3fVBvbfO/Y2llIQ0KezExMTgzNn17MTExODcyfVdpdGFqLCBL
YWwuDQp7MTExOTIwfXsxMTE5NzN9QSBtb79lIHdvbGlzeiAiQ2xhcmsiPw0KezExMTk4NX17MTEy
MDU0fVRha2llIGltaeogY2kgbmFkYWxpLCBjenm/IG5pZT8NCnsxMTIwODV9ezExMjE5Nn1CebNl
bSBuYSBLcnlwdG9uaWUgZG9382RjuSBhcm1paSx8YSB0d/NqIG9qY2llYyAtIG5hc3p5bSBuYWp3
aeprc3p5bSB1Y3pvbnltLg0KezExMjE5Nn17MTEyMjg0fVpnYWR6YWxpnG15IHNp6iBjbyBkbyB0
ZWdvLHy/ZSBLcnlwdG9uIHVtaWVyYS4NCnsxMTIyODl9ezExMjQyMX1XIHphbWlhbiB6YSBwcvNi
6iBvY2FsZW5pYXxuYXN6ZWogY3l3aWxpemFjamkgaSBwbGFuZXR5LA0KezExMjQzMX17MTEyNTM0
fXdyYXogeiBtb2ltaSBvZmljZXJhbWl8em9zdGFsaZxteSB6ZXOzYW5pIGRvIFN0cmVmeSBXaWRt
by4NCnsxMTI1OTR9ezExMjcxNH0vWmFns2FkYSBuYXN6ZWdvIJx3aWF0YXwvdXdvbG5ps2EgbmFz
Lg0KezExMjg0NX17MTEyODkzfS9Ecnlmb3dhbGmcbXkuDQp7MTEyOTAxfXsxMTMwMjN9L1NrYXph
bmkgbmEgnG1pZXLmIGezb2Rvd7l8L3eccvNkIHN6Y3q5dGvzdyBuYXN6ZWogcGxhbmV0eS4NCnsx
MTMwNDR9ezExMzA5NX0vSmFrIHRyYWZpbGmcY2llIG5hIFppZW1p6j8NCnsxMTMxMDB9ezExMzE5
OH0vV3lrb3J6eXN0YWxpnG15IHByb2pla3RvciBmYW50b21vd3l8L2RvIGJ1ZG93eSBoaXBlcm5h
cOpkdS4NCnsxMTMyMTV9ezExMzMyMH0vVGFruSBzYW25IG1vZHlmaWthY2rqfC9vamNpZWMgemFt
b250b3dhsyB3IHR3b2ltIHN0YXRrdS4NCnsxMTMzNDJ9ezExMzQxNH0vVGFrIG90byBuYXJ66mR6
aWUgbmFzemVqIHpndWJ5Li4uDQp7MTEzNDU3fXsxMTM1MTJ9L3N0YbNvIHNp6iBuYXN6eW0gd3li
YXdpZW5pZW0uDQp7MTEzNjE3fXsxMTM3MjN9L1NwcmF3ZHphbGmcbXkgbmFzemUgZGF3bmUga29s
b25pZXwvdyBwb3N6dWtpd2FuaXUgb3puYWsgv3ljaWEuDQp7MTEzODA0fXsxMTM4Njd9L1puYWxl
n2xpnG15IGplZHluaWUgnG1pZXLmLg0KezExMzg4OH17MTEzOTk0fS9PZGNp6nRlIG9kIEtyeXB0
b25hLHwvcGxhY/N3a2kgZGF3bm8gd3ltYXKzeS4NCnsxMTQwMTh9ezExNDEyM30vVXJhdG93YWxp
nG15LCBjbyBzaeogZGGzbzp8L3picm9qZSwgYnJv8S4NCnsxMTQxMjZ9ezExNDE5M30vTmF3ZXQg
amVkbrkgTWFjaGlu6iCMd2lhdPN3Lg0KezExNDIxMH17MTE0Mjg2fS9QcnpleiAzMyBsYXRhfC9j
enluaWxpnG15IHByenlnb3Rvd2FuaWEsDQp7MTE0MjkxfXsxMTQzNjN9L2G/IHcga2/xY3Ugb2Rl
YnJhbGmcbXl8L3N5Z25hsyBhbGFybW93eSwNCnsxMTQzNjZ9ezExNDQ3M30va3TzcnkgYWt0eXdv
d2GzZZx8L25hIHN0YXJ5bSBzdGF0a3UgendpYWRvd2N6eW0uDQp7MTE0NDkwfXsxMTQ1NjB9VHkg
bmFzIHR1IHNwcm93YWR6abNlnCwgS2FsLg0KezExNDU5M317MTE0Njk2fVcgdHdvamVqIG1vY3kg
bGW/eXxvY2FsZW5pZSBuYXN6ZWogcmFzeS4NCnsxMTQ4MjZ9ezExNDkxMn1OYSBLcnlwdG9uaWUs
IGtvZCBnZW5ldHljem55LHxtYWq5Y3ljaCBzaeogbmFyb2R6aeYgb3NvYm5pa/N3LA0KezExNDkx
NX17MTE0OTg5fXphcGlzYW55IGJ5syB3IFJlamVzdHJ6ZSBPYnl3YXRlbGkuDQp7MTE1MDA2fXsx
MTUxMzN9VHfzaiBvamNpZWMgc2tyYWSzIEtvZGV4fGkgdWtyebMgZ28gdyB0d29qZWoga2Fwc3Vs
ZS4NCnsxMTUxNDV9ezExNTE4OH1QbyBjbz8NCnsxMTUxOTN9ezExNTI3NH1CeSBLcnlwdG9uIG3z
Z7MgenJvZHpp5iBzaep8bmEgbm93by4uLg0KezExNTI4MX17MTE1MzIyfW5hIFppZW1pLg0KezEx
NTc5Mn17MTE1ODQyfUdkemllIGplc3QgS29kZXg/DQp7MTE1ODgxfXsxMTU5NDN9SmWcbGkgS3J5
cHRvbiBzaeogb2Ryb2R6aS4uLg0KezExNTk1NX17MTE2MDAxfWNvIHN0YW5pZSBzaeogeiBaaWVt
abk/DQp7MTE2MDEzfXsxMTYwOTR9RG8gb2RidWRvd3kgcG90cnplYmEgZnVuZGFtZW5083cuDQp7
MTE2MTAxfXsxMTYxODF9TmF3ZXQgdHfzaiBvamNpZWMgdG8gd2llZHppYbMuDQp7MTE2MzIyfXsx
MTYzNzV9TmllLg0KezExNjQxNX17MTE2NTA5fS0gTmllIHByenljenluaeogc2nqIGRvIHRlZ28u
fC0gQSBkbyBjemVnbyBzaeogcHJ6eWN6eW5pc3o/DQp7MTE2NTExfXsxMTY1MzV9TmllIQ0KezEx
NjU3MX17MTE2NTk1fVByemVzdGHxIQ0KezExNjg0OX17MTE2OTU1fVR382ogb2pjaWVjIG9kc3pl
ZLMgeiBob25vcmVtLg0KezExNzAwMH17MTE3MTAxfS0gWmFiabNlnCBnbz98LSBUYWsuDQp7MTE3
MTA0fXsxMTcyMTF9UHJ6ZZxsYWR1amUgbW5pZSB0b3xrYb9kZWdvIGRuaWEuDQp7MTE3MjIxfXsx
MTczNjV9QWxlIHpyb2Jps2J5bSB0byBwb25vd25pZS58TWFtIG9ib3dpuXplayB3b2JlYyBtb2pl
Z28gbHVkdS4NCnsxMTczNjd9ezExNzQ5MH1OaWtvbXUgbmllIHBvendvbOosfGJ5IG1uaWUgb2Qg
dGVnbyBvZHdp82SzLg0KezExNzg1NH17MTE3OTA3fUNvIHNp6iBkemllamUsIG1ham9yemU/DQp7
MTE3OTA5fXsxMTgwMDB9RHdhIG9iaWVrdHl8d3lzdGFydG93YbN5IHogb2ty6nR1IG9iY3ljaC4N
CnsxMTgwMzR9ezExODA2NX1UbyBvbmUuDQp7MTE4MDY3fXsxMTgxNDd9V3lrb3J6eXN0YWpjaWUg
SS1Db20gNC58TXVzeuogd2llZHppZeYgY2+cIHdp6mNlai4NCnsxMTgxNTl9ezExODIxOH1Lb2Qg
bmEgZHppc2lhaiB0byAiVHLzanq5YiIuDQp7MTE4MjIxfXsxMTgzMTl9LSBOYWRsYXR1arkgZHdh
IHN0YXRraSBvYmN5Y2gufC0gTWFteSBkYW5lIHogSS1Db20gNC4NCnsxMTgzMjR9ezExODQ0MX0t
IFBy6mRrb5zmP3wtIDM4MCB36nqz83cuIE5pZSBvZHBvd2lhZGFquSBuYSB3ZXp3YW5pYS4NCnsx
MTg0NTF9ezExODUwNH1TemtvZGEgd3lzabNrdS4NCnsxMTg1MjN9ezExODY0M31TabNhLCBrdPNy
uSBjemVycGllc3ogemUgU7Nv8WNhLHxuYSBuYXN6eW0gc3RhdGt1IG5pZSBkemlhs2EuDQp7MTE4
NjQ1fXsxMTg3ODd9VyB0eW0gnHJvZG93aXNrdXxqZXN0ZZwgdHlsa28gend5a7N5bSBjerNvd2ll
a2llbS4NCnsxMjAxNzN9ezEyMDI2OH0tIFNruWQgc2nqIHd6abmzZZw/fC0gS2x1Y3osIHBhbm5v
IExhbmUuDQp7MTIwMjczfXsxMjAzNTd9WmGzYWRvd2GzYZwgbW5pZSBkbyBwYW1p6mNpIGtvbXB1
dGVyYS4NCnsxMjAzNjJ9ezEyMDQ0M30tIEtpbSBqZXN0ZZw/fC0gT2pjZW0gS2FsYS4NCnsxMjA0
Nzl9ezEyMDU4MH0tIE1vv2VzeiBuYW0gcG9t82M/fC0gWmJ1ZG93YbNlbSB0ZW4gc3RhdGVrLg0K
ezEyMDU5NH17MTIwNjg2fU1vZ+ogcHJ6eXN0b3Nvd2HmfGplZ28gYXRtb3NmZXLqIGRsYSBsdWR6
aS4NCnsxMjA3MDB9ezEyMDc5Nn1Nb79lbXkgaWNoIHBvd3N0cnp5bWHmLnxPZGVzs2HmIHogcG93
cm90ZW0gZG8gU3RyZWZ5IFdpZG1vLg0KezEyMDgxMH17MTIwODY1fS0gSmFrP3wtIFBva2G/6iBj
aS4NCnsxMjA4NzB9ezEyMDk3OH1BIHR5IHBva2G/ZXN6IEthbG93aS58UG9tb79lc3ogbWk/DQp7
MTIxMjk3fXsxMjEzNTd9WmGzb2dhIHN0YXRrdSBqdb8gd2llLnxNdXNpbXkgc2nqIHBvc3BpZXN6
eeYuDQp7MTIxMzU5fXsxMjE0MDd9V3ljablnbmlqIGtsdWN6Lg0KezEyMTU4MH17MTIxNjQ1fS0g
VHkgdG8genJvYmmzZZw/fC0gVGFrLiBQb2RuaWWcIGJyb/EuDQp7MTIxODgwfXsxMjE5MjN9Q28g
c2nqIGR6aWVqZT8NCnsxMjI0MjF9ezEyMjQ2OX1QbyB0d29qZWogcHJhd2VqLiBPZ25pYSENCnsx
MjI0OTZ9ezEyMjU0NH1aYSB0b2K5IQ0KezEyMjgzMX17MTIyODkxfVdzablknyBkbyBrYXBzdbN5
IHJhdHVua293ZWouDQp7MTIyOTAzfXsxMjI5NTF9QmV6cGllY3puZWogcG9kcvO/eS4NCnsxMjI5
NTR9ezEyMzAyOH1aYXBld25lIHdp6mNlaiBzaeogbmllIHpvYmFjenlteS4NCnsxMjMwNDJ9ezEy
MzExOX1QYW1p6nRhaiwga2x1Y3pvd3kgZG8gaWNoIHBvd3N0cnp5bWFuaWF8amVzdCBuYXDqZCBm
YW50b21vd3kuDQp7MTIzMTQ2fXsxMjMxOTN9R7Nvd2EgdyBsZXdvLg0KezEyMzgyNn17MTIzOTAx
fVpvZCBt83dpsyBwcmF3ZOogbyBLb2RleGllPw0KezEyMzkwMX17MTIzOTQ5fVJvemJpaiB0ZW4g
cGFuZWwuDQp7MTI0MDMwfXsxMjQxMDl9Q2hjaWVsaZxteSwgYnmcIHdwaWVyd3xuYXVjenmzIHNp
6iBieeYgY3qzb3dpZWtpZW0uDQp7MTI0MTE5fXsxMjQxODR9QnmcLCB3ZSB3s2GcY2l3eW0gY3ph
c2llLA0KezEyNDE4OH17MTI0MjY1fW3zZ7MgYnnmIHBvbW9zdGVtfG1p6mR6eSBkd2llbWEgcmFz
YW1pLg0KezEyNDMyNX17MTI0MzczfVNw82pyei4NCnsxMjQ0MjN9ezEyNDQ2Mn1Mb2lzLg0KezEy
NDQ2NH17MTI0NTE5fU1vv2VzeiBquSBvY2FsaeYuDQp7MTI0NTY1fXsxMjQ2MjJ9TW+/ZXN6IG9j
YWxp5iBpY2ggd3N6eXN0a2ljaC4NCnsxMjY0OTd9ezEyNjU2Mn1UdSBi6mR6aWVzeiBiZXpwaWVj
em5hLg0KezEyNjU5MX17MTI2NjgyfS0gV3N6eXN0a28gdyBwb3J6uWRrdT98LSBUYWsuDQp7MTI2
NzM1fXsxMjY4ODN9TmllIGNoY2lhs2FtIGltIG5pYyBwb3dpZWR6aWXmLHxhbGUgamFrb5wgd25p
a27qbGkgZG8gbW9qZWogZ7Nvd3kuLi4NCnsxMjY4ODN9ezEyNjk2N31Kdb8gZG9icnplLCBMb2lz
LnxaZSBtbrkgenJvYmlsaSB0byBzYW1vLg0KezEyNzI3Mn17MTI3MzIwfUNsYXJrIQ0KezEyNzUy
MX17MTI3NjE1fUdkemllIHN0YXRlaywgdyBrdPNyeW0gcHJ6eWJ5sz8NCnsxMjc2NTN9ezEyNzcx
M31JZJ8gZG8gZGlhYrNhLg0KezEyNzk1MH17MTI3OTk4fVRhbS4NCnsxMjg1MjF9ezEyODU4Nn1L
b2RleHUgdGFtIG5pZSBtYS4NCnsxMjg3MzR9ezEyODc4N30tIEdkemllIGdvIHVrcnmzP3wtIE5p
ZSB3aWVtLg0KezEyODc4N317MTI4ODQ5fUdkemllIGplc3QgS29kZXg/IQ0KezEyOTE4N317MTI5
MjYyfUphayCcbWllc3ogc3RyYXN6eeYgbW9quSBtYXRr6j8hDQp7MTMwMjQyfXsxMzAyODF9Q2+c
IHR5IG1pIHpyb2Jpsz8NCnsxMzAyODF9ezEzMDM3N31Sb2R6aWNlIG5hdWN6eWxpIG1uaWUsfGph
ayB3eW9zdHJ6eeYgem15c7N5Lg0KezEzMDQyMH17MTMwNTE2fUphayBza3VwaeYgc2nqIG5hIHR5
bSx8Y28gY2hj6iB6b2JhY3p55i4NCnsxMzA1MTh9ezEzMDYwMn1CZXogaGWzbXUgb2RiaWVyYXN6
IHdzenlzdGtpZSBib2SfY2UuDQp7MTMwNjE2fXsxMzA3MDB9Qm9sZXNuZSwgcHJhd2RhPw0KezEz
MTc4Mn17MTMxODI1fS9PZGVqZJ9jaWUgb2Qgb2tpZW4hDQp7MTMxODg3fXsxMzE5NjJ9U2Nob3dh
amNpZSBzaeoufFR1IG5pZSBqZXN0IGJlenBpZWN6bmllLg0KezEzMjA0M317MTMyMTE3fS9UdSBT
dHJhv25paywgdGVyZW4gY3p5c3R5Lg0KezEzMjEyMn17MTMyMjQyfU1pYbNlbSBqdb8gZG8gY3p5
bmllbmlhfHogdHltaSBpc3RvdGFtaS4NCnsxMzIyNDd9ezEzMjM0MH0vU7kgYmFyZHpvIG5pZWJl
enBpZWN6bmUufC9NYW15IHByYXdvIHW/eeYgYnJvbmkuDQp7MTMyNDAzfXsxMzI0NTh9L1Byenlq
ubNlbS58L1pibGm/YW15IHNp6iBkbyBjZWx1Lg0KezEzMjU4Mn17MTMyNjY2fS8tIEdvdG93aSBk
byBvc3RyemGzdS58Ly0gMS0xLCBwcnp5armzZW0uDQp7MTMyNzMxfXsxMzI3OTh9L1R1IEdyb20g
MS0xLnwvTmFtaWVyenmzZW0gdHJ6eSBjZWxlLg0KezEzMzE4OX17MTMzMjcxfVBvdHdpZXJkemFt
IHRyYWZpZW5pZS58TmF0eWNobWlhc3QgcG93dPNyeiBvc3RyemGzLg0KezEzMzI3NX17MTMzMzkz
fS9Qcnp5armzZW0ufC9Sb2JpbXkgZHJ1Z2llIHBvZGVqnGNpZS4NCnsxMzM1NTh9ezEzMzY1N30v
R3JvbSAxLTEsIGthdGFwdWx0dWpjaWUgc2nqIQ0KezEzMzkxNn17MTMzOTgwfS9OYWRsYXR1amUg
bmllemlkZW50eWZpa293YW55IG9iaWVrdCENCnsxMzQ0NDF9ezEzNDQ5M31KZXN0ZZwgc7NhYnks
IHN5bnUgRWxhLg0KezEzNDQ5M317MTM0NTQ5fUJyYWsgY2kgcGV3bm+cY2kgc2llYmllLg0KezEz
NDY1NH17MTM0NzY0fUZha3QsIL9lIG1hY2llIHBvY3p1Y2llIG1vcmFsbm+cY2ksfGt083JlZ28g
bmFtIGJyYWssDQp7MTM0NzY3fXsxMzQ4NDh9ZGFqZSBuYW0gcHJ6ZXdhZ+ogdyBld29sdWNqaS4N
CnsxMzQ5MjN9ezEzNDk5NH1BIGplnGxpIGhpc3RvcmlhIGN6ZWdva29sd2llayBkb3dvZHppLi4u
DQp7MTM1MjE1fXsxMzUzMDR9dG8gd7NhnG5pZSB0ZWdvLHy/ZSBld29sdWNqYSB6YXdzemUgd3ln
cnl3YS4NCnsxMzU4MTB9ezEzNTg5NH0vUG9kY2hvZHppbXkgZG8gbLlkb3dhbmlhLg0KezEzNjg5
Nn17MTM2OTY4fURvIHdzenlzdGtpY2gsfG1hY2llIG5hd2m5emHmIHdhbGvqLg0KezEzNjk2OH17
MTM3MDM3fUEgY28geiBnb5xjaWVtIHcgbmllYmllc2tpbT8NCnsxMzcwNDB9ezEzNzEwMn0vU3Ry
emVsYeYgZG8gd3N6eXN0a2ljaCENCnsxMzczNjZ9ezEzNzQxNH0vS29udGFrdCENCnsxMzc2Mzd9
ezEzNzY4MH1KZXN0ZZwgY2GzeT8NCnsxMzc3OTV9ezEzNzg0M31TcGFkYW15IQ0KezEzNzg2Mn17
MTM3OTQxfS9Qcnp5Z290b3dh5iBzaeogbmEgdWRlcnplbmllIQ0KezEzODA4NX17MTM4MTkwfS9U
dSBVcGFks3kgQW5pb7MufC9TdHJhv25payB6ZXN0cnplbG9ueS4NCnsxMzg3MTZ9ezEzODgwOX0v
R3JvbSAxLTIgZG8gU3RyYb9uaWthLCBvZGJp83I/DQp7MTM4ODA5fXsxMzg5MzF9RGFqY2llIHpt
YXNvd2FueSBvc3RyemGzfG5hIG1varkgcG96eWNq6i4NCnsxMzg5MzF9ezEzODk5Nn1acm96dW1p
YbNlbSwgcG93b2R6ZW5pYS4NCnsxMzk5Njl9ezE0MDA3N31BIG5hZ3JvZLkgamVnbyAtIGhvbm9y
b3dhIJxtaWVy5i4NCnsxNDAzNjV9ezE0MDQxOH1OaWUgd3lncmFzei4NCnsxNDA0Mjd9ezE0MDUy
MX1aYSBrYb9kZWdvIG9jYWxvbmVnbyBjerNvd2lla2EsfHphYmlqZW15IG1pbGlvbiBpbm55Y2gu
DQp7MTQxNzY4fXsxNDE4MzV9L1RlcmVuIHphYmV6cGllY3pvbnk/DQp7MTQxODQwfXsxNDE5MzZ9
L0Rydb95bmEgQWxmYSwgc7N5c3p5Y2llIG1uaWU/DQp7MTQzMTMwfXsxNDMxOTd9VGVuIGN6s293
aWVrfG5pZSBqZXN0IG5hc3p5bSB3cm9naWVtLg0KezE0MzIzN317MTQzMjg1fUR6aeprdWrqLCBw
dbNrb3duaWt1Lg0KezE0MzcxMH17MTQzNzM5fS9NYW1vPw0KezE0Mzc1M317MTQzODA2fU5pYyBt
aSBuaWUgamVzdCENCnsxNDQwODZ9ezE0NDEzNH2jYWRueSBrb3N0aXVtLg0KezE0NDE1OH17MTQ0
MjA2fVByenlrcm8gbWkuDQp7MTQ0MjExfXsxNDQyNTl9VG8gdHlsa28gcHJ6ZWRtaW90eS4NCnsx
NDQzMDR9ezE0NDM2Mn1aYXdzemUgbW+/bmEgamUgemFzdLlwaeYuDQp7MTQ0NDE3fXsxNDQ0Njd9
QWxlIHdhcyBuaWUgbW+/bmEuDQp7MTQ0NDc5fXsxNDQ1MTF9TWFtby4uLg0KezE0NDUxMX17MTQ0
NjA0fVpvZCBwb3dpZWR6aWGzLCC/ZSB0ZW4gS29kZXh8bW+/ZSBzcHJvd2FkemnmIG3zaiBsdWQu
DQp7MTQ0NjA5fXsxNDQ2NTd9VG8gY2h5YmEgZG9icnplPw0KezE0NDc1MH17MTQ0ODI1fU9uaSBj
aHliYSBuaWUgemFtaWVyemFquXxkemllbGnmIHNp6iB0eW0gnHdpYXRlbS4NCnsxNDQ4MjV9ezE0
NDg3MH1DbGFyayENCnsxNDQ5Mzd9ezE0NDk5NX1XaWVtLCBqYWsgaWNoIHBvd3N0cnp5bWHmLg0K
ezE0NTAzM317MTQ1MTYwfS0gQ28gdGFtIHNp6iBzdGGzbz98LSBPa2F6YbMgY2h3aWxvd7kgc7Nh
Ym+c5i4NCnsxNDUxNjN9ezE0NTI5N31UbyBiZXogem5hY3plbmlhLHxwb25pZXdhvyB6bG9rYWxp
em93YbNlbSBLb2RleC4NCnsxNDUzMjZ9ezE0NTM5MH1OaWdkeSBuaWUgYnmzbyBnbyB3IGthcHN1
bGUuDQp7MTQ1MzkwfXsxNDU0ODl9L0pvci1FbCBnbyB6YWJyYbMufC9ETkEgbWlsaWFyZPN3IGx1
ZHppLg0KezE0NTQ4OX17MTQ1NTc1fS9TY2FsabMgZ28geiBrb23zcmthbWkgd7Nhc25lZ28gc3lu
YS4NCnsxNDU1Nzd9ezE0NTcwNX0vV3N6eXNjeSBzcGFka29iaWVyY3kgS3J5cHRvbmF8L795arkg
dyBjaWVsZSBqZWRuZWdvIHVjaG9kn2N5Lg0KezE0NTgxMH17MTQ1OTQ3fUN6eSBLYWwtRWwgbXVz
aSBieeYgv3l3eSx8Ynkgb2R6eXNrYeYgS29kZXggeiBqZWdvIGtvbfNyZWs/DQp7MTQ1OTY4fXsx
NDYwMDJ9TmllLg0KezE0NjEzOX17MTQ2MTk0fVVydWNob21p5iBNYWNoaW7qIIx3aWF083cuDQp7
MTQ2OTY2fXsxNDcwMTh9LSBDbyBzaeogZHppZWplP3wtIFN0YXRlayBzaeogcm96ZHppZWxpsy4N
CnsxNDcwMTh9ezE0NzEwMn1QaWVyd3N6eSBjerNvbiBwb3J1c3phIHNp6iBuYSB3c2No82QsfGRy
dWdpIGplc3QgbmFkIHBvs3Vkbmlvd7kgcPOza3VsuS4NCnsxNDcxMDV9ezE0NzIwOH0tIEphayBz
enlia28gbGVjaT98LSBNYWNoIDI0IGkgcHJ6eXNwaWVzemEuDQp7MTQ3MjA4fXsxNDczMDl9UHJh
d2RvcG9kb2JuaWUgdWRlcnp5fHcgcG+zdWRuaW93eW0gcmVqb25pZSBPY2VhbnUgSW5keWpza2ll
Z28uDQp7MTQ3NzMxfXsxNDc4MzR9LSBSZXN6dGEgc3RhdGt1IGplc3QgY29yYXogYmxpv2VqLnwt
IERhaiB0byBuYSBla3Jhbi4NCnsxNDc4NDh9ezE0Nzg4Nn1Cb79lIQ0KezE0ODg2MH17MTQ4OTQ0
fVVydWNob21p5iBzaWxuaWsgZmFudG9tb3d5IQ0KezE0OTQ1MH17MTQ5NTIyfUplc3RlnG15IHBv
ZLO5Y3plbmkgZG8gTWFjaGlueS4NCnsxNDk1MzZ9ezE0OTU4Nn1aYWN6eW5hbXkuDQp7MTUwMzY4
fXsxNTA0MzB9Q28gdG8gamVzdD8NCnsxNTA0MzB9ezE1MDU2Mn1XeWdsuWRhIG5hIGpha7mcIGJy
b/EgZ3Jhd2l0YWN5am65LnxEemlhs2EgdyBwYXJ6ZSB6ZSBzdGF0a2llbS4NCnsxNTA1Njl9ezE1
MDYzNH1XIGpha2mcIHNwb3PzYnx6d2nqa3N6YWq5IG1hc+ogWmllbWksDQp7MTUwNjM0fXsxNTA3
MDR9c2tyYXBsYWq5YyBhdG1vc2ZlcuouDQp7MTUwNzQyfXsxNTA3OTB9Qm+/ZSENCnsxNTA4MTZ9
ezE1MDg4OH0tIFRvIHRlcnJhZm9ybWFjamEufC0gQ28gdG8gdGFraWVnbz8NCnsxNTA5MDB9ezE1
MDk5Nn1Jbr95bmllcmlhIHBsYW5ldGFybmEsfG1vZHlmaWt1arljYSBhdG1vc2ZlcuogaSB0b3Bv
Z3JhZmnqIFppZW1pLg0KezE1MDk5Nn17MTUxMDU2fVphbWllbmlharkgWmllbWnqIHcgS3J5cHRv
bmEuDQp7MTUxMDU4fXsxNTExNDJ9LSBBIGNvIHogbmFtaT98LSBaIHR5Y2ggb2Rjenl083cgd3lu
aWthLA0KezE1MTE0N317MTUxMTkwfb9lIG5pZSBi6mR6aWUgv2FkbnljaCAibmFzIi4NCnsxNTEx
OTN9ezE1MTMyMn1QYW5pZSBnZW5lcmFsZS58UHWza293bmlrIEhhcmR5IGplZHppZSB0dSB6IFN1
cGVybWFuZW0uDQp7MTUxMzMyfXsxNTEzNzJ9U3VwZXJtYW5lbT8NCnsxNTEzNzV9ezE1MTQ1Nn1U
eW0gb2JjeW0ufFRhayBnbyBuYXp5d2FquS4NCnsxNTE1OTN9ezE1MTY3OX0tIE1hbXkgcGxhbiwg
Z2VuZXJhbGUufC0gQ3p5IHRvIGplc3QgdG8sIGNvIG15nGzqPw0KezE1MTY5MX17MTUxNzQ0fVRv
IHN0YXRlaywga3TzcnltIHByenlsZWNpYbMuDQp7MTUxNzczfXsxNTE4Mzh9U3RhdGVrIG5hcOpk
emFueSBqZXN0fHNpbG5pa2llbSBmYW50b21vd3ltLg0KezE1MTg0MH17MTUxOTI5fVphZ2luYSBw
cnplc3RyemXxLnxTdGF0ZWsgWm9kYSB1v3l3YSB0ZWogc2FtZWogdGVjaG5vbG9naWkuDQp7MTUx
OTI5fXsxNTE5ODl9SmWcbGkgemRlcnp5bXkgemUgc29iuXxkd2EgbmFw6mR5Li4uDQp7MTUxOTg5
fXsxNTIwNTN9LSBNb79lIHBvd3N0YeYgb3NvYmxpd2+c5i58LSBDb5wgamFrIGN6YXJuYSBkeml1
cmE/DQp7MTUyMDUzfXsxNTIxNjZ9VGFrLiBKZZxsaSBvdHdvcnp5IHNp6iBwcnplapxjaWUsfHBv
d2lubmkgem9zdGHmIGRvIG5pZWdvIHdjablnbmnqY2kuDQp7MTUyMTY4fXsxNTIyMjZ9TWFteSBp
Y2ggdHltIHpib21iYXJkb3dh5j8NCnsxNTIyMjZ9ezE1MjMxMH1KZZxsaSBzdGF0ZWsgd2G/eSBt
bmllanxuab8gOCB0b24sDQp7MTUyMzEwfXsxNTIzOTl9bW+/ZW15IHpyenVjaeYgZ28geiBDLTE3
LnxUbyB3eWtvbmFsbmUuDQp7MTUyMzk5fXsxNTI0NjN9SmWcbGkgbmllIHBvd3N0cnp5bWFtfHRl
aiBtYXN6eW55IG5hZCBvY2VhbmVtLA0KezE1MjQ2Nn17MTUyNTQwfXNps2EgZ3Jhd2l0YWNqaSBi
6mR6aWUgcm9zbrnmLg0KezE1MjY3NH17MTUyNzYxfUplnGxpIHRhIG1hc3p5bmF8dXBvZGFibmlh
IFppZW1p6iBkbyBLcnlwdG9uYSwNCnsxNTI3NjF9ezE1MjgyMX1i6mR6aWVzeiBzs2Fic3p5IHcg
amVqIHBvYmxpv3U/DQp7MTUyODI1fXsxNTI5NjB9TW+/bGl3ZSwgYWxlIHRvIG1uaWUgbmllIHBv
d3N0cnp5bWEuDQp7MTUyOTYyfXsxNTMwMzR9TGVwaWVqIHNp6iBvZHN18S4NCnsxNTMwNjN9ezE1
MzExM31Ucm9jaOogZGFsZWouDQp7MTUzODczfXsxNTM5NTB9LSBGYW9yYSwgcHJ6ZWptaWogZG93
b2R6ZW5pZS58LSBUYWsgamVzdC4NCnsxNTM5NTB9ezE1NDA5MX1NdXN66iB6YWJlenBpZWN6eeYg
a29tb3LqIG5hcm9kemlufGkgerNvv3nmIGhvs2Qgc3RhcmVtdSBwcnp5amFjaWVsb3dpLg0KezE1
NDI3Nn17MTU0Mzc3fS9TdHJhv25payB3IGRyb2R6ZSBkbyBNZXRyb3BvbGlzLnxNYW15ILNhZHVu
ZWsuDQp7MTU0NTA2fXsxNTQ2Mjh9Ri0zNSBsZWO5IG5hIG1pZWpzY2Ugc3BvdGthbmlhLg0KezE1
NTY5NX17MTU1ODAzfS9LbHVjeiBwcnp5aup0eS58L1ezuWN6YW0ga29tb3LqIG5hcm9kemluLg0K
ezE1NTgwNn17MTU1ODkwfS9QcnplcndpaiB0bywgWm9kLHwvcPNraSBqZXN6Y3plIGN6YXMuDQp7
MTU1OTIzfXsxNTYwMTJ9TmF3ZXQgcG8gnG1pZXJjaXxuaWUgcHJ6ZXN0YWplc3ogbW5pZSBwb3Vj
emHmLg0KezE1NjAxNH17MTU2MDYwfU5pZSBwb3p3b2zqIHW/eeYgS29kZXh1fHcgdGFraW0gY2Vs
dS4NCnsxNTYwNjB9ezE1NjEwNX1OaWUgbW+/ZXN6IG1uaWUgcG93c3RyenltYeYuDQp7MTU2MTA1
fXsxNTYxODR9S2x1Y3osIGt083J5IHdwcm93YWR6abNlbSx8em5vc2kgdHdvamUgdXByYXduaWVu
aWEuDQp7MTU2MTg0fXsxNTYyNTR9VGVyYXogamEga29udHJvbHVq6iB0ZW4gc3RhdGVrLg0KezE1
NzAxNn17MTU3MDg4fS9Cs3lza2F3aWNhIDEgZG8gZG9382R6dHdhLnwvUHJvc3rqIG8gemV6d29s
ZW5pZSBuYSBhdGFrLg0KezE1NzA4OH17MTU3MjA2fVVkemllbGFtIHplendvbGVuaWEufFpkYXdh
aiByYXBvcnQgbyB6bmlzemN6ZW5pYWNoLg0KezE1NzUzMH17MTU3NTczfS9Bd2lvbmlrYSB3YXJp
dWplLg0KezE1NzU3NX17MTU3NjU0fS9HcmF3aXRhY2phIJxjablnYSByYWtpZXR5IHcgZPOzLnwv
TXVzaW15IHBvZGxlY2ll5iBibGm/ZWouDQp7MTU3Nzc0fXsxNTc4ODl9V3N6eXNjeSBvcHVzemN6
YW15IGJ1ZHluZWshDQp7MTU4NDI2fXsxNTg0NzR9L1N0cmFjabNlbSBza3J6eWSzb3dlZ28hDQp7
MTU4NTE3fXsxNTg1NjN9L01heWRheSwgbWF5ZGF5LCBtYXlkYXkhDQp7MTU4ODE5fXsxNTg4ODJ9
VOpkeSENCnsxNTg4ODR9ezE1ODk4N31TenliY2llaiENCnsxNTkxMTR9ezE1OTE2N31KZW5ueSEN
CnsxNTkyMjd9ezE1OTI1M31Cb79lIQ0KezE1OTI2NX17MTU5Mjk5fVBlcnJ5IQ0KezE1OTM5N317
MTU5NDMzfVTqZHkhDQp7MTU5NTkxfXsxNTk2Mzd9TmFzemUgcmFzeSBtb2e5IGtvZWd6eXN0b3dh
5i4NCnsxNTk2Mzd9ezE1OTczOH2vZWJ5nG15IGNpZXJwaWVsaSx8cHLzYnVquWMgc2nqIHByenlz
dG9zb3dh5iBqYWsgdHfzaiBzeW4/DQp7MTU5NzQwfXsxNTk3ODN9VG8gbHVkb2LzanN0d28uDQp7
MTU5NzgzfXsxNTk4NzJ9T3dzemVtLiBBIHJvenRyerlzYW18amVnbyB6YXNhZG5vnOYgeiBkdWNo
ZW0uDQp7MTU5OTAxfXsxNTk5ODl9T2JhaiBqZXN0ZZxteSBkdWNoYW1pLCBab2QufE5pZSByb3p1
bWllc3ogdGVnbz8NCnsxNTk5OTJ9ezE2MDAzMH1Ud29qZWdvIEtyeXB0b25hIGp1vyBuaWUgbWEu
DQp7MTYwMDMwfXsxNjAxMTR9U3RhdGVrLCB3aWVzeiwgamFrIHBvemJ55iBzaep8dGVqIG5hcGFz
dGxpd2VqIGludGVsaWdlbmNqaT8NCnsxNjAxMTR9ezE2MDE2N30vLSBUYWsgamVzdC58LSBQcnp5
Z290dWogc2nqIGRvIGplaiB3ebO5Y3plbmlhLg0KezE2MDE2N317MTYwMjcwfS0gTWFtIGRvnOYg
dGVqIGRlYmF0eS58LSBVY2lzemVuaWUgbW5pZSBuaWN6ZWdvIG5pZSB6bWllbmkuDQp7MTYwMzA0
fXsxNjAzNjF9TfNqIHN5bi4uLg0KezE2MDM2M317MTYwNDI4fWplc3QgbGVwc3p5IG9kIGNpZWJp
ZS4NCnsxNjA0NTB9ezE2MDQ5OH1Eb2tv8WN6eSB0bywgY28gemFjeupsaZxteS4NCnsxNjA1Mjd9
ezE2MDU5NH1Nb2fqIGNpIHRvIG9iaWVjYeYuDQp7MTYwNjcwfXsxNjA4MTl9UG9zaWFkYXN6IHdz
cG9tbmllbmlhfGkgnHdpYWRvbW+c5iBKb3ItRWxhLg0KezE2MDgxOX17MTYwODgxfUN6eSBtb79l
c3ogZG+cd2lhZGN6eeYgamVnbyBi82x1Pw0KezE2MDkwOH17MTYxMDE4fVd5cnfqIEtvZGV4IHpl
IHp3s29rIHR3b2plZ28gc3luYS4NCnsxNjEwMjB9ezE2MTE1N31PZGJ1ZHVq6iBLcnlwdG9uIG5h
IGplZ28gcHJvY2hhY2guDQp7MTYyNTI0fXsxNjI1ODh9SmVubnksIGdkemllIGplc3RlnD8hDQp7
MTYyNTk4fXsxNjI2ODJ9LSBUdXRhaiF8LSBUcnp5bWFqIHNp6i4NCnsxNjI2OTR9ezE2Mjc1Nn1V
dGtu6rNhbSwgbmllIG1vZ+ogc2nqIHV3b2xuaeYuDQp7MTYyNzU2fXsxNjI4MTR9V3ljablnbmll
bXkgY2nqIHN0uWQufE5pZSBydXN6YWogc2nqLg0KezE2MjgzM317MTYyOTAzfS0gTmllIHpvc3Rh
d2lhaiBtbmllLCBwcm9zeuohfC0gTmllIHpvc3Rhd2lteSBjaeouDQp7MTYyOTI3fXsxNjMwMTB9
LSBMb21iYXJkLCBwb23zvyBtaSF8LSBOaWVjaCB0byBzemxhZy4NCnsxNjMwNzN9ezE2MzExOH0t
IE11c2lteSB0byBwcnplc3VuueYufC0gVHJ6eW1hai4NCnsxNjMxMTh9ezE2MzE3Nn1Qb2R3Yb8s
IGEgamEgYupk6iBwY2hhsy4NCnsxNjMyOTN9ezE2MzM0NH1QY2hhaiENCnsxNjMzNDR9ezE2MzM4
OX1aYmxpv2Egc2nqISBQY2hhaiENCnsxNjM0MTh9ezE2MzQ5Mn1TdHJhv25payBkbyBkb3fzZHp0
d2EsfGN6eSBtb79lc3ogZG9rb25h5iB6cnp1dHU/DQp7MTYzNDkyfXsxNjM1Mzh9T2RtYXdpYW0u
DQp7MTY1NDE1fXsxNjU0NjN9VWRhs28gbXUgc2nqLg0KezE2NTUwNH17MTY1NTkzfVN0cmG/bmlr
IGRvIGRvd/NkenR3YSx8amVzdGWcbXkgZ290b3dpIGRvIHpyenV0dS4NCnsxNjU1OTN9ezE2NTY3
OX1Qb3dvZHplbmlhLiBVemJyb2nmILNhZHVuZWsufE1hY2llIHplendvbGVuaWUgbmEgenJ6dXQu
DQp7MTY1Njg5fXsxNjU3MzR9VG8gb3N0YXRuaWUgcG9kZWqcY2llLg0KezE2NTc1OH17MTY1ODI4
fVRlcmF6IHdzenlzdGtvIHphbGW/eXxvZCBjaWViaWUgaSBIYW1pbHRvbmEuDQp7MTY2NzUzfXsx
NjY3ODR9VG8gY2h5YmEgamFraZwgv2FydC4NCnsxNjY3ODR9ezE2Njg4MH0tIKNhZHVuZWsgdXpi
cm9qb255PyBNb79lbXkgenJ6dWNh5j98LSBOaWUgbW+/ZW15IQ0KezE2Njg4N317MTY2OTQwfUNv
nCBqZXN0IG5pZSB0YWsufFRvIG5pZSBwb3dpbm5vIHRhayByb2Jp5i4NCnsxNjY5NDB9ezE2NzAy
OX0tIEEgamFrIHBvd2lubm8/fC0gUG93aW5ubyB3ZWqc5iBkbyBrb/FjYS4NCnsxNjcwMjl9ezE2
NzExNX0tIE5pZWNoIHNp6iBwcnp5anJ66i58LSBQcnplam1paiBzdGVyeS4NCnsxNjcxMjB9ezE2
NzE2OH1Qcnplam11auogc3RlcnkuDQp7MTY3MzE5fXsxNjczODF9RGxhY3plZ28gbmllIGplc3Rl
nG15fGdvdG93aSBkbyB6cnp1dHU/DQp7MTY3Mzg0fXsxNjc0MzJ9TWFteSB0dSBkcm9ibnkgcHJv
YmxlbS4NCnsxNjc3OTF9ezE2Nzg0OX1OYW1pZXJ6eeYgb2JpZWt0Lg0KezE2NzkyMX17MTY3OTU5
fS9DZWwgbmFtaWVyem9ueS4NCnsxNjgxOTR9ezE2ODIyM31TdPNqIQ0KezE2ODIyM317MTY4MzM4
fUplnGxpIHpuaXN6Y3p5c3ogdGVuIHN0YXRlayx8em5pc3pjenlzeiBy83duaWW/IEtyeXB0b25h
IQ0KezE2ODQxNX17MTY4NDcyfUtyeXB0b24gbWlhsyBzd29quSBzemFuc+ohDQp7MTY5NzUyfXsx
Njk4NTN9UGFubm8gTGFuZSF8VGFtIGplc3QgbmllYmV6cGllY3puaWUhDQp7MTcwNTU4fXsxNzA1
OTl9UnVzemFqIQ0KezE3MTA5OH17MTcxMTkxfUEgbmFncm9kuSBqZWdvIC0gaG9ub3Jvd2EgnG1p
ZXLmLg0KezE3MjY2Nn17MTcyNzIzfVpuaWtu6mxpPw0KezE3MjczNX17MTcyNzg1fUNoeWJhIHRh
ay4NCnsxNzI4MDl9ezE3Mjg0OH1PbiBuYXMgb2NhbGmzLg0KezE3MzQ0NX17MTczNTUzfU3zd2m5
LCC/ZSBwbyBwaWVyd3N6eW0gcG9jYbN1bmt1fGplc3QganW/IHogZ/Nya2kuDQp7MTczNjEwfXsx
NzM3MDl9VHlsa28gd3RlZHksfGplnGxpIGNhs3VqZXN6IGN6s293aWVrYS4NCnsxNzQzODd9ezE3
NDQzMH1TcPNqcnouDQp7MTc0NDgxfXsxNzQ1Nzl9TmEgdHltIHB5bGUgbW9nbGmcbXkgemJ1ZG93
YeZ8bm93ZWdvIEtyeXB0b25hLg0KezE3NDU4MX17MTc0NjY1fUplZG5hayBwcnplZLNvv3mzZZwg
bHVkeml8cG9uYWQgbmFzLg0KezE3NDY4NH17MTc0Nzk1fUNlbGVtIG1vamVqIGVnenlzdGVuY2pp
fGplc3Qgb2Nocm9uYSBLcnlwdG9uYS4NCnsxNzQ4MzN9ezE3NDkzNH1UYWtpIGNlbCBvdHJ6eW1h
s2VtIHByenkgbmFyb2R6aW5hY2guDQp7MTc0OTU1fXsxNzUwNjZ9S2G/ZGUgZHppYbNhbmllLHxv
Ym9q6nRuaWUgamFrIGJydXRhbG5lLA0KezE3NTA2OH17MTc1MTk3fWphayBva3J1dG5lLHxwb2Rl
am11auogdyBpbWnqIHd5v3N6ZWdvIGRvYnJhLi4uDQp7MTc1MjAwfXsxNzUyNTN9bW9qZWdvIGx1
ZHUuDQp7MTc1MzUxfXsxNzU0NTJ9QSB0ZXJheiBuaWUgbWFtIHN3b2plZ28gbHVkdS4NCnsxNzU1
MzF9ezE3NTYwN31Nb2phIGR1c3phLi4uDQp7MTc1NjEwfXsxNzU3Mzd9T2RlYnJhs2WcIG1pIGq5
IQ0KezE3NTkxNH17MTc2MDE1fVNwcmF3aeosIL9lIGx1ZHppZSx8a3TzcnljaCBwcnp5Z2Fybrmz
ZZwsIGLqZLkgY2llcnBpZeYuDQp7MTc2MDE3fXsxNzYxNDJ9LSBPZGJpb3LqIGNpIGljaCwgamVk
bmVnbyBwbyBkcnVnaW0ufC0gSmVzdGWcIHBvdHdvcmVtLCBab2QuDQp7MTc2MTk3fXsxNzYyNjR9
SSB6YW1pZXJ6YW0gY2nqIHBvd3N0cnp5bWHmLg0KezE3ODY2Mn17MTc4NzI3fVRvIHNp6iBtb79l
IHNrb/FjennmfHR5bGtvIHcgamVkZW4gc3Bvc/NiIQ0KezE3ODcyN317MTc4ODAxfYxtaWVyY2m5
IGplZG5lZ28geiBuYXMhDQp7MTc5NTM1fXsxNzk2MjF9VXJvZHpps2VtIHNp6iB3b2pvd25pa2ll
bSwgS2FsLg0KezE3OTYyM317MTc5NzIyfUNhs2Ugv3ljaWUgdHJlbm93YbNlbSBtb2plIHpteXOz
eS4NCnsxNzk3MjR9ezE3OTgxMH1BIGdkemllIHR5IHRyZW5vd2GzZZw/fE5hIGZhcm1pZT8hDQp7
MTgyOTAzfXsxODMwMDZ9U2tvcm8gdGFrIGJhcmR6byBpY2gga29jaGFzei4uLg0KezE4MzAxOH17
MTgzMDkzfW1vv2VzeiB6YWN6ueYgaWNoIG9ws2FraXdh5i4NCnsxODMxNzl9ezE4MzIzMn1OaWUg
cvNiIHRlZ28hDQp7MTgzMjg3fXsxODMzMzJ9UHJ6ZXN0YfEhDQp7MTgzNDU1fXsxODM1MDh9Tmll
IQ0KezE4MzUzNH17MTgzNTY1fU5pZ2R5Lg0KezE4NTgzMX17MTg1OTE3fS0gT2RiabNvIGNpPyF8
LSBKZWRlbiB6IHR3b2ljaCBkcm9u83cgendpYWRvd2N6eWNoLg0KezE4NTkxOX17MTg2MDI1fS0g
VG8gamVzdCB3YXJ0ZSAxMiBtaWxpb27zdyF8LSBCebNvLg0KezE4NjAyN317MTg2MTAyfVdpZW0s
IL9lIHBy82J1amVzeiB3eZxsZWR6aeYsfGdkemllIG9kd2llc3phbSBwZWxlcnlu6i4NCnsxODYx
MDJ9ezE4NjE4MX0tIE5pYyB6IHRlZ28ufC0gWmF0ZW0gemFkYW0gY2kgb2N6eXdpc3RlIHB5dGFu
aWU6DQp7MTg2MTg4fXsxODYyNjd9U2u5ZCBwZXdub5zmLCC/ZSBraWVkeZx8bmllIHp3cvNjaXN6
IHNp6iBwcnplY2l3a28gQW1lcnljZT8NCnsxODYyNzB9ezE4NjM4N31XeWNob3dhs2VtIHNp6iB3
IEthbnNhcy58SnW/IGJhcmR6aWVqIEFtZXJ5a2FuaW5lbSBieeYgbmllIG1vv25hLg0KezE4NjM4
OX17MTg2NTE0fUplc3RlbSB0dSwgYnkgcG9tYWdh5ix8YWxlIG5hIG1vaWNoIHdhcnVua2FjaC4N
CnsxODY1MTZ9ezE4NjYxN30tIE11c2kgcGFuIHByemVrb25h5iBXYXN6eW5ndG9uLnwtIE5hd2V0
IGdkeWJ5bSBjaGNpYbMgc3By82Jvd2HmLi4uDQp7MTg2NjI3fXsxODY3NTR9LSBza7lkIHdpZXN6
LCC/ZSBtbmllIHd5c7N1Y2hhark/fC0gTmllIHdpZW0uDQp7MTg2NzU2fXsxODY4MDl9Q2h5YmEg
Yupk6iBtdXNpYbMgcGFudSB6YXVmYeYuDQp7MTg3MDMwfXsxODcxMjV9LSBaIGN6ZWdvnCBzaeog
cGFuaSBjaWVzenksIGthcGl0YW5pZT98LSBaIG5pY3plZ28uDQp7MTg3MTg4fXsxODcyNDh9UG8g
cHJvc3R1IG5pZXqzZSB6IG5pZWdvIGNpYWNoby4NCnsxODcyNzd9ezE4NzM0NH0tIERvIHdvenUs
IGthcGl0YW5pZS58LSBUYWsgamVzdC4NCnsxODc1NzF9ezE4NzY2MH1aYXdzemUgd2llcnp5syx8
v2UgamVzdGWcIHN0d29yem9ueSBkbyB3eb9zenljaCBjZWzzdy4NCnsxODc2NjV9ezE4Nzc3OH1B
IGtpZWR5IG5hZGVqZHppZSBkemll8Sx8dWSfd2lnbmllc3ogc3dvamUgYnJ6ZW1p6i4NCnsxODc4
MDJ9ezE4NzkyNn0tIENoY2lhs2J5bSwgv2VieSBt82ezIHRvIHpvYmFjennmLnwtIFdpZHppYbMg
dG8sIHV3aWVyeiBtaS4NCnsxODkwNTZ9ezE4OTEzNX0vQ28gYupkemllc3ogcm9iabMsfC9raWVk
eSBuaWUgYupkemllc3ogemJhd2lhsyCcd2lhdGE/DQp7MTg5MTM1fXsxODkyMDl9LSBNeZxsYbNl
nCBqdb8gbyB0eW0/fC0gTXmcbGGzZW0uDQp7MTg5MjU5fXsxODkzOTR9UG9zenVrYW0gcHJhY3ks
fHcga3TzcmVqIGLqZOogYmxpc2tvIHd5ZGFyemXxLg0KezE4OTQ4Mn17MTg5NTk1fS9XIGt083Jl
aiBuaWtvZ28gbmllIHpkeml3aSx8L79lIHd5c3Rhd2lhbSBzaeogbmEgbmllYmV6cGllY3pl8XN0
d28sDQp7MTg5NjA5fXsxODk2NjJ9L2FsYm8gv2UgemFkYWrqIHB5dGFuaWEuDQp7MTg5OTcxfXsx
OTAwNTh9S2llZHkgdyBrb/FjdXxkYXN6IHNp6iB6YXByb3Np5iwgTG9pcz8NCnsxOTAwNzJ9ezE5
MDE0Nn1OYWpsZXBzemUgbWllanNjYSBuYSBkemlzaWVqc3p5IG1lY3oufENvIHR5IG5hIHRvPw0K
ezE5MDE0OX17MTkwMjc2fUxlcGllaiBzcHLzYnVqIHplIHN0Yb95c3RrYW1pLnxOYSBwZXdubyBt
YXN6IHdp6mtzemUgc3phbnNlLg0KezE5MDI4MX17MTkwMzI0fVByemVwcmFzemFtLg0KezE5MDM1
N317MTkwNDI3fS0gTmFqbGVwc3plIG1pZWpzY2E/fC0gTmllIHLzYiB0ZWdvLg0KezE5MDQzNH17
MTkwNTMwfU9wcm93YWSfY2llIG5hc3plZ28gbm93ZWdvIHJlcG9ydGVyYS4NCnsxOTA1MzB9ezE5
MDYxMn1QcnplZHN0YXdpYW0gQ2xhcmthIEtlbnRhLnxQb3dvZHplbmlhLCBts29keS4NCnsxOTA2
NTB9ezE5MDcxMH0tIEN6ZZzmLCBqZXN0ZW0gU3RldmUufC0gTWmzbyBtaS4NCnsxOTA3MjJ9ezE5
MDc1M31DemWc5i4NCnsxOTA3NjN9ezE5MDg2Nn1Mb2lzIExhbmUsIHdpdGFqIHcgVGhlIFBsYW5l
dC4NCnsxOTA5NDJ9ezE5MTAwNX1DaWVzeuogc2nqLCC/ZSB0dSBqZXN0ZW0uDQp7MTkxMTIwfXsx
OTExOTJ9Q1qjT1dJRUsgWkUgU1RBTEkNCnsxOTEyMDR9ezE5MTI2NH1Us3VtYWN6ZW5pZTogc2lu
dTYNCnsxOTEyNzh9ezE5MTMyNH0+PiBSZWxlYXNlMjQucGwgPDwNCg==
headers:
cache-control: [public]
connection: [close]
content-type: [text/html]
date: ['Fri, 30 Oct 2015 08:02:30 GMT']
server: [Apache]
vary: [Accept-Encoding]
x-powered-by: [PleskLin]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,20 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.1]
method: GET
uri: http://napiprojekt.pl/unit_napisy/dl.php?f=abcdabdcabcd1234abcd1234abcd123&pass=&l=PL&nick=&kolejka=false&t=4afc4&napios=Linux&v=dreambox
response:
body: {string: !!python/unicode 'NPc0'}
headers:
cache-control: [public]
connection: [close]
content-length: ['4']
content-type: [text/html]
date: ['Fri, 30 Oct 2015 08:02:30 GMT']
server: [Apache]
vary: [Accept-Encoding]
x-powered-by: [PleskLin]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,976 @@
interactions:
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>LogIn</methodName>
<params>
<param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string>eng</string></value>
</param>
<param>
<value><string>subliminal v1.1</string></value>
</param>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WRTQrCMBCF954idG+TRkUXY3oAF4I3SJvxt0lKforHt60BRUQFd98M8+Y9ZqC8
6oZ06PzJmnVW5CwjaGqrTuawzmLYT1dZKSagMRyt2qFvrfHYN1rppPZiQu7UA4FONhEHIuCDi3UY
mfRiXaG7FwSM1CiCvaABOnLqP9RpQR9BzLExRYvnmV0cnC72bMFrziu1WgJNI0lOn/RAny3f+fsg
Q/Q/BOCMke3mTzOsrVEf3ZSNVYOC5YxxoKn6ZjamSmd+TAFNH0ngB3r93w3lUby4+AEAAA==
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
content-encoding: [gzip]
content-length: ['223']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:51:53 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [lighttpd/1.4.36]
set-cookie: [PHPSESSID=4eln1pej3o5grm1f052c22bd87; path=/; domain=.opensubtitles.org]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web3]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['504']
status: {code: 200, message: OK}
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>SearchSubtitles</methodName>
<params>
<param>
<value><string>4eln1pej3o5grm1f052c22bd87</string></value>
</param>
<param>
<value><array><data>
<value><struct>
<member>
<name>moviebytesize</name>
<value><string>7033732714</string></value>
</member>
<member>
<name>sublanguageid</name>
<value><string>fre,ger</string></value>
</member>
<member>
<name>moviehash</name>
<value><string>5b8f8f4e41ccb21e</string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>imdbid</name>
<value><int>770828</int></value>
</member>
<member>
<name>sublanguageid</name>
<value><string>fre,ger</string></value>
</member>
</struct></value>
</data></array></value>
</param>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['739']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
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
LE3y8qj/A57tT3FA4AAA
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
content-encoding: [gzip]
content-length: ['2409']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:51:53 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [lighttpd/1.4.36]
set-cookie: [PHPSESSID=4eln1pej3o5grm1f052c22bd87; path=/; domain=.opensubtitles.org]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web3]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['57408']
status: {code: 200, message: OK}
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>DownloadSubtitles</methodName>
<params>
<param>
<value><string>4eln1pej3o5grm1f052c22bd87</string></value>
</param>
<param>
<value><array><data>
<value><string>1953767650</string></value>
</data></array></value>
</param>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['292']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
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
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
content-encoding: [gzip]
content-length: ['33330']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:51:58 GMT']
download-quota: ['199']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
p3p: [CP="CUR ADM OUR NOR STA NID"]
pragma: [no-cache]
server: [lighttpd/1.4.36]
set-cookie: [PHPSESSID=4eln1pej3o5grm1f052c22bd87; path=/; domain=.opensubtitles.org,
'OAID=1f833196028ac14049e63aaf5029bd2f; expires=Fri, 28-Oct-2016 22:51:53
GMT; Max-Age=31536000; path=/', 'OAID=1f833196028ac14049e63aaf5029bd2f;
expires=Fri, 28-Oct-2016 22:51:53 GMT; Max-Age=31535998; path=/']
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web3]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['44335']
status: {code: 200, message: OK}
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>LogOut</methodName>
<params>
<param>
<value><string>4eln1pej3o5grm1f052c22bd87</string></value>
</param>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQQQ6DIBBF956CuK9QV12MeIAumvQGKNPWRKBhwPT4RSXRNE27e5/5M38YaF9m
ZBN6GpxtymMlSoa2d3qw96aM4XY4la0swGB4OH1FejpLmB6eyitDsmArJWAwqTHiTAwo+NiHhVlq
Nh36VTCwyqCkoEIk4IvIha09T0g7yFoIdjkDzzJb+c4LfD//axj2zuqfadrFbkQpKiFq4Fn9C1u2
yt/cXMDzRTLQTJ/3ewOeSfZ8eAEAAA==
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
content-encoding: [gzip]
content-length: ['193']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:52:00 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [lighttpd/1.4.36]
set-cookie: [PHPSESSID=4eln1pej3o5grm1f052c22bd87; path=/; domain=.opensubtitles.org]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web2]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['376']
status: {code: 200, message: OK}
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>close</methodName>
<params>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQSw6DMAxE95zCYl8SpC5ayYQTdNMbBGJaJJKgfFCPXz6RQFXV7t7YGY9jrF96
gImc762p8rLgOZBprerNo8pj6E6XvBYZagpPq+7kR2s8zYVROqm9yGCjGQAnOURaCNAHF9uwMsxm
3ZDbBKCRmoQPMkSPbBWpsdvThHkHceZXuK3hYGyAzkajkKVmMrKDE9kx7Ws0tdaon9nKxmYgwQvO
S2RJ/Qtbt0qf3l8hS/dJ4Bf6vOYbZMIxSIYBAAA=
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
content-encoding: [gzip]
content-length: ['200']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:52:00 GMT']
server: [lighttpd/1.4.36]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web2]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['390']
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,294 @@
interactions:
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>LogIn</methodName>
<params>
<param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string>eng</string></value>
</param>
<param>
<value><string>subliminal v1.1</string></value>
</param>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WRQW7CQAxF95xilH2ZgZaKhRkO0AVSbzAkbghkbBR7Io7fEEYCVRUgsXu2/P2/
bFifYmt67KRhWhWzqSsMUslVQ/WqSPrztizWfgIRdcfVN8qRSXBoHEMXoviJudAABvrQJjyTAdEu
lTqyGcRxi92lMEAholc+IIEdOfev6rxgiODreq+9MM8b/Dg4qnG2WH5qk2gBNo9kub3Rg721/M9f
NGiSJwLMnTObrxfNsGSq7rpVnLYtejd17h1srh6Zjanyma9TYPNHMsiZ/v7vF/pHrFX4AQAA
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
content-encoding: [gzip]
content-length: ['225']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:51:53 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [lighttpd/1.4.36]
set-cookie: [PHPSESSID=ggjtvsoo2ie4k0nge1586tiun5; path=/; domain=.opensubtitles.org]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web3]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['504']
status: {code: 200, message: OK}
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>SearchSubtitles</methodName>
<params>
<param>
<value><string>ggjtvsoo2ie4k0nge1586tiun5</string></value>
</param>
<param>
<value><array><data>
<value><struct>
<member>
<name>query</name>
<value><string>Marvels Agents of S.H.I.E.L.D.</string></value>
</member>
<member>
<name>sublanguageid</name>
<value><string>hun</string></value>
</member>
<member>
<name>episode</name>
<value><int>6</int></value>
</member>
<member>
<name>season</name>
<value><int>2</int></value>
</member>
</struct></value>
</data></array></value>
</param>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['599']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA+1cbXObOBD+3l/B5GbuG0Jg3uyj7iSxO/E0aXJxrjd33wQSNhdeXCScpL/+ZIwT
x7FL5Vgt12M8Y0sgpGeX3WW1z2Dv3X0SK3OS0yhL3x7pAB4pJA0yHKWTt0cFC1X36F3/jZcQNs3w
NaGzLKWEH5ihHCW0/0ZZtnhD8eYoLsiipXiU5UXAyrbCL058ki87ipeihPQpQ6ygnlZ2qhNPl1cz
cAx9A0Ll8oOnVd1qqLY21tPW59+2GEYMfW0plOfoYdVTvMXwx97G2E3ZqkPPFlXWlr5ALJgSfPLw
bP0dM6+JHRZxzMg92xBceSn+6tBLCLtRjQbjwr/I5hF5H8VEEBqUg6mEc4botEFwTh4YGUdfmqSh
myghF+NmACrNiEUs3seM9K5lmrZpwo4ccBzaAtVH3hZEdoHyOYkpOJ6QlFGQhWAMzsAIDME5GIAx
NIbQBsfgfY4CVuQEg7OsoAQ4BpyBP4cn6oAPG1hA5xcZtqmejAHNJTkyF/KYg0Dx6UBU/dIA7eEw
pt015JnBPkGlEwYdHGCfOF3HDEMXGwTbGFmmH+o6lqe8c0TZjbB7w56p92Q50pOXC8KyXNfqdrty
UP1BST4SNXpJcbC8b+mkQBMiDGlapPLiX5YniAkCkhmrxkXSoEB1XPCcNj/NkoTHeTFU2uHBYDxA
TNTFDKibqq6r0FV4EOh0eRyQpq4ThBvjbteI8WlF4QB5gAbZXRpnCNNTUVPqd1zHlpgwXpOYILpP
HqQcPBGSKOb7K9GnpmEBCKVlxiUo0VDnmo7hSkU0SrAvmpxBx7VcmXuaPWzz11865m9Lu1SyUFm3
y/KUcqw8mqVSmqVk/EPRcHTgR0gJ5C+C8j2eIBJVs7C3vYK1CyTuCwkqDaMZj7NFJvsxCm7FveDA
JjQaX9qdrnD+Kkcrq4R6j9hwVqQTlEdIXmJd5Yy0GQa02OJyx+fzjpIZihpl2Ncovf2xqTXJI0LH
PAXKUtHQKOl2lYiGs4hmWNS0ZSaKH6JU1HDISghZZt2UzWJ5y0YXg5MrlAtvFvtGxzYtV5Y5Ff6w
ImwEYZ1e6YYlyfd/L0j+cLVghggjuUig3KBWdqzyuNDnxUJbpt+xwpr4yXJ3o6DHLJKCKYgAATHA
YKtatmtmh3LqkJOdEaAe+/Y4cFB4dFfIrEe33dIPi67w4ypDiLZFrXqQuwpvgjDLOTZt9pAVhfNI
9AnanzI262kajkE2Iymtqrd8A59PNJJquJpZC6OY8B+aByqaRdo8D1W96zswsHSNRlidTP5hc5pl
RkTMW5hOiG65NouK1NKe2Bsw+SInhPwdzb6DDviZDRWElkugH5A6FUgtb69K7nR/0e/u7rbL/nhg
JUKdpMsIqWahStWpGqlEjVWsIjVc7bDV6WKHrb5qL/DSkV5c11LxG9BaKv5HQvq5qHiLfyRVgl5N
xSvbK32Kqhj30OY/L6p94Gxw82n5Nfx0CaZFy8HXgLEMG1pN4uCRY6PANmFIINHtsNsxXRuHhtMx
u12k237zOHjYsySlA6/g4B1btyUZWsvB14NqOfj/BwcP1Q5UdLdn6D1dEoXXcvDSOHjDkVUIOxAH
/9oMqFHMO2yJ929B1RLvLfG+N6KWeK8F1BLvLfHeEu/S8umWeK+H1BLvNVBa4r0l3ndqZody6pC3
xPtr0LXEuyzincDAsr+JeC+5mp+QeLcd6Pt+PfEusab9vYj3UoT/CPHuaeuvxHva+vvyz8bWv4pP
SZCl+Ksv/uOMhxhSFol4tK16dYutC/E0ytOqPyeoGnTR2vwrg38BTRpXmwNBAAA=
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
content-encoding: [gzip]
content-length: ['1358']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:51:53 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [lighttpd/1.4.36]
set-cookie: [PHPSESSID=ggjtvsoo2ie4k0nge1586tiun5; path=/; domain=.opensubtitles.org]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web2]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['16643']
status: {code: 200, message: OK}
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>LogOut</methodName>
<params>
<param>
<value><string>ggjtvsoo2ie4k0nge1586tiun5</string></value>
</param>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95yiYS+tunEx1AO4MPEGhY5KQlvSH+LxLTAJxBjdfa/zZt504Pwy
PRvRh87ZutxXomRoW6c7+6jLFO+7U3mWBRiMT6dvGAZnA+aHQXllgizYQhkYjKpPOBGDEH1q48ws
N5sG/SIYWGVQhqhiCsBnQYW1nSbkHeRBCHa9ACdJVr7xAt/O/xqGrbP6Z5p2qelRikqII3BS/8Lm
reibqws4XYQgTPR5vzehOT3yeAEAAA==
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
cache-control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
content-encoding: [gzip]
content-length: ['193']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:51:53 GMT']
expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
pragma: [no-cache]
server: [lighttpd/1.4.36]
set-cookie: [PHPSESSID=ggjtvsoo2ie4k0nge1586tiun5; path=/; domain=.opensubtitles.org]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web3]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['376']
status: {code: 200, message: OK}
- request:
body: '<?xml version=''1.0''?>
<methodCall>
<methodName>close</methodName>
<params>
</params>
</methodCall>
'
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [xmlrpclib.py/1.0.1 (by www.pythonware.com)]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQSw6DMAxE95zCYl8SpC5ayYQTdNMbBGJaJJKgfFCPXz6RQFXV7t7YGY9jrF96
gImc762p8rLgOZBprerNo8pj6E6XvBYZagpPq+7kR2s8zYVROqm9yGCjGQAnOURaCNAHF9uwMsxm
3ZDbBKCRmoQPMkSPbBWpsdvThHkHceZXuK3hYGyAzkajkKVmMrKDE9kx7Ws0tdaon9nKxmYgwQvO
S2RJ/Qtbt0qf3l8hS/dJ4Bf6vOYbZMIxSIYBAAA=
headers:
accept-ranges: [bytes]
access-control-allow-headers: ['Origin, X-Requested-With, Content-Type, Accept']
access-control-allow-origin: ['*']
age: ['0']
content-encoding: [gzip]
content-length: ['200']
content-type: [text/xml;charset=UTF-8]
date: ['Thu, 29 Oct 2015 22:51:53 GMT']
server: [lighttpd/1.4.36]
strict-transport-security: [max-age=63072000; includeSubdomains; preload]
x-cache: [MISS]
x-cache-backend: [web3]
x-content-type-options: [nosniff]
x-frame-options: [DENY]
x-uncompressed-content-length: ['390']
status: {code: 200, message: OK}
version: 1

Some files were not shown because too many files have changed in this diff Show More