Èfæ5             ©t           !extdb.#schema"{"origin":"normal","value":"6226"}!extdb.#version#{"origin":"normal","value":"5.4.1"}î¥	Ýß          !extdb.#beggingV{"origin":"normal","value":{"first_run":{"ts":1.773563852664e+12,"type":"from_init"}}}!extdb.#laststart.{"origin":"normal","value":1.773563852678e+12}!misc.global_hints.items�{"origin":"normal","value":{"android_hint":{"buttons":[{"text":"Daha fazla bilgi","url":"https://www.tampermonkey.net/faq#Q406"}],"class":"notice","info_url":"https://www.tampermonkey.net/qr/t","key":"android_hint","qr":{"bsize":4,"csize":14,"img":"tampermonkey","oversample":4,"pixelPrecise":true,"size":66,"text":"https://www.tampermonkey.net/qr/t"},"realm":"actions","text":"Tampermonkey'i telefonunuzda veya tabletinizde kullanmak için QR kodunu tarayın","title":"Tampermonkey mobil platformlarda da kullanılabilir"}}}ŸôÀÖö          !extdb.#config˜{"origin":"normal","value":{"script_blacklist_server":[{"rules":["/https?:\\/\\/userscripts\\.org\\/scripts\\/(source|version)/(102614).*\\.user\\.js/"],"severity":2},{"name":"SaveFrom.net helper","reason":"Shows advertisements","rules":["/https?:\\/\\/sf-addon\\.com\\/.*\\/.*\\.user\\.js/","/https?:\\/\\/.*\\.sf-helper\\.com\\/.*\\.user\\.js/"],"severity":3},{"reasons":{"en":"Used for a phishing compain to compromise users of baon-nutrition.com"},"rules":["/https?:\\/\\/files\\.ulysse\\.travel\\/.*\\.user\\.js/"],"severity":8}]}}!extdb.#updateg{"origin":"normal","value":{"black":{"last":1.773563926282e+12,"version":"1768576685662"},"scripts":0}}!misc.global_hints.items¬{"origin":"normal","value":{"android_hint":{"buttons":[{"text":"Daha fazla bilgi","url":"https://www.tampermonkey.net/faq#Q406"}],"class":"notice","info_url":"https://www.tampermonkey.net/qr/t","key":"android_hint","qr":{"bsize":4,"csize":14,"img":"tampermonkey","oversample":4,"pixelPrecise":true,"size":66,"text":"https://www.tampermonkey.net/qr/t"},"realm":"actions","text":"Tampermonkey'i telefonunuzda veya tabletinizde kullanmak için QR kodunu tarayın","title":"Tampermonkey mobil platformlarda da kullanılabilir"},"broadcast":1.773563926282e+12}}UxªM 	          !extdb.#laststart-{"origin":"normal","value":1.77356414229e+12}iˠ¤N 
          !extdb.#laststart.{"origin":"normal","value":1.773564145452e+12}™Xæž          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8¶{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.7735641683e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/e0abf721-27c3-4226-9da5-567bff592e16"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}/!extdb.@re#5c1fb457-a332-4220-b8c4-34f694e109f8G{"origin":"normal","value":{"exc":[],"inc":[],"match":["https://*/*"]}}3!extdb.@source#5c1fb457-a332-4220-b8c4-34f694e109f8”{"origin":"normal","value":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==\n\n(function() {\n    'use strict';\n// ==UserScript==\n// @name         YouTube SPA Fix\n// @namespace    http://tampermonkey.net/\n// @version      1.0\n// @description  YouTube SPA navigasyon hatasini duzeltir\n// @match        https://www.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\ndocument.addEventListener('click', function(e) {\n    const link = e.target.closest('a[href]');\n    if (link && link.href && link.href.includes('youtube.com/watch')) {\n        e.stopPropagation();\n        e.preventDefault();\n        window.location.href = link.href;\n    }\n}, true);\n    // Your code here...\n})();"}/!extdb.@st#5c1fb457-a332-4220-b8c4-34f694e109f8?{"origin":"normal","value":{"data":{},"ts":1.773564168322e+12}}0!extdb.@uid#5c1fb457-a332-4220-b8c4-34f694e109f8,{"origin":"normal","value":"New Userscript"}vO./Õ          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ò{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.7735641683e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/e0abf721-27c3-4226-9da5-567bff592e16"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}/!extdb.@re#5c1fb457-a332-4220-b8c4-34f694e109f8�{"origin":"normal","value":{"exc":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"inc":[],"match":["https://*/*"]}}¹ˆ€          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ó{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":false,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.7735641683e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/e0abf721-27c3-4226-9da5-567bff592e16"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}ÇÓ          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ò{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.7735641683e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/e0abf721-27c3-4226-9da5-567bff592e16"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}C¨ñÇN           !extdb.#laststart.{"origin":"normal","value":1.773564488824e+12}IÓ�ü          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Â{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.7735641683e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/e0abf721-27c3-4226-9da5-567bff592e16"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}/!extdb.@re#5c1fb457-a332-4220-b8c4-34f694e109f8G{"origin":"normal","value":{"exc":[],"inc":[],"match":["https://*/*"]}}¦ÔÄƒ          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Â{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564556392e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/e0abf721-27c3-4226-9da5-567bff592e16"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}œ£c          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ð{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564796044e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773564796044e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/56c1b4fe-db0c-48be-b69c-1043793587d8"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}3!extdb.@source#5c1fb457-a332-4220-b8c4-34f694e109f8›{"origin":"normal","value":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==\n\n(function() {\n    'use strict';\n// ==UserScript==\n// @name         YouTube SPA Fix\n// @namespace    http://tampermonkey.net/\n// @version      1.0\n// @description  YouTube SPA navigasyon hatasini duzeltir\n// @match        https://www.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\n// document.addEventListener('click', function(e) {\n//     const link = e.target.closest('a[href]');\n//     if (link && link.href && link.href.includes('youtube.com/watch')) {\n//         e.stopPropagation();\n//         e.preventDefault();\n//         window.location.href = link.href;\n//     }\n// }, true);\n    // Your code here...\n\n\n    // ==UserScript==\n// @name         YouTube SPA Minimal Fix\n// @namespace    http://tampermonkey.net/\n// @version      1.2\n// @description  YouTube SPA hatasini minimal sekilde duzeltir\n// @match        https://www.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\n(function() {\n    'use strict';\n\n    let lastUrl = location.href;\n\n    // URL değişikliklerini izle (her tür navigasyonu kapsar)\n    const observer = new MutationObserver(function() {\n        if (location.href !== lastUrl) {\n            lastUrl = location.href;\n            // Sadece /watch sayfalarında hard reload yap\n            if (location.href.includes('/watch')) {\n                window.location.replace(location.href);\n            }\n        }\n    });\n\n    observer.observe(document, { subtree: true, childList: true });\n\n})();\n})();"}f�ýnˆ          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ð{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564817161e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773564817161e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/ca0daf83-4631-45c7-8514-44cfd9da2f31"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}3!extdb.@source#5c1fb457-a332-4220-b8c4-34f694e109f8À{"origin":"normal","value":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==\n\n// (function() {\n//     'use strict';\n// // ==UserScript==\n// // @name         YouTube SPA Fix\n// // @namespace    http://tampermonkey.net/\n// // @version      1.0\n// // @description  YouTube SPA navigasyon hatasini duzeltir\n// // @match        https://www.youtube.com/*\n// // @run-at       document-start\n// // @grant        none\n// // ==/UserScript==\n\n// document.addEventListener('click', function(e) {\n//     const link = e.target.closest('a[href]');\n//     if (link && link.href && link.href.includes('youtube.com/watch')) {\n//         e.stopPropagation();\n//         e.preventDefault();\n//         window.location.href = link.href;\n//     }\n// }, true);\n//     // Your code here...\n// })();\n\n\n\n// ==UserScript==\n// @name         YouTube SPA Minimal Fix\n// @namespace    http://tampermonkey.net/\n// @version      1.2\n// @description  YouTube SPA hatasini minimal sekilde duzeltir\n// @match        https://www.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\n(function() {\n    'use strict';\n\n    let lastUrl = location.href;\n\n    // URL değişikliklerini izle (her tür navigasyonu kapsar)\n    const observer = new MutationObserver(function() {\n        if (location.href !== lastUrl) {\n            lastUrl = location.href;\n            // Sadece /watch sayfalarında hard reload yap\n            if (location.href.includes('/watch')) {\n                window.location.replace(location.href);\n            }\n        }\n    });\n\n    observer.observe(document, { subtree: true, childList: true });\n\n})();"}5Â)Ùâ          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ð{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564871705e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773564871705e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/64d7bd3f-fcd6-45a0-86d3-23261c3a6eb5"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}3!extdb.@source#5c1fb457-a332-4220-b8c4-34f694e109f8š{"origin":"normal","value":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==\n\n// (function() {\n//     'use strict';\n// // ==UserScript==\n// // @name         YouTube SPA Fix\n// // @namespace    http://tampermonkey.net/\n// // @version      1.0\n// // @description  YouTube SPA navigasyon hatasini duzeltir\n// // @match        https://www.youtube.com/*\n// // @run-at       document-start\n// // @grant        none\n// // ==/UserScript==\n\n// document.addEventListener('click', function(e) {\n//     const link = e.target.closest('a[href]');\n//     if (link && link.href && link.href.includes('youtube.com/watch')) {\n//         e.stopPropagation();\n//         e.preventDefault();\n//         window.location.href = link.href;\n//     }\n// }, true);\n//     // Your code here...\n// })();\n\n\n// ==UserScript==\n// @name         YouTube SPA Full Fix\n// @namespace    http://tampermonkey.net/\n// @version      1.1\n// @description  YouTube SPA navigasyon hatasini tamamen duzeltir\n// @match        https://www.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\n(function() {\n    'use strict';\n\n    // 1) Tıklama ile geçişleri yakala\n    document.addEventListener('click', function(e) {\n        const link = e.target.closest('a[href]');\n        if (link && link.href && link.href.includes('youtube.com/watch')) {\n            e.stopPropagation();\n            e.preventDefault();\n            window.location.href = link.href;\n        }\n    }, true);\n\n    // 2) YouTube'un SPA navigasyonunu (autoplay, playlist vs.) yakala\n    //    YouTube \"yt-navigate-finish\" event'i fırlatır her sayfa geçişinde\n    document.addEventListener('yt-navigate-finish', function() {\n        // Mevcut URL'yi al ve hard reload yap\n        window.location.href = window.location.href;\n    });\n\n    // 3) History API'yi override et (pushState/replaceState)\n    const originalPushState = history.pushState;\n    history.pushState = function() {\n        // Orijinal pushState'i çalıştır\n        originalPushState.apply(this, arguments);\n        // Sonra hard redirect yap\n        if (window.location.href.includes('/watch')) {\n            window.location.href = window.location.href;\n        }\n    };\n\n})();"}–{/’          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ñ{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":false,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564871705e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773564871705e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/64d7bd3f-fcd6-45a0-86d3-23261c3a6eb5"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}³84w_          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ñ{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":false,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564963606e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773564963606e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/b0b56cfb-fa0d-4d0d-b2a1-0ac08adeae63"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}3!extdb.@source#5c1fb457-a332-4220-b8c4-34f694e109f8ð{"origin":"normal","value":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15ޔ$dZ	\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==\n\n// (function() {\n//     'use strict';\n// // ==UserScript==\n// // @name         YouTube SPA Fix\n// // @namespace    http://tampermonkey.net/\n// // @version      1.0\n// // @description  YouTube SPA navigasyon hatasini duzeltir\n// // @match        https://www.youtube.com/*\n// // @run-at       document-start\n// // @grant        none\n// // ==/UserScript==\n\n// document.addEventListener('click', function(e) {\n//     const link = e.target.closest('a[href]');\n//     if (link && link.href && link.href.includes('youtube.com/watch')) {\n//         e.stopPropagation();\n//         e.preventDefault();\n//         window.location.href = link.href;\n//     }\n// }, true);\n//     // Your code here...\n// })();\n\n\n// ==UserScript==\n// @name         YouTube SPA Fix v2\n// @namespace    http://tampermonkey.net/\n// @version      2.0\n// @description  YouTube SPA hatasini duzeltir - sonsuz dongu olmadan\n// @match        https://www.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\n(function() {\n    'use strict';\n\n    // Reload'dan gelip gelmediğimizi işaretle\n    const RELOAD_KEY = 'yt_spa_fix_reloaded';\n\n    // 1) Tıklama ile geçişler\n    document.addEventListener('click', function(e) {\n        const link = e.target.closest('a[href]');\n        if (link && link.href && link.href.includes('youtube.com/watch')) {\n            e.stopPropagation();\n            e.preventDefault();\n            window.location.href = link.href;\n        }\n    }, true);\n\n    // 2) SPA navigasyonlarını yakala (autoplay, playlist)\n    //    Ama sadece BİR KERE reload yap, sonsuz döngüye girme\n    document.addEventListener('yt-navigate-finish', function() {\n        const currentUrl = window.location.href;\n        const lastReloaded = sessionStorage.getItem(RELOAD_KEY);\n\n        // Eğer bu URL için zaten reload yaptıysak, tekrar yapma\n        if (lastReloaded === currentUrl) {\n            return;\n        }\n\n        // Bu URL'yi işaretle ve reload yap\n        sessionStorage.setItem(RELOAD_KEY, currentUrl);\n        window.location.href = currentUrl;\n    });\n\n})();"}  P”‘!          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ð{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564963606e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773564963606e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/b0b56cfb-fa0d-4d0d-b2a1-0ac08adeae63"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}$D–֑"          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ð{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773564972734e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773564963606e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/b0b56cfb-fa0d-4d0d-b2a1-0ac08adeae63"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}éAbI7#          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8Ð{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773565022342e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773565022343e+12},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/0026fdb0-b211-41dc-8489-379e24b549f4"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}3!extdb.@source#5c1fb457-a332-4220-b8c4-34f694e109f8ï{"origin":"normal","value":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==\n\n// (function() {\n//     'use strict';\n// // ==UserScript==\n// // @name         YouTube SPA Fix\n// // @namespace    http://tampermonkey.net/\n// // @version      1.0\n// // @description  YouTube SPA navigasyon hatasini duzeltir\n// // @match        https://www.youtube.com/*\n// // @run-at       document-start\n// // @grant        none\n// // ==/UserScript==\n\n// document.addEventListener('click', function(e) {\n//     const link = e.target.closest('a[href]');\n//     if (link && link.href && link.href.includes('youtube.com/watch')) {\n//         e.stopPropagation();\n//         e.preventDefault();\n//         window.location.href = link.href;\n//     }\n// }, true);\n//     // Your code here...\n// })();\n\n\n// ==UserScript==\n// @name         YouTube SPA Fix v3\n// @namespace    http://tampermonkey.net/\n// @version      3.0\n// @description  YouTube SPA fix - sadece tiklama ve link mudahalesi\n// @match        https://www.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\n(function() {\n    'use strict';\n\n    // Sadece tıklamaları ve linkleri normal navigasyona çevir\n    // RELOAD YOK - sonsuz döngü riski yok\n\n    // Tüm youtube watch linklerini normal navigasyona zorla\n    document.addEventListener('click', function(e) {\n        const link = e.target.closest('a[href]');\n        if (link && link.href && link.href.includes('youtube.com/watch')) {\n            e.stopPropagation();\n            e.preventDefault();\n            window.location.href = link.href;\n        }\n    }, true);\n\n    // Autoplay için: video bittiğinde sonraki videoyu hard link ile aç\n    window.addEventListener('DOMContentLoaded', function() {\n        const checkVideo = setInterval(function() {\n            const video = document.querySelector('video');\n            if (video) {\n                clearInterval(checkVideo);\n                video.addEventListener('ended', function() {\n                    // Sonraki video linkini bul ve hard navigate yap\n                    setTimeout(function() {\n                        const nextBtn = document.querySelector('a.ytp-next-button')\n                            || document.querySelector('.ytp-autonav-endscreen-upnext-button');\n                        if (nextBtn && nextBtn.href) {\n                            window.location.href = nextBtn.href;\n                        } else {\n                            // Playlist'teyse bir sonraki linki bul\n                            const nextInPlaylist = document.querySelector(\n                                '#playlist .ytd-playlist-panel-video-renderer.ytd-playlist-panel-video-renderer + ytd-playlist-panel-video-renderer a'\n                            );\n                            if (nextInPlaylist && nextInPlaylist.href) {\n                                window.location.href = nextInPlaylist.href;\n                            }\n                        }\n                    }, 500);\n                });\n            }\n        }, 1000);\n    });\n\n})();"}ÿɮ¤�B%          1!extdb.@meta#85ed5048-b1a5-4df0-ae71-bb1d35c341c9ý{"origin":"normal","value":{"antifeatures":{},"author":null,"blockers":[],"connects":[],"copyright":null,"description":"A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.","description_i18n":{"zh_CN":"脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。","zh_HK":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_MO":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_TW":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。"},"downloadURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","enabled":true,"evilness":0,"excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"fileURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         youtube-adb\n// @name:zh-CN   YouTube去广告\n// @name:zh-TW   YouTube去廣告\n// @name:zh-HK   YouTube去廣告\n// @name:zh-MO   YouTube去廣告\n// @namespace    https://github.com/iamfugui/youtube-adb\n// @version      6.21\n// @description         A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.\n// @description:zh-CN   脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。\n// @description:zh-TW   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-HK   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-MO   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @match        *://*.youtube.com/*\n// @exclude      *://accounts.youtube.com/*\n// @exclude      *://www.youtube.com/live_chat_replay*\n// @exclude      *://www.youtube.com/persist_identity*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=YouTube.com\n// @grant        none\n// @license MIT\n// @downloadURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js\n// @updateURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=YouTube.com","icon64":null,"includes":[],"lastModified":1.773565287144e+12,"matches":["*://*.youtube.com/*"],"name":"youtube-adb","name_i18n":{"zh_CN":"YouTube去广告","zh_HK":"YouTube去廣告","zh_MO":"YouTube去廣告","zh_TW":"YouTube去廣告"},"namespace":"https://github.com/iamfugui/youtube-adb","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[],"resources":[],"supportURL":null,"sync":{},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/89d8c285-2d34-4d37-9e17-119c376de312"}},"updateURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js","uuid":"85ed5048-b1a5-4df0-ae71-bb1d35c341c9","version":"6.21","webRequest":null}}/!extdb.@re#85ed5048-b1a5-4df0-ae71-bb1d35c341c9»{"origin":"normal","value":{"exc":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"inc":[],"match":["*://*.youtube.com/*"]}}3!extdb.@source#85ed5048-b1a5-4df0-ae71-bb1d35c341c9í`{"origin":"normal","value":"// ==UserScript==\n// @name         youtube-adb\n// @name:zh-CN   YouTube去广告\n// @name:zh-TW   YouTube去廣告\n// @name:zh-HK   YouTube去廣告\n// @name:zh-MO   YouTube去廣告\n// @namespace    https://github.com/iamfugui/youtube-adb\n// @version      6.21\n// @description         A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.\n// @description:zh-CN   脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。\n// @description:zh-TW   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-HK   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-MO   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @match        *://*.youtube.com/*\n// @exclude      *://accounts.youtube.com/*\n// @exclude      *://www.youtube.com/live_chat_replay*\n// @exclude      *://www.youtube.com/persist_identity*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=YouTube.com\n// @grant        none\n// @license MIT\n// @downloadURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js\n// @updateURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js\n// ==/UserScript==\n\n(function() {\n    `use strict`;\n\n    let video;\n    //界面广告选择器\n    const cssSelectorArr = [\n        `#masthead-ad`,//首页顶部横幅广告.\n        `ytd-rich-item-renderer.style-scope.ytd-rich-grid-row #content:has(.ytd-display-ad-renderer)`,//首页视频排版广告.\n        `.video-ads.ytp-ad-module`,//播放器底部广告.\n        `tp-yt-paper-dialog:has(yt-mealbar-promo-renderer)`,//播放页会员促销广告.\n        `ytd-engagement-panel-section-list-renderer[target-id=\"engagement-panel-ads\"]`,//播放页右上方推荐广告.\n        `#related #player-ads`,//播放页评论区右侧推广广告.\n        `#related ytd-ad-slot-renderer`,//播放页评论区右侧视频排版广告.\n        `ytd-ad-slot-renderer`,//搜索页广告.\n        `yt-mealbar-promo-renderer`,//播放页会员推荐广告.\n        `ytd-popup-container:has(a[href=\"/premium\"])`,//会员拦截广告\n        `ad-slot-renderer`,//M播放页第三方推荐广告\n        `ytm-companion-ad-renderer`,//M可跳过的视频广告链接处\n    ];\n    window.dev=false;//开发使用\n\n    /**\n    * 将标准时间格式化\n    * @param {Date} time 标准时间\n    * @param {String} format 格式\n    * @return {String}\n    */\n    function moment(time) {\n        // 获取年⽉⽇时分秒\n        let y = time.getFullYear()\n        let m = (time.getMonth() + 1).toString().padStart(2, `0`)\n        let d = time.getDate().toString().padStart(2, `0`)\n        let h = time.getHours().toString().padStart(2, `0`)\n        let min = time.getMinutes().toString().padStart(2, `0`)\n        let s = time.getSeconds().toString().padStart(2, `0`)\n        return `${y}-${m}-${d} ${h}:${min}:${s}`\n    }\n\n    /**\n    * 输出信息\n    * @param {String} msg 信息\n    * @return {undefined}\n    */\n    function log(msg) {\n        if(!window.dev){\n            return false;\n        }\n        console.log(window.location.href);\n        console.log(`${moment(new Date())}  ${msg}`);\n    }\n\n    /**\n    * 设置运行标志\n    * @param {String} name\n    * @return {undefined}\n    */\n    function setRunFlag(name){\n        let style = document.createElement(`style`);\n        style.id = name;\n        (document.head || document.body).appendChild(style);//将节点附加到HTML.\n    }\n\n    /**\n    * 获取运行标志\n    * @param {String} name\n    * @return {undefined|Element}\n    */\n    function getRunFlag(name){\n        return document.getElementById(name);\n    }\n\n    /**\n    * 检查是否设置了运行标志\n    * @param {String} name\n    * @return {Boolean}\n    */\n    function checkRunFlag(name){\n        if(getRunFlag(name)){\n            return true;\n        }else{\n            setRunFlag(name)\n            return false;\n        }\n    }\n\n    /**\n    * 生成去除广告的css元素style并附加到HTML节点上\n    * @param {String} styles 样式文本\n    * @return {undefined}\n    */\n    function generateRemoveADHTMLElement(id) {\n        //如果已经设置过,退出.\n        if (checkRunFlag(id)) {\n            log(`屏蔽页面广告节点已生成`);\n            return false\n        }\n\n        //设置移除广告样式.\n        let style = document.createElement(`style`);//创建style元素.\n        (document.head || document.body).appendChild(style);//将节点附加到HTML.\n        style.appendChild(document.createTextNode(generateRemoveADCssText(cssSelectorArr)));//附加样式节点到元素节点.\n        log(`生成屏蔽页面广告节点成功`);\n    }\n\n    /**\n    * 生成去除广告的css文本\n    * @param {Array} cssSelectorArr 待设置css选择器数组\n    * @return {String}\n    */\n    function generateRemoveADCssText(cssSelectorArr){\n        cssSelectorArr.forEach((selector,index)=>{\n            cssSelectorArr[index]=`${selector}{display:none!important}`;//遍历并设置样式.\n        });\n        return cssSelectorArr.join(` `);//拼接成字符串.\n    }\n\n    /**\n    * 触摸事件\n    * @return {undefined}\n    */\n    function nativeTouch(){\n        // 创建 Touch 对象\n        let touch = new Touch({\n            identifier: Date.now(),\n            target: this,\n            clientX: 12,\n            clientY: 34,\n            radiusX: 56,\n            radiusY: 78,\n            rotationAngle: 0,\n            force: 1\n        });\n\n        // 创建 TouchEvent 对象\n        let touchStartEvent = new TouchEvent(`touchstart`, {\n            bubbles: true,\n            cancelable: true,\n            view: window,\n            touches: [touch],\n            targetTouches: [touch],\n            changedTouches: [touch]\n        });\n\n        // 分派 touchstart 事件到目标元素\n        this.dispatchEvent(touchStartEvent);\n\n        // 创建 TouchEvent 对象\n        let touchEndEvent = new TouchEvent(`touchend`, {\n            bubbles: true,\n            cancelable: true,\n            view: window,\n            touches: [],\n            targetTouches: [],\n            changedTouches: [touch]\n        });\n\n        // 分派 touchend 事件到目标元素\n        this.dispatchEvent(touchEndEvent);\n    }\n\n\n    /**\n    * 获取dom\n    * @return {undefined}\n    */\n    function getVideoDom(){\n        video = document.querySelector(`.ad-showing video`) || document.querySelector(`video`);\n    }\n\n\n    /**\n    * 自动播放\n    * @return {undefined}\n    */\n    function playAfterAd(){\n        if(video.paused && video.currentTime\u003C1){\n            video.play();\n            log(`自动播放视频`);\n        }\n    }\n\n\n    /**\n    * 移除YT拦截广告拦截弹窗并且关闭关闭遮罩层\n    * @return {undefined}\n    */\n    function closeOverlay(){\n        //移除YT拦截广告拦截弹窗\n        const premiumContainers = [...document.querySelectorAll(`ytd-popup-container`)];\n        const matchingContainers = premiumContainers.filter(container => container.querySelector(`a[href=\"/premium\"]`));\n\n        if(matchingContainers.length>0){\n            matchingContainers.forEach(container => container.remove());\n            log(`移除YT拦截器`);\n        }\n\n        // 获取所有具有指定标签的元素\n        const backdrops = document.querySelectorAll(`tp-yt-iron-overlay-backdrop`);\n        // 查找具有特定样式的元素\n        const targetBackdrop = Array.from(backdrops).find(\n            (backdrop) => backdrop.style.zIndex === `2201`\n        );\n        // 如果找到该元素，清空其类并移除 open 属性\n        if (targetBackdrop) {\n            targetBackdrop.className = ``; // 清空所有类\n            targetBackdrop.removeAttribute(`opened`); // 移除 open 属性\n            log(`关闭遮罩层`);\n        }\n    }\n\n\n    /**\n    * 跳过广告\n    * @return {undefined}\n    */\n    function skipAd(mutationsList, observer) {\n        const skipButton = document.querySelector(`.ytp-ad-skip-button`) || document.querySelector(`.ytp-skip-ad-button`) || document.querySelector(`.ytp-ad-skip-button-modern`);\n        const shortAdMsg = document.querySelector(`.video-ads.ytp-ad-module .ytp-ad-player-overlay`) || document.querySelector(`.ytp-ad-button-icon`);\n\n        if((skipButton || shortAdMsg) && window.location.href.indexOf(`https://m.youtube.com/`) === -1){ //移动端静音有bug\n            video.muted = true;\n        }\n\n        if(skipButton){\n            const delayTime = 0.5;\n            setTimeout(skipAd,delayTime*1000);//如果click和call没有跳过更改，直接更改广告时间\n            if(video.currentTime>delayTime){\n                video.currentTime = video.duration;//强制\n                log(`特殊账号跳过按钮广告`);\n                return;\n            }\n            skipButton.click();//PC\n            nativeTouch.call(skipButton);//Phone\n            log(`按钮跳过广告`);\n        }else if(shortAdMsg){\n            video.currentTime = video.duration;//强制\n            log(`强制结束了该广告`);\n        }\n\n    }\n\n    /**\n    * 去除播放中的广告\n    * @return {undefined}\n    */\n    function removePlayerAD(id){\n        //如果已经在运行,退出.\n        if (checkRunFlag(id)) {\n            log(`去除播放中的广告功能已在运行`);\n            return false\n        }\n\n        //监听视频中的广告并处理\n        const targetNode = document.body;//直接监听body变动\n        const config = {childList: true, subtree: true };// 监听目标节点本身与子树下节点的变动\n        const observer = new MutationObserver(()=>{getVideoDom();closeOverlay();skipAd();playAfterAd();});//处理视频广告相关\n        observer.observe(targetNode, config);// 以上述配置开始观察广告节点\n        log(`运行去除播放中的广告功能成功`);\n    }\n\n    /**\n    * main函数\n    */\n    function main(){\n        generateRemoveADHTMLElement(`removeADHTMLElement`);//移除界面中的广告.\n        removePlayerAD(`removePlayerAD`);//移除播放中的广告.\n    }\n\n    if (document.readyState === `loading`) {\n        document.addEventListener(`DOMContentLoaded`, main);// 此时加载尚未完成\n        log(`YouTube去广告脚本即将调用:`);\n    } else {\n        main();// 此时`DOMContentLoaded` 已经被触发\n        log(`YouTube去广告脚本快速调用:`);\n    }\n\n    let resumeVideo = () => {\n        const videoelem = document.body.querySelector('video.html5-main-video')\n        if (videoelem && videoelem.paused) {\n             console.log('resume video')\n             videoelem.play()\n        }\n    }\n\n    let removePop = node => {\n        const elpopup = node.querySelector('.ytd-popup-container > .ytd-popup-container > .ytd-enforcement-message-view-model')\n\n        if (elpopup) {\n            elpopup.parentNode.remove()\n            console.log('remove popup', elpopup)\n            const bdelems = document\n                .getElementsByTagName('tp-yt-iron-overlay-backdrop')\n            for (var x = (bdelems || []).length; x--;)\n                bdelems[x].remove()\n            resumeVideo()\n        }\n\n        if (node.tagName.toLowerCase() === 'tp-yt-iron-overlay-backdrop') {\n            node.remove()\n            resumeVideo()\n            console.log('remove backdrop', node)\n        }\n    }\n\n    let obs = new MutationObserver(mutations => mutations.forEach(mutation => {\n        if (mutation.type === 'childList') {\n            Array.from(mutation.addedNodes)\n                .filter(node => node.nodeType === 1)\n                .map(node => removePop(node))\n        }\n    }))\n\n    // have the observer observe foo for changes in children\n    obs.observe(document.body, {\n        childList: true,\n        subtree: true\n    })\n})();"}/!extdb.@st#85ed5048-b1a5-4df0-ae71-bb1d35c341c9?{"origin":"normal","value":{"data":{},"ts":1.773565292482e+12}}0!extdb.@uid#85ed5048-b1a5-4df0-ae71-bb1d35c341c9){"origin":"normal","value":"youtube-adb"}ù^ô†*          1!extdb.@meta#5c1fb457-a332-4220-b8c4-34f694e109f8�{"origin":"normal","value":{"antifeatures":{},"author":"You","blockers":[],"connects":[],"copyright":null,"deleted":1.773565332994e+12,"description":"try to take over the world!","description_i18n":{},"downloadURL":null,"enabled":true,"evilness":0,"excludes":[],"fileURL":null,"grant":["none"],"header":"// ==UserScript==\n// @name         New Userscript\n// @namespace    http://tampermonkey.net/\n// @version      2026-03-15\n// @description  try to take over the world!\n// @author       You\n// @match        https://*/*\n// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n// @grant        none\n// ==/UserScript==","homepage":null,"icon":"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==","icon64":null,"includes":[],"lastModified":1.773565022342e+12,"matches":["https://*/*"],"name":"New Userscript","name_i18n":{},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":1.773565022343e+12},"position":9.007199254740991e+15,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/0026fdb0-b211-41dc-8489-379e24b549f4"}},"updateURL":null,"uuid":"5c1fb457-a332-4220-b8c4-34f694e109f8","version":"2026-03-15","webRequest":null}}1!extdb.@meta#85ed5048-b1a5-4df0-ae71-bb1d35c341c9‰ {"origin":"normal","value":{"antifeatures":{},"author":null,"blockers":[],"connects":[],"copyright":null,"description":"A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.","description_i18n":{"zh_CN":"脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。","zh_HK":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_MO":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_TW":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。"},"downloadURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","enabled":true,"evilness":0,"excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"fileURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         youtube-adb\n// @name:zh-CN   YouTube去广告\n// @name:zh-TW   YouTube去廣告\n// @name:zh-HK   YouTube去廣告\n// @name:zh-MO   YouTube去廣告\n// @namespace    https://github.com/iamfugui/youtube-adb\n// @version      6.21\n// @description         A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.\n// @description:zh-CN   脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。\n// @description:zh-TW   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-HK   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-MO   腳本用WKm1z於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @match        *://*.youtube.com/*\n// @exclude      *://accounts.youtube.com/*\n// @exclude      *://www.youtube.com/live_chat_replay*\n// @exclude      *://www.youtube.com/persist_identity*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=YouTube.com\n// @grant        none\n// @license MIT\n// @downloadURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js\n// @updateURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=YouTube.com","icon64":null,"includes":[],"lastModified":1.773565287144e+12,"matches":["*://*.youtube.com/*"],"name":"youtube-adb","name_i18n":{"zh_CN":"YouTube去广告","zh_HK":"YouTube去廣告","zh_MO":"YouTube去廣告","zh_TW":"YouTube去廣告"},"namespace":"https://github.com/iamfugui/youtube-adb","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/89d8c285-2d34-4d37-9e17-119c376de312"}},"updateURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js","uuid":"85ed5048-b1a5-4df0-ae71-bb1d35c341c9","version":"6.21","webRequest":null}}˜.L·xw,          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eȣ{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565470492e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[],"resources":[],"supportURL":null,"sync":{},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/db512680-e0cc-4d2c-bbbe-e503b74173f7"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}/!extdb.@re#1df1506d-32dc-4944-8cb4-ded03b87bf3eK{"origin":"normal","value":{"exc":[],"inc":[],"match":["*.youtube.com/*"]}}3!extdb.@source#1df1506d-32dc-4944-8cb4-ded03b87bf3e×Ü{"origin":"normal","value":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, pageV+˜¾J ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==\n\n(function () {\n    let rmAry = new Array();\n    let { href } = location;\n\n    setInterval(() => {\n        let bufHref = location.href; //detect the change of href and execute \n\n        let detectBasicAd; //detect the activity of insert ad in video\n        if (document.getElementsByClassName(\"ytp-ad-preview-text\").length) {\n            detectBasicAd = (document.getElementsByClassName(\"ytp-ad-preview-text\")[0].innerHTML.constructor == String);\n        }\n\n        //* skipShitVideoAD() can only reset by change of href\n        //! check if the frame exist\n        if (bufHref != href && document.getElementById(\"iframe\")) {\n            console.log(\"isCallSkipShitVideoAD = false\");\n            isCallSkipShitVideoAD = false;\n        }\n\n        //* check change of href\n        if (bufHref != href) {\n            console.log(\"[YT AD block] Detect the change of href.\", href);\n            href = bufHref;\n            executeManager('f');\n        }\n\n        //* check the insert AD\n        if (detectBasicAd) {\n            console.log(\"[YT AD block] Found the insert AD.\");\n            executeManager('f');\n        }\n    }, 500);\n\n    if (location.hostname.search(\"youtube\") != -1) {\n        addBData('id', 'player-ads', 'f'); //add data\n        addBData('id', 'masthead-ad', 'f');\n        addBData('path', '#YtKevlarVisibilityIdentifier', 'f');\n        addBData('class', 'ytp-ad-overlay-container', 'a');\n        addBData('csClick', [\n            ['ytp-ad-feedback-dialog-reason-input', 'randomPara(0, 2)'],\n            ['ytp-ad-feedback-dialog-confirm-button', '0'], 1\n        ], 'f');\n        addBData('csClick', [\n            ['ytp-ad-skip-button', '0'], 0\n        ], 'a');\n        addBData('tag', 'ytd-display-ad-renderer', 'a');\n        addBData(\"exe\", \"skipShitVideoAD();\", 'f');\n        addBData(\"exe\", \"addBlockText();\", 'f');\n        addBData(\"remTactic1\", [\"badge-style-type-ad\", 7, \"ytd-section-list-renderer\"], 'f');\n        addBData(\"remTactic1\", [\"badge-style-type-ad\", 5, \"ytd-item-section-renderer\"], 'f');\n        addBData(\"remTactic1\", [\"badge-style-type-ad\", 5, \"ytd-watch-next-secondary-results-renderer\"], 'f');\n\n        executeManager(); //execute at first time\n    }\n\n\n    /**\n     * @param {String} exePara (undefined) or ('f' => execute the data for 20 times, every time interval 500ms )\n     * */\n    function executeManager(exePara) {\n        let len = rmAry.length;\n\n        for (let i = 0; i \u003C len; i++) {\n            if (rmAry[i][2] == 'a' && exePara == undefined) {\n\n                setInterval(() => {\n                    // console.log(\"[YT AD block] Execute remove insert AD loop\");\n                    execute(); //always execute the data\n                }, 800);\n\n            } else if (rmAry[i][2] == 'f' || exePara == 'f') { //execute only in first time\n\n                // console.log(\"[YT AD block] Execute remove AD\");\n\n                window.onload = function () { intervalExecute(); } //if player already load\n                if (exePara == 'f') { intervalExecute(); }\n                intervalExecute();\n\n                function intervalExecute() {\n                    let times = 0;\n                    let timer = setInterval(() => {\n                        times++;\n                        if (times > 20) { clearInterval(timer); };\n                        execute(); //excute 20 times in every 500ms\n                    }, 500);\n                }\n            }\n\n            function execute() {\n                let isUniExeTag = rmAry[i][0] == \"universal\"; //Check is universal tag or not\n                if (!isUniExeTag) {\n                    let exeTag = rmAry[i][0]; //Execute Type\n                    let exeData = rmAry[i][1]; //Data container of execute type\n                    executeBase(exeTag, exeData);\n                } else {\n                    //[Beta] Execute Type: universal\n                    // let exeLength = rmAry[i][1].length;\n                    // for (let layeri = 0; layeri \u003C exeLength; layeri++) {\n                    //     let layerExeData = rmAry[i][1][layeri];\n                    //     let exeTag = layerExeData[0];\n                    //     let exeData = layerExeData[1];\n                    //     executeBase(layerExeData, exeTag, exeData);\n                    // }\n                };\n            }\n\n\n            function executeBase(exeTag, exeData) {\n                let cckClassDataPosi, cckType, cckCs;\n                switch (exeTag) {\n                    case 'id':\n                        idRm(exeData);\n                        break;\n                    case 'path':\n                        pathRm(exeData);\n                        break;\n                    case 'class':\n                        classRm(exeData);\n                        break;\n                    case 'csClick':\n                        {\n                            len = rmAry[i][1].length - 1; //find last one num\n                            cckClassDataPosi = rmAry[i][1][len];\n                            cckType = rmAry[i][1][len].constructor;\n\n                            if (cckType == Number) {\n                                cckCs = rmAry[i][1][cckClassDataPosi][0];\n                            } else if (cckType == String) {\n                                cckCs = rmAry[i][1][2];\n                            }\n\n                            csClick(cckCs, rmAry[i][1]);\n                            break;\n                        }\n                    case 'tag':\n                        tagRm(exeData);\n                        break;\n                    case 'exe':\n                        { dataExe(exeData); }\n                        break;\n                    case 'remTactic1':\n                        {\n                            let className = exeData[0];\n                            let parentNum = exeData[1];\n                            let expParentClassName = exeData[2];\n                            remTactic1(className, parentNum, expParentClassName);\n                        }\n                        break;\n                }\n            }\n        }\n    }\n\n    function addUniData(d2, d3) {\n        addBData('universal', d2, d3);\n    }\n\n    function addExeData(d2, d3) {\n        addBData('exe', d2, d3);\n    }\n\n    /**\n     * @param d1 - Execute Type: 'id' => Use document.getElementById() to remove\n     * @param d1 - Execute Type: 'path' => Use document.querySelector() to remove\n     * @param d1 - Execute Type: 'class' => Use document.getElementsByClassName() to remove \n     * @param d1 - Execute Type: 'csClick' => css click event\n     * @param d1 - Execute Type: 'tag' => Use document.getElementsByTagName() to remove\n     * @param d1 - Execute Type: 'exe' => Use eval to execute the code\n     * @param d1 - Execute Type: 'remTactic1' => See remTactic1();\n     * @param d2 - Data container of d1 execute type\n     * @param d3 - 'a' => Always execute the data, interval 800ms\n     * @param d3 - 'f' => First execute the data for 20 times, every time interval 500ms\n     */\n    function addBData(d1, d2, d3) {\n        let len = apdAry(rmAry);\n        rmAry[len][0] = d1;\n        rmAry[len][1] = d2;\n        rmAry[len][2] = d3;\n        rmAry[len][3] = rmAry.length - 1;\n    }\n\n    /**\n     * By finding a className to find higher level of its parent element by class name and remove it\n     * @param {String} className The child node class name (signature class name recommend)\n     * @param {Number} parentNum How many node layers it parent elements have to get className(child node)\n     * @param {String} expParentClassName The parent node class name(signature class name recommend)\n     */\n    function remTactic1(className, parentNum, expParentClassName) {\n        var sl_length = document.getElementsByClassName(className).length;\n        if (sl_length != 0) {\n            if (parentNum == 0) {\n                var len = document.getElementsByClassName(className).length;\n                for (let i = 0; i \u003C len; i++) {\n                    document.getElementsByClassName(className)[0].remove();\n                }\n            } else {\n                for (var s_i = 0; s_i \u003C sl_length; s_i++) {\n                    var parent = \".parentElement\";\n                    var finalParent = \"\";\n                    for (var p_i = 0; p_i \u003C parentNum; p_i++) {\n                        finalParent = finalParent + parent;\n                    }\n\n                    //Find the parent name\n                    var parentNode = \"document.getElementsByClassName('\" + className + \"')[0]\" + finalParent;\n                    var parentNodeClassListLength = eval(parentNode + \".classList.length\");\n                    var isParentClassName = false;\n                    for (let ii = 0; ii \u003C parentNodeClassListLength; ii++) {\n                        var parentClassName = eval(parentNode + \".classList[\" + ii + \"]\");\n                        if (parentClassName == expParentClassName) {\n                            isParentClassName = true;\n                            break;\n                        }\n                    }\n\n                    if (isParentClassName) {\n                        eval(\"document.getElementsByClassName('\" + className + \"')[0]\" + finalParent + \".remove();\");\n                        remTactic1(className, parentNum, expParentClassName);\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    function csClick(cckCs, exAry) {\n        if (document.getElementsByClassName(cckCs).length != 0) {\n            let len = exAry.length;\n            for (let i = 0; i \u003C len; i++) {\n                if (exAry[i].constructor != Array) { break; } //cck data type\n                document.getElementsByClassName(exAry[i][0])[eval(exAry[i][1])].click(); //choose feedback option\n            }\n        }\n    }\n\n    function classRm(_class) {\n        let times = 0;\n        while (document.getElementsByClassName(_class).length != 0) {\n            times++;\n            if (times > 100) { break; }\n            document.getElementsByClassName(_class)[0].remove();\n        }\n    }\n\n    function idRm(id) {\n        if (document.getElementById(id) != null) {\n            document.getElementById(id).remove();\n        }\n    }\n\n    function pathRm(path) {\n        if (document.querySelector(path) != null) {\n            document.querySelector(path).remove();\n        }\n    }\n\n    function tagRm(tag) {\n        let times = 0;\n        while (document.getElementsByTagName(tag).length != 0) {\n            times++;\n            if (times > 100) { break; }\n            document.getElementsByTagName(tag)[0].parentNode.parentNode.remove();\n        }\n    }\n\n    function dataExe(exeData) {\n        if (exeData) {\n            let isArray = exeData.constructor == Array;\n            if (!isArray) {\n                eval(exeData);\n            } else {\n                //[Beta Test] Execute Type: universal\n                if (exeData[0]) {\n                    let finalData = exeData[0] + exeData[1];\n                    eval(finalData);\n                }\n            }\n        }\n    }\n\n    function randomPara(min, max) {\n        return Math.floor(Math.random() * (max - min + 1)) + min;\n    }\n\n    function apdAry(ary) {\n        ary.splice(ary.length, 0, []);\n        return ary.length - 1;\n    }\n\n    function addBlockText() {\n        //本屏蔽器自带嘲讽功能[doge]\n        if (document.getElementById(\"ad-text:a\") != (null || undefined)) { document.getElementById(\"ad-text:a\").innerHTML = \"Trying Blocking AD...\"; }\n        if (document.getElementById(\"ad-text:b\") != (null || undefined)) { document.getElementById(\"ad-text:b\").innerHTML = \"[Youtube AD block]\"; }\n        let blockText = document.getElementsByClassName(\"ytp-ad-button-text\");\n        if (blockText.length != 0) {\n            for (let i = 0; i \u003C blockText.length; i++) {\n                blockText[i].innerHTML = \"Blocking...\"\n            }\n        }\n    }\n\n    var isCallSkipShitVideoAD = false;\n\n    function skipShitVideoAD() {\n        if (document.getElementsByClassName(\"ytp-ad-button-icon\").length != 0 && !isCallSkipShitVideoAD && !document.getElementsByClassName('ytp-ad-skip-button').length != 0) {\n            console.log(\"进入执行\");\n\n            isCallSkipShitVideoAD = true; //set identifier as true to avoid call this function again\n\n            console.log(\"===>\", new DocumentTimeline().currentTime);\n\n            //Open the shit ad card\n            document.getElementsByClassName(\"ytp-ad-button-icon\")[0].click();\n\n            // Wait the card load\n            let shitIframeTimes = 0;\n            let iframeDomPosi = 0; //find the iframe document posi \n            let shitIframeTimer = setInterval(function () {\n                shitIframeTimes++;\n\n                setDisplay(\"none\");\n\n                if (document.getElementById(\"iframe\") != (null || undefined) || shitIframeTimes > 50) {\n                    console.log(\"[YT] Detected the ad penel\");\n                    //find the iframe document posi \n                    for (let i = 0; i \u003C window.frames.length; i++) {\n                        let frameId = \"iframe\";\n                        try {\n                            if (window.frames[i].frameElement.id == frameId) {\n                                iframeDomPosi = i;\n                                break;\n                            }\n                        } catch (e) { /*console.log(e);*/ }\n                    }\n                    clearInterval(shitIframeTimer);\n                }\n            }, 40);\n\n            //Wait for document loaded\n            var waitCardTimes = 0;\n            let frameDom;\n            let waitCardTimer = setInterval(() => {\n                waitCardTimes++;\n\n                let bodyNodesLength = 0; //iframe body length of child node\n                try {\n                    bodyNodesLength = window.frames[iframeDomPosi].document.body.childNodes.length;\n                } catch { }\n\n                if (waitCardTimes > 100 || bodyNodesLength != 0) {\n                    clearInterval(waitCardTimer);\n\n                    //get the iframe document\n                    frameDom = window.frames[iframeDomPosi].document;\n                    try {\n                        let shitStopDisplayBtn = frameDom.childNodes[1].childNodes[1].childNodes[2].childNodes[0].childNodes[0].childNodes[1].childNodes[1].childNodes[0].childNodes[0].childNodes[0].childNodes[0].childNodes[1].childNodes[1].childNodes[0].childNodes[0];\n                        shitStopDisplayBtn.click();\n\n                        let deleteClickTimes = 0;\n                        let deleteClickTimer = setInterval(() => {\n                            deleteClickTimes++;\n                            let isCatchErr = false;\n                            try {\n                                let clickStopAdBtn = frameDom.childNodes[1].childNodes[1].childNodes[9].childNodes[0].childNodes[1].childNodes[1].childNodes[0].childNodes[0].childNodes[1].childNodes[1].childNodes[0];\n                                clickStopAdBtn.click();\n                                console.log(\"获取到移除按钮，移除===>\", clickStopAdBtn);\n                            } catch (e) {\n                                isCatchErr = true;\n                                console.log(\"错误捕获\");\n                            }\n\n                            if (deleteClickTimes > 100 || isCatchErr == false) {\n                                clearInterval(deleteClickTimer);\n                                console.log(\"===>\", new DocumentTimeline().currentTime);\n                            }\n                        }, 100);\n                    } catch (e) { console.log(\"2\", e); }\n                }\n            }, 100);\n\n            //close the card\n            let checkCloseTimes = 0;\n            let checkCloseTimer = setInterval(() => {\n                checkCloseTimes++;\n\n                var alreadyRemoveDisplay = \"none\";\n                try {\n                    alreadyRemoveDisplay = getComputedStyle(frameDom.childNodes[1].childNodes[1].childNodes[2].childNodes[0].childNodes[0].childNodes[1].childNodes[0]).display;\n                } catch { }\n\n                if (alreadyRemoveDisplay != \"none\" || checkCloseTimes > 200) {\n                    console.log(\"close card\");\n                    clearInterval(checkCloseTimer);\n                    //* close the card\n                    let closeShitPanelBtn = frameDom.childNodes[1].childNodes[1].childNodes[2].childNodes[0].childNodes[0].childNodes[0].childNodes[2].childNodes[0].childNodes[0];\n                    closeShitPanelBtn.click();\n                    //* reset the backdrop, setTimeout didn't effect the use.\n                    setTimeout(() => {\n                        document.getElementsByTagName(\"tp-yt-iron-overlay-backdrop\")[0].style.display = \"\";\n                        console.log(\"reback display\");\n                    }, 1000);\n                }\n            }, 100);\n\n            function setDisplay(str) {\n                //* Set the shit backdrop display \"none\" or \"\"\n                try { document.getElementsByTagName(\"tp-yt-iron-overlay-backdrop\")[0].style.display = str; } catch { }\n\n                //* Set the shit ad card display \"none\" or \"\"\n                try { document.getElementById(\"iframe\").parentNode.parentNode.style.display = str; } catch { }\n            }\n        }\n    }\n})();"}/!extdb.@st#1df1506d-32dc-4944-8cb4-ded03b87bf3e?{"origin":"normal","value":{"data":{},"ts":1.773565473347e+12}}0!extdb.@uid#1df1506d-32dc-4944-8cb4-ded03b87bf3e|{"origin":"normal","value":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."}´~451          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eԣ{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block ôh
“Q-all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565470492e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/db512680-e0cc-4d2c-bbbe-e503b74173f7"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}1!extdb.@meta#85ed5048-b1a5-4df0-ae71-bb1d35c341c9º {"origin":"normal","value":{"antifeatures":{},"author":null,"blockers":[],"connects":[],"copyright":null,"deleted":1.773565482596e+12,"description":"A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.","description_i18n":{"zh_CN":"脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。","zh_HK":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_MO":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_TW":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。"},"downloadURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","enabled":true,"evilness":0,"excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"fileURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         youtube-adb\n// @name:zh-CN   YouTube去广告\n// @name:zh-TW   YouTube去廣告\n// @name:zh-HK   YouTube去廣告\n// @name:zh-MO   YouTube去廣告\n// @namespace    https://github.com/iamfugui/youtube-adb\n// @version      6.21\n// @description         A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.\n// @description:zh-CN   脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。\n// @description:zh-TW   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-HK   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-MO   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @match        *://*.youtube.com/*\n// @exclude      *://accounts.youtube.com/*\n// @exclude      *://www.youtube.com/live_chat_replay*\n// @exclude      *://www.youtube.com/persist_identity*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=YouTube.com\n// @grant        none\n// @license MIT\n// @downloadURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js\n// @updateURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=YouTube.com","icon64":null,"includes":[],"lastModified":1.773565287144e+12,"matches":["*://*.youtube.com/*"],"name":"youtube-adb","name_i18n":{"zh_CN":"YouTube去广告","zh_HK":"YouTube去廣告","zh_MO":"YouTube去廣告","zh_TW":"YouTube去廣告"},"namespace":"https://github.com/iamfugui/youtube-adb","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":9.007199254740991e+15,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/89d8c285-2d34-4d37-9e17-119c376de312"}},"updateURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js","uuid":"85ed5048-b1a5-4df0-ae71-bb1d35c341c9","version":"6.21","webRequest":null}}›‹ÄÛR3          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eԣ{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}=Â$„ 4          1!extdb.@meta#f1d1ab07-73c3-4977-acbc-a09f0248670e¬6{"origin":"normal","value":{"antifeatures":{},"author":"YouhouLab",uĠ?ù:"blockers":[],"connects":["www.saveanyyoutube.com"],"copyright":null,"description":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","description_i18n":{"en":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","es":"Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios","ja":"YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし","pt":"Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios","zh_CN":"YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载"},"downloadURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","grant":["GM_addStyle","GM_xmlhttpRequest","GM_getValue","GM_setValue"],"header":"// ==UserScript==\n// @name         YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥\n// @name:zh-CN   YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥\n// @name:en      YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥\n// @name:ja      YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥\n// @name:es      Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥\n// @name:pt      Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥\n// @namespace    http://tampermonkey.net/\n// @version      0.4\n// @description  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:en  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:zh-CN YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载\n// @description:ja  YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし\n// @description:es  Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios\n// @description:pt  Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios\n// @author       YouhouLab\n// @license      MIT\n// @match        *://*.youtube.com/*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @grant        GM_addStyle\n// @grant        GM_xmlhttpRequest\n// @grant        GM_getValue\n// @grant        GM_setValue\n// @connect      www.saveanyyoutube.com\n// @run-at       document-start\n// @supportURL   https://saveanyyoutube.com\n// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11\n// @compatible   chrome\n// @compatible   firefox\n// @compatible   opera\n// @compatible   edge\n// @compatible   safari\n// @keywords     youtube, download, video, audio, subtitle, shorts, hd, 1080p, 2k, 4k, free, no ads, ad blocker, ad free, remove ads, block ads, addyoutube, 油管, 视频下载, 字幕下载, 高清视频, 免费下载, 无广告, 去广告, 广告拦截, YouTube下载器, 短视频下载, ユーチューブ, ダウンロード, 動画保存, 字幕, 高画質, 無料, 広告ブロック, 広告なし, 유튜브, 다운로드, 동영상, 자막, 고화질, 무료, 광고 차단\n// @downloadURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js\n// @updateURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773565599129e+12,"matches":["*://*.youtube.com/*"],"name":"YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥","name_i18n":{"en":"YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥","es":"Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥","ja":"YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥","pt":"Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥","zh_CN":"YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥"},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.saveanyyoutube.com"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/522662/","unsafe_url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}],"resources":[],"supportURL":"https://saveanyyoutube.com","sync":{},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/9aaf5952-f42c-40d9-9623-3598a1edbc8e"}},"updateURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js","uuid":"f1d1ab07-73c3-4977-acbc-a09f0248670e","version":"0.4","webRequest":null}}/!extdb.@re#f1d1ab07-73c3-4977-acbc-a09f0248670eO{"origin":"normal","value":{"exc":[],"inc":[],"match":["*://*.youtube.com/*"]}}3!extdb.@source#f1d1ab07-73c3-4977-acbc-a09f0248670eÊ<{"origin":"normal","value":"// ==UserScript==\n// @name         YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥\n// @name:zh-CN   YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥\n// @name:en      YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥\n// @name:ja      YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥\n// @name:es      Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥\n// @name:pt      Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥\n// @namespace    http://tampermonkey.net/\n// @version      0.4\n// @description  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:en  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:zh-CN YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载\n// @description:ja  YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし\n// @description:es  Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios\n// @description:pt  Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios\n// @author       YouhouLab\n// @license      MIT\n// @match        *://*.youtube.com/*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @grant        GM_addStyle\n// @grant        GM_xmlhttpRequest\n// @grant        GM_getValue\n// @grant        GM_setValue\n// @connect      www.saveanyyoutube.com\n// @run-at       document-start\n// @supportURL   https://saveanyyoutube.com\n// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11\n// @compatible   chrome\n// @compatible   firefox\n// @compatible   opera\n// @compatible   edge\n// @compatible   safari\n// @keywords     youtube, download, video, audio, subtitle, shorts, hd, 1080p, 2k, 4k, free, no ads, ad blocker, ad free, remove ads, block ads, addyoutube, 油管, 视频下载, 字幕下载, 高清视频, 免费下载, 无广告, 去广告, 广告拦截, YouTube下载器, 短视频下载, ユーチューブ, ダウンロード, 動画保存, 字幕, 高画質, 無料, 広告ブロック, 広告なし, 유튜브, 다운로드, 동영상, 자막, 고화질, 무료, 광고 차단\n// @downloadURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js\n// @updateURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js\n// ==/UserScript==\n \n(function() {\n    'use strict';\n\n    const i18n = {\n        'zh': {\n            downloadText: 'Free Download',\n            error: {\n                addNormalButton: '添加普通下载按钮时出错:',\n                addShortsButton: '添加Shorts下载按钮时出错:'\n            }\n        },\n        'en': {\n            downloadText: 'Free Download',\n            error: {\n                addNormalButton: 'Error adding normal download button:',\n                addShortsButton: 'Error adding Shorts download button:'\n            }\n        },\n        'ja': {\n            downloadText: '無料ダウンロード',\n            error: {\n                addNormalButton: '通常ダウンロードボタンの追加エラー:',\n                addShortsButton: 'Shortsダウンロードボタンの追加エラー:'\n            }\n        },\n        'es': {\n            downloadText: 'Descarga Gratis',\n            error: {\n                addNormalButton: 'Error al agregar botón de descarga normal:',\n                addShortsButton: 'Error al agregar botón de descarga Shorts:'\n            }\n        },\n        'pt': {\n            downloadText: 'Download Grátis',\n            error: {\n                addNormalButton: 'Erro ao adicionar botão de download normal:',\n                addShortsButton: 'Erro ao adicionar botão de download Shorts:'\n            }\n        }\n    };\n\n    GM_addStyle(`\n        .youhou-download-btn {\n            background: rgb(242, 242, 242);\n            border: none;\n            border-radius: 18px;\n            color: #0f0f0f;\n            padding: 0 16px;\n            height: 36px;\n            cursor: pointer;\n            font-size: 14px;\n            font-weight: 500;\n            white-space: nowrap;\n            margin-right: 8px;\n            display: inline-flex;\n            align-items: center;\n            vertical-align: middle;\n        }\n        .youhou-download-btn:hover {\n            background: rgb(230, 230, 230);\n        }\n    `);\n\n    function waitForElement(selector, callback, maxTries = 10) {\n        let tries = 0;\n\n        function check() {\n            const element = document.querySelector(selector);\n            if (element) {\n                callback(element);\n                return;\n            }\n\n            tries++;\n            if (tries \u003C maxTries) {\n                setTimeout(check, 1000);\n            }\n        }\n\n        check();\n    }\n\n    function createDownloadButton() {\n        if (document.querySelector('.youhou-download-btn')) {\n            return;\n        }\n\n        const downloadButton = document.createElement('button');\n        downloadButton.className = 'youhou-download-btn';\n        downloadButton.textContent = i18n['zh'].downloadText;\n\n        downloadButton.addEventListener('click', function() {\n            const videoUrl = window.location.href;\n            const downloadDomains = ['saveanyyoutube.com'];\n            const randomDomain = downloadDomains[Math.floor(Math.random() * downloadDomains.length)];\n            const newUrl = videoUrl.replace('youtube.com', randomDomain);\n            window.open(newUrl, '_blank');\n        });\n\n        return downloadButton;\n    }\n\n    function tryAddButton() {\n        const selectors = [\n            '#top-level-buttons-computed',\n            'ytd-menu-renderer .top-level-buttons',\n            '#actions ytd-menu-renderer'\n        ];\n\n        function attemptInsert() {\n            if (document.querySelector('.youhou-download-btn')) return;\n\n            for (const selector of selectors) {\n                const container = document.querySelector(selector);\n                if (container) {\n                    const downloadButton = createDownloadButton();\n                    if (!downloadButton) return;\n                    container.insertBefore(downloadButton, container.firstChild);\n                    return;\n                }\n            }\n        }\n\n        waitForElement(selectors[0], attemptInsert);\n        setTimeout(attemptInsert, 2000);\n        setTimeout(attemptInsert, 4000);\n    }\n\n    document.addEventListener('yt-navigate-finish', function() {\n        if (window.location.pathname.includes('/watch')) {\n            setTimeout(tryAddButton, 1000);\n        }\n    });\n\n    if (window.location.pathname.includes('/watch')) {\n        setTimeout(tryAddButton, 1000);\n    }\n\n})();\n"}/!extdb.@st#f1d1ab07-73c3-4977-acbc-a09f0248670e?{"origin":"normal","value":{"data":{},"ts":1.773565601596e+12}}0!extdb.@uid#f1d1ab07-73c3-4977-acbc-a09f0248670ej{"origin":"normal","value":"YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥"}OCRaùD9          Q!extdb.@ext#f1d1ab07-73c3-4977-acbc-a09f0248670e:c8895af888fbb02d356595db8c356581ÌÅ{"origin":"normal","value":{"resource":{"base":"LyohCiogc3dlZXRhbGVydDIgdjExLjI2LjIyCiogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgoqLwohZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5Td2VldGFsZXJ0Mj10KCl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZT09PXQ6ZS5oYXModCkpcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mz90Om47dGhyb3cgbmV3IFR5cGVFcnJvcigiUHJpdmF0ZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9uIHRoaXMgb2JqZWN0Iil9ZnVuY3Rpb24gdCh0LG4pe3JldHVybiB0LmdldChlKHQsbikpfWZ1bmN0aW9uIG4oZSx0LG4peyhmdW5jdGlvbihlLHQpe2lmKHQuaGFzKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbml0aWFsaXplIHRoZSBzYW1lIHByaXZhdGUgZWxlbWVudHMgdHdpY2Ugb24gYW4gb2JqZWN0Iil9KShlLHQpLHQuc2V0KGUsbil9Y29uc3Qgbz17fSxpPWU9Pm5ldyBQcm9taXNlKHQ9PntpZighZSlyZXR1cm4gdCgpO2NvbnN0IG49d2luZG93LnNjcm9sbFgsaT13aW5kb3cuc2Nyb2xsWTtvLnJlc3RvcmVGb2N1c1RpbWVvdXQ9c2V0VGltZW91dCgoKT0+e28ucHJldmlvdXNBY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ/KG8ucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCksby5wcmV2aW91c0FjdGl2ZUVsZW1lbnQ9bnVsbCk6ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5mb2N1cygpLHQoKX0sMTAwKSx3aW5kb3cuc2Nyb2xsVG8obixpKX0pLHM9InN3YWwyLSIscj1bImNvbnRhaW5lciIsInNob3duIiwiaGVpZ2h0LWF1dG8iLCJpb3NmaXgiLCJwb3B1cCIsIm1vZGFsIiwibm8tYmFja2Ryb3AiLCJuby10cmFuc2l0aW9uIiwidG9hc3QiLCJ0b2FzdC1zaG93biIsInNob3ciLCJoaWRlIiwiY2xvc2UiLCJ0aXRsZSIsImh0bWwtY29udGFpbmVyIiwiYWN0aW9ucyIsImNvbmZpcm0iLCJkZW55IiwiY2FuY2VsIiwiZm9vdGVyIiwiaWNvbiIsImljb24tY29udGVudCIsImltYWdlIiwiaW5wdXQiLCJmaWxlIiwicmFuZ2UiLCJzZWxlY3QiLCJyYWRpbyIsImNoZWNrYm94IiwibGFiZWwiLCJ0ZXh0YXJlYSIsImlucHV0ZXJyb3IiLCJpbnB1dC1sYWJlbCIsInZhbGlkYXRpb24tbWVzc2FnZSIsInByb2dyZXNzLXN0ZXBzIiwiYWN0aXZlLXByb2dyZXNzLXN0ZXAiLCJwcm9ncmVzcy1zdGVwIiwicHJvZ3Jlc3Mtc3RlcC1saW5lIiwibG9hZGVyIiwibG9hZGluZyIsInN0eWxlZCIsInRvcCIsInRvcC1zdGFydCIsInRvcC1lbmQiLCJ0b3AtbGVmdCIsInRvcC1yaWdodCIsImNlbnRlciIsImNlbnRlci1zdGFydCIsImNlbnRlci1lbmQiLCJjZW50ZXItbGVmdCIsImNlbnRlci1yaWdodCIsImJvdHRvbSIsImJvdHRvbS1zdGFydCIsImJvdHRvbS1lbmQiLCJib3R0b20tbGVmdCIsImJvdHRvbS1yaWdodCIsImdyb3ctcm93IiwiZ3Jvdy1jb2x1bW4iLCJncm93LWZ1bGxzY3JlZW4iLCJydGwiLCJ0aW1lci1wcm9ncmVzcy1iYXIiLCJ0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyIiwic2Nyb2xsYmFyLW1lYXN1cmUiLCJpY29uLXN1Y2Nlc3MiLCJpY29uLXdhcm5pbmciLCJpY29uLWluZm8iLCJpY29uLXF1ZXN0aW9uIiwiaWNvbi1lcnJvciIsImRyYWdnYWJsZSIsImRyYWdnaW5nIl0ucmVkdWNlKChlLHQpPT4oZVt0XT1zK3QsZSkse30pLGE9WyJzdWNjZXNzIiwid2FybmluZyIsImluZm8iLCJxdWVzdGlvbiIsImVycm9yIl0ucmVkdWNlKChlLHQpPT4oZVt0XT1zK3QsZSkse30pLGw9IlN3ZWV0QWxlcnQyOiIsYz1lPT5lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksdT1lPT57Y29uc29sZS53YXJuKGAke2x9ICR7Im9iamVjdCI9PXR5cGVvZiBlP2Uuam9pbigiICIpOmV9YCl9LGQ9ZT0+e2NvbnNvbGUuZXJyb3IoYCR7bH0gJHtlfWApfSxwPVtdLG09KGUsdD1udWxsKT0+e3ZhciBuO249YCIke2V9IiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4ke3Q/YCBVc2UgIiR7dH0iIGluc3RlYWQuYDoiIn1gLHAuaW5jbHVkZXMobil8fChwLnB1c2gobiksdShuKSl9LGg9ZT0+ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSgpOmUsZz1lPT5lJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b1Byb21pc2UsZj1lPT5nKGUpP2UudG9Qcm9taXNlKCk6UHJvbWlzZS5yZXNvbHZlKGUpLGI9ZT0+ZSYmUHJvbWlzZS5yZXNvbHZlKGUpPT09ZSx5PSgpPT5kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IoYC4ke3IuY29udGFpbmVyfWApLHY9ZT0+e2NvbnN0IHQ9eSgpO3JldHVybiB0P3QucXVlcnlTZWxlY3RvcihlKTpudWxsfSx3PWU9PnYoYC4ke2V9YCksQz0oKT0+dyhyLnBvcHVwKSxBPSgpPT53KHIuaWNvbiksRT0oKT0+dyhyLnRpdGxlKSxrPSgpPT53KHJbImh0bWwtY29udGFpbmVyIl0pLEI9KCk9Pncoci5pbWFnZSksJD0oKT0+dyhyWyJwcm9ncmVzcy1zdGVwcyJdKSxMPSgpPT53KHJbInZhbGlkYXRpb24tbWVzc2FnZSJdKSxQPSgpPT52KGAuJHtyLmFjdGlvbnN9IC4ke3IuY29uZmlybX1gKSx4PSgpPT52KGAuJHtyLmFjdGlvbnN9IC4ke3IuY2FuY2VsfWApLFQ9KCk9PnYoYC4ke3IuYWN0aW9uc30gLiR7ci5kZW55fWApLFM9KCk9PnYoYC4ke3IubG9hZGVyfWApLE89KCk9Pncoci5hY3Rpb25zKSxNPSgpPT53KHIuZm9vdGVyKSxIPSgpPT53KHJbInRpbWVyLXByb2dyZXNzLWJhciJdKSxqPSgpPT53KHIuY2xvc2UpLEk9KCk9Pntjb25zdCBlPUMoKTtpZighZSlyZXR1cm5bXTtjb25zdCB0PWUucXVlcnlTZWxlY3RvckFsbCgnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PSItMSJdKTpub3QoW3RhYmluZGV4PSIwIl0pJyksbj1BcnJheS5mcm9tKHQpLnNvcnQoKGUsdCk9Pntjb25zdCBuPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHwiMCIpLG89cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iil8fCIwIik7cmV0dXJuIG4+bz8xOm48bz8tMTowfSksbz1lLnF1ZXJ5U2VsZWN0b3JBbGwoJ1xuICBhW2hyZWZdLFxuICBhcmVhW2hyZWZdLFxuICBpbnB1dDpub3QoW2Rpc2FibGVkXSksXG4gIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksXG4gIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSxcbiAgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxcbiAgaWZyYW1lLFxuICBvYmplY3QsXG4gIGVtYmVkLFxuICBbdGFiaW5kZXg9IjAiXSxcbiAgW2NvbnRlbnRlZGl0YWJsZV0sXG4gIGF1ZGlvW2NvbnRyb2xzXSxcbiAgdmlkZW9bY29udHJvbHNdLFxuICBzdW1tYXJ5XG4nKSxpPUFycmF5LmZyb20obykuZmlsdGVyKGU9PiItMSIhPT1lLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7cmV0dXJuWy4uLm5ldyBTZXQobi5jb25jYXQoaSkpXS5maWx0ZXIoZT0+ZWUoZSkpfSxEPSgpPT5OKGRvY3VtZW50LmJvZHksci5zaG93bikmJiFOKGRvY3VtZW50LmJvZHksclsidG9hc3Qtc2hvd24iXSkmJiFOKGRvY3VtZW50LmJvZHksclsibm8tYmFja2Ryb3AiXSksVj0oKT0+e2NvbnN0IGU9QygpO3JldHVybiEhZSYmTihlLHIudG9hc3QpfSxxPShlLHQpPT57aWYoZS50ZXh0Q29udGVudD0iIix0KXtjb25zdCBuPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC9odG1sIiksbz1uLnF1ZXJ5U2VsZWN0b3IoImhlYWQiKTtvJiZBcnJheS5mcm9tKG8uY2hpbGROb2RlcykuZm9yRWFjaCh0PT57ZS5hcHBlbmRDaGlsZCh0KX0pO2NvbnN0IGk9bi5xdWVyeVNlbGVjdG9yKCJib2R5Iik7aSYmQXJyYXkuZnJvbShpLmNoaWxkTm9kZXMpLmZvckVhY2godD0+e3QgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50fHx0IGluc3RhbmNlb2YgSFRNTEF1ZGlvRWxlbWVudD9lLmFwcGVuZENoaWxkKHQuY2xvbmVOb2RlKCEwKSk6ZS5hcHBlbmRDaGlsZCh0KX0pfX0sTj0oZSx0KT0+e2lmKCF0KXJldHVybiExO2NvbnN0IG49dC5zcGxpdCgvXHMrLyk7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0KyspaWYoIWUuY2xhc3NMaXN0LmNvbnRhaW5zKG5bdF0pKXJldHVybiExO3JldHVybiEwfSxfPShlLHQsbik9PntpZigoKGUsdCk9PntBcnJheS5mcm9tKGUuY2xhc3NMaXN0KS5mb3JFYWNoKG49PntPYmplY3QudmFsdWVzKHIpLmluY2x1ZGVzKG4pfHxPYmplY3QudmFsdWVzKGEpLmluY2x1ZGVzKG4pfHxPYmplY3QudmFsdWVzKHQuc2hvd0NsYXNzfHx7fSkuaW5jbHVkZXMobil8fGUuY2xhc3NMaXN0LnJlbW92ZShuKX0pfSkoZSx0KSwhdC5jdXN0b21DbGFzcylyZXR1cm47Y29uc3Qgbz10LmN1c3RvbUNsYXNzW25dO28mJigic3RyaW5nIj09dHlwZW9mIG98fG8uZm9yRWFjaD96KGUsbyk6dShgSW52YWxpZCB0eXBlIG9mIGN1c3RvbUNsYXNzLiR7bn0hIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCAiJHt0eXBlb2Ygb30iYCkpfSxSPShlLHQpPT57aWYoIXQpcmV0dXJuIG51bGw7c3dpdGNoKHQpe2Nhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpjYXNlImZpbGUiOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoYC4ke3IucG9wdXB9ID4gLiR7clt0XX1gKTtjYXNlImNoZWNrYm94IjpyZXR1cm4gZS5xdWVyeVNlbGVjdG9yKGAuJHtyLnBvcHVwfSA+IC4ke3IuY2hlY2tib3h9IGlucHV0YCk7Y2FzZSJyYWRpbyI6cmV0dXJuIGUucXVlcnlTZWxlY3RvcihgLiR7ci5wb3B1cH0gPiAuJHtyLnJhZGlvfSBpbnB1dDpjaGVja2VkYCl8fGUucXVlcnlTZWxlY3RvcihgLiR7ci5wb3B1cH0gPiAuJHtyLnJhZGlvfSBpbnB1dDpmaXJzdC1jaGlsZGApO2Nhc2UicmFuZ2UiOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoYC4ke3IucG9wdXB9ID4gLiR7ci5yYW5nZX0gaW5wdXRgKTtkZWZhdWx0OnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoYC4ke3IucG9wdXB9ID4gLiR7ci5pbnB1dH1gKX19LEY9ZT0+e2lmKGUuZm9jdXMoKSwiZmlsZSIhPT1lLnR5cGUpe2NvbnN0IHQ9ZS52YWx1ZTtlLnZhbHVlPSIiLGUudmFsdWU9dH19LFU9KGUsdCxuKT0+e2UmJnQmJigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKSksdC5mb3JFYWNoKHQ9PntBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaChlPT57bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSkpfSx6PShlLHQpPT57VShlLHQsITApfSxXPShlLHQpPT57VShlLHQsITEpfSxLPShlLHQpPT57Y29uc3Qgbj1BcnJheS5mcm9tKGUuY2hpbGRyZW4pO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCBvPW5bZV07aWYobyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZOKG8sdCkpcmV0dXJuIG99fSxZPShlLHQsbik9PntuPT09YCR7cGFyc2VJbnQoYCR7bn1gKX1gJiYobj1wYXJzZUludChuKSksbnx8MD09PXBhcnNlSW50KGAke259YCk/ZS5zdHlsZS5zZXRQcm9wZXJ0eSh0LCJudW1iZXIiPT10eXBlb2Ygbj9gJHtufXB4YDpuKTplLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSxYPShlLHQ9ImZsZXgiKT0+e2UmJihlLnN0eWxlLmRpc3BsYXk9dCl9LFo9ZT0+e2UmJihlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSj0oZSx0PSJibG9jayIpPT57ZSYmbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9PntRKGUsZS5pbm5lckhUTUwsdCl9KS5vYnNlcnZlKGUse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9LEc9KGUsdCxuLG8pPT57Y29uc3QgaT1lLnF1ZXJ5U2VsZWN0b3IodCk7aSYmaS5zdHlsZS5zZXRQcm9wZXJ0eShuLG8pfSxRPShlLHQsbj0iZmxleCIpPT57dD9YKGUsbik6WihlKX0sZWU9ZT0+Qm9vbGVhbihlJiYoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKSx0ZT1lPT5Cb29sZWFuKGUuc2Nyb2xsSGVpZ2h0PmUuY2xpZW50SGVpZ2h0KSxuZT1lPT57Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxuPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tZHVyYXRpb24iKXx8IjAiKSxvPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIil8fCIwIik7cmV0dXJuIG4+MHx8bz4wfSxvZT0oZSx0PSExKT0+e2NvbnN0IG49SCgpO24mJmVlKG4pJiYodCYmKG4uc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsbi5zdHlsZS53aWR0aD0iMTAwJSIpLHNldFRpbWVvdXQoKCk9PntuLnN0eWxlLnRyYW5zaXRpb249YHdpZHRoICR7ZS8xZTN9cyBsaW5lYXJgLG4uc3R5bGUud2lkdGg9IjAlIn0sMTApKX0saWU9YFxuIDxkaXYgYXJpYS1sYWJlbGxlZGJ5PSIke3IudGl0bGV9IiBhcmlhLWRlc2NyaWJlZGJ5PSIke3JbImh0bWwtY29udGFpbmVyIl19IiBjbGFzcz0iJHtyLnBvcHVwfSIgdGFiaW5kZXg9Ii0xIj5cbiAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJHtyLmNsb3NlfSI+PC9idXR0b24+XG4gICA8dWwgY2xhc3M9IiR7clsicHJvZ3Jlc3Mtc3RlcHMiXX0iPjwvdWw+XG4gICA8ZGl2IGNsYXNzPSIke3IuaWNvbn0iPjwvZGl2PlxuICAgPGltZyBjbGFzcz0iJHtyLmltYWdlfSIgLz5cbiAgIDxoMiBjbGFzcz0iJHtyLnRpdGxlfSIgaWQ9IiR7ci50aXRsZX0iPjwvaDI+XG4gICA8ZGl2IGNsYXNzPSIke3JbImh0bWwtY29udGFpbmVyIl19IiBpZD0iJHtyWyJodG1sLWNvbnRhaW5lciJdfSI+PC9kaXY+XG4gICA8aW5wdXQgY2xhc3M9IiR7ci5pbnB1dH0iIGlkPSIke3IuaW5wdXR9IiAvPlxuICAgPGlucHV0IHR5cGU9ImZpbGUiIGNsYXNzPSIke3IuZmlsZX0iIC8+XG4gICA8ZGl2IGNsYXNzPSIke3IucmFuZ2V9Ij5cbiAgICAgPGlucHV0IHR5cGU9InJhbmdlIiAvPlxuICAgICA8b3V0cHV0Pjwvb3V0cHV0PlxuICAgPC9kaXY+XG4gICA8c2VsZWN0IGNsYXNzPSIke3Iuc2VsZWN0fSIgaWQ9IiR7ci5zZWxlY3R9Ij48L3NlbGVjdD5cbiAgIDxkaXYgY2xhc3M9IiR7ci5yYWRpb30iPjwvZGl2PlxuICAgPGxhYmVsIGNsYXNzPSIke3IuY2hlY2tib3h9Ij5cbiAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iJHtyLmNoZWNrYm94fSIgLz5cbiAgICAgPHNwYW4gY2xhc3M9IiR7ci5sYWJlbH0iPjwvc3Bhbj5cbiAgIDwvbGFiZWw+XG4gICA8dGV4dGFyZWEgY2xhc3M9IiR7ci50ZXh0YXJlYX0iIGlkPSIke3IudGV4dGFyZWF9Ij48L3RleHRhcmVhPlxuICAgPGRpdiBjbGFzcz0iJHtyWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXX0iIGlkPSIke3JbInZhbGlkYXRpb24tbWVzc2FnZSJdfSI+PC9kaXY+XG4gICA8ZGl2IGNsYXNzPSIke3IuYWN0aW9uc30iPlxuICAgICA8ZGl2IGNsYXNzPSIke3IubG9hZGVyfSI+PC9kaXY+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJHtyLmNvbmZpcm19Ij48L2J1dHRvbj5cbiAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSIke3IuZGVueX0iPjwvYnV0dG9uPlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IiR7ci5jYW5jZWx9Ij48L2J1dHRvbj5cbiAgIDwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJHtyLmZvb3Rlcn0iPjwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJHtyWyJ0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyIl19Ij5cbiAgICAgPGRpdiBjbGFzcz0iJHtyWyJ0aW1lci1wcm9ncmVzcy1iYXIiXX0iPjwvZGl2PlxuICAgPC9kaXY+XG4gPC9kaXY+XG5gLnJlcGxhY2UoLyhefFxuKVxzKi9nLCIiKSxzZT0oKT0+e28uY3VycmVudEluc3RhbmNlJiZvLmN1cnJlbnRJbnN0YW5jZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCl9LHJlPWU9Pntjb25zdCB0PSgoKT0+e2NvbnN0IGU9eSgpO3JldHVybiEhZSYmKGUucmVtb3ZlKCksVyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFtyWyJuby1iYWNrZHJvcCJdLHJbInRvYXN0LXNob3duIl0sclsiaGFzLWNvbHVtbiJdXSksITApfSkoKTtpZigidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudClyZXR1cm4gdm9pZCBkKCJTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplIik7Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuLmNsYXNzTmFtZT1yLmNvbnRhaW5lcix0JiZ6KG4sclsibm8tdHJhbnNpdGlvbiJdKSxxKG4saWUpLG4uZGF0YXNldC5zd2FsMlRoZW1lPWUudGhlbWU7Y29uc3QgaT0oZT0+e2lmKCJzdHJpbmciPT10eXBlb2YgZSl7Y29uc3QgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpO2lmKCF0KXRocm93IG5ldyBFcnJvcihgVGFyZ2V0IGVsZW1lbnQgIiR7ZX0iIG5vdCBmb3VuZGApO3JldHVybiB0fXJldHVybiBlfSkoZS50YXJnZXR8fCJib2R5Iik7aS5hcHBlbmRDaGlsZChuKSxlLnRvcExheWVyJiYobi5zZXRBdHRyaWJ1dGUoInBvcG92ZXIiLCIiKSxuLnNob3dQb3BvdmVyKCkpLChlPT57Y29uc3QgdD1DKCk7dCYmKHQuc2V0QXR0cmlidXRlKCJyb2xlIixlLnRvYXN0PyJhbGVydCI6ImRpYWxvZyIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLGUudG9hc3Q/InBvbGl0ZSI6ImFzc2VydGl2ZSIpLGUudG9hc3R8fHQuc2V0QXR0cmlidXRlKCJhcmlhLW1vZGFsIiwidHJ1ZSIpKX0pKGUpLChlPT57InJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5kaXJlY3Rpb24mJih6KHkoKSxyLnJ0bCksby5pc1JUTD0hMCl9KShpKSwoKCk9Pntjb25zdCBlPUMoKTtpZighZSlyZXR1cm47Y29uc3QgdD1LKGUsci5pbnB1dCksbj1LKGUsci5maWxlKSxvPWUucXVlcnlTZWxlY3RvcihgLiR7ci5yYW5nZX0gaW5wdXRgKSxpPWUucXVlcnlTZWxlY3RvcihgLiR7ci5yYW5nZX0gb3V0cHV0YCkscz1LKGUsci5zZWxlY3QpLGE9ZS5xdWVyeVNlbGVjdG9yKGAuJHtyLmNoZWNrYm94fSBpbnB1dGApLGw9SyhlLHIudGV4dGFyZWEpO3QmJih0Lm9uaW5wdXQ9c2UpLG4mJihuLm9uY2hhbmdlPXNlKSxzJiYocy5vbmNoYW5nZT1zZSksYSYmKGEub25jaGFuZ2U9c2UpLGwmJihsLm9uaW5wdXQ9c2UpLG8mJmkmJihvLm9uaW5wdXQ9KCk9PntzZSgpLGkudmFsdWU9by52YWx1ZX0sby5vbmNoYW5nZT0oKT0+e3NlKCksaS52YWx1ZT1vLnZhbHVlfSl9KSgpfSxhZT0oZSx0KT0+e2UgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD90LmFwcGVuZENoaWxkKGUpOiJvYmplY3QiPT10eXBlb2YgZT9sZShlLHQpOmUmJnEodCxlKX0sbGU9KGUsdCk9PnsianF1ZXJ5ImluIGU/Y2UodCxlKTpxKHQsZS50b1N0cmluZygpKX0sY2U9KGUsdCk9PntpZihlLnRleHRDb250ZW50PSIiLDAgaW4gdClmb3IobGV0IG49MDtuIGluIHQ7bisrKWUuYXBwZW5kQ2hpbGQodFtuXS5jbG9uZU5vZGUoITApKTtlbHNlIGUuYXBwZW5kQ2hpbGQodC5jbG9uZU5vZGUoITApKX0sdWU9KGUsdCk9Pntjb25zdCBuPU8oKSxvPVMoKTtuJiZvJiYodC5zaG93Q29uZmlybUJ1dHRvbnx8dC5zaG93RGVueUJ1dHRvbnx8dC5zaG93Q2FuY2VsQnV0dG9uP1gobik6WihuKSxfKG4sdCwiYWN0aW9ucyIpLGZ1bmN0aW9uKGUsdCxuKXtjb25zdCBvPVAoKSxpPVQoKSxzPXgoKTtpZighb3x8IWl8fCFzKXJldHVybjtwZShvLCJjb25maXJtIixuKSxwZShpLCJkZW55IixuKSxwZShzLCJjYW5jZWwiLG4pLGZ1bmN0aW9uKGUsdCxuLG8pe2lmKCFvLmJ1dHRvbnNTdHlsaW5nKXJldHVybiB2b2lkIFcoW2UsdCxuXSxyLnN0eWxlZCk7eihbZSx0LG5dLHIuc3R5bGVkKSxvLmNvbmZpcm1CdXR0b25Db2xvciYmZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yIixvLmNvbmZpcm1CdXR0b25Db2xvcik7by5kZW55QnV0dG9uQ29sb3ImJnQuc3R5bGUuc2V0UHJvcGVydHkoIi0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvciIsby5kZW55QnV0dG9uQ29sb3IpO28uY2FuY2VsQnV0dG9uQ29sb3ImJm4uc3R5bGUuc2V0UHJvcGVydHkoIi0tc3dhbDItY2FuY2VsLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yIixvLmNhbmNlbEJ1dHRvbkNvbG9yKTtkZShlKSxkZSh0KSxkZShuKX0obyxpLHMsbiksbi5yZXZlcnNlQnV0dG9ucyYmKG4udG9hc3Q/KGUuaW5zZXJ0QmVmb3JlKHMsbyksZS5pbnNlcnRCZWZvcmUoaSxvKSk6KGUuaW5zZXJ0QmVmb3JlKHMsdCksZS5pbnNlcnRCZWZvcmUoaSx0KSxlLmluc2VydEJlZm9yZShvLHQpKSl9KG4sbyx0KSxxKG8sdC5sb2FkZXJIdG1sfHwiIiksXyhvLHQsImxvYWRlciIpKX07ZnVuY3Rpb24gZGUoZSl7Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKTtpZih0LmdldFByb3BlcnR5VmFsdWUoIi0tc3dhbDItYWN0aW9uLWJ1dHRvbi1mb2N1cy1ib3gtc2hhZG93IikpcmV0dXJuO2NvbnN0IG49dC5iYWNrZ3JvdW5kQ29sb3IucmVwbGFjZSgvcmdiYT9cKChcZCspLCAoXGQrKSwgKFxkKykuKi8sInJnYmEoJDEsICQyLCAkMywgMC41KSIpO2Uuc3R5bGUuc2V0UHJvcGVydHkoIi0tc3dhbDItYWN0aW9uLWJ1dHRvbi1mb2N1cy1ib3gtc2hhZG93Iix0LmdldFByb3BlcnR5VmFsdWUoIi0tc3dhbDItb3V0bGluZSIpLnJlcGxhY2UoLyByZ2JhXCguKi8sYCAke259YCkpfWZ1bmN0aW9uIHBlKGUsdCxuKXtjb25zdCBvPWModCk7UShlLG5bYHNob3cke299QnV0dG9uYF0sImlubGluZS1ibG9jayIpLHEoZSxuW2Ake3R9QnV0dG9uVGV4dGBdfHwiIiksZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLG5bYCR7dH1CdXR0b25BcmlhTGFiZWxgXXx8IiIpLGUuY2xhc3NOYW1lPXJbdF0sXyhlLG4sYCR7dH1CdXR0b25gKX1jb25zdCBtZT0oZSx0KT0+e2NvbnN0IG49eSgpO24mJighZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIHQ/ZS5zdHlsZS5iYWNrZ3JvdW5kPXQ6dHx8eihbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHJbIm5vLWJhY2tkcm9wIl0pfShuLHQuYmFja2Ryb3ApLGZ1bmN0aW9uKGUsdCl7aWYoIXQpcmV0dXJuO3QgaW4gcj96KGUsclt0XSk6KHUoJ1RoZSAicG9zaXRpb24iIHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImNlbnRlciInKSx6KGUsci5jZW50ZXIpKX0obix0LnBvc2l0aW9uKSxmdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybjt6KGUscltgZ3Jvdy0ke3R9YF0pfShuLHQuZ3JvdyksXyhuLHQsImNvbnRhaW5lciIpKX07dmFyIGhlPXtpbm5lclBhcmFtczpuZXcgV2Vha01hcCxkb21DYWNoZTpuZXcgV2Vha01hcCxmb2N1c2VkRWxlbWVudDpuZXcgV2Vha01hcH07Y29uc3QgZ2U9WyJpbnB1dCIsImZpbGUiLCJyYW5nZSIsInNlbGVjdCIsInJhZGlvIiwiY2hlY2tib3giLCJ0ZXh0YXJlYSJdLGZlPWU9PntpZighZS5pbnB1dClyZXR1cm47aWYoIUVlW2UuaW5wdXRdKXJldHVybiB2b2lkIGQoYFVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dCEgRXhwZWN0ZWQgJHtPYmplY3Qua2V5cyhFZSkuam9pbigiIHwgIil9LCBnb3QgIiR7ZS5pbnB1dH0iYCk7Y29uc3QgdD1DZShlLmlucHV0KTtpZighdClyZXR1cm47Y29uc3Qgbj1FZVtlLmlucHV0XSh0LGUpO1godCksZS5pbnB1dEF1dG9Gb2N1cyYmc2V0VGltZW91dCgoKT0+e0Yobil9KX0sYmU9KGUsdCk9Pntjb25zdCBuPUMoKTtpZighbilyZXR1cm47Y29uc3Qgbz1SKG4sZSk7aWYobyl7KGU9Pntmb3IobGV0IHQ9MDt0PGUuYXR0cmlidXRlcy5sZW5ndGg7dCsrKXtjb25zdCBuPWUuYXR0cmlidXRlc1t0XS5uYW1lO1siaWQiLCJ0eXBlIiwidmFsdWUiLCJzdHlsZSJdLmluY2x1ZGVzKG4pfHxlLnJlbW92ZUF0dHJpYnV0ZShuKX19KShvKTtmb3IoY29uc3QgZSBpbiB0KW8uc2V0QXR0cmlidXRlKGUsdFtlXSl9fSx5ZT1lPT57aWYoIWUuaW5wdXQpcmV0dXJuO2NvbnN0IHQ9Q2UoZS5pbnB1dCk7dCYmXyh0LGUsImlucHV0Iil9LHZlPShlLHQpPT57IWUucGxhY2Vob2xkZXImJnQuaW5wdXRQbGFjZWhvbGRlciYmKGUucGxhY2Vob2xkZXI9dC5pbnB1dFBsYWNlaG9sZGVyKX0sd2U9KGUsdCxuKT0+e2lmKG4uaW5wdXRMYWJlbCl7Y29uc3Qgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLGk9clsiaW5wdXQtbGFiZWwiXTtvLnNldEF0dHJpYnV0ZSgiZm9yIixlLmlkKSxvLmNsYXNzTmFtZT1pLCJvYmplY3QiPT10eXBlb2Ygbi5jdXN0b21DbGFzcyYmeihvLG4uY3VzdG9tQ2xhc3MuaW5wdXRMYWJlbCksby5pbm5lclRleHQ9bi5pbnB1dExhYmVsLHQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmViZWdpbiIsbyl9fSxDZT1lPT57Y29uc3QgdD1DKCk7aWYodClyZXR1cm4gSyh0LHJbZV18fHIuaW5wdXQpfSxBZT0oZSx0KT0+e1sic3RyaW5nIiwibnVtYmVyIl0uaW5jbHVkZXModHlwZW9mIHQpP2UudmFsdWU9YCR7dH1gOmIodCl8fHUoYFVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCAic3RyaW5nIiwgIm51bWJlciIgb3IgIlByb21pc2UiLCBnb3QgIiR7dHlwZW9mIHR9ImApfSxFZT17fTtFZS50ZXh0PUVlLmVtYWlsPUVlLnBhc3N3b3JkPUVlLm51bWJlcj1FZS50ZWw9RWUudXJsPUVlLnNlYXJjaD1FZS5kYXRlPUVlWyJkYXRldGltZS1sb2NhbCJdPUVlLnRpbWU9RWUud2Vlaz1FZS5tb250aD0oZSx0KT0+e2NvbnN0IG49ZTtyZXR1cm4gQWUobix0LmlucHV0VmFsdWUpLHdlKG4sbix0KSx2ZShuLHQpLG4udHlwZT10LmlucHV0LG59LEVlLmZpbGU9KGUsdCk9Pntjb25zdCBuPWU7cmV0dXJuIHdlKG4sbix0KSx2ZShuLHQpLG59LEVlLnJhbmdlPShlLHQpPT57Y29uc3Qgbj1lLG89bi5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpLGk9bi5xdWVyeVNlbGVjdG9yKCJvdXRwdXQiKTtyZXR1cm4gbyYmKEFlKG8sdC5pbnB1dFZhbHVlKSxvLnR5cGU9dC5pbnB1dCx3ZShvLGUsdCkpLGkmJkFlKGksdC5pbnB1dFZhbHVlKSxlfSxFZS5zZWxlY3Q9KGUsdCk9Pntjb25zdCBuPWU7aWYobi50ZXh0Q29udGVudD0iIix0LmlucHV0UGxhY2Vob2xkZXIpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7cShlLHQuaW5wdXRQbGFjZWhvbGRlciksZS52YWx1ZT0iIixlLmRpc2FibGVkPSEwLGUuc2VsZWN0ZWQ9ITAsbi5hcHBlbmRDaGlsZChlKX1…»*,ùyZXR1cm4gd2UobixuLHQpLG59LEVlLnJhZGlvPWU9PihlLnRleHRDb250ZW50PSIiLGUpLEVlLmNoZWNrYm94PShlLHQpPT57Y29uc3Qgbj1DKCk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJQb3B1cCBub3QgZm91bmQiKTtjb25zdCBvPVIobiwiY2hlY2tib3giKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIkNoZWNrYm94IGlucHV0IG5vdCBmb3VuZCIpO28udmFsdWU9IjEiLG8uY2hlY2tlZD1Cb29sZWFuKHQuaW5wdXRWYWx1ZSk7Y29uc3QgaT1lLnF1ZXJ5U2VsZWN0b3IoInNwYW4iKTtpZihpKXtjb25zdCBlPXQuaW5wdXRQbGFjZWhvbGRlcnx8dC5pbnB1dExhYmVsO2UmJnEoaSxlKX1yZXR1cm4gb30sRWUudGV4dGFyZWE9KGUsdCk9Pntjb25zdCBuPWU7QWUobix0LmlucHV0VmFsdWUpLHZlKG4sdCksd2UobixuLHQpO3JldHVybiBzZXRUaW1lb3V0KCgpPT57aWYoIk11dGF0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXtjb25zdCBlPUMoKTtpZighZSlyZXR1cm47Y29uc3Qgbz1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9PntpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhuKSlyZXR1cm47Y29uc3QgZT1uLm9mZnNldFdpZHRoKyhpPW4scGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoaSkubWFyZ2luTGVmdCkrcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoaSkubWFyZ2luUmlnaHQpKTt2YXIgaTtjb25zdCBzPUMoKTtzJiYoZT5vP3Muc3R5bGUud2lkdGg9YCR7ZX1weGA6WShzLCJ3aWR0aCIsdC53aWR0aCkpfSkub2JzZXJ2ZShuLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbInN0eWxlIl19KX19KSxufTtjb25zdCBrZT0oZSx0KT0+e2NvbnN0IG49aygpO24mJihKKG4pLF8obix0LCJodG1sQ29udGFpbmVyIiksdC5odG1sPyhhZSh0Lmh0bWwsbiksWChuLCJibG9jayIpKTp0LnRleHQ/KG4udGV4dENvbnRlbnQ9dC50ZXh0LFgobiwiYmxvY2siKSk6WihuKSwoKGUsdCk9Pntjb25zdCBuPUMoKTtpZighbilyZXR1cm47Y29uc3Qgbz1oZS5pbm5lclBhcmFtcy5nZXQoZSksaT0hb3x8dC5pbnB1dCE9PW8uaW5wdXQ7Z2UuZm9yRWFjaChlPT57Y29uc3Qgbz1LKG4scltlXSk7byYmKGJlKGUsdC5pbnB1dEF0dHJpYnV0ZXMpLG8uY2xhc3NOYW1lPXJbZV0saSYmWihvKSl9KSx0LmlucHV0JiYoaSYmZmUodCkseWUodCkpfSkoZSx0KSl9LEJlPShlLHQpPT57Zm9yKGNvbnN0W24sb11vZiBPYmplY3QuZW50cmllcyhhKSl0Lmljb24hPT1uJiZXKGUsbyk7eihlLHQuaWNvbiYmYVt0Lmljb25dKSxQZShlLHQpLCRlKCksXyhlLHQsImljb24iKX0sJGU9KCk9Pntjb25zdCBlPUMoKTtpZighZSlyZXR1cm47Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIiksbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIltjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXSwgLnN3YWwyLXN1Y2Nlc3MtZml4Iik7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspbltlXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9dH0sTGU9KGUsdCk9PntpZighdC5pY29uJiYhdC5pY29uSHRtbClyZXR1cm47bGV0IG49ZS5pbm5lckhUTUwsbz0iIjtpZih0Lmljb25IdG1sKW89eGUodC5pY29uSHRtbCk7ZWxzZSBpZigic3VjY2VzcyI9PT10Lmljb24pbz0oZT0+YFxuICAke2UuYW5pbWF0aW9uPyc8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdCI+PC9kaXY+JzoiIn1cbiAgPHNwYW4gY2xhc3M9InN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiPjwvc3Bhbj4gPHNwYW4gY2xhc3M9InN3YWwyLXN1Y2Nlc3MtbGluZS1sb25nIj48L3NwYW4+XG4gIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtcmluZyI+PC9kaXY+XG4gICR7ZS5hbmltYXRpb24/JzxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtZml4Ij48L2Rpdj4nOiIifVxuICAke2UuYW5pbWF0aW9uPyc8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHQiPjwvZGl2Pic6IiJ9XG5gKSh0KSxuPW4ucmVwbGFjZSgvIHN0eWxlPSIuKj8iL2csIiIpO2Vsc2UgaWYoImVycm9yIj09PXQuaWNvbilvPSdcbiAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyayI+XG4gICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyay1saW5lLWxlZnQiPjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0ic3dhbDIteC1tYXJrLWxpbmUtcmlnaHQiPjwvc3Bhbj5cbiAgPC9zcGFuPlxuJztlbHNlIGlmKHQuaWNvbil7bz14ZSh7cXVlc3Rpb246Ij8iLHdhcm5pbmc6IiEiLGluZm86ImkifVt0Lmljb25dKX1uLnRyaW0oKSE9PW8udHJpbSgpJiZxKGUsbyl9LFBlPShlLHQpPT57aWYodC5pY29uQ29sb3Ipe2Uuc3R5bGUuY29sb3I9dC5pY29uQ29sb3IsZS5zdHlsZS5ib3JkZXJDb2xvcj10Lmljb25Db2xvcjtmb3IoY29uc3QgbiBvZlsiLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiLCIuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmciLCIuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCIsIi5zd2FsMi14LW1hcmstbGluZS1yaWdodCJdKUcoZSxuLCJiYWNrZ3JvdW5kLWNvbG9yIix0Lmljb25Db2xvcik7RyhlLCIuc3dhbDItc3VjY2Vzcy1yaW5nIiwiYm9yZGVyLWNvbG9yIix0Lmljb25Db2xvcil9fSx4ZT1lPT5gPGRpdiBjbGFzcz0iJHtyWyJpY29uLWNvbnRlbnQiXX0iPiR7ZX08L2Rpdj5gO2xldCBUZT0hMSxTZT0wLE9lPTAsTWU9MCxIZT0wO2NvbnN0IGplPWU9Pntjb25zdCB0PUMoKTtpZighdClyZXR1cm47Y29uc3Qgbj1BKCk7aWYoZS50YXJnZXQ9PT10fHxuJiZuLmNvbnRhaW5zKGUudGFyZ2V0KSl7VGU9ITA7Y29uc3Qgbj1WZShlKTtTZT1uLmNsaWVudFgsT2U9bi5jbGllbnRZLE1lPXBhcnNlSW50KHQuc3R5bGUuaW5zZXRJbmxpbmVTdGFydCl8fDAsSGU9cGFyc2VJbnQodC5zdHlsZS5pbnNldEJsb2NrU3RhcnQpfHwwLHoodCwic3dhbDItZHJhZ2dpbmciKX19LEllPWU9Pntjb25zdCB0PUMoKTtpZih0JiZUZSl7bGV0e2NsaWVudFg6bixjbGllbnRZOml9PVZlKGUpO2NvbnN0IHM9bi1TZTt0LnN0eWxlLmluc2V0SW5saW5lU3RhcnQ9YCR7TWUrKG8uaXNSVEw/LXM6cyl9cHhgLHQuc3R5bGUuaW5zZXRCbG9ja1N0YXJ0PWAke0hlKyhpLU9lKX1weGB9fSxEZT0oKT0+e2NvbnN0IGU9QygpO1RlPSExLFcoZSwic3dhbDItZHJhZ2dpbmciKX0sVmU9ZT0+e2xldCB0PTAsbj0wO3JldHVybiBlLnR5cGUuc3RhcnRzV2l0aCgibW91c2UiKT8odD1lLmNsaWVudFgsbj1lLmNsaWVudFkpOmUudHlwZS5zdGFydHNXaXRoKCJ0b3VjaCIpJiYodD1lLnRvdWNoZXNbMF0uY2xpZW50WCxuPWUudG91Y2hlc1swXS5jbGllbnRZKSx7Y2xpZW50WDp0LGNsaWVudFk6bn19LHFlPShlLHQpPT57Y29uc3Qgbj15KCksbz1DKCk7aWYobiYmbyl7aWYodC50b2FzdCl7WShuLCJ3aWR0aCIsdC53aWR0aCksby5zdHlsZS53aWR0aD0iMTAwJSI7Y29uc3QgZT1TKCk7ZSYmby5pbnNlcnRCZWZvcmUoZSxBKCkpfWVsc2UgWShvLCJ3aWR0aCIsdC53aWR0aCk7WShvLCJwYWRkaW5nIix0LnBhZGRpbmcpLHQuY29sb3ImJihvLnN0eWxlLmNvbG9yPXQuY29sb3IpLHQuYmFja2dyb3VuZCYmKG8uc3R5bGUuYmFja2dyb3VuZD10LmJhY2tncm91bmQpLFooTCgpKSxOZShvLHQpLHQuZHJhZ2dhYmxlJiYhdC50b2FzdD8oeihvLHIuZHJhZ2dhYmxlKSwoZT0+e2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixqZSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEllKSxlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLERlKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGplKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsSWUpLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLERlKX0pKG8pKTooVyhvLHIuZHJhZ2dhYmxlKSwoZT0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixqZSksZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEllKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLERlKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGplKSxkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsSWUpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLERlKX0pKG8pKX19LE5lPShlLHQpPT57Y29uc3Qgbj10LnNob3dDbGFzc3x8e307ZS5jbGFzc05hbWU9YCR7ci5wb3B1cH0gJHtlZShlKT9uLnBvcHVwOiIifWAsdC50b2FzdD8oeihbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHJbInRvYXN0LXNob3duIl0pLHooZSxyLnRvYXN0KSk6eihlLHIubW9kYWwpLF8oZSx0LCJwb3B1cCIpLCJzdHJpbmciPT10eXBlb2YgdC5jdXN0b21DbGFzcyYmeihlLHQuY3VzdG9tQ2xhc3MpLHQuaWNvbiYmeihlLHJbYGljb24tJHt0Lmljb259YF0pfSxfZT1lPT57Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpO3JldHVybiB6KHQsclsicHJvZ3Jlc3Mtc3RlcCJdKSxxKHQsZSksdH0sUmU9ZT0+e2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtyZXR1cm4geih0LHJbInByb2dyZXNzLXN0ZXAtbGluZSJdKSxlLnByb2dyZXNzU3RlcHNEaXN0YW5jZSYmWSh0LCJ3aWR0aCIsZS5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UpLHR9LEZlPShlLHQpPT57dmFyIG47cWUoMCx0KSxtZSgwLHQpLCgoZSx0KT0+e2NvbnN0IG49JCgpO2lmKCFuKXJldHVybjtjb25zdHtwcm9ncmVzc1N0ZXBzOm8sY3VycmVudFByb2dyZXNzU3RlcDppfT10O28mJjAhPT1vLmxlbmd0aCYmdm9pZCAwIT09aT8oWChuKSxuLnRleHRDb250ZW50PSIiLGk+PW8ubGVuZ3RoJiZ1KCJJbnZhbGlkIGN1cnJlbnRQcm9ncmVzc1N0ZXAgcGFyYW1ldGVyLCBpdCBzaG91bGQgYmUgbGVzcyB0aGFuIHByb2dyZXNzU3RlcHMubGVuZ3RoIChjdXJyZW50UHJvZ3Jlc3NTdGVwIGxpa2UgSlMgYXJyYXlzIHN0YXJ0cyBmcm9tIDApIiksby5mb3JFYWNoKChlLHMpPT57Y29uc3QgYT1fZShlKTtpZihuLmFwcGVuZENoaWxkKGEpLHM9PT1pJiZ6KGEsclsiYWN0aXZlLXByb2dyZXNzLXN0ZXAiXSkscyE9PW8ubGVuZ3RoLTEpe2NvbnN0IGU9UmUodCk7bi5hcHBlbmRDaGlsZChlKX19KSk6WihuKX0pKDAsdCksKChlLHQpPT57Y29uc3Qgbj1oZS5pbm5lclBhcmFtcy5nZXQoZSksbz1BKCk7aWYoIW8pcmV0dXJuO2lmKG4mJnQuaWNvbj09PW4uaWNvbilyZXR1cm4gTGUobyx0KSx2b2lkIEJlKG8sdCk7aWYoIXQuaWNvbiYmIXQuaWNvbkh0bWwpcmV0dXJuIHZvaWQgWihvKTtpZih0Lmljb24mJi0xPT09T2JqZWN0LmtleXMoYSkuaW5kZXhPZih0Lmljb24pKXJldHVybiBkKGBVbmtub3duIGljb24hIEV4cGVjdGVkICJzdWNjZXNzIiwgImVycm9yIiwgIndhcm5pbmciLCAiaW5mbyIgb3IgInF1ZXN0aW9uIiwgZ290ICIke3QuaWNvbn0iYCksdm9pZCBaKG8pO1gobyksTGUobyx0KSxCZShvLHQpLHoobyx0LnNob3dDbGFzcyYmdC5zaG93Q2xhc3MuaWNvbiksd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCRlKX0pKGUsdCksKChlLHQpPT57Y29uc3Qgbj1CKCk7biYmKHQuaW1hZ2VVcmw/KFgobiwiIiksbi5zZXRBdHRyaWJ1dGUoInNyYyIsdC5pbWFnZVVybCksbi5zZXRBdHRyaWJ1dGUoImFsdCIsdC5pbWFnZUFsdHx8IiIpLFkobiwid2lkdGgiLHQuaW1hZ2VXaWR0aCksWShuLCJoZWlnaHQiLHQuaW1hZ2VIZWlnaHQpLG4uY2xhc3NOYW1lPXIuaW1hZ2UsXyhuLHQsImltYWdlIikpOloobikpfSkoMCx0KSwoKGUsdCk9Pntjb25zdCBuPUUoKTtuJiYoSihuKSxRKG4sQm9vbGVhbih0LnRpdGxlfHx0LnRpdGxlVGV4dCksImJsb2NrIiksdC50aXRsZSYmYWUodC50aXRsZSxuKSx0LnRpdGxlVGV4dCYmKG4uaW5uZXJUZXh0PXQudGl0bGVUZXh0KSxfKG4sdCwidGl0bGUiKSl9KSgwLHQpLCgoZSx0KT0+e2NvbnN0IG49aigpO24mJihxKG4sdC5jbG9zZUJ1dHRvbkh0bWx8fCIiKSxfKG4sdCwiY2xvc2VCdXR0b24iKSxRKG4sdC5zaG93Q2xvc2VCdXR0b24pLG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0LmNsb3NlQnV0dG9uQXJpYUxhYmVsfHwiIikpfSkoMCx0KSxrZShlLHQpLHVlKDAsdCksKChlLHQpPT57Y29uc3Qgbj1NKCk7biYmKEoobiksUShuLEJvb2xlYW4odC5mb290ZXIpLCJibG9jayIpLHQuZm9vdGVyJiZhZSh0LmZvb3RlcixuKSxfKG4sdCwiZm9vdGVyIikpfSkoMCx0KTtjb25zdCBpPUMoKTsiZnVuY3Rpb24iPT10eXBlb2YgdC5kaWRSZW5kZXImJmkmJnQuZGlkUmVuZGVyKGkpLG51bGw9PT0obj1vLmV2ZW50RW1pdHRlcil8fHZvaWQgMD09PW58fG4uZW1pdCgiZGlkUmVuZGVyIixpKX0sVWU9KCk9Pnt2YXIgZTtyZXR1cm4gbnVsbD09PShlPVAoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY2xpY2soKX0semU9T2JqZWN0LmZyZWV6ZSh7Y2FuY2VsOiJjYW5jZWwiLGJhY2tkcm9wOiJiYWNrZHJvcCIsY2xvc2U6ImNsb3NlIixlc2M6ImVzYyIsdGltZXI6InRpbWVyIn0pLFdlPWU9PntpZihlLmtleWRvd25UYXJnZXQmJmUua2V5ZG93bkhhbmRsZXJBZGRlZCYmZS5rZXlkb3duSGFuZGxlcil7Y29uc3QgdD1lLmtleWRvd25IYW5kbGVyO2Uua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0LHtjYXB0dXJlOmUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLGUua2V5ZG93bkhhbmRsZXJBZGRlZD0hMX19LEtlPShlLHQpPT57dmFyIG47Y29uc3Qgbz1JKCk7aWYoby5sZW5ndGgpcmV0dXJuLTI9PT0oZSs9dCkmJihlPW8ubGVuZ3RoLTEpLGU9PT1vLmxlbmd0aD9lPTA6LTE9PT1lJiYoZT1vLmxlbmd0aC0xKSx2b2lkIG9bZV0uZm9jdXMoKTtudWxsPT09KG49QygpKXx8dm9pZCAwPT09bnx8bi5mb2N1cygpfSxZZT1bIkFycm93UmlnaHQiLCJBcnJvd0Rvd24iXSxYZT1bIkFycm93TGVmdCIsIkFycm93VXAiXSxaZT0oZSx0LG4pPT57ZSYmKHQuaXNDb21wb3Npbmd8fDIyOT09PXQua2V5Q29kZXx8KGUuc3RvcEtleWRvd25Qcm9wYWdhdGlvbiYmdC5zdG9wUHJvcGFnYXRpb24oKSwiRW50ZXIiPT09dC5rZXk/SmUodCxlKToiVGFiIj09PXQua2V5P0dlKHQpOlsuLi5ZZSwuLi5YZV0uaW5jbHVkZXModC5rZXkpP1FlKHQua2V5KToiRXNjYXBlIj09PXQua2V5JiZldCh0LGUsbikpKX0sSmU9KGUsdCk9PntpZighaCh0LmFsbG93RW50ZXJLZXkpKXJldHVybjtjb25zdCBuPUMoKTtpZighbnx8IXQuaW5wdXQpcmV0dXJuO2NvbnN0IG89UihuLHQuaW5wdXQpO2lmKGUudGFyZ2V0JiZvJiZlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5vdXRlckhUTUw9PT1vLm91dGVySFRNTCl7aWYoWyJ0ZXh0YXJlYSIsImZpbGUiXS5pbmNsdWRlcyh0LmlucHV0KSlyZXR1cm47VWUoKSxlLnByZXZlbnREZWZhdWx0KCl9fSxHZT1lPT57Y29uc3QgdD1lLnRhcmdldCxuPUkoKTtsZXQgbz0tMTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKylpZih0PT09bltlXSl7bz1lO2JyZWFrfWUuc2hpZnRLZXk/S2UobywtMSk6S2UobywxKSxlLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKX0sUWU9ZT0+e2NvbnN0IHQ9TygpLG49UCgpLG89VCgpLGk9eCgpO2lmKCEodCYmbiYmbyYmaSkpcmV0dXJuO2NvbnN0IHM9W24sbyxpXTtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJiFzLmluY2x1ZGVzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXJldHVybjtjb25zdCByPVllLmluY2x1ZGVzKGUpPyJuZXh0RWxlbWVudFNpYmxpbmciOiJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIjtsZXQgYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKGEpe2ZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXtpZihhPWFbcl0sIWEpcmV0dXJuO2lmKGEgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCYmZWUoYSkpYnJlYWt9YSBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50JiZhLmZvY3VzKCl9fSxldD0oZSx0LG4pPT57ZS5wcmV2ZW50RGVmYXVsdCgpLGgodC5hbGxvd0VzY2FwZUtleSkmJm4oemUuZXNjKX07dmFyIHR0PXtzd2FsUHJvbWlzZVJlc29sdmU6bmV3IFdlYWtNYXAsc3dhbFByb21pc2VSZWplY3Q6bmV3IFdlYWtNYXB9O2NvbnN0IG50PSgpPT57QXJyYXkuZnJvbShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKGU9PntlLmhhc0F0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpPyhlLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLGUuZ2V0QXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIil8fCIiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpKTplLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKX0pfSxvdD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmQm9vbGVhbih3aW5kb3cuR2VzdHVyZUV2ZW50KSxpdD1vdCYmL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW0sc3Q9KCk9Pntjb25zdCBlPXkoKTtpZighZSlyZXR1cm47bGV0IHQ7ZS5vbnRvdWNoc3RhcnQ9ZT0+e3Q9cnQoZSl9LGUub250b3VjaG1vdmU9ZT0+e3QmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSl9fSxydD1lPT57Y29uc3QgdD1lLnRhcmdldCxuPXkoKSxvPWsoKTtyZXR1cm4hKCFufHwhbykmJighYXQoZSkmJiFsdChlKSYmKHQ9PT1ufHwhKHRlKG4pfHwhKHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCl8fCgoZSx0KT0+e2xldCBuPWU7Zm9yKDtuJiZuIT09dDspe2lmKHRlKG4pKXJldHVybiEwO249bi5wYXJlbnRFbGVtZW50fXJldHVybiExfSkodCxvKXx8IklOUFVUIj09PXQudGFnTmFtZXx8IlRFWFRBUkVBIj09PXQudGFnTmFtZXx8dGUobykmJm8uY29udGFpbnModCkpKSl9LGF0PWU9PkJvb2xlYW4oZS50b3VjaGVzJiZlLnRvdWNoZXMubGVuZ3RoJiYic3R5bHVzIj09PWUudG91Y2hlc1swXS50b3VjaFR5cGUpLGx0PWU9PmUudG91Y2hlcyYmZS50b3VjaGVzLmxlbmd0aD4xO2xldCBjdD1udWxsO2NvbnN0IHV0PWU9PntudWxsPT09Y3QmJihkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHR8fCJzY3JvbGwiPT09ZSkmJihjdD1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLXJpZ2h0IikpLGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PWAke2N0KygoKT0+e2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc05hbWU9clsic2Nyb2xsYmFyLW1lYXN1cmUiXSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO2NvbnN0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC1lLmNsaWVudFdpZHRoO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpLHR9KSgpfXB4YCl9O2Z1bmN0aW9uIGR0KGUsdCxuLHMpe1YoKT92dChlLHMpOihpKG4pLnRoZW4oKCk9PnZ0KGUscykpLFdlKG8pKSxvdD8odC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTpub25lICFpbXBvcnRhbnQiKSx0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSx0LmlubmVySFRNTD0iIik6dC5yZW1vdmUoKSxEKCkmJihudWxsIT09Y3QmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1gJHtjdH1weGAsY3Q9bnVsbCksKCgpPT57aWYoTihkb2N1bWVudC5ib2R5LHIuaW9zZml4KSl7Y29uc3QgZT1wYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCwxMCk7Vyhkb2N1bWVudC5ib2R5LHIuaW9zZml4KSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD0tMSplfX0pKCksbnQoKSksVyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFtyLnNob3duLHJbImhlaWdodC1hdXRvIl0sclsibm8tYmFja2Ryb3AiXSxyWyJ0b2FzdC1zaG93biJdXSl9ZnVuY3Rpb24gcHQoZSl7ZT1mdChlKTtjb25zdCB0PXR0LnN3YWxQcm9taXNlUmVzb2x2ZS5nZXQodGhpcyksbj1tdCh0aGlzKTt0aGlzLmlzQXdhaXRpbmdQcm9taXNlP2UuaXNEaXNtaXNzZWR8fChndCh0aGlzKSx0KGUpKTpuJiZ0KGUpfWNvbnN0IG10PWU9Pntjb25zdCB0PUMoKTtpZighdClyZXR1cm4hMTtjb25zdCBuPWhlLmlubmVyUGFyYW1zLmdldChlKTtpZighbnx8Tih0LG4uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4hMTtXKHQsbi5zaG93Q2xhc3MucG9wdXApLHoodCxuLmhpZGVDbGFzcy5wb3B1cCk7Y29uc3Qgbz15KCk7cmV0dXJuIFcobyxuLnNob3dDbGFzcy5iYWNrZHJvcCkseihvLG4uaGlkZUNsYXNzLmJhY2tkcm9wKSxidChlLHQsbiksITB9O2Z1bmN0aW9uIGh0KGUpe2NvbnN0IHQ9dHQuc3dhbFByb21pc2VSZWplY3QuZ2V0KHRoaXMpO2d0KHRoaXMpLHQmJnQoZSl9Y29uc3QgZ3Q9ZT0+e2UuaXNBd2FpdGluZ1Byb21pc2UmJihkZWxldGUgZS5pc0F3YWl0aW5nUHJvbWlzZSxoZS5pbm5lclBhcmFtcy5nZXQoZSl8fGUuX2Rlc3Ryb3koKSl9LGZ0PWU9PnZvaWQgMD09PWU/e2lzQ29uZmlybWVkOiExLGlzRGVuaWVkOiExLGlzRGlzbWlzc2VkOiEwfTpPYmplY3QuYXNzaWduKHtpc0NvbmZpcm1lZDohMSxpc0RlbmllZDohMSxpc0Rpc21pc3NlZDohMX0sZSksYnQ9KGUsdCxuKT0+e3ZhciBpO2NvbnN0IHM9eSgpLHI9bmUodCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4ud2lsbENsb3NlJiZuLndpbGxDbG9zZSh0KSxudWxsPT09KGk9by5ldmVudEVtaXR0ZXIpfHx2b2lkIDA9PT1pfHxpLmVtaXQoIndpbGxDbG9zZSIsdCksciYmcz95dChlLHQscyxCb29sZWFuKG4ucmV0dXJuRm9jdXMpLG4uZGlkQ2xvc2UpOnMmJmR0KGUscyxCb29sZWFuKG4ucmV0dXJuRm9jdXMpLG4uZGlkQ2xvc2UpfSx5dD0oZSx0LG4saSxzKT0+e28uc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrPWR0LmJpbmQobnVsbCxlLG4saSxzKTtjb25zdCByPWZ1bmN0aW9uKGUpe3ZhciBuO2UudGFyZ2V0PT09dCYmKG51bGw9PT0obj1vLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayl8fHZvaWQgMD09PW58fG4uY2FsbChvKSxkZWxldGUgby5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2ssdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIscikpfTt0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsciksdC5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixyKX0sdnQ9KGUsdCk9PntzZXRUaW1lb3V0KCgpPT57dmFyIG47ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYmluZChlLnBhcmFtcykoKSxudWxsPT09KG49by5ldmVudEVtaXR0ZXIpfHx2b2lkIDA9PT1ufHxuLmVtaXQoImRpZENsb3NlIiksZS5fZGVzdHJveSYmZS5fZGVzdHJveSgpfSl9LHd0PWU9PntsZXQgdD1DKCk7aWYodHx8bmV3IFFuLHQ9QygpLCF0KXJldHVybjtjb25zdCBuPVMoKTtWKCk/WihBKCkpOkN0KHQsZSksWChuKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiwidHJ1ZSIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWJ1c3kiLCJ0cnVlIiksdC5mb2N1cygpfSxDdD0oZSx0KT0+e2NvbnN0IG49TygpLG89UygpO24mJm8mJighdCYmZWUoUCgpKSYmKHQ9UCgpKSxYKG4pLHQmJihaKHQpLG8uc2V0QXR0cmlidXRlKCJkYXRhLWJ1dHRvbi10by1yZXBsYWNlIix0LmNsYXNzTmFtZSksbi5pbnNlcnRCZWZvcmUobyx0KSkseihbZSxuXSxyLmxvYWRpbmcpKX0sQXQ9ZT0+ZS5jaGVja2VkPzE6MCxFdD1lPT5lLmNoZWNrZWQ/ZS52YWx1ZTpudWxsLGt0PWU9PmUuZmlsZXMmJmUuZmlsZXMubGVuZ3RoP251bGwhPT1lLmdldEF0dHJpYnV0ZSgibXVsdGlwbGUiKT9lLmZpbGVzOmUuZmlsZXNbMF06bnVsbCxCdD0oZSx0KT0+e2NvbnN0IG49QygpO2lmKCFuKXJldHVybjtjb25zdCBvPWU9Pnsic2VsZWN0Ij09PXQuaW5wdXQ/ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IG89SyhlLHIuc2VsZWN0KTtpZighbylyZXR1cm47Y29uc3QgaT0oZSx0LG8pPT57Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtpLnZhbHVlPW8scShpLHQpLGkuc2VsZWN0ZWQ9UHQobyxuLmlucHV0VmFsdWUpLGUuYXBwZW5kQ2hpbGQoaSl9O3QuZm9yRWFjaChlPT57Y29uc3QgdD1lWzBdLG49ZVsxXTtpZihBcnJheS5pc0FycmF5KG4pKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGdyb3VwIik7ZS5sYWJlbD10LGUuZGlzYWJsZWQ9ITEsby5hcHBlbmRDaGlsZChlKSxuLmZvckVhY2godD0+aShlLHRbMV0sdFswXSkpfWVsc2UgaShvLG4sdCl9KSxvLmZvY3VzKCl9KG4sTHQoZSksdCk6InJhZGlvIj09PXQuaW5wdXQmJmZ1bmN0aW9uKGUsdCxuKXtjb25zdCBvPUsoZSxyLnJhZGlvKTtpZighbylyZXR1cm47dC5mb3JFYWNoKGU9Pntjb25zdCB0PWVbMF0saT1lWzFdLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7cy50eXBlPSJyYWRpbyIscy5uYW1lPXIucmFkaW8scy52YWx1ZT10LFB0KHQsbi5pbnB1dFZhbHVlKSYmKHMuY2hlY2tlZD0hMCk7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7cShsLGkpLGwuY2xhc3NOYW1lPXIubGFiZWwsYS5hcHBlbmRDaGlsZChzKSxhLmFwcGVuZENoaWxkKGwpLG8uYXBwZW5kQ2hpbGQoYSl9KTtjb25zdCBpPW8ucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQiKTtpLmxlbmd0aCYmaVswXS5mb2N1cygpfShuLEx0KGUpLHQpfTtnKHQuaW5wdXRPcHRpb25zKXx8Yih0LmlucHV0T3B0aW9ucyk/KHd0KFAoKSksZih0LmlucHV0T3B0aW9ucykudGhlbih0PT57ZS5oaWRlTG9hZGluZygpLG8odCl9KSk6Im9iamVjdCI9PXR5cGVvZiB0LmlucHV0T3B0aW9ucz9vKHQuaW5wdXRPcHRpb25zKTpkKCJVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXRPcHRpb25zISBFeHBlY3RlZCBvYmplY3QsIE1hcCBvciBQcm9taXNlLCBnb3QgIit0eXBlb2YgdC5pbnB1dE9wdGlvbnMpfSwkdD0oZSx0KT0+e2NvbnN0IG49ZS5nZXRJbnB1dCgpO24mJihaKG4pLGYodC5pbnB1dFZhbHVlKS50aGVuKG89PntuLnZhbHVlPSJudW1iZXIiPT09dC5pbnB1dD9gJHtwYXJzZUZsb2F0KG8pfHwwfWA6YCR7b31gLFgobiksbi5mb2N1cygpLGUuaGlkZUxvYWRpbmcoKX0pLmNhdGNoKHQ9PntkKGBFcnJvciBpbiBpbnB1dFZhbHVlIHByb21pc2U6ICR7dH1gKSxuLnZhbHVlPSIiLFgobiksbi5mb2N1cygpLGUuaGlkZUxvYWRpbmcoKX0pKX07Y29uc3QgTHQ9ZT0+e2NvbnN0IHQ9W107cmV0dXJuIGUgaW5zdGFuY2VvZiBNYXA/ZS5mb3JFYWNoKChlLG4pPT57bGV0IG89ZTsib2JqZWN0Ij09dHlwZW9mIG8mJihvPUx0KG8pKSx0LnB1c2goW24sb10pfSk6T2JqZWN0LmtleXMoZSkuZm9yRWFjaChuPT57bGV0IG89ZVtuXTsib2JqZWN0Ij09dHlwZW9mIG8mJihvPUx0KG8pKSx0LnB1c2goW24sb10pfSksdH0sUHQ9KGUsdCk9PkJvb2xlYW4odCkmJm51bGwhPXQmJnQudG9TdHJpbmcoKT09PWUudG9TdHJpbmcoKSx4dD0oZSx0KT0+e2NvbnN0IG49aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2lmKCFuLmlucHV0KXJldHVybiB2b2lkIGQoYFRoZSAiaW5wdXQiIHBhcmFtZXRlciBpcyBuZWVkZWQgdG8gYmUgc2V0IHdoZW4gdXNpbmcgcmV0dXJuSW5wdXRWYWx1ZU9uJHtjKHQpfWApO2NvbnN0IG89ZS5nZXRJbnB1dCgpLGk9KChlLHQpPT57Y29uc3Qgbj1lLmdldElucHV0KCk7aWYoIW4pcmV0dXJuIG51bGw7c3dpdGNoKHQuaW5wdXQpe2Nhc2UiY2hlY2tib3giOnJldHVybiBBdChuKTtjYXNlInJhZGlvIjpyZXR1cm4gRXQobik7Y2FzZSJmaWxlIjpyZXR1cm4ga3Qobik7ZGVmYXVsdDpyZXR1cm4gdC5pbnB1dEF1dG9UcmltP24udmFsdWUudHJpbSgpOm4udmFsdWV9fSkoZSxuKTtuLmlucHV0VmFsaWRhdG9yP1R0KGUsaSx0KTpvJiYhby5jaGVja1ZhbGlkaXR5KCk/KGUuZW5hYmxlQnV0dG9ucygpLGUuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKG4udmFsaWRhdGlvbk1lc3NhZ2V8fG8udmFsaWRhdGlvbk1lc3NhZ2UpKToiZGVueSI9PT10P1N0KGUsaSk6SHQoZSxpKX0sVHQ9KGUsdCxuKT0+e2NvbnN0IG89aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2UuZGlzYWJsZUlucHV0KCk7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+ZihvLmlucHV0VmFsaWRhdG9yKHQsby52YWxpZGF0aW9uTWVzc2FnZSkpKS50aGVuKG89PntlLmVuYWJsZUJ1dHRvbnMoKSxlLmVuYWJsZUlucHV0KCksbz9lLnNob3dWYWxpZGF0aW9uTWVzc2FnZShvKToiZGVueSI9PT1uP1N0KGUsdCk6SHQoZSx0KX0pfSxTdD0oZSx0KT0+e2NvbnN0IG49aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2lmKG4uc2hvd0xvYWRlck9uRGVueSYmd3QoVCgpKSxuLnByZURlbnkpe2UuaXNBd2FpdGluZ1Byb21pc2U9ITA7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+ZihuLnByZURlbnkodCxuLnZhbGlkYXRpb25NZXNzYWdlKSkpLnRoZW4obj0+eyExPT09bj8oZS5oaWRlTG9hZGluZygpLGd0KGUpKTplLmNsb3NlKHtpc0RlbmllZDohMCx2YWx1ZTp2b2lkIDA9PT1uP3Q6bn0pfSkuY2F0Y2godD0+TXQoZSx0KSl9ZWxzZSBlLmNsb3NlKHtpc0RlbmllZDohMCx2YWx1ZTp0fSl9LE90PShlLHQpPT57ZS5jbG9zZSh7aXNDb25maXJtZWQ6ITAsdmFsdWU6dH0pfSxNdD0oZSx0KT0+e2UucmVqZWN0UHJvbWlzZSh0KX0sSHQ9KGUsdCk9Pntjb25zdCBuPWhlLmlubmVyUGFyYW1zLmdldChlKTtpZihuLnNob3dMb2FkZXJPbkNvbmZpcm0mJnd0KCksbi5wcmVDb25maXJtKXtlLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxlLmlzQXdhaXRpbmdQcm9taXNlPSEwO1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PmYobi5wcmVDb25maXJtKHQsbi52YWxpZGF0aW9uTWVzc2FnZSkpKS50aGVuKG49PntlZShMKCkpfHwhMT09PW4/KGUuaGlkZUxvYWRpbmcoKSxndChlKSk6T3QoZSx2b2lkIDA9PT1uP3Q6bil9KS5jYXRjaCh0PT5NdChlLHQpKX1lbHNlIE90KGUsdCl9O2Z1bmN0aW9uIGp0KCl7Y29uc3QgZT1oZS5pbm5lclBhcmFtcy5nZXQodGhpcyk7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9aGUuZG9tQ2FjaGUuZ2V0KHRoaXMpO1oodC5sb2FkZXIpLFYoKT9lLmljb24mJlgoQSgpKTpJdCh0KSxXKFt0LnBvcHVwLHQuYWN0aW9uc10sci5sb2FkaW5nKSx0LnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1idXN5IiksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbG9hZGluZyIpLHQuY29uZmlybUJ1dHRvbi5kaXNhYmxlZD0hMSx0LmRlbnlCdXR0b24uZGlzYWJsZWQ9ITEsdC5jYW5jZWxCdXR0b24uZGlzYWJsZWQ9ITE7Y29uc3Qgbj1oZS5mb2N1c2VkRWxlbWVudC5nZXQodGhpcyk7biBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZG9jdW1lbnQuYm9keSYmbi5mb2N1cygpLGhlLmZvY3VzZWRFbGVtZW50LmRlbGV0ZSh0aGlzKX1jb25zdCBJdD1lPT57Y29uc3QgdD1lLmxvYWRlci5nZXRBdHRyaWJ1dGUoImRhdGEtYnV0dG9uLXRvLXJlcGxhY2UiKSxuPXQ/ZS5wb3B1cC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQpOltdO24ubGVuZ3RoP1goblswXSwiaW5saW5lLWJsb2NrIik6ZWUoUCgpKXx8ZWUoVCgpKXx8ZWUoeCgpKXx8WihlLmFjdGlvbnMpfTtmdW5jdGlvbiBEdCgpe2NvbnN0IGU9aGUuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpLHQ9aGUuZG9tQ2FjaGUuZ2V0KHRoaXMpO3JldHVybiB0P1IodC5wb3B1cCxlLmlucHV0KTpudWxsfWZ1bmN0aW9uIFZ0KGUsdCxuKXtjb25zdCBvPWhlLmRvbUNhY2hlLmdldChlKTt0LmZvckVhY2goZT0+e29bZV0uZGlzYWJsZWQ9bn0pfWZ1bmN0aW9uIHF0KGUsdCl7Y29uc3Qgbj1DKCk7aWYobiYmZSlpZigicmFkaW8iPT09ZS50eXBlKXtjb25zdCBlPW4ucXVlcnlTZWxlY3RvckFsbChgW25hbWU9IiR7ci5yYWRpb30iXWApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0uZGlzYWJsZWQ9dH1lbHNlIGUuZGlzYWJsZWQ9dH1mdW5jdGlvbiBOdCgpe1Z0KHRoaXMsWyJjb25maXJtQnV0dG9uIiwiZGVueUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiJdLCExKTtjb25zdCBlPWhlLmZvY3VzZWRFbGVtZW50LmdldCh0aGlzKTtlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5JiZlLmZvY3VzKCksaGUuZm9jdXNlZEVsZW1lbnQuZGVsZXRlKHRoaXMpfWZ1bmN0aW9uIF90KCl7aGUuZm9jdXNlZEVsZW1lbnQuc2V0KHRoaXMsZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksVnQodGhpcyxbImNvbmZpcm1CdXR0b24iLCJkZW55QnV0dG9uIiwiY2FuY2VsQnV0dG9uIl0sITApfWZ1bmN0aW9uIFJ0KCl7cXQodGhpcy5nZXRJbnB1dCgpLCExKX1mdW5jdGlvbiBGdCgpe3F0KHRoaXMuZ2V0SW5wdXQoKSwhMCl9ZnVuY3Rpb24gVXQoZSl7Y29uc3QgdD1oZS5kb21DYWNoZS5nZXQodGhpcyksbj1oZS5pbm5lclBhcmFtcy5nZXQodGhpcyk7cSh0LnZhbGlkYXRpb25NZXNzYWdlLGUpLHQudmFsaWRhdGlvbk1lc3NhZ2UuY2xhc3NOYW1lPXJbInZhbGlkYXRpb24tbWVzc2FnZSJdLG4uY3VzdG9tQ2xhc3MmJm4uY3VzdG9tQ2xhc3MudmFsaWRhdGlvbk1lc3NhZ2UmJnoodC52YWxpZGF0aW9uTWVzc2FnZSxuLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSxYKHQudmFsaWRhdGlvbk1lc3NhZ2UpO2NvbnN0IG89dGhpcy5nZXRJbnB1dCgpO28mJihvLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpLG8uc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksRihvKSx6KG8sci5pbnB1dGVycm9yKSl9ZnVuY3Rpb24genQoKXtjb25zdCBlPWhlLmRvbUNhY2hlLmdldCh0aGlzKTtlLnZhbGlkYXRpb25NZXNzYWdlJiZaKGUudmFsaWRhdGlvbk1lc3NhZ2UpO2NvbnN0IHQ9dGhpcy5nZXRJbnB1dCgpO3QmJih0LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiksdC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKSxXKHQsci5pbnB1dGVycm9yKSl9Y29uc3QgV3Q9e3RpdGxlOiIiLHRpdGxlVGV4dDoiIix0ZXh0OiIiLGh0bWw6IiIsZm9vdGVyOiIiLGljb246dm9pZCAwLGljb25Db2xvcjp2b2lkIDAsaWNvbkh0bWw6dm9pZCAwLHRlbXBsYXRlOnZvaWQgMCx0b2FzdDohMSxkcmFnZ2FibGU6ITEsYW5pbWF0aW9uOiEwLHRoZW1lOiJsaWdodCIsc2hvd0NsYXNzOntwb3B1cDoic3dhbDItc2hvdyIsYmFja2Ryb3A6InN3YWwyLWJhY2tkcm9wLXNob3ciLGljb246InN3YWwyLWljb24tc2hvdyJ9LGhpZGVDbGFzczp7cG9wdXA6InN3YWwyLWhpZGUiLGJhY2tkcm9wOiJzd2FsMi1iYWNrZHJvcC1oaWRlIixpY29uOiJzd2FsMi1pY29uLWhpZGUifSxjdXN0b21DbGFzczp7fSx0YXJnZXQ6ImJvZHkiLGNvbG9yOnZvaWQgMCxiYWNrZHJvcDohMCxoZWlnaHRBdXRvOiEwLGFsbG93T3V0c2lkZUNsaWNrOiEwLGFsbG93RXNjYXBlS2V5OiEwLGFsbG93RW50ZXJLZXk6ITAsc3RvcEtleWRvd25Qcm9wYWdhdGlvbjohMCxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiExLHNob3dDb25maXJtQnV0dG9uOiEwLHNob3dEZW55QnV0dG9uOiExLHNob3dDYW5jZWxCdXR0b246ITEscHJlQ29uZmlybTp2b2lkIDAscHJlRGVueTp2b2lkIDAsY29uZmlybUJ1dHRvblRleHQ6Ik9LIixjb25maXJtQnV0dG9uQXJpYUxhYmVsOiIiLGNvbmZpcm1CdXR0b25Db2xvcjp2b2lkIDAsZGVueUJ1dHRvblRleHQ6Ik5vIixkZW55QnV0dG9uQXJpYUxhYmVsOiIiLGRlbnlCdXR0b25Db2xvcjp2b2lkIDAsY2FuY2VsQnV0dG9uVGV4dDoiQ2FuY2VsIixjYW5jZWxCdXR0b25BcmlhTGFiZWw6IiIsY2FuY2VsQnV0dG9uQ29sb3I6dm9pZCAwLGJ1dHRvbnNTdHlsaW5nOiEwLHJldmVyc2VCdXR0b25zOiExLGZvY3VzQ29uZmlybTohMCxmb2N1c0Rlbnk6ITEsZm9jdXNDYW5jZWw6ITEscmV0dXJuRm9jdXM6ITAsc2hvd0Nsb3NlQnV0dG9uOiExLGNsb3NlQnV0dG9uSHRtbDoiJnRpbWVzOyIsY2xvc2VCdXR0b25BcmlhTGFiZWw6IkNsb3NlIHRoaXMgZGlhbG9nIixsb2FkZXJIdG1sOiIiLHNob3dMb2FkZXJPbkNvbmZpcm06ITEsc2hvd0xvYWRlck9uRGVueTohMSxpbWFnZVVybDp2b2lkIDAsaW1hZ2VXaWR0aDp2b2lkIDAsaW1hZ2VIZWlnaHQ6dm9pZCAwLGltYWdlQWx0OiIiLHRpbWVyOnZvaWQgMCx0aW1lclByb2dyZXNzQmFyOiExLHdpZHRoOnZvaWQgMCxwYWRkaW5nOnZvaWQgMCxiYWNrZ3JvdW5kOnZvaWQgMCxpbnB1dDp2b2lkIDAsaW5wdXRQbGFjZWhvbGRlcjoiIixpbnB1dExhYmVsOiIiLGlucHV0VmFsdWU6IiIsaW5wdXRPcHRpb25zOnt9LGlucHV0QXV0b0ZvY3VzOiEwLGlucHV0QXV0b1RyaW06ITAsaW5wdXRBdHRyaWJ1dGVzOnt9LGlucHV0VmFsaWRhdG9yOnZvaWQgMCxyZXR1cm5JbnB1dFZhbHVlT25EZW55OiExLHZhbGlkYXRpb25NZXNzYWdlOnZvaWQgMCxncm93OiExLHBvc2l0aW9uOiJjZW50ZXIiLHByb2dyZXNzU3RlcHM6W10sY3VycmVudFByb2dyZXNzU3RlcDp2b2lkIDAscHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlOnZvaWQgMCx3aWxsT3Blbjp2b2lkIDAsZGlkT3Blbjp2b2lkIDAsZGlkUmVuZGVyOnZvaWQgMCx3aWxsQ2xvc2U6dm9pZCAwLGRpZENsb3NlOnZvaWQgMCxkaWREZXN0cm95OnZvaWQgMCxzY3JvbGxiYXJQYWRkaW5nOiEwLHRvcExheWVyOiExfSxLdD1bImFsbG93RXNjYXBlS2V5IiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJiYWNrZ3JvdW5kIiwiYnV0dG9uc1N0eWxpbmciLCJjYW5jZWxCdXR0b25BcmlhTGFiZWwiLCJjYW5jZWxCdXR0b25Db2xvciIsImNhbmNlbEJ1dHRvblRleHQiLCJjbG9zZUJ1dHRvbkFyaWFMYWJlbCIsImNsb3NlQnV0dG9uSHRtbCIsImNvbG9yIiwiY29uZmlybUJ1dHRvbkFyaWFMYWJlbCIsImNvbmZpcm1CdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwiY3VycmVudFByb2dyZXNzU3RlcCIsImN1c3RvbUNsYXNzIiwiZGVueUJ1dHRvbkFyaWFMYWJlbCIsImRlbnlCdXR0b25Db2xvciIsImRlbnlCdXR0b25UZXh0IiwiZGlkQ2xvc2UiLCJkaWREZXN0cm95IiwiZHJhZ2dhYmxlIiwiZm9vdGVyIiwiaGlkZUNsYXNzIiwiaHRtbCIsImljb24iLCJpY29uQ29sb3IiLCJpY29uSHRtbCIsImltYWdlQWx0IiwiaW1hZ2VIZWlnaHQiLCJpbWFnZVVybCIsImltYWdlV2lkdGgiLCJwcmVDb25maXJtIiwicHJlRGVueSIsInByb2dyZXNzU3RlcHMiLCJyZXR1cm5Gb2N1cyIsInJldmVyc2VCdXR0b25zIiwic2hvd0NhbmNlbEJ1dHRvbiIsInNob3dDbG9zZUJ1dHRvbiIsInNob3dDb25maXJtQnV0dG9uIiwic2hvd0RlbnlCdXR0b24iLCJ0ZXh0IiwidGl0bGUiLCJ0aXRsZVRleHQiLCJ0aGVtZSIsIndpbGxDbG9zZSJdLFl0PXthbGxvd0VudGVyS2V5OnZvaWQgMH0sWHQ9WyJhbGxvd091dHNpZGVDbGljayIsImFsbG93RW50ZXJLZXkiLCJiYWNrZHJvcCIsImRyYWdnYWJsZSIsImZvY3VzQ29uZmlybSIsImZvY3VzRGVueSIsImZvY3VzQ2FuY2VsIiwicmV0dXJuRm9jdXMiLCJoZWlnaHRBdXRvIiwia2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSJdLFp0PWU9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChXdCxlKSxKdD1lPT4tMSE9PUt0LmluZGV4T2YoZSksR3Q9ZT0+WXRbZV0sUXQ9ZT0+e1p0KGUpfHx1KGBVbmtub3duIHBhcmFtZXRlciAiJHtlfSJgKX0sZW49ZT0+e1h0LmluY2x1ZGVzKGUpJiZ1KGBUaGUgcGFyYW1ldGVyICIke2V9IiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHNgKX0sdG49ZT0+e2NvbnN0IHQ9R3QoZSk7dCYmbShlLHQpfSxubj1lPT57ITE9PT1lLmJhY2tkcm9wJiZlLmFsbG93T3V0c2lkZUNsaWNrJiZ1KCciYWxsb3dPdXRzaWRlQ2xpY2siIHBhcmFtZXRlciByZXF1aXJlcyBgYmFja2Ryb3BgIHBhcmFtZXRlciB0byBiZSBzZXQgdG8gYHRydWVgJyksZS50aGVtZSYmIVsibGlnaHQiLCJkYXJrIiwiYXV0byIsIm1pbmltYWwiLCJib3JkZXJsZXNzIiwiYm9vdHN0cmFwLTQiLCJib290c3RyYXAtNC1saWdodCIsImJvb3RzdHJhcC00LWRhcmsiLCJib290c3RyYXAtNSIsImJvb3RzdHJhcC01LWxpZ2h0IiwiYm9vdHN0cmFwLTUtZGFyayIsIm1hdGVyaWFsLXVpIiwibWF0ZXJpYWwtdWktbGlnaHQiLCJtYXRlcmlhbC11aS1kYXJrIiwiZW1iZWQtaWZyYW1lIiwiYnVsbWEiLCJidWxtYS1saWdodCIsImJ1bG1hLWRhcmsiXS5pbmNsdWRlcyhlLnRoZW1lKSYmdShgSW52YWxpZCB0aGVtZSAiJHtlLnRoZW1lfSJgKTtmb3IoY29uc3QgdCBpbiBlKVF0KHQpLGUudG9hc3QmJmVuKHQpLHRuKHQpfTtmdW5jdGlvbiBvbihlKXtjb25zdCB0PXkoKSxuPUMoKSxvPWhlLmlubmVyUGFyYW1zLmdldCh0aGlzKTtpZighbnx8TihuLG8uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4gdm9pZCB1KCJZb3UncmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY2xvc2VkIG9yIGNsb3NpbmcgcG9wdXAsIHRoYXQgd29uJ3Qgd29yay4gVXNlIHRoZSB1cGRhdGUoKSBtZXRob2QgaW4gcHJlQ29uZmlybSBwYXJhbWV0ZXIgb3Igc2hvdyBhIG5ldyBwb3B1cC4iKTtjb25zdCBpPXNuKGUpLHM9T2JqZWN0LmFzc2lnbih7fSxvLGkpO25uKHMpLHQmJih0LmRhdGFzZXQuc3dhbDJUaGVtZT1zLnRoZW1lKSxGZSh0aGlzLHMpLGhlLmlubmVyUGFyYW1zLnNldCh0aGlzLHMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLnBhcmFtcyxlKSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwfX0pfWNvbnN0IHNuPWU9Pntjb25zdCB0PXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKG49PntpZihKdChuKSl7Y29uc3Qgbz1lO3Rbbl09b1tuXX1lbHNlIHUoYEludmFsaWQgcGFyYW1ldGVyIHRvIHVwZGF0ZTogJHtufWApfSksdH07ZnVuY3Rpb24gcm4oKXt2YXIgZTtjb25zdCB0PWhlLmRvbUNhY2hlLmdldCh0aGlzKSxuPWhlLmlubmVyUGFyYW1zLmdldCh0aGlzKTtuPyh0LnBvcHVwJiZvLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayYmKG8uc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIG8uc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKSwiZnVuY3Rpb24iPT10eXBlb2Ygbi5kaWREZXN0cm95JiZuLmRpZERlc3Ryb3koKSxudWxsPT09KGU9by5ldmVudEVtaXR0ZXIpfHx2b2lkIDA9PT1lfHxlLmVtaXQoImRpZERlc3Ryb3kiKSxhbih0aGlzKSk6bG4odGhpcyl9Y29uc3QgYW49ZT0+e2xuKGUpLGRlbGV0ZSBlLnBhcmFtcyxkZWxldGUgby5rZXlkb3duSGFuZGxlcixkZWxldGUgby5rZXlkb3duVGFyZ2V0LGRlbGV0ZSBvLmN1cnJlbnRJbnN0YW5jZX0sbG49ZT0+e2UuaXNBd2FpdGluZ1Byb21pc2U/KGNuKGhlLGUpLGUuaXNBd2FpdGluZ1Byb21pc2U9ITApOihjbih0dCxlKSxjbihoZSxlKSxkZWxldGUgZS5pc0F3YWl0aW5nUHJvbWlzZSxkZWxldGUgZS5kaXNhYmxlQnV0dG9ucyxkZWxldGUgZS5lbmFibGVCdXR0b25zLGRlbGV0ZSBlLmdldElucHV0LGRlbGV0ZSBlLmRpc2FibGVJbnB1dCxkZWxldGUgZS5lbmFibGVJbnB1dCxkZWxldGUgZS5oaWRlTG9hZGluZyxkZWxldGUgZS5kaXNhYmxlTG9hZGluZyxkZWxldGUgZS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UsZGVsZXRlIGUucmVzZXRWYWxpZGF0aW9uTWVzc2FnZSxkZWxldGUgZS5jbG9zZSxkZWxldGUgZS5jbG9zZVBvcHVwLGRlbGV0ZSBlLmNsb3NlTW9kYWwsZGVsZXRlIGUuY2xvc2VUb2FzdCxkZWxldGUgZS5yZWplY3RQcm9taXNlLGRlbGV0ZSBlLnVwZGF0ZSxkZWxldGUgZS5fZGVzdHJveSl9LGNuPShlLHQpPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmRlbGV0ZSh0KX07dmFyIHVuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLF9kZXN0cm95OnJuLGNsb3NlOnB0LGNsb3NlTW9kYWw6cHQsY2xvc2VQb3B1cDpwdCxjbG9zZVRvYXN0OnB0LGRpc2FibGVCdXR0b25zOl90LGRpc2FibGVJbnB1dDpGdCxkaXNhYmxlTG9hZGluZzpqdCxlbmFibGVCdXR0b25zOk50LGVuYWJsZUlucHV0OlJ0LGdldElucHV0OkR0LGhhbmRsZUF3YWl0aW5nUHJvbWlzZTpndCxoaWRlTG9hZGluZzpqdCxyZWplY3RQcm9taXNlOmh0LHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U6enQsc2hvd1ZhbGlkYXRpb25NZXNzYWdlOlV0LHVwZGF0ZTpvbn0pO2NvbnN0IGRuPShlLHQsbik9Pnt0LnBvcHVwLm9uY2xpY2s9KCk9PntlJiYocG4oZSl8fGUudGltZXJ8fGUuaW5wdXQpfHxuKHplLmNsb3NlKX19LHBuPWU9PkJvb2xlYW4oZS5zaG93Q29uZmlybUJ1dHRvbnx8ZS5zaG93RGVueUJ1dHRvbnx8ZS5zaG93Q2FuY2VsQnV0dG9ufHxlLnNob3dDbG9zZUJ1dHRvbik7bGV0IG1uPSExO2NvbnN0IGhuPWU9PntlLnBvcHVwLm9ubW91c2Vkb3duPSgpPT57ZS5jb250YWluZXIub25tb3VzZXVwPWZ1bmN0aW9uKHQpe2UuY29udGFpbmVyLm9ubW91c2V1cD0oKT0+e30sdC50YXJnZXQ9PT1lLmNvbnRhaW5lciYmKG1uPSEwKX19fSxnbj1lPT57ZS5jb250YWluZXIub25tb3VzZWRvd249dD0+e3QudGFyZ2V0PT09ZS5jb250YWluZXImJnQucHJldmVudERlZmF1bHQoKSxlLnBvcHVwLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLnBvcHVwLm9ubW91c2V1cD0oKT0+e30sKHQudGFyZ2V0PT09ZS5wb3B1cHx8dC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS5wb3B1cC5jb250YWlucyh0LnRhcmdldCkpJiYobW49ITApfX19LGZuPShlLHQsbik9Pnt0LmNvbnRhaW5lci5vbmNsaWNrPW89Pnttbj9tbj0hMTpvLnRhcmdldD09PXQuY29udGFpbmVyJiZoKGUuYWxsb3dPdXRzaWRlQ2xpY2spJiZuKHplLmJhY2tkcm9wKX19LGJuPWU9PmUgaW5zdGFuY2VvZiBFbGVtZW50fHwoZT0+Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSYmImpxdWVyeSJpbiBlKShlKTtjb25zdCB5bj0oKT0+e2lmKG8udGltZW91dClyZXR1cm4oKCk9Pntjb25zdCBlPUgoKTtpZighZSlyZXR1cm47Y29uc3QgdD1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCk7ZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpLGUuc3R5bGUud2lkdGg9IjEwMCUiO2NvbnN0IG49dC9wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCkqMTAwO2Uuc3R5bGUud2lkdGg9YCR7bn0lYH0pKCksby50aW1lb3V0LnN0b3AoKX0sdm49KCk9PntpZihvLnRpbWVvdXQpe2NvbnN0IGU9by50aW1lb3V0LnN0YXJ0KCk7cmV0dXJuIG9lKGUpLGV9fTtsZXQgd249ITE7Y29uc3QgQ249e307Y29uc3QgQW49ZT0+e2ZvcihsZXQgdD1lLnRhcmdldDt0JiZ0IT09ZG9jdW1lbnQ7dD10LnBhcmVudE5vZGUpZm9yKGNvbnN0IGUgaW4gQ24pe2NvbnN0IG49dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKGUpO2lmKG4pcmV0dXJuIHZvaWQgQ25bZV0uZmlyZSh7dGVtcGxhdGU6bn0pfX07by5ldmVudEVtaXR0ZXI9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5ldmVudHM9e319X2dldEhhbmRsZXJzQnlFdmVudE5hbWUoZSl7cmV0dXJuIHZvaWQgMD09PXRoaXMuZXZlbnRzW2VdJiYodGhpcy5ldmVudHNbZV09W10pLHRoaXMuZXZlbnRzW2VdfW9uKGUsdCl7Y29uc3Qgbj10aGlzLl9nZXRIYW5kbGVyc0J5RXZlbnROYW1lKGUpO24uaW5jbHVkZXModCl8fG4ucHVzaCh0KX1vbmNlKGUsdCl7Y29uc3Qgbj0oLi4ubyk9Pnt0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbiksdC5hcHBseSh0aGlzLG8pfTt0aGlzLm9uKGUsbil9ZW1pdChlLC4uLnQpe3RoaXMuX2dldEhhbmRsZXJzQnlFdmVudE5hbWUoZSkuZm9yRWFjaChlPT57dHJ5e2UuYXBwbHkodGhpcyx0KX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX0pfXJlbW92ZUxpc3RlbmVyKGUsdCl7Y29uc3Qgbj10aGlzLl9nZXRIYW5kbGVyc0J5RXZlbnROYW1lKGUpLG89bi5pbmRleE9mKHQpO28+LTEmJm4uc3BsaWNlKG8sMSl9cmVtb3ZlQWxsTGlzdGVuZXJzKGUpe3ZvaWQgMCE9PXRoaXMuZXZlbnRzW2VdJiYodGhpcy5ldmVudHNbZV0ubGVuZ3RoPTApfXJlc2V0KCl7dGhpcy5ldmVudHM9e319fTt2YXIgRW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYXJnc1RvUGFyYW1zOmU9Pntjb25zdCB0PXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgZVswXXx8Ym4oZVswXSk/WyJ0aXRsZSIsImh0bWwiLCJpY29uIl0uZm9yRWFjaCgobixvKT0+e2NvbnN0IGk9ZVtvXTsic3RyaW5nIj09dHlwZW9mIGl8fGJuKGkpP3Rbbl09aTp2b2lkIDAhPT1pJiZkKGBVbmV4cGVjdGVkIHR5cGUgb2YgJHtufSEgRXhwZWN0ZWQgInN0cmluZyIgb3IgIkVsZW1lbnQiLCBnb3QgJHt0eXBlb2YgaX1gKX0pOk9iamVjdC5hc3NpZ24odCxlWzBdKSx0fSxiaW5kQ2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGU9ImRhdGEtc3dhbC10ZW1wbGF0ZSIpe0NuW2VdPXRoaXMsd258fChkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBbiksd249ITApfSxjbGlja0NhbmNlbDooKT0+e3ZhciBlO3JldHVybiBudWxse(ùPT09KGU9eCgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jbGljaygpfSxjbGlja0NvbmZpcm06VWUsY2xpY2tEZW55OigpPT57dmFyIGU7cmV0dXJuIG51bGw9PT0oZT1UKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsaWNrKCl9LGVuYWJsZUxvYWRpbmc6d3QsZmlyZTpmdW5jdGlvbiguLi5lKXtyZXR1cm4gbmV3IHRoaXMoLi4uZSl9LGdldEFjdGlvbnM6TyxnZXRDYW5jZWxCdXR0b246eCxnZXRDbG9zZUJ1dHRvbjpqLGdldENvbmZpcm1CdXR0b246UCxnZXRDb250YWluZXI6eSxnZXREZW55QnV0dG9uOlQsZ2V0Rm9jdXNhYmxlRWxlbWVudHM6SSxnZXRGb290ZXI6TSxnZXRIdG1sQ29udGFpbmVyOmssZ2V0SWNvbjpBLGdldEljb25Db250ZW50OigpPT53KHJbImljb24tY29udGVudCJdKSxnZXRJbWFnZTpCLGdldElucHV0TGFiZWw6KCk9PncoclsiaW5wdXQtbGFiZWwiXSksZ2V0TG9hZGVyOlMsZ2V0UG9wdXA6QyxnZXRQcm9ncmVzc1N0ZXBzOiQsZ2V0VGltZXJMZWZ0OigpPT5vLnRpbWVvdXQmJm8udGltZW91dC5nZXRUaW1lckxlZnQoKSxnZXRUaW1lclByb2dyZXNzQmFyOkgsZ2V0VGl0bGU6RSxnZXRWYWxpZGF0aW9uTWVzc2FnZTpMLGluY3JlYXNlVGltZXI6ZT0+e2lmKG8udGltZW91dCl7Y29uc3QgdD1vLnRpbWVvdXQuaW5jcmVhc2UoZSk7cmV0dXJuIG9lKHQsITApLHR9fSxpc0RlcHJlY2F0ZWRQYXJhbWV0ZXI6R3QsaXNMb2FkaW5nOigpPT57Y29uc3QgZT1DKCk7cmV0dXJuISFlJiZlLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIil9LGlzVGltZXJSdW5uaW5nOigpPT5Cb29sZWFuKG8udGltZW91dCYmby50aW1lb3V0LmlzUnVubmluZygpKSxpc1VwZGF0YWJsZVBhcmFtZXRlcjpKdCxpc1ZhbGlkUGFyYW1ldGVyOlp0LGlzVmlzaWJsZTooKT0+ZWUoQygpKSxtaXhpbjpmdW5jdGlvbihlKXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyh0aGlzKXtfbWFpbih0LG4pe3JldHVybiBzdXBlci5fbWFpbih0LE9iamVjdC5hc3NpZ24oe30sZSxuKSl9fX0sb2ZmOihlLHQpPT57by5ldmVudEVtaXR0ZXImJihlP3Q/by5ldmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZSx0KTpvLmV2ZW50RW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSk6by5ldmVudEVtaXR0ZXIucmVzZXQoKSl9LG9uOihlLHQpPT57by5ldmVudEVtaXR0ZXImJm8uZXZlbnRFbWl0dGVyLm9uKGUsdCl9LG9uY2U6KGUsdCk9PntvLmV2ZW50RW1pdHRlciYmby5ldmVudEVtaXR0ZXIub25jZShlLHQpfSxyZXN1bWVUaW1lcjp2bixzaG93TG9hZGluZzp3dCxzdG9wVGltZXI6eW4sdG9nZ2xlVGltZXI6KCk9Pntjb25zdCBlPW8udGltZW91dDtyZXR1cm4gZSYmKGUucnVubmluZz95bigpOnZuKCkpfX0pO2NsYXNzIGtue2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5jYWxsYmFjaz1lLHRoaXMucmVtYWluaW5nPXQsdGhpcy5ydW5uaW5nPSExLHRoaXMuc3RhcnQoKX1zdGFydCgpe3JldHVybiB0aGlzLnJ1bm5pbmd8fCh0aGlzLnJ1bm5pbmc9ITAsdGhpcy5zdGFydGVkPW5ldyBEYXRlLHRoaXMuaWQ9c2V0VGltZW91dCh0aGlzLmNhbGxiYWNrLHRoaXMucmVtYWluaW5nKSksdGhpcy5yZW1haW5pbmd9c3RvcCgpe3JldHVybiB0aGlzLnN0YXJ0ZWQmJnRoaXMucnVubmluZyYmKHRoaXMucnVubmluZz0hMSxjbGVhclRpbWVvdXQodGhpcy5pZCksdGhpcy5yZW1haW5pbmctPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuc3RhcnRlZC5nZXRUaW1lKCkpLHRoaXMucmVtYWluaW5nfWluY3JlYXNlKGUpe2NvbnN0IHQ9dGhpcy5ydW5uaW5nO3JldHVybiB0JiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9ZSx0JiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9Z2V0VGltZXJMZWZ0KCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMuc3RvcCgpLHRoaXMuc3RhcnQoKSksdGhpcy5yZW1haW5pbmd9aXNSdW5uaW5nKCl7cmV0dXJuIHRoaXMucnVubmluZ319Y29uc3QgQm49WyJzd2FsLXRpdGxlIiwic3dhbC1odG1sIiwic3dhbC1mb290ZXIiXSwkbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gQXJyYXkuZnJvbShlLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtcGFyYW0iKSkuZm9yRWFjaChlPT57SG4oZSxbIm5hbWUiLCJ2YWx1ZSJdKTtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKCJuYW1lIiksbz1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKTtuJiZvJiYodFtuXT1uIGluIFd0JiYiYm9vbGVhbiI9PXR5cGVvZiBXdFtuXT8iZmFsc2UiIT09bzpuIGluIFd0JiYib2JqZWN0Ij09dHlwZW9mIFd0W25dP0pTT04ucGFyc2Uobyk6byl9KSx0fSxMbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gQXJyYXkuZnJvbShlLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtZnVuY3Rpb24tcGFyYW0iKSkuZm9yRWFjaChlPT57Y29uc3Qgbj1lLmdldEF0dHJpYnV0ZSgibmFtZSIpLG89ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7biYmbyYmKHRbbl09bmV3IEZ1bmN0aW9uKGByZXR1cm4gJHtvfWApKCkpfSksdH0sUG49ZT0+e2NvbnN0IHQ9e307cmV0dXJuIEFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKCJzd2FsLWJ1dHRvbiIpKS5mb3JFYWNoKGU9PntIbihlLFsidHlwZSIsImNvbG9yIiwiYXJpYS1sYWJlbCJdKTtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKCJ0eXBlIik7aWYobiYmWyJjb25maXJtIiwiY2FuY2VsIiwiZGVueSJdLmluY2x1ZGVzKG4pKXtpZih0W2Ake259QnV0dG9uVGV4dGBdPWUuaW5uZXJIVE1MLHRbYHNob3cke2Mobil9QnV0dG9uYF09ITAsZS5oYXNBdHRyaWJ1dGUoImNvbG9yIikpe2NvbnN0IG89ZS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7bnVsbCE9PW8mJih0W2Ake259QnV0dG9uQ29sb3JgXT1vKX1pZihlLmhhc0F0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpKXtjb25zdCBvPWUuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7bnVsbCE9PW8mJih0W2Ake259QnV0dG9uQXJpYUxhYmVsYF09byl9fX0pLHR9LHhuPWU9Pntjb25zdCB0PXt9LG49ZS5xdWVyeVNlbGVjdG9yKCJzd2FsLWltYWdlIik7cmV0dXJuIG4mJihIbihuLFsic3JjIiwid2lkdGgiLCJoZWlnaHQiLCJhbHQiXSksbi5oYXNBdHRyaWJ1dGUoInNyYyIpJiYodC5pbWFnZVVybD1uLmdldEF0dHJpYnV0ZSgic3JjIil8fHZvaWQgMCksbi5oYXNBdHRyaWJ1dGUoIndpZHRoIikmJih0LmltYWdlV2lkdGg9bi5nZXRBdHRyaWJ1dGUoIndpZHRoIil8fHZvaWQgMCksbi5oYXNBdHRyaWJ1dGUoImhlaWdodCIpJiYodC5pbWFnZUhlaWdodD1uLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iil8fHZvaWQgMCksbi5oYXNBdHRyaWJ1dGUoImFsdCIpJiYodC5pbWFnZUFsdD1uLmdldEF0dHJpYnV0ZSgiYWx0Iil8fHZvaWQgMCkpLHR9LFRuPWU9Pntjb25zdCB0PXt9LG49ZS5xdWVyeVNlbGVjdG9yKCJzd2FsLWljb24iKTtyZXR1cm4gbiYmKEhuKG4sWyJ0eXBlIiwiY29sb3IiXSksbi5oYXNBdHRyaWJ1dGUoInR5cGUiKSYmKHQuaWNvbj1uLmdldEF0dHJpYnV0ZSgidHlwZSIpKSxuLmhhc0F0dHJpYnV0ZSgiY29sb3IiKSYmKHQuaWNvbkNvbG9yPW4uZ2V0QXR0cmlidXRlKCJjb2xvciIpKSx0Lmljb25IdG1sPW4uaW5uZXJIVE1MKSx0fSxTbj1lPT57Y29uc3QgdD17fSxuPWUucXVlcnlTZWxlY3Rvcigic3dhbC1pbnB1dCIpO24mJihIbihuLFsidHlwZSIsImxhYmVsIiwicGxhY2Vob2xkZXIiLCJ2YWx1ZSJdKSx0LmlucHV0PW4uZ2V0QXR0cmlidXRlKCJ0eXBlIil8fCJ0ZXh0IixuLmhhc0F0dHJpYnV0ZSgibGFiZWwiKSYmKHQuaW5wdXRMYWJlbD1uLmdldEF0dHJpYnV0ZSgibGFiZWwiKSksbi5oYXNBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIikmJih0LmlucHV0UGxhY2Vob2xkZXI9bi5nZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIikpLG4uaGFzQXR0cmlidXRlKCJ2YWx1ZSIpJiYodC5pbnB1dFZhbHVlPW4uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKSk7Y29uc3Qgbz1BcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbCgic3dhbC1pbnB1dC1vcHRpb24iKSk7cmV0dXJuIG8ubGVuZ3RoJiYodC5pbnB1dE9wdGlvbnM9e30sby5mb3JFYWNoKGU9PntIbihlLFsidmFsdWUiXSk7Y29uc3Qgbj1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKTtpZighbilyZXR1cm47Y29uc3Qgbz1lLmlubmVySFRNTDt0LmlucHV0T3B0aW9uc1tuXT1vfSkpLHR9LE9uPShlLHQpPT57Y29uc3Qgbj17fTtmb3IoY29uc3QgbyBpbiB0KXtjb25zdCBpPXRbb10scz1lLnF1ZXJ5U2VsZWN0b3IoaSk7cyYmKEhuKHMsW10pLG5baS5yZXBsYWNlKC9ec3dhbC0vLCIiKV09cy5pbm5lckhUTUwudHJpbSgpKX1yZXR1cm4gbn0sTW49ZT0+e2NvbnN0IHQ9Qm4uY29uY2F0KFsic3dhbC1wYXJhbSIsInN3YWwtZnVuY3Rpb24tcGFyYW0iLCJzd2FsLWJ1dHRvbiIsInN3YWwtaW1hZ2UiLCJzd2FsLWljb24iLCJzd2FsLWlucHV0Iiwic3dhbC1pbnB1dC1vcHRpb24iXSk7QXJyYXkuZnJvbShlLmNoaWxkcmVuKS5mb3JFYWNoKGU9Pntjb25zdCBuPWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO3QuaW5jbHVkZXMobil8fHUoYFVucmVjb2duaXplZCBlbGVtZW50IDwke259PmApfSl9LEhuPShlLHQpPT57QXJyYXkuZnJvbShlLmF0dHJpYnV0ZXMpLmZvckVhY2gobj0+ey0xPT09dC5pbmRleE9mKG4ubmFtZSkmJnUoW2BVbnJlY29nbml6ZWQgYXR0cmlidXRlICIke24ubmFtZX0iIG9uIDwke2UudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4uYCwiIisodC5sZW5ndGg/YEFsbG93ZWQgYXR0cmlidXRlcyBhcmU6ICR7dC5qb2luKCIsICIpfWA6IlRvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4iKV0pfSl9LGpuPWU9Pnt2YXIgdCxuO2NvbnN0IGk9eSgpLHM9QygpO2lmKCFpfHwhcylyZXR1cm47ImZ1bmN0aW9uIj09dHlwZW9mIGUud2lsbE9wZW4mJmUud2lsbE9wZW4ocyksbnVsbD09PSh0PW8uZXZlbnRFbWl0dGVyKXx8dm9pZCAwPT09dHx8dC5lbWl0KCJ3aWxsT3BlbiIscyk7Y29uc3Qgcj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5vdmVyZmxvd1k7aWYocW4oaSxzLGUpLHNldFRpbWVvdXQoKCk9PntEbihpLHMpfSwxMCksRCgpJiYoVm4oaSx2b2lkIDAhPT1lLnNjcm9sbGJhclBhZGRpbmcmJmUuc2Nyb2xsYmFyUGFkZGluZyxyKSwoKCk9Pntjb25zdCBlPXkoKTtBcnJheS5mcm9tKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2godD0+e3QuY29udGFpbnMoZSl8fCh0Lmhhc0F0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSYmdC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4iLHQuZ2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfHwiIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpKX0pfSkoKSksaXQmJiExPT09ZS5iYWNrZHJvcCYmcy5zY3JvbGxIZWlnaHQ+aS5jbGllbnRIZWlnaHQmJihpLnN0eWxlLnBvaW50ZXJFdmVudHM9ImF1dG8iKSxWKCl8fG8ucHJldmlvdXNBY3RpdmVFbGVtZW50fHwoby5wcmV2aW91c0FjdGl2ZUVsZW1lbnQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksImZ1bmN0aW9uIj09dHlwZW9mIGUuZGlkT3Blbil7Y29uc3QgdD1lLmRpZE9wZW47c2V0VGltZW91dCgoKT0+dChzKSl9bnVsbD09PShuPW8uZXZlbnRFbWl0dGVyKXx8dm9pZCAwPT09bnx8bi5lbWl0KCJkaWRPcGVuIixzKX0sSW49ZT0+e2NvbnN0IHQ9QygpO2lmKCF0fHxlLnRhcmdldCE9PXQpcmV0dXJuO2NvbnN0IG49eSgpO24mJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsSW4pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsSW4pLG4uc3R5bGUub3ZlcmZsb3dZPSJhdXRvIixXKG4sclsibm8tdHJhbnNpdGlvbiJdKSl9LERuPShlLHQpPT57bmUodCk/KGUuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iLHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIixJbiksdC5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixJbikpOmUuc3R5bGUub3ZlcmZsb3dZPSJhdXRvIn0sVm49KGUsdCxuKT0+eygoKT0+e2lmKG90JiYhTihkb2N1bWVudC5ib2R5LHIuaW9zZml4KSl7Y29uc3QgZT1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0tMSplKyJweCIseihkb2N1bWVudC5ib2R5LHIuaW9zZml4KSxzdCgpfX0pKCksdCYmImhpZGRlbiIhPT1uJiZ1dChuKSxzZXRUaW1lb3V0KCgpPT57ZS5zY3JvbGxUb3A9MH0pfSxxbj0oZSx0LG4pPT57dmFyIG87bnVsbCE9PShvPW4uc2hvd0NsYXNzKSYmdm9pZCAwIT09byYmby5iYWNrZHJvcCYmeihlLG4uc2hvd0NsYXNzLmJhY2tkcm9wKSxuLmFuaW1hdGlvbj8odC5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsIjAiLCJpbXBvcnRhbnQiKSxYKHQsImdyaWQiKSxzZXRUaW1lb3V0KCgpPT57dmFyIGU7bnVsbCE9PShlPW4uc2hvd0NsYXNzKSYmdm9pZCAwIT09ZSYmZS5wb3B1cCYmeih0LG4uc2hvd0NsYXNzLnBvcHVwKSx0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvcGFjaXR5Iil9LDEwKSk6WCh0LCJncmlkIikseihbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHIuc2hvd24pLG4uaGVpZ2h0QXV0byYmbi5iYWNrZHJvcCYmIW4udG9hc3QmJnooW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxyWyJoZWlnaHQtYXV0byJdKX07dmFyIE5uPShlLHQpPT4vXlthLXpBLVowLTkuK18nLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aMC05LV0rJC8udGVzdChlKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUodHx8IkludmFsaWQgZW1haWwgYWRkcmVzcyIpLF9uPShlLHQpPT4vXmh0dHBzPzpcL1wvKHd3d1wuKT9bLWEtekEtWjAtOUA6JS5fK34jPV17MSwyNTZ9XC5bYS16XXsyLDYzfVxiKFstYS16QS1aMC05QDolXysufiM/Ji89XSopJC8udGVzdChlKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUodHx8IkludmFsaWQgVVJMIik7ZnVuY3Rpb24gUm4oZSl7IWZ1bmN0aW9uKGUpe2UuaW5wdXRWYWxpZGF0b3J8fCgiZW1haWwiPT09ZS5pbnB1dCYmKGUuaW5wdXRWYWxpZGF0b3I9Tm4pLCJ1cmwiPT09ZS5pbnB1dCYmKGUuaW5wdXRWYWxpZGF0b3I9X24pKX0oZSksZS5zaG93TG9hZGVyT25Db25maXJtJiYhZS5wcmVDb25maXJtJiZ1KCJzaG93TG9hZGVyT25Db25maXJtIGlzIHNldCB0byB0cnVlLCBidXQgcHJlQ29uZmlybSBpcyBub3QgZGVmaW5lZC5cbnNob3dMb2FkZXJPbkNvbmZpcm0gc2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBwcmVDb25maXJtLCBzZWUgdXNhZ2UgZXhhbXBsZTpcbmh0dHBzOi8vc3dlZXRhbGVydDIuZ2l0aHViLmlvLyNhamF4LXJlcXVlc3QiKSxmdW5jdGlvbihlKXsoIWUudGFyZ2V0fHwic3RyaW5nIj09dHlwZW9mIGUudGFyZ2V0JiYhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnRhcmdldCl8fCJzdHJpbmciIT10eXBlb2YgZS50YXJnZXQmJiFlLnRhcmdldC5hcHBlbmRDaGlsZCkmJih1KCdUYXJnZXQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiYm9keSInKSxlLnRhcmdldD0iYm9keSIpfShlKSwic3RyaW5nIj09dHlwZW9mIGUudGl0bGUmJihlLnRpdGxlPWUudGl0bGUuc3BsaXQoIlxuIikuam9pbigiPGJyIC8+IikpLHJlKGUpfWxldCBGbjt2YXIgVW49bmV3IFdlYWtNYXA7Y2xhc3Mgem57Y29uc3RydWN0b3IoLi4udCl7aWYobih0aGlzLFVuLFByb21pc2UucmVzb2x2ZSh7aXNDb25maXJtZWQ6ITEsaXNEZW5pZWQ6ITEsaXNEaXNtaXNzZWQ6ITB9KSksInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuO0ZuPXRoaXM7Y29uc3Qgbz1PYmplY3QuZnJlZXplKHRoaXMuY29uc3RydWN0b3IuYXJnc1RvUGFyYW1zKHQpKTt2YXIgaSxzLHI7dGhpcy5wYXJhbXM9byx0aGlzLmlzQXdhaXRpbmdQcm9taXNlPSExLGk9VW4scz10aGlzLHI9dGhpcy5fbWFpbihGbi5wYXJhbXMpLGkuc2V0KGUoaSxzKSxyKX1fbWFpbihlLHQ9e30pe2lmKG5uKE9iamVjdC5hc3NpZ24oe30sdCxlKSksby5jdXJyZW50SW5zdGFuY2Upe2NvbnN0IGU9dHQuc3dhbFByb21pc2VSZXNvbHZlLmdldChvLmN1cnJlbnRJbnN0YW5jZSkse2lzQXdhaXRpbmdQcm9taXNlOnR9PW8uY3VycmVudEluc3RhbmNlO28uY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCksdHx8ZSh7aXNEaXNtaXNzZWQ6ITB9KSxEKCkmJm50KCl9by5jdXJyZW50SW5zdGFuY2U9Rm47Y29uc3Qgbj1LbihlLHQpO1JuKG4pLE9iamVjdC5mcmVlemUobiksby50aW1lb3V0JiYoby50aW1lb3V0LnN0b3AoKSxkZWxldGUgby50aW1lb3V0KSxjbGVhclRpbWVvdXQoby5yZXN0b3JlRm9jdXNUaW1lb3V0KTtjb25zdCBpPVluKEZuKTtyZXR1cm4gRmUoRm4sbiksaGUuaW5uZXJQYXJhbXMuc2V0KEZuLG4pLFduKEZuLGksbil9dGhlbihlKXtyZXR1cm4gdChVbix0aGlzKS50aGVuKGUpfWZpbmFsbHkoZSl7cmV0dXJuIHQoVW4sdGhpcykuZmluYWxseShlKX19Y29uc3QgV249KGUsdCxuKT0+bmV3IFByb21pc2UoKGkscyk9Pntjb25zdCByPXQ9PntlLmNsb3NlKHtpc0Rpc21pc3NlZDohMCxkaXNtaXNzOnQsaXNDb25maXJtZWQ6ITEsaXNEZW5pZWQ6ITF9KX07dHQuc3dhbFByb21pc2VSZXNvbHZlLnNldChlLGkpLHR0LnN3YWxQcm9taXNlUmVqZWN0LnNldChlLHMpLHQuY29uZmlybUJ1dHRvbi5vbmNsaWNrPSgpPT57KGU9Pntjb25zdCB0PWhlLmlubmVyUGFyYW1zLmdldChlKTtlLmRpc2FibGVCdXR0b25zKCksdC5pbnB1dD94dChlLCJjb25maXJtIik6SHQoZSwhMCl9KShlKX0sdC5kZW55QnV0dG9uLm9uY2xpY2s9KCk9PnsoZT0+e2NvbnN0IHQ9aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2UuZGlzYWJsZUJ1dHRvbnMoKSx0LnJldHVybklucHV0VmFsdWVPbkRlbnk/eHQoZSwiZGVueSIpOlN0KGUsITEpfSkoZSl9LHQuY2FuY2VsQnV0dG9uLm9uY2xpY2s9KCk9PnsoKGUsdCk9PntlLmRpc2FibGVCdXR0b25zKCksdCh6ZS5jYW5jZWwpfSkoZSxyKX0sdC5jbG9zZUJ1dHRvbi5vbmNsaWNrPSgpPT57cih6ZS5jbG9zZSl9LCgoZSx0LG4pPT57ZS50b2FzdD9kbihlLHQsbik6KGhuKHQpLGduKHQpLGZuKGUsdCxuKSl9KShuLHQsciksKChlLHQsbik9PntpZihXZShlKSwhdC50b2FzdCl7Y29uc3Qgbz1lPT5aZSh0LGUsbik7ZS5rZXlkb3duSGFuZGxlcj1vO2NvbnN0IGk9dC5rZXlkb3duTGlzdGVuZXJDYXB0dXJlP3dpbmRvdzpDKCk7aWYoaSl7ZS5rZXlkb3duVGFyZ2V0PWksZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlPXQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZTtjb25zdCBuPW87ZS5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLG4se2NhcHR1cmU6ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksZS5rZXlkb3duSGFuZGxlckFkZGVkPSEwfX19KShvLG4sciksKChlLHQpPT57InNlbGVjdCI9PT10LmlucHV0fHwicmFkaW8iPT09dC5pbnB1dD9CdChlLHQpOlsidGV4dCIsImVtYWlsIiwibnVtYmVyIiwidGVsIiwidGV4dGFyZWEiXS5zb21lKGU9PmU9PT10LmlucHV0KSYmKGcodC5pbnB1dFZhbHVlKXx8Yih0LmlucHV0VmFsdWUpKSYmKHd0KFAoKSksJHQoZSx0KSl9KShlLG4pLGpuKG4pLFhuKG8sbixyKSxabih0LG4pLHNldFRpbWVvdXQoKCk9Pnt0LmNvbnRhaW5lci5zY3JvbGxUb3A9MH0pfSksS249KGUsdCk9Pntjb25zdCBuPShlPT57Y29uc3QgdD0ic3RyaW5nIj09dHlwZW9mIGUudGVtcGxhdGU/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnRlbXBsYXRlKTplLnRlbXBsYXRlO2lmKCF0KXJldHVybnt9O2NvbnN0IG49dC5jb250ZW50O3JldHVybiBNbihuKSxPYmplY3QuYXNzaWduKCRuKG4pLExuKG4pLFBuKG4pLHhuKG4pLFRuKG4pLFNuKG4pLE9uKG4sQm4pKX0pKGUpLG89T2JqZWN0LmFzc2lnbih7fSxXdCx0LG4sZSk7cmV0dXJuIG8uc2hvd0NsYXNzPU9iamVjdC5hc3NpZ24oe30sV3Quc2hvd0NsYXNzLG8uc2hvd0NsYXNzKSxvLmhpZGVDbGFzcz1PYmplY3QuYXNzaWduKHt9LFd0LmhpZGVDbGFzcyxvLmhpZGVDbGFzcyksITE9PT1vLmFuaW1hdGlvbiYmKG8uc2hvd0NsYXNzPXtiYWNrZHJvcDoic3dhbDItbm9hbmltYXRpb24ifSxvLmhpZGVDbGFzcz17fSksb30sWW49ZT0+e2NvbnN0IHQ9e3BvcHVwOkMoKSxjb250YWluZXI6eSgpLGFjdGlvbnM6TygpLGNvbmZpcm1CdXR0b246UCgpLGRlbnlCdXR0b246VCgpLGNhbmNlbEJ1dHRvbjp4KCksbG9hZGVyOlMoKSxjbG9zZUJ1dHRvbjpqKCksdmFsaWRhdGlvbk1lc3NhZ2U6TCgpLHByb2dyZXNzU3RlcHM6JCgpfTtyZXR1cm4gaGUuZG9tQ2FjaGUuc2V0KGUsdCksdH0sWG49KGUsdCxuKT0+e2NvbnN0IG89SCgpO1oobyksdC50aW1lciYmKGUudGltZW91dD1uZXcga24oKCk9PntuKCJ0aW1lciIpLGRlbGV0ZSBlLnRpbWVvdXR9LHQudGltZXIpLHQudGltZXJQcm9ncmVzc0JhciYmbyYmKFgobyksXyhvLHQsInRpbWVyUHJvZ3Jlc3NCYXIiKSxzZXRUaW1lb3V0KCgpPT57ZS50aW1lb3V0JiZlLnRpbWVvdXQucnVubmluZyYmb2UodC50aW1lcil9KSkpfSxabj0oZSx0KT0+e2lmKCF0LnRvYXN0KXJldHVybiBoKHQuYWxsb3dFbnRlcktleSk/dm9pZChKbihlKXx8R24oZSx0KXx8S2UoLTEsMSkpOihtKCJhbGxvd0VudGVyS2V5IiwicHJlQ29uZmlybTogKCkgPT4gZmFsc2UiKSx2b2lkIGUucG9wdXAuZm9jdXMoKSl9LEpuPWU9Pntjb25zdCB0PUFycmF5LmZyb20oZS5wb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCJbYXV0b2ZvY3VzXSIpKTtmb3IoY29uc3QgZSBvZiB0KWlmKGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZWUoZSkpcmV0dXJuIGUuZm9jdXMoKSwhMDtyZXR1cm4hMX0sR249KGUsdCk9PnQuZm9jdXNEZW55JiZlZShlLmRlbnlCdXR0b24pPyhlLmRlbnlCdXR0b24uZm9jdXMoKSwhMCk6dC5mb2N1c0NhbmNlbCYmZWUoZS5jYW5jZWxCdXR0b24pPyhlLmNhbmNlbEJ1dHRvbi5mb2N1cygpLCEwKTohKCF0LmZvY3VzQ29uZmlybXx8IWVlKGUuY29uZmlybUJ1dHRvbikpJiYoZS5jb25maXJtQnV0dG9uLmZvY3VzKCksITApO3puLnByb3RvdHlwZS5kaXNhYmxlQnV0dG9ucz1fdCx6bi5wcm90b3R5cGUuZW5hYmxlQnV0dG9ucz1OdCx6bi5wcm90b3R5cGUuZ2V0SW5wdXQ9RHQsem4ucHJvdG90eXBlLmRpc2FibGVJbnB1dD1GdCx6bi5wcm90b3R5cGUuZW5hYmxlSW5wdXQ9UnQsem4ucHJvdG90eXBlLmhpZGVMb2FkaW5nPWp0LHpuLnByb3RvdHlwZS5kaXNhYmxlTG9hZGluZz1qdCx6bi5wcm90b3R5cGUuc2hvd1ZhbGlkYXRpb25NZXNzYWdlPVV0LHpuLnByb3RvdHlwZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlPXp0LHpuLnByb3RvdHlwZS5jbG9zZT1wdCx6bi5wcm90b3R5cGUuY2xvc2VQb3B1cD1wdCx6bi5wcm90b3R5cGUuY2xvc2VNb2RhbD1wdCx6bi5wcm90b3R5cGUuY2xvc2VUb2FzdD1wdCx6bi5wcm90b3R5cGUucmVqZWN0UHJvbWlzZT1odCx6bi5wcm90b3R5cGUudXBkYXRlPW9uLHpuLnByb3RvdHlwZS5fZGVzdHJveT1ybixPYmplY3QuYXNzaWduKHpuLEVuKSxPYmplY3Qua2V5cyh1bikuZm9yRWFjaChlPT57em5bZV09ZnVuY3Rpb24oLi4udCl7aWYoRm4mJkZuW2VdKXJldHVybiBGbltlXSguLi50KX19KSx6bi5EaXNtaXNzUmVhc29uPXplLHpuLnZlcnNpb249IjExLjI2LjIyIjtjb25zdCBRbj16bjtyZXR1cm4gUW4uZGVmYXVsdD1RbixRbn0pLHZvaWQgMCE9PXRoaXMmJnRoaXMuU3dlZXRhbGVydDImJih0aGlzLnN3YWw9dGhpcy5zd2VldEFsZXJ0PXRoaXMuU3dhbD10aGlzLlN3ZWV0QWxlcnQ9dGhpcy5Td2VldGFsZXJ0Mik7CiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2lmKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChuKSxuLnN0eWxlU2hlZXQpbi5zdHlsZVNoZWV0LmRpc2FibGVkfHwobi5zdHlsZVNoZWV0LmNzc1RleHQ9dCk7ZWxzZSB0cnl7bi5pbm5lckhUTUw9dH1jYXRjaChlKXtuLmlubmVyVGV4dD10fX0oZG9jdW1lbnQsIjpyb290ey0tc3dhbDItb3V0bGluZTogMCAwIDAgM3B4IHJnYmEoMTAwLCAxNTAsIDIwMCwgMC41KTstLXN3YWwyLWNvbnRhaW5lci1wYWRkaW5nOiAwLjYyNWVtOy0tc3dhbDItYmFja2Ryb3A6IHJnYmEoMCwgMCwgMCwgMC40KTstLXN3YWwyLWJhY2tkcm9wLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXM7LS1zd2FsMi13aWR0aDogMzJlbTstLXN3YWwyLXBhZGRpbmc6IDAgMCAxLjI1ZW07LS1zd2FsMi1ib3JkZXI6IG5vbmU7LS1zd2FsMi1ib3JkZXItcmFkaXVzOiAwLjMxMjVyZW07LS1zd2FsMi1iYWNrZ3JvdW5kOiB3aGl0ZTstLXN3YWwyLWNvbG9yOiAjNTQ1NDU0Oy0tc3dhbDItc2hvdy1hbmltYXRpb246IHN3YWwyLXNob3cgMC4zczstLXN3YWwyLWhpZGUtYW5pbWF0aW9uOiBzd2FsMi1oaWRlIDAuMTVzIGZvcndhcmRzOy0tc3dhbDItaWNvbi16b29tOiAxOy0tc3dhbDItaWNvbi1hbmltYXRpb25zOiB0cnVlOy0tc3dhbDItdGl0bGUtcGFkZGluZzogMC44ZW0gMWVtIDA7LS1zd2FsMi1odG1sLWNvbnRhaW5lci1wYWRkaW5nOiAxZW0gMS42ZW0gMC4zZW07LS1zd2FsMi1pbnB1dC1ib3JkZXI6IDFweCBzb2xpZCAjZDlkOWQ5Oy0tc3dhbDItaW5wdXQtYm9yZGVyLXJhZGl1czogMC4xODc1ZW07LS1zd2FsMi1pbnB1dC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA2KSwgMCAwIDAgM3B4IHRyYW5zcGFyZW50Oy0tc3dhbDItaW5wdXQtYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7LS1zd2FsMi1pbnB1dC10cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycywgYm94LXNoYWRvdyAwLjJzOy0tc3dhbDItaW5wdXQtaG92ZXItYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNiksIDAgMCAwIDNweCB0cmFuc3BhcmVudDstLXN3YWwyLWlucHV0LWZvY3VzLWJvcmRlcjogMXB4IHNvbGlkICNiNGRiZWQ7LS1zd2FsMi1pbnB1dC1mb2N1cy1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA2KSwgMCAwIDAgM3B4IHJnYmEoMTAwLCAxNTAsIDIwMCwgMC41KTstLXN3YWwyLXByb2dyZXNzLXN0ZXAtYmFja2dyb3VuZDogI2FkZDhlNjstLXN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZS1iYWNrZ3JvdW5kOiAjZjBmMGYwOy0tc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdlLWNvbG9yOiAjNjY2Oy0tc3dhbDItZm9vdGVyLWJvcmRlci1jb2xvcjogI2VlZTstLXN3YWwyLWZvb3Rlci1iYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDstLXN3YWwyLWZvb3Rlci1jb2xvcjogaW5oZXJpdDstLXN3YWwyLXRpbWVyLXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMyk7LS1zd2FsMi1jbG9zZS1idXR0b24tcG9zaXRpb246IGluaXRpYWw7LS1zd2FsMi1jbG9zZS1idXR0b24taW5zZXQ6IGF1dG87LS1zd2FsMi1jbG9zZS1idXR0b24tZm9udC1zaXplOiAyLjVlbTstLXN3YWwyLWNsb3NlLWJ1dHRvbi1jb2xvcjogI2NjYzstLXN3YWwyLWNsb3NlLWJ1dHRvbi10cmFuc2l0aW9uOiBjb2xvciAwLjJzLCBib3gtc2hhZG93IDAuMnM7LS1zd2FsMi1jbG9zZS1idXR0b24tb3V0bGluZTogaW5pdGlhbDstLXN3YWwyLWNsb3NlLWJ1dHRvbi1ib3gtc2hhZG93OiBpbnNldCAwIDAgMCAzcHggdHJhbnNwYXJlbnQ7LS1zd2FsMi1jbG9zZS1idXR0b24tZm9jdXMtYm94LXNoYWRvdzogaW5zZXQgdmFyKC0tc3dhbDItb3V0bGluZSk7LS1zd2FsMi1jbG9zZS1idXR0b24taG92ZXItdHJhbnNmb3JtOiBub25lOy0tc3dhbDItYWN0aW9ucy1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjstLXN3YWwyLWFjdGlvbnMtd2lkdGg6IGF1dG87LS1zd2FsMi1hY3Rpb25zLW1hcmdpbjogMS4yNWVtIGF1dG8gMDstLXN3YWwyLWFjdGlvbnMtcGFkZGluZzogMDstLXN3YWwyLWFjdGlvbnMtYm9yZGVyLXJhZGl1czogMDstLXN3YWwyLWFjdGlvbnMtYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7LS1zd2FsMi1hY3Rpb24tYnV0dG9uLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycywgYm94LXNoYWRvdyAwLjJzOy0tc3dhbDItYWN0aW9uLWJ1dHRvbi1ob3ZlcjogYmxhY2sgMTAlOy0tc3dhbDItYWN0aW9uLWJ1dHRvbi1hY3RpdmU6IGJsYWNrIDEwJTstLXN3YWwyLWNvbmZpcm0tYnV0dG9uLWJveC1zaGFkb3c6IG5vbmU7LS1zd2FsMi1jb25maXJtLWJ1dHRvbi1ib3JkZXItcmFkaXVzOiAwLjI1ZW07LS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yOiAjNzA2NmUwOy0tc3dhbDItY29uZmlybS1idXR0b24tY29sb3I6ICNmZmY7LS1zd2FsMi1kZW55LWJ1dHRvbi1ib3gtc2hhZG93OiBub25lOy0tc3dhbDItZGVueS1idXR0b24tYm9yZGVyLXJhZGl1czogMC4yNWVtOy0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvcjogI2RjMzc0MTstLXN3YWwyLWRlbnktYnV0dG9uLWNvbG9yOiAjZmZmOy0tc3dhbDItY2FuY2VsLWJ1dHRvbi1ib3gtc2hhZG93OiBub25lOy0tc3dhbDItY2FuY2VsLWJ1dHRvbi1ib3JkZXItcmFkaXVzOiAwLjI1ZW07LS1zd2FsMi1jYW5jZWwtYnV0dG9uLWJhY2tncm91bmQtY29sb3I6ICM2ZTc4ODE7LS1zd2FsMi1jYW5jZWwtYnV0dG9uLWNvbG9yOiAjZmZmOy0tc3dhbDItdG9hc3Qtc2hvdy1hbmltYXRpb246IHN3YWwyLXRvYXN0LXNob3cgMC41czstLXN3YWwyLXRvYXN0LWhpZGUtYW5pbWF0aW9uOiBzd2FsMi10b2FzdC1oaWRlIDAuMXMgZm9yd2FyZHM7LS1zd2FsMi10b2FzdC1ib3JkZXI6IG5vbmU7LS1zd2FsMi10b2FzdC1ib3gtc2hhZG93OiAwIDAgMXB4IGhzbCgwZGVnIDAlIDAlIC8gMC4wNzUpLCAwIDFweCAycHggaHNsKDBkZWcgMCUgMCUgLyAwLjA3NSksIDFweCAycHggNHB4IGhzbCgwZGVnIDAlIDAlIC8gMC4wNzUpLCAxcHggM3B4IDhweCBoc2woMGRlZyAwJSAwJSAvIDAuMDc1KSwgMnB4IDRweCAxNnB4IGhzbCgwZGVnIDAlIDAlIC8gMC4wNzUpfVtkYXRhLXN3YWwyLXRoZW1lPWRhcmtdey0tc3dhbDItZGFyay10aGVtZS1ibGFjazogIzE5MTkxYTstLXN3YWwyLWRhcmstdGhlbWUtd2hpdGU6ICNlMWUxZTE7LS1zd2FsMi1iYWNrZ3JvdW5kOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKTstLXN3YWwyLWNvbG9yOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLXdoaXRlKTstLXN3YWwyLWZvb3Rlci1ib3JkZXItY29sb3I6ICM1NTU7LS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGFyay10aGVtZS1ibGFjayksIHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpIDEwJSk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtYmFja2dyb3VuZDogY29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKSwgdmFyKC0tc3dhbDItZGFyay10aGVtZS13aGl0ZSkgMTAlICk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtY29sb3I6IHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpOy0tc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KX1AbWVkaWEocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspe1tkYXRhLXN3YWwyLXRoZW1lPWF1dG9dey0tc3dhbDItZGFyay10aGVtZS1ibGFjazogIzE5MTkxYTstLXN3YWwyLWRhcmstdGhlbWUtd2hpdGU6ICNlMWUxZTE7LS1zd2FsMi1iYWNrZ3JvdW5kOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKTstLXN3YWwyLWNvbG9yOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLXdoaXRlKTstLXN3YWwyLWZvb3Rlci1ib3JkZXItY29sb3I6ICM1NTU7LS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGFyay10aGVtZS1ibGFjayksIHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpIDEwJSk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtYmFja2dyb3VuZDogY29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKSwgdmFyKC0tc3dhbDItZGFyay10aGVtZS13aGl0ZSkgMTAlICk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtY29sb3I6IHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpOy0tc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KX19Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wLC5zd2FsMi10b2FzdC1zaG93bil7b3ZlcmZsb3c6aGlkZGVufWJvZHkuc3dhbDItaGVpZ2h0LWF1dG97aGVpZ2h0OmF1dG8gIWltcG9ydGFudH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApICFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIgLnN3YWwyLXBvcHVwe3BvaW50ZXItZXZlbnRzOmF1dG99Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyIC5zd2FsMi1tb2RhbHtib3gtc2hhZG93OjAgMCAxMHB4IHZhcigtLXN3YWwyLWJhY2tkcm9wKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXJ7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjM2MHB4O21heC13aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKTtwb2ludGVyLWV2ZW50czpub25lfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7aW5zZXQ6MCBhdXRvIGF1dG8gNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7aW5zZXQ6MCAwIGF1dG8gYXV0b31ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtbGVmdHtpbnNldDowIGF1dG8gYXV0byAwfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0e2luc2V0OjUwJSBhdXRvIGF1dG8gMDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye2luc2V0OjUwJSBhdXRvIGF1dG8gNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodHtpbnNldDo1MCUgMCBhdXRvIGF1dG87dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1zdGFydCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnR7aW5zZXQ6YXV0byBhdXRvIDAgMH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te2luc2V0OmF1dG8gYXV0byAwIDUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e2luc2V0OmF1dG8gMCAwIGF1dG99QG1lZGlhIHByaW50e2JvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCwuc3dhbDItdG9hc3Qtc2hvd24pe292ZXJmbG93LXk6c2Nyb2xsICFpbXBvcnRhbnR9Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wLC5zd2FsMi10b2FzdC1zaG93bik+W2FyaWEtaGlkZGVuPXRydWVde2Rpc3BsYXk6bm9uZX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3AsLnN3YWwyLXRvYXN0LXNob3duKSAuc3dhbDItY29udGFpbmVye3Bvc2l0aW9uOnN0YXRpYyAhaW1wb3J0YW50fX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcil7ZGlzcGxheTpncmlkO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTA2MDtpbnNldDowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLXRlbXBsYXRlLWFyZWFzOlwidG9wLXN0YXJ0ICAgICB0b3AgICAgICAgICAgICB0b3AtZW5kXCIgXCJjZW50ZXItc3RhcnQgIGNlbnRlciAgICAgICAgIGNlbnRlci1lbmRcIiBcImJvdHRvbS1zdGFydCAgYm90dG9tLWNlbnRlciAgYm90dG9tLWVuZFwiO2dyaWQtdGVtcGxhdGUtcm93czptaW5tYXgobWluLWNvbnRlbnQsIGF1dG8pIG1pbm1heChtaW4tY29udGVudCwgYXV0bykgbWlubWF4KG1pbi1jb250ZW50LCBhdXRvKTtoZWlnaHQ6MTAwJTtwYWRkaW5nOnZhcigtLXN3YWwyLWNvbnRhaW5lci1wYWRkaW5nKTtvdmVyZmxvdy14OmhpZGRlbjt0cmFuc2l0aW9uOnZhcigtLXN3YWwyLWJhY2tkcm9wLXRyYW5zaXRpb24pOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1iYWNrZHJvcC1zaG93LGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1ub2FuaW1hdGlvbntiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLWJhY2tkcm9wKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItYmFja2Ryb3AtaGlkZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCkgIWltcG9ydGFudH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItdG9wLXN0YXJ0LGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1jZW50ZXItc3RhcnQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1zdGFydHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsIDFmcikgYXV0byBhdXRvfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi10b3AsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlcixkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItYm90dG9te2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvIG1pbm1heCgwLCAxZnIpIGF1dG99ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLXRvcC1lbmQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1lbmQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1lbmR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gYXV0byBtaW5tYXgoMCwgMWZyKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItdG9wLXN0YXJ0Pi5zd2FsMi1wb3B1cHthbGlnbi1zZWxmOnN0YXJ0fWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi10b3A+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjI7cGxhY2Utc2VsZjpzdGFydCBjZW50ZXJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLXRvcC1lbmQ+LnN3YWwyLXBvcHVwLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi10b3AtcmlnaHQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjM7cGxhY2Utc2VsZjpzdGFydCBlbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1zdGFydD4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1sZWZ0Pi5zd2FsMi1wb3B1cHtncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1jZW50ZXI+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjI7Z3JpZC1yb3c6MjtwbGFjZS1zZWxmOmNlbnRlciBjZW50ZXJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1lbmQ+LnN3YWwyLXBvcHVwLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1jZW50ZXItcmlnaHQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjM7Z3JpZC1yb3c6MjtwbGFjZS1zZWxmOmNlbnRlciBlbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1zdGFydD4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1sZWZ0Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoxO2dyaWQtcm93OjM7YWxpZ24tc2VsZjplbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbT4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzozO3BsYWNlLXNlbGY6ZW5kIGNlbnRlcn1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItYm90dG9tLWVuZD4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzozO3BsYWNlLXNlbGY6ZW5kIGVuZH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItZ3Jvdy1yb3c+LnN3YWwyLXBvcHVwLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1ncm93LWZ1bGxzY3JlZW4+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjEvNDt3aWR0aDoxMDAlfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1ncm93LWNvbHVtbj4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWdyb3ctZnVsbHNjcmVlbj4uc3dhbDItcG9wdXB7Z3JpZC1yb3c6MS80O2FsaWduLXNlbGY6c3RyZXRjaH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItbm8tdHJhbnNpdGlvbnt0cmFuc2l0aW9uOm5vbmUgIWltcG9ydGFudH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcilbcG9wb3Zlcl17d2lkdGg6YXV0bztib3JkZXI6MH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi1wb3B1cCl7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsIDEwMCUpO3dpZHRoOnZhcigtLXN3YWwyLXdpZHRoKTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOnZhcigtLXN3YWwyLXBhZGRpbmcpO2JvcmRlcjp2YXIoLS1zd2FsMi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tc3dhbDItYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1iYWNrZ3JvdW5kKTtjb2xvcjp2YXIoLS1zd2FsMi1jb2xvcik7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MXJlbTtjb250YWluZXItbmFtZTpzd2FsMi1wb3B1cH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi1wb3B1cCk6Zm9jdXN7b3V0bGluZTpub25lfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXBvcHVwKS5zd2FsMi1sb2FkaW5ne292ZXJmbG93LXk6aGlkZGVufWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXBvcHVwKS5zd2FsMi1kcmFnZ2FibGV7Y3Vyc29yOmdyYWJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItcG9wdXApLnN3YWwyLWRyYWdnYWJsZSBkaXY6d2hlcmUoLnN3YWwyLWljb24pe2N1cnNvcjpncmFifWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXBvcHVwKS5zd2FsMi1kcmFnZ2luZ3tjdXJzb3I6Z3JhYmJpbmd9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItcG9wdXApLnN3YWwyLWRyYWdnaW5nIGRpdjp3aGVyZSguc3dhbDItaWNvbil7Y3Vyc29yOmdyYWJiaW5nfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBoMjp3aGVyZSguc3dhbDItdGl0bGUpe3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO21hcmdpbjowO3BhZGRpbmc6dmFyKC0tc3dhbDItdGl0bGUtcGFkZGluZyk7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS44NzVlbTtmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC10cmFuc2Zvcm06bm9uZTtvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Y3Vyc29yOmluaXRpYWx9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItYWN0aW9ucyl7ZGlzcGxheTpmbGV4O3otaW5kZXg6MTtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDp2YXIoLS1zd2FsMi1hY3Rpb25zLWp1c3RpZnktY29udGVudCk7d2lkdGg6dmFyKC0tc3dhbDItYWN0aW9ucy13aWR0aCk7bWFyZ2luOnZhcigtLXN3YWwyLWFjdGlvbnMtbWFyZ2luKTtwYWRkaW5nOnZhcigtLXN3YWwyLWFjdGlvbnMtcGFkZGluZyk7Ym9yZGVyLXJhZGl1czp2YXIoLS1zd2FsMi1hY3Rpb25zLWJvcmRlci1yYWRpdXMpO2JhY2tncm91bmQ6dmFyKC0tc3dhbDItYWN0aW9ucy1iYWNrZ3JvdW5kKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi1sb2FkZXIpe2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyLjJlbTtoZWlnaHQ6Mi4yZW07bWFyZ2luOjAgMS44NzVlbTthbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2JvcmRlci13aWR0aDouMjVlbTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czoxMDAlO2JvcmRlci1jb2xvcjojMjc3OGM0IHJnYmEoMCwwLDAsMCkgIzI3NzhjNCByZ2JhKDAsMCwwLDApfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCl7bWFyZ2luOi4zMTI1ZW07cGFkZGluZzouNjI1ZW0gMS4xZW07dHJhbnNpdGlvbjp2YXIoLS1zd2FsMi1hY3Rpb24tYnV0dG9uLXRyYW5zaXRpb24pO2JvcmRlcjpub25lO2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMCwwLDAsMCk7Zm9udC13ZWlnaHQ6NTAwfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6bm90KFtkaXNhYmxlZF0pe2N1cnNvcjpwb2ludGVyfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6d2hlcmUoLnN3YWwyLWNvbmZpcm0pe2JvcmRlci1yYWRpdXM6dmFyKC0tc3dhbDItY29uZmlybS1idXR0b24tYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6dmFyKC0tc3dhbDItY29uZmlybS1idXR0b24tYmFja2dyb3VuZC1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1ib3gtc2hhZG93KTtjb2xvcjp2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1jb2xvcik7Zm9udC1zaXplOjFlbX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1jb25maXJtKTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yKSwgdmFyKC0tc3dhbDItYWN0aW9uLWJ1dHRvbi1ob3ZlcikpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6d2hlcmUoLnN3YWwyLWNvbmZpcm0pOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yKSwgdmFyKC0tc3dhbDItYWN0aW9uLWJ1dHRvbi1hY3RpdmUpKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1kZW55KXtib3JkZXItcmFkaXVzOnZhcigtLXN3YWwyLWRlbnktYnV0dG9uLWJvcmRlci1yYWRpdXMpO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXN3YWwyLWRlbnktYnV0dG9uLWJhY2tncm91bmQtY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tc3dhbDItZGVueS1idXR0b24tYm94LXNoYWRvdyk7Y29sb3I6dmFyKC0tc3dhbDItZGVueS1idXR0b24tY29sb3IpO2ZvbnQtc2l6ZToxZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItc3R5bGVkKTp3aGVyZSguc3dhbDItZGVueSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvciksIHZhcigtLXN3YWwyLWFjdGlvbi1idXR0b24taG92ZXIpKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1kZW55KTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvciksIHZhcigtLXN3YWwyLWFjdGlvbi1idXR0b24tYWN0aXZlKSl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItc3R5bGVkKTp3aGVyZ™I޾C^Sguc3dhbDItY2FuY2VsKXtib3JkZXItcmFkaXVzOnZhcigtLXN3YWwyLWNhbmNlbC1idXR0b24tYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6dmFyKC0tc3dhbDItY2FuY2VsLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXN3YWwyLWNhbmNlbC1idXR0b24tYm94LXNoYWRvdyk7Y29sb3I6dmFyKC0tc3dhbDItY2FuY2VsLWJ1dHRvbi1jb2xvcik7Zm9udC1zaXplOjFlbX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1jYW5jZWwpOmhvdmVye2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN3YWwyLWNhbmNlbC1idXR0b24tYmFja2dyb3VuZC1jb2xvciksIHZhcigtLXN3YWwyLWFjdGlvbi1idXR0b24taG92ZXIpKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1jYW5jZWwpOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zd2FsMi1jYW5jZWwtYnV0dG9uLWJhY2tncm91bmQtY29sb3IpLCB2YXIoLS1zd2FsMi1hY3Rpb24tYnV0dG9uLWFjdGl2ZSkpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOm5vbmU7Ym94LXNoYWRvdzp2YXIoLS1zd2FsMi1hY3Rpb24tYnV0dG9uLWZvY3VzLWJveC1zaGFkb3cpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZClbZGlzYWJsZWRdOm5vdCguc3dhbDItbG9hZGluZyl7b3BhY2l0eTouNH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLWZvb3Rlcil7bWFyZ2luOjFlbSAwIDA7cGFkZGluZzoxZW0gMWVtIDA7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tc3dhbDItZm9vdGVyLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1mb290ZXItYmFja2dyb3VuZCk7Y29sb3I6dmFyKC0tc3dhbDItZm9vdGVyLWNvbG9yKTtmb250LXNpemU6MWVtO3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjppbml0aWFsfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtncmlkLWNvbHVtbjphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOnZhcigtLXN3YWwyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tc3dhbDItYm9yZGVyLXJhZGl1cyl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyKXt3aWR0aDoxMDAlO2hlaWdodDouMjVlbTtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLXRpbWVyLXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgaW1nOndoZXJlKC5zd2FsMi1pbWFnZSl7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjJlbSBhdXRvIDFlbTtjdXJzb3I6aW5pdGlhbH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1jbG9zZSl7cG9zaXRpb246dmFyKC0tc3dhbDItY2xvc2UtYnV0dG9uLXBvc2l0aW9uKTtpbnNldDp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24taW5zZXQpO3otaW5kZXg6MjthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxLjJlbTtoZWlnaHQ6MS4yZW07bWFyZ2luLXRvcDowO21hcmdpbi1yaWdodDowO21hcmdpbi1ib3R0b206LTEuMmVtO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24tdHJhbnNpdGlvbik7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czp2YXIoLS1zd2FsMi1ib3JkZXItcmFkaXVzKTtvdXRsaW5lOnZhcigtLXN3YWwyLWNsb3NlLWJ1dHRvbi1vdXRsaW5lKTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Y29sb3I6dmFyKC0tc3dhbDItY2xvc2UtYnV0dG9uLWNvbG9yKTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOnZhcigtLXN3YWwyLWNsb3NlLWJ1dHRvbi1mb250LXNpemUpO2N1cnNvcjpwb2ludGVyO2p1c3RpZnktc2VsZjplbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItY2xvc2UpOmhvdmVye3RyYW5zZm9ybTp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24taG92ZXItdHJhbnNmb3JtKTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Y29sb3I6I2YyNzQ3NH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1jbG9zZSk6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOm5vbmU7Ym94LXNoYWRvdzp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24tZm9jdXMtYm94LXNoYWRvdyl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItY2xvc2UpOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLWh0bWwtY29udGFpbmVyKXt6LWluZGV4OjE7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MDtwYWRkaW5nOnZhcigtLXN3YWwyLWh0bWwtY29udGFpbmVyLXBhZGRpbmcpO292ZXJmbG93OmF1dG87Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbTtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6bm9ybWFsO3RleHQtYWxpZ246Y2VudGVyO292ZXJmbG93LXdyYXA6YnJlYWstd29yZDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Y3Vyc29yOmluaXRpYWx9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCksZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1maWxlKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgdGV4dGFyZWE6d2hlcmUoLnN3YWwyLXRleHRhcmVhKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgc2VsZWN0OndoZXJlKC5zd2FsMi1zZWxlY3QpLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXJhZGlvKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgbGFiZWw6d2hlcmUoLnN3YWwyLWNoZWNrYm94KXttYXJnaW46MWVtIDJlbSAzcHh9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCksZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1maWxlKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgdGV4dGFyZWE6d2hlcmUoLnN3YWwyLXRleHRhcmVhKXtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6YXV0bzt0cmFuc2l0aW9uOnZhcigtLXN3YWwyLWlucHV0LXRyYW5zaXRpb24pO2JvcmRlcjp2YXIoLS1zd2FsMi1pbnB1dC1ib3JkZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tc3dhbDItaW5wdXQtYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kKTtib3gtc2hhZG93OnZhcigtLXN3YWwyLWlucHV0LWJveC1zaGFkb3cpO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCkuc3dhbDItaW5wdXRlcnJvcixkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgaW5wdXQ6d2hlcmUoLnN3YWwyLWZpbGUpLnN3YWwyLWlucHV0ZXJyb3IsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIHRleHRhcmVhOndoZXJlKC5zd2FsMi10ZXh0YXJlYSkuc3dhbDItaW5wdXRlcnJvcntib3JkZXItY29sb3I6I2YyNzQ3NCAhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDJweCAjZjI3NDc0ICFpbXBvcnRhbnR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCk6aG92ZXIsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1maWxlKTpob3ZlcixkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgdGV4dGFyZWE6d2hlcmUoLnN3YWwyLXRleHRhcmVhKTpob3Zlcntib3gtc2hhZG93OnZhcigtLXN3YWwyLWlucHV0LWhvdmVyLWJveC1zaGFkb3cpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBpbnB1dDp3aGVyZSguc3dhbDItaW5wdXQpOmZvY3VzLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBpbnB1dDp3aGVyZSguc3dhbDItZmlsZSk6Zm9jdXMsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIHRleHRhcmVhOndoZXJlKC5zd2FsMi10ZXh0YXJlYSk6Zm9jdXN7Ym9yZGVyOnZhcigtLXN3YWwyLWlucHV0LWZvY3VzLWJvcmRlcik7b3V0bGluZTpub25lO2JveC1zaGFkb3c6dmFyKC0tc3dhbDItaW5wdXQtZm9jdXMtYm94LXNoYWRvdyl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCk6OnBsYWNlaG9sZGVyLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBpbnB1dDp3aGVyZSguc3dhbDItZmlsZSk6OnBsYWNlaG9sZGVyLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSB0ZXh0YXJlYTp3aGVyZSguc3dhbDItdGV4dGFyZWEpOjpwbGFjZWhvbGRlcntjb2xvcjojY2NjfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcmFuZ2V7bWFyZ2luOjFlbSAyZW0gM3B4O2JhY2tncm91bmQ6dmFyKC0tc3dhbDItYmFja2dyb3VuZCl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYW5nZSBpbnB1dHt3aWR0aDo4MCV9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYW5nZSBvdXRwdXR7d2lkdGg6MjAlO2NvbG9yOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246Y2VudGVyfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcmFuZ2UgaW5wdXQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYW5nZSBvdXRwdXR7aGVpZ2h0OjIuNjI1ZW07cGFkZGluZzowO2ZvbnQtc2l6ZToxLjEyNWVtO2xpbmUtaGVpZ2h0OjIuNjI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1pbnB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjAgLjc1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1maWxle3dpZHRoOjc1JTttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvO2JhY2tncm91bmQ6dmFyKC0tc3dhbDItaW5wdXQtYmFja2dyb3VuZCk7Zm9udC1zaXplOjEuMTI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi10ZXh0YXJlYXtoZWlnaHQ6Ni43NWVtO3BhZGRpbmc6Ljc1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1zZWxlY3R7bWluLXdpZHRoOjUwJTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOi4zNzVlbSAuNjI1ZW07YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kKTtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcmFkaW8sZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1jaGVja2JveHthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLWJhY2tncm91bmQpO2NvbG9yOmluaGVyaXR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYWRpbyBsYWJlbCxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLWNoZWNrYm94IGxhYmVse21hcmdpbjowIC42ZW07Zm9udC1zaXplOjEuMTI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYWRpbyBpbnB1dCxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLWNoZWNrYm94IGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgbGFiZWw6d2hlcmUoLnN3YWwyLWlucHV0LWxhYmVsKXtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIGF1dG8gMH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2Upe2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxZW0gMCAwO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZS1iYWNrZ3JvdW5kKTtjb2xvcjp2YXIoLS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtY29sb3IpO2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6MzAwfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZSk6OmJlZm9yZXtjb250ZW50OlwiIVwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEuNWVtO21pbi13aWR0aDoxLjVlbTtoZWlnaHQ6MS41ZW07bWFyZ2luOjAgLjYyNWVtO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NDtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjYwMDtsaW5lLWhlaWdodDoxLjVlbTt0ZXh0LWFsaWduOmNlbnRlcn1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLXByb2dyZXNzLXN0ZXBze2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjttYXgtd2lkdGg6MTAwJTttYXJnaW46MS4yNWVtIGF1dG87cGFkZGluZzowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwKTtmb250LXdlaWdodDo2MDB9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1wcm9ncmVzcy1zdGVwcyBsaXtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwe3otaW5kZXg6MjA7ZmxleC1zaHJpbms6MDt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjJlbTtiYWNrZ3JvdW5kOiMyNzc4YzQ7Y29sb3I6I2ZmZjtsaW5lLWhlaWdodDoyZW07dGV4dC1hbGlnbjpjZW50ZXJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiMyNzc4YzR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcH4uc3dhbDItcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLXByb2dyZXNzLXN0ZXAtYmFja2dyb3VuZCk7Y29sb3I6I2ZmZn1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1wcm9ncmVzcy1zdGVwLWJhY2tncm91bmQpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXt6LWluZGV4OjEwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6Mi41ZW07aGVpZ2h0Oi40ZW07bWFyZ2luOjAgLTFweDtiYWNrZ3JvdW5kOiMyNzc4YzR9ZGl2OndoZXJlKC5zd2FsMi1pY29uKXtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6NWVtO2hlaWdodDo1ZW07bWFyZ2luOjIuNWVtIGF1dG8gLjZlbTt6b29tOnZhcigtLXN3YWwyLWljb24tem9vbSk7Ym9yZGVyOi4yNWVtIHNvbGlkIHJnYmEoMCwwLDAsMCk7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyLWNvbG9yOiMwMDA7Zm9udC1mYW1pbHk6aW5oZXJpdDtsaW5lLWhlaWdodDo1ZW07Y3Vyc29yOmRlZmF1bHQ7dXNlci1zZWxlY3Q6bm9uZX1kaXY6d2hlcmUoLnN3YWwyLWljb24pIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6My43NWVtfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2YyNzQ3NH1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLWVycm9yIC5zd2FsMi14LW1hcmt7cG9zaXRpb246cmVsYXRpdmU7ZmxleC1ncm93OjF9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoyLjMxMjVlbTt3aWR0aDoyLjkzNzVlbTtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzR9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDoxLjA2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVdW2NsYXNzJD1yaWdodF17cmlnaHQ6MWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX1AY29udGFpbmVyIHN3YWwyLXBvcHVwIHN0eWxlKC0tc3dhbDItaWNvbi1hbmltYXRpb25zOnRydWUpe2Rpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93IC5zd2FsMi14LW1hcmt7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrIC41c319ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi13YXJuaW5ne2JvcmRlci1jb2xvcjojZjhiYjg2O2NvbG9yOiNmOGJiODZ9QGNvbnRhaW5lciBzd2FsMi1wb3B1cCBzdHlsZSgtLXN3YWwyLWljb24tYW5pbWF0aW9uczp0cnVlKXtkaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXdhcm5pbmcuc3dhbDItaWNvbi1zaG93e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItd2FybmluZy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLWljb24tY29udGVudHthbmltYXRpb246c3dhbDItYW5pbWF0ZS1pLW1hcmsgLjVzfX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLWluZm97Ym9yZGVyLWNvbG9yOiMzZmMzZWU7Y29sb3I6IzNmYzNlZX1AY29udGFpbmVyIHN3YWwyLXBvcHVwIHN0eWxlKC0tc3dhbDItaWNvbi1hbmltYXRpb25zOnRydWUpe2Rpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItaW5mby5zd2FsMi1pY29uLXNob3d7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1pbmZvLnN3YWwyLWljb24tc2hvdyAuc3dhbDItaWNvbi1jb250ZW50e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuOHN9fWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItcXVlc3Rpb257Ym9yZGVyLWNvbG9yOiM4N2FkYmQ7Y29sb3I6Izg3YWRiZH1AY29udGFpbmVyIHN3YWwyLXBvcHVwIHN0eWxlKC0tc3dhbDItaWNvbi1hbmltYXRpb25zOnRydWUpe2Rpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93IC5zd2FsMi1pY29uLWNvbnRlbnR7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFyayAuOHN9fWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Njtjb2xvcjojYTVkYzg2fWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6My43NWVtO2hlaWdodDo3LjVlbTtib3JkZXItcmFkaXVzOjUwJX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LTAuNDM3NWVtO2xlZnQ6LTIuMDYzNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjMuNzVlbSAzLjc1ZW07Ym9yZGVyLXJhZGl1czo3LjVlbSAwIDAgNy41ZW19ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotMC42ODc1ZW07bGVmdDoxLjg3NWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjAgMy43NWVtO2JvcmRlci1yYWRpdXM6MCA3LjVlbSA3LjVlbSAwfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6LTAuMjVlbTtsZWZ0Oi0wLjI1ZW07Ym94LXNpemluZzpjb250ZW50LWJveDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjouMjVlbSBzb2xpZCByZ2JhKDE2NSwyMjAsMTM0LC4zKTtib3JkZXItcmFkaXVzOjUwJX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6LjVlbTtsZWZ0OjEuNjI1ZW07d2lkdGg6LjQzNzVlbTtoZWlnaHQ6NS42MjVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNhNWRjODZ9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6Mi44NzVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9QGNvbnRhaW5lciBzd2FsMi1wb3B1cCBzdHlsZSgtLXN3YWwyLWljb24tYW5pbWF0aW9uczp0cnVlKXtkaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwe2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c31kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3thbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodHthbmltYXRpb246c3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWlufX1bY2xhc3NePXN3YWwyXXstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX0uc3dhbDItc2hvd3thbmltYXRpb246dmFyKC0tc3dhbDItc2hvdy1hbmltYXRpb24pfS5zd2FsMi1oaWRle2FuaW1hdGlvbjp2YXIoLS1zd2FsMi1oaWRlLWFuaW1hdGlvbil9LnN3YWwyLW5vYW5pbWF0aW9ue3RyYW5zaXRpb246bm9uZX0uc3dhbDItc2Nyb2xsYmFyLW1lYXN1cmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5cHg7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpzY3JvbGx9LnN3YWwyLXJ0bCAuc3dhbDItY2xvc2V7bWFyZ2luLXJpZ2h0OmluaXRpYWw7bWFyZ2luLWxlZnQ6MH0uc3dhbDItcnRsIC5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7cmlnaHQ6MDtsZWZ0OmF1dG99LnN3YWwyLXRvYXN0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLWNvbHVtbjoxLzQgIWltcG9ydGFudDtncmlkLXJvdzoxLzQgIWltcG9ydGFudDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWluLWNvbnRlbnQgYXV0byBtaW4tY29udGVudDtwYWRkaW5nOjFlbTtvdmVyZmxvdy15OmhpZGRlbjtib3JkZXI6dmFyKC0tc3dhbDItdG9hc3QtYm9yZGVyKTtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLWJhY2tncm91bmQpO2JveC1zaGFkb3c6dmFyKC0tc3dhbDItdG9hc3QtYm94LXNoYWRvdyk7cG9pbnRlci1ldmVudHM6YXV0b30uc3dhbDItdG9hc3Q+KntncmlkLWNvbHVtbjoyfS5zd2FsMi10b2FzdCBoMjp3aGVyZSguc3dhbDItdGl0bGUpe21hcmdpbjouNWVtIDFlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXRvYXN0IC5zd2FsMi1sb2FkaW5ne2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLXRvYXN0IGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCl7aGVpZ2h0OjJlbTttYXJnaW46LjVlbTtmb250LXNpemU6MWVtfS5zd2FsMi10b2FzdCAuc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdle2ZvbnQtc2l6ZToxZW19LnN3YWwyLXRvYXN0IGRpdjp3aGVyZSguc3dhbDItZm9vdGVyKXttYXJnaW46LjVlbSAwIDA7cGFkZGluZzouNWVtIDAgMDtmb250LXNpemU6LjhlbX0uc3dhbDItdG9hc3QgYnV0dG9uOndoZXJlKC5zd2FsMi1jbG9zZSl7Z3JpZC1jb2x1bW46My8zO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6LjhlbTtoZWlnaHQ6LjhlbTttYXJnaW46MDtmb250LXNpemU6MmVtfS5zd2FsMi10b2FzdCBkaXY6d2hlcmUoLnN3YWwyLWh0bWwtY29udGFpbmVyKXttYXJnaW46LjVlbSAxZW07cGFkZGluZzowO292ZXJmbG93OmluaXRpYWw7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXRvYXN0IGRpdjp3aGVyZSguc3dhbDItaHRtbC1jb250YWluZXIpOmVtcHR5e3BhZGRpbmc6MH0uc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRlcntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOi4yNWVtfS5zd2FsMi10b2FzdCAuc3dhbDItaWNvbntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO21pbi13aWR0aDoyZW07aGVpZ2h0OjJlbTttYXJnaW46MCAuNWVtIDAgMH0uc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZToxLjhlbTtmb250LXdlaWdodDpib2xkfS5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7d2lkdGg6MmVtO2hlaWdodDoyZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde3RvcDouODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6LjMxMjVlbX0uc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDouMzEyNWVtfS5zd2FsMi10b2FzdCBkaXY6d2hlcmUoLnN3YWwyLWFjdGlvbnMpe2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2hlaWdodDphdXRvO21hcmdpbjowO21hcmdpbi10b3A6LjVlbTtwYWRkaW5nOjAgLjVlbX0uc3dhbDItdG9hc3QgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpe21hcmdpbjouMjVlbSAuNWVtO3BhZGRpbmc6LjRlbSAuNmVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNze2JvcmRlci1jb2xvcjojYTVkYzg2fS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MS42ZW07aGVpZ2h0OjNlbTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LTAuOGVtO2xlZnQ6LTAuNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjJlbSAyZW07Ym9yZGVyLXJhZGl1czo0ZW0gMCAwIDRlbX0uc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1yaWdodF17dG9wOi0wLjI1ZW07bGVmdDouOTM3NWVtO3RyYW5zZm9ybS1vcmlnaW46MCAxLjVlbTtib3JkZXItcmFkaXVzOjAgNGVtIDRlbSAwfS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3dpZHRoOjJlbTtoZWlnaHQ6MmVtfS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXh7dG9wOjA7bGVmdDouNDM3NWVtO3dpZHRoOi40Mzc1ZW07aGVpZ2h0OjIuNjg3NWVtfS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV17aGVpZ2h0Oi4zMTI1ZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfUBjb250YWluZXIgc3dhbDItcG9wdXAgc3R5bGUoLS1zd2FsMi1pY29uLWFuaW1hdGlvbnM6dHJ1ZSl7LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcHthbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXN9LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmd7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c319LnN3YWwyLXRvYXN0LnN3YWwyLXNob3d7YW5pbWF0aW9uOnZhcigtLXN3YWwyLXRvYXN0LXNob3ctYW5pbWF0aW9uKX0uc3dhbDItdG9hc3Quc3dhbDItaGlkZXthbmltYXRpb246dmFyKC0tc3dhbDItdG9hc3QtaGlkZS1hbmltYXRpb24pfUBrZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgLTUwcHgsIDApIHNjYWxlKDAuOSk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApIHNjYWxlKDEpO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1oaWRlezAle3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKSBzY2FsZSgxKTtvcGFjaXR5OjF9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgLTUwcHgsIDApIHNjYWxlKDAuOSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6MS4xODc1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDoxLjA2MjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6Mi4xODc1ZW07bGVmdDotMC4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QGtleWZyYW1lcyBzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lezAle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX01JXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9MTIle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoMC40KTtvcGFjaXR5OjB9NTAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoMC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LTAuMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uezAle3RyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMGRlZyk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrezAle3RyYW5zZm9ybTpyb3RhdGVZKC0zNjBkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVkoMCl9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1pLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpO29wYWNpdHk6MH0yNSV7dHJhbnNmb3JtOnJvdGF0ZVooLTI1ZGVnKTtvcGFjaXR5Oi40fTUwJXt0cmFuc2Zvcm06cm90YXRlWigxNWRlZyk7b3BhY2l0eTouOH03NSV7dHJhbnNmb3JtOnJvdGF0ZVooLTVkZWcpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjYyNWVtKSByb3RhdGVaKDJkZWcpfTMzJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKC0yZGVnKX02NiV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKDBkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotMC4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6MS42MjVlbTtyaWdodDoxLjM3NWVtO3dpZHRoOjB9NjUle3RvcDoxLjI1ZW07cmlnaHQ6LjkzNzVlbTt3aWR0aDowfTg0JXt0b3A6LjkzNzVlbTtyaWdodDowO3dpZHRoOjEuMTI1ZW19MTAwJXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19fSIpOw=="},"ts":1.773565602222e+12,"url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}}„6i¯!:          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eî¤{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube Aÿ÷‡ÇÌ1D blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}/!extdb.@re#1df1506d-32dc-4944-8cb4-ded03b87bf3e˜{"origin":"normal","value":{"exc":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"inc":[],"match":["*.youtube.com/*"]}}àõx&N<          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eï¤{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":false,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_m;‹etadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}j5$z=          1!extdb.@meta#f1d1ab07-73c3-4977-acbc-a09f0248670e¹6{"origin":"normal","value":{"antifeatures":{},"author":"YouhouLab","blockers":[],"connects":["www.saveanyyoutube.com"],"copyright":null,"description":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","description_i18n":{"en":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","es":"Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios","ja":"YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし","pt":"Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios","zh_CN":"YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载"},"downloadURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","enabled":false,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","grant":["GM_addStyle","GM_xmlhttpRequest","GM_getValue","GM_setValue"],"header":"// ==UserScript==\n// @name         YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥\n// @name:zh-CN   YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥\n// @name:en      YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥\n// @name:ja      YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥\n// @name:es      Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥\n// @name:pt      Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥\n// @namespace    http://tampermonkey.net/\n// @version      0.4\n// @description  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:en  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:zh-CN YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载\n// @description:ja  YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし\n// @description:es  Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios\n// @description:pt  Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios\n// @author       YouhouLab\n// @license      MIT\n// @match        *://*.youtube.com/*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @grant        GM_addStyle\n// @grant        GM_xmlhttpRequest\n// @grant        GM_getValue\n// @grant        GM_setValue\n// @connect      www.saveanyyoutube.com\n// @run-at       document-start\n// @supportURL   https://saveanyyoutube.com\n// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11\n// @compatible   chrome\n// @compatible   firefox\n// @compatible   opera\n// @compatible   edge\n// @compatible   safari\n// @keywords     youtube, download, video, audio, subtitle, shorts, hd, 1080p, 2k, 4k, free, no ads, ad blocker, ad free, remove ads, block ads, addyoutube, 油管, 视频下载, 字幕下载, 高清视频, 免费下载, 无广告, 去广告, 广告拦截, YouTube下载器, 短视频下载, ユーチューブ, ダウンロード, 動画保存, 字幕, 高画質, 無料, 広告ブロック, 広告なし, 유튜브, 다운로드, 동영상, 자막, 고화질, 무료, 광고 차단\n// @downloadURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js\n// @updateURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773565599129e+12,"matches":["*://*.youtube.com/*"],"name":"YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥","name_i18n":{"en":"YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥","es":"Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥","ja":"YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥","pt":"Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥","zh_CN":"YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥"},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.saveanyyoutube.com"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/522662/","unsafe_url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}],"resources":[],"supportURL":"https://saveanyyoutube.com","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/9aaf5952-f42c-40d9-9623-3598a1edbc8e"}},"updateURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js","uuid":"f1d1ab07-73c3-4977-acbc-a09f0248670e","version":"0.4","webRequest":null}} Z ‚y>          1!extdb.@meta#f1d1ab07-73c3-4977-acbc-a09f0248670e¸6{"origin":"normal","value":{"antifeatures":{},"author":"YouhouLab","blockers":[],"connects":["www.saveanyyoutube.com"],"copyright":null,"description":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","description_i18n":{"en":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","es":"Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios","ja":"YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし","pt":"Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios","zh_CN":"YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载"},"downloadURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","grant":["GM_addStyle","GM_xmlhttpRequest","GM_getValue","GM_setValue"],"header":"// ==UserScript==\n// @name         YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥\n// @name:zh-CN   YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥\n// @name:en      YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥\n// @name:ja      YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥\n// @name:es      Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥\n// @name:pt      Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥\n// @namespace    http://tampermonkey.net/\n// @version      0.4\n// @description  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:en  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:zh-CN YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载\n// @description:ja  YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし\n// @description:es  Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios\n// @description:pt  Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios\n// @author       YouhouLab\n// @license      MIT\n// @match        *://*.youtube.com/*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @grant        GM_addStyle\n// @grant        GM_xmlhttpRequest\n// @grant        GM_getValue\n// @grant        GM_setValue\n// @connect      www.saveanyyoutube.com\n// @run-at       document-start\n// @supportURL   https://saveanyyoutube.com\n// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11\n// @compatible   chrome\n// @compatible   firefox\n// @compatible   opera\n// @compatible   edge\n// @compatible   safari\n// @keywords     youtube, download, video, audio, subtitle, shorts, hd, 1080p, 2k, 4k, free, no ads, ad blocker, ad free, remove ads, block ads, addyoutube, 油管, 视频下载, 字幕下载, 高清视频, 免费下载, 无广告, 去广告, 广告拦截, YouTube下载器, 短视频下载, ユーチューブ, ダウンロード, 動画保存, 字幕, 高画質, 無料, 広告ブロック, 広告なし, 유튜브, 다운로드, 동영상, 자막, 고화질, 무료, 광고 차단\n// @downloadURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js\n// @updateURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773565599129e+12,"matches":["*://*.youtube.com/*"],"name":"YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥","name_i18n":{"en":"YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥","es":"Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥","ja":"YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥","pt":"Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥","zh_CN":"YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥"},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.saveanyyoutube.com"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/522662/","unsafe_url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}],"resources":[],"supportURL":"https://saveanyyoutube.com","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/9aaf5952-f42c-40d9-9623-3598a1edbc8e"}},"updateURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js","uuid":"f1d1ab07-73c3-4977-acbc-a09f0248670e","version":"0.4","webRequest":null}}6x·*fD?          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eî¤{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blockcM¡Jer (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}._ z@          1!extdb.@meta#f1d1ab07-73c3-4977-acbc-a09f0248670e¹6{"origin":"normal","value":{"antifeatures":{},"author":"YouhouLab","blockers":[],"connects":["www.saveanyyoutube.com"],"copyright":null,"description":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","description_i18n":{"en":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","es":"Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios","ja":"YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし","pt":"Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios","zh_CN":"YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载"},"downloadURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","enabled":false,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","grant":["GM_addStyle","GM_xmlhttpRequest","GM_getValue","GM_setValue"],"header":"// ==UserScript==\n// @name         YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥\n// @name:zh-CN   YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥\n// @name:en      YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥\n// @name:ja      YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥\n// @name:es      Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥\n// @name:pt      Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥\n// @namespace    http://tampermonkey.net/\n// @version      0.4\n// @description  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:en  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:zh-CN YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载\n// @description:ja  YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし\n// @description:es  Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios\n// @description:pt  Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios\n// @author       YouhouLab\n// @license      MIT\n// @match        *://*.youtube.com/*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @grant        GM_addStyle\n// @grant        GM_xmlhttpRequest\n// @grant        GM_getValue\n// @grant        GM_setValue\n// @connect      www.saveanyyoutube.com\n// @run-at       document-start\n// @supportURL   https://saveanyyoutube.com\n// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11\n// @compatible   chrome\n// @compatible   firefox\n// @compatible   opera\n// @compatible   edge\n// @compatible   safari\n// @keywords     youtube, download, video, audio, subtitle, shorts, hd, 1080p, 2k, 4k, free, no ads, ad blocker, ad free, remove ads, block ads, addyoutube, 油管, 视频下载, 字幕下载, 高清视频, 免费下载, 无广告, 去广告, 广告拦截, YouTube下载器, 短视频下载, ユーチューブ, ダウンロード, 動画保存, 字幕, 高画質, 無料, 広告ブロック, 広告なし, 유튜브, 다운로드, 동영상, 자막, 고화질, 무료, 광고 차단\n// @downloadURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js\n// @updateURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773565599129e+12,"matches":["*://*.youtube.com/*"],"name":"YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥","name_i18n":{"en":"YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥","es":"Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥","ja":"YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥","pt":"Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥","zh_CN":"YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥"},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.saveanyyoutube.com"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/522662/","unsafe_url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}],"resources":[],"supportURL":"https://saveanyyoutube.com","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/9aaf5952-f42c-40d9-9623-3598a1edbc8e"}},"updateURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js","uuid":"f1d1ab07-73c3-4977-acbc-a09f0248670e","version":"0.4","webRequest":null}}*ٞyA          1!extdb.@meta#f1d1ab07-73c3-4977-acbc-a09f0248670e¸6{"origin":"normal","value":{"antifeatures":{},"author":"YouhouLab","blockers":[],"connects":["www.saveanyyoutube.com"],"copyright":null,"description":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","description_i18n":{"en":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","es":"Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios","ja":"YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし","pt":"Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios","zh_CN":"YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载"},"downloadURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","grant":["GM_addStyle","GM_xmlhttpRequest","GM_getValue","GM_setValue"],"header":"// ==UserScript==\n// @name         YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥\n// @name:zh-CN   YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥\n// @name:en      YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥\n// @name:ja      YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥\n// @name:es      Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥\n// @name:pt      Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥\n// @namespace    http://tampermonkey.net/\n// @version      0.4\n// @description  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:en  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:zh-CN YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载\n// @description:ja  YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし\n// @description:es  Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios\n// @description:pt  Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios\n// @author       YouhouLab\n// @license      MIT\n// @match        *://*.youtube.com/*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @grant        GM_addStyle\n// @grant        GM_xmlhttpRequest\n// @grant        GM_getValue\n// @grant        GM_setValue\n// @connect      www.saveanyyoutube.com\n// @run-at       document-start\n// @supportURL   https://saveanyyoutube.com\n// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11\n// @compatible   chrome\n// @compatible   firefox\n// @compatible   opera\n// @compatible   edge\n// @compatible   safari\n// @keywords     youtube, download, video, audio, subtitle, shorts, hd, 1080p, 2k, 4k, free, no ads, ad blocker, ad free, remove ads, block ads, addyoutube, 油管, 视频下载, 字幕下载, 高清视频, 免费下载, 无广告, 去广告, 广告拦截, YouTube下载器, 短视频下载, ユーチューブ, ダウンロード, 動画保存, 字幕, 高画質, 無料, 広告ブロック, 広告なし, 유튜브, 다운로드, 동영상, 자막, 고화질, 무료, 광고 차단\n// @downloadURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js\n// @updateURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773565599129e+12,"matches":["*://*.youtube.com/*"],"name":"YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥","name_i18n":{"en":"YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥","es":"Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥","ja":"YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥","pt":"Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥","zh_CN":"YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥"},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.saveanyyoutube.com"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/522662/","unsafe_url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}],"resources":[],"supportURL":"https://saveanyyoutube.com","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/9aaf5952-f42c-40d9-9623-3598a1edbc8e"}},"updateURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js","uuid":"f1d1ab07-73c3-4977-acbc-a09f0248670e","version":"0.4","webRequest":null}}bꪧ:B          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eï¤{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":false,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Yo‹­(·
utube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}¸óɰRC          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3eî¤{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}œPaà1D          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3e€¦{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Yo,Ýù%?utube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}/!extdb.@re#1df1506d-32dc-4944-8cb4-ded03b87bf3eá{"origin":"normal","value":{"exc":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"inc":[],"match":["*.youtube.com/*"]}}Àt*_ F           Q!extdb.@ext#f1d1ab07-73c3-4977-acbc-a09f0248670e:c8895af888fbb02d356595db8c356581¾ÑK¢g@G          Q!extdb.@ext#f1d1ab07-73c3-4977-acbc-a09f0248670e:c8895af888fbb02d356595db8c356581ÌÅ{"origin":"normal","value":{"resource":{"base":"LyohCiogc3dlZXRhbGVydDIgdjExLjI2LjIyCiogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgoqLwohZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5Td2VldGFsZXJ0Mj10KCl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZT09PXQ6ZS5oYXModCkpcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mz90Om47dGhyb3cgbmV3IFR5cGVFcnJvcigiUHJpdmF0ZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9uIHRoaXMgb2JqZWN0Iil9ZnVuY3Rpb24gdCh0LG4pe3JldHVybiB0LmdldChlKHQsbikpfWZ1bmN0aW9uIG4oZSx0LG4peyhmdW5jdGlvbihlLHQpe2lmKHQuaGFzKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbml0aWFsaXplIHRoZSBzYW1lIHByaXZhdGUgZWxlbWVudHMgdHdpY2Ugb24gYW4gb2JqZWN0Iil9KShlLHQpLHQuc2V0KGUsbil9Y29uc3Qgbz17fSxpPWU9Pm5ldyBQcm9taXNlKHQ9PntpZighZSlyZXR1cm4gdCgpO2NvbnN0IG49d2luZG93LnNjcm9sbFgsaT13aW5kb3cuc2Nyb2xsWTtvLnJlc3RvcmVGb2N1c1RpbWVvdXQ9c2V0VGltZW91dCgoKT0+e28ucHJldmlvdXNBY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ/KG8ucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCksby5wcmV2aW91c0FjdGl2ZUVsZW1lbnQ9bnVsbCk6ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5mb2N1cygpLHQoKX0sMTAwKSx3aW5kb3cuc2Nyb2xsVG8obixpKX0pLHM9InN3YWwyLSIscj1bImNvbnRhaW5lciIsInNob3duIiwiaGVpZ2h0LWF1dG8iLCJpb3NmaXgiLCJwb3B1cCIsIm1vZGFsIiwibm8tYmFja2Ryb3AiLCJuby10cmFuc2l0aW9uIiwidG9hc3QiLCJ0b2FzdC1zaG93biIsInNob3ciLCJoaWRlIiwiY2xvc2UiLCJ0aXRsZSIsImh0bWwtY29udGFpbmVyIiwiYWN0aW9ucyIsImNvbmZpcm0iLCJkZW55IiwiY2FuY2VsIiwiZm9vdGVyIiwiaWNvbiIsImljb24tY29udGVudCIsImltYWdlIiwiaW5wdXQiLCJmaWxlIiwicmFuZ2UiLCJzZWxlY3QiLCJyYWRpbyIsImNoZWNrYm94IiwibGFiZWwiLCJ0ZXh0YXJlYSIsImlucHV0ZXJyb3IiLCJpbnB1dC1sYWJlbCIsInZhbGlkYXRpb24tbWVzc2FnZSIsInByb2dyZXNzLXN0ZXBzIiwiYWN0aXZlLXByb2dyZXNzLXN0ZXAiLCJwcm9ncmVzcy1zdGVwIiwicHJvZ3Jlc3Mtc3RlcC1saW5lIiwibG9hZGVyIiwibG9hZGluZyIsInN0eWxlZCIsInRvcCIsInRvcC1zdGFydCIsInRvcC1lbmQiLCJ0b3AtbGVmdCIsInRvcC1yaWdodCIsImNlbnRlciIsImNlbnRlci1zdGFydCIsImNlbnRlci1lbmQiLCJjZW50ZXItbGVmdCIsImNlbnRlci1yaWdodCIsImJvdHRvbSIsImJvdHRvbS1zdGFydCIsImJvdHRvbS1lbmQiLCJib3R0b20tbGVmdCIsImJvdHRvbS1yaWdodCIsImdyb3ctcm93IiwiZ3Jvdy1jb2x1bW4iLCJncm93LWZ1bGxzY3JlZW4iLCJydGwiLCJ0aW1lci1wcm9ncmVzcy1iYXIiLCJ0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyIiwic2Nyb2xsYmFyLW1lYXN1cmUiLCJpY29uLXN1Y2Nlc3MiLCJpY29uLXdhcm5pbmciLCJpY29uLWluZm8iLCJpY29uLXF1ZXN0aW9uIiwiaWNvbi1lcnJvciIsImRyYWdnYWJsZSIsImRyYWdnaW5nIl0ucmVkdWNlKChlLHQpPT4oZVt0XT1zK3QsZSkse30pLGE9WyJzdWNjZXNzIiwid2FybmluZyIsImluZm8iLCJxdWVzdGlvbiIsImVycm9yIl0ucmVkdWNlKChlLHQpPT4oZVt0XT1zK3QsZSkse30pLGw9IlN3ZWV0QWxlcnQyOiIsYz1lPT5lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksdT1lPT57Y29uc29sZS53YXJuKGAke2x9ICR7Im9iamVjdCI9PXR5cGVvZiBlP2Uuam9pbigiICIpOmV9YCl9LGQ9ZT0+e2NvbnNvbGUuZXJyb3IoYCR7bH0gJHtlfWApfSxwPVtdLG09KGUsdD1udWxsKT0+e3ZhciBuO249YCIke2V9IiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4ke3Q/YCBVc2UgIiR7dH0iIGluc3RlYWQuYDoiIn1gLHAuaW5jbHVkZXMobil8fChwLnB1c2gobiksdShuKSl9LGg9ZT0+ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSgpOmUsZz1lPT5lJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b1Byb21pc2UsZj1lPT5nKGUpP2UudG9Qcm9taXNlKCk6UHJvbWlzZS5yZXNvbHZlKGUpLGI9ZT0+ZSYmUHJvbWlzZS5yZXNvbHZlKGUpPT09ZSx5PSgpPT5kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IoYC4ke3IuY29udGFpbmVyfWApLHY9ZT0+e2NvbnN0IHQ9eSgpO3JldHVybiB0P3QucXVlcnlTZWxlY3RvcihlKTpudWxsfSx3PWU9PnYoYC4ke2V9YCksQz0oKT0+dyhyLnBvcHVwKSxBPSgpPT53KHIuaWNvbiksRT0oKT0+dyhyLnRpdGxlKSxrPSgpPT53KHJbImh0bWwtY29udGFpbmVyIl0pLEI9KCk9Pncoci5pbWFnZSksJD0oKT0+dyhyWyJwcm9ncmVzcy1zdGVwcyJdKSxMPSgpPT53KHJbInZhbGlkYXRpb24tbWVzc2FnZSJdKSxQPSgpPT52KGAuJHtyLmFjdGlvbnN9IC4ke3IuY29uZmlybX1gKSx4PSgpPT52KGAuJHtyLmFjdGlvbnN9IC4ke3IuY2FuY2VsfWApLFQ9KCk9PnYoYC4ke3IuYWN0aW9uc30gLiR7ci5kZW55fWApLFM9KCk9PnYoYC4ke3IubG9hZGVyfWApLE89KCk9Pncoci5hY3Rpb25zKSxNPSgpPT53KHIuZm9vdGVyKSxIPSgpPT53KHJbInRpbWVyLXByb2dyZXNzLWJhciJdKSxqPSgpPT53KHIuY2xvc2UpLEk9KCk9Pntjb25zdCBlPUMoKTtpZighZSlyZXR1cm5bXTtjb25zdCB0PWUucXVlcnlTZWxlY3RvckFsbCgnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PSItMSJdKTpub3QoW3RhYmluZGV4PSIwIl0pJyksbj1BcnJheS5mcm9tKHQpLnNvcnQoKGUsdCk9Pntjb25zdCBuPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHwiMCIpLG89cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iil8fCIwIik7cmV0dXJuIG4+bz8xOm48bz8tMTowfSksbz1lLnF1ZXJ5U2VsZWN0b3JBbGwoJ1xuICBhW2hyZWZdLFxuICBhcmVhW2hyZWZdLFxuICBpbnB1dDpub3QoW2Rpc2FibGVkXSksXG4gIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksXG4gIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSxcbiAgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxcbiAgaWZyYW1lLFxuICBvYmplY3QsXG4gIGVtYmVkLFxuICBbdGFiaW5kZXg9IjAiXSxcbiAgW2NvbnRlbnRlZGl0YWJsZV0sXG4gIGF1ZGlvW2NvbnRyb2xzXSxcbiAgdmlkZW9bY29udHJvbHNdLFxuICBzdW1tYXJ5XG4nKSxpPUFycmF5LmZyb20obykuZmlsdGVyKGU9PiItMSIhPT1lLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7cmV0dXJuWy4uLm5ldyBTZXQobi5jb25jYXQoaSkpXS5maWx0ZXIoZT0+ZWUoZSkpfSxEPSgpPT5OKGRvY3VtZW50LmJvZHksci5zaG93bikmJiFOKGRvY3VtZW50LmJvZHksclsidG9hc3Qtc2hvd24iXSkmJiFOKGRvY3VtZW50LmJvZHksclsibm8tYmFja2Ryb3AiXSksVj0oKT0+e2NvbnN0IGU9QygpO3JldHVybiEhZSYmTihlLHIudG9hc3QpfSxxPShlLHQpPT57aWYoZS50ZXh0Q29udGVudD0iIix0KXtjb25zdCBuPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC9odG1sIiksbz1uLnF1ZXJ5U2VsZWN0b3IoImhlYWQiKTtvJiZBcnJheS5mcm9tKG8uY2hpbGROb2RlcykuZm9yRWFjaCh0PT57ZS5hcHBlbmRDaGlsZCh0KX0pO2NvbnN0IGk9bi5xdWVyeVNlbGVjdG9yKCJib2R5Iik7aSYmQXJyYXkuZnJvbShpLmNoaWxkTm9kZXMpLmZvckVhY2godD0+e3QgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50fHx0IGluc3RhbmNlb2YgSFRNTEF1ZGlvRWxlbWVudD9lLmFwcGVuZENoaWxkKHQuY2xvbmVOb2RlKCEwKSk6ZS5hcHBlbmRDaGlsZCh0KX0pfX0sTj0oZSx0KT0+e2lmKCF0KXJldHVybiExO2NvbnN0IG49dC5zcGxpdCgvXHMrLyk7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0KyspaWYoIWUuY2xhc3NMaXN0LmNvbnRhaW5zKG5bdF0pKXJldHVybiExO3JldHVybiEwfSxfPShlLHQsbik9PntpZigoKGUsdCk9PntBcnJheS5mcm9tKGUuY2xhc3NMaXN0KS5mb3JFYWNoKG49PntPYmplY3QudmFsdWVzKHIpLmluY2x1ZGVzKG4pfHxPYmplY3QudmFsdWVzKGEpLmluY2x1ZGVzKG4pfHxPYmplY3QudmFsdWVzKHQuc2hvd0NsYXNzfHx7fSkuaW5jbHVkZXMobil8fGUuY2xhc3NMaXN0LnJlbW92ZShuKX0pfSkoZSx0KSwhdC5jdXN0b21DbGFzcylyZXR1cm47Y29uc3Qgbz10LmN1c3RvbUNsYXNzW25dO28mJigic3RyaW5nIj09dHlwZW9mIG98fG8uZm9yRWFjaD96KGUsbyk6dShgSW52YWxpZCB0eXBlIG9mIGN1c3RvbUNsYXNzLiR7bn0hIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCAiJHt0eXBlb2Ygb30iYCkpfSxSPShlLHQpPT57aWYoIXQpcmV0dXJuIG51bGw7c3dpdGNoKHQpe2Nhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpjYXNlImZpbGUiOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoYC4ke3IucG9wdXB9ID4gLiR7clt0XX1gKTtjYXNlImNoZWNrYm94IjpyZXR1cm4gZS5xdWVyeVNlbGVjdG9yKGAuJHtyLnBvcHVwfSA+IC4ke3IuY2hlY2tib3h9IGlucHV0YCk7Y2FzZSJyYWRpbyI6cmV0dXJuIGUucXVlcnlTZWxlY3RvcihgLiR7ci5wb3B1cH0gPiAuJHtyLnJhZGlvfSBpbnB1dDpjaGVja2VkYCl8fGUucXVlcnlTZWxlY3RvcihgLiR7ci5wb3B1cH0gPiAuJHtyLnJhZGlvfSBpbnB1dDpmaXJzdC1jaGlsZGApO2Nhc2UicmFuZ2UiOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoYC4ke3IucG9wdXB9ID4gLiR7ci5yYW5nZX0gaW5wdXRgKTtkZWZhdWx0OnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoYC4ke3IucG9wdXB9ID4gLiR7ci5pbnB1dH1gKX19LEY9ZT0+e2lmKGUuZm9jdXMoKSwiZmlsZSIhPT1lLnR5cGUpe2NvbnN0IHQ9ZS52YWx1ZTtlLnZhbHVlPSIiLGUudmFsdWU9dH19LFU9KGUsdCxuKT0+e2UmJnQmJigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKSksdC5mb3JFYWNoKHQ9PntBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaChlPT57bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSkpfSx6PShlLHQpPT57VShlLHQsITApfSxXPShlLHQpPT57VShlLHQsITEpfSxLPShlLHQpPT57Y29uc3Qgbj1BcnJheS5mcm9tKGUuY2hpbGRyZW4pO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCBvPW5bZV07aWYobyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZOKG8sdCkpcmV0dXJuIG99fSxZPShlLHQsbik9PntuPT09YCR7cGFyc2VJbnQoYCR7bn1gKX1gJiYobj1wYXJzZUludChuKSksbnx8MD09PXBhcnNlSW50KGAke259YCk/ZS5zdHlsZS5zZXRQcm9wZXJ0eSh0LCJudW1iZXIiPT10eXBlb2Ygbj9gJHtufXB4YDpuKTplLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSxYPShlLHQ9ImZsZXgiKT0+e2UmJihlLnN0eWxlLmRpc3BsYXk9dCl9LFo9ZT0+e2UmJihlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSj0oZSx0PSJibG9jayIpPT57ZSYmbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9PntRKGUsZS5pbm5lckhUTUwsdCl9KS5vYnNlcnZlKGUse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9LEc9KGUsdCxuLG8pPT57Y29uc3QgaT1lLnF1ZXJ5U2VsZWN0b3IodCk7aSYmaS5zdHlsZS5zZXRQcm9wZXJ0eShuLG8pfSxRPShlLHQsbj0iZmxleCIpPT57dD9YKGUsbik6WihlKX0sZWU9ZT0+Qm9vbGVhbihlJiYoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKSx0ZT1lPT5Cb29sZWFuKGUuc2Nyb2xsSGVpZ2h0PmUuY2xpZW50SGVpZ2h0KSxuZT1lPT57Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxuPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tZHVyYXRpb24iKXx8IjAiKSxvPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIil8fCIwIik7cmV0dXJuIG4+MHx8bz4wfSxvZT0oZSx0PSExKT0+e2NvbnN0IG49SCgpO24mJmVlKG4pJiYodCYmKG4uc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsbi5zdHlsZS53aWR0aD0iMTAwJSIpLHNldFRpbWVvdXQoKCk9PntuLnN0eWxlLnRyYW5zaXRpb249YHdpZHRoICR7ZS8xZTN9cyBsaW5lYXJgLG4uc3R5bGUud2lkdGg9IjAlIn0sMTApKX0saWU9YFxuIDxkaXYgYXJpYS1sYWJlbGxlZGJ5PSIke3IudGl0bGV9IiBhcmlhLWRlc2NyaWJlZGJ5PSIke3JbImh0bWwtY29udGFpbmVyIl19IiBjbGFzcz0iJHtyLnBvcHVwfSIgdGFiaW5kZXg9Ii0xIj5cbiAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJHtyLmNsb3NlfSI+PC9idXR0b24+XG4gICA8dWwgY2xhc3M9IiR7clsicHJvZ3Jlc3Mtc3RlcHMiXX0iPjwvdWw+XG4gICA8ZGl2IGNsYXNzPSIke3IuaWNvbn0iPjwvZGl2PlxuICAgPGltZyBjbGFzcz0iJHtyLmltYWdlfSIgLz5cbiAgIDxoMiBjbGFzcz0iJHtyLnRpdGxlfSIgaWQ9IiR7ci50aXRsZX0iPjwvaDI+XG4gICA8ZGl2IGNsYXNzPSIke3JbImh0bWwtY29udGFpbmVyIl19IiBpZD0iJHtyWyJodG1sLWNvbnRhaW5lciJdfSI+PC9kaXY+XG4gICA8aW5wdXQgY2xhc3M9IiR7ci5pbnB1dH0iIGlkPSIke3IuaW5wdXR9IiAvPlxuICAgPGlucHV0IHR5cGU9ImZpbGUiIGNsYXNzPSIke3IuZmlsZX0iIC8+XG4gICA8ZGl2IGNsYXNzPSIke3IucmFuZ2V9Ij5cbiAgICAgPGlucHV0IHR5cGU9InJhbmdlIiAvPlxuICAgICA8b3V0cHV0Pjwvb3V0cHV0PlxuICAgPC9kaXY+XG4gICA8c2VsZWN0IGNsYXNzPSIke3Iuc2VsZWN0fSIgaWQ9IiR7ci5zZWxlY3R9Ij48L3NlbGVjdD5cbiAgIDxkaXYgY2xhc3M9IiR7ci5yYWRpb30iPjwvZGl2PlxuICAgPGxhYmVsIGNsYXNzPSIke3IuY2hlY2tib3h9Ij5cbiAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iJHtyLmNoZWNrYm94fSIgLz5cbiAgICAgPHNwYW4gY2xhc3M9IiR7ci5sYWJlbH0iPjwvc3Bhbj5cbiAgIDwvbGFiZWw+XG4gICA8dGV4dGFyZWEgY2xhc3M9IiR7ci50ZXh0YXJlYX0iIGlkPSIke3IudGV4dGFyZWF9Ij48L3RleHRhcmVhPlxuICAgPGRpdiBjbGFzcz0iJHtyWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXX0iIGlkPSIke3JbInZhbGlkYXRpb24tbWVzc2FnZSJdfSI+PC9kaXY+XG4gICA8ZGl2IGNsYXNzPSIke3IuYWN0aW9uc30iPlxuICAgICA8ZGl2IGNsYXNzPSIke3IubG9hZGVyfSI+PC9kaXY+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJHtyLmNvbmZpcm19Ij48L2J1dHRvbj5cbiAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSIke3IuZGVueX0iPjwvYnV0dG9uPlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IiR7ci5jYW5jZWx9Ij48L2J1dHRvbj5cbiAgIDwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJHtyLmZvb3Rlcn0iPjwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJHtyWyJ0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyIl19Ij5cbiAgICAgPGRpdiBjbGFzcz0iJHtyWyJ0aW1lci1wcm9ncmVzcy1iYXIiXX0iPjwvZGl2PlxuICAgPC9kaXY+XG4gPC9kaXY+XG5gLnJlcGxhY2UoLyhefFxuKVxzKi9nLCIiKSxzZT0oKT0+e28uY3VycmVudEluc3RhbmNlJiZvLmN1cnJlbnRJbnN0YW5jZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCl9LHJlPWU9Pntjb25zdCB0PSgoKT0+e2NvbnN0IGU9eSgpO3JldHVybiEhZSYmKGUucmVtb3ZlKCksVyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFtyWyJuby1iYWNrZHJvcCJdLHJbInRvYXN0LXNob3duIl0sclsiaGFzLWNvbHVtbiJdXSksITApfSkoKTtpZigidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudClyZXR1cm4gdm9pZCBkKCJTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplIik7Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuLmNsYXNzTmFtZT1yLmNvbnRhaW5lcix0JiZ6KG4sclsibm8tdHJhbnNpdGlvbiJdKSxxKG4saWUpLG4uZGF0YXNldC5zd2FsMlRoZW1lPWUudGhlbWU7Y29uc3QgaT0oZT0+e2lmKCJzdHJpbmciPT10eXBlb2YgZSl7Y29uc3QgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpO2lmKCF0KXRocm93IG5ldyBFcnJvcihgVGFyZ2V0IGVsZW1lbnQgIiR7ZX0iIG5vdCBmb3VuZGApO3JldHVybiB0fXJldHVybiBlfSkoZS50YXJnZXR8fCJib2R5Iik7aS5hcHBlbmRDaGlsZChuKSxlLnRvcExheWVyJiYobi5zZXRBdHRyaWJ1dGUoInBvcG92ZXIiLCIiKSxuLnNob3dQb3BvdmVyKCkpLChlPT57Y29uc3QgdD1DKCk7dCYmKHQuc2V0QXR0cmlidXRlKCJyb2xlIixlLnRvYXN0PyJhbGVydCI6ImRpYWxvZyIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLGUudG9hc3Q/InBvbGl0ZSI6ImFzc2VydGl2ZSIpLGUudG9hc3R8fHQuc2V0QXR0cmlidXRlKCJhcmlhLW1vZGFsIiwidHJ1ZSIpKX0pKGUpLChlPT57InJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5kaXJlY3Rpb24mJih6KHkoKSxyLnJ0bCksby5pc1JUTD0hMCl9KShpKSwoKCk9Pntjb25zdCBlPUMoKTtpZighZSlyZXR1cm47Y29uc3QgdD1LKGUsci5pbnB1dCksbj1LKGUsci5maWxlKSxvPWUucXVlcnlTZWxlY3RvcihgLiR7ci5yYW5nZX0gaW5wdXRgKSxpPWUucXVlcnlTZWxlY3RvcihgLiR7ci5yYW5nZX0gb3V0cHV0YCkscz1LKGUsci5zZWxlY3QpLGE9ZS5xdWVyeVNlbGVjdG9yKGAuJHtyLmNoZWNrYm94fSBpbnB1dGApLGw9SyhlLHIudGV4dGFyZWEpO3QmJih0Lm9uaW5wdXQ9c2UpLG4mJihuLm9uY2hhbmdlPXNlKSxzJiYocy5vbmNoYW5nZT1zZSksYSYmKGEub25jaGFuZ2U9c2UpLGwmJihsLm9uaW5wdXQ9c2UpLG8mJmkmJihvLm9uaW5wdXQ9KCk9PntzZSgpLGkudmFsdWU9by52YWx1ZX0sby5vbmNoYW5nZT0oKT0+e3NlKCksaS52YWx1ZT1vLnZhbHVlfSl9KSgpfSxhZT0oZSx0KT0+e2UgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD90LmFwcGVuZENoaWxkKGUpOiJvYmplY3QiPT10eXBlb2YgZT9sZShlLHQpOmUmJnEodCxlKX0sbGU9KGUsdCk9PnsianF1ZXJ5ImluIGU/Y2UodCxlKTpxKHQsZS50b1N0cmluZygpKX0sY2U9KGUsdCk9PntpZihlLnRleHRDb250ZW50PSIiLDAgaW4gdClmb3IobGV0IG49MDtuIGluIHQ7bisrKWUuYXBwZW5kQ2hpbGQodFtuXS5jbG9uZU5vZGUoITApKTtlbHNlIGUuYXBwZW5kQ2hpbGQodC5jbG9uZU5vZGUoITApKX0sdWU9KGUsdCk9Pntjb25zdCBuPU8oKSxvPVMoKTtuJiZvJiYodC5zaG93Q29uZmlybUJ1dHRvbnx8dC5zaG93RGVueUJ1dHRvbnx8dC5zaG93Q2FuY2VsQnV0dG9uP1gobik6WihuKSxfKG4sdCwiYWN0aW9ucyIpLGZ1bmN0aW9uKGUsdCxuKXtjb25zdCBvPVAoKSxpPVQoKSxzPXgoKTtpZighb3x8IWl8fCFzKXJldHVybjtwZShvLCJjb25maXJtIixuKSxwZShpLCJkZW55IixuKSxwZShzLCJjYW5jZWwiLG4pLGZ1bmN0aW9uKGUsdCxuLG8pe2lmKCFvLmJ1dHRvbnNTdHlsaW5nKXJldHVybiB2b2lkIFcoW2UsdCxuXSxyLnN0eWxlZCk7eihbZSx0LG5dLHIuc3R5bGVkKSxvLmNvbmZpcm1CdXR0b25Db2xvciYmZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yIixvLmNvbmZpcm1CdXR0b25Db2xvcik7by5kZW55QnV0dG9uQ29sb3ImJnQuc3R5bGUuc2V0UHJvcGVydHkoIi0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvciIsby5kZW55QnV0dG9uQ29sb3IpO28uY2FuY2VsQnV0dG9uQ29sb3ImJm4uc3R5bGUuc2V0UHJvcGVydHkoIi0tc3dhbDItY2FuY2VsLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yIixvLmNhbmNlbEJ1dHRvbkNvbG9yKTtkZShlKSxkZSh0KSxkZShuKX0obyxpLHMsbiksbi5yZXZlcnNlQnV0dG9ucyYmKG4udG9hc3Q/KGUuaW5zZXJ0QmVmb3JlKHMsbyksZS5pbnNlcnRCZWZvcmUoaSxvKSk6KGUuaW5zZXJ0QmVmb3JlKHMsdCksZS5pbnNlcnRCZWZvcmUoaSx0KSxlLmluc2VydEJlZm9yZShvLHQpKSl9KG4sbyx0KSxxKG8sdC5sb2FkZXJIdG1sfHwiIiksXyhvLHQsImxvYWRlciIpKX07ZnVuY3Rpb24gZGUoZSl7Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKTtpZih0LmdldFByb3BlcnR5VmFsdWUoIi0tc3dhbDItYWN0aW9uLWJ1dHRvbi1mb2N1cy1ib3gtc2hhZG93IikpcmV0dXJuO2NvbnN0IG49dC5iYWNrZ3JvdW5kQ29sb3IucmVwbGFjZSgvcmdiYT9cKChcZCspLCAoXGQrKSwgKFxkKykuKi8sInJnYmEoJDEsICQyLCAkMywgMC41KSIpO2Uuc3R5bGUuc2V0UHJvcGVydHkoIi0tc3dhbDItYWN0aW9uLWJ1dHRvbi1mb2N1cy1ib3gtc2hhZG93Iix0LmdldFByb3BlcnR5VmFsdWUoIi0tc3dhbDItb3V0bGluZSIpLnJlcGxhY2UoLyByZ2JhXCguKi8sYCAke259YCkpfWZ1bmN0aW9uIHBlKGUsdCxuKXtjb25zdCBvPWModCk7UShlLG5bYHNob3cke299QnV0dG9uYF0sImlubGluZS1ibG9jayIpLHEoZSxuW2Ake3R9QnV0dG9uVGV4dGBdfHwiIiksZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLG5bYCR7dH1CdXR0b25BcmlhTGFiZWxgXXx8IiIpLGUuY2xhc3NOYW1lPXJbdF0sXyhlLG4sYCR7dH1CdXR0b25gKX1jb25zdCBtZT0oZSx0KT0+e2NvbnN0IG49eSgpO24mJighZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIHQ/ZS5zdHlsZS5iYWNrZ3JvdW5kPXQ6dHx8eihbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHJbIm5vLWJhY2tkcm9wIl0pfShuLHQuYmFja2Ryb3ApLGZ1bmN0aW9uKGUsdCl7aWYoIXQpcmV0dXJuO3QgaW4gcj96KGUsclt0XSk6KHUoJ1RoZSAicG9zaXRpb24iIHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImNlbnRlciInKSx6KGUsci5jZW50ZXIpKX0obix0LnBvc2l0aW9uKSxmdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybjt6KGUscltgZ3Jvdy0ke3R9YF0pfShuLHQuZ3JvdyksXyhuLHQsImNvbnRhaW5lciIpKX07dmFyIGhlPXtpbm5lclBhcmFtczpuZXcgV2Vha01hcCxkb21DYWNoZTpuZXcgV2Vha01hcCxmb2N1c2VkRWxlbWVudDpuZXcgV2Vha01hcH07Y29uc3QgZ2U9WyJpbnB1dCIsImZpbGUiLCJyYW5nZSIsInNlbGVjdCIsInJhZGlvIiwiY2hlY2tib3giLCJ0ZXh0YXJlYSJdLGZlPWU9PntpZighZS5pbnB1dClyZXR1cm47aWYoIUVlW2UuaW5wdXRdKXJldHVybiB2b2lkIGQoYFVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dCEgRXhwZWN0ZWQgJHtPYmplY3Qua2V5cyhFZSkuam9pbigiIHwgIil9LCBnb3QgIiR7ZS5pbnB1dH0iYCk7Y29uc3QgdD1DZShlLmlucHV0KTtpZighdClyZXR1cm47Y29uc3Qgbj1FZVtlLmlucHV0XSh0LGUpO1godCksZS5pbnB1dEF1dG9Gb2N1cyYmc2V0VGltZW91dCgoKT0+e0Yobil9KX0sYmU9KGUsdCk9Pntjb25zdCBuPUMoKTtpZighbilyZXR1cm47Y29uc3Qgbz1SKG4sZSk7aWYobyl7KGU9Pntmb3IobGV0IHQ9MDt0PGUuYXR0cmlidXRlcy5sZW5ndGg7dCsrKXtjb25zdCBuPWUuYXR0cmlidXRlc1t0XS5uYW1lO1siaWQiLCJ0eXBlIiwidmFsdWUiLCJzdHlsZSJdLmluY2x1ZGVzKG4pfHxlLnJlbW92ZUF0dHJpYnV0ZShuKX19KShvKTtmb3IoY29uc3QgZSBpbiB0KW8uc2V0QXR0cmlidXRlKGUsdFtlXSl9fSx5ZT1lPT57aWYoIWUuaW5wdXQpcmV0dXJuO2NvbnN0IHQ9Q2UoZS5pbnB1dCk7dCYmXyh0LGUsImlucHV0Iil9LHZlPShlLHQpPT57IWUucGxhY2Vob2xkZXImJnQuaW5wdXRQbGFjZWhvbGRlciYmKGUucGxhY2Vob2xkZXI9dC5pbnB1dFBsYWNlaG9sZGVyKX0sd2U9KGUsdCxuKT0+e2lmKG4uaW5wdXRMYWJlbCl7Y29uc3Qgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLGk9clsiaW5wdXQtbGFiZWwiXTtvLnNldEF0dHJpYnV0ZSgiZm9yIixlLmlkKSxvLmNsYXNzTmFtZT1pLCJvYmplY3QiPT10eXBlb2Ygbi5jdXN0b21DbGFzcyYmeihvLG4uY3VzdG9tQ2xhc3MuaW5wdXRMYWJlbCksby5pbm5lclRleHQ9bi5pbnB1dUFVùExhYmVsLHQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmViZWdpbiIsbyl9fSxDZT1lPT57Y29uc3QgdD1DKCk7aWYodClyZXR1cm4gSyh0LHJbZV18fHIuaW5wdXQpfSxBZT0oZSx0KT0+e1sic3RyaW5nIiwibnVtYmVyIl0uaW5jbHVkZXModHlwZW9mIHQpP2UudmFsdWU9YCR7dH1gOmIodCl8fHUoYFVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCAic3RyaW5nIiwgIm51bWJlciIgb3IgIlByb21pc2UiLCBnb3QgIiR7dHlwZW9mIHR9ImApfSxFZT17fTtFZS50ZXh0PUVlLmVtYWlsPUVlLnBhc3N3b3JkPUVlLm51bWJlcj1FZS50ZWw9RWUudXJsPUVlLnNlYXJjaD1FZS5kYXRlPUVlWyJkYXRldGltZS1sb2NhbCJdPUVlLnRpbWU9RWUud2Vlaz1FZS5tb250aD0oZSx0KT0+e2NvbnN0IG49ZTtyZXR1cm4gQWUobix0LmlucHV0VmFsdWUpLHdlKG4sbix0KSx2ZShuLHQpLG4udHlwZT10LmlucHV0LG59LEVlLmZpbGU9KGUsdCk9Pntjb25zdCBuPWU7cmV0dXJuIHdlKG4sbix0KSx2ZShuLHQpLG59LEVlLnJhbmdlPShlLHQpPT57Y29uc3Qgbj1lLG89bi5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpLGk9bi5xdWVyeVNlbGVjdG9yKCJvdXRwdXQiKTtyZXR1cm4gbyYmKEFlKG8sdC5pbnB1dFZhbHVlKSxvLnR5cGU9dC5pbnB1dCx3ZShvLGUsdCkpLGkmJkFlKGksdC5pbnB1dFZhbHVlKSxlfSxFZS5zZWxlY3Q9KGUsdCk9Pntjb25zdCBuPWU7aWYobi50ZXh0Q29udGVudD0iIix0LmlucHV0UGxhY2Vob2xkZXIpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7cShlLHQuaW5wdXRQbGFjZWhvbGRlciksZS52YWx1ZT0iIixlLmRpc2FibGVkPSEwLGUuc2VsZWN0ZWQ9ITAsbi5hcHBlbmRDaGlsZChlKX1yZXR1cm4gd2UobixuLHQpLG59LEVlLnJhZGlvPWU9PihlLnRleHRDb250ZW50PSIiLGUpLEVlLmNoZWNrYm94PShlLHQpPT57Y29uc3Qgbj1DKCk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJQb3B1cCBub3QgZm91bmQiKTtjb25zdCBvPVIobiwiY2hlY2tib3giKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIkNoZWNrYm94IGlucHV0IG5vdCBmb3VuZCIpO28udmFsdWU9IjEiLG8uY2hlY2tlZD1Cb29sZWFuKHQuaW5wdXRWYWx1ZSk7Y29uc3QgaT1lLnF1ZXJ5U2VsZWN0b3IoInNwYW4iKTtpZihpKXtjb25zdCBlPXQuaW5wdXRQbGFjZWhvbGRlcnx8dC5pbnB1dExhYmVsO2UmJnEoaSxlKX1yZXR1cm4gb30sRWUudGV4dGFyZWE9KGUsdCk9Pntjb25zdCBuPWU7QWUobix0LmlucHV0VmFsdWUpLHZlKG4sdCksd2UobixuLHQpO3JldHVybiBzZXRUaW1lb3V0KCgpPT57aWYoIk11dGF0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXtjb25zdCBlPUMoKTtpZighZSlyZXR1cm47Y29uc3Qgbz1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9PntpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhuKSlyZXR1cm47Y29uc3QgZT1uLm9mZnNldFdpZHRoKyhpPW4scGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoaSkubWFyZ2luTGVmdCkrcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoaSkubWFyZ2luUmlnaHQpKTt2YXIgaTtjb25zdCBzPUMoKTtzJiYoZT5vP3Muc3R5bGUud2lkdGg9YCR7ZX1weGA6WShzLCJ3aWR0aCIsdC53aWR0aCkpfSkub2JzZXJ2ZShuLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbInN0eWxlIl19KX19KSxufTtjb25zdCBrZT0oZSx0KT0+e2NvbnN0IG49aygpO24mJihKKG4pLF8obix0LCJodG1sQ29udGFpbmVyIiksdC5odG1sPyhhZSh0Lmh0bWwsbiksWChuLCJibG9jayIpKTp0LnRleHQ/KG4udGV4dENvbnRlbnQ9dC50ZXh0LFgobiwiYmxvY2siKSk6WihuKSwoKGUsdCk9Pntjb25zdCBuPUMoKTtpZighbilyZXR1cm47Y29uc3Qgbz1oZS5pbm5lclBhcmFtcy5nZXQoZSksaT0hb3x8dC5pbnB1dCE9PW8uaW5wdXQ7Z2UuZm9yRWFjaChlPT57Y29uc3Qgbz1LKG4scltlXSk7byYmKGJlKGUsdC5pbnB1dEF0dHJpYnV0ZXMpLG8uY2xhc3NOYW1lPXJbZV0saSYmWihvKSl9KSx0LmlucHV0JiYoaSYmZmUodCkseWUodCkpfSkoZSx0KSl9LEJlPShlLHQpPT57Zm9yKGNvbnN0W24sb11vZiBPYmplY3QuZW50cmllcyhhKSl0Lmljb24hPT1uJiZXKGUsbyk7eihlLHQuaWNvbiYmYVt0Lmljb25dKSxQZShlLHQpLCRlKCksXyhlLHQsImljb24iKX0sJGU9KCk9Pntjb25zdCBlPUMoKTtpZighZSlyZXR1cm47Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIiksbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIltjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXSwgLnN3YWwyLXN1Y2Nlc3MtZml4Iik7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspbltlXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9dH0sTGU9KGUsdCk9PntpZighdC5pY29uJiYhdC5pY29uSHRtbClyZXR1cm47bGV0IG49ZS5pbm5lckhUTUwsbz0iIjtpZih0Lmljb25IdG1sKW89eGUodC5pY29uSHRtbCk7ZWxzZSBpZigic3VjY2VzcyI9PT10Lmljb24pbz0oZT0+YFxuICAke2UuYW5pbWF0aW9uPyc8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdCI+PC9kaXY+JzoiIn1cbiAgPHNwYW4gY2xhc3M9InN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiPjwvc3Bhbj4gPHNwYW4gY2xhc3M9InN3YWwyLXN1Y2Nlc3MtbGluZS1sb25nIj48L3NwYW4+XG4gIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtcmluZyI+PC9kaXY+XG4gICR7ZS5hbmltYXRpb24/JzxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtZml4Ij48L2Rpdj4nOiIifVxuICAke2UuYW5pbWF0aW9uPyc8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHQiPjwvZGl2Pic6IiJ9XG5gKSh0KSxuPW4ucmVwbGFjZSgvIHN0eWxlPSIuKj8iL2csIiIpO2Vsc2UgaWYoImVycm9yIj09PXQuaWNvbilvPSdcbiAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyayI+XG4gICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyay1saW5lLWxlZnQiPjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0ic3dhbDIteC1tYXJrLWxpbmUtcmlnaHQiPjwvc3Bhbj5cbiAgPC9zcGFuPlxuJztlbHNlIGlmKHQuaWNvbil7bz14ZSh7cXVlc3Rpb246Ij8iLHdhcm5pbmc6IiEiLGluZm86ImkifVt0Lmljb25dKX1uLnRyaW0oKSE9PW8udHJpbSgpJiZxKGUsbyl9LFBlPShlLHQpPT57aWYodC5pY29uQ29sb3Ipe2Uuc3R5bGUuY29sb3I9dC5pY29uQ29sb3IsZS5zdHlsZS5ib3JkZXJDb2xvcj10Lmljb25Db2xvcjtmb3IoY29uc3QgbiBvZlsiLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiLCIuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmciLCIuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCIsIi5zd2FsMi14LW1hcmstbGluZS1yaWdodCJdKUcoZSxuLCJiYWNrZ3JvdW5kLWNvbG9yIix0Lmljb25Db2xvcik7RyhlLCIuc3dhbDItc3VjY2Vzcy1yaW5nIiwiYm9yZGVyLWNvbG9yIix0Lmljb25Db2xvcil9fSx4ZT1lPT5gPGRpdiBjbGFzcz0iJHtyWyJpY29uLWNvbnRlbnQiXX0iPiR7ZX08L2Rpdj5gO2xldCBUZT0hMSxTZT0wLE9lPTAsTWU9MCxIZT0wO2NvbnN0IGplPWU9Pntjb25zdCB0PUMoKTtpZighdClyZXR1cm47Y29uc3Qgbj1BKCk7aWYoZS50YXJnZXQ9PT10fHxuJiZuLmNvbnRhaW5zKGUudGFyZ2V0KSl7VGU9ITA7Y29uc3Qgbj1WZShlKTtTZT1uLmNsaWVudFgsT2U9bi5jbGllbnRZLE1lPXBhcnNlSW50KHQuc3R5bGUuaW5zZXRJbmxpbmVTdGFydCl8fDAsSGU9cGFyc2VJbnQodC5zdHlsZS5pbnNldEJsb2NrU3RhcnQpfHwwLHoodCwic3dhbDItZHJhZ2dpbmciKX19LEllPWU9Pntjb25zdCB0PUMoKTtpZih0JiZUZSl7bGV0e2NsaWVudFg6bixjbGllbnRZOml9PVZlKGUpO2NvbnN0IHM9bi1TZTt0LnN0eWxlLmluc2V0SW5saW5lU3RhcnQ9YCR7TWUrKG8uaXNSVEw/LXM6cyl9cHhgLHQuc3R5bGUuaW5zZXRCbG9ja1N0YXJ0PWAke0hlKyhpLU9lKX1weGB9fSxEZT0oKT0+e2NvbnN0IGU9QygpO1RlPSExLFcoZSwic3dhbDItZHJhZ2dpbmciKX0sVmU9ZT0+e2xldCB0PTAsbj0wO3JldHVybiBlLnR5cGUuc3RhcnRzV2l0aCgibW91c2UiKT8odD1lLmNsaWVudFgsbj1lLmNsaWVudFkpOmUudHlwZS5zdGFydHNXaXRoKCJ0b3VjaCIpJiYodD1lLnRvdWNoZXNbMF0uY2xpZW50WCxuPWUudG91Y2hlc1swXS5jbGllbnRZKSx7Y2xpZW50WDp0LGNsaWVudFk6bn19LHFlPShlLHQpPT57Y29uc3Qgbj15KCksbz1DKCk7aWYobiYmbyl7aWYodC50b2FzdCl7WShuLCJ3aWR0aCIsdC53aWR0aCksby5zdHlsZS53aWR0aD0iMTAwJSI7Y29uc3QgZT1TKCk7ZSYmby5pbnNlcnRCZWZvcmUoZSxBKCkpfWVsc2UgWShvLCJ3aWR0aCIsdC53aWR0aCk7WShvLCJwYWRkaW5nIix0LnBhZGRpbmcpLHQuY29sb3ImJihvLnN0eWxlLmNvbG9yPXQuY29sb3IpLHQuYmFja2dyb3VuZCYmKG8uc3R5bGUuYmFja2dyb3VuZD10LmJhY2tncm91bmQpLFooTCgpKSxOZShvLHQpLHQuZHJhZ2dhYmxlJiYhdC50b2FzdD8oeihvLHIuZHJhZ2dhYmxlKSwoZT0+e2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixqZSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEllKSxlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLERlKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGplKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsSWUpLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLERlKX0pKG8pKTooVyhvLHIuZHJhZ2dhYmxlKSwoZT0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixqZSksZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEllKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLERlKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGplKSxkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsSWUpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLERlKX0pKG8pKX19LE5lPShlLHQpPT57Y29uc3Qgbj10LnNob3dDbGFzc3x8e307ZS5jbGFzc05hbWU9YCR7ci5wb3B1cH0gJHtlZShlKT9uLnBvcHVwOiIifWAsdC50b2FzdD8oeihbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHJbInRvYXN0LXNob3duIl0pLHooZSxyLnRvYXN0KSk6eihlLHIubW9kYWwpLF8oZSx0LCJwb3B1cCIpLCJzdHJpbmciPT10eXBlb2YgdC5jdXN0b21DbGFzcyYmeihlLHQuY3VzdG9tQ2xhc3MpLHQuaWNvbiYmeihlLHJbYGljb24tJHt0Lmljb259YF0pfSxfZT1lPT57Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpO3JldHVybiB6KHQsclsicHJvZ3Jlc3Mtc3RlcCJdKSxxKHQsZSksdH0sUmU9ZT0+e2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtyZXR1cm4geih0LHJbInByb2dyZXNzLXN0ZXAtbGluZSJdKSxlLnByb2dyZXNzU3RlcHNEaXN0YW5jZSYmWSh0LCJ3aWR0aCIsZS5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UpLHR9LEZlPShlLHQpPT57dmFyIG47cWUoMCx0KSxtZSgwLHQpLCgoZSx0KT0+e2NvbnN0IG49JCgpO2lmKCFuKXJldHVybjtjb25zdHtwcm9ncmVzc1N0ZXBzOm8sY3VycmVudFByb2dyZXNzU3RlcDppfT10O28mJjAhPT1vLmxlbmd0aCYmdm9pZCAwIT09aT8oWChuKSxuLnRleHRDb250ZW50PSIiLGk+PW8ubGVuZ3RoJiZ1KCJJbnZhbGlkIGN1cnJlbnRQcm9ncmVzc1N0ZXAgcGFyYW1ldGVyLCBpdCBzaG91bGQgYmUgbGVzcyB0aGFuIHByb2dyZXNzU3RlcHMubGVuZ3RoIChjdXJyZW50UHJvZ3Jlc3NTdGVwIGxpa2UgSlMgYXJyYXlzIHN0YXJ0cyBmcm9tIDApIiksby5mb3JFYWNoKChlLHMpPT57Y29uc3QgYT1fZShlKTtpZihuLmFwcGVuZENoaWxkKGEpLHM9PT1pJiZ6KGEsclsiYWN0aXZlLXByb2dyZXNzLXN0ZXAiXSkscyE9PW8ubGVuZ3RoLTEpe2NvbnN0IGU9UmUodCk7bi5hcHBlbmRDaGlsZChlKX19KSk6WihuKX0pKDAsdCksKChlLHQpPT57Y29uc3Qgbj1oZS5pbm5lclBhcmFtcy5nZXQoZSksbz1BKCk7aWYoIW8pcmV0dXJuO2lmKG4mJnQuaWNvbj09PW4uaWNvbilyZXR1cm4gTGUobyx0KSx2b2lkIEJlKG8sdCk7aWYoIXQuaWNvbiYmIXQuaWNvbkh0bWwpcmV0dXJuIHZvaWQgWihvKTtpZih0Lmljb24mJi0xPT09T2JqZWN0LmtleXMoYSkuaW5kZXhPZih0Lmljb24pKXJldHVybiBkKGBVbmtub3duIGljb24hIEV4cGVjdGVkICJzdWNjZXNzIiwgImVycm9yIiwgIndhcm5pbmciLCAiaW5mbyIgb3IgInF1ZXN0aW9uIiwgZ290ICIke3QuaWNvbn0iYCksdm9pZCBaKG8pO1gobyksTGUobyx0KSxCZShvLHQpLHoobyx0LnNob3dDbGFzcyYmdC5zaG93Q2xhc3MuaWNvbiksd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCRlKX0pKGUsdCksKChlLHQpPT57Y29uc3Qgbj1CKCk7biYmKHQuaW1hZ2VVcmw/KFgobiwiIiksbi5zZXRBdHRyaWJ1dGUoInNyYyIsdC5pbWFnZVVybCksbi5zZXRBdHRyaWJ1dGUoImFsdCIsdC5pbWFnZUFsdHx8IiIpLFkobiwid2lkdGgiLHQuaW1hZ2VXaWR0aCksWShuLCJoZWlnaHQiLHQuaW1hZ2VIZWlnaHQpLG4uY2xhc3NOYW1lPXIuaW1hZ2UsXyhuLHQsImltYWdlIikpOloobikpfSkoMCx0KSwoKGUsdCk9Pntjb25zdCBuPUUoKTtuJiYoSihuKSxRKG4sQm9vbGVhbih0LnRpdGxlfHx0LnRpdGxlVGV4dCksImJsb2NrIiksdC50aXRsZSYmYWUodC50aXRsZSxuKSx0LnRpdGxlVGV4dCYmKG4uaW5uZXJUZXh0PXQudGl0bGVUZXh0KSxfKG4sdCwidGl0bGUiKSl9KSgwLHQpLCgoZSx0KT0+e2NvbnN0IG49aigpO24mJihxKG4sdC5jbG9zZUJ1dHRvbkh0bWx8fCIiKSxfKG4sdCwiY2xvc2VCdXR0b24iKSxRKG4sdC5zaG93Q2xvc2VCdXR0b24pLG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0LmNsb3NlQnV0dG9uQXJpYUxhYmVsfHwiIikpfSkoMCx0KSxrZShlLHQpLHVlKDAsdCksKChlLHQpPT57Y29uc3Qgbj1NKCk7biYmKEoobiksUShuLEJvb2xlYW4odC5mb290ZXIpLCJibG9jayIpLHQuZm9vdGVyJiZhZSh0LmZvb3RlcixuKSxfKG4sdCwiZm9vdGVyIikpfSkoMCx0KTtjb25zdCBpPUMoKTsiZnVuY3Rpb24iPT10eXBlb2YgdC5kaWRSZW5kZXImJmkmJnQuZGlkUmVuZGVyKGkpLG51bGw9PT0obj1vLmV2ZW50RW1pdHRlcil8fHZvaWQgMD09PW58fG4uZW1pdCgiZGlkUmVuZGVyIixpKX0sVWU9KCk9Pnt2YXIgZTtyZXR1cm4gbnVsbD09PShlPVAoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY2xpY2soKX0semU9T2JqZWN0LmZyZWV6ZSh7Y2FuY2VsOiJjYW5jZWwiLGJhY2tkcm9wOiJiYWNrZHJvcCIsY2xvc2U6ImNsb3NlIixlc2M6ImVzYyIsdGltZXI6InRpbWVyIn0pLFdlPWU9PntpZihlLmtleWRvd25UYXJnZXQmJmUua2V5ZG93bkhhbmRsZXJBZGRlZCYmZS5rZXlkb3duSGFuZGxlcil7Y29uc3QgdD1lLmtleWRvd25IYW5kbGVyO2Uua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0LHtjYXB0dXJlOmUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLGUua2V5ZG93bkhhbmRsZXJBZGRlZD0hMX19LEtlPShlLHQpPT57dmFyIG47Y29uc3Qgbz1JKCk7aWYoby5sZW5ndGgpcmV0dXJuLTI9PT0oZSs9dCkmJihlPW8ubGVuZ3RoLTEpLGU9PT1vLmxlbmd0aD9lPTA6LTE9PT1lJiYoZT1vLmxlbmd0aC0xKSx2b2lkIG9bZV0uZm9jdXMoKTtudWxsPT09KG49QygpKXx8dm9pZCAwPT09bnx8bi5mb2N1cygpfSxZZT1bIkFycm93UmlnaHQiLCJBcnJvd0Rvd24iXSxYZT1bIkFycm93TGVmdCIsIkFycm93VXAiXSxaZT0oZSx0LG4pPT57ZSYmKHQuaXNDb21wb3Npbmd8fDIyOT09PXQua2V5Q29kZXx8KGUuc3RvcEtleWRvd25Qcm9wYWdhdGlvbiYmdC5zdG9wUHJvcGFnYXRpb24oKSwiRW50ZXIiPT09dC5rZXk/SmUodCxlKToiVGFiIj09PXQua2V5P0dlKHQpOlsuLi5ZZSwuLi5YZV0uaW5jbHVkZXModC5rZXkpP1FlKHQua2V5KToiRXNjYXBlIj09PXQua2V5JiZldCh0LGUsbikpKX0sSmU9KGUsdCk9PntpZighaCh0LmFsbG93RW50ZXJLZXkpKXJldHVybjtjb25zdCBuPUMoKTtpZighbnx8IXQuaW5wdXQpcmV0dXJuO2NvbnN0IG89UihuLHQuaW5wdXQpO2lmKGUudGFyZ2V0JiZvJiZlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5vdXRlckhUTUw9PT1vLm91dGVySFRNTCl7aWYoWyJ0ZXh0YXJlYSIsImZpbGUiXS5pbmNsdWRlcyh0LmlucHV0KSlyZXR1cm47VWUoKSxlLnByZXZlbnREZWZhdWx0KCl9fSxHZT1lPT57Y29uc3QgdD1lLnRhcmdldCxuPUkoKTtsZXQgbz0tMTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKylpZih0PT09bltlXSl7bz1lO2JyZWFrfWUuc2hpZnRLZXk/S2UobywtMSk6S2UobywxKSxlLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKX0sUWU9ZT0+e2NvbnN0IHQ9TygpLG49UCgpLG89VCgpLGk9eCgpO2lmKCEodCYmbiYmbyYmaSkpcmV0dXJuO2NvbnN0IHM9W24sbyxpXTtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJiFzLmluY2x1ZGVzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXJldHVybjtjb25zdCByPVllLmluY2x1ZGVzKGUpPyJuZXh0RWxlbWVudFNpYmxpbmciOiJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIjtsZXQgYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKGEpe2ZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXtpZihhPWFbcl0sIWEpcmV0dXJuO2lmKGEgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCYmZWUoYSkpYnJlYWt9YSBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50JiZhLmZvY3VzKCl9fSxldD0oZSx0LG4pPT57ZS5wcmV2ZW50RGVmYXVsdCgpLGgodC5hbGxvd0VzY2FwZUtleSkmJm4oemUuZXNjKX07dmFyIHR0PXtzd2FsUHJvbWlzZVJlc29sdmU6bmV3IFdlYWtNYXAsc3dhbFByb21pc2VSZWplY3Q6bmV3IFdlYWtNYXB9O2NvbnN0IG50PSgpPT57QXJyYXkuZnJvbShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKGU9PntlLmhhc0F0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpPyhlLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLGUuZ2V0QXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIil8fCIiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpKTplLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKX0pfSxvdD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmQm9vbGVhbih3aW5kb3cuR2VzdHVyZUV2ZW50KSxpdD1vdCYmL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW0sc3Q9KCk9Pntjb25zdCBlPXkoKTtpZighZSlyZXR1cm47bGV0IHQ7ZS5vbnRvdWNoc3RhcnQ9ZT0+e3Q9cnQoZSl9LGUub250b3VjaG1vdmU9ZT0+e3QmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSl9fSxydD1lPT57Y29uc3QgdD1lLnRhcmdldCxuPXkoKSxvPWsoKTtyZXR1cm4hKCFufHwhbykmJighYXQoZSkmJiFsdChlKSYmKHQ9PT1ufHwhKHRlKG4pfHwhKHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCl8fCgoZSx0KT0+e2xldCBuPWU7Zm9yKDtuJiZuIT09dDspe2lmKHRlKG4pKXJldHVybiEwO249bi5wYXJlbnRFbGVtZW50fXJldHVybiExfSkodCxvKXx8IklOUFVUIj09PXQudGFnTmFtZXx8IlRFWFRBUkVBIj09PXQudGFnTmFtZXx8dGUobykmJm8uY29udGFpbnModCkpKSl9LGF0PWU9PkJvb2xlYW4oZS50b3VjaGVzJiZlLnRvdWNoZXMubGVuZ3RoJiYic3R5bHVzIj09PWUudG91Y2hlc1swXS50b3VjaFR5cGUpLGx0PWU9PmUudG91Y2hlcyYmZS50b3VjaGVzLmxlbmd0aD4xO2xldCBjdD1udWxsO2NvbnN0IHV0PWU9PntudWxsPT09Y3QmJihkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHR8fCJzY3JvbGwiPT09ZSkmJihjdD1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLXJpZ2h0IikpLGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PWAke2N0KygoKT0+e2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc05hbWU9clsic2Nyb2xsYmFyLW1lYXN1cmUiXSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO2NvbnN0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC1lLmNsaWVudFdpZHRoO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpLHR9KSgpfXB4YCl9O2Z1bmN0aW9uIGR0KGUsdCxuLHMpe1YoKT92dChlLHMpOihpKG4pLnRoZW4oKCk9PnZ0KGUscykpLFdlKG8pKSxvdD8odC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTpub25lICFpbXBvcnRhbnQiKSx0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSx0LmlubmVySFRNTD0iIik6dC5yZW1vdmUoKSxEKCkmJihudWxsIT09Y3QmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1gJHtjdH1weGAsY3Q9bnVsbCksKCgpPT57aWYoTihkb2N1bWVudC5ib2R5LHIuaW9zZml4KSl7Y29uc3QgZT1wYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCwxMCk7Vyhkb2N1bWVudC5ib2R5LHIuaW9zZml4KSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD0tMSplfX0pKCksbnQoKSksVyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFtyLnNob3duLHJbImhlaWdodC1hdXRvIl0sclsibm8tYmFja2Ryb3AiXSxyWyJ0b2FzdC1zaG93biJdXSl9ZnVuY3Rpb24gcHQoZSl7ZT1mdChlKTtjb25zdCB0PXR0LnN3YWxQcm9taXNlUmVzb2x2ZS5nZXQodGhpcyksbj1tdCh0aGlzKTt0aGlzLmlzQXdhaXRpbmdQcm9taXNlP2UuaXNEaXNtaXNzZWR8fChndCh0aGlzKSx0KGUpKTpuJiZ0KGUpfWNvbnN0IG10PWU9Pntjb25zdCB0PUMoKTtpZighdClyZXR1cm4hMTtjb25zdCBuPWhlLmlubmVyUGFyYW1zLmdldChlKTtpZighbnx8Tih0LG4uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4hMTtXKHQsbi5zaG93Q2xhc3MucG9wdXApLHoodCxuLmhpZGVDbGFzcy5wb3B1cCk7Y29uc3Qgbz15KCk7cmV0dXJuIFcobyxuLnNob3dDbGFzcy5iYWNrZHJvcCkseihvLG4uaGlkZUNsYXNzLmJhY2tkcm9wKSxidChlLHQsbiksITB9O2Z1bmN0aW9uIGh0KGUpe2NvbnN0IHQ9dHQuc3dhbFByb21pc2VSZWplY3QuZ2V0KHRoaXMpO2d0KHRoaXMpLHQmJnQoZSl9Y29uc3QgZ3Q9ZT0+e2UuaXNBd2FpdGluZ1Byb21pc2UmJihkZWxldGUgZS5pc0F3YWl0aW5nUHJvbWlzZSxoZS5pbm5lclBhcmFtcy5nZXQoZSl8fGUuX2Rlc3Ryb3koKSl9LGZ0PWU9PnZvaWQgMD09PWU/e2lzQ29uZmlybWVkOiExLGlzRGVuaWVkOiExLGlzRGlzbWlzc2VkOiEwfTpPYmplY3QuYXNzaWduKHtpc0NvbmZpcm1lZDohMSxpc0RlbmllZDohMSxpc0Rpc21pc3NlZDohMX0sZSksYnQ9KGUsdCxuKT0+e3ZhciBpO2NvbnN0IHM9eSgpLHI9bmUodCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4ud2lsbENsb3NlJiZuLndpbGxDbG9zZSh0KSxudWxsPT09KGk9by5ldmVudEVtaXR0ZXIpfHx2b2lkIDA9PT1pfHxpLmVtaXQoIndpbGxDbG9zZSIsdCksciYmcz95dChlLHQscyxCb29sZWFuKG4ucmV0dXJuRm9jdXMpLG4uZGlkQ2xvc2UpOnMmJmR0KGUscyxCb29sZWFuKG4ucmV0dXJuRm9jdXMpLG4uZGlkQ2xvc2UpfSx5dD0oZSx0LG4saSxzKT0+e28uc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrPWR0LmJpbmQobnVsbCxlLG4saSxzKTtjb25zdCByPWZ1bmN0aW9uKGUpe3ZhciBuO2UudGFyZ2V0PT09dCYmKG51bGw9PT0obj1vLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayl8fHZvaWQgMD09PW58fG4uY2FsbChvKSxkZWxldGUgby5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2ssdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIscikpfTt0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsciksdC5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixyKX0sdnQ9KGUsdCk9PntzZXRUaW1lb3V0KCgpPT57dmFyIG47ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYmluZChlLnBhcmFtcykoKSxudWxsPT09KG49by5ldmVudEVtaXR0ZXIpfHx2b2lkIDA9PT1ufHxuLmVtaXQoImRpZENsb3NlIiksZS5fZGVzdHJveSYmZS5fZGVzdHJveSgpfSl9LHd0PWU9PntsZXQgdD1DKCk7aWYodHx8bmV3IFFuLHQ9QygpLCF0KXJldHVybjtjb25zdCBuPVMoKTtWKCk/WihBKCkpOkN0KHQsZSksWChuKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiwidHJ1ZSIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWJ1c3kiLCJ0cnVlIiksdC5mb2N1cygpfSxDdD0oZSx0KT0+e2NvbnN0IG49TygpLG89UygpO24mJm8mJighdCYmZWUoUCgpKSYmKHQ9UCgpKSxYKG4pLHQmJihaKHQpLG8uc2V0QXR0cmlidXRlKCJkYXRhLWJ1dHRvbi10by1yZXBsYWNlIix0LmNsYXNzTmFtZSksbi5pbnNlcnRCZWZvcmUobyx0KSkseihbZSxuXSxyLmxvYWRpbmcpKX0sQXQ9ZT0+ZS5jaGVja2VkPzE6MCxFdD1lPT5lLmNoZWNrZWQ/ZS52YWx1ZTpudWxsLGt0PWU9PmUuZmlsZXMmJmUuZmlsZXMubGVuZ3RoP251bGwhPT1lLmdldEF0dHJpYnV0ZSgibXVsdGlwbGUiKT9lLmZpbGVzOmUuZmlsZXNbMF06bnVsbCxCdD0oZSx0KT0+e2NvbnN0IG49QygpO2lmKCFuKXJldHVybjtjb25zdCBvPWU9Pnsic2VsZWN0Ij09PXQuaW5wdXQ/ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IG89SyhlLHIuc2VsZWN0KTtpZighbylyZXR1cm47Y29uc3QgaT0oZSx0LG8pPT57Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtpLnZhbHVlPW8scShpLHQpLGkuc2VsZWN0ZWQ9UHQobyxuLmlucHV0VmFsdWUpLGUuYXBwZW5kQ2hpbGQoaSl9O3QuZm9yRWFjaChlPT57Y29uc3QgdD1lWzBdLG49ZVsxXTtpZihBcnJheS5pc0FycmF5KG4pKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGdyb3VwIik7ZS5sYWJlbD10LGUuZGlzYWJsZWQ9ITEsby5hcHBlbmRDaGlsZChlKSxuLmZvckVhY2godD0+aShlLHRbMV0sdFswXSkpfWVsc2UgaShvLG4sdCl9KSxvLmZvY3VzKCl9KG4sTHQoZSksdCk6InJhZGlvIj09PXQuaW5wdXQmJmZ1bmN0aW9uKGUsdCxuKXtjb25zdCBvPUsoZSxyLnJhZGlvKTtpZighbylyZXR1cm47dC5mb3JFYWNoKGU9Pntjb25zdCB0PWVbMF0saT1lWzFdLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7cy50eXBlPSJyYWRpbyIscy5uYW1lPXIucmFkaW8scy52YWx1ZT10LFB0KHQsbi5pbnB1dFZhbHVlKSYmKHMuY2hlY2tlZD0hMCk7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7cShsLGkpLGwuY2xhc3NOYW1lPXIubGFiZWwsYS5hcHBlbmRDaGlsZChzKSxhLmFwcGVuZENoaWxkKGwpLG8uYXBwZW5kQ2hpbGQoYSl9KTtjb25zdCBpPW8ucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQiKTtpLmxlbmd0aCYmaVswXS5mb2N1cygpfShuLEx0KGUpLHQpfTtnKHQuaW5wdXRPcHRpb25zKXx8Yih0LmlucHV0T3B0aW9ucyk/KHd0KFAoKSksZih0LmlucHV0T3B0aW9ucykudGhlbih0PT57ZS5oaWRlTG9hZGluZygpLG8odCl9KSk6Im9iamVjdCI9PXR5cGVvZiB0LmlucHV0T3B0aW9ucz9vKHQuaW5wdXRPcHRpb25zKTpkKCJVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXRPcHRpb25zISBFeHBlY3RlZCBvYmplY3QsIE1hcCBvciBQcm9taXNlLCBnb3QgIit0eXBlb2YgdC5pbnB1dE9wdGlvbnMpfSwkdD0oZSx0KT0+e2NvbnN0IG49ZS5nZXRJbnB1dCgpO24mJihaKG4pLGYodC5pbnB1dFZhbHVlKS50aGVuKG89PntuLnZhbHVlPSJudW1iZXIiPT09dC5pbnB1dD9gJHtwYXJzZUZsb2F0KG8pfHwwfWA6YCR7b31gLFgobiksbi5mb2N1cygpLGUuaGlkZUxvYWRpbmcoKX0pLmNhdGNoKHQ9PntkKGBFcnJvciBpbiBpbnB1dFZhbHVlIHByb21pc2U6ICR7dH1gKSxuLnZhbHVlPSIiLFgobiksbi5mb2N1cygpLGUuaGlkZUxvYWRpbmcoKX0pKX07Y29uc3QgTHQ9ZT0+e2NvbnN0IHQ9W107cmV0dXJuIGUgaW5zdGFuY2VvZiBNYXA/ZS5mb3JFYWNoKChlLG4pPT57bGV0IG89ZTsib2JqZWN0Ij09dHlwZW9mIG8mJihvPUx0KG8pKSx0LnB1c2goW24sb10pfSk6T2JqZWN0LmtleXMoZSkuZm9yRWFjaChuPT57bGV0IG89ZVtuXTsib2JqZWN0Ij09dHlwZW9mIG8mJihvPUx0KG8pKSx0LnB1c2goW24sb10pfSksdH0sUHQ9KGUsdCk9PkJvb2xlYW4odCkmJm51bGwhPXQmJnQudG9TdHJpbmcoKT09PWUudG9TdHJpbmcoKSx4dD0oZSx0KT0+e2NvbnN0IG49aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2lmKCFuLmlucHV0KXJldHVybiB2b2lkIGQoYFRoZSAiaW5wdXQiIHBhcmFtZXRlciBpcyBuZWVkZWQgdG8gYmUgc2V0IHdoZW4gdXNpbmcgcmV0dXJuSW5wdXRWYWx1ZU9uJHtjKHQpfWApO2NvbnN0IG89ZS5nZXRJbnB1dCgpLGk9KChlLHQpPT57Y29uc3Qgbj1lLmdldElucHV0KCk7aWYoIW4pcmV0dXJuIG51bGw7c3dpdGNoKHQuaW5wdXQpe2Nhc2UiY2hlY2tib3giOnJldHVybiBBdChuKTtjYXNlInJhZGlvIjpyZXR1cm4gRXQobik7Y2FzZSJmaWxlIjpyZXR1cm4ga3Qobik7ZGVmYXVsdDpyZXR1cm4gdC5pbnB1dEF1dG9UcmltP24udmFsdWUudHJpbSgpOm4udmFsdWV9fSkoZSxuKTtuLmlucHV0VmFsaWRhdG9yP1R0KGUsaSx0KTpvJiYhby5jaGVja1ZhbGlkaXR5KCk/KGUuZW5hYmxlQnV0dG9ucygpLGUuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKG4udmFsaWRhdGlvbk1lc3NhZ2V8fG8udmFsaWRhdGlvbk1lc3NhZ2UpKToiZGVueSI9PT10P1N0KGUsaSk6SHQoZSxpKX0sVHQ9KGUsdCxuKT0+e2NvbnN0IG89aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2UuZGlzYWJsZUlucHV0KCk7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+ZihvLmlucHV0VmFsaWRhdG9yKHQsby52YWxpZGF0aW9uTWVzc2FnZSkpKS50aGVuKG89PntlLmVuYWJsZUJ1dHRvbnMoKSxlLmVuYWJsZUlucHV0KCksbz9lLnNob3dWYWxpZGF0aW9uTWVzc2FnZShvKToiZGVueSI9PT1uP1N0KGUsdCk6SHQoZSx0KX0pfSxTdD0oZSx0KT0+e2NvbnN0IG49aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2lmKG4uc2hvd0xvYWRlck9uRGVueSYmd3QoVCgpKSxuLnByZURlbnkpe2UuaXNBd2FpdGluZ1Byb21pc2U9ITA7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+ZihuLnByZURlbnkodCxuLnZhbGlkYXRpb25NZXNzYWdlKSkpLnRoZW4obj0+eyExPT09bj8oZS5oaWRlTG9hZGluZygpLGd0KGUpKTplLmNsb3NlKHtpc0RlbmllZDohMCx2YWx1ZTp2b2lkIDA9PT1uP3Q6bn0pfSkuY2F0Y2godD0+TXQoZSx0KSl9ZWxzZSBlLmNsb3NlKHtpc0RlbmllZDohMCx2YWx1ZTp0fSl9LE90PShlLHQpPT57ZS5jbG9zZSh7aXNDb25maXJtZWQ6ITAsdmFsdWU6dH0pfSxNdD0oZSx0KT0+e2UucmVqZWN0UHJvbWlzZSh0KX0sSHQ9KGUsdCk9Pntjb25zdCBuPWhlLmlubmVyUGFyYW1zLmdldChlKTtpZihuLnNob3dMb2FkZXJPbkNvbmZpcm0mJnd0KCksbi5wcmVDb25maXJtKXtlLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxlLmlzQXdhaXRpbmdQcm9taXNlPSEwO1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PmYobi5wcmVDb25maXJtKHQsbi52YWxpZGF0aW9uTWVzc2FnZSkpKS50aGVuKG49PntlZShMKCkpfHwhMT09PW4/KGUuaGlkZUxvYWRpbmcoKSxndChlKSk6T3QoZSx2b2lkIDA9PT1uP3Q6bil9KS5jYXRjaCh0PT5NdChlLHQpKX1lbHNlIE90KGUsdCl9O2Z1bmN0aW9uIGp0KCl7Y29uc3QgZT1oZS5pbm5lclBhcmFtcy5nZXQodGhpcyk7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9aGUuZG9tQ2FjaGUuZ2V0KHRoaXMpO1oodC5sb2FkZXIpLFYoKT9lLmljb24mJlgoQSgpKTpJdCh0KSxXKFt0LnBvcHVwLHQuYWN0aW9uc10sci5sb2FkaW5nKSx0LnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1idXN5IiksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbG9hZGluZyIpLHQuY29uZmlybUJ1dHRvbi5kaXNhYmxlZD0hMSx0LmRlbnlCdXR0b24uZGlzYWJsZWQ9ITEsdC5jYW5jZWxCdXR0b24uZGlzYWJsZWQ9ITE7Y29uc3Qgbj1oZS5mb2N1c2VkRWxlbWVudC5nZXQodGhpcyk7biBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZG9jdW1lbnQuYm9keSYmbi5mb2N1cygpLGhlLmZvY3VzZWRFbGVtZW50LmRlbGV0ZSh0aGlzKX1jb25zdCBJdD1lPT57Y29uc3QgdD1lLmxvYWRlci5nZXRBdHRyaWJ1dGUoImRhdGEtYnV0dG9uLXRvLXJlcGxhY2UiKSxuPXQ/ZS5wb3B1cC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQpOltdO24ubGVuZ3RoP1goblswXSwiaW5saW5lLWJsb2NrIik6ZWUoUCgpKXx8ZWUoVCgpKXx8ZWUoeCgpKXx8WihlLmFjdGlvbnMpfTtmdW5jdGlvbiBEdCgpe2NvbnN0IGU9aGUuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpLHQ9aGUuZG9tQ2FjaGUuZ2V0KHRoaXMpO3JldHVybiB0P1IodC5wb3B1cCxlLmlucHV0KTpudWxsfWZ1bmN0aW9uIFZ0KGUsdCxuKXtjb25zdCBvPWhlLmRvbUNhY2hlLmdldChlKTt0LmZvckVhY2goZT0+e29bZV0uZGlzYWJsZWQ9bn0pfWZ1bmN0aW9uIHF0KGUsdCl7Y29uc3Qgbj1DKCk7aWYobiYmZSlpZigicmFkaW8iPT09ZS50eXBlKXtjb25zdCBlPW4ucXVlcnlTZWxlY3RvckFsbChgW25hbWU9IiR7ci5yYWRpb30iXWApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0uZGlzYWJsZWQ9dH1lbHNlIGUuZGlzYWJsZWQ9dH1mdW5jdGlvbiBOdCgpe1Z0KHRoaXMsWyJjb25maXJtQnV0dG9uIiwiZGVueUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiJdLCExKTtjb25zdCBlPWhlLmZvY3VzZWRFbGVtZW50LmdldCh0aGlzKTtlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5JiZlLmZvY3VzKCksaGUuZm9jdXNlZEVsZW1lbnQuZGVsZXRlKHRoaXMpfWZ1bmN0aW9uIF90KCl7aGUuZm9jdXNlZEVsZW1lbnQuc2V0KHRoaXMsZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksVnQodGhpcyxbImNvbmZpcm1CdXR0b24iLCJkZW55QnV0dG9uIiwiY2FuY2VsQnV0dG9uIl0sITApfWZ1bmN0aW9uIFJ0KCl7cXQodGhpcy5nZXRJbnB1dCgpLCExKX1mdW5jdGlvbiBGdCgpe3F0KHRoaXMuZ2V0SW5wdXQoKSwhMCl9ZnVuY3Rpb24gVXQoZSl7Y29uc3QgdD1oZS5kb21DYWNoZS5nZXQodGhpcyksbj1oZS5pbm5lclBhcmFtcy5nZXQodGhpcyk7cSh0LnZhbGlkYXRpb25NZXNzYWdlLGUpLHQudmFsaWRhdGlvbk1lc3NhZ2UuY2xhc3NOYW1lPXJbInZhbGlkYXRpb24tbWVzc2FnZSJdLG4uY3VzdG9tQ2xhc3MmJm4uY3VzdG9tQ2xhc3MudmFsaWRhdGlvbk1lc3NhZ2UmJnoodC52YWxpZGF0aW9uTWVzc2FnZSxuLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSxYKHQudmFsaWRhdGlvbk1lc3NhZ2UpO2NvbnN0IG89dGhpcy5nZXRJbnB1dCgpO28mJihvLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpLG8uc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksRihvKSx6KG8sci5pbnB1dGVycm9yKSl9ZnVuY3Rpb24genQoKXtjb25zdCBlPWhlLmRvbUNhY2hlLmdldCh0aGlzKTtlLnZhbGlkYXRpb25NZXNzYWdlJiZaKGUudmFsaWRhdGlvbk1lc3NhZ2UpO2NvbnN0IHQ9dGhpcy5nZXRJbnB1dCgpO3QmJih0LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiksdC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKSxXKHQsci5pbnB1dGVycm9yKSl9Y29uc3QgV3Q9e3RpdGxlOiIiLHRpdGxlVGV4dDoiIix0ZXh0OiIiLGh0bWw6IiIsZm9vdGVyOiIiLGljb246dm9pZCAwLGljb25Db2xvcjp2b2lkIDAsaWNvbkh0bWw6dm9pZCAwLHRlbXBsYXRlOnZvaWQgMCx0b2FzdDohMSxkcmFnZ2FibGU6ITEsYW5pbWF0aW9uOiEwLHRoZW1lOiJsaWdodCIsc2hvd0NsYXNzOntwb3B1cDoic3dhbDItc2hvdyIsYmFja2Ryb3A6InN3YWwyLWJhY2tkcm9wLXNob3ciLGljb246InN3YWwyLWljb24tc2hvdyJ9LGhpZGVDbGFzczp7cG9wdXA6InN3YWwyLWhpZGUiLGJhY2tkcm9wOiJzd2FsMi1iYWNrZHJvcC1oaWRlIixpY29uOiJzd2FsMi1pY29uLWhpZGUifSxjdXN0b21DbGFzczp7fSx0YXJnZXQ6ImJvZHkiLGNvbG9yOnZvaWQgMCxiYWNrZHJvcDohMCxoZWlnaHRBdXRvOiEwLGFsbG93T3V0c2lkZUNsaWNrOiEwLGFsbG93RXNjYXBlS2V5OiEwLGFsbG93RW50ZXJLZXk6ITAsc3RvcEtleWRvd25Qcm9wYWdhdGlvbjohMCxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiExLHNob3dDb25maXJtQnV0dG9uOiEwLHNob3dEZW55QnV0dG9uOiExLHNob3dDYW5jZWxCdXR0b246ITEscHJlQ29uZmlybTp2b2lkIDAscHJlRGVueTp2b2lkIDAsY29uZmlybUJ1dHRvblRleHQ6Ik9LIixjb25maXJtQnV0dG9uQXJpYUxhYmVsOiIiLGNvbmZpcm1CdXR0b25Db2xvcjp2b2lkIDAsZGVueUJ1dHRvblRleHQ6Ik5vIixkZW55QnV0dG9uQXJpYUxhYmVsOiIiLGRlbnlCdXR0b25Db2xvcjp2b2lkIDAsY2FuY2VsQnV0dG9uVGV4dDoiQ2FuY2VsIixjYW5jZWxCdXR0b25BcmlhTGFiZWw6IiIsY2FuY2VsQnV0dG9uQ29sb3I6dm9pZCAwLGJ1dHRvbnNTdHlsaW5nOiEwLHJldmVyc2VCdXR0b25zOiExLGZvY3VzQ29uZmlybTohMCxmb2N1c0Rlbnk6ITEsZm9jdXNDYW5jZWw6ITEscmV0dXJuRm9jdXM6ITAsc2hvd0Nsb3NlQnV0dG9uOiExLGNsb3NlQnV0dG9uSHRtbDoiJnRpbWVzOyIsY2xvc2VCdXR0b25BcmlhTGFiZWw6IkNsb3NlIHRoaXMgZGlhbG9nIixsb2FkZXJIdG1sOiIiLHNob3dMb2FkZXJPbkNvbmZpcm06ITEsc2hvd0xvYWRlck9uRGVueTohMSxpbWFnZVVybDp2b2lkIDAsaW1hZ2VXaWR0aDp2b2lkIDAsaW1hZ2VIZWlnaHQ6dm9pZCAwLGltYWdlQWx0OiIiLHRpbWVyOnZvaWQgMCx0aW1lclByb2dyZXNzQmFyOiExLHdpZHRoOnZvaWQgMCxwYWRkaW5nOnZvaWQgMCxiYWNrZ3JvdW5kOnZvaWQgMCxpbnB1dDp2b2lkIDAsaW5wdXRQbGFjZWhvbGRlcjoiIixpbnB1dExhYmVsOiIiLGlucHV0VmFsdWU6IiIsaW5wdXRPcHRpb25zOnt9LGlucHV0QXV0b0ZvY3VzOiEwLGlucHV0QXV0b1RyaW06ITAsaW5wdXRBdHRyaWJ1dGVzOnt9LGlucHV0VmFsaWRhdG9yOnZvaWQgMCxyZXR1cm5JbnB1dFZhbHVlT25EZW55OiExLHZhbGlkYXRpb25NZXNzYWdlOnZvaWQgMCxncm93OiExLHBvc2l0aW9uOiJjZW50ZXIiLHByb2dyZXNzU3RlcHM6W10sY3VycmVudFByb2dyZXNzU3RlcDp2b2lkIDAscHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlOnZvaWQgMCx3aWxsT3Blbjp2b2lkIDAsZGlkT3Blbjp2b2lkIDAsZGlkUmVuZGVyOnZvaWQgMCx3aWxsQ2xvc2U6dm9pZCAwLGRpZENsb3NlOnZvaWQgMCxkaWREZXN0cm95OnZvaWQgMCxzY3JvbGxiYXJQYWRkaW5nOiEwLHRvcExheWVyOiExfSxLdD1bImFsbG93RXNjYXBlS2V5IiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJiYWNrZ3JvdW5kIiwiYnV0dG9uc1N0eWxpbmciLCJjYW5jZWxCdXR0b25BcmlhTGFiZWwiLCJjYW5jZWxCdXR0b25Db2xvciIsImNhbmNlbEJ1dHRvblRleHQiLCJjbG9zZUJ1dHRvbkFyaWFMYWJlbCIsImNsb3NlQnV0dG9uSHRtbCIsImNvbG9yIiwiY29uZmlybUJ1dHRvbkFyaWFMYWJlbCIsImNvbmZpcm1CdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwiY3VycmVudFByb2dyZXNzU3RlcCIsImN1c3RvbUNsYXNzIiwiZGVueUJ1dHRvbkFyaWFMYWJlbCIsImRlbnlCdXR0b25Db2xvciIsImRlbnlCdXR0b25UZXh0IiwiZGlkQ2xvc2UiLCJkaWREZXN0cm95IiwiZHJhZ2dhYmxlIiwiZm9vdGVyIiwiaGlkZUNsYXNzIiwiaHRtbCIsImljb24iLCJpY29uQ29sb3IiLCJpY29uSHRtbCIsImltYWdlQWx0IiwiaW1hZ2VIZWlnaHQiLCJpbWFnZVVybCIsImltYWdlV2lkdGgiLCJwcmVDb25maXJtIiwicHJlRGVueSIsInByb2dyZXNzU3RlcHMiLCJyZXR1cm5Gb2N1cyIsInJldmVyc2VCdXR0b25zIiwic2hvd0NhbmNlbEJ1dHRvbiIsInNob3dDbG9zZUJ1dHRvbiIsInNob3dDb25maXJtQnV0dG9uIiwic2hvd0RlbnlCdXR0b24iLCJ0ZXh0IiwidGl0bGUiLCJ0aXRsZVRleHQiLCJ0aGVtZSIsIndpbGxDbG9zZSJdLFl0PXthbGxvd0VudGVyS2V5OnZvaWQgMH0sWHQ9WyJhbGxvd091dHNpZGVDbGljayIsImFsbG93RW50ZXJLZXkiLCJiYWNrZHJvcCIsImRyYWdnYWJsZSIsImZvY3VzQ29uZmlybSIsImZvY3VzRGVueSIsImZvY3VzQ2FuY2VsIiwicmV0dXJuRm9jdXMiLCJoZWlnaHRBdXRvIiwia2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSJdLFp0PWU9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChXdCxlKSxKdD1lPT4tMSE9PUt0LmluZGV4T2YoZSksR3Q9ZT0+WXRbZV0sUXQ9ZT0+e1p0KGUpfHx1KGBVbmtub3duIHBhcmFtZXRlciAiJHtlfSJgKX0sZW49ZT0+e1h0LmluY2x1ZGVzKGUpJiZ1KGBUaGUgcGFyYW1ldGVyICIke2V9IiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHNgKX0sdG49ZT0+e2NvbnN0IHQ9R3QoZSk7dCYmbShlLHQpfSxubj1lPT57ITE9PT1lLmJhY2tkcm9wJiZlLmFsbG93T3V0c2lkZUNsaWNrJiZ1KCciYWxsb3dPdXRzaWRlQ2xpY2siIHBhcmFtZXRlciByZXF1aXJlcyBgYmFja2Ryb3BgIHBhcmFtZXRlciB0byBiZSBzZXQgdG8gYHRydWVgJyksZS50aGVtZSYmIVsibGlnaHQiLCJkYXJrIiwiYXV0byIsIm1pbmltYWwiLCJib3JkZXJsZXNzIiwiYm9vdHN0cmFwLTQiLCJib290c3RyYXAtNC1saWdodCIsImJvb3RzdHJhcC00LWRhcmsiLCJib290c3RyYXAtNSIsImJvb3RzdHJhcC01LWxpZ2h0IiwiYm9vdHN0cmFwLTUtZGFyayIsIm1hdGVyaWFsLXVpIiwibWF0ZXJpYWwtdWktbGlnaHQiLCJtYXRlcmlhbC11aS1kYXJrIiwiZW1iZWQtaWZyYW1lIiwiYnVsbWEiLCJidWxtYS1saWdodCIsImJ1bG1hLWRhcmsiXS5pbmNsdWRlcyhlLnRoZW1lKSYmdShgSW52YWxpZCB0aGVtZSAiJHtlLnRoZW1lfSJgKTtmb3IoY29uc3QgdCBpbiBlKVF0KHQpLGUudG9hc3QmJmVuKHQpLHRuKHQpfTtmdW5jdGlvbiBvbihlKXtjb25zdCB0PXkoKSxuPUMoKSxvPWhlLmlubmVyUGFyYW1zLmdldCh0aGlzKTtpZighbnx8TihuLG8uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4gdm9pZCB1KCJZb3UncmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY2xvc2VkIG9yIGNsb3NpbmcgcG9wdXAsIHRoYXQgd29uJ3Qgd29yay4gVXNlIHRoZSB1cGRhdGUoKSBtZXRob2QgaW4gcHJlQ29uZmlybSBwYXJhbWV0ZXIgb3Igc2hvdyBhIG5ldyBwb3B1cC4iKTtjb25zdCBpPXNuKGUpLHM9T2JqZWN0LmFzc2lnbih7fSxvLGkpO25uKHMpLHQmJih0LmRhdGFzZXQuc3dhbDJUaGVtZT1zLnRoZW1lKSxGZSh0aGlzLHMpLGhlLmlubmVyUGFyYW1zLnNldCh0aGlzLHMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLnBhcmFtcyxlKSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwfX0pfWNvbnN0IHNuPWU9Pntjb25zdCB0PXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKG49PntpZihKdChuKSl7Y29uc3Qgbz1lO3Rbbl09b1tuXX1lbHNlIHUoYEludmFsaWQgcGFyYW1ldGVyIHRvIHVwZGF0ZTogJHtufWApfSksdH07ZnVuY3Rpb24gcm4oKXt2YXIgZTtjb25zdCB0PWhlLmRvbUNhY2hlLmdldCh0aGlzKSxuPWhlLmlubmVyUGFyYW1zLmdldCh0aGlzKTtuPyh0LnBvcHVwJiZvLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayYmKG8uc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIG8uc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKSwiZnVuY3Rpb24iPT10eXBlb2Ygbi5kaWREZXN0cm95JiZuLmRpZERlc3Ryb3koKSxudWxsPT09KGU9by5ldmVudEVtaXR0ZXIpfHx2b2lkIDA9PT1lfHxlLmVtaXQoImRpZERlc3Ryb3kiKSxhbih0aGlzKSk6bG4odGhpcyl9Y29uc3QgYW49ZT0+e2xuKGUpLGRlbGV0ZSBlLnBhcmFtcyxkZWxldGUgby5rZXlkb3duSGFuZGxlcixkZWxldGUgby5rZXlkb3duVGFyZ2V0LGRlbGV0ZSBvLmN1cnJlbnRJbnN0YW5jZX0sbG49ZT0+e2UuaXNBd2FpdGluZ1Byb21pc2U/KGNuKGhlLGUpLGUuaXNBd2FpdGluZ1Byb21pc2U9ITApOihjbih0dCxlKSxjbihoZSxlKSxkZWxldGUgZS5pc0F3YWl0aW5nUHJvbWlzZSxkZWxldGUgZS5kaXNhYmxlQnV0dG9ucyxkZWxldGUgZS5lbmFibGVCdXR0b25zLGRlbGV0ZSBlLmdldElucHV0LGRlbGV0ZSBlLmRpc2FibGVJbnB1dCxkZWxldGUgZS5lbmFibGVJbnB1dCxkZWxldGUgZS5oaWRlTG9hZGluZyxkZWxldGUgZS5kaXNhYmxlTG9hZGluZyxkZWxldGUgZS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UsZGVsZXRlIGUucmVzZXRWYWxpZGF0aW9uTWVzc2FnZSxkZWxldGUgZS5jbG9zZSxkZWxldGUgZS5jbG9zZVBvcHVwLGRlbGV0ZSBlLmNsb3NlTW9kYWwsZGVsZXRlIGUuY2xvc2VUb2FzdCxkZWxldGUgZS5yZWplY3RQcm9taXNlLGRlbGV0ZSBlLnVwZGF0ZSxkZWxldGUgZS5fZGVzdHJveSl9LGNuPShlLHQpPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmRlbGV0ZSh0KX07dmFyIHVuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLF9kZXN0cm95OnJuLGNsb3NlOnB0LGNsb3NlTW9kYWw6cHQsY2xvc2VQb3B1cDpwdCxjbG9zZVRvYXN0OnB0LGRpc2FibGVCdXR0b25zOl90LGRpc2FibGVJbnB1dDpGdCxkaXNhYmxlTG9hZGluZzpqdCxlbmFibGVCdXR0b25zOk50LGVuYWJsZUlucHV0OlJ0LGdldElucHV0OkR0LGhhbmRsZUF3YWl0aW5nUHJvbWlzZTpndCxoaWRlTG9hZGluZzpqdCxyZWplY3RQcm9taXNlOmh0LHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U6enQsc2hvd1ZhbGlkYXRpb25NZXNzYWdlOlV0LHVwZGF0ZTpvbn0pO2NvbnN0IGRuPShlLHQsbik9Pnt0LnBvcHVwLm9uY2xpY2s9KCk9PntlJiYocG4oZSl8fGUudGltZXJ8fGUuaW5wdXQpfHxuKHplLmNsb3NlKX19LHBuPWU9PkJvb2xlYW4oZS5zaG93Q29uZmlybUJ1dHRvbnx8ZS5zaG93RGVueUJ1dHRvbnx8ZS5zaG93Q2FuY2VsQnV0dG9ufHxlLnNob3dDbG9zZUJ1dHRvbik7bGV0IG1uPSExO2NvbnN0IGhuPWU9PntlLnBvcHVwLm9ubW91c2Vkb3duPSgpPT57ZS5jb250YWluZXIub25tb3VzZXVwPWZ1bmN0aW9uKHQpe2UuY29udGFpbmVyLm9ubW91c2V1cD0oKT0+e30sdC50YXJnZXQ9PT1lLmNvbnRhaW5lciYmKG1uPSEwKX19fSxnbj1lPT57ZS5jb250YWluZXIub25tb3VzZWRvd249dD0+e3QudGFyZ2V0PT09ZS5jb250YWluZXImJnQucHJldmVudERlZmF1bHQoKSxlLnBvcHVwLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLnBvcHVwLm9ubW91c2V1cD0oKT0+e30sKHQudGFyZ2V0PT09ZS5wb3B1cHx8dC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS5wb3B1cC5jb250YWlucyh0LnRhcmdldCkpJiYobW49ITApfX19LGZuPShlLHQsbik9Pnt0LmNvbnRhaW5lci5vbmNsaWNrPW89Pnttbj9tbj0hMTpvLnRhcmdldD09PXQuY29udGFpbmVyJiZoKGUuYWxsb3dPdXRzaWRlQ2xpY2spJiZuKHplLmJhY2tkcm9wKX19LGJuPWU9PmUgaW5zdGFuY2VvZiBFbGVtZW50fHwoZT0+Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSYmImpxdWVyeSJpbiBlKShlKTtjb25zdCB5bj0oKT0+e2lmKG8udGltZW91dClyZXR1cm4oKCk9Pntjb25zdCBlPUgoKTtpZighZSlyZXR1cm47Y29uc3QgdD1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCk7ZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpLGUuc3R5bGUud2lkdGg9IjEwMCUiO2NvbnN0IG49dC9wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCkqMTAwO2Uuc3R5bGUud2lkdGg9YCR7bn0lYH0pKCksby50aW1lb3V0LnN0b3AoKX0sdm49KCk9PntpZihvLnRpbWVvdXQpe2NvbnN0IGU9by50aW1lb3V0LnN0YXJ0KCk7cmV0dXJuIG9lKGUpLGV9fTtsZXQgd249ITE7Y29uc3QgQ249e307Y29uc3QgQW49ZT0+e2ZvcihsZXQgdD1lLnRhcmdldDt0JiZ0IT09ZG9jdW1lbnQ7dD10LnBhcmVudE5vZGUpZm9yKGNvbnN0IGUgaW4gQ24pe2NvbnN0IG49dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKGUpO2lmKG4pcmV0dXJuIHZvaWQgQ25bZV0uZmlyZSh7dGVtcGxhdGU6bn0pfX07by5ldmVudEVtaXR0ZXI9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5ldmVudHM9e319X2dldEhhbmRsZXJzQnlFdmVudE5hbWUoZSl7cmV0dXJuIHZvaWQgMD09PXRoaXMuZXZlbnRzW2VdJiYodGhpcy5ldmVudHNbZV09W10pLHRoaXMuZXZlbnRzW2VdfW9uKGUsdCl7Y29uc3Qgbj10aGlzLl9nZXRIYW5kbGVyc0þ¨œùJ5RXZlbnROYW1lKGUpO24uaW5jbHVkZXModCl8fG4ucHVzaCh0KX1vbmNlKGUsdCl7Y29uc3Qgbj0oLi4ubyk9Pnt0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbiksdC5hcHBseSh0aGlzLG8pfTt0aGlzLm9uKGUsbil9ZW1pdChlLC4uLnQpe3RoaXMuX2dldEhhbmRsZXJzQnlFdmVudE5hbWUoZSkuZm9yRWFjaChlPT57dHJ5e2UuYXBwbHkodGhpcyx0KX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX0pfXJlbW92ZUxpc3RlbmVyKGUsdCl7Y29uc3Qgbj10aGlzLl9nZXRIYW5kbGVyc0J5RXZlbnROYW1lKGUpLG89bi5pbmRleE9mKHQpO28+LTEmJm4uc3BsaWNlKG8sMSl9cmVtb3ZlQWxsTGlzdGVuZXJzKGUpe3ZvaWQgMCE9PXRoaXMuZXZlbnRzW2VdJiYodGhpcy5ldmVudHNbZV0ubGVuZ3RoPTApfXJlc2V0KCl7dGhpcy5ldmVudHM9e319fTt2YXIgRW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYXJnc1RvUGFyYW1zOmU9Pntjb25zdCB0PXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgZVswXXx8Ym4oZVswXSk/WyJ0aXRsZSIsImh0bWwiLCJpY29uIl0uZm9yRWFjaCgobixvKT0+e2NvbnN0IGk9ZVtvXTsic3RyaW5nIj09dHlwZW9mIGl8fGJuKGkpP3Rbbl09aTp2b2lkIDAhPT1pJiZkKGBVbmV4cGVjdGVkIHR5cGUgb2YgJHtufSEgRXhwZWN0ZWQgInN0cmluZyIgb3IgIkVsZW1lbnQiLCBnb3QgJHt0eXBlb2YgaX1gKX0pOk9iamVjdC5hc3NpZ24odCxlWzBdKSx0fSxiaW5kQ2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGU9ImRhdGEtc3dhbC10ZW1wbGF0ZSIpe0NuW2VdPXRoaXMsd258fChkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBbiksd249ITApfSxjbGlja0NhbmNlbDooKT0+e3ZhciBlO3JldHVybiBudWxsPT09KGU9eCgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jbGljaygpfSxjbGlja0NvbmZpcm06VWUsY2xpY2tEZW55OigpPT57dmFyIGU7cmV0dXJuIG51bGw9PT0oZT1UKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsaWNrKCl9LGVuYWJsZUxvYWRpbmc6d3QsZmlyZTpmdW5jdGlvbiguLi5lKXtyZXR1cm4gbmV3IHRoaXMoLi4uZSl9LGdldEFjdGlvbnM6TyxnZXRDYW5jZWxCdXR0b246eCxnZXRDbG9zZUJ1dHRvbjpqLGdldENvbmZpcm1CdXR0b246UCxnZXRDb250YWluZXI6eSxnZXREZW55QnV0dG9uOlQsZ2V0Rm9jdXNhYmxlRWxlbWVudHM6SSxnZXRGb290ZXI6TSxnZXRIdG1sQ29udGFpbmVyOmssZ2V0SWNvbjpBLGdldEljb25Db250ZW50OigpPT53KHJbImljb24tY29udGVudCJdKSxnZXRJbWFnZTpCLGdldElucHV0TGFiZWw6KCk9PncoclsiaW5wdXQtbGFiZWwiXSksZ2V0TG9hZGVyOlMsZ2V0UG9wdXA6QyxnZXRQcm9ncmVzc1N0ZXBzOiQsZ2V0VGltZXJMZWZ0OigpPT5vLnRpbWVvdXQmJm8udGltZW91dC5nZXRUaW1lckxlZnQoKSxnZXRUaW1lclByb2dyZXNzQmFyOkgsZ2V0VGl0bGU6RSxnZXRWYWxpZGF0aW9uTWVzc2FnZTpMLGluY3JlYXNlVGltZXI6ZT0+e2lmKG8udGltZW91dCl7Y29uc3QgdD1vLnRpbWVvdXQuaW5jcmVhc2UoZSk7cmV0dXJuIG9lKHQsITApLHR9fSxpc0RlcHJlY2F0ZWRQYXJhbWV0ZXI6R3QsaXNMb2FkaW5nOigpPT57Y29uc3QgZT1DKCk7cmV0dXJuISFlJiZlLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIil9LGlzVGltZXJSdW5uaW5nOigpPT5Cb29sZWFuKG8udGltZW91dCYmby50aW1lb3V0LmlzUnVubmluZygpKSxpc1VwZGF0YWJsZVBhcmFtZXRlcjpKdCxpc1ZhbGlkUGFyYW1ldGVyOlp0LGlzVmlzaWJsZTooKT0+ZWUoQygpKSxtaXhpbjpmdW5jdGlvbihlKXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyh0aGlzKXtfbWFpbih0LG4pe3JldHVybiBzdXBlci5fbWFpbih0LE9iamVjdC5hc3NpZ24oe30sZSxuKSl9fX0sb2ZmOihlLHQpPT57by5ldmVudEVtaXR0ZXImJihlP3Q/by5ldmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZSx0KTpvLmV2ZW50RW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSk6by5ldmVudEVtaXR0ZXIucmVzZXQoKSl9LG9uOihlLHQpPT57by5ldmVudEVtaXR0ZXImJm8uZXZlbnRFbWl0dGVyLm9uKGUsdCl9LG9uY2U6KGUsdCk9PntvLmV2ZW50RW1pdHRlciYmby5ldmVudEVtaXR0ZXIub25jZShlLHQpfSxyZXN1bWVUaW1lcjp2bixzaG93TG9hZGluZzp3dCxzdG9wVGltZXI6eW4sdG9nZ2xlVGltZXI6KCk9Pntjb25zdCBlPW8udGltZW91dDtyZXR1cm4gZSYmKGUucnVubmluZz95bigpOnZuKCkpfX0pO2NsYXNzIGtue2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5jYWxsYmFjaz1lLHRoaXMucmVtYWluaW5nPXQsdGhpcy5ydW5uaW5nPSExLHRoaXMuc3RhcnQoKX1zdGFydCgpe3JldHVybiB0aGlzLnJ1bm5pbmd8fCh0aGlzLnJ1bm5pbmc9ITAsdGhpcy5zdGFydGVkPW5ldyBEYXRlLHRoaXMuaWQ9c2V0VGltZW91dCh0aGlzLmNhbGxiYWNrLHRoaXMucmVtYWluaW5nKSksdGhpcy5yZW1haW5pbmd9c3RvcCgpe3JldHVybiB0aGlzLnN0YXJ0ZWQmJnRoaXMucnVubmluZyYmKHRoaXMucnVubmluZz0hMSxjbGVhclRpbWVvdXQodGhpcy5pZCksdGhpcy5yZW1haW5pbmctPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuc3RhcnRlZC5nZXRUaW1lKCkpLHRoaXMucmVtYWluaW5nfWluY3JlYXNlKGUpe2NvbnN0IHQ9dGhpcy5ydW5uaW5nO3JldHVybiB0JiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9ZSx0JiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9Z2V0VGltZXJMZWZ0KCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMuc3RvcCgpLHRoaXMuc3RhcnQoKSksdGhpcy5yZW1haW5pbmd9aXNSdW5uaW5nKCl7cmV0dXJuIHRoaXMucnVubmluZ319Y29uc3QgQm49WyJzd2FsLXRpdGxlIiwic3dhbC1odG1sIiwic3dhbC1mb290ZXIiXSwkbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gQXJyYXkuZnJvbShlLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtcGFyYW0iKSkuZm9yRWFjaChlPT57SG4oZSxbIm5hbWUiLCJ2YWx1ZSJdKTtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKCJuYW1lIiksbz1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKTtuJiZvJiYodFtuXT1uIGluIFd0JiYiYm9vbGVhbiI9PXR5cGVvZiBXdFtuXT8iZmFsc2UiIT09bzpuIGluIFd0JiYib2JqZWN0Ij09dHlwZW9mIFd0W25dP0pTT04ucGFyc2Uobyk6byl9KSx0fSxMbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gQXJyYXkuZnJvbShlLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtZnVuY3Rpb24tcGFyYW0iKSkuZm9yRWFjaChlPT57Y29uc3Qgbj1lLmdldEF0dHJpYnV0ZSgibmFtZSIpLG89ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7biYmbyYmKHRbbl09bmV3IEZ1bmN0aW9uKGByZXR1cm4gJHtvfWApKCkpfSksdH0sUG49ZT0+e2NvbnN0IHQ9e307cmV0dXJuIEFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKCJzd2FsLWJ1dHRvbiIpKS5mb3JFYWNoKGU9PntIbihlLFsidHlwZSIsImNvbG9yIiwiYXJpYS1sYWJlbCJdKTtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKCJ0eXBlIik7aWYobiYmWyJjb25maXJtIiwiY2FuY2VsIiwiZGVueSJdLmluY2x1ZGVzKG4pKXtpZih0W2Ake259QnV0dG9uVGV4dGBdPWUuaW5uZXJIVE1MLHRbYHNob3cke2Mobil9QnV0dG9uYF09ITAsZS5oYXNBdHRyaWJ1dGUoImNvbG9yIikpe2NvbnN0IG89ZS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7bnVsbCE9PW8mJih0W2Ake259QnV0dG9uQ29sb3JgXT1vKX1pZihlLmhhc0F0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpKXtjb25zdCBvPWUuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7bnVsbCE9PW8mJih0W2Ake259QnV0dG9uQXJpYUxhYmVsYF09byl9fX0pLHR9LHhuPWU9Pntjb25zdCB0PXt9LG49ZS5xdWVyeVNlbGVjdG9yKCJzd2FsLWltYWdlIik7cmV0dXJuIG4mJihIbihuLFsic3JjIiwid2lkdGgiLCJoZWlnaHQiLCJhbHQiXSksbi5oYXNBdHRyaWJ1dGUoInNyYyIpJiYodC5pbWFnZVVybD1uLmdldEF0dHJpYnV0ZSgic3JjIil8fHZvaWQgMCksbi5oYXNBdHRyaWJ1dGUoIndpZHRoIikmJih0LmltYWdlV2lkdGg9bi5nZXRBdHRyaWJ1dGUoIndpZHRoIil8fHZvaWQgMCksbi5oYXNBdHRyaWJ1dGUoImhlaWdodCIpJiYodC5pbWFnZUhlaWdodD1uLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iil8fHZvaWQgMCksbi5oYXNBdHRyaWJ1dGUoImFsdCIpJiYodC5pbWFnZUFsdD1uLmdldEF0dHJpYnV0ZSgiYWx0Iil8fHZvaWQgMCkpLHR9LFRuPWU9Pntjb25zdCB0PXt9LG49ZS5xdWVyeVNlbGVjdG9yKCJzd2FsLWljb24iKTtyZXR1cm4gbiYmKEhuKG4sWyJ0eXBlIiwiY29sb3IiXSksbi5oYXNBdHRyaWJ1dGUoInR5cGUiKSYmKHQuaWNvbj1uLmdldEF0dHJpYnV0ZSgidHlwZSIpKSxuLmhhc0F0dHJpYnV0ZSgiY29sb3IiKSYmKHQuaWNvbkNvbG9yPW4uZ2V0QXR0cmlidXRlKCJjb2xvciIpKSx0Lmljb25IdG1sPW4uaW5uZXJIVE1MKSx0fSxTbj1lPT57Y29uc3QgdD17fSxuPWUucXVlcnlTZWxlY3Rvcigic3dhbC1pbnB1dCIpO24mJihIbihuLFsidHlwZSIsImxhYmVsIiwicGxhY2Vob2xkZXIiLCJ2YWx1ZSJdKSx0LmlucHV0PW4uZ2V0QXR0cmlidXRlKCJ0eXBlIil8fCJ0ZXh0IixuLmhhc0F0dHJpYnV0ZSgibGFiZWwiKSYmKHQuaW5wdXRMYWJlbD1uLmdldEF0dHJpYnV0ZSgibGFiZWwiKSksbi5oYXNBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIikmJih0LmlucHV0UGxhY2Vob2xkZXI9bi5nZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIikpLG4uaGFzQXR0cmlidXRlKCJ2YWx1ZSIpJiYodC5pbnB1dFZhbHVlPW4uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKSk7Y29uc3Qgbz1BcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbCgic3dhbC1pbnB1dC1vcHRpb24iKSk7cmV0dXJuIG8ubGVuZ3RoJiYodC5pbnB1dE9wdGlvbnM9e30sby5mb3JFYWNoKGU9PntIbihlLFsidmFsdWUiXSk7Y29uc3Qgbj1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKTtpZighbilyZXR1cm47Y29uc3Qgbz1lLmlubmVySFRNTDt0LmlucHV0T3B0aW9uc1tuXT1vfSkpLHR9LE9uPShlLHQpPT57Y29uc3Qgbj17fTtmb3IoY29uc3QgbyBpbiB0KXtjb25zdCBpPXRbb10scz1lLnF1ZXJ5U2VsZWN0b3IoaSk7cyYmKEhuKHMsW10pLG5baS5yZXBsYWNlKC9ec3dhbC0vLCIiKV09cy5pbm5lckhUTUwudHJpbSgpKX1yZXR1cm4gbn0sTW49ZT0+e2NvbnN0IHQ9Qm4uY29uY2F0KFsic3dhbC1wYXJhbSIsInN3YWwtZnVuY3Rpb24tcGFyYW0iLCJzd2FsLWJ1dHRvbiIsInN3YWwtaW1hZ2UiLCJzd2FsLWljb24iLCJzd2FsLWlucHV0Iiwic3dhbC1pbnB1dC1vcHRpb24iXSk7QXJyYXkuZnJvbShlLmNoaWxkcmVuKS5mb3JFYWNoKGU9Pntjb25zdCBuPWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO3QuaW5jbHVkZXMobil8fHUoYFVucmVjb2duaXplZCBlbGVtZW50IDwke259PmApfSl9LEhuPShlLHQpPT57QXJyYXkuZnJvbShlLmF0dHJpYnV0ZXMpLmZvckVhY2gobj0+ey0xPT09dC5pbmRleE9mKG4ubmFtZSkmJnUoW2BVbnJlY29nbml6ZWQgYXR0cmlidXRlICIke24ubmFtZX0iIG9uIDwke2UudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4uYCwiIisodC5sZW5ndGg/YEFsbG93ZWQgYXR0cmlidXRlcyBhcmU6ICR7dC5qb2luKCIsICIpfWA6IlRvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4iKV0pfSl9LGpuPWU9Pnt2YXIgdCxuO2NvbnN0IGk9eSgpLHM9QygpO2lmKCFpfHwhcylyZXR1cm47ImZ1bmN0aW9uIj09dHlwZW9mIGUud2lsbE9wZW4mJmUud2lsbE9wZW4ocyksbnVsbD09PSh0PW8uZXZlbnRFbWl0dGVyKXx8dm9pZCAwPT09dHx8dC5lbWl0KCJ3aWxsT3BlbiIscyk7Y29uc3Qgcj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5vdmVyZmxvd1k7aWYocW4oaSxzLGUpLHNldFRpbWVvdXQoKCk9PntEbihpLHMpfSwxMCksRCgpJiYoVm4oaSx2b2lkIDAhPT1lLnNjcm9sbGJhclBhZGRpbmcmJmUuc2Nyb2xsYmFyUGFkZGluZyxyKSwoKCk9Pntjb25zdCBlPXkoKTtBcnJheS5mcm9tKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2godD0+e3QuY29udGFpbnMoZSl8fCh0Lmhhc0F0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSYmdC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4iLHQuZ2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfHwiIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpKX0pfSkoKSksaXQmJiExPT09ZS5iYWNrZHJvcCYmcy5zY3JvbGxIZWlnaHQ+aS5jbGllbnRIZWlnaHQmJihpLnN0eWxlLnBvaW50ZXJFdmVudHM9ImF1dG8iKSxWKCl8fG8ucHJldmlvdXNBY3RpdmVFbGVtZW50fHwoby5wcmV2aW91c0FjdGl2ZUVsZW1lbnQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksImZ1bmN0aW9uIj09dHlwZW9mIGUuZGlkT3Blbil7Y29uc3QgdD1lLmRpZE9wZW47c2V0VGltZW91dCgoKT0+dChzKSl9bnVsbD09PShuPW8uZXZlbnRFbWl0dGVyKXx8dm9pZCAwPT09bnx8bi5lbWl0KCJkaWRPcGVuIixzKX0sSW49ZT0+e2NvbnN0IHQ9QygpO2lmKCF0fHxlLnRhcmdldCE9PXQpcmV0dXJuO2NvbnN0IG49eSgpO24mJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsSW4pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsSW4pLG4uc3R5bGUub3ZlcmZsb3dZPSJhdXRvIixXKG4sclsibm8tdHJhbnNpdGlvbiJdKSl9LERuPShlLHQpPT57bmUodCk/KGUuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iLHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIixJbiksdC5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixJbikpOmUuc3R5bGUub3ZlcmZsb3dZPSJhdXRvIn0sVm49KGUsdCxuKT0+eygoKT0+e2lmKG90JiYhTihkb2N1bWVudC5ib2R5LHIuaW9zZml4KSl7Y29uc3QgZT1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0tMSplKyJweCIseihkb2N1bWVudC5ib2R5LHIuaW9zZml4KSxzdCgpfX0pKCksdCYmImhpZGRlbiIhPT1uJiZ1dChuKSxzZXRUaW1lb3V0KCgpPT57ZS5zY3JvbGxUb3A9MH0pfSxxbj0oZSx0LG4pPT57dmFyIG87bnVsbCE9PShvPW4uc2hvd0NsYXNzKSYmdm9pZCAwIT09byYmby5iYWNrZHJvcCYmeihlLG4uc2hvd0NsYXNzLmJhY2tkcm9wKSxuLmFuaW1hdGlvbj8odC5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsIjAiLCJpbXBvcnRhbnQiKSxYKHQsImdyaWQiKSxzZXRUaW1lb3V0KCgpPT57dmFyIGU7bnVsbCE9PShlPW4uc2hvd0NsYXNzKSYmdm9pZCAwIT09ZSYmZS5wb3B1cCYmeih0LG4uc2hvd0NsYXNzLnBvcHVwKSx0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvcGFjaXR5Iil9LDEwKSk6WCh0LCJncmlkIikseihbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHIuc2hvd24pLG4uaGVpZ2h0QXV0byYmbi5iYWNrZHJvcCYmIW4udG9hc3QmJnooW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxyWyJoZWlnaHQtYXV0byJdKX07dmFyIE5uPShlLHQpPT4vXlthLXpBLVowLTkuK18nLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aMC05LV0rJC8udGVzdChlKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUodHx8IkludmFsaWQgZW1haWwgYWRkcmVzcyIpLF9uPShlLHQpPT4vXmh0dHBzPzpcL1wvKHd3d1wuKT9bLWEtekEtWjAtOUA6JS5fK34jPV17MSwyNTZ9XC5bYS16XXsyLDYzfVxiKFstYS16QS1aMC05QDolXysufiM/Ji89XSopJC8udGVzdChlKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUodHx8IkludmFsaWQgVVJMIik7ZnVuY3Rpb24gUm4oZSl7IWZ1bmN0aW9uKGUpe2UuaW5wdXRWYWxpZGF0b3J8fCgiZW1haWwiPT09ZS5pbnB1dCYmKGUuaW5wdXRWYWxpZGF0b3I9Tm4pLCJ1cmwiPT09ZS5pbnB1dCYmKGUuaW5wdXRWYWxpZGF0b3I9X24pKX0oZSksZS5zaG93TG9hZGVyT25Db25maXJtJiYhZS5wcmVDb25maXJtJiZ1KCJzaG93TG9hZGVyT25Db25maXJtIGlzIHNldCB0byB0cnVlLCBidXQgcHJlQ29uZmlybSBpcyBub3QgZGVmaW5lZC5cbnNob3dMb2FkZXJPbkNvbmZpcm0gc2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBwcmVDb25maXJtLCBzZWUgdXNhZ2UgZXhhbXBsZTpcbmh0dHBzOi8vc3dlZXRhbGVydDIuZ2l0aHViLmlvLyNhamF4LXJlcXVlc3QiKSxmdW5jdGlvbihlKXsoIWUudGFyZ2V0fHwic3RyaW5nIj09dHlwZW9mIGUudGFyZ2V0JiYhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnRhcmdldCl8fCJzdHJpbmciIT10eXBlb2YgZS50YXJnZXQmJiFlLnRhcmdldC5hcHBlbmRDaGlsZCkmJih1KCdUYXJnZXQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiYm9keSInKSxlLnRhcmdldD0iYm9keSIpfShlKSwic3RyaW5nIj09dHlwZW9mIGUudGl0bGUmJihlLnRpdGxlPWUudGl0bGUuc3BsaXQoIlxuIikuam9pbigiPGJyIC8+IikpLHJlKGUpfWxldCBGbjt2YXIgVW49bmV3IFdlYWtNYXA7Y2xhc3Mgem57Y29uc3RydWN0b3IoLi4udCl7aWYobih0aGlzLFVuLFByb21pc2UucmVzb2x2ZSh7aXNDb25maXJtZWQ6ITEsaXNEZW5pZWQ6ITEsaXNEaXNtaXNzZWQ6ITB9KSksInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuO0ZuPXRoaXM7Y29uc3Qgbz1PYmplY3QuZnJlZXplKHRoaXMuY29uc3RydWN0b3IuYXJnc1RvUGFyYW1zKHQpKTt2YXIgaSxzLHI7dGhpcy5wYXJhbXM9byx0aGlzLmlzQXdhaXRpbmdQcm9taXNlPSExLGk9VW4scz10aGlzLHI9dGhpcy5fbWFpbihGbi5wYXJhbXMpLGkuc2V0KGUoaSxzKSxyKX1fbWFpbihlLHQ9e30pe2lmKG5uKE9iamVjdC5hc3NpZ24oe30sdCxlKSksby5jdXJyZW50SW5zdGFuY2Upe2NvbnN0IGU9dHQuc3dhbFByb21pc2VSZXNvbHZlLmdldChvLmN1cnJlbnRJbnN0YW5jZSkse2lzQXdhaXRpbmdQcm9taXNlOnR9PW8uY3VycmVudEluc3RhbmNlO28uY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCksdHx8ZSh7aXNEaXNtaXNzZWQ6ITB9KSxEKCkmJm50KCl9by5jdXJyZW50SW5zdGFuY2U9Rm47Y29uc3Qgbj1LbihlLHQpO1JuKG4pLE9iamVjdC5mcmVlemUobiksby50aW1lb3V0JiYoby50aW1lb3V0LnN0b3AoKSxkZWxldGUgby50aW1lb3V0KSxjbGVhclRpbWVvdXQoby5yZXN0b3JlRm9jdXNUaW1lb3V0KTtjb25zdCBpPVluKEZuKTtyZXR1cm4gRmUoRm4sbiksaGUuaW5uZXJQYXJhbXMuc2V0KEZuLG4pLFduKEZuLGksbil9dGhlbihlKXtyZXR1cm4gdChVbix0aGlzKS50aGVuKGUpfWZpbmFsbHkoZSl7cmV0dXJuIHQoVW4sdGhpcykuZmluYWxseShlKX19Y29uc3QgV249KGUsdCxuKT0+bmV3IFByb21pc2UoKGkscyk9Pntjb25zdCByPXQ9PntlLmNsb3NlKHtpc0Rpc21pc3NlZDohMCxkaXNtaXNzOnQsaXNDb25maXJtZWQ6ITEsaXNEZW5pZWQ6ITF9KX07dHQuc3dhbFByb21pc2VSZXNvbHZlLnNldChlLGkpLHR0LnN3YWxQcm9taXNlUmVqZWN0LnNldChlLHMpLHQuY29uZmlybUJ1dHRvbi5vbmNsaWNrPSgpPT57KGU9Pntjb25zdCB0PWhlLmlubmVyUGFyYW1zLmdldChlKTtlLmRpc2FibGVCdXR0b25zKCksdC5pbnB1dD94dChlLCJjb25maXJtIik6SHQoZSwhMCl9KShlKX0sdC5kZW55QnV0dG9uLm9uY2xpY2s9KCk9PnsoZT0+e2NvbnN0IHQ9aGUuaW5uZXJQYXJhbXMuZ2V0KGUpO2UuZGlzYWJsZUJ1dHRvbnMoKSx0LnJldHVybklucHV0VmFsdWVPbkRlbnk/eHQoZSwiZGVueSIpOlN0KGUsITEpfSkoZSl9LHQuY2FuY2VsQnV0dG9uLm9uY2xpY2s9KCk9PnsoKGUsdCk9PntlLmRpc2FibGVCdXR0b25zKCksdCh6ZS5jYW5jZWwpfSkoZSxyKX0sdC5jbG9zZUJ1dHRvbi5vbmNsaWNrPSgpPT57cih6ZS5jbG9zZSl9LCgoZSx0LG4pPT57ZS50b2FzdD9kbihlLHQsbik6KGhuKHQpLGduKHQpLGZuKGUsdCxuKSl9KShuLHQsciksKChlLHQsbik9PntpZihXZShlKSwhdC50b2FzdCl7Y29uc3Qgbz1lPT5aZSh0LGUsbik7ZS5rZXlkb3duSGFuZGxlcj1vO2NvbnN0IGk9dC5rZXlkb3duTGlzdGVuZXJDYXB0dXJlP3dpbmRvdzpDKCk7aWYoaSl7ZS5rZXlkb3duVGFyZ2V0PWksZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlPXQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZTtjb25zdCBuPW87ZS5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLG4se2NhcHR1cmU6ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksZS5rZXlkb3duSGFuZGxlckFkZGVkPSEwfX19KShvLG4sciksKChlLHQpPT57InNlbGVjdCI9PT10LmlucHV0fHwicmFkaW8iPT09dC5pbnB1dD9CdChlLHQpOlsidGV4dCIsImVtYWlsIiwibnVtYmVyIiwidGVsIiwidGV4dGFyZWEiXS5zb21lKGU9PmU9PT10LmlucHV0KSYmKGcodC5pbnB1dFZhbHVlKXx8Yih0LmlucHV0VmFsdWUpKSYmKHd0KFAoKSksJHQoZSx0KSl9KShlLG4pLGpuKG4pLFhuKG8sbixyKSxabih0LG4pLHNldFRpbWVvdXQoKCk9Pnt0LmNvbnRhaW5lci5zY3JvbGxUb3A9MH0pfSksS249KGUsdCk9Pntjb25zdCBuPShlPT57Y29uc3QgdD0ic3RyaW5nIj09dHlwZW9mIGUudGVtcGxhdGU/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnRlbXBsYXRlKTplLnRlbXBsYXRlO2lmKCF0KXJldHVybnt9O2NvbnN0IG49dC5jb250ZW50O3JldHVybiBNbihuKSxPYmplY3QuYXNzaWduKCRuKG4pLExuKG4pLFBuKG4pLHhuKG4pLFRuKG4pLFNuKG4pLE9uKG4sQm4pKX0pKGUpLG89T2JqZWN0LmFzc2lnbih7fSxXdCx0LG4sZSk7cmV0dXJuIG8uc2hvd0NsYXNzPU9iamVjdC5hc3NpZ24oe30sV3Quc2hvd0NsYXNzLG8uc2hvd0NsYXNzKSxvLmhpZGVDbGFzcz1PYmplY3QuYXNzaWduKHt9LFd0LmhpZGVDbGFzcyxvLmhpZGVDbGFzcyksITE9PT1vLmFuaW1hdGlvbiYmKG8uc2hvd0NsYXNzPXtiYWNrZHJvcDoic3dhbDItbm9hbmltYXRpb24ifSxvLmhpZGVDbGFzcz17fSksb30sWW49ZT0+e2NvbnN0IHQ9e3BvcHVwOkMoKSxjb250YWluZXI6eSgpLGFjdGlvbnM6TygpLGNvbmZpcm1CdXR0b246UCgpLGRlbnlCdXR0b246VCgpLGNhbmNlbEJ1dHRvbjp4KCksbG9hZGVyOlMoKSxjbG9zZUJ1dHRvbjpqKCksdmFsaWRhdGlvbk1lc3NhZ2U6TCgpLHByb2dyZXNzU3RlcHM6JCgpfTtyZXR1cm4gaGUuZG9tQ2FjaGUuc2V0KGUsdCksdH0sWG49KGUsdCxuKT0+e2NvbnN0IG89SCgpO1oobyksdC50aW1lciYmKGUudGltZW91dD1uZXcga24oKCk9PntuKCJ0aW1lciIpLGRlbGV0ZSBlLnRpbWVvdXR9LHQudGltZXIpLHQudGltZXJQcm9ncmVzc0JhciYmbyYmKFgobyksXyhvLHQsInRpbWVyUHJvZ3Jlc3NCYXIiKSxzZXRUaW1lb3V0KCgpPT57ZS50aW1lb3V0JiZlLnRpbWVvdXQucnVubmluZyYmb2UodC50aW1lcil9KSkpfSxabj0oZSx0KT0+e2lmKCF0LnRvYXN0KXJldHVybiBoKHQuYWxsb3dFbnRlcktleSk/dm9pZChKbihlKXx8R24oZSx0KXx8S2UoLTEsMSkpOihtKCJhbGxvd0VudGVyS2V5IiwicHJlQ29uZmlybTogKCkgPT4gZmFsc2UiKSx2b2lkIGUucG9wdXAuZm9jdXMoKSl9LEpuPWU9Pntjb25zdCB0PUFycmF5LmZyb20oZS5wb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCJbYXV0b2ZvY3VzXSIpKTtmb3IoY29uc3QgZSBvZiB0KWlmKGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZWUoZSkpcmV0dXJuIGUuZm9jdXMoKSwhMDtyZXR1cm4hMX0sR249KGUsdCk9PnQuZm9jdXNEZW55JiZlZShlLmRlbnlCdXR0b24pPyhlLmRlbnlCdXR0b24uZm9jdXMoKSwhMCk6dC5mb2N1c0NhbmNlbCYmZWUoZS5jYW5jZWxCdXR0b24pPyhlLmNhbmNlbEJ1dHRvbi5mb2N1cygpLCEwKTohKCF0LmZvY3VzQ29uZmlybXx8IWVlKGUuY29uZmlybUJ1dHRvbikpJiYoZS5jb25maXJtQnV0dG9uLmZvY3VzKCksITApO3puLnByb3RvdHlwZS5kaXNhYmxlQnV0dG9ucz1fdCx6bi5wcm90b3R5cGUuZW5hYmxlQnV0dG9ucz1OdCx6bi5wcm90b3R5cGUuZ2V0SW5wdXQ9RHQsem4ucHJvdG90eXBlLmRpc2FibGVJbnB1dD1GdCx6bi5wcm90b3R5cGUuZW5hYmxlSW5wdXQ9UnQsem4ucHJvdG90eXBlLmhpZGVMb2FkaW5nPWp0LHpuLnByb3RvdHlwZS5kaXNhYmxlTG9hZGluZz1qdCx6bi5wcm90b3R5cGUuc2hvd1ZhbGlkYXRpb25NZXNzYWdlPVV0LHpuLnByb3RvdHlwZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlPXp0LHpuLnByb3RvdHlwZS5jbG9zZT1wdCx6bi5wcm90b3R5cGUuY2xvc2VQb3B1cD1wdCx6bi5wcm90b3R5cGUuY2xvc2VNb2RhbD1wdCx6bi5wcm90b3R5cGUuY2xvc2VUb2FzdD1wdCx6bi5wcm90b3R5cGUucmVqZWN0UHJvbWlzZT1odCx6bi5wcm90b3R5cGUudXBkYXRlPW9uLHpuLnByb3RvdHlwZS5fZGVzdHJveT1ybixPYmplY3QuYXNzaWduKHpuLEVuKSxPYmplY3Qua2V5cyh1bikuZm9yRWFjaChlPT57em5bZV09ZnVuY3Rpb24oLi4udCl7aWYoRm4mJkZuW2VdKXJldHVybiBGbltlXSguLi50KX19KSx6bi5EaXNtaXNzUmVhc29uPXplLHpuLnZlcnNpb249IjExLjI2LjIyIjtjb25zdCBRbj16bjtyZXR1cm4gUW4uZGVmYXVsdD1RbixRbn0pLHZvaWQgMCE9PXRoaXMmJnRoaXMuU3dlZXRhbGVydDImJih0aGlzLnN3YWw9dGhpcy5zd2VldEFsZXJ0PXRoaXMuU3dhbD10aGlzLlN3ZWV0QWxlcnQ9dGhpcy5Td2VldGFsZXJ0Mik7CiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2lmKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChuKSxuLnN0eWxlU2hlZXQpbi5zdHlsZVNoZWV0LmRpc2FibGVkfHwobi5zdHlsZVNoZWV0LmNzc1RleHQ9dCk7ZWxzZSB0cnl7bi5pbm5lckhUTUw9dH1jYXRjaChlKXtuLmlubmVyVGV4dD10fX0oZG9jdW1lbnQsIjpyb290ey0tc3dhbDItb3V0bGluZTogMCAwIDAgM3B4IHJnYmEoMTAwLCAxNTAsIDIwMCwgMC41KTstLXN3YWwyLWNvbnRhaW5lci1wYWRkaW5nOiAwLjYyNWVtOy0tc3dhbDItYmFja2Ryb3A6IHJnYmEoMCwgMCwgMCwgMC40KTstLXN3YWwyLWJhY2tkcm9wLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXM7LS1zd2FsMi13aWR0aDogMzJlbTstLXN3YWwyLXBhZGRpbmc6IDAgMCAxLjI1ZW07LS1zd2FsMi1ib3JkZXI6IG5vbmU7LS1zd2FsMi1ib3JkZXItcmFkaXVzOiAwLjMxMjVyZW07LS1zd2FsMi1iYWNrZ3JvdW5kOiB3aGl0ZTstLXN3YWwyLWNvbG9yOiAjNTQ1NDU0Oy0tc3dhbDItc2hvdy1hbmltYXRpb246IHN3YWwyLXNob3cgMC4zczstLXN3YWwyLWhpZGUtYW5pbWF0aW9uOiBzd2FsMi1oaWRlIDAuMTVzIGZvcndhcmRzOy0tc3dhbDItaWNvbi16b29tOiAxOy0tc3dhbDItaWNvbi1hbmltYXRpb25zOiB0cnVlOy0tc3dhbDItdGl0bGUtcGFkZGluZzogMC44ZW0gMWVtIDA7LS1zd2FsMi1odG1sLWNvbnRhaW5lci1wYWRkaW5nOiAxZW0gMS42ZW0gMC4zZW07LS1zd2FsMi1pbnB1dC1ib3JkZXI6IDFweCBzb2xpZCAjZDlkOWQ5Oy0tc3dhbDItaW5wdXQtYm9yZGVyLXJhZGl1czogMC4xODc1ZW07LS1zd2FsMi1pbnB1dC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA2KSwgMCAwIDAgM3B4IHRyYW5zcGFyZW50Oy0tc3dhbDItaW5wdXQtYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7LS1zd2FsMi1pbnB1dC10cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycywgYm94LXNoYWRvdyAwLjJzOy0tc3dhbDItaW5wdXQtaG92ZXItYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNiksIDAgMCAwIDNweCB0cmFuc3BhcmVudDstLXN3YWwyLWlucHV0LWZvY3VzLWJvcmRlcjogMXB4IHNvbGlkICNiNGRiZWQ7LS1zd2FsMi1pbnB1dC1mb2N1cy1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA2KSwgMCAwIDAgM3B4IHJnYmEoMTAwLCAxNTAsIDIwMCwgMC41KTstLXN3YWwyLXByb2dyZXNzLXN0ZXAtYmFja2dyb3VuZDogI2FkZDhlNjstLXN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZS1iYWNrZ3JvdW5kOiAjZjBmMGYwOy0tc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdlLWNvbG9yOiAjNjY2Oy0tc3dhbDItZm9vdGVyLWJvcmRlci1jb2xvcjogI2VlZTstLXN3YWwyLWZvb3Rlci1iYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDstLXN3YWwyLWZvb3Rlci1jb2xvcjogaW5oZXJpdDstLXN3YWwyLXRpbWVyLXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMyk7LS1zd2FsMi1jbG9zZS1idXR0b24tcG9zaXRpb246IGluaXRpYWw7LS1zd2FsMi1jbG9zZS1idXR0b24taW5zZXQ6IGF1dG87LS1zd2FsMi1jbG9zZS1idXR0b24tZm9udC1zaXplOiAyLjVlbTstLXN3YWwyLWNsb3NlLWJ1dHRvbi1jb2xvcjogI2NjYzstLXN3YWwyLWNsb3NlLWJ1dHRvbi10cmFuc2l0aW9uOiBjb2xvciAwLjJzLCBib3gtc2hhZG93IDAuMnM7LS1zd2FsMi1jbG9zZS1idXR0b24tb3V0bGluZTogaW5pdGlhbDstLXN3YWwyLWNsb3NlLWJ1dHRvbi1ib3gtc2hhZG93OiBpbnNldCAwIDAgMCAzcHggdHJhbnNwYXJlbnQ7LS1zd2FsMi1jbG9zZS1idXR0b24tZm9jdXMtYm94LXNoYWRvdzogaW5zZXQgdmFyKC0tc3dhbDItb3V0bGluZSk7LS1zd2FsMi1jbG9zZS1idXR0b24taG92ZXItdHJhbnNmb3JtOiBub25lOy0tc3dhbDItYWN0aW9ucy1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjstLXN3YWwyLWFjdGlvbnMtd2lkdGg6IGF1dG87LS1zd2FsMi1hY3Rpb25zLW1hcmdpbjogMS4yNWVtIGF1dG8gMDstLXN3YWwyLWFjdGlvbnMtcGFkZGluZzogMDstLXN3YWwyLWFjdGlvbnMtYm9yZGVyLXJhZGl1czogMDstLXN3YWwyLWFjdGlvbnMtYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7LS1zd2FsMi1hY3Rpb24tYnV0dG9uLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycywgYm94LXNoYWRvdyAwLjJzOy0tc3dhbDItYWN0aW9uLWJ1dHRvbi1ob3ZlcjogYmxhY2sgMTAlOy0tc3dhbDItYWN0aW9uLWJ1dHRvbi1hY3RpdmU6IGJsYWNrIDEwJTstLXN3YWwyLWNvbmZpcm0tYnV0dG9uLWJveC1zaGFkb3c6IG5vbmU7LS1zd2FsMi1jb25maXJtLWJ1dHRvbi1ib3JkZXItcmFkaXVzOiAwLjI1ZW07LS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yOiAjNzA2NmUwOy0tc3dhbDItY29uZmlybS1idXR0b24tY29sb3I6ICNmZmY7LS1zd2FsMi1kZW55LWJ1dHRvbi1ib3gtc2hhZG93OiBub25lOy0tc3dhbDItZGVueS1idXR0b24tYm9yZGVyLXJhZGl1czogMC4yNWVtOy0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvcjogI2RjMzc0MTstLXN3YWwyLWRlbnktYnV0dG9uLWNvbG9yOiAjZmZmOy0tc3dhbDItY2FuY2VsLWJ1dHRvbi1ib3gtc2hhZG93OiBub25lOy0tc3dhbDItY2FuY2VsLWJ1dHRvbi1ib3JkZXItcmFkaXVzOiAwLjI1ZW07LS1zd2FsMi1jYW5jZWwtYnV0dG9uLWJhY2tncm91bmQtY29sb3I6ICM2ZTc4ODE7LS1zd2FsMi1jYW5jZWwtYnV0dG9uLWNvbG9yOiAjZmZmOy0tc3dhbDItdG9hc3Qtc2hvdy1hbmltYXRpb246IHN3YWwyLXRvYXN0LXNob3cgMC41czstLXN3YWwyLXRvYXN0LWhpZGUtYW5pbWF0aW9uOiBzd2FsMi10b2FzdC1oaWRlIDAuMXMgZm9yd2FyZHM7LS1zd2FsMi10b2FzdC1ib3JkZXI6IG5vbmU7LS1zd2FsMi10b2FzdC1ib3gtc2hhZG93OiAwIDAgMXB4IGhzbCgwZGVnIDAlIDAlIC8gMC4wNzUpLCAwIDFweCAycHggaHNsKDBkZWcgMCUgMCUgLyAwLjA3NSksIDFweCAycHggNHB4IGhzbCgwZGVnIDAlIDAlIC8gMC4wNzUpLCAxcHggM3B4IDhweCBoc2woMGRlZyAwJSAwJSAvIDAuMDc1KSwgMnB4IDRweCAxNnB4IGhzbCgwZGVnIDAlIDAlIC8gMC4wNzUpfVtkYXRhLXN3YWwyLXRoZW1lPWRhcmtdey0tc3dhbDItZGFyay10aGVtZS1ibGFjazogIzE5MTkxYTstLXN3YWwyLWRhcmstdGhlbWUtd2hpdGU6ICNlMWUxZTE7LS1zd2FsMi1iYWNrZ3JvdW5kOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKTstLXN3YWwyLWNvbG9yOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLXdoaXRlKTstLXN3YWwyLWZvb3Rlci1ib3JkZXItY29sb3I6ICM1NTU7LS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGFyay10aGVtZS1ibGFjayksIHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpIDEwJSk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtYmFja2dyb3VuZDogY29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKSwgdmFyKC0tc3dhbDItZGFyay10aGVtZS13aGl0ZSkgMTAlICk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtY29sb3I6IHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpOy0tc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KX1AbWVkaWEocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspe1tkYXRhLXN3YWwyLXRoZW1lPWF1dG9dey0tc3dhbDItZGFyay10aGVtZS1ibGFjazogIzE5MTkxYTstLXN3YWwyLWRhcmstdGhlbWUtd2hpdGU6ICNlMWUxZTE7LS1zd2FsMi1iYWNrZ3JvdW5kOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKTstLXN3YWwyLWNvbG9yOiB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLXdoaXRlKTstLXN3YWwyLWZvb3Rlci1ib3JkZXItY29sb3I6ICM1NTU7LS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGFyay10aGVtZS1ibGFjayksIHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpIDEwJSk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtYmFja2dyb3VuZDogY29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1zd2FsMi1kYXJrLXRoZW1lLWJsYWNrKSwgdmFyKC0tc3dhbDItZGFyay10aGVtZS13aGl0ZSkgMTAlICk7LS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtY29sb3I6IHZhcigtLXN3YWwyLWRhcmstdGhlbWUtd2hpdGUpOy0tc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KX19Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wLC5zd2FsMi10b2FzdC1zaG93bil7b3ZlcmZsb3c6aGlkZGVufWJvZHkuc3dhbDItaGVpZ2h0LWF1dG97aGVpZ2h0OmF1dG8gIWltcG9ydGFudH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApICFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIgLnN3YWwyLXBvcHVwe3BvaW50ZXItZXZlbnRzOmF1dG99Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyIC5zd2FsMi1tb2RhbHtib3gtc2hhZG93OjAgMCAxMHB4IHZhcigtLXN3YWwyLWJhY2tkcm9wKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXJ7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjM2MHB4O21heC13aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKTtwb2ludGVyLWV2ZW50czpub25lfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7aW5zZXQ6MCBhdXRvIGF1dG8gNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7aW5zZXQ6MCAwIGF1dG8gYXV0b31ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtbGVmdHtpbnNldDowIGF1dG8gYXV0byAwfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0e2luc2V0OjUwJSBhdXRvIGF1dG8gMDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye2luc2V0OjUwJSBhdXRvIGF1dG8gNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodHtpbnNldDo1MCUgMCBhdXRvIGF1dG87dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1zdGFydCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnR7aW5zZXQ6YXV0byBhdXRvIDAgMH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te2luc2V0OmF1dG8gYXV0byAwIDUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e2luc2V0OmF1dG8gMCAwIGF1dG99QG1lZGlhIHByaW50e2JvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCwuc3dhbDItdG9hc3Qtc2hvd24pe292ZXJmbG93LXk6c2Nyb2xsICFpbXBvcnRhbnR9Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wLC5zd2FsMi10b2FzdC1zaG93bik+W2FyaWEtaGlkZGVuPXRydWVde2Rpc3BsYXk6bm9uZX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3AsLnN3YWwyLXRvYXN0LXNob3duKSAuc3dhbDItY29udGFpbmVye3Bvc2l0aW9uOnN0YXRpYyAhaW1wb3J0YW50fX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcil7ZGlzcGxheTpncmlkO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTA2MDtpbnNldDowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLXRlbXBsYXRlLWFyZWFzOlwidG9wLXN0YXJ0ICAgICB0b3AgICAgICAgICAgICB0b3AtZW5kXCIgXCJjZW50ZXItc3RhcnQgIGNlbnRlciAgICAgICAgIGNlbnRlci1lbmRcIiBcImJvdHRvbS1zdGFydCAgYm90dG9tLWNlbnRlciAgYm90dG9tLWVuZFwiO2dyaWQtdGVtcGxhdGUtcm93czptaW5tYXgobWluLWNvbnRlbnQsIGF1dG8pIG1pbm1heChtaW4tY29udGVudCwgYXV0bykgbWlubWF4KG1pbi1jb250ZW50LCBhdXRvKTtoZWlnaHQ6MTAwJTtwYWRkaW5nOnZhcigtLXN3YWwyLWNvbnRhaW5lci1wYWRkaW5nKTtvdmVyZmxvdy14OmhpZGRlbjt0cmFuc2l0aW9uOnZhcigtLXN3YWwyLWJhY2tkcm9wLXRyYW5zaXRpb24pOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1iYWNrZHJvcC1zaG93LGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1ub2FuaW1hdGlvbntiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLWJhY2tkcm9wKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItYmFja2Ryb3AtaGlkZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCkgIWltcG9ydGFudH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItdG9wLXN0YXJ0LGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1jZW50ZXItc3RhcnQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1zdGFydHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsIDFmcikgYXV0byBhdXRvfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi10b3AsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlcixkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItYm90dG9te2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvIG1pbm1heCgwLCAxZnIpIGF1dG99ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLXRvcC1lbmQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1lbmQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1lbmR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gYXV0byBtaW5tYXgoMCwgMWZyKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItdG9wLXN0YXJ0Pi5zd2FsMi1wb3B1cHthbGlnbi1zZWxmOnN0YXJ0fWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi10b3A+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjI7cGxhY2Utc2VsZjpzdGFydCBjZW50ZXJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLXRvcC1lbmQ+LnN3YWwyLXBvcHVwLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi10b3AtcmlnaHQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjM7cGxhY2Utc2VsZjpzdGFydCBlbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1zdGFydD4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1sZWZ0Pi5zd2FsMi1wb3B1cHtncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1jZW50ZXI+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjI7Z3JpZC1yb3c6MjtwbGFjZS1zZWxmOmNlbnRlciBjZW50ZXJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWNlbnRlci1lbmQ+LnN3YWwyLXBvcHVwLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1jZW50ZXItcmlnaHQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjM7Z3JpZC1yb3c6MjtwbGFjZS1zZWxmOmNlbnRlciBlbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1zdGFydD4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1sZWZ0Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoxO2dyaWQtcm93OjM7YWxpZ24tc2VsZjplbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbT4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzozO3BsYWNlLXNlbGY6ZW5kIGNlbnRlcn1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItYm90dG9tLWVuZD4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWJvdHRvbS1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzozO3BsYWNlLXNlbGY6ZW5kIGVuZH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItZ3Jvdy1yb3c+LnN3YWwyLXBvcHVwLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1ncm93LWZ1bGxzY3JlZW4+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjEvNDt3aWR0aDoxMDAlfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKS5zd2FsMi1ncm93LWNvbHVtbj4uc3dhbDItcG9wdXAsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpLnN3YWwyLWdyb3ctZnVsbHNjcmVlbj4uc3dhbDItcG9wdXB7Z3JpZC1yb3c6MS80O2FsaWduLXNlbGY6c3RyZXRjaH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikuc3dhbDItbm8tdHJhbnNpdGlvbnt0cmFuc2l0aW9uOm5vbmUgIWltcG9ydGFudH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcilbcG9wb3Zlcl17d2lkdGg6YXV0bztib3JkZXI6MH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi1wb3B1cCl7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsIDEwMCUpO3dpZHRoOnZhcigtLXN3YWwyLXdpZHRoKTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOnZhcigtLXN3YWwyLXBhZGRpbmcpO2JvcmRlcjp2YXIoLS1zd2FsMi1ib3JkZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tc3dhbDItYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1iYWNrZ3JvdW5kKTtjb2xvcjp2YXIoLS1zd2FsMi1jb2xvcik7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MXJlbTtjb250YWluZXItbmFtZTpzd2FsMi1wb3B1cH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi1wb3B1cCk6Zm9jdXN7b3V0bGluZTpub25lfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXBvcHVwKS5zd2FsMi1sb2FkaW5ne292ZXJmbG93LXk6aGlkZGVufWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXBvcHVwKS5zd2FsMi1kcmFnZ2FibGV7Y3Vyc29yOmdyYWJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItcG9wdXApLnN3YWwyLWRyYWdnYWJsZSBkaXY6d2hlcmUoLnN3YWwyLWljb24pe2N1cnNvcjpncmFifWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXBvcHVwKS5zd2FsMi1kcmFnZ2luZ3tjdXJzb3I6Z3JhYmJpbmd9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItcG9wdXApLnN3YWwyLWRyYWdnaW5nIGRpdjp3aGVyZSguc3dhbDItaWNvbil7Y3Vyc29yOmdyYWJiaW5nfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBoMjp3aGVyZSguc3dhbDItdGl0bGUpe3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO21hcmdpbjowO3BhZGRpbmc6dmFyKC0tc3dhbDItdGl0bGUtcGFkZGluZyk7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS44NzVlbTtmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC10cmFuc2Zvcm06bm9uZTtvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Y3Vyc29yOmluaXRpYWx9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItYWN0aW9ucyl7ZGlzcGxheTpmbGV4O3otaW5kZXg6MTtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDp2YXIoLS1zd2FsMi1hY3Rpb25zLWp1c3RpZnktY29udGVudCk7d2lkdGg6dmFyKC0tc3dhbDItYWN0aW9ucy13aWR0aCk7bWFyZ2luOnZhcigtLXN3YWwyLWFjdGlvbnMtbWFyZ2luKTtwYWRkaW5nOnZhcigtLXN3YWwyLWFjdGlvbnMtcGFkZGluZyk7Ym9yZGVyLXJhZGl1czp2YXIoLS1zd2FsMi1hY3Rpb25zLWJvcmRlci1yYWRpdXMpO2JhY2tncm91bmQ6dmFyKC0tc3dhbDItYWN0aW9ucy1iYWNrZ3JvdW5kKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi1sb2FkZXIpe2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyLjJlbTtoZWlnaHQ6Mi4yZW07bWFyZ2luOjAgMS44NzVlbTthbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2JvcmRlci13aWR0aDouMjVlbTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czoxMDAlO2JvcmRlci1jb2xvcjojMjc3OGM0IHJnYmEoMCwwLDAsMCkgIzI3NzhjNCByZ2JhKDAsMCwwLDApfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCl7bWFyZ2luOi4zMTI1ZW07cGFkZGluZzouNjI1ZW0gMS4xZW07dHJhbnNpdGlvbjp2YXIoLS1zd2FsMi1hY3Rpb24tYnV0dG9uLXRyYW5zaXRpb24pO2JvcmRlcjpub25lO2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMCwwLDAsMCk7Zm9udC13ZWlnaHQ6NTAwfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6bm90KFtkaXNhYmxlZF0pe2N1cnNvcjpwb2ludGVyfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6d2hlcmUoLnN3YWwyLWNvbmZpcm0pe2JvcmRlci1yYWRpdXM6dmFyKC0tc3dhbDItY29uZmlybS1idXR0b24tYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6dmFyKC0tc3dhbDItY29uZmlybS1idXR0b24tYmFja2dyb3VuZC1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1ib3gtc2hhZG93KTtjb2xvcjp2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1jb2xvcik7Zm9udC1zaXplOjFlbX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1jb25maXJtKTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yKSwgdmFyKC0tc3dhbDItYWN0aW9uLWJ1dHRvbi1ob3ZlcikpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6d2hlcmUoLnN3YWwyLWNvbmZpcm0pOmFd\éÕbjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zd2FsMi1jb25maXJtLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yKSwgdmFyKC0tc3dhbDItYWN0aW9uLWJ1dHRvbi1hY3RpdmUpKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1kZW55KXtib3JkZXItcmFkaXVzOnZhcigtLXN3YWwyLWRlbnktYnV0dG9uLWJvcmRlci1yYWRpdXMpO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXN3YWwyLWRlbnktYnV0dG9uLWJhY2tncm91bmQtY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tc3dhbDItZGVueS1idXR0b24tYm94LXNoYWRvdyk7Y29sb3I6dmFyKC0tc3dhbDItZGVueS1idXR0b24tY29sb3IpO2ZvbnQtc2l6ZToxZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItc3R5bGVkKTp3aGVyZSguc3dhbDItZGVueSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvciksIHZhcigtLXN3YWwyLWFjdGlvbi1idXR0b24taG92ZXIpKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1kZW55KTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3dhbDItZGVueS1idXR0b24tYmFja2dyb3VuZC1jb2xvciksIHZhcigtLXN3YWwyLWFjdGlvbi1idXR0b24tYWN0aXZlKSl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItc3R5bGVkKTp3aGVyZSguc3dhbDItY2FuY2VsKXtib3JkZXItcmFkaXVzOnZhcigtLXN3YWwyLWNhbmNlbC1idXR0b24tYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6dmFyKC0tc3dhbDItY2FuY2VsLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXN3YWwyLWNhbmNlbC1idXR0b24tYm94LXNoYWRvdyk7Y29sb3I6dmFyKC0tc3dhbDItY2FuY2VsLWJ1dHRvbi1jb2xvcik7Zm9udC1zaXplOjFlbX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1jYW5jZWwpOmhvdmVye2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN3YWwyLWNhbmNlbC1idXR0b24tYmFja2dyb3VuZC1jb2xvciksIHZhcigtLXN3YWwyLWFjdGlvbi1idXR0b24taG92ZXIpKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOndoZXJlKC5zd2FsMi1jYW5jZWwpOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zd2FsMi1jYW5jZWwtYnV0dG9uLWJhY2tncm91bmQtY29sb3IpLCB2YXIoLS1zd2FsMi1hY3Rpb24tYnV0dG9uLWFjdGl2ZSkpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZCk6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOm5vbmU7Ym94LXNoYWRvdzp2YXIoLS1zd2FsMi1hY3Rpb24tYnV0dG9uLWZvY3VzLWJveC1zaGFkb3cpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBidXR0b246d2hlcmUoLnN3YWwyLXN0eWxlZClbZGlzYWJsZWRdOm5vdCguc3dhbDItbG9hZGluZyl7b3BhY2l0eTouNH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLWZvb3Rlcil7bWFyZ2luOjFlbSAwIDA7cGFkZGluZzoxZW0gMWVtIDA7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tc3dhbDItZm9vdGVyLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1mb290ZXItYmFja2dyb3VuZCk7Y29sb3I6dmFyKC0tc3dhbDItZm9vdGVyLWNvbG9yKTtmb250LXNpemU6MWVtO3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjppbml0aWFsfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtncmlkLWNvbHVtbjphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOnZhcigtLXN3YWwyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tc3dhbDItYm9yZGVyLXJhZGl1cyl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGRpdjp3aGVyZSguc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyKXt3aWR0aDoxMDAlO2hlaWdodDouMjVlbTtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLXRpbWVyLXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kKX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgaW1nOndoZXJlKC5zd2FsMi1pbWFnZSl7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjJlbSBhdXRvIDFlbTtjdXJzb3I6aW5pdGlhbH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1jbG9zZSl7cG9zaXRpb246dmFyKC0tc3dhbDItY2xvc2UtYnV0dG9uLXBvc2l0aW9uKTtpbnNldDp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24taW5zZXQpO3otaW5kZXg6MjthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxLjJlbTtoZWlnaHQ6MS4yZW07bWFyZ2luLXRvcDowO21hcmdpbi1yaWdodDowO21hcmdpbi1ib3R0b206LTEuMmVtO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24tdHJhbnNpdGlvbik7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czp2YXIoLS1zd2FsMi1ib3JkZXItcmFkaXVzKTtvdXRsaW5lOnZhcigtLXN3YWwyLWNsb3NlLWJ1dHRvbi1vdXRsaW5lKTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Y29sb3I6dmFyKC0tc3dhbDItY2xvc2UtYnV0dG9uLWNvbG9yKTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOnZhcigtLXN3YWwyLWNsb3NlLWJ1dHRvbi1mb250LXNpemUpO2N1cnNvcjpwb2ludGVyO2p1c3RpZnktc2VsZjplbmR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItY2xvc2UpOmhvdmVye3RyYW5zZm9ybTp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24taG92ZXItdHJhbnNmb3JtKTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Y29sb3I6I2YyNzQ3NH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgYnV0dG9uOndoZXJlKC5zd2FsMi1jbG9zZSk6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOm5vbmU7Ym94LXNoYWRvdzp2YXIoLS1zd2FsMi1jbG9zZS1idXR0b24tZm9jdXMtYm94LXNoYWRvdyl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGJ1dHRvbjp3aGVyZSguc3dhbDItY2xvc2UpOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLWh0bWwtY29udGFpbmVyKXt6LWluZGV4OjE7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MDtwYWRkaW5nOnZhcigtLXN3YWwyLWh0bWwtY29udGFpbmVyLXBhZGRpbmcpO292ZXJmbG93OmF1dG87Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbTtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6bm9ybWFsO3RleHQtYWxpZ246Y2VudGVyO292ZXJmbG93LXdyYXA6YnJlYWstd29yZDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Y3Vyc29yOmluaXRpYWx9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCksZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1maWxlKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgdGV4dGFyZWE6d2hlcmUoLnN3YWwyLXRleHRhcmVhKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgc2VsZWN0OndoZXJlKC5zd2FsMi1zZWxlY3QpLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXJhZGlvKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgbGFiZWw6d2hlcmUoLnN3YWwyLWNoZWNrYm94KXttYXJnaW46MWVtIDJlbSAzcHh9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCksZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1maWxlKSxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgdGV4dGFyZWE6d2hlcmUoLnN3YWwyLXRleHRhcmVhKXtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6YXV0bzt0cmFuc2l0aW9uOnZhcigtLXN3YWwyLWlucHV0LXRyYW5zaXRpb24pO2JvcmRlcjp2YXIoLS1zd2FsMi1pbnB1dC1ib3JkZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tc3dhbDItaW5wdXQtYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kKTtib3gtc2hhZG93OnZhcigtLXN3YWwyLWlucHV0LWJveC1zaGFkb3cpO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCkuc3dhbDItaW5wdXRlcnJvcixkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgaW5wdXQ6d2hlcmUoLnN3YWwyLWZpbGUpLnN3YWwyLWlucHV0ZXJyb3IsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIHRleHRhcmVhOndoZXJlKC5zd2FsMi10ZXh0YXJlYSkuc3dhbDItaW5wdXRlcnJvcntib3JkZXItY29sb3I6I2YyNzQ3NCAhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDJweCAjZjI3NDc0ICFpbXBvcnRhbnR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCk6aG92ZXIsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1maWxlKTpob3ZlcixkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgdGV4dGFyZWE6d2hlcmUoLnN3YWwyLXRleHRhcmVhKTpob3Zlcntib3gtc2hhZG93OnZhcigtLXN3YWwyLWlucHV0LWhvdmVyLWJveC1zaGFkb3cpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBpbnB1dDp3aGVyZSguc3dhbDItaW5wdXQpOmZvY3VzLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBpbnB1dDp3aGVyZSguc3dhbDItZmlsZSk6Zm9jdXMsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIHRleHRhcmVhOndoZXJlKC5zd2FsMi10ZXh0YXJlYSk6Zm9jdXN7Ym9yZGVyOnZhcigtLXN3YWwyLWlucHV0LWZvY3VzLWJvcmRlcik7b3V0bGluZTpub25lO2JveC1zaGFkb3c6dmFyKC0tc3dhbDItaW5wdXQtZm9jdXMtYm94LXNoYWRvdyl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCk6OnBsYWNlaG9sZGVyLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBpbnB1dDp3aGVyZSguc3dhbDItZmlsZSk6OnBsYWNlaG9sZGVyLGRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSB0ZXh0YXJlYTp3aGVyZSguc3dhbDItdGV4dGFyZWEpOjpwbGFjZWhvbGRlcntjb2xvcjojY2NjfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcmFuZ2V7bWFyZ2luOjFlbSAyZW0gM3B4O2JhY2tncm91bmQ6dmFyKC0tc3dhbDItYmFja2dyb3VuZCl9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYW5nZSBpbnB1dHt3aWR0aDo4MCV9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYW5nZSBvdXRwdXR7d2lkdGg6MjAlO2NvbG9yOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246Y2VudGVyfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcmFuZ2UgaW5wdXQsZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYW5nZSBvdXRwdXR7aGVpZ2h0OjIuNjI1ZW07cGFkZGluZzowO2ZvbnQtc2l6ZToxLjEyNWVtO2xpbmUtaGVpZ2h0OjIuNjI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1pbnB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjAgLjc1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1maWxle3dpZHRoOjc1JTttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvO2JhY2tncm91bmQ6dmFyKC0tc3dhbDItaW5wdXQtYmFja2dyb3VuZCk7Zm9udC1zaXplOjEuMTI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi10ZXh0YXJlYXtoZWlnaHQ6Ni43NWVtO3BhZGRpbmc6Ljc1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1zZWxlY3R7bWluLXdpZHRoOjUwJTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOi4zNzVlbSAuNjI1ZW07YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1pbnB1dC1iYWNrZ3JvdW5kKTtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcmFkaW8sZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1jaGVja2JveHthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLWJhY2tncm91bmQpO2NvbG9yOmluaGVyaXR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYWRpbyBsYWJlbCxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLWNoZWNrYm94IGxhYmVse21hcmdpbjowIC42ZW07Zm9udC1zaXplOjEuMTI1ZW19ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1yYWRpbyBpbnB1dCxkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLWNoZWNrYm94IGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgbGFiZWw6d2hlcmUoLnN3YWwyLWlucHV0LWxhYmVsKXtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIGF1dG8gMH1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgZGl2OndoZXJlKC5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2Upe2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxZW0gMCAwO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZS1iYWNrZ3JvdW5kKTtjb2xvcjp2YXIoLS1zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2UtY29sb3IpO2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6MzAwfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSBkaXY6d2hlcmUoLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZSk6OmJlZm9yZXtjb250ZW50OlwiIVwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEuNWVtO21pbi13aWR0aDoxLjVlbTtoZWlnaHQ6MS41ZW07bWFyZ2luOjAgLjYyNWVtO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NDtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjYwMDtsaW5lLWhlaWdodDoxLjVlbTt0ZXh0LWFsaWduOmNlbnRlcn1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLXByb2dyZXNzLXN0ZXBze2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjttYXgtd2lkdGg6MTAwJTttYXJnaW46MS4yNWVtIGF1dG87cGFkZGluZzowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwKTtmb250LXdlaWdodDo2MDB9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1wcm9ncmVzcy1zdGVwcyBsaXtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwe3otaW5kZXg6MjA7ZmxleC1zaHJpbms6MDt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjJlbTtiYWNrZ3JvdW5kOiMyNzc4YzQ7Y29sb3I6I2ZmZjtsaW5lLWhlaWdodDoyZW07dGV4dC1hbGlnbjpjZW50ZXJ9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiMyNzc4YzR9ZGl2OndoZXJlKC5zd2FsMi1jb250YWluZXIpIC5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcH4uc3dhbDItcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLXByb2dyZXNzLXN0ZXAtYmFja2dyb3VuZCk7Y29sb3I6I2ZmZn1kaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7YmFja2dyb3VuZDp2YXIoLS1zd2FsMi1wcm9ncmVzcy1zdGVwLWJhY2tncm91bmQpfWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXt6LWluZGV4OjEwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6Mi41ZW07aGVpZ2h0Oi40ZW07bWFyZ2luOjAgLTFweDtiYWNrZ3JvdW5kOiMyNzc4YzR9ZGl2OndoZXJlKC5zd2FsMi1pY29uKXtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6NWVtO2hlaWdodDo1ZW07bWFyZ2luOjIuNWVtIGF1dG8gLjZlbTt6b29tOnZhcigtLXN3YWwyLWljb24tem9vbSk7Ym9yZGVyOi4yNWVtIHNvbGlkIHJnYmEoMCwwLDAsMCk7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyLWNvbG9yOiMwMDA7Zm9udC1mYW1pbHk6aW5oZXJpdDtsaW5lLWhlaWdodDo1ZW07Y3Vyc29yOmRlZmF1bHQ7dXNlci1zZWxlY3Q6bm9uZX1kaXY6d2hlcmUoLnN3YWwyLWljb24pIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6My43NWVtfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2YyNzQ3NH1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLWVycm9yIC5zd2FsMi14LW1hcmt7cG9zaXRpb246cmVsYXRpdmU7ZmxleC1ncm93OjF9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoyLjMxMjVlbTt3aWR0aDoyLjkzNzVlbTtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzR9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDoxLjA2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVdW2NsYXNzJD1yaWdodF17cmlnaHQ6MWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX1AY29udGFpbmVyIHN3YWwyLXBvcHVwIHN0eWxlKC0tc3dhbDItaWNvbi1hbmltYXRpb25zOnRydWUpe2Rpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93IC5zd2FsMi14LW1hcmt7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrIC41c319ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi13YXJuaW5ne2JvcmRlci1jb2xvcjojZjhiYjg2O2NvbG9yOiNmOGJiODZ9QGNvbnRhaW5lciBzd2FsMi1wb3B1cCBzdHlsZSgtLXN3YWwyLWljb24tYW5pbWF0aW9uczp0cnVlKXtkaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXdhcm5pbmcuc3dhbDItaWNvbi1zaG93e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItd2FybmluZy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLWljb24tY29udGVudHthbmltYXRpb246c3dhbDItYW5pbWF0ZS1pLW1hcmsgLjVzfX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLWluZm97Ym9yZGVyLWNvbG9yOiMzZmMzZWU7Y29sb3I6IzNmYzNlZX1AY29udGFpbmVyIHN3YWwyLXBvcHVwIHN0eWxlKC0tc3dhbDItaWNvbi1hbmltYXRpb25zOnRydWUpe2Rpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItaW5mby5zd2FsMi1pY29uLXNob3d7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1pbmZvLnN3YWwyLWljb24tc2hvdyAuc3dhbDItaWNvbi1jb250ZW50e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuOHN9fWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItcXVlc3Rpb257Ym9yZGVyLWNvbG9yOiM4N2FkYmQ7Y29sb3I6Izg3YWRiZH1AY29udGFpbmVyIHN3YWwyLXBvcHVwIHN0eWxlKC0tc3dhbDItaWNvbi1hbmltYXRpb25zOnRydWUpe2Rpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93IC5zd2FsMi1pY29uLWNvbnRlbnR7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFyayAuOHN9fWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Njtjb2xvcjojYTVkYzg2fWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6My43NWVtO2hlaWdodDo3LjVlbTtib3JkZXItcmFkaXVzOjUwJX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LTAuNDM3NWVtO2xlZnQ6LTIuMDYzNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjMuNzVlbSAzLjc1ZW07Ym9yZGVyLXJhZGl1czo3LjVlbSAwIDAgNy41ZW19ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotMC42ODc1ZW07bGVmdDoxLjg3NWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjAgMy43NWVtO2JvcmRlci1yYWRpdXM6MCA3LjVlbSA3LjVlbSAwfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6LTAuMjVlbTtsZWZ0Oi0wLjI1ZW07Ym94LXNpemluZzpjb250ZW50LWJveDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjouMjVlbSBzb2xpZCByZ2JhKDE2NSwyMjAsMTM0LC4zKTtib3JkZXItcmFkaXVzOjUwJX1kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6LjVlbTtsZWZ0OjEuNjI1ZW07d2lkdGg6LjQzNzVlbTtoZWlnaHQ6NS42MjVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNhNWRjODZ9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6Mi44NzVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9ZGl2OndoZXJlKC5zd2FsMi1pY29uKS5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9QGNvbnRhaW5lciBzd2FsMi1wb3B1cCBzdHlsZSgtLXN3YWwyLWljb24tYW5pbWF0aW9uczp0cnVlKXtkaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwe2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c31kaXY6d2hlcmUoLnN3YWwyLWljb24pLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3thbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfWRpdjp3aGVyZSguc3dhbDItaWNvbikuc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodHthbmltYXRpb246c3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWlufX1bY2xhc3NePXN3YWwyXXstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX0uc3dhbDItc2hvd3thbmltYXRpb246dmFyKC0tc3dhbDItc2hvdy1hbmltYXRpb24pfS5zd2FsMi1oaWRle2FuaW1hdGlvbjp2YXIoLS1zd2FsMi1oaWRlLWFuaW1hdGlvbil9LnN3YWwyLW5vYW5pbWF0aW9ue3RyYW5zaXRpb246bm9uZX0uc3dhbDItc2Nyb2xsYmFyLW1lYXN1cmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5cHg7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpzY3JvbGx9LnN3YWwyLXJ0bCAuc3dhbDItY2xvc2V7bWFyZ2luLXJpZ2h0OmluaXRpYWw7bWFyZ2luLWxlZnQ6MH0uc3dhbDItcnRsIC5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7cmlnaHQ6MDtsZWZ0OmF1dG99LnN3YWwyLXRvYXN0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLWNvbHVtbjoxLzQgIWltcG9ydGFudDtncmlkLXJvdzoxLzQgIWltcG9ydGFudDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWluLWNvbnRlbnQgYXV0byBtaW4tY29udGVudDtwYWRkaW5nOjFlbTtvdmVyZmxvdy15OmhpZGRlbjtib3JkZXI6dmFyKC0tc3dhbDItdG9hc3QtYm9yZGVyKTtiYWNrZ3JvdW5kOnZhcigtLXN3YWwyLWJhY2tncm91bmQpO2JveC1zaGFkb3c6dmFyKC0tc3dhbDItdG9hc3QtYm94LXNoYWRvdyk7cG9pbnRlci1ldmVudHM6YXV0b30uc3dhbDItdG9hc3Q+KntncmlkLWNvbHVtbjoyfS5zd2FsMi10b2FzdCBoMjp3aGVyZSguc3dhbDItdGl0bGUpe21hcmdpbjouNWVtIDFlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXRvYXN0IC5zd2FsMi1sb2FkaW5ne2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLXRvYXN0IGlucHV0OndoZXJlKC5zd2FsMi1pbnB1dCl7aGVpZ2h0OjJlbTttYXJnaW46LjVlbTtmb250LXNpemU6MWVtfS5zd2FsMi10b2FzdCAuc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdle2ZvbnQtc2l6ZToxZW19LnN3YWwyLXRvYXN0IGRpdjp3aGVyZSguc3dhbDItZm9vdGVyKXttYXJnaW46LjVlbSAwIDA7cGFkZGluZzouNWVtIDAgMDtmb250LXNpemU6LjhlbX0uc3dhbDItdG9hc3QgYnV0dG9uOndoZXJlKC5zd2FsMi1jbG9zZSl7Z3JpZC1jb2x1bW46My8zO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6LjhlbTtoZWlnaHQ6LjhlbTttYXJnaW46MDtmb250LXNpemU6MmVtfS5zd2FsMi10b2FzdCBkaXY6d2hlcmUoLnN3YWwyLWh0bWwtY29udGFpbmVyKXttYXJnaW46LjVlbSAxZW07cGFkZGluZzowO292ZXJmbG93OmluaXRpYWw7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXRvYXN0IGRpdjp3aGVyZSguc3dhbDItaHRtbC1jb250YWluZXIpOmVtcHR5e3BhZGRpbmc6MH0uc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRlcntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOi4yNWVtfS5zd2FsMi10b2FzdCAuc3dhbDItaWNvbntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO21pbi13aWR0aDoyZW07aGVpZ2h0OjJlbTttYXJnaW46MCAuNWVtIDAgMH0uc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZToxLjhlbTtmb250LXdlaWdodDpib2xkfS5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7d2lkdGg6MmVtO2hlaWdodDoyZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde3RvcDouODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6LjMxMjVlbX0uc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDouMzEyNWVtfS5zd2FsMi10b2FzdCBkaXY6d2hlcmUoLnN3YWwyLWFjdGlvbnMpe2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2hlaWdodDphdXRvO21hcmdpbjowO21hcmdpbi10b3A6LjVlbTtwYWRkaW5nOjAgLjVlbX0uc3dhbDItdG9hc3QgYnV0dG9uOndoZXJlKC5zd2FsMi1zdHlsZWQpe21hcmdpbjouMjVlbSAuNWVtO3BhZGRpbmc6LjRlbSAuNmVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNze2JvcmRlci1jb2xvcjojYTVkYzg2fS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MS42ZW07aGVpZ2h0OjNlbTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LTAuOGVtO2xlZnQ6LTAuNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjJlbSAyZW07Ym9yZGVyLXJhZGl1czo0ZW0gMCAwIDRlbX0uc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1yaWdodF17dG9wOi0wLjI1ZW07bGVmdDouOTM3NWVtO3RyYW5zZm9ybS1vcmlnaW46MCAxLjVlbTtib3JkZXItcmFkaXVzOjAgNGVtIDRlbSAwfS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3dpZHRoOjJlbTtoZWlnaHQ6MmVtfS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXh7dG9wOjA7bGVmdDouNDM3NWVtO3dpZHRoOi40Mzc1ZW07aGVpZ2h0OjIuNjg3NWVtfS5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV17aGVpZ2h0Oi4zMTI1ZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfUBjb250YWluZXIgc3dhbDItcG9wdXAgc3R5bGUoLS1zd2FsMi1pY29uLWFuaW1hdGlvbnM6dHJ1ZSl7LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcHthbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXN9LnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmd7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c319LnN3YWwyLXRvYXN0LnN3YWwyLXNob3d7YW5pbWF0aW9uOnZhcigtLXN3YWwyLXRvYXN0LXNob3ctYW5pbWF0aW9uKX0uc3dhbDItdG9hc3Quc3dhbDItaGlkZXthbmltYXRpb246dmFyKC0tc3dhbDItdG9hc3QtaGlkZS1hbmltYXRpb24pfUBrZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgLTUwcHgsIDApIHNjYWxlKDAuOSk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApIHNjYWxlKDEpO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1oaWRlezAle3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKSBzY2FsZSgxKTtvcGFjaXR5OjF9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgLTUwcHgsIDApIHNjYWxlKDAuOSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6MS4xODc1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDoxLjA2MjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6Mi4xODc1ZW07bGVmdDotMC4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QGtleWZyYW1lcyBzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lezAle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX01JXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9MTIle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoMC40KTtvcGFjaXR5OjB9NTAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoMC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LTAuMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uezAle3RyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMGRlZyk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrezAle3RyYW5zZm9ybTpyb3RhdGVZKC0zNjBkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVkoMCl9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1pLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpO29wYWNpdHk6MH0yNSV7dHJhbnNmb3JtOnJvdGF0ZVooLTI1ZGVnKTtvcGFjaXR5Oi40fTUwJXt0cmFuc2Zvcm06cm90YXRlWigxNWRlZyk7b3BhY2l0eTouOH03NSV7dHJhbnNmb3JtOnJvdGF0ZVooLTVkZWcpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjYyNWVtKSByb3RhdGVaKDJkZWcpfTMzJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKC0yZGVnKX02NiV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKDBkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotMC4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6MS42MjVlbTtyaWdodDoxLjM3NWVtO3dpZHRoOjB9NjUle3RvcDoxLjI1ZW07cmlnaHQ6LjkzNzVlbTt3aWR0aDowfTg0JXt0b3A6LjkzNzVlbTtyaWdodDowO3dpZHRoOjEuMTI1ZW19MTAwJXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19fSIpOw=="},"ts":1.773565678266e+12,"url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}}KºªH          1!extdb.@meta#f1d1ab07-73c3-4977-acbc-a09f0248670eé6{"origin":"normal","value":{"antifeatures":{},"author":"YouhouLab","blockers":[],"connects":["www.saveanyyoutube.com"],"copyright":null,"deleted":1.773565803961e+12,"description":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","description_i18n":{"en":"Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads","es":"Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios","ja":"YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし","pt":"Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios","zh_CN":"YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载"},"downloadURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js","grant":["GM_addStyle","GM_xmlhttpRequest","GM_getValue","GM_setValue"],"header":"// ==UserScript==\n// @name         YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥\n// @name:zh-CN   YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥\n// @name:en      YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥\n// @name:ja      YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥\n// @name:es      Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥\n// @name:pt      Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥\n// @namespace    http://tampermonkey.net/\n// @version      0.4\n// @description  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:en  Download YouTube videos in HD(1080P/2K), subtitles support, video/audio separate download, shorts download, completely free & no ads\n// @description:zh-CN YouTube视频下载神器，支持1080P/2K高清视频下载，封面下载，支持视频/音频分离下载，合并下载\n// @description:ja  YouTubeビデオをHD(1080P/2K)でダウンロード、字幕対応、ビデオ/オーディオ分離ダウンロード、ショート動画対応、完全無料＆広告なし\n// @description:es  Descarga videos de YouTube en HD(1080P/2K), soporte de subtítulos, descarga separada de video/audio, descarga de shorts, completamente gratis y sin anuncios\n// @description:pt  Baixe vídeos do YouTube em HD(1080P/2K), suporte a legendas, download separado de vídeo/áudio, download de shorts, totalmente gratuito e sem anúncios\n// @author       YouhouLab\n// @license      MIT\n// @match        *://*.youtube.com/*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @grant        GM_addStyle\n// @grant        GM_xmlhttpRequest\n// @grant        GM_getValue\n// @grant        GM_setValue\n// @connect      www.saveanyyoutube.com\n// @run-at       document-start\n// @supportURL   https://saveanyyoutube.com\n// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11\n// @compatible   chrome\n// @compatible   firefox\n// @compatible   opera\n// @compatible   edge\n// @compatible   safari\n// @keywords     youtube, download, video, audio, subtitle, shorts, hd, 1080p, 2k, 4k, free, no ads, ad blocker, ad free, remove ads, block ads, addyoutube, 油管, 视频下载, 字幕下载, 高清视频, 免费下载, 无广告, 去广告, 广告拦截, YouTube下载器, 短视频下载, ユーチューブ, ダウンロード, 動画保存, 字幕, 高画質, 無料, 広告ブロック, 広告なし, 유튜브, 다운로드, 동영상, 자막, 고화질, 무료, 광고 차단\n// @downloadURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.user.js\n// @updateURL https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773565599129e+12,"matches":["*://*.youtube.com/*"],"name":"YouTube Video Downloader 🤩 | HD/2K/4K Quality | Video&Audio&Cover🔥📥","name_i18n":{"en":"YouTube Video Downloader🤩 | HD/2K/4K Quality | Video&Audio&Cover 🔥📥","es":"Descargador de YouTube y Bloqueador🤩 de Anuncios | Calidad HD/2K/4K | Video y Audio&Portada🔥📥","ja":"YouTube動画ダウンローダー🤩｜HD/2K/4K高画質｜ビデオ＆オーディオ&カバー 🔥📥","pt":"Baixador do YouTube e Bloqueador 🤩de Anúncios | Qualidade HD/2K/4K | Vídeo e Áudio&Capa 🔥📥","zh_CN":"YouTube油管视频下载🤩&去广告多合一｜HD/2K/4K｜视频&音频&获取封面 🔥📥"},"namespace":"http://tampermonkey.net/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.saveanyyoutube.com"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":9.007199254740991e+15,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/522662/","unsafe_url":"https://cdn.jsdelivr.net/npm/sweetalert2@11"}],"resources":[],"supportURL":"https://saveanyyoutube.com","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/9aaf5952-f42c-40d9-9623-3598a1edbc8e"}},"updateURL":"https://update.greasyfork.org/scripts/522662/YouTube%20Video%20Downloader%20%F0%9F%A4%A9%20%7C%20HD2K4K%20Quality%20%7C%20VideoAudioCover%F0%9F%94%A5%F0%9F%93%A5.meta.js","uuid":"f1d1ab07-73c3-4977-acbc-a09f0248670e","version":"0.4","webRequest":null}}@ ï¹lI          1!extdb.@meta#1df1506d-32dc-4944-8cb4-ded03b87bf3e±¦{"origin":"normal","value":{"antifeatures":{},"author":"ChenZihan","blockers":[],"connects":[],"copyright":null,"deleted":1.773565934351e+12,"description":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Mus
•ÞRic","description_i18n":{"ar":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","bg":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","cs":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","da":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","de":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","el":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","eo":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","es":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","fr_CA":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","he":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","hu":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","id":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","it":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ja":"すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。","ko":"Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.","kr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nb":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","nl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pl":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","pt_BR":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ro":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ru":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","sv":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","th":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","tr":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","ug":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","uk":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music","vi":"Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.","zh_CN":"屏蔽所有视频广告、插入广告、页面广告","zh_TW":"屏蔽所有視頻廣告、插入廣告、頁面廣告"},"downloadURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-CN   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:zh-TW   屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.\n// @name:ar      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:bg      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:cs      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:da      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:de      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:el      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:eo      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:es      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:fr-CA   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:he      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:hu      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:id      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:it      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ja      YoutubeMusicを含むすべてのYoutube広告をブロックする\n// @name:ko      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:kr      Youtube Music을 포함한 모든 YouTube 광고 차단\n// @name:nb      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:nl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pl      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:pt-BR   屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ro      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ru      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:sv      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:th      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:tr      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:uk      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:ug      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n// @name:vi      屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music. \n\n\n// @description         Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:zh-CN   屏蔽所有视频广告、插入广告、页面广告\n// @description:zh-TW   屏蔽所有視頻廣告、插入廣告、頁面廣告\n// @description:ar      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:bg      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:cs      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:da      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:de      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:el      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:eo      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:es      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:fr-CA   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:he      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:hu      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:id      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:it      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ja      すべてのビデオ広告をブロックし、広告を挿入し、ページ広告を挿入します。YoutubeMusicを含みます。\n// @description:ko      Youtube Music을 포함한 모든 비디오 광고, 삽입 광고, 페이지 광고 차단.\n// @description:kr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nb      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:nl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pl      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:pt-BR   Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ro      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ru      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:sv      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:th      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:tr      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:uk      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:ug      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music\n// @description:vi      Block all video ads, insert ads, page ads. Including Youtube Music. 屏蔽所有视频广告、插入广告、页面广告。包括Youtube Music.\n\n// @namespace    https://github.com/ChenZihan-sudo/Youtube-AD-blocker/\n// @version      6.0.1 [Beta]\n// @author       ChenZihan\n// @match        *.youtube.com/*\n// @icon\n// @grant        none\n// @downloadURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.user.js\n// @updateURL https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js\n// ==/UserScript==","homepage":null,"icon":null,"icon64":null,"includes":[],"lastModified":1.773565487474e+12,"matches":["*.youtube.com/*"],"name":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","name_i18n":{"ar":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","bg":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","cs":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","da":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","de":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","el":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","eo":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","es":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","fr_CA":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","he":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","hu":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","id":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","it":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ja":"YoutubeMusicを含むすべてのYoutube広告をブロックする","ko":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","kr":"Youtube Music을 포함한 모든 YouTube 광고 차단","nb":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","nl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pl":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","pt_BR":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ro":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ru":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","sv":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","th":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","tr":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","ug":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","uk":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","vi":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_CN":"屏蔽所有Youtube广告 Youtube AD blocker (Block all ad). Including blocking Youtube Music.","zh_TW":"屏蔽所有Youtube廣告 Youtube AD blocker (Block all ad). Including blocking Youtube Music."},"namespace":"https://github.com/ChenZihan-sudo/Youtube-AD-blocker/","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":9.007199254740991e+15,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/eb24608f-df41-4dcd-9451-9b5b9d4000da"}},"updateURL":"https://update.greasyfork.org/scripts/434936/%E5%B1%8F%E8%94%BD%E6%89%80%E6%9C%89Youtube%E5%B9%BF%E5%91%8A%20Youtube%20AD%20blocker%20%28Block%20all%20ad%29%20Including%20blocking%20Youtube%20Music.meta.js","uuid":"1df1506d-32dc-4944-8cb4-ded03b87bf3e","version":"6.0.1[Beta]","webRequest":null}}_æ£hë-J          1!extdb.@meta#6cacb4e8-442d-4344-b28d-3aa05d312687ä7{"origin":"normal","value":{"antifeatures":{},"author":"ElectroKnight22","blockers":[],"connects":[],"copyright":null,"description":"Have you ever wanted Premium but think that the real thing is too good? Worry not, this script replaces the loser normal logo with the premium one, tricking you and your friends into thinking you are richer than you really are. Currently still testing so functionality may be rough or incomplete in some places. Please be understanding. (The adblocking feature is no longer functional, and no fixes are currently planned.)","description_i18n":{"ja":"Premium が欲しいけど、本物は立派すぎて手が出せないと思ったことはありませんか？ご心配なく。このスクリプトは、あの負け犬っぽい普通のロゴを Premium のロゴに置き換え、あなたや友達に「実は金持ちなんじゃないか」と勘違いさせることができます。現在まだテスト中のため、一部の機能が不安定であったり、不完全な場合があります。ご了承ください。(広告ブロック機能はすでに利用できなくなっており、現在のところ修正対応の予定はありません。)","zh_CN":"是否曾渴望拥有 Premium，却又觉得正版太过美好？别担心，这个脚本会将那有些寒酸的普通标志替换为 Premium 图标，让你和你的朋友们误以为你比实际上更有钱。目前仍在测试阶段，因此部分功能可能会不稳定或不完整，请多见谅。（广告拦截功能已失效，目前暂无后续的修复安排。）","zh_TW":"是否曾渴望擁有 Premium，卻又覺得正版太過美好？別擔心，這個腳本會將那魯蛇般的普通標誌替換為 Premium 圖示，讓你和你的朋友們誤以為你比實際上更有錢。目前仍在測試階段，因此部分功能可能會不穩定或不完整，請多見諒。（廣告攔截功能已失效，且目前暫無後續的修復安排。）"},"downloadURL":"https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.user.js","enabled":true,"evilness":0,"excludes":["*://www.youtube.com/live_chat*"],"fileURL":"https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.user.js","grant":["none"],"header":"// ==UserScript==\n// @name                    YouTube Premium Lite² [Beta]\n// @name:zh-TW              YouTube Premium Lite² [Beta 測試版]\n// @name:zh-CN              YouTube Premium Lite² [Beta 测试版]\n// @name:ja                 YouTube Premium Lite² [ベータ版]\n// @icon                    https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @author                  ElectroKnight22\n// @namespace               electroknight22_youtube_premium_lite_squared_namespace\n// @version                 0.5.3\n// @match                   *://m.youtube.com/*\n// @match                   *://www.youtube.com/*\n// @exclude                 *://www.youtube.com/live_chat*\n// @require                 https://update.greasyfork.org/scripts/549881/1717291/YouTube%20Helper%20API.js\n// @grant                   none\n// @run-at                  document-idle\n// @inject-into             page\n// @license                 MIT\n// @description             Have you ever wanted Premium but think that the real thing is too good? Worry not, this script replaces the loser normal logo with the premium one, tricking you and your friends into thinking you are richer than you really are. Currently still testing so functionality may be rough or incomplete in some places. Please be understanding. (The adblocking feature is no longer functional, and no fixes are currently planned.)\n// @description:zh-TW       是否曾渴望擁有 Premium，卻又覺得正版太過美好？別擔心，這個腳本會將那魯蛇般的普通標誌替換為 Premium 圖示，讓你和你的朋友們誤以為你比實際上更有錢。目前仍在測試階段，因此部分功能可能會不穩定或不完整，請多見諒。（廣告攔截功能已失效，且目前暫無後續的修復安排。）\n// @description:zh-CN       是否曾渴望拥有 Premium，却又觉得正版太过美好？别担心，这个脚本会将那有些寒酸的普通标志替换为 Premium 图标，让你和你的朋友们误以为你比实际上更有钱。目前仍在测试阶段，因此部分功能可能会不稳定或不完整，请多见谅。（广告拦截功能已失效，目前暂无后续的修复安排。）\n// @description:ja          Premium が欲しいけど、本物は立派すぎて手が出せないと思ったことはありませんか？ご心配なく。このスクリプトは、あの負け犬っぽい普通のロゴを Premium のロゴに置き換え、あなたや友達に「実は金持ちなんじゃないか」と勘違いさせることができます。現在まだテスト中のため、一部の機能が不安定であったり、不完全な場合があります。ご了承ください。(広告ブロック機能はすでに利用できなくなっており、現在のところ修正対応の予定はありません。)\n// @downloadURL https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.user.js\n// @updateURL https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773566015523e+12,"matches":["*://m.youtube.com/*","*://www.youtube.com/*"],"name":"YouTube Premium Lite² [Beta]","name_i18n":{"ja":"YouTube Premium Lite² [ベータ版]","zh_CN":"YouTube Premium Lite² [Beta 测试版]","zh_TW":"YouTube Premium Lite² [Beta 測試版]"},"namespace":"electroknight22_youtube_premium_lite_squared_namespace","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://www.youtube.com/live_chat*"],"orig_includes":[],"orig_matches":["*://m.youtube.com/*","*://www.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/541424/","unsafe_url":"https://update.greasyfork.org/scripts/549881/1717291/YouTube%20Helper%20API.js"}],"resources":[],"supportURL":null,"sync":{},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/1a2d1d00-0ca1-4a65-a397-f652ef1c6784"}},"updateURL":"https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.meta.js","uuid":"6cacb4e8-442d-4344-b28d-3aa05d312687","version":"0.5.3","webRequest":null}}/!extdb.@re#6cacb4e8-442d-4344-b28d-3aa05d312687‡{"origin":"normal","value":{"exc":["*://www.youtube.com/live_chat*"],"inc":[],"match":["*://m.youtube.com/*","*://www.youtube.com/*"]}}3!extdb.@source#6cacb4e8-442d-4344-b28d-3aa05d312687ó¦{"origin":"normal","value":"// ==UserScript==\n// @name                    YouTube Premium Lite² [Beta]\n// @name:zh-TW              YouTube Premium Lite² [Beta 測試版]\n// @name:zh-CN              YouTube Premium Lite² [Beta 测试版]\n// @name:ja                 YouTube Premium Lite² [ベータ版]\n// @icon                    https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @author                  ElectroKnight22\n// @namespace               electroknight22_youtube_premium_lite_squared_namespace\n// @version                 0.5.3\n// @match                   *://m.youtube.com/*\n// @match                   *://www.youtube.com/*\n// @exclude                 *://www.youtube.com/live_chat*\n// @require                 https://update.greasyfork.org/scripts/549881/1717291/YouTube%20Helper%20API.js\n// @grant                   none\n// @run-at                  document-idle\n// @inject-into             page\n// @license                 MIT\n// @description             Have you ever wanted Premium but think that the real thing is too good? Worry not, this script replaces the loser normal logo with the premium one, tricking you and your friends into thinking you are richer than you really are. Currently still testing so functionality may be rough or incomplete in some places. Please be understanding. (The adblocking feature is no longer functional, and no fixes are currently planned.)\n// @description:zh-TW       是否曾渴望擁有 Premium，卻又覺得正版太過美好？別擔心，這個腳本會將那魯蛇般的普通標誌替換為 Premium 圖示，讓你和你的朋友們誤以為你比實際上更有錢。目前仍在測試階段，因此部分功能可能會不穩定或不完整，請多見諒。（廣告攔截功能已失效，且目前暫無後續的修復安排。）\n// @description:zh-CN       是否曾渴望拥有 Premium，却又觉得正版太过美好？别担心，这个脚本会将那有些寒酸的普通标志替换为 Premium 图标，让你和你的朋友们误以为你比实际上更有钱。目前仍在测试阶段，因此部分功能可能会不稳定或不完整，请多见谅。（广告拦截功能已失效，目前暂无后续的修复安排。）\n// @description:ja          Premium が欲しいけど、本物は立派すぎて手が出せないと思ったことはありませんか？ご心配なく。このスクリプトは、あの負け犬っぽい普通のロゴを Premium のロゴに置き換え、あなたや友達に「実は金持ちなんじゃないか」と勘違いさせることができます。現在まだテスト中のため、一部の機能が不安定であったり、不完全な場合があります。ご了承ください。(広告ブロック機能はすでに利用できなくなっており、現在のところ修正対応の予定はありません。)\n// @downloadURL https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.user.js\n// @updateURL https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.meta.js\n// ==/UserScript==\n\n/*jshint esversion: 11 */\n/* global youtubeHelperApi */\n\n(function () {\n    const api = youtubeHelperApi;\n    if (!api) return;\n\n    // api.debug.enabled = true;\n    // api.debug.level = 'detailed';\n\n    const BLOCK_INJECTED_VIDEO_PROMOTIONS = false;\n\n    let state = {\n        isFixing: false,\n        container: null,\n        observer: null,\n        forceFullRecalc: false,\n    };\n\n    function setPremiumLogo() {\n        const logoLight =\n            \"data:image/svg+xml,%3Csvg xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns%23' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns%23' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' id='SVGRoot' version='1.1' viewBox='0 0 846 174' height='80px' width='391px'%3E%3Cdefs id='defs855'%3E%3Cstyle id='style2' /%3E%3C/defs%3E%3Cmetadata id='metadata858'%3E%3Crdf:RDF%3E%3Ccc:Work rdf:about=''%3E%3Cdc:format%3Eimage/svg+xml%3C/dc:format%3E%3Cdc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage' /%3E%3Cdc:title%3E%3C/dc:title%3E%3C/cc:Work%3E%3C/rdf:RDF%3E%3C/metadata%3E%3Cg id='layer1'%3E%3Cg transform='translate(0,0.36)'�ÚÈ~C data-name='Layer 2' id='Layer_2'%3E%3Cg data-name='Layer 1' id='Layer_1-2'%3E%3Cpath style='fill:%23ff0000' id='path6' d='M 242.88,27.11 A 31.07,31.07 0 0 0 220.95,5.18 C 201.6,0 124,0 124,0 124,0 46.46,0 27.11,5.18 A 31.07,31.07 0 0 0 5.18,27.11 C 0,46.46 0,86.82 0,86.82 c 0,0 0,40.36 5.18,59.71 a 31.07,31.07 0 0 0 21.93,21.93 c 19.35,5.18 96.92,5.18 96.92,5.18 0,0 77.57,0 96.92,-5.18 a 31.07,31.07 0 0 0 21.93,-21.93 c 5.18,-19.35 5.18,-59.71 5.18,-59.71 0,0 0,-40.36 -5.18,-59.71 z' /%3E%3Cpath style='fill:%23ffffff' id='path8' d='M 99.22,124.03 163.67,86.82 99.22,49.61 Z' /%3E%3Cpath style='fill:%23282828' id='path10' d='m 358.29,55.1 v 6 c 0,30 -13.3,47.53 -42.39,47.53 h -4.43 v 52.5 H 287.71 V 12.36 H 318 c 27.7,0 40.29,11.71 40.29,42.74 z m -25,2.13 c 0,-21.64 -3.9,-26.78 -17.38,-26.78 h -4.43 v 60.48 h 4.08 c 12.77,0 17.74,-9.22 17.74,-29.26 z m 81.22,-6.56 -1.24,28.2 c -10.11,-2.13 -18.45,-0.53 -22.17,6 v 76.26 H 367.52 V 52.44 h 18.8 L 388.45,76 h 0.89 c 2.48,-17.2 10.46,-25.89 20.75,-25.89 a 22.84,22.84 0 0 1 4.42,0.56 z M 441.64,115 v 5.5 c 0,19.16 1.06,25.72 9.22,25.72 7.8,0 9.58,-6 9.75,-18.44 l 21.1,1.24 c 1.6,23.41 -10.64,33.87 -31.39,33.87 -25.18,0 -32.63,-16.49 -32.63,-46.46 v -19 c 0,-31.57 8.34,-47 33.34,-47 25.18,0 31.57,13.12 31.57,45.93 V 115 Z m 0,-22.35 v 7.8 h 17.91 V 92.7 c 0,-20 -1.42,-25.72 -9,-25.72 -7.58,0 -8.91,5.86 -8.91,25.72 z M 604.45,79 v 82.11 H 580 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8.16,2.48 -10.82,7.09 a 35.59,35.59 0 0 1 0.18,4.43 v 82.11 H 537.24 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8,2.48 -10.64,6.92 v 86.72 H 494.5 V 52.44 h 19.33 L 516,66.28 h 0.35 c 5.5,-10.46 14.37,-16.14 24.83,-16.14 10.29,0 16.14,5.14 18.8,14.37 5.68,-9.4 14.19,-14.37 23.94,-14.37 14.86,0 20.53,10.64 20.53,28.86 z m 12.24,-54.4 c 0,-11.71 4.26,-15.07 13.3,-15.07 9.22,0 13.3,3.9 13.3,15.07 0,12.06 -4.08,15.08 -13.3,15.08 -9.04,-0.01 -13.3,-3.02 -13.3,-15.08 z m 1.42,27.84 h 23.41 v 108.72 h -23.41 z m 103.39,0 v 108.72 h -19.15 l -2.13,-13.3 h -0.53 c -5.5,10.64 -13.48,15.07 -23.41,15.07 -14.54,0 -21.11,-9.22 -21.11,-29.26 V 52.44 h 24.47 v 79.81 c 0,9.58 2,13.48 6.92,13.48 A 12.09,12.09 0 0 0 697,138.81 V 52.44 Z M 845.64,79 v 82.11 H 821.17 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8.16,2.48 -10.82,7.09 A 35.59,35.59 0 0 1 802.9,79 v 82.11 H 778.43 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8,2.48 -10.64,6.92 v 86.72 H 735.69 V 52.44 H 755 l 2.13,13.83 h 0.35 c 5.5,-10.46 14.37,-16.14 24.83,-16.14 10.29,0 16.14,5.14 18.8,14.37 5.68,-9.4 14.19,-14.37 23.94,-14.37 14.95,0.01 20.59,10.65 20.59,28.87 z' /%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A\";\n\n        const logoDark =\n            \"data:image/svg+xml,%3Csvg xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns%23' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns%23' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' id='SVGRoot' version='1.1' viewBox='0 0 846 174' height='24px' width='98px'%3E%3Cdefs id='defs855'%3E%3Cstyle id='style2' /%3E%3C/defs%3E%3Cmetadata id='metadata858'%3E%3Crdf:RDF%3E%3Ccc:Work rdf:about=''%3E%3Cdc:format%3Eimage/svg+xml%3C/dc:format%3E%3Cdc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage' /%3E%3Cdc:title%3E%3C/dc:title%3E%3C/cc:Work%3E%3C/rdf:RDF%3E%3C/metadata%3E%3Cg id='layer1'%3E%3Cg transform='translate(0,0.36)' data-name='Layer 2' id='Layer_2'%3E%3Cg data-name='Layer 1' id='Layer_1-2'%3E%3Cpath style='fill:%23ff0000' id='path6' d='M 242.88,27.11 A 31.07,31.07 0 0 0 220.95,5.18 C 201.6,0 124,0 124,0 124,0 46.46,0 27.11,5.18 A 31.07,31.07 0 0 0 5.18,27.11 C 0,46.46 0,86.82 0,86.82 c 0,0 0,40.36 5.18,59.71 a 31.07,31.07 0 0 0 21.93,21.93 c 19.35,5.18 96.92,5.18 96.92,5.18 0,0 77.57,0 96.92,-5.18 a 31.07,31.07 0 0 0 21.93,-21.93 c 5.18,-19.35 5.18,-59.71 5.18,-59.71 0,0 0,-40.36 -5.18,-59.71 z' /%3E%3Cpath style='fill:%23ffffff' id='path8' d='M 99.22,124.03 163.67,86.82 99.22,49.61 Z' /%3E%3Cpath style='fill:%23ffffff' id='path10' d='m 358.29,55.1 v 6 c 0,30 -13.3,47.53 -42.39,47.53 h -4.43 v 52.5 H 287.71 V 12.36 H 318 c 27.7,0 40.29,11.71 40.29,42.74 z m -25,2.13 c 0,-21.64 -3.9,-26.78 -17.38,-26.78 h -4.43 v 60.48 h 4.08 c 12.77,0 17.74,-9.22 17.74,-29.26 z m 81.22,-6.56 -1.24,28.2 c -10.11,-2.13 -18.45,-0.53 -22.17,6 v 76.26 H 367.52 V 52.44 h 18.8 L 388.45,76 h 0.89 c 2.48,-17.2 10.46,-25.89 20.75,-25.89 a 22.84,22.84 0 0 1 4.42,0.56 z M 441.64,115 v 5.5 c 0,19.16 1.06,25.72 9.22,25.72 7.8,0 9.58,-6 9.75,-18.44 l 21.1,1.24 c 1.6,23.41 -10.64,33.87 -31.39,33.87 -25.18,0 -32.63,-16.49 -32.63,-46.46 v -19 c 0,-31.57 8.34,-47 33.34,-47 25.18,0 31.57,13.12 31.57,45.93 V 115 Z m 0,-22.35 v 7.8 h 17.91 V 92.7 c 0,-20 -1.42,-25.72 -9,-25.72 -7.58,0 -8.91,5.86 -8.91,25.72 z M 604.45,79 v 82.11 H 580 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8.16,2.48 -10.82,7.09 a 35.59,35.59 0 0 1 0.18,4.43 v 82.11 H 537.24 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8,2.48 -10.64,6.92 v 86.72 H 494.5 V 52.44 h 19.33 L 516,66.28 h 0.35 c 5.5,-10.46 14.37,-16.14 24.83,-16.14 10.29,0 16.14,5.14 18.8,14.37 5.68,-9.4 14.19,-14.37 23.94,-14.37 14.86,0 20.53,10.64 20.53,28.86 z m 12.24,-54.4 c 0,-11.71 4.26,-15.07 13.3,-15.07 9.22,0 13.3,3.9 13.3,15.07 0,12.06 -4.08,15.08 -13.3,15.08 -9.04,-0.01 -13.3,-3.02 -13.3,-15.08 z m 1.42,27.84 h 23.41 v 108.72 h -23.41 z m 103.39,0 v 108.72 h -19.15 l -2.13,-13.3 h -0.53 c -5.5,10.64 -13.48,15.07 -23.41,15.07 -14.54,0 -21.11,-9.22 -21.11,-29.26 V 52.44 h 24.47 v 79.81 c 0,9.58 2,13.48 6.92,13.48 A 12.09,12.09 0 0 0 697,138.81 V 52.44 Z M 845.64,79 v 82.11 H 821.17 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8.16,2.48 -10.82,7.09 A 35.59,35.59 0 0 1 802.9,79 v 82.11 H 778.43 V 80.82 c 0,-8.87 -2.31,-13.3 -7.63,-13.3 -4.26,0 -8,2.48 -10.64,6.92 v 86.72 H 735.69 V 52.44 H 755 l 2.13,13.83 h 0.35 c 5.5,-10.46 14.37,-16.14 24.83,-16.14 10.29,0 16.14,5.14 18.8,14.37 5.68,-9.4 14.19,-14.37 23.94,-14.37 14.95,0.01 20.59,10.65 20.59,28.87 z' /%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A\";\n\n        const premiumLogoCss = `\n            :root {\n                --logo-light-theme: url(\"${logoLight}\");\n                --logo-dark-theme: url(\"${logoDark}\");\n            }\n\n            #logo-container .logo,\n            .footer-logo-icon,\n            #logo-icon,\n            #logo-icon-container {\n                width: 98px !important;\n                content: var(--logo-light-theme) !important;\n            }\n\n            html[dark] #logo-icon,\n            html[dark] #logo-icon-container {\n                content: var(--logo-dark-theme) !important;\n            }\n        `;\n\n        const premiumLogoStyleNode = document.createElement('style');\n        premiumLogoStyleNode.textContent = premiumLogoCss;\n        document.head.appendChild(premiumLogoStyleNode);\n    }\n\n    function setAdBlockingStyles() {\n        const promoRefuserCss = `\n            #ad-created,\n            .player-ads,\n            #ytd-in-feed-ad-layout-renderer,\n            ytd-in-feed-ad-layout-renderer,\n            ytd-banner-promo-renderer,\n            ytd-ad-slot-renderer,\n            ytd-rich-item-renderer:has(ytd-ad-slot-renderer),\n            ytd-rich-item-renderer:has(ytd-in-feed-ad-layout-renderer),\n            .ytd-ad-slot-renderer,\n            yt-mealbar-promo-renderer,\n            ytd-engagement-panel-section-list-renderer[target-id='engagement-panel-ads'],\n            ytd-player-legacy-desktop-watch-ads-renderer,\n            ytd-single-option-survey-renderer,\n            .video-ads.ytp-ad-module,\n            .html5-video-player.ad-showing video,\n            .html5-video-player.ad-interrupting video,\n            .ytp-ad-persistent-progress-bar-container,\n            .ytp-ad-persistent-progress-bar,\n            .ad-interrupting .ytp-play-progress.ytp-swatch-background-color {\n                display: none !important;\n            }\n        `;\n\n        const promoRefuserStyleNode = document.createElement('style');\n        promoRefuserStyleNode.textContent = promoRefuserCss;\n        document.head.appendChild(promoRefuserStyleNode);\n    }\n\n    function setCustomGridStyles() {\n        const gridCss = `\n            ytd-rich-item-renderer[rendered-from-rich-grid][is-in-first-column] {\n                margin-left: calc(var(--ytd-rich-grid-item-margin) / 2) !important;\n            }\n            ytd-rich-item-renderer[rendered-from-rich-grid][data-is-first-col=\"true\"] {\n                margin-left: calc(var(--ytd-rich-grid-item-margin) / 2 + var(--ytd-rich-grid-gutter-margin)) !important;\n            }\n            ytd-rich-grid-renderer ytd-continuation-item-renderer {\n                transform: translateY(-1500px);\n                pointer-events: none;\n                opacity: 0;\n            }\n        `;\n        const styleNode = document.createElement('style');\n        styleNode.textContent = gridCss;\n        document.head.appendChild(styleNode);\n    }\n\n    function invalidateCache() {\n        if (state.observer) {\n            state.observer.disconnect();\n            state.observer = null;\n        }\n        state.container = null;\n    }\n\n    function isNodeVisible(node) {\n        return node.offsetWidth > 0 && node.offsetHeight > 0 && getComputedStyle(node).display !== 'none';\n    }\n\n    function fixHomepageLayout() {\n        if (window.location.pathname !== '/') return;\n        if (state.isFixing) return;\n\n        try {\n            state.isFixing = true;\n\n            if (!state.container || !state.container.isConnected) {\n                const beacon = document.querySelector('ytd-rich-item-renderer');\n                if (!beacon) return (state.isFixing = false);\n                state.container = beacon.parentElement;\n\n                state.observer = new MutationObserver(() => {\n                    if (!state.isFixing) runLayoutFix();\n                });\n                state.observer.observe(state.container, { childList: true });\n            }\n\n            const beacon = state.container.querySelector('ytd-rich-item-renderer');\n            if (!beacon) return (state.isFixing = false);\n\n            const rawItemsPerRow = beacon.getAttribute('items-per-row') || beacon.style.getPropertyValue('--ytd-rich-grid-items-per-row');\n            const itemsPerRow = parseInt(rawItemsPerRow, 10);\n\n            if (!itemsPerRow || isNaN(itemsPerRow)) return (state.isFixing = false);\n\n            const shelves = Array.from(state.container.querySelectorAll('ytd-rich-section-renderer'));\n\n            shelves.forEach((shelf) => {\n                const rect = shelf.getBoundingClientRect();\n\n                if (!state.forceFullRecalc && rect.bottom \u003C -500) return;\n\n                let visibleCount = 0;\n                let sibling = shelf.previousElementSibling;\n\n                while (sibling) {\n                    if (sibling.tagName.toLowerCase() === 'ytd-rich-section-renderer') break;\n                    if (sibling.tagName.toLowerCase() === 'ytd-rich-item-renderer' && isNodeVisible(sibling)) {\n                        visibleCount++;\n                    }\n                    sibling = sibling.previousElementSibling;\n                }\n\n                const remainder = visibleCount % itemsPerRow;\n                const needed = remainder === 0 ? 0 : itemsPerRow - remainder;\n\n                if (needed > 0) {\n                    const itemsToMove = [];\n                    let candidate = shelf.nextElementSibling;\n                    let guard = 0;\n\n                    while (candidate && itemsToMove.length \u003C needed && guard \u003C 50) {\n                        guard++;\n                        const isShelf = candidate.tagName.toLowerCase() === 'ytd-rich-section-renderer';\n                        const isItem = candidate.tagName.toLowerCase() === 'ytd-rich-item-renderer';\n\n                        if (isShelf) break;\n                        if (!candidate.nextElementSibling && !isShelf) break;\n\n                        if (isItem && isNodeVisible(candidate)) itemsToMove.push(candidate);\n                        candidate = candidate.nextElementSibling;\n                    }\n\n                    if (itemsToMove.length > 0) {\n                        itemsToMove.forEach((item) => state.container.insertBefore(item, shelf));\n                    }\n                }\n            });\n\n            const children = state.container.children;\n            const updates = [];\n\n            let visualColumn = 0;\n\n            for (let i = 0; i \u003C children.length; i++) {\n                const child = children[i];\n                const tagName = child.tagName.toLowerCase();\n\n                if (!isNodeVisible(child)) continue;\n\n                if (tagName === 'ytd-rich-section-renderer') {\n                    if (visualColumn > 0) visualColumn = 0;\n                    continue;\n                }\n\n                if (tagName === 'ytd-rich-item-renderer') {\n                    const isFirstColumn = visualColumn === 0;\n                    const currentlyFirst = child.getAttribute('data-is-first-col') === 'true';\n\n                    if (isFirstColumn && !currentlyFirst) {\n                        updates.push({ node: child, val: 'true' });\n                    } else if (!isFirstColumn && currentlyFirst) {\n                        updates.push({ node: child, val: 'false' });\n                    }\n\n                    visualColumn++;\n                    if (visualColumn >= itemsPerRow) visualColumn = 0;\n                }\n            }\n\n            for (const update of updates) {\n                if (update.val === 'true') {\n                    update.node.setAttribute('data-is-first-col', 'true');\n                } else {\n                    update.node.removeAttribute('data-is-first-col');\n                }\n            }\n        } catch (error) {\n            console.error('[YouTube Premium Lite²] Layout Fix Error:', error);\n        } finally {\n            state.isFixing = false;\n            state.forceFullRecalc = false;\n        }\n    }\n\n    const runLayoutFix = debounce(fixHomepageLayout, 50);\n\n    let visibilityLock = 0;\n    function fakePageInactive(isInactive) {\n        if (isInactive) {\n            if (++visibilityLock > 1) return;\n            document.hasFocus = () => false;\n            Object.defineProperty(document, 'hidden', { value: true, configurable: true, writable: true });\n            Object.defineProperty(document, 'visibilityState', { value: 'hidden', configurable: true, writable: true });\n            window.dispatchEvent(new Event('blur'));\n            document.dispatchEvent(new Event('visibilitychange'));\n        } else {\n            if (--visibilityLock > 0) return;\n            document.hasFocus = window.pageActivityOriginals.hasFocus;\n            delete document.hidden;\n            delete document.visibilityState;\n            window.dispatchEvent(new Event('focus'));\n            document.dispatchEvent(new Event('visibilitychange'));\n        }\n    }\n\n    function skipAd() {\n        if (!BLOCK_INJECTED_VIDEO_PROMOTIONS) return;\n        console.log('Detected ad. Skipping...');\n        const triggerAdSkip = () => {\n            api.video.isCurrentlyLive ? api.reloadVideo() : api.reloadToCurrentProgress();\n        };\n        fakePageInactive(true);\n        queueMicrotask(triggerAdSkip);\n        setTimeout(() => fakePageInactive(false), 200);\n    }\n\n    function debounce(func, delay) {\n        let timer = null;\n        return function () {\n            if (timer) clearTimeout(timer);\n            timer = setTimeout(() => func.apply(this, arguments), delay);\n        };\n    }\n\n    function handleWindowResize() {\n        state.forceFullRecalc = true;\n        runLayoutFix();\n    }\n\n    function storeBrowserVisibilityFunctions() {\n        if (!window.pageActivityOriginals) {\n            window.pageActivityOriginals = {\n                hasFocus: document.hasFocus,\n                hidden: Object.getOwnPropertyDescriptor(Document.prototype, 'hidden'),\n                visibilityState: Object.getOwnPropertyDescriptor(Document.prototype, 'visibilityState'),\n            };\n        }\n    }\n\n    function initialize() {\n        storeBrowserVisibilityFunctions();\n        setPremiumLogo();\n        setAdBlockingStyles();\n        setCustomGridStyles();\n        fixHomepageLayout();\n        document.addEventListener('yt-navigate-finish', invalidateCache);\n        document.addEventListener('yt-text-inline-expander-expanded-changed', runLayoutFix);\n        document.addEventListener('yt-request-elements-per-row', handleWindowResize);\n        document.addEventListener('resize', handleWindowResize);\n        document.addEventListener('onAdStart', () => console.log('test native ad start event'));\n        api.eventTarget.addEventListener('yt-helper-api-ad-detected', skipAd);\n    }\n\n    initialize();\n})();\n"}/!extdb.@st#6cacb4e8-442d-4344-b28d-3aa05d312687?{"origin":"normal","value":{"data":{},"ts":1.773566024193e+12}}0!extdb.@uid#6cacb4e8-442d-4344-b28d-3aa05d312687;{"origin":"normal","value":"YouTube Premium Lite² [Beta]"}^´àet<O          Q!extdb.@ext#6cacb4e8-442d-4344-b28d-3aa05d312687:9105fbccfda6dc23f0a93869f9550cb8°Ø{"origin":"normal","value":{"resource":{"base":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICBZb3VUdWJlIEhlbHBlciBBUEkKLy8gQGF1dGhvciAgICAgICAgICBFbGVjdHJvS25pZ2h0MjIKLy8gQG5hbWVzcGFjZSAgICAgICBlbGVjdHJva25pZ2h0MjJfaGVscGVyX2FwaV9uYW1lc3BhY2UKLy8gQHZlcnNpb24gICAgICAgICAwLjkuNQovLyBAbGljZW5zZSAgICAgICAgIE1JVAovLyBAZGVzY3JpcHRpb24gICAgIEEgaGVscGVyIGFwaSBmb3IgWW91VHViZSBzY3JpcHRzIHRoYXQgcHJvdmlkZXMgZWFzeSBhbmQgY29uc2lzdGVudCBhY2Nlc3MgZm9yIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbnMsIG9iamVjdHMsIGFuZCB2YWx1ZXMuCi8vID09L1VzZXJTY3JpcHQ9PQoKLypqc2hpbnQgZXN2ZXJzaW9uOiAxMSAqLwoKJ3VzZSBzdHJpY3QnOwoKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCmNvbnN0IHlvdXR1YmVIZWxwZXJBcGkgPSAoZnVuY3Rpb24gKCkgewogICAgLy8gLS0tIERFQlVHIFNZU1RFTSAtLS0KICAgIGNvbnN0IGRlYnVnID0gewogICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgIF9sZXZlbDogMSwKICAgICAgICBkZWJ1Z0JhZGdlVGV4dDogJ1lULUhlbHBlci1BUEktRGVidWcnLAoKICAgICAgICBzZXQgbGV2ZWwodmFsKSB7CiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHsgbWluaW1hbDogMCwgdHlwaWNhbDogMSwgZGV0YWlsZWQ6IDIsIGFsbDogMywgb3ZlcmtpbGw6IDQgfTsKCiAgICAgICAgICAgIGxldCB0YXJnZXRMZXZlbCA9IHZhbDsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50b0xvd2VyQ2FzZSgpIGluIG1hcCkgewogICAgICAgICAgICAgICAgdGFyZ2V0TGV2ZWwgPSBtYXBbdmFsLnRvTG93ZXJDYXNlKCldOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldExldmVsID09PSAnbnVtYmVyJyAmJiBPYmplY3QudmFsdWVzKG1hcCkuaW5jbHVkZXModGFyZ2V0TGV2ZWwpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sZXZlbCA9IHRhcmdldExldmVsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAgICAgICAgIGBbJHt0aGlzLmRlYnVnQmFkZ2VUZXh0fV0gSW52YWxpZCBsZXZlbCAiJHt2YWx9Ii4gUGxlYXNlIHVzZSAwLTQgb3I6IG1pbmltYWwsIHR5cGljYWwsIGRldGFpbGVkLCBhbGwsIG92ZXJraWxsLmAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0IGxldmVsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0IGxvZ01pbmltYWwoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWQgJiYgdGhpcy5fbGV2ZWwgPj0gMAogICAgICAgICAgICAgICAgPyBjb25zb2xlLmxvZy5iaW5kKHdpbmRvdy5jb25zb2xlLCBgJWNbJHt0aGlzLmRlYnVnQmFkZ2VUZXh0fV1bTWluaW1hbF1gLCAnY29sb3I6ICMyOGE3NDU7IGZvbnQtd2VpZ2h0OiBib2xkOycpCiAgICAgICAgICAgICAgICA6ICgpID0+IHt9OwogICAgICAgIH0sCiAgICAgICAgZ2V0IGxvZ1R5cGljYWwoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWQgJiYgdGhpcy5fbGV2ZWwgPj0gMQogICAgICAgICAgICAgICAgPyBjb25zb2xlLmxvZy5iaW5kKHdpbmRvdy5jb25zb2xlLCBgJWNbJHt0aGlzLmRlYnVnQmFkZ2VUZXh0fV1bVHlwaWNhbF1gLCAnY29sb3I6ICMwMDdiZmY7IGZvbnQtd2VpZ2h0OiBib2xkOycpCiAgICAgICAgICAgICAgICA6ICgpID0+IHt9OwogICAgICAgIH0sCiAgICAgICAgZ2V0IGxvZ0RldGFpbGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkICYmIHRoaXMuX2xldmVsID49IDIKICAgICAgICAgICAgICAgID8gY29uc29sZS5sb2cuYmluZCh3aW5kb3cuY29uc29sZSwgYCVjWyR7dGhpcy5kZWJ1Z0JhZGdlVGV4dH1dW0RldGFpbGVkXWAsICdjb2xvcjogIzE3YTJiODsgZm9udC13ZWlnaHQ6IGJvbGQ7JykKICAgICAgICAgICAgICAgIDogKCkgPT4ge307CiAgICAgICAgfSwKICAgICAgICBnZXQgbG9nQWxsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkICYmIHRoaXMuX2xldmVsID49IDMKICAgICAgICAgICAgICAgID8gY29uc29sZS5sb2cuYmluZCh3aW5kb3cuY29uc29sZSwgYCVjWyR7dGhpcy5kZWJ1Z0JhZGdlVGV4dH1dW0FsbF1gLCAnY29sb3I6ICM2Yzc1N2Q7IGZvbnQtd2VpZ2h0OiBib2xkOycpCiAgICAgICAgICAgICAgICA6ICgpID0+IHt9OwogICAgICAgIH0sCiAgICAgICAgZ2V0IGxvZ092ZXJraWxsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkICYmIHRoaXMuX2xldmVsID49IDQKICAgICAgICAgICAgICAgID8gY29uc29sZS5sb2cuYmluZCh3aW5kb3cuY29uc29sZSwgYCVjWyR7dGhpcy5kZWJ1Z0JhZGdlVGV4dH1dW0FsbF1gLCAnY29sb3I6ICNjZTAwYThmZjsgZm9udC13ZWlnaHQ6IGJvbGQ7JykKICAgICAgICAgICAgICAgIDogKCkgPT4ge307CiAgICAgICAgfSwKICAgIH07CiAgICAvLyAtLS0gRU5EIERFQlVHIFNZU1RFTSAtLS0KCiAgICAvLyAtLS0gR00gQVBJIFNISU0gLS0tCiAgICBjb25zdCBnbUNhcGFiaWxpdGllcyA9IHsKICAgICAgICBpc01vZGVybjogZmFsc2UsCiAgICAgICAgaXNMZWdhY3k6IGZhbHNlLAogICAgICAgIGZlYXR1cmVzOiB7fSwKICAgIH07CgogICAgKGZ1bmN0aW9uIHBlcmZvcm1HbVNoaW0oKSB7CiAgICAgICAgY29uc3QgS05PV05fR01fR0xPQkFMUyA9IFsKICAgICAgICAgICAgJ3NldFZhbHVlJywKICAgICAgICAgICAgJ2dldFZhbHVlJywKICAgICAgICAgICAgJ2RlbGV0ZVZhbHVlJywKICAgICAgICAgICAgJ2xpc3RWYWx1ZXMnLAogICAgICAgICAgICAnZ2V0UmVzb3VyY2VUZXh0JywKICAgICAgICAgICAgJ2dldFJlc291cmNlVVJMJywKICAgICAgICAgICAgJ2FkZFN0eWxlJywKICAgICAgICAgICAgJ2FkZEVsZW1lbnQnLAogICAgICAgICAgICAncmVnaXN0ZXJNZW51Q29tbWFuZCcsCiAgICAgICAgICAgICd1bnJlZ2lzdGVyTWVudUNvbW1hbmQnLAogICAgICAgICAgICAnb3BlbkluVGFiJywKICAgICAgICAgICAgJ25vdGlmaWNhdGlvbicsCiAgICAgICAgICAgICdzZXRDbGlwYm9hcmQnLAogICAgICAgICAgICAnY29udGV4dE1lbnUnLAogICAgICAgICAgICAneG1saHR0cFJlcXVlc3QnLAogICAgICAgICAgICAnZG93bmxvYWQnLAogICAgICAgICAgICAnd2ViUmVxdWVzdCcsCiAgICAgICAgICAgICdjb29raWUnLAogICAgICAgICAgICAnc2F2ZVRhYicsCiAgICAgICAgICAgICdnZXRUYWInLAogICAgICAgICAgICAnZ2V0VGFicycsCiAgICAgICAgICAgICdsb2cnLAogICAgICAgICAgICAnaW5mbycsCiAgICAgICAgICAgICdwcmludCcsCiAgICAgICAgXTsKCiAgICAgICAgY29uc3QgcmVhbEdNID0gdHlwZW9mIEdNICE9PSAndW5kZWZpbmVkJyA/IEdNIDoge307CiAgICAgICAgY29uc3QgaXNNb2Rlcm5FbnYgPSB0eXBlb2YgR00gIT09ICd1bmRlZmluZWQnOwoKICAgICAgICBjb25zdCBjaGVja0ZlYXR1cmUgPSAobmFtZSkgPT4gewogICAgICAgICAgICBjb25zdCBsZWdhY3lOYW1lID0gYEdNXyR7bmFtZX1gOwogICAgICAgICAgICBjb25zdCBsZWdhY3lFeGlzdHMgPSB0eXBlb2Ygd2luZG93W2xlZ2FjeU5hbWVdICE9PSAndW5kZWZpbmVkJzsKICAgICAgICAgICAgY29uc3QgbW9kZXJuRXhpc3RzID0gaXNNb2Rlcm5FbnYgJiYgbmFtZSBpbiByZWFsR007CgogICAgICAgICAgICByZXR1cm4gbGVnYWN5RXhpc3RzIHx8IG1vZGVybkV4aXN0czsKICAgICAgICB9OwoKICAgICAgICBnbUNhcGFiaWxpdGllcy5pc01vZGVybiA9IGlzTW9kZXJuRW52OwoKICAgICAgICBnbUNhcGFiaWxpdGllcy5mZWF0dXJlcyA9IHsKICAgICAgICAgICAgc3RvcmFnZTogY2hlY2tGZWF0dXJlKCdzZXRWYWx1ZScpLAogICAgICAgICAgICBtZW51OiBjaGVja0ZlYXR1cmUoJ3JlZ2lzdGVyTWVudUNvbW1hbmQnKSwKICAgICAgICAgICAgbmV0d29yazogY2hlY2tGZWF0dXJlKCd4bWxodHRwUmVxdWVzdCcpIHx8IChpc01vZGVybkVudiAmJiAneG1sSHR0cFJlcXVlc3QnIGluIHJlYWxHTSksCiAgICAgICAgICAgIGNsaXBib2FyZDogY2hlY2tGZWF0dXJlKCdzZXRDbGlwYm9hcmQnKSwKICAgICAgICAgICAgdGFiczogY2hlY2tGZWF0dXJlKCdvcGVuSW5UYWInKSwKICAgICAgICAgICAgdWk6IGNoZWNrRmVhdHVyZSgnYWRkU3R5bGUnKSwKICAgICAgICB9OwoKICAgICAgICBjb25zdCBHTUZhbGxiYWNrQXN5bmMgPSBhc3luYyAoLi4uYXJncykgPT4gewogICAgICAgICAgICBkZWJ1Zy5sb2dBbGwoJ0dNLiogKEFzeW5jKSBjYWxsIHNoaW1tZWQ6JywgYXJncyk7CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBHTUZhbGxiYWNrU3luYyA9ICguLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGRlYnVnLmxvZ0FsbCgnR01fKiAoU3luYykgY2FsbCBzaGltbWVkOicsIGFyZ3MpOwogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CgogICAgICAgIGNvbnN0IGdtUHJveHlIYW5kbGVyID0gewogICAgICAgICAgICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKSkgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpOwogICAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICdpbmZvJykgcmV0dXJuIHsgc2NyaXB0OiB7IHZlcnNpb246ICcwLjAuMCcgfSwgc2NyaXB0SGFuZGxlcjogJ1NoaW0nLCB2ZXJzaW9uOiAnMC4wLjAnIH07CiAgICAgICAgICAgICAgICByZXR1cm4gR01GYWxsYmFja0FzeW5jOwogICAgICAgICAgICB9LAogICAgICAgIH07CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHdpbmRvdy5HTSA9IG5ldyBQcm94eShyZWFsR00sIGdtUHJveHlIYW5kbGVyKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tZb3VUdWJlIEhlbHBlciBBUEldIEZhaWxlZCB0byBwYXRjaCB3aW5kb3cuR00nLCBlcnJvcik7CiAgICAgICAgfQoKICAgICAgICBLTk9XTl9HTV9HTE9CQUxTLmZvckVhY2goKG5hbWUpID0+IHsKICAgICAgICAgICAgY29uc3Qga2V5ID0gYEdNXyR7bmFtZX1gOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvd1trZXldICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgZ21DYXBhYmlsaXRpZXMuaXNMZWdhY3kgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgd2luZG93W2tleV0gPSBuYW1lID09PSAnaW5mbycgPyB7IHNjcmlwdDogeyB2ZXJzaW9uOiAnMC4wLjAnIH0sIHNjcmlwdEhhbmRsZXI6ICdTaGltJyB9IDogR01GYWxsYmFja1N5bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pKCk7CiAgICAvLyAtLS0gR00gQVBJIFNISU0gRU5EIC0tLQoKICAgIGNvbnN0IHByaXZhdGVFdmVudFRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpOwoKICAgIGNvbnN0IFNFTEVDVE9SUyA9IHsKICAgICAgICBwYWdlTWFuYWdlcjogJ3l0ZC1wYWdlLW1hbmFnZXInLAogICAgICAgIHNob3J0c1BsYXllcjogJyNzaG9ydHMtcGxheWVyJywKICAgICAgICB3YXRjaFBsYXllcjogJyNtb3ZpZV9wbGF5ZXInLAogICAgICAgIGlubGluZVBsYXllcjogJy5pbmxpbmUtcHJldmlldy1wbGF5ZXInLAogICAgICAgIHZpZGVvRWxlbWVudDogJ3ZpZGVvJywKICAgICAgICB3YXRjaEZsZXh5OiAneXRkLXdhdGNoLWZsZXh5JywKICAgICAgICBjaGF0RnJhbWU6ICd5dGQtbGl2ZS1jaGF0LWZyYW1lI2NoYXQnLAogICAgICAgIGNoYXRDb250YWluZXI6ICcjY2hhdC1jb250YWluZXInLAogICAgfTsKCiAgICBjb25zdCBQT1NTSUJMRV9SRVNPTFVUSU9OUyA9IE9iamVjdC5mcmVlemUoewogICAgICAgIGhpZ2hyZXM6IHsgcDogNDMyMCwgbGFiZWw6ICc4SycgfSwKICAgICAgICBoZDIxNjA6IHsgcDogMjE2MCwgbGFiZWw6ICc0SycgfSwKICAgICAgICBoZDE0NDA6IHsgcDogMTQ0MCwgbGFiZWw6ICcxNDQwcCcgfSwKICAgICAgICBoZDEwODA6IHsgcDogMTA4MCwgbGFiZWw6ICcxMDgwcCcgfSwKICAgICAgICBoZDcyMDogeyBwOiA3MjAsIGxhYmVsOiAnNzIwcCcgfSwKICAgICAgICBsYXJnZTogeyBwOiA0ODAsIGxhYmVsOiAnNDgwcCcgfSwKICAgICAgICBtZWRpdW06IHsgcDogMzYwLCBsYWJlbDogJzM2MHAnIH0sCiAgICAgICAgc21hbGw6IHsgcDogMjQwLCBsYWJlbDogJzI0MHAnIH0sCiAgICAgICAgdGlueTogeyBwOiAxNDQsIGxhYmVsOiAnMTQ0cCcgfSwKICAgIH0pOwoKICAgIGNvbnN0IGFwaVByb3h5ID0gbmV3IFByb3h5KAogICAgICAgIHt9LAogICAgICAgIHsKICAgICAgICAgICAgZ2V0KHRhcmdldCwgcHJvcGVydHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLmFwaSkgcmV0dXJuIGNvbnNvbGUud2FybihgWW91VHViZSBwbGF5ZXIgQVBJIG5vdCByZWFkeS5gKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFwcFN0YXRlLnBsYXllci5hcGlbcHJvcGVydHldID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBTdGF0ZS5wbGF5ZXIuYXBpW3Byb3BlcnR5XSguLi5hcmdzKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1ldGhvZCAiJHtwcm9wZXJ0eX0iIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBZb3VUdWJlIHBsYXllciBBUEkuYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICBjb25zdCBfcmVhZE9ubHlIYW5kbGVyID0gewogICAgICAgIGdldCh0YXJnZXQsIHByb3BlcnR5KSB7CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcGVydHldOwogICAgICAgIH0sCiAgICAgICAgc2V0KHRhcmdldCwgcHJvcGVydHkpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKGBbWW91VHViZSBIZWxwZXIgQVBJXSBUcmllZCB0byBzZXQgIiR7cHJvcGVydHl9IiBvbiBhIHJlYWQtb25seSBvYmplY3QuYCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAogICAgfTsKCiAgICBjb25zdCBhcHBTdGF0ZSA9IHsKICAgICAgICBwbGF5ZXI6IHsKICAgICAgICAgICAgcGxheWVyT2JqZWN0OiBudWxsLAogICAgICAgICAgICByZXNwb25zZTogbnVsbCwKICAgICAgICAgICAgYXBpOiBudWxsLAogICAgICAgICAgICB2aWRlb0VsZW1lbnQ6IG51bGwsCiAgICAgICAgICAgIGlzRnVsbHNjcmVlbjogZmFsc2UsCiAgICAgICAgICAgIGlzVGhlYXRlcjogZmFsc2UsCiAgICAgICAgICAgIGlzUGxheWluZ0FkczogZmFsc2UsCiAgICAgICAgfSwKICAgICAgICB2aWRlbzogewogICAgICAgICAgICBpZDogJycsCiAgICAgICAgICAgIHRpdGxlOiAnJywKICAgICAgICAgICAgY2hhbm5lbDogJycsCiAgICAgICAgICAgIGNoYW5uZWxJZDogJycsCiAgICAgICAgICAgIHJhd0Rlc2NyaXB0aW9uOiAnJywKICAgICAgICAgICAgcmF3VXBsb2FkRGF0ZTogJycsCiAgICAgICAgICAgIHJhd1B1Ymxpc2hEYXRlOiAnJywKICAgICAgICAgICAgdXBsb2FkRGF0ZTogbnVsbCwKICAgICAgICAgICAgcHVibGlzaERhdGU6IG51bGwsCiAgICAgICAgICAgIGxlbmd0aFNlY29uZHM6IDAsCiAgICAgICAgICAgIHZpZXdDb3VudDogMCwKICAgICAgICAgICAgbGlrZUNvdW50OiAwLAogICAgICAgICAgICBpc0N1cnJlbnRseUxpdmU6IGZhbHNlLAogICAgICAgICAgICBpc0xpdmVPclZvZENvbnRlbnQ6IGZhbHNlLAogICAgICAgICAgICBpc0ZhbWlseVNhZmU6IGZhbHNlLAogICAgICAgICAgICB0aHVtYm5haWxzOiBbXSwKICAgICAgICAgICAgcGxheWluZ0xhbmd1YWdlOiBudWxsLAogICAgICAgICAgICBvcmlnaW5hbExhbmd1YWdlOiBudWxsLAogICAgICAgICAgICBpc0F1dG9EdWJiZWQ6IGZhbHNlLAogICAgICAgICAgICByZWFsQ3VycmVudFByb2dyZXNzOiAwLAogICAgICAgICAgICBpc1RpbWVTcGVjaWZpZWQ6IGZhbHNlLAogICAgICAgICAgICBpc0luUGxheWxpc3Q6IGZhbHNlLAogICAgICAgICAgICBwbGF5bGlzdElkOiAnJywKICAgICAgICB9LAogICAgICAgIGNoYXQ6IHsKICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLAogICAgICAgICAgICBpRnJhbWU6IG51bGwsCiAgICAgICAgICAgIGlzQ29sbGFwc2VkOiBmYWxzZSwKICAgICAgICB9LAogICAgICAgIHBhZ2U6IG51bGwsIC8vIFdpbGwgYmUgcG9wdWxhdGVkIGJ5IHRoZSBJSUZFIGJlbG93CiAgICB9OwoKICAgIGFwcFN0YXRlLnBhZ2UgPSAoKCkgPT4gewogICAgICAgIGNvbnN0IF9mYWxsYmFja0dldFBhZ2VUeXBlID0gKCkgPT4gewogICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9zaG9ydHMnKSkgcmV0dXJuICdzaG9ydHMnOwogICAgICAgICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aCgnL3dhdGNoJykpIHJldHVybiAnd2F0Y2gnOwogICAgICAgICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aCgnL3BsYXlsaXN0JykpIHJldHVybiAncGxheWxpc3QnOwogICAgICAgICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aCgnL3Jlc3VsdHMnKSkgcmV0dXJuICdzZWFyY2gnOwogICAgICAgICAgICBpZiAocGF0aG5hbWUgPT09ICcvJykgcmV0dXJuICdicm93c2UnOwogICAgICAgICAgICByZXR1cm4gJ3Vua25vd24nOwogICAgICAgIH07CgogICAgICAgIGxldCBfdHlwZSA9ICd1bmtub3duJzsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBnZXQgbWFuYWdlcigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SUy5wYWdlTWFuYWdlcik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldCB3YXRjaEZsZXh5KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JTLndhdGNoRmxleHkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBpc0lmcmFtZTogd2luZG93LnRvcCAhPT0gd2luZG93LnNlbGYsCiAgICAgICAgICAgIGlzTW9iaWxlOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT09ICdtLnlvdXR1YmUuY29tJywKICAgICAgICAgICAgc2V0IHR5cGUobmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgIF90eXBlID0gbmV3VmFsdWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldCB0eXBlKCkgewogICAgICAgICAgICAgICAgaWYgKF90eXBlID09PSAndW5rbm93bicgfHwgX3R5cGUgPT0gbnVsbCkgcmV0dXJuIF9mYWxsYmFja0dldFBhZ2VUeXBlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gX3R5cGU7CiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgY29uc3QgcmVhZE9ubHlQbGF5ZXIgPSBuZXcgUHJveHkoYXBwU3RhdGUucGxheWVyLCBfcmVhZE9ubHlIYW5kbGVyKTsKICAgIGNvbnN0IHJlYWRPbmx5VmlkZW8gPSBuZXcgUHJveHkoYXBwU3RhdGUudmlkZW8sIF9yZWFkT25seUhhbmRsZXIpOwogICAgY29uc3QgcmVhZE9ubHlDaGF0ID0gbmV3IFByb3h5KGFwcFN0YXRlLmNoYXQsIF9yZWFkT25seUhhbmRsZXIpOwogICAgY29uc3QgcmVhZE9ubHlQYWdlID0gbmV3IFByb3h5KGFwcFN0YXRlLnBhZ2UsIF9yZWFkT25seUhhbmRsZXIpOwoKICAgIGNvbnN0IGxvY2FsU3RvcmFnZUFwaSA9IHsKICAgICAgICBnZXQ6IChrZXksIGRlZmF1bHRWYWx1ZSkgPT4gewogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHBhcnNpbmcgSlNPTiBmb3Iga2V5ICIke2tleX0iOmAsIGVycm9yKTsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4gewogICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7CiAgICAgICAgfSwKICAgIH07CgogICAgY29uc3Qgc3RvcmFnZUFwaSA9ICgoKSA9PiB7CiAgICAgICAgY29uc3QgU1RPUkFHRV9JTVBMRU1FTlRBVElPTlMgPSB7CiAgICAgICAgICAgIG1vZGVybjogewogICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGFzeW5jICguLi5hcmdzKSA9PiBhd2FpdCBHTS5nZXRWYWx1ZSguLi5hcmdzKSwKICAgICAgICAgICAgICAgIHNldFZhbHVlOiBhc3luYyAoLi4uYXJncykgPT4gYXdhaXQgR00uc2V0VmFsdWUoLi4uYXJncyksCiAgICAgICAgICAgICAgICBkZWxldGVWYWx1ZTogYXN5bmMgKC4uLmFyZ3MpID0+IGF3YWl0IEdNLmRlbGV0ZVZhbHVlKC4uLmFyZ3MpLAogICAgICAgICAgICAgICAgbGlzdFZhbHVlczogYXN5bmMgKC4uLmFyZ3MpID0+IGF3YWl0IEdNLmxpc3RWYWx1ZXMoLi4uYXJncyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9sZDogewogICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGFzeW5jIChrZXksIGRlZmF1bHRWYWx1ZSkgPT4gR01fZ2V0VmFsdWUoa2V5LCBkZWZhdWx0VmFsdWUpLAogICAgICAgICAgICAgICAgc2V0VmFsdWU6IGFzeW5jIChrZXksIHZhbHVlKSA9PiBHTV9zZXRWYWx1ZShrZXksIHZhbHVlKSwKICAgICAgICAgICAgICAgIGRlbGV0ZVZhbHVlOiBhc3luYyAoa2V5KSA9PiBHTV9kZWxldGVWYWx1ZShrZXkpLAogICAgICAgICAgICAgICAgbGlzdFZhbHVlczogYXN5bmMgKCkgPT4gR01fbGlzdFZhbHVlcygpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBub25lOiB7CiAgICAgICAgICAgICAgICBnZXRWYWx1ZTogYXN5bmMgKGtleSwgZGVmYXVsdFZhbHVlKSA9PiBsb2NhbFN0b3JhZ2VBcGkuZ2V0KGtleSwgZGVmYXVsdFZhbHVlKSwKICAgICAgICAgICAgICAgIHNldFZhbHVlOiBhc3luYyAoa2V5LCB2YWx1ZSkgPT4gbG9jYWxTdG9yYWdlQXBpLnNldChrZXksIHZhbHVlKSwKICAgICAgICAgICAgICAgIGRlbGV0ZVZhbHVlOiBhc3luYyAoa2V5KSA9PiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpLAogICAgICAgICAgICAgICAgbGlzdFZhbHVlczogYXN5bmMgKCkgPT4gT2JqZWN0LmtleXMobG9jYWxTdG9yYWdlKSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgICAgIGNvbnN0IGdtU3RvcmFnZV±¶F¢pR5cGUgPSAoKCkgPT4gewogICAgICAgICAgICBpZiAoIWdtQ2FwYWJpbGl0aWVzLmZlYXR1cmVzLnN0b3JhZ2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdtQ2FwYWJpbGl0aWVzLmlzTW9kZXJuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ21vZGVybic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdtQ2FwYWJpbGl0aWVzLmlzTGVnYWN5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ29sZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdub25lJzsKICAgICAgICB9KSgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIC4uLlNUT1JBR0VfSU1QTEVNRU5UQVRJT05TW2dtU3RvcmFnZVR5cGVdLAogICAgICAgICAgICBnbVR5cGU6IGdtU3RvcmFnZVR5cGUsCiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgYXN5bmMgZnVuY3Rpb24gX2dldFN5bmNlZFN0b3JhZ2VEYXRhKHN0b3JhZ2VLZXkpIHsKICAgICAgICBpZiAoc3RvcmFnZUFwaS5nbVR5cGUgPT09ICdub25lJykgcmV0dXJuIGF3YWl0IHN0b3JhZ2VBcGkuZ2V0VmFsdWUoc3RvcmFnZUtleSwgbnVsbCk7CiAgICAgICAgY29uc3QgW2dtRGF0YSwgbG9jYWxEYXRhXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzdG9yYWdlQXBpLmdldFZhbHVlKHN0b3JhZ2VLZXksIG51bGwpLCBsb2NhbFN0b3JhZ2VBcGkuZ2V0KHN0b3JhZ2VLZXksIG51bGwpXSk7CiAgICAgICAgY29uc3QgZ21UaW1lc3RhbXAgPSBnbURhdGE/Lm1ldGFkYXRhPy50aW1lc3RhbXAgPz8gLTE7CiAgICAgICAgY29uc3QgbG9jYWxUaW1lc3RhbXAgPSBsb2NhbERhdGE/Lm1ldGFkYXRhPy50aW1lc3RhbXAgPz8gLTE7CgogICAgICAgIGlmIChnbVRpbWVzdGFtcCA+IGxvY2FsVGltZXN0YW1wKSB7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZUFwaS5zZXQoc3RvcmFnZUtleSwgZ21EYXRhKTsKICAgICAgICAgICAgcmV0dXJuIGdtRGF0YTsKICAgICAgICB9IGVsc2UgaWYgKGxvY2FsVGltZXN0YW1wID4gZ21UaW1lc3RhbXApIHsKICAgICAgICAgICAgYXdhaXQgc3RvcmFnZUFwaS5zZXRWYWx1ZShzdG9yYWdlS2V5LCBsb2NhbERhdGEpOwogICAgICAgICAgICByZXR1cm4gbG9jYWxEYXRhOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGdtRGF0YSB8fCBsb2NhbERhdGE7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gc2F2ZVRvU3RvcmFnZShzdG9yYWdlS2V5LCBkYXRhKSB7CiAgICAgICAgZGVidWcubG9nRGV0YWlsZWQoYFNhdmluZyB0byBzdG9yYWdlOiAke3N0b3JhZ2VLZXl9YCk7CiAgICAgICAgY29uc3QgZGF0YVRvU3RvcmUgPSB7CiAgICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoc3RvcmFnZUFwaS5nbVR5cGUgIT09ICdub25lJykgYXdhaXQgc3RvcmFnZUFwaS5zZXRWYWx1ZShzdG9yYWdlS2V5LCBkYXRhVG9TdG9yZSk7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZUFwaS5zZXQoc3RvcmFnZUtleSwgZGF0YVRvU3RvcmUpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHNhdmluZyBkYXRhIGZvciBrZXkgIiR7c3RvcmFnZUtleX0iOmAsIGVycm9yKTsKICAgICAgICB9CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gbG9hZEZyb21TdG9yYWdlKHN0b3JhZ2VLZXksIGRlZmF1bHREYXRhKSB7CiAgICAgICAgZGVidWcubG9nRGV0YWlsZWQoYExvYWRpbmcgZnJvbSBzdG9yYWdlOiAke3N0b3JhZ2VLZXl9YCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qgc3luY2VkV3JhcHBlciA9IGF3YWl0IF9nZXRTeW5jZWRTdG9yYWdlRGF0YShzdG9yYWdlS2V5KTsKICAgICAgICAgICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN5bmNlZFdyYXBwZXIgJiYgIXN5bmNlZFdyYXBwZXIubWV0YWRhdGEgPyBzeW5jZWRXcmFwcGVyIDogc3luY2VkV3JhcHBlcj8uZGF0YSA/PyB7fTsKICAgICAgICAgICAgcmV0dXJuIHsgLi4uZGVmYXVsdERhdGEsIC4uLnN0b3JlZERhdGEgfTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBsb2FkaW5nIGRhdGEgZm9yIGtleSAiJHtzdG9yYWdlS2V5fSI6YCwgZXJyb3IpOwogICAgICAgICAgICByZXR1cm4gZGVmYXVsdERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRBbmRDbGVhbkZyb21TdG9yYWdlKHN0b3JhZ2VLZXksIGRlZmF1bHREYXRhKSB7CiAgICAgICAgZGVidWcubG9nRGV0YWlsZWQoYExvYWRpbmcgYW5kIGNsZWFuaW5nIHN0b3JhZ2U6ICR7c3RvcmFnZUtleX1gKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBjb21iaW5lZERhdGEgPSBhd2FpdCBsb2FkRnJvbVN0b3JhZ2Uoc3RvcmFnZUtleSwgZGVmYXVsdERhdGEpOwogICAgICAgICAgICBjb25zdCBjbGVhbmVkRGF0YSA9IE9iamVjdC5rZXlzKGRlZmF1bHREYXRhKS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50S2V5KSA9PiB7CiAgICAgICAgICAgICAgICBhY2N1bXVsYXRvcltjdXJyZW50S2V5XSA9IGNvbWJpbmVkRGF0YVtjdXJyZW50S2V5XTsKICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICByZXR1cm4gY2xlYW5lZERhdGE7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyBhbmQgY2xlYW5pbmcgZGF0YSBmb3Iga2V5ICIke3N0b3JhZ2VLZXl9IjpgLCBlcnJvcik7CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RGF0YTsKICAgICAgICB9CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlRnJvbVN0b3JhZ2Uoc3RvcmFnZUtleSkgewogICAgICAgIGRlYnVnLmxvZ0RldGFpbGVkKGBEZWxldGluZyBmcm9tIHN0b3JhZ2U6ICR7c3RvcmFnZUtleX1gKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoc3RvcmFnZUFwaS5nbVR5cGUgIT09ICdub25lJykgYXdhaXQgc3RvcmFnZUFwaS5kZWxldGVWYWx1ZShzdG9yYWdlS2V5KTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZGVsZXRpbmcgZGF0YSBmb3Iga2V5ICIke3N0b3JhZ2VLZXl9IjpgLCBlcnJvcik7CiAgICAgICAgfQogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGxpc3RGcm9tU3RvcmFnZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBbZ3JlYXNlbW9ua2V5S2V5cywgbG9jYWxTdG9yYWdlS2V5c10gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgICAgICAgICBzdG9yYWdlQXBpLmdtVHlwZSAhPT0gJ25vbmUnID8gc3RvcmFnZUFwaS5saXN0VmFsdWVzKCkgOiBQcm9taXNlLnJlc29sdmUoW10pLAogICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKE9iamVjdC5rZXlzKGxvY2FsU3RvcmFnZSkpLAogICAgICAgICAgICBdKTsKICAgICAgICAgICAgY29uc3QgYWxsVW5pcXVlS2V5cyA9IG5ldyBTZXQoWy4uLmdyZWFzZW1vbmtleUtleXMsIC4uLmxvY2FsU3RvcmFnZUtleXNdKTsKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYWxsVW5pcXVlS2V5cyk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbGlzdGluZyBzdG9yYWdlIHZhbHVlczonLCBlcnJvcik7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZmFsbGJhY2tHZXRQbGF5ZXJBcGkoKSB7CiAgICAgICAgZGVidWcubG9nQWxsKCdGYWxsYmFjayBQbGF5ZXIgQVBJIENoZWNrJyk7CiAgICAgICAgaWYgKGFwcFN0YXRlLnBhZ2UuaXNJZnJhbWUgfHwgYXBwU3RhdGUucGFnZS5pc01vYmlsZSkgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JTLndhdGNoUGxheWVyKTsKICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9zaG9ydHMnKSkgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JTLnNob3J0c1BsYXllcik7CiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvd2F0Y2gnKSkgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JTLndhdGNoUGxheWVyKTsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUlMuaW5saW5lUGxheWVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJSZXNwb25zZVdoZW5SZWFkeSgpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBmdW5jdGlvbiBjaGVjaygpIHsKICAgICAgICAgICAgICAgIGlmICghYXBwU3RhdGU/LnBsYXllcj8uYXBpKSByZXR1cm4gcmVzb2x2ZShudWxsKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllclJlc3BvbnNlID0gYXBpUHJveHkuZ2V0UGxheWVyUmVzcG9uc2UoKTsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJSZXNwb25zZSkgcmV0dXJuIHJlc29sdmUocGxheWVyUmVzcG9uc2UpOwogICAgICAgICAgICAgICAgZGVidWcubG9nVHlwaWNhbCgnUGxheWVyIEFQSSByZWFkeSwgYnV0IG1pc3NpbmcgcGxheWVyUmVzcG9uc2UuIFdhaXRpbmcgZm9yIG1ldGFkYXRhLi4uJyk7CiAgICAgICAgICAgICAgICBhcHBTdGF0ZS5wbGF5ZXIudmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgY2hlY2ssIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGVjaygpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE9wdGltYWxSZXNvbHV0aW9uKHRhcmdldFJlc29sdXRpb25TdHJpbmcsIHVzZVByZW1pdW0gPSB0cnVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCF0YXJnZXRSZXNvbHV0aW9uU3RyaW5nIHx8ICFQT1NTSUJMRV9SRVNPTFVUSU9OU1t0YXJnZXRSZXNvbHV0aW9uU3RyaW5nXSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXJnZXQgcmVzb2x1dGlvbjogJHt0YXJnZXRSZXNvbHV0aW9uU3RyaW5nfWApOwogICAgICAgICAgICBjb25zdCB2aWRlb1F1YWxpdHlEYXRhID0gYXBpUHJveHkuZ2V0QXZhaWxhYmxlUXVhbGl0eURhdGEoKTsKICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlUXVhbGl0aWVzID0gWy4uLm5ldyBTZXQodmlkZW9RdWFsaXR5RGF0YS5tYXAoKHEpID0+IHEucXVhbGl0eSkpXTsKICAgICAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBQT1NTSUJMRV9SRVNPTFVUSU9OU1t0YXJnZXRSZXNvbHV0aW9uU3RyaW5nXS5wOwogICAgICAgICAgICBjb25zdCBiZXN0UXVhbGl0eVN0cmluZyA9IGF2YWlsYWJsZVF1YWxpdGllcwogICAgICAgICAgICAgICAgLmZpbHRlcigocSkgPT4gUE9TU0lCTEVfUkVTT0xVVElPTlNbcV0gJiYgUE9TU0lCTEVfUkVTT0xVVElPTlNbcV0ucCA8PSB0YXJnZXRWYWx1ZSkKICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBQT1NTSUJMRV9SRVNPTFVUSU9OU1tiXS5wIC0gUE9TU0lCTEVfUkVTT0xVVElPTlNbYV0ucClbMF07CiAgICAgICAgICAgIGlmICghYmVzdFF1YWxpdHlTdHJpbmcpIHJldHVybiBudWxsOwogICAgICAgICAgICBsZXQgbm9ybWFsQ2FuZGlkYXRlID0gbnVsbDsKICAgICAgICAgICAgbGV0IHByZW1pdW1DYW5kaWRhdGUgPSBudWxsOwogICAgICAgICAgICBmb3IgKGNvbnN0IHF1YWxpdHkgb2YgdmlkZW9RdWFsaXR5RGF0YSkgewogICAgICAgICAgICAgICAgaWYgKHF1YWxpdHkucXVhbGl0eSA9PT0gYmVzdFF1YWxpdHlTdHJpbmcgJiYgcXVhbGl0eS5pc1BsYXlhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVByZW1pdW0gJiYgcXVhbGl0eS5wYXlnYXRlZFF1YWxpdHlEZXRhaWxzKSBwcmVtaXVtQ2FuZGlkYXRlID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICBlbHNlIG5vcm1hbENhbmRpZGF0ZSA9IHF1YWxpdHk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHByZW1pdW1DYW5kaWRhdGUgfHwgbm9ybWFsQ2FuZGlkYXRlOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gcmVzb2x2aW5nIG9wdGltYWwgcXVhbGl0eTonLCBlcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXRQbGF5YmFja1Jlc29sdXRpb24odGFyZ2V0UmVzb2x1dGlvbiwgaWdub3JlQXZhaWxhYmxlID0gZmFsc2UsIHVzZVByZW1pdW0gPSB0cnVlKSB7CiAgICAgICAgZGVidWcubG9nVHlwaWNhbChgQXR0ZW1wdGluZyB0byBzZXQgcmVzb2x1dGlvbjogJHt0YXJnZXRSZXNvbHV0aW9ufSAoUHJlbWl1bTogJHt1c2VQcmVtaXVtfSwgRm9yY2U6ICR7aWdub3JlQXZhaWxhYmxlfSlgKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoIWFwcFN0YXRlLnBsYXllci5hcGk/LmdldEF2YWlsYWJsZVF1YWxpdHlEYXRhKSByZXR1cm47CiAgICAgICAgICAgIGlmICghdXNlUHJlbWl1bSAmJiBpZ25vcmVBdmFpbGFibGUpIHsKICAgICAgICAgICAgICAgIGFwaVByb3h5LnNldFBsYXliYWNrUXVhbGl0eVJhbmdlKHRhcmdldFJlc29sdXRpb24pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3Qgb3B0aW1hbFF1YWxpdHkgPSBnZXRPcHRpbWFsUmVzb2x1dGlvbih0YXJnZXRSZXNvbHV0aW9uLCB1c2VQcmVtaXVtKTsKICAgICAgICAgICAgICAgIGlmIChvcHRpbWFsUXVhbGl0eSkgewogICAgICAgICAgICAgICAgICAgIGRlYnVnLmxvZ0RldGFpbGVkKCdGb3VuZCBvcHRpbWFsIHF1YWxpdHkgZm9ybWF0OicsIG9wdGltYWxRdWFsaXR5KTsKICAgICAgICAgICAgICAgICAgICBhcGlQcm94eS5zZXRQbGF5YmFja1F1YWxpdHlSYW5nZSgKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1hbFF1YWxpdHkucXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1hbFF1YWxpdHkucXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHJlbWl1bSA/IG9wdGltYWxRdWFsaXR5LmZvcm1hdElkIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5sb2dUeXBpY2FsKCdDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHF1YWxpdHkgZm9yOicsIHRhcmdldFJlc29sdXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBzZXR0aW5nIHJlc29sdXRpb246JywgZXJyb3IpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfZGlzcGF0Y2hIZWxwZXJBcGlSZWFkeUV2ZW50KCkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLmFwaSkgcmV0dXJuOwogICAgICAgIGNvbnN0IGV2ZW50RGV0YWlsID0geyAuLi5wdWJsaWNBcGkgfTsKICAgICAgICBjb25zdCBzdGF0ZVNuYXBzaG90ID0gewogICAgICAgICAgICBwbGF5ZXI6IHsgLi4uYXBwU3RhdGUucGxheWVyIH0sCiAgICAgICAgICAgIHZpZGVvOiB7IC4uLmFwcFN0YXRlLnZpZGVvIH0sCiAgICAgICAgICAgIGNoYXQ6IHsgLi4uYXBwU3RhdGUuY2hhdCB9LAogICAgICAgICAgICBwYWdlOiB7IC4uLmFwcFN0YXRlLnBhZ2UgfSwKICAgICAgICB9OwoKICAgICAgICBPYmplY3QuYXNzaWduKGV2ZW50RGV0YWlsLCBzdGF0ZVNuYXBzaG90KTsKCiAgICAgICAgaWYgKCFldmVudERldGFpbC52aWRlby5pZCkgcmV0dXJuIGNvbnNvbGUud2FybignVmlkZW8gSUQgbm90IGZvdW5kIGluIHN0YXRlIHNuYXBzaG90LicpOwoKICAgICAgICBkZWJ1Zy5sb2dNaW5pbWFsKGBWaWRlbyBSZWFkeS4gVGl0bGU6ICIke3N0YXRlU25hcHNob3QudmlkZW8udGl0bGV9Ii4gSWQ6ICIke3N0YXRlU25hcHNob3QudmlkZW8uaWR9ImApOwogICAgICAgIGRlYnVnLmxvZ0RldGFpbGVkKCdEaXNwYXRjaGluZyBSZWFkeSBFdmVudCB3aXRoIHN0YXRlOicsIHN0YXRlU25hcHNob3QpOwoKICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgneXQtaGVscGVyLWFwaS1yZWFkeScsIHsKICAgICAgICAgICAgZGV0YWlsOiBPYmplY3QuZnJlZXplKGV2ZW50RGV0YWlsKSwKICAgICAgICB9KTsKCiAgICAgICAgcHJpdmF0ZUV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9ub3RpZnlBZERldGVjdGVkKCkgewogICAgICAgIGRlYnVnLmxvZ0RldGFpbGVkKGBBZCBTdGF0ZSBDaGFuZ2U6IElzIFBsYXlpbmcgQWQ/ICR7YXBwU3RhdGUucGxheWVyLmlzUGxheWluZ0Fkc31gKTsKICAgICAgICBpZiAoYXBwU3RhdGUucGxheWVyLmlzUGxheWluZ0FkcykgewogICAgICAgICAgICBkZWJ1Zy5sb2dUeXBpY2FsKCdBZCBkZXRlY3RlZCEnKTsKICAgICAgICAgICAgcHJpdmF0ZUV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoCiAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3l0LWhlbHBlci1hcGktYWQtZGV0ZWN0ZWQnLCB7CiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBPYmplY3QuZnJlZXplKHsgaXNQbGF5aW5nQWRzOiBhcHBTdGF0ZS5wbGF5ZXIuaXNQbGF5aW5nQWRzIH0pLAogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrSXNJZnJhbWUoKSB7CiAgICAgICAgaWYgKGFwcFN0YXRlLnBhZ2UuaXNJZnJhbWUpIHByaXZhdGVFdmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgneXQtaGVscGVyLWFwaS1kZXRlY3RlZC1pZnJhbWUnKSk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGxheWVyU3RhdGUoZXZlbnQpIHsKICAgICAgICBhcHBTdGF0ZS5wbGF5ZXIuYXBpID0gZXZlbnQ/LnRhcmdldD8ucGxheWVyXyA/PyBmYWxsYmFja0dldFBsYXllckFwaSgpOwogICAgICAgIGFwcFN0YXRlLnBsYXllci5wbGF5ZXJPYmplY3QgPSBldmVudD8udGFyZ2V0Py5wbGF5ZXJDb250YWluZXJfPy5jaGlsZHJlblswXSA/PyBmYWxsYmFja0dldFBsYXllckFwaSgpOwogICAgICAgIGFwcFN0YXRlLnBsYXllci52aWRlb0VsZW1lbnQgPSBhcHBTdGF0ZS5wbGF5ZXIucGxheWVyT2JqZWN0Py5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SUy52aWRlb0VsZW1lbnQpOwogICAgICAgIGFwcFN0YXRlLnBsYXllci5yZXNwb25zZSA9IGF3YWl0IGdldFBsYXllclJlc3BvbnNlV2hlblJlYWR5KCk7CiAgICAgICAgZGVidWcubG9nRGV0YWlsZWQoJ1BsYXllciBzdGF0ZSB1cGRhdGVkJywgYXBwU3RhdGUucGxheWVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVWaWRlb0xhbmd1YWdlKCkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLmFwaSkgcmV0dXJuOwoKICAgICAgICBjb25zdCBhdmFpbGFibGVUcmFja3MgPSBhcGlQcm94eS5nZXRBdmFpbGFibGVBdWRpb1RyYWNrcygpID8/IFtdOwogICAgICAgIGNvbnN0IHBsYXlpbmdBdWRpb1RyYWNrID0gYXBpUHJveHkuZ2V0QXVkaW9UcmFjaygpOwoKICAgICAgICBjb25zdCBnZXRUcmFja0RldGFpbHMgPSAodHJhY2spID0+IE9iamVjdC52YWx1ZXModHJhY2sgPz8ge30pOwogICAgICAgIGNvbnN0IG9yaWdpbmFsQXVkaW9UcmFjayA9IGF2YWlsYWJsZVRyYWNrcz8uZmluZCgodHJhY2spID0+IHsKICAgICAgICAgICAgaWYgKCF0cmFjayB8fCB0eXBlb2YgdHJhY2sgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGdldFRyYWNrRGV0YWlscyh0cmFjayk7CiAgICAgICAgICAgIGNvbnN0IGhhc01ldGFkYXRhID0gdmFsdWVzLnNvbWUoKHZhbCkgPT4gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICdpc0F1dG9EdWJiZWQnIGluIHZhbCk7CiAgICAgICAgICAgIGNvbnN0IGhhc1RydWVGbGFnID0gdmFsdWVzLnNvbWUoKHZhbCkgPT4gdmFsID09PSB0cnVlKTsKICAgICAgICAgICAgcmV0dXJuIGhhc01ldGFkYXRhICYmIGhhc1RydWVGbGFnOwogICAgICAgIH0pOwoKICAgICAgICBjb25zdCBpc0F1dG9EdWJiZWQgPSBnZXRUcmFja0RldGFpbHMocGxheWluZ0F1ZGlvVHJhY2spLnNvbWUoKHZhbCkgPT4gdmFsPy5pc0F1dG9EdWJiZWQgPT09IHRydWUpOwoKICAgICAgICBpZiAoYXBwU3RhdGUudmlkZW8ucGxheWluZ0xhbmd1YWdlID09PSBwbGF5aW5nQXVkaW9UcmFjaykgcmV0dXJuOwogICAgICAgIGNvbnN0IGlzSW5pdCA9CiAgICAgICAgICAgIChhcHBTdGF0ZS52aWRlby5wbGF5aW5nTGFuZ3VhZ2UgPT09IG51bGwgJiYgYCR7cGxheWluZ0F1ZGlvVHJhY2t9YCAhPT0gJ0RlZmF1bHQnKSB8fAogICAgICAgICAgICBgJHthcHBTdGF0ZS52aWRlby5wbGF5aW5nTGFuZ3VhZ2V9YCA9PT0gJ0RlZmF1bHQnOwoKICAgICAgICBkZWJ1Zy5sb2dUeXBpY2FsKGBMYW5ndWFnZSB1cGRhdGVkOiAke3BsYXlpbmdBdWRpb1RyYWNrfSAoQXV0by1EdWJiZWQ6ICR7aXNBdXRvRHViYmVkfSlgKTsKCiAgICAgICAgYXBwU3RhdGUudmlkZW8ucGxheWluZ0xhbmd1YWdlID0gcGxheWluZ0F1ZGlvVHJhY2s7CiAgICAgICAgYXBwU3RhdGUudmlkZW8ub3JpZ2luYWxMYW5ndWFnZSA9IG9yaWdpbmFsQXVkaW9UcmFjazsKICAgICAgICBhcHBTdGF0ZS52aWRlby5pc0F1dG9EdWJiZWQgPSBpc0F1dG9EdWJiZWQ7CgogICAgICAgIHByaXZhdGVFdmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KAogICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3l0LWhlbHBlci1hcGktcGxheWJhY2stbGFuZ3VhZ2UtdXBkYXRlZCcsIHsKICAgICAgICAgICAgICAgIGRldGFpbDogT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgICAgICAgICAgICAgaXNJbml0LAogICAgICAgICAgICAgICAgICAgIHBsYXlpbmdMYW5ndWFnZTogYXBwU3RhdGUudmlkZW8ucGxheWluZ0xhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTGFuZ3VhZ2U6IGFwcFN0YXRlLnZpZGVvLm9yaWdpbmFsTGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgaXNBdXRvRHViYmVkOiBhcHBTdGF0ZS52aWRlby5pc0F1dG9EdWJiZWQsCiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgfSksCiAgICAgICAgKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVWaWRlb1N0YXRlKCkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLmFwaSkgcmV0dXJuOwogICAgICAgIGNvbnN0IHBsYXllclJlc3BvbnNlT2JqZWN0ID0gYXBwU3RhdGUucGxheWVyLnJlc3BvbnNlOwogICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtczsKICAgICAgICBhcHBTdGF0ZS52aWRlby5pZCA9IHBsYXllclJlc3BvbnNlT2JqZWN0Py52aWRlb0RldGFpbHM/LnZpZGVvSWQ7CiAgICAgICAgYXBwU3RhdGUudmlkZW8udGl0bGUgPSBwbGF5ZXJSZXNwb25zZU9iamVjdD8udmlkZW9EZXRhaWxzPy50aXRsZTsKICAgICAgICBhcHBTdGF0ZS52aWRlby5jaGFubmVsID0gcGxheWVyUmVzcG9uc2VPYmplY3Q/LnZpZGVvRGV0YWlscz8uYXV0aG9yOwogICAgICAgIGFwcFN0YXRlLnZpZGVvLmNoYW5uZWxJZCA9IHBsYXllclJlc3BvbnNlT2JqZWN0Py52aWRlb0RldGFpbHM/LmNoYW5uZWxJZDsKICAgICAgICBhcHBTdGF0ZS52aWRlby5yYXdEZXNjcmlwdGlvbiA9IHBsYXllclJlc3BvbnNlT2JqZWN0Py52aWRlb0RldGFpbHM/LnNob3J0RGVzY3JpcHRpb247CiAgICAgICAgYXBwU3RhdGUudmlkZW8ucmF3VXBsb2FkRGF0ZSA9IHBsYXllclJlc3BvbnNlT2JqZWN0Py5taWNyb2Zvcm1hdD8ucGxheWVyTWljcm9mb3JtYXRSZW5kZXJlcj8udXBsb2FkRGF0ZTsKICAgICAgICBhcHBTdGF0ZS52aWRlby5yYXdQdWJsaXNoRGF0ZSA9IHBsYXllclJlc3BvbnNlT2JqZWN0Py5taWNyb2Zvcm1hdD8ucGxheWVyTWljcm9mb3JtYXRSZW5kZXJlcj8ucHVibGlzaERhdGU7CiAgICAgICAgYXBwU3RhdGUudmlkZW8udXBsb2FkRGF0ZSA9IGFwcFN0YXRlLnZpZGVvLnJhd1VwbG9hZERhdGUgPyBuZXcgRGF0ZShhcHBTdGF0ZS52aWRlby5yYXdVcGxvYWREYXRlKSA6IG51bGw7CiAgICAgICAgYXBwU3RhdGUudmlkZW8ucHVibGlzaERhdGUgPSBhcHBTdGF0ZS52aWRlby5yYXdQdWJsaXNoRGF0ZSA/IG5ldyBEYXRlKGFwcFN0YXRlLnZpZGVvLnJhd1B1Ymxpc2hEYXRlKSA6IG51bGw7CiAgICAgICAgYXBwU3RhdGUudmlkZW8ubGVuZ3RoU2Vjb25kcyA9IHBhcnNlSW50KHBsYXllclJlc3BvbnNlT2JqZWN0Py52aWRlb0RldGFpbHM/Lmxlbmd0aFNlY29uZHMgPz8gJzAnLCAxMCk7CiAgICAgICAgYXBwU3RhdGUudmlkZW8udmlld0NvdW50ID0gcGFyc2VJbnQocGxheWVyUmVzcG9uc2VPYmplY3Q/LnZpZGVvRGV0YWlscz8udmlld0NvdW50ID8/ICcwJywgMTApOwogICAgICAgIGFwcFN0YXRlLnZpZGVvLmxpa2VDb3VudCA9IHBhcnNlSW50KHBsYXllclJlc3BvbnNlT2JqZWN0Py5taWNyb2Zvcm1hdD8ucGxheWVyTWljcm9mb3JtYXRSZW5kZXJlcj8ubGlrZUNvdW50ID8/ICcwJywgMTApOwogICAgICAgIGFwcFN0YXRlLnZpZGVvLmlzQ3VycmVudGx5TGl2ZSA9IGFwaVByb3h5LmdldFZpZGVvRGF0YSgpLmlzTGl2ZTsKICAgICAgICBhcHBTdGF0ZS52aWRlby5pc0xpdmVPclZvZENvbnRlbnQgPSBwbGF5ZXJSZXNwb25zZU9iamVjdD8udmlkZW9EZXRhaWxzPy5pc0xpdmVDb250ZW50OwogICAgICAgIGFwcFN0YXRlLnZpZGVvLndhc1N0cmVhbWVkT3JQcmVtaWVyZWQgPSAhIXBsYXllclJlc3BvbnNlT2JqZWN0Py5taWNyb2Zvcm1hdD8ucGxheWVyTWljcm9mb3JtYXRSZW5kZXJlcj8ubGl2ZUJyb2FkY2FzdERldGFpbHM7CiAgICAgICAgYXBwU3RhdGUudmlkZW8uaXNGYW1pbHlTYWZlID0gcGxheWVyUmVzcG9uc2VPYmplY3Q/Lm1pY3JvZm9ybWF0Py5wbGF5ZXJNaWNyb2Zvcm1hdFJlbmRlcmVyPy5pc0ZhbWlseVNhZmU7CiAgICAgICAgYXBwU3RhdGUudmlkZW8udGh1bWJuYWlscyA9CiAgICAgICAgICAgIHBsYXllclJlc3BvbnNlT2JqZWN0Py5taWNyb2Zvcm1hdD8ucGxheWVyTWljcm9mb3JtYXRSZW5kZXJlcj8udGh1bWJuYWlsPy50aHVtYm5haWxzID8/CiAgICAgICAgICAgIHBsYXllclJlc3BvbnNlT2JqZWN0Py52aWRlb0RldGFpbHM/LnRodW1ibmFpbD8udGh1bWJuYWlsczsKICAgICAgICBhcHBTdGF0ZS52aWRlby5yZWFsQ3VycmVudFByb2dyZXNzID0gYXBpUHJveHkuZ2V0Q3VycmVudFRpbWUoKTsKICAgICAgICBhcHBTdGF0ZS52aWRlby5pc1RpbWVTcGVjaWZpZWQgPSBzZWFyY2hQYXJhbXMuaGFzKCd0Jyk7CiAgICAgICAgYXBwU3RhdGUudmlkZW8ucGxheWxpc3RJZCA9IGFwaVByb3h5LmdldFBsYXlsaXN0SWQoKTsKCiAgICAgICAgZGVidWcubG9nRGV0YWlsZWQoJ1ZpZGVvIHN0YXRlIHVwZGF0ZWQnLCBhcHBTdGF0ZS52aWRlbyk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRnVsbHNjcmVlblN0YXRlKCkgewogICAgICAgIGFwcFN0YXRlLnBsYXllci5pc0Z1bGxzY3JlZW4gPSAhIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50OwogICAgICAgIGRlYnVnLmxvZ0RldGFpbGVkKGBGdWxsc2NyZWVuOiAke2FwcFN0YXRlLnBsYXllci5pc0Z1bGxzY3JlZW59YCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlVGhlYXRlclN0YXRlKGV2ZW50KSB7CiAgICAgICAgYXBwU3RhdGUucGxheWVyLmlzVGhlYXRlciA9ICEhZXZlbnQ/LmRldGFpbD8uZW5hYmxlZDsKICAgICAgICBkZWJ1Zy5sb2dEZXRhaWxlZChgVGhlYXRlciBNb2RlOiAke2FwcFN0YXRlLnBsYXllci5pc1RoZWF0ZXJ9YCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlQ2hhdFN0YXRlVXBkYXRlZChldmVudCkgewogICAgICAgIGFwcFN0YXRlLmNoYXQuaUZyYW1lID0gZXZlbnQ/LnRhcmdldCA/PyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SUy5jaGF0RnJhbWUpOwogICAgICAgIGFwcFN0YXRlLmNoYXQuY29udGFpbmVyID0gYXBwU3RhdGUuY2hhdC5pRnJhbWU/LnBhcmVudEVsZW1lbnQgPz8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUlMuY2hhdENvbnRhaW5lcik7CiAgICAgICAgYXBwU3RhdGUuY2hhdC5pc0NvbGxhcHNlZCA9IGV2ZW50Py5kZXRhaWwgPz8gdHJ1ZTsKICAgICAgICBkZWJ1Zy5sb2dEZXRhaWxlZCgnQ2hhdCBzdGF0ZSB1cGRhdGVkJywgYXBwU3RhdGUuY2hhdCk7CiAgICAgICAgcHJpdmF0ZUV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoCiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgneXQtaGVscGVyLWFwaS1jaGF0LXN0YXRlLXVwZGF0ZWQnLCB7IGRldGFpbDogT2JqZWN0LmZyZWV6ZSh7IC4uLmFwcFN0YXRlLmNoYXQgfSkgfSksCiAgICAgICAgKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVBZFN0YXRlKCkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLnBsYXllck9iamVjdCkgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF2b2lkID0gYXBwU3RhdGUucGxheWVyLnBsYXllck9iamVjdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Vuc3RhcnRlZC1tb2RlJyk7CiAgICAgICAgICAgIGNvbnN0IGlzQWRQcmVzZW50ID0KICAgICAgICAgICAgICAgIGFwcFN0YXRlLnBsYXllci5wbGF5ZXJPYmplY3QuY2xhc3NMaXN0LmNvbnRhaW5zKCdhZC1zaG93aW5nJykgfHwKICAgICAgICAgICAgICAgIGFwcFN0YXRlLnBsYXllci5wbGF5ZXJPYmplY3QuY2xhc3NMaXN0LmNvbnRhaW5zKCdhZC1pbnRlcnJ1cHRpbmcnKTsKICAgICAgICAgICAgY29uc3QgaXNQbGF5aW5nQWRzID0gIXNob3VsZEF2b2lkICYmIGlzQWRQcmVzZW50OwogICAgICAgICAgICBhcHBTdGF0ZS5wbGF5ZXIuaXNQbGF5aW5nQWRzID0gaXNQbGF5aW5nQWRzOwogICAgICAgICAgICBfbm90aWZ5QWREZXRlY3RlZCgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGNoZWNrQWRTdGF0ZTonLCBlcnJvcik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZmFsbGJhY2tVcGRhdGVBZFN0YXRlKCkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLmFwaSkgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGRlYnVnLmxvZ0FsbCgnRmFsbGJhY2sgQWQgU3RhdGUgQ2hlY2snKTsKICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3NTdGF0ZSA9IGFwaVByb3h5LmdldFByb2dyZXNzU3RhdGUoKTsKICAgICAgICAgICAgY29uc3QgcmVwb3J0ZWRDb250ZW50RHVyYXRpb24gPSBwcm9ncmVzc1N0YXRlLmR1cmF0aW9uOwogICAgICAgICAgICBjb25zdCByZWFsQ29udGVudER1cmF0aW9uID0gYXBpUHJveHkuZ2V0RHVyYXRpb24oKSA/PyAtMTsKICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NaXNtYXRjaCA9IE1hdGgudHJ1bmMocmVhbENvbnRlbnREdXJhdGlvbikgIT09IE1hdGgudHJ1bmMocmVwb3J0ZWRDb250ZW50RHVyYXRpb24pOwogICAgICAgICAgICBjb25zdCBpc1BsYXlpbmdBZHMgPSBkdXJhdGlvbk1pc21hdGNoOwogICAgICAgICAgICBhcHBTdGF0ZS5wbGF5ZXIuaXNQbGF5aW5nQWRzID0gaXNQbGF5aW5nQWRzOwogICAgICAgICAgICBfbm90aWZ5QWREZXRlY3RlZCgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBhZCBjaGVjazonLCBlcnJvcik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVsb2FkVmlkZW8odGFyZ2V0VGltZSkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLmFwaSkgcmV0dXJuOwogICAgICAgIGRlYnVnLmxvZ1R5cGljYWwoYFJlbG9hZGluZyB2aWRlbyB0byAke3RhcmdldFRpbWV9c2ApOwogICAgICAgIGFwaVByb3h5LmxvYWRWaWRlb0J5SWQoYXBwU3RhdGUudmlkZW8uaWQsIHRhcmdldFRpbWUpOwogICAgICAgIGFwcFN0YXRlLnBsYXllci52aWRlb0VsZW1lbnQgPSBhcHBTdGF0ZS5wbGF5ZXIucGxheWVyT2JqZWN0Py5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SUy52aWRlb0VsZW1lbnQpOwogICAgICAgIHRyYWNrUGxheWJhY2tQcm9ncmVzcygpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbG9hZFRvQ3VycmVudFByb2dyZXNzKCkgewogICAgICAgIGRlYnVnLmxvZ0RldGFpbGVkKGBSZWxvYWRpbmcgdmlkZW8gdG8gY3VycmVudCBwcm9ncmVzc2ApOwogICAgICAgIHJlbG9hZFZpZGVvKGFwcFN0YXRlLnZpZGVvLnJlYWxDdXJyZW50UHJvZ3Jlc3MpOwogICAgfQoKICAgIGNvbnN0IHRpbWVVcGRhdGVUcmFja2VkRWxlbWVudHMgPSBuZXcgV2Vha01hcCgpOwogICAgZnVuY3Rpb24gdHJhY2tQbGF5YmFja1Byb2dyZXNzKCkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLnZpZGVvRWxlbWVudCkgcmV0dXJuOwogICAgICAgIGlmICh0aW1lVXBkYXRlVHJhY2tlZEVsZW1lbnRzLmhhcyhhcHBTdGF0ZS5wbGF5ZXIudmlkZW9FbGVtZW50KSkgcmV0dXJuOwogICAgICAgIGNvbnN0IHVwZGF0ZVByb2dyZXNzID0gKCkgPT4gewogICAgICAgICAgICBkZWJ1Zy5sb2dPdmVya2lsbChgVGltZVVwZGF0ZTogJHthcHBTdGF0ZS5wbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lfWApOwogICAgICAgICAgICBpZiAoIWFwcFN0YXRlLnBsYXllci5pc1BsYXlpbmdBZHMgJiYgYXBwU3RhdGUucGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA+IDApIHsKICAgICAgICAgICAgICAgIGFwcFN0YXRlLnZpZGVvLnJlYWxDdXJyZW50UHJvZ3Jlc3MgPSBhcHBTdGF0ZS5wbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZVZpZGVvTGFuZ3VhZ2UoKTsKICAgICAgICB9OwogICAgICAgIGFwcFN0YXRlLnBsYXllci52aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIHVwZGF0ZVByb2dyZXNzKTsKICAgICAgICB0aW1lVXBkYXRlVHJhY2tlZEVsZW1lbnRzLnNldChhcHBTdGF0ZS5wbGF5ZXIudmlkZW9FbGVtZW50LCB0cnVlKTsKICAgIH0KCiAgICBjb25zdCBjdXJyZW50bHlPYnNlcnZlZENvbnRhaW5lcnMgPSBuZXcgV2Vha01hcCgpOwogICAgZnVuY3Rpb24gdHJhY2tBZFN0YXRlKCkgewogICAgICAgIGlmICghYXBwU3RhdGUucGxheWVyLnBsYXllck9iamVjdCkgcmV0dXJuOwogICAgICAgIGlmIChjdXJyZW50bHlPYnNlcnZlZENvbnRhaW5lcnMuaGFzKGFwcFN0YXRlLnBsYXllci5wbGF5ZXJPYmplY3QpKSByZXR1cm47CiAgICAgICAgY29uc3QgYWRTdGF0ZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodXBkYXRlQWRTdGF0ZSk7CiAgICAgICAgYWRTdGF0ZU9ic2VydmVyLm9ic2VydmUoYXBwU3RhdGUucGxheWVyLnBsYXllck9iamVjdCwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXSB9KTsKICAgICAgICBjdXJyZW50bHlPYnNlcnZlZENvbnRhaW5lcnMuc2V0KGFwcFN0YXRlLnBsYXllci5wbGF5ZXJPYmplY3QsIGFkU3RhdGVPYnNlcnZlcik7CiAgICB9CgogICAgbGV0IHVwZGF0ZUxvY2tlZCA9IGZhbHNlOwogICAgYXN5bmMgZnVuY3Rpb24gX2hhbmRsZVBsYXllclVwZGF0ZShldmVudCA9IG51bGwpIHsKICAgICAgICBpZiAodXBkYXRlTG9ja2VkKSByZXR1cm47CiAgICAgICAgZGVidWcubG9nQWxsKCdQbGF5ZXIgdXBkYXRlIHRyaWdnZXJlZC4gVW5sb2NraW5nLi4uJyk7CiAgICAgICAgdXBkYXRlTG9ja2VkID0gdHJ1ZTsKICAgICAgICBkZWJ1Zy5sb2dEZXRhaWxlZCgnUGxheWVyIHVwZGF0ZSB0cmlnZ2VyZWQgYnk6JywgZXZlbnQ/LnR5cGUgfHwgJ21hbnVhbCBjYWxsJyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3l0LWhlbHBlci1hcGktdXBkYXRlLXN0YXJ0ZWQnKTsKICAgICAgICAgICAgcHJpdmF0ZUV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpOwogICAgICAgICAgICBhd2FpdCB1cGRhdGVQbGF5ZXJTdGF0ZShldmVudCk7CiAgICAgICAgICAgIHVwZGF0ZUFkU3RhdGUoKTsKICAgICAgICAgICAgdHJhY2tBZFN0YXRlKCk7CiAgICAgICAgICAgIHVwZGF0ZVZpZGVvU3RhdGUoKTsKICAgICAgICAgICAgdXBkYXRlVmlkZW9MYW5ndWFnZSgpOwogICAgICAgICAgICB0cmFja1BsYXliYWNrUHJvZ3Jlc3MoKTsKICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soX2Rpc3BhdGNoSGVscGVyQXBpUmVhZHlFdmVudCk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gX2hhbmRsZVBsYXllclVwZGF0ZTonLCBlcnJvcik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgZGVidWcubG9nQWxsKCdQbGF5ZXIgdXBkYXRlIGNvbXBsZXRlLiBMb2NraW5nLi4uJyk7CiAgICAgICAgICAgIHVwZGF0ZUxvY2tlZCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfaGFuZGxlUGFnZURhdGFVcGRhdGUoZXZlbnQpIHsKICAgICAgICBhcHBTdGF0ZS5wYWdlLnR5cGUgPSBldmVudC5kZXRhaWw/LnBhZ2VUeXBlOwogICAgICAgIGRlYnVnLmxvZ0RldGFpbGVkKCdQYWdlIGRhdGEgdXBkYXRlZCcsIGFwcFN0YXRlLnBhZ2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9oYW5kbGVQYWdlVHlwZUNoYW5nZShldmVudCkgewogICAgICAgIGFwcFN0YXRlLnBhZ2UudHlwZSA9IGV2ZW50LmRldGFpbD8ubmV3UGFnZVN1YnR5cGU7CiAgICAgICAgZGVidWcubG9nRGV0YWlsZWQoJ1BhZ2UgdHlwZSBjaGFuZ2VkJywgYXBwU3RhdGUucGFnZSk7CiAgICB9CgogICAgZnVuY3Rpb24gX2hhbmRsZVBhZ2VzaG93RXZlbnQoKSB7CiAgICAgICAgZGVidWcubG9nRGV0YWlsZWQoJ1BhZ2VzaG93IGV2ZW50IHRyaWdnZXJlZCcpOwogICAgICAgIGNvbnN0IHNob3VsZFRyeUVhcmx5ID0KICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy93YXRjaCcpIHx8CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQnKSB8fAogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL3Nob3J0cycpOwogICAgICAgIGlmIChzaG91bGRUcnlFYXJseSkgewogICAgICAgICAgICBkZWJ1Zy5sb2dEZXRhaWxlZCgnVHJ5aW5nIGVhcmx5IHBsYXllciB1cGRhdGUuLi4nKTsKICAgICAgICAgICAgX2hhbmRsZVBsYXllclVwZGF0ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhZGRQYWdlU3RhdGVMaXN0ZW5lcnMoKSB7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtcGFnZS1kYXRhLXVwZGF0ZWQnLCBfaGFuZGxlUGFnZURhdGFVcGRhdGUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LXBhZ2UtdHlwZS1jaGFuZ2VkJywgX2hhbmRsZVBhZ2VUeXBlQ2hhbmdlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRQbGF5ZXJTdGF0ZUxpc3RlbmVycygpIHsKICAgICAgICBjb25zdCBQTEFZRVJfVVBEQVRFX0VWRU5UID0gYXBwU3RhdGUucGFnZS5pc01vYmlsZSA/ICd2aWRlby1kYXRhLWNoYW5nZScgOiAneXQtcGxheWVyLXVwZGF0ZWQnOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoUExBWUVSX1VQREFURV9FVkVOVCwgX2hhbmRsZVBsYXllclVwZGF0ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHVwZGF0ZUZ1bGxzY3JlZW5TdGF0ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtc2V0LXRoZWF0ZXItbW9kZS1lbmFibGVkJywgdXBkYXRlVGhlYXRlclN0YXRlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRDaGF0U3RhdGVMaXN0ZW5lcnMoKSB7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtY2hhdC1jb2xsYXBzZWQtY2hhbmdlZCcsIHVwZGF0ZUNoYXRTdGF0ZVVwZGF0ZWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgZGVidWcubG9nTWluaW1hbCgnTGlicmFyeSBJbml0aWFsaXplZC4gV2FpdGluZyBmb3IgcGxheWVyLi4uJyk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgX2hhbmRsZVBhZ2VzaG93RXZlbnQpOwogICAgICAgIGNoZWNrSXNJZnJhbWUoKTsKICAgICAgICBpZiAoIWFwcFN0YXRlLnBhZ2UuaXNJZnJhbWUpIHsKICAgICAgICAgICAgYWRkUGxheWVyU3RhdGVMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgYWRkUGFnZVN0YXRlTGlzdGVuZXJzKCk7CiAgICAgICAgICAgIGFkZENoYXRTdGF0ZUxpc3RlbmVycygpOwogICAgICAgIH0KICAgIH0KCiAgICBpbml0aWFsaXplKCk7CgogICAgY29uc3QgcHVibGljQXBpID0gewogICAgICAgIGdldCBwbGF5ZXIoKSB7CiAgICAgICAgICAgIHJldHVybiByZWFkT25seVBsYXllcjsKICAgICAgICB9LAogICAgICAgIGdldCB2aWRlbygpIHsKICAgICAgICAgICAgcmV0dXJuIHJlYWRPbmx5VmlkZW87CiAgICAgICAgfSwKICAgICAgICBnZXQgY2hhdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHJlYWRPbmx5Q2hhdDsKICAgICAgICB9LAogICAgICAgIGdldCBwYWdlKCkgewogICAgICAgICAgICByZXR1cm4gcmVhZE9ubHlQYWdlOwogICAgICAgIH0sCiAgICAgICAgUE9TU0lCTEVfUkVTT0xVVElPTlMsCiAgICAgICAgdXBkYXRlQWRTdGF0ZSwKICAgICAgICBmYWxsYmFja1VwZGF0ZUFkU3RhdGUsCiAgICAgICAgZ2V0T3B0aW1hbFJlc29sdXRpb24sCiAgICAgICAgc2V0UGxheWJhY2tSZXNvbHV0aW9uLAogICAgICAgIHNhdmVUb1N0b3JhZ2UsCiAgICAgICAgbG9hZEZyb21TdG9yYWdlLAogICAgICAgIGxvYWRBbmRDbGVhbkZyb21TdG9yYWdlLAogICAgICAgIGRlbGV0ZUZyb21TdG9yYWdlLAogICAgICAgIGxpc3RGcm9tU3RvcmFnZSwKICAgICAgICByZWxvYWRWaWRlbywKICAgICAgICByZWxvYWRUb0N1cnJlbnRQcm9ncmVzcywKICAgICAgICBnbUNhcGFiaWxpdGllcywKICAgICAgICBhcGlQcm94eSwKICAgICAgICBkZWJ1ZywKICAgICAgICBldmVudFRhcmdldDogcHJpdmF0ZUV2ZW50VGFyZ2V0LAogICAgfTsKCiAgICByZXR1cm4gcHVibGljQXBpOwp9KSgpOwo=","meta":"text/javascript"},"ts":1.773566024873e+12,"url":"https://update.greasyfork.org/scripts/549881/1717291/YouTube%20Helper%20API.js"}}˜øKqM P          !extdb.#laststart-{"origin":"normal","value":1.77356622522e+12}Åk`† Q           u~ÁmQ          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893é{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566277635e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}/!extdb.@re#4c5bbd59-5dbf-492b-b6d2-faf652a13893T{"origin":"normal","value":{"exc":[],"inc":["http://*/*","https://*/*"],"match":[]}}3!extdb.@source#4c5bbd59-5dbf-492b-b6d2-faf652a13893æ¥{"ori>Ætùgin":"normal","value":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==\n/*jshint evil:true newcap:false*/\n/*global unsafeWindow, GM_addStyle, GM_getValue, GM_setValue, GM_xmlhttpRequest, GM_registerMenuCommand, GM_deleteValue, GM_listValues, GM_getResourceText, GM_getResourceURL, GM_log, GM_openInTab, GM_setClipboard, GM_info, GM_getMetadata, $, document, console, location, setInterval, setTimeout, clearInterval*/\n/*=====================================================\n  Thanks\n======================================================\n\n  Donors: M. Howard, Shunjou, Charmine, Kierek93, G. Barnard, H. Young, Seinhor9, ImGlodar, Ivanosevitch, HomeDipo, R. Martin, DrFiZ, Tippy, B. Rohner, P. Kozica, M. Patel, W4rell, Tscheckoff, AdBlock Polska, AVENIR INTERNET, coolNAO, Ben, J. Park, C. Young, J. Bou, M. Cano, J. Jung, A. Sonino, J. Litten, M. Schrumpf, G. Pepe, A. Trufanov, R. Palmer, J. Rautiainen, S. Blystone, M. Silveira, K. MacArthur, M. Ivanov, A. Schmidt, A. Waage, F. Tismer, S. Ehnert, J. Corpus, J. Dluhos, Maklemenz, Strobelix, Modellpilot.EU, E. Benedetti, V. Venditti, Shakos, A. Eliason, A. Saloranta, S. Geiger, A. Otterloo, M. Coppen, S. Fischer, H. Becker, D. Ackerman, S. Pitsch, K. Pertcheck, S. Abel, K. O'Connor, B. Obrien, S. Vogler, S. Goebl, A. Biar, S. Scott, Bassmobile.org, S. Große, M. Peot, R. Chan Balam, L. Bond-Kennedy, R. Emond, A. Pavlov, W. Tracey, A. Sergey, R. López López, R. Reddy Kasireddy, A. Moujeer, M. Betz, M. Lefèvre, R. McCurdy, LR Geeks, M. Beauregard, CasperTech Ltd, M. Dudas, S. Scharf, S. Prokhorov, K. Papalias, J. Wojnowski, B. Curtis, D. Lawrence, D. He, N. Kelsall, Idogewallet, J. Spaulding, S. Lafon, Mat, H. Roberts, C. Hedlund, J. Hawkins, J. Andersen, M. Bjorksten, B. Wolfe III, T. Yocom, Š. Intas, S. Moenich, J. Chang, C. Munk, A. Naruta, Б. Михаил, J. Benz, F. Sloot, J. Creed, M. Gillam, C. Leicht, A. Gnana, S. Sundaram, A. Koller, M. Kotlar, S. Abel, T. Flanagan, M. Arduini, P. Stackhouse, B. Oliver, M. Johnson, R. Mannert, E. Siordia\n\n  Collaborators: InfinityCoding, Couchy, Dindog, Floxflob, U Bless, Watilin, @prdonahue, Hoshie, 3lf3nLi3d, Alexo, Crits, Noname120, Crt32, JixunMoe, Athorcis, Killerbadger, SMed79, Alexander255, Anonsubmitter, RaporLoLpro, Maynak00, Robotex, Vinctux, Blahx, MajkiIT, F4z, Angelsl, Mikhaelk, Marek, Hamsterbacke, Gorhill, Hacker999, xxcriticxx, Skr4tchGr3azyMonkiBallllllZzzz, Giwayume, MrSherlockHolmes, xDarkARG, Noahp78, Mapx-\n\n  Users: Thank you to all those who use Anti Adblock Killer, who report problems, who write the review, which add to their favorites, making donations, which support the project and help in its development or promote.\n\n=======================================================\n  Mirrors\n=======================================================\n\n  Github: http://tinyurl.com/mcra3dn\n  Greasyfork: http://tinyurl.com/pbbdnh6\n  Openuserjs: http://tinyurl.com/nnqje32\n  MonkeyGuts: http://tinyurl.com/ka5fcqm\n  Userscripts: http://tinyurl.com/q8xcejl\n\n=======================================================\n  Documentation\n=======================================================\n\n  Greasemonkey: http://tinyurl.com/yeefnj5\n  Scriptish: http://tinyurl.com/cnd9nkd\n  Tampermonkey: http://tinyurl.com/pdytfde\n  Violentmonkey: http://tinyurl.com/n34wn6j\n  NinjaKit: http://tinyurl.com/pkkm9ug\n\n=======================================================\n  Script\n======================================================*/\n\n(function (window) {\n  \"use strict\";\n  \n  var Aak = {\n    name : 'Anti-Adblock Killer',\n    version : '10.0',\n    scriptid : 'gJWEp0vB',\n    homeURL : 'https://github.com/reek/anti-adblock-killer/',\n    changelogURL : 'https://github.com/reek/anti-adblock-killer#changelog',\n    donateURL : 'https://github.com/reek/anti-adblock-killer#donate',\n    featuresURL : 'https://github.com/reek/anti-adblock-killer#features',\n    reportURL : 'https://github.com/reek/anti-adblock-killer/wiki/Report-Guide',\n    contactURL : 'https://reek.github.io/anti-adblock-killer/#contact',\n    settingsURL : 'https://reek.github.io/anti-adblock-killer/#settings',\n    twitterURL : 'https://twitter.com/antiadbkiller',\n    downloadURL : 'https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js',\n    subscribeURL : 'https://reek.github.io/anti-adblock-killer/#filterlist',\n    listURL : \"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer-filters.txt\",\n    nativeURL : 'https://github.com/reek/anti-adblock-killer/wiki/Native-Mode',\n    iconURL : 'https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png',\n    imgBait : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAGklEQVR42mNg0GAYBaNgFIyCUTAKRsEoQAYATN8AKYNZ/x4AAAAASUVORK5CYII=',\n    initialize : function () {\n      Aak.registerSettings(); // registering your settings.\n      Aak.registerConsole(); // registering customzed console.\n      Aak.registerCommands(); // add commands to menu\n      Aak.checkUpdate(true); // check if AakScript is up to date.\n      Aak.checkList(); // check if AakList is enabled.\n      Aak.blockDetect(); // detect and kill anti-adblocks.\n    },\n    aabs : {},\n    opts : {},\n    options : {\n      autoPlay : {\n        group : 'general',\n        type : 'checkbox',\n        value : false,\n        label : 'Play video automatically. *',\n        info : ''\n      },\n      videoHD : {\n        group : 'general',\n        type : 'checkbox',\n        value : false,\n        label : 'Play video in HD quality. **',\n        info : ''\n      },\n      forceVLC : {\n        group : 'general',\n        type : 'checkbox',\n        value : false,\n        label : 'Play video with VLC plugin. *',\n        info : ''\n      },\n      checkList : {\n        group : 'general',\n        type : 'checkbox',\n        value : true,\n        label : 'Check AakList subscription.',\n        info : ''\n      },\n      checkUpdate : {\n        group : 'general',\n        type : 'checkbox',\n        value : true,\n        label : 'Check newer AakScript version.',\n        info : ''\n      },\n      debug : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Enable Logs.',\n        info : ''\n      },\n      logInsertedNodes : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Log inserted nodes.',\n        info : ''\n      },\n      logRemovedNodes : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Log removed nodes.',\n        info : ''\n      },\n      logExcluded : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Log excludes domains.',\n        info : ''\n      },\n      logXhr : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Log HTTP requests',\n        info : ''\n      },\n      logPlayer : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Log player instances.',\n        info : ''\n      },\n      logInterceptedScripts : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Log intercepted scripts.',\n        info : ''\n      },\n      logDetected : {\n        group : 'debug',\n        type : 'checkbox',\n        value : false,\n        label : 'Log detected anti-adblocks.',\n        info : ''\n      }\n    },\n    registerSettings : function () {\n      for (var optName in Aak.options) {\n        if (Aak.options.hasOwnProperty(optName))\n          Aak.opts[optName] = Aak.getValue(optName) !== null ? Aak.getValue(optName) : Aak.options[optName].value;\n      }\n    },\n    commands : [{\n        caption : 'Homepage',\n        execute : function () {\n          Aak.go(Aak.homeURL);\n        }\n      }, {\n        caption : 'Settings',\n        execute : function () {\n          Aak.go(Aak.settingsURL);\n        }\n      }, {\n        caption : 'Update',\n        execute : function () {\n          Aak.checkUpdate();\n        }\n      }\n    ],\n    addCommands : function (cmd) {\n      if (Aak.useGM && Aak.isTopframe && typeof GM_registerMenuCommand != 'undefined') {\n        GM_registerMenuCommand([Aak.name, Aak.getVersion(), cmd.caption].join(' '), cmd.execute);\n      }\n    },\n    registerCommands : function () {\n      Aak.ready(function () {\n        // Scriptish\n        // note: No menu command is created when the user script is run in a iframe window.\n        // doc: http://tinyurl.com/kvvv7yt\n        Aak.commands.forEach(function (cmd) {\n          Aak.addCommands(cmd);\n        });\n      });\n    },\n    registerConsole : function () {\n      this.log = Aak.opts.debug ? console.log.bind(console) : function () {};\n      this.info = Aak.opts.debug ? console.info.bind(console) : function () {};\n      this.error = Aak.opts.debug ? console.error.bind(console) : function () {};\n      this.warn = Aak.opts.debug ? console.warn.bind(console) : function () {};\n    },\n    isTopframe : (window.parent == window.self),\n    uw : typeof unsafeWindow != 'undefined' ? unsafeWindow : window,\n    useGM : typeof GM_getValue != 'undefined',\n    apiGM : function () {\n      if (Aak.isTopframe) {\n        // GM API - http://tinyurl.com/yeefnj5\n        return {\n          GM_xmlhttpRequest : typeof GM_xmlhttpRequest != 'undefined',\n          GM_setValue : typeof GM_setValue != 'undefined',\n          GM_getValue : typeof GM_getValue != 'undefined',\n          GM_addStyle : typeof GM_addStyle != 'undefined',\n          GM_registerMenuCommand : typeof GM_registerMenuCommand != 'undefined',\n          GM_info : typeof GM_info != 'undefined',\n          GM_getMetadata : typeof GM_getMetadata != 'undefined',\n          GM_deleteValue : typeof GM_deleteValue != 'undefined',\n          GM_listValues : typeof GM_listValues != 'undefined',\n          GM_getResourceText : typeof GM_getResourceText != 'undefined',\n          GM_getResourceURL : typeof GM_getResourceURL != 'undefined',\n          GM_log : typeof GM_log != 'undefined',\n          GM_openInTab : typeof GM_openInTab != 'undefined',\n          GM_setClipboard : typeof GM_setClipboard != 'undefined'\n        };\n      }\n    },\n    go : function (url) {\n      window.location.href = url;\n    },\n    refresh : function () {\n      window.location.href = window.location.href;\n    },\n    reload : function () {\n      window.location.reload(true);\n    },\n    contains : function (string, search) {\n      return string.indexOf(search) != -1;\n    },\n    getBrowser : function () {\n      var ua = window.navigator.userAgent;\n      if (Aak.contains(ua, 'Firefox')) {\n        return \"Firefox\";\n      } else if (Aak.contains(ua, 'Sleipnir')) {\n        return \"Sleipnir\"; // Mobile\n      } else if (Aak.contains(ua, 'UCBrowser')) {\n        return \"UCBrowser\"; // Mobile\n      } else if (Aak.contains(ua, 'Dolfin')) {\n        return \"Dolphin\"; // Mobile\n      } else if (Aak.contains(ua, 'MSIE')) {\n        return \"InternetExplorer\";\n      } else if (Aak.contains(ua, 'Midori')) {\n        return \"Midori\";\n      } else if (Aak.contains(ua, 'Opera') || Aak.contains(ua, 'OPR')) {\n        return \"Opera\";\n      } else if (Aak.contains(ua, 'Chrome')) {\n        return \"Chrome\";\n      } else if (Aak.contains(ua, 'Safari')) {\n        return \"Safari\";\n      } else if (Aak.contains(ua, 'Konqueror')) {\n        return \"Konqueror\";\n      } else if (Aak.contains(ua, 'PaleMoon')) {\n        return \"PaleMoon\"; // fork firefox\n      } else if (Aak.contains(ua, 'Cyberfox')) {\n        return \"Cyberfox\"; // fork firefox\n      } else if (Aak.contains(ua, 'SeaMonkey')) {\n        return \"SeaMonkey\"; // fork firefox\n      } else if (Aak.contains(ua, 'Iceweasel')) {\n        return \"Iceweasel\"; // fork firefox\n      } else {\n        return ua;\n      }\n    },\n    getVersion : function () {\n      return Number(Aak.version);\n    },\n    getScriptManager : function () {\n      if (typeof GM_info == 'object') {\n        // Greasemonkey (Firefox)\n        if (typeof GM_info.uuid != 'undefined') {\n          return 'Greasemonkey';\n        } // Tampermonkey (Chrome/Opera)\n        else if (typeof GM_info.scriptHandler != 'undefined') {\n          return 'Tampermonkey';\n        }\n      } else {\n        // Scriptish (Firefox)\n        if (typeof GM_getMetadata == 'function') {\n          return 'Scriptish';\n        } // NinjaKit (Safari/Chrome)\n        else if (typeof GM_setValue != 'undefined' &&\n          typeof GM_getResourceText == 'undefined' &&\n          typeof GM_getResourceURL == 'undefined' &&\n          typeof GM_openInTab == 'undefined' &&\n          typeof GM_setClipboard == 'undefined') {\n          return 'NinjaKit';\n        } else { // Native\n          return 'Native';\n        }\n      }\n    },\n    generateID : function (len) {\n      var str = '';\n      var charset = \"abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n      for (var i = 0; i \u003C (len ? len : 10); ++i) {\n        str += charset.charAt(Math.floor(Math.random() * charset.length));\n      }\n      return str;\n    },\n    generateUUID : function () {\n      // Universally Unique IDentifier\n      var d = new Date().getTime();\n      var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n          var r = (d + Math.random() * 16) % 16 | 0;\n          d = Math.floor(d / 16);\n          return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);\n        });\n      return uuid;\n    },\n    getUUID : function () {\n      var name = 'uuid';\n      if (Aak.getValue(name) === null) {\n        Aak.setValue(name, Aak.generateUUID());\n      }\n      return Aak.getValue(name);\n    },\n    schedule : function (days, name, callback) {\n      window.setTimeout(function () {\n        var later = isNaN(Aak.getValue(name)) ? 1 : Number(Aak.getValue(name));\n        var now = new Date().getTime();\n        if (later \u003C now) {\n          Aak.setValue(name, (now + (days * 24 * 60 * 60 * 1000)).toString());\n          callback();\n        }\n      }, 1e3);\n    },\n    notification : function (message, delay) {\n      if (Aak.isTopframe) {\n\n        // remove old notification\n        Aak.removeElement('#aak-notice-frame');\n\n        // add new notification\n        Aak.createElement({\n          tag : 'iframe',\n          id : 'aak-notice-frame',\n          style : 'position:fixed; z-index:999999; top:10px; left:10px;',\n          width : '360px',\n          height : '120px',\n          frameborder : 0,\n          scrolling : 'no',\n          //src : '//localhost/git/anti-adblock-killer-pages/notification.html#' + btoa(message),\n          src : '//reek.github.io/anti-adblock-killer/notification.html#' + window.btoa(message),\n          append : 'body',\n          callback : function (self) {\n\n            // manually remove\n            Aak.onEvent(window, \"message\", function (event) {\n              if (event.data == \"removeNotification\") {\n                self.remove();\n              }\n            }, false);\n\n            // automatically remove\n            window.setTimeout(function () {\n              self.remove();\n            }, delay || 3e4);\n          }\n        });\n\n      }\n    },\n    checkList : function () {\n      if (Aak.useGM && Aak.opts.checkList && Aak.isTopframe) {\n        Aak.schedule(1, 'nextchecklist', function () {\n          Aak.ready(function () {\n            Aak.createElement({\n              tag : 'script',\n              src : window.atob('Ly9yZWVrLmdpdGh1Yi5pby9hbnRpLWFkYmxvY2sta2lsbGVyL2syVXc3aXNIck1tNUpYUDFWd2R4YzU2N1pLYzFhWjRJLmpz'),\n              append : 'body',\n              event : {\n                error : function () {\n                  this.remove();\n                  Aak.info('AakList detected !');\n                },\n                load : function () {\n                  this.remove();\n                  Aak.warn('AakList not detected !');\n                  Aak.notification('It seems that you have not subscribed or disabled \u003Cb>AakList\u003C/b>. \u003Ca href=\"' + Aak.subscribeURL + '\" target=\"_blank\">Subscribe\u003C/a> or \u003Ca href=\"' + Aak.settingsURL + '\" target=\"_blank\">Disable this alert\u003C/a>');\n                }\n              }\n            });\n          });\n        });\n      }\n    },\n    checkUpdate : function (auto) {\n\n      var check = function (notifyFalse) {\n        Aak.request({\n          url : Aak.downloadURL,\n          onload : function (response) {\n            var res = response.responseText;\n            var status = response.status;\n            if (status == 200) {\n              var local = Aak.getVersion();\n              var remote = Number(res.match(/@version\\s+(\\d+\\.\\d+)/)[1]);\n              if (local \u003C remote) {\n                Aak.notification('Anti-Adblock Killer v' + remote + ' is available \u003Ca target=\"_blank\" href=\"' + Aak.downloadURL + '\">Install\u003C/a>.');\n              } else if (notifyFalse) {\n                Aak.notification('No update found.');\n              }\n            }\n          }\n        });\n      };\n\n      if (auto) { // auto mode\n        if (Aak.useGM && Aak.opts.checkUpdate && Aak.isTopframe) {\n          Aak.ready(function () {\n            Aak.schedule(7, 'nextcheckupdate', function () {\n              check(false);\n            });\n          });\n        }\n      } else { // manual mode\n        if (Aak.isTopframe) {\n          check(true);\n        }\n      }\n\n    },\n    openInTab : function (url) {\n      if (typeof GM_openInTab != 'undefined') {\n        GM_openInTab(url);\n      } else {\n        var newWindow = window.open(url, \"_blank\");\n        newWindow.focus();\n      }\n    },\n    request : function (settings) {\n      settings.url = settings.url || '';\n      settings.method = settings.method || 'GET';\n      settings.headers = settings.headers || {};\n      settings.timeout = settings.timeout || 2e4; // 20s\n      if (settings.data || settings.method == 'POST') {\n        settings.method = 'POST';\n        settings.data = Aak.serialize(settings.data || {});\n        settings.headers = Aak.setProperties(settings.headers, {\n            'X-Requested-With' : 'XMLHttpRequest',\n            'Content-Type' : 'application/x-www-form-urlencoded'\n          });\n      }\n\n      // override to integrate log\n      settings._onload = settings.onload;\n      settings.onload = function (xhr) {\n        if (Aak.opts.logXhr) {\n          Aak.log(Aak.getScriptManager() + ' xhr', xhr);\n        }\n        settings._onload(xhr);\n      };\n\n      if (typeof GM_xmlhttpRequest != 'undefined') {\n        // Request with GM API\n        // doc: http://tinyurl.com/2t7wbr\n        GM_xmlhttpRequest(settings);\n      } else {\n        // Request with Web API\n        // Using remote server to allow cross-origin requests.\n        // doc: http://tinyurl.com/odz664a\n        // doc: http://tinyurl.com/p9zruzn\n        var xhr = new window.XMLHttpRequest();\n        xhr.open('POST', 'http://reeksite.com/public/xhr.php', true);\n        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n        xhr.onload = function () {\n          var res = xhr.responseText;\n          var json = JSON && JSON.parse(res);\n          Object.defineProperty(xhr, \"responseText\", {\n            enumerable : true,\n            configurable : true,\n            writable : true,\n            value : json.response\n          });\n          settings.onload(xhr);\n        };\n        xhr.send(Aak.serialize(settings));\n      }\n    },\n    deleteValue : function (name) {\n      if (typeof GM_deleteValue !== \"undefined\" && !name) {\n        var vals = GM_listValues();\n        for (var i in vals) {\n          if (vals.hasOwnProperty(i))\n            GM_deleteValue(vals[i]);\n        }\n      } else if (typeof GM_deleteValue !== \"undefined\") {\n        GM_deleteValue(name);\n      }\n    },\n    setValue : function (name, value) {\n      if (typeof GM_setValue !== \"undefined\") {\n        GM_setValue(name, value);\n      }\n    },\n    getValue : function (name) {\n      if (typeof GM_listValues !== \"undefined\" && !name) {\n        var list = {};\n        var vals = GM_listValues();\n        for (var i in vals) {\n          if (vals.hasOwnProperty(i))\n            list[vals[i]] = GM_getValue(vals[i]);\n        }\n        return list;\n      } else if (typeof GM_getValue !== \"undefined\" && typeof GM_getValue(name) !== \"undefined\") {\n        return GM_getValue(name);\n      } else {\n        return null;\n      }\n    },\n    setLocal : function (name, value) {\n      try {\n        // SecurityError: The operation is insecure.\n        // doc: http://tinyurl.com/8peqwvd\n        if (typeof window.localStorage !== \"undefined\") {\n          window.localStorage.setItem(name, value.toString());\n        } else {\n          Aak.warn(\"Sorry! No Web Storage support.\");\n        }\n      } catch (e) {}\n    },\n    getLocal : function (name) {\n      try {\n        if (typeof window.localStorage !== \"undefined\") {\n          return window.localStorage.getItem(name);\n        } else {\n          Aak.warn(\"Sorry! No Web Storage support.\");\n          return null;\n        }\n      } catch (e) {\n        return null;\n      }\n    },\n    setSession : function (name, value) {\n      try {\n        // Doc: http://tinyurl.com/8peqwvd\n        if (typeof window.sessionStorage !== \"undefined\") {\n          window.sessionStorage.setItem(name, value.toString());\n        } else {\n          Aak.warn(\"Sorry! No Web Storage support.\");\n        }\n      } catch (e) {}\n    },\n    getSession : function (name) {\n      try {\n        if (typeof window.sessionStorage !== \"undefined\") {\n          return window.sessionStorage.getItem(name);\n        } else {\n          Aak.warn(\"Sorry! No Web Storage support.\");\n          return null;\n        }\n      } catch (e) {\n        return null;\n      }\n    },\n    setCookie : function (name, value, time, path) {\n      var expires = new Date();\n      expires.setTime(new Date().getTime() + (time || 365 * 24 * 60 * 60 * 1000));\n      document.cookie = name + \"=\" + encodeURIComponent(value) + \";expires=\" + expires.toGMTString() + \";path=\" + (path || '/');\n    },\n    getCookie : function (name) {\n      var value = \"; \" + document.cookie;\n      var parts = value.split(\"; \" + name + \"=\");\n      if (parts.length == 2)\n        return parts.pop().split(\";\").shift();\n    },\n    setReadOnly : function (name, value) {\n      Object.defineProperty(Aak.uw, name, {\n        value : value,\n        configurable : false,\n        writable : false\n      });\n    },\n    stopRedirect : function () {\n      if ('watch' in window) {\n        Aak.uw.watch(\"location\", function () {});\n        Aak.uw.location.watch(\"href\", function () {});\n      } else {\n        Aak.uw.location = \"#\";\n        throw 'Stop Redirect';\n      }\n    },\n    confirmLeave : function () {\n      window.onbeforeunload = function () {\n        return '';\n      };\n    },\n    confirmReport : function (elem) {\n      elem.innerHTML = 'Report';\n      elem.title = 'Report issue or anti-adblock';\n      elem.onclick = function (e) {\n        e.preventDefault();\n        if (window.confirm(\"Do you want to report issue or anti-adblock ?\")) { // Clic on OK\n          Aak.go(Aak.reportURL);\n        } else {\n          Aak.go(elem.href);\n        }\n      };\n    },\n    unpackScript : function (source) {\n      // deobfuscate: pac+ked, pac+ker, mun+ged, wi+se\n      // note: \"Exception 403008\" see greasefork PM\n      var substring = source.substring(source.indexOf('eval(')+4, source.lastIndexOf(')')+1);\n      return new Function('return '+substring)();\n    },\n    hasScript : function (contains, doc) {\n      // by: Watilin\n      return Array.prototype.filter.call(\n        doc && doc.scripts || document.scripts,\n        function ($script) {\n        var source = $script.innerHTML;\n        return source && source.indexOf(contains) != -1;\n      })[0];\n    },\n    addScript : function (source, body) {\n      var script = document.createElement('script');\n      script.type = \"text/javascript\";\n      script.innerHTML = (typeof source === 'function') ? Aak.intoString(source) : source.toString();\n      if (body) {\n        document.body.appendChild(script);\n      } else {\n        document.head.appendChild(script);\n      }\n      script.remove();\n    },\n    loadScript : function (src, body, onload) {\n      var script = document.createElement('script');\n      script.type = \"text/javascript\";\n      script.src = src;\n      if (onload) {\n        script.onload = onload;\n      }\n      if (body) {\n        document.body.appendChild(script);\n      } else {\n        document.head.appendChild(script);\n      }\n    },\n    importScript : function (url, callback) {\n      Aak.request({\n        url : url,\n        onload : function (result) {\n          var rawScript = result.responseText;\n          (new Function('Aak', rawScript + '\\n\\r' + Aak.intoString(callback)))(Aak);\n        }\n      });\n    },\n    intoString : function (a) {\n      if (typeof a === 'function') {\n        var str = a.toString();\n        var first = str.indexOf(\"{\") + 1;\n        var last = str.lastIndexOf(\"}\");\n        return str.substr(first, last - first).trim();\n      } else if (typeof entry === 'object') {\n        return JSON.stringify(a);\n      } else { // array or string\n        return a.toString();\n      }\n    },\n    intoArray : function (a) {\n      if (typeof a === 'object') {\n        return Object.keys(a).map(function (key) {\n          return a[key];\n        });\n      } else if (typeof a === 'string') {\n        return JSON.parse(a);\n      } else if (Array.isArray(a)) {\n        return a;\n      }\n    },\n    intoObject : function (a) {\n      if (typeof a === 'string') {\n        return JSON.parse(a);\n      } else if (Array.isArray(a)) {\n        for (var i = 0, o = {}; i \u003C a.length; ++i) {\n          o[i] = a[i];\n        }\n        return o;\n      } else if (typeof a === 'object') {\n        return a;\n      }\n    },\n    hasElement : function (selector, callback, timeout) {\n      var repeat = timeout || 10;\n      var loop = setInterval(function () {\n          var elem = Aak.getElement(selector);\n          if (elem) {\n            callback(elem);\n            clearInterval(loop);\n          }\n          repeat = (repeat) ? repeat - 1 : clearInterval(loop);\n        }, 1e3);\n    },\n    removeElement : function (elem) {\n      if (elem instanceof window.HTMLElement) {\n        elem.remove();\n      } else if (typeof elem === \"string\") {\n        elem = document.querySelectorAll(elem);\n        for (var i = 0; i \u003C elem.length; i++) {\n          elem[i].remove();\n        }\n      }\n    },\n    getElement : function (selector, contextNode) {\n      if (typeof selector === 'string') {\n        if (selector.indexOf('/') === 0) { // ex: //img[@class=\"photo\"]\n          return document.evaluate(selector, contextNode || document, null, window.XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n        }\n        return (contextNode || document).querySelector(selector);\n      } else if (selector instanceof window.HTMLElement) {\n        return selector;\n      }\n    },\n    createElement : function (props) {\n      var elem,\n      node = {};\n      for (var name in props) {\n        if (props.hasOwnProperty(name)) {\n          switch (name) {\n          case \"tag\":\n            node = document.createElement(props[name]);\n            break;\n          case \"text\":\n            var text = ('innerText' in document) ? 'innerText' : 'textContent';\n            node[text] = props[name];\n            break;\n          case \"html\":\n            node.innerHTML = props[name];\n            break;\n          case \"classid\":\n            node.className = props[name];\n            break;\n          case \"append\":\n            elem = Aak.getElement(props[name]);\n            elem.appendChild(node);\n            break;\n          case \"prepend\":\n            elem = Aak.getElement(props[name]);\n            if (elem.childNodes.length) {\n              elem.insertBefore(node, elem.childNodes[0]);\n            } else {\n              elem.appendChild(node);\n            }\n            break;\n          case \"before\":\n            elem = Aak.getElement(props[name]);\n            elem.parentNode.insertBefore(node, elem);\n            break;\n          case \"after\":\n            elem = Aak.getElement(props[name]);\n            elem.parentNode.insertBefore(node, elem.nextSibling);\n            break;\n          case \"replace\":\n            elem = Aak.getElement(props[name]);\n            elem.parentNode.replaceChild(node, elem);\n            break;\n          case \"event\":\n            for (var evName in props.event) {\n              if (props.event.hasOwnProperty(evName))\n                node.addEventListener(evName, props.event[evName]);\n            }\n            break;\n          case \"callback\":\n            props[name](node);\n            break;\n          default:\n            node.setAttribute(name, props[name]);\n          }\n        }\n      }\n      return node;\n    },\n    addBaitElement : function (strOpts) { // ex: div.ads or span#ads@\n      var opts = strOpts.replace('.', ':className:').replace('#', ':id:').split(':');\n      var bait = document.createElement(opts[0]);\n      bait.setAttribute(opts[1], opts[2]);\n      bait.innerHTML = \"\u003Cbr>\";\n      document.documentElement.appendChild(bait);\n      return bait;\n    },\n    replaceElement : function (oldNode, newNode) {\n      oldNode.parentNode.replaceChild(newNode, oldNode);\n    },\n    setElement : function (selector, props) {\n      var node = Aak.getElement(selector);\n      if (node) {\n        for (var name in props) {\n          if (props.hasOwnProperty(name)) {\n            switch (name) {\n            case \"text\":\n              var text = ('innerText' in document) ? 'innerText' : 'textContent';\n              node[text] = props[name];\n              break;\n            case \"html\":\n              node.innerHTML = props[name];\n              break;\n            case \"class\":\n              node.className = props[name];\n              break;\n            default:\n              node.setAttribute(name, props[name]);\n            }\n          }\n        }\n      }\n    },\n    addStyle : function (css) {\n      css = css.replace(/;/g, ' !important;');\n      if (typeof GM_addStyle != 'undefined') {\n        GM_addStyle(css);\n      } else {\n        document.head.appendChild(document.createElement('style')).innerHTML = css;\n      }\n    },\n    loadStyle : function (src) {\n      var style = document.createElement('link');\n      style.rel = \"stylesheet\";\n      style.href = sr�̨»ùc;\n      document.head.appendChild(style);\n    },\n    getStyle : function (selector, prop) {\n      var elem = Aak.getElement(selector);\n      if (elem.currentStyle) {\n        return elem.currentStyle[prop];\n      } else if (window.getComputedStyle) {\n        return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);\n      }\n    },\n    decodeURI : function (str) {\n      return decodeURIComponent(str);\n    },\n    encodeURI : function (str) {\n      return encodeURIComponent(str);\n    },\n    encodeHTML : function (str) {\n      return String(str).replace(/&/g, '&amp;').replace(/\u003C/g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n    },\n    decodeHTML : function (str) {\n      return String(str).replace(/&amp;/g, '&').replace(/&lt;/g, '\u003C').replace(/&gt;/g, '>').replace(/&quot;/g, '\"');\n    },\n    serialize : function (obj) {\n      if (typeof obj == 'object') {\n        var arr = [];\n        for (var prop in obj) {\n          if (obj.hasOwnProperty(prop))\n            arr.push(prop + '=' + Aak.encodeURI(obj[prop]));\n        }\n        return arr.join('&');\n      }\n      return obj;\n    },\n    unserialize : function (str) {\n      str = Aak.decodeHTML(str);\n      var arr = str.split('&');\n      var obj = {};\n      arr.forEach(function (entry) {\n        if (entry !== '' && entry.split('=')) {\n          var splits = entry.split('=');\n          obj[splits[0]] = Aak.decodeURI(splits[1]);\n        }\n      });\n      return obj;\n    },\n    unsetProperties : function (obj, props) {\n      props = (typeof props == 'string') ? props.split(',') : props;\n      for (var i = 0; i \u003C props.length; i++) {\n        var prop = props[i];\n        if (obj.hasOwnProperty(prop)) {\n          delete obj[prop];\n        }\n      }\n      return obj;\n    },\n    setProperties : function (obj1, obj2) {\n      for (var prop in obj2) {\n        if (obj2.hasOwnProperty(prop))\n          obj1[prop] = obj2[prop];\n      }\n      return obj1;\n    },\n    fixProtocolURL : function (url) {\n      if (/^http/.test(url)) { // absolute\n        return url;\n      } else if (/^\\/\\//.test(url)) { // relative\n        return 'http:' + url;\n      } else { // none\n        return 'http://' + url;\n      }\n    },\n    fakeFuckAdBlock : function (instanceName, className) {\n\n      // inject fake fuckadbluck\n      Aak.addScript(Aak.intoString(function () {\n\n          var CLASSNAME = function () {\n            var self = this;\n            var callNotDetected = false;\n            this.debug = {\n              set : function () {\n                return self;\n              },\n              get : function () {\n                return false;\n              }\n            };\n            this.onDetected = function (callback) {\n              this.on(true, callback);\n              return this;\n            };\n            this.onNotDetected = function (callback) {\n              this.on(false, callback);\n              return this;\n            };\n            this.on = function (detected, callback) {\n              if (!detected) {\n                callNotDetected = callback;\n                setTimeout(callback, 1);\n              }\n              console.info(['AntiAdbKiller', location.host, 'FuckAdBlock']);\n              return this;\n            };\n            this.setOption = function () {\n              return this;\n            };\n            this.options = {\n              set : function () {\n                return this;\n              },\n              get : function () {\n                return this;\n              }\n            };\n            this.check = function () {\n              if (callNotDetected)\n                callNotDetected();\n            };\n            this.emitEvent = function () {\n              return this;\n            };\n            this.clearEvent = function () {};\n          };\n\n          Object.defineProperties(window, {\n            CLASSNAME : {\n              value : CLASSNAME,\n              writable : false\n            }\n          });\n\n          Object.defineProperties(window, {\n            INSTANCENAME : {\n              value : new CLASSNAME(),\n              writable : false\n            }\n          });\n\n        }).replace(/INSTANCENAME/g, instanceName || 'fuckAdBlock')\n        .replace(/CLASSNAME/g, className || 'FuckAdBlock'));\n\n    }, // Events\n    onEvent : function (element, type, listener, bubbles) {\n      if (window.addEventListener) { // For all major browsers, except IE 8 and earlier\n        (element || window).addEventListener(type, listener, bubbles || false);\n      } else { // For IE 8 and earlier versions\n        (element || window).attachEvent('on' + type, listener);\n      }\n      return arguments;\n    },\n    offEvent : function (element, type, listener, bubbles) {\n      if (window.removeEventListener) { // For all major browsers, except IE 8 and earlier\n        (element || window).removeEventListener(type, listener, bubbles || false);\n      } else { // For IE 8 and earlier versions\n        (element || window).detachEvent('on' + type, listener);\n      }\n    },\n    emitEvent : function (element, type, detail, bubbles, cancelable) {\n      var event;\n      if (window.CustomEvent) {\n        event = new window.CustomEvent(type, {\n            \"detail\" : detail || undefined\n          }, bubbles || false, cancelable || false);\n      } else {\n        event = document.createEvent('CustomEvent');\n        event.initCustomEvent('on' + type, bubbles || false, cancelable || false, {\n          \"detail\" : detail || undefined\n        });\n      }\n      (element || window).dispatchEvent(event);\n    },\n    detected : function (name) {\n      if (Aak.opts.debug && Aak.opts.logDetected) {\n        Aak.emitEvent(window, 'detected', name);\n      }\n    },\n    ready : function (callback) {\n      Aak.onEvent(window, 'load', callback);\n    },\n    player : function () {\n\n      var Player = function () {\n        this.target = {};\n        this.player = {};\n        this.name = null;\n        this.version = null;\n        this.library = null;\n        this.fallback = 'vlc';\n        this.autoplay = Aak.opts.autoPlay;\n        this.args = null;\n        this.setup = {};\n        this.options = {\n          build : 'embed',\n          insert : 'replace',\n          crossSetup : true\n        };\n        this.attributes = { // flash\n          wmode : 'opaque',\n          quality : 'high',\n          bgcolor : '#000000',\n          type : 'application/x-shockwave-flash',\n          pluginspage : 'http://www.adobe.com/go/getflash',\n          allowscriptaccess : 'always', // never / always\n          allowfullscreen : true\n        };\n      };\n\n      Player.prototype = { // http://tinyurl.com/pb6fthj\n        getTargetNode : function (element) {\n\n          this.target.node = Aak.getElement(element);\n          this.target.html = this.target.node.outerHTML;\n          this.target.parent = this.target.node.parentNode;\n          this.target.tag = this.target.node.tagName;\n\n          this.attributes.id = this.attributes.name = Aak.generateID();\n          this.attributes.height = this.target.node.height || this.target.node.clientHeight || '480px';\n          this.attributes.width = this.target.node.width || this.target.node.clientWidth || '640px';\n        },\n        getMimeType : function (type) {\n          // doc: http://tinyurl.com/jrs8fgz\n          switch (type.toLowerCase()) {\n          case 'mp4':\n            return 'video/mp4';\n          case 'webm':\n            return 'video/webm';\n          case 'ogg':\n          case 'ogv':\n            return 'video/ogg';\n          case 'flv':\n            return 'video/x-flv';\n          case 'hls':\n            return 'application/x-mpegURL';\n          case 'hds':\n            return 'application/f4m+xml';\n          default:\n            return type;\n          }\n        },\n        building : function (tagName) {\n          var self = this;\n\n          if (Aak.opts.forceVLC && this.name !== 'vlc') {\n            Aak.info('force playing with VLC');\n            return this.vlc.apply(this, this.args);\n          }\n\n          switch (tagName) {\n          case 'iframe':\n            this.player.node = document.createElement('iframe');\n            this.player.node.setAttribute('src', this.attributes.src || location.protocol + '//' + location.host + '/');\n            if (this.attributes.srcdoc) {\n              if (this.player.node.hasAttribute(\"srcdoc\") || 'srcdoc' in this.player.node) {\n                this.player.node.setAttribute('srcdoc', this.attributes.srcdoc);\n              } else {\n                // does not work correctly with flowplayer\n                this.player.node.setAttribute('src', \"data:text/html;charset=utf-8,\" + encodeURIComponent(this.attributes.srcdoc));\n              }\n            }\n            this.player.node.setAttribute('width', this.setup.width);\n            this.player.node.setAttribute('height', this.setup.height);\n            this.player.node.setAttribute('style', 'height:' + this.setup.height + 'px; width:' + this.setup.width + 'px;');\n            this.player.node.setAttribute('frameborder', 0);\n            this.player.node.setAttribute('scrolling', 'no');\n            this.player.node.setAttribute('allowfullscreen', true); // http://tinyurl.com/oyyehab\n            // allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen\n            break;\n          case 'video':\n            var attrName;\n            this.player.node = document.createElement('video');\n            for (attrName in this.attributes) {\n              if (this.attributes.hasOwnProperty(attrName))\n                this.player.node.setAttribute(attrName, this.attributes[attrName]);\n            }\n\n            if (this.attributes.autoplay) { // fix bug duplicate playing on firefox/chrome\n              this.player.node.onloadstart = function () {\n                //this.play();\n              };\n            }\n\n            this.player.node.onerror = function () { // switch to plugin player\n              setTimeout(function () {\n                self.args[0] = self.player.node;\n                self.vlcplayer.apply(self, self.args);\n              }, 5000);\n            };\n            break;\n          default: // embed\n            this.player.node = document.createElement('embed');\n            for (attrName in this.attributes) {\n              if (this.attributes.hasOwnProperty(attrName))\n                this.player.node.setAttribute(attrName, this.attributes[attrName]);\n            }\n          }\n          this.player.html = this.player.node.outerHTML;\n          this.player.tag = this.player.node.tagName;\n          this.inserting();\n        },\n        inserting : function () {\n          switch (this.options.insert) {\n          case 'inner':\n            this.target.node.innerHTML = this.player.html;\n            break;\n          case 'append':\n            this.target.parent.replaceChild(this.player.node);\n            break;\n          default: // replace\n            this.target.parent.replaceChild(this.player.node, this.target.node);\n          }\n          if (Aak.opts.logPlayer) {\n            Aak.log('player', this);\n          }\n          return this;\n        },\n        editing : function (elem, opts) { // review\n          Aak.hasElement(elem, function (thisElement) {\n            var obj,\n            swf,\n            value,\n            parts,\n            param,\n            attributes,\n            attrName;\n            var so = thisElement;\n            var clone = so.cloneNode(true);\n\n            // set attriibutes\n            if (opts.setAttribute) {\n              attributes = opts.setAttribute;\n              for (attrName in attributes) {\n                if (clone.querySelector('param[name=\"' + attrName + '\"]')) {\n                  clone.querySelector('param[name=\"' + attrName + '\"]').value = attributes[attrName];\n                } else if (clone.getAttribute(attrName)) {\n                  clone.setAttribute(attrName, attributes[attrName]);\n                }\n              }\n            }\n\n            // unset attributes\n            if (opts.unsetAttributes) {\n              attributes = opts.delAttributes;\n              for (attrName in attributes) {\n                if (clone.querySelector('param[name=\"' + attrName + '\"]')) {\n                  Aak.removeElement(clone.querySelector('param[name=\"' + attrName + '\"]'));\n                } else if (clone.getAttribute(attrName)) {\n                  delete attributes[attrName];\n                }\n              }\n            }\n\n            if (opts.setFlashvars || opts.unsetFlashvars) {\n              if (clone.querySelector('param[name=\"flashvars\"]')) {\n                param = clone.querySelector('param[name=\"flashvars\"]');\n                value = param.value;\n              } else if (clone.getAttribute('flashvars')) {\n                value = clone.getAttribute('flashvars');\n              } else if (clone.getAttribute('data') && clone.getAttribute('data').indexOf('?') >= 0) {\n                parts = clone.getAttribute('data').split('?', 2);\n                swf = parts.shift();\n                value = parts.shift();\n              }\n\n              obj = Aak.unserialize(value);\n              if (opts.setFlashvars) {\n                obj = Aak.setProperties(obj, opts.setFlashvars);\n              }\n              if (opts.unsetFlashvars) {\n                obj = Aak.unsetProperties(obj, opts.unsetFlashvars);\n              }\n              value = Aak.serialize(obj);\n\n              if (param) {\n                param.value = value;\n              } else if (swf) {\n                clone.setAttribute('data', swf + '?' + value);\n              } else {\n                clone.setAttribute('flashvars', value);\n              }\n            }\n            // replace\n            Aak.log(so, clone, obj);\n            Aak.replaceElement(so, clone);\n          });\n        },\n        embedding : function (id, setup, attributes, options) { \n        \n          this.getTargetNode(id);\n          this.args = arguments;\n          this.attributes = Aak.setProperties(this.attributes, attributes || {});\n          this.options = Aak.setProperties(this.options, options || {});\n\n          this.attributes.src = setup.swf;\n          this.attributes.id = this.attributes.name = Aak.generateID();\n          this.attributes.height = setup.height || this.attributes.height;\n          this.attributes.width = setup.width || this.attributes.width;\n          this.attributes.flashvars = Aak.serialize(setup);\n          this.attributes = Aak.unsetProperties(this.attributes, 'swf');\n\n          this.building('embed');\n        },\n        jwplayer : function (id, setup, attributes, options) {\n          // JwPlayer 7 (flash/html5)\n          // note: problem with ssl\n          // setup: http://tinyurl.com/hhrgjap, http://tinyurl.com/gqs46tm\n          // api: https://developer.jwplayer.com/jw-player/docs/developer-guide/api/javascript_api_reference/\n          // hls: http://tinyurl.com/pxl9scq\n          // hls-tester: http://demo.jwplayer.com/stream-tester/\n          // rtmp-demo: https://www.scaleengine.com/jw6\n          // iframe: http://tinyurl.com/86agg68\n\n          this.getTargetNode(id);\n          this.args = arguments;\n          this.attributes = Aak.setProperties(this.attributes, attributes || {});\n          this.options = Aak.setProperties(this.options, options || {});\n\n          this.setup = setup;\n          if (this.options.crossSetup === true) {\n            this.setup = {\n              controls : true,\n              file : setup.source,\n              abouttext : Aak.name,\n              aboutlink : Aak.homeURL,\n              width : setup.width || this.attributes.width,\n              height : setup.height || this.attributes.height,\n              autostart : setup.autoplay || this.autoplay,\n              primary : 'html5',\n              preload : 'auto',\n              skin : { // Seven | Six | Five | Glow | Beelden | Vapor | Bekle | Roundster | Stormtrooper\n                name : setup.skin || \"six\" // default skin JWP6\n              }\n            };\n            if (['mp4', 'webm', 'ogg', 'ogv'].indexOf(setup.type) === -1) {\n              this.setup.primary = 'flash';\n            }\n            if (setup.type === 'hls') {\n              this.setup.hlshtml = true;\n            }\n          }\n\n          this.attributes.srcdoc = '\u003Chtml>\u003Chead>\u003Cstyle type=\"text/css\">@font-face{font-family:jw-icons;src:url(' + location.protocol + 'ssl.p.jwpcdn.com/player/v/7.4.3/jw-icons.woff) format(\"woff\"),url(' + location.protocol + '//ssl.p.jwpcdn.com/player/v/7.4.3/jw-icons.ttf) format(\"truetype\");font-weight:400;font-style:normal}\u003C/style>\u003Cscript src=\"' + location.protocol + '//content.jwplatform.com/libraries/V6NfEzT7.js\">\u003C/script>\u003Cstyle type=\"text/css\">html, body{padding:0; margin:0;}\u003C/style>\u003C/head>\u003Cbody>\u003Cdiv id=\"jw-movie\">\u003C/div>\u003Cscript>jwplayer(\"jw-movie\").setup(' + JSON.stringify(this.setup) + ');\u003C/script>\u003C/body>\u003C/html>';\n\n          this.building('iframe');\n        },\n        videojs : function (id, setup, attributes, options) { \n          // VideoJs 5 (flash/html5)\n          // setup: http://tinyurl.com/pcgx2ob\n          // playback: http://tinyurl.com/nscztmm\n          // demo: http://jsfiddle.net/N8Zs5/18/\n          // plugins: https://github.com/videojs/video.js/wiki/Plugins\n\n          this.getTargetNode(id);\n          this.args = arguments;\n          this.attributes = Aak.setProperties(this.attributes, attributes || {});\n          this.options = Aak.setProperties(this.options, options || {});\n\n          this.setup = setup;\n          if (this.options.crossSetup === true) {\n            this.setup = {\n              controls : true,\n              preload : 'auto',\n              width : setup.width || this.attributes.width,\n              height : setup.height || this.attributes.height,\n              techOrder : [\"html5\", \"flash\"],\n              autoplay : setup.autoplay || this.autoplay,\n              sources : [{\n                  type : this.getMimeType(setup.type),\n                  src : setup.source\n                }\n              ]\n            };\n            /* don't work \n            if (setup.type === 'hls') {\n              techOrder : [\"flash\", \"html5\"],\n              this.setup.flash = {\n                //swf : \"//reeksite.com/public/swf/videojs-flashls.swf\"\n                swf : 'http://www.flashls.org/videojs/video-js.swf'\n              };\n            }\n            */\n          }\n\n          // \n          this.attributes.srcdoc = '\u003Chtml>\u003Chead>\u003Clink href=\"' + location.protocol + '//cdnjs.cloudflare.com/ajax/libs/video.js/5.10.5/alt/video-js-cdn.min.css\" rel=\"stylesheet\">\u003Cscript src=\"' + location.protocol + '//cdnjs.cloudflare.com/ajax/libs/video.js/5.10.5/video.min.js\">\u003C/script>\u003Cscript src=\"' + location.protocol + '//cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/3.1.0/videojs-contrib-hls.min.js\">\u003C/script>\u003Cstyle type=\"text/css\">html, body{padding:0; margin:0;}.vjs-default-skin{color:#eee}.vjs-default-skin .vjs-play-progress,.vjs-default-skin .vjs-volume-level{background-color:#eee}.vjs-default-skin .vjs-big-play-button,.vjs-default-skin .vjs-control-bar{background:rgba(0,0,0,.2)}.vjs-default-skin .vjs-slider{background:rgba(0,0,0,.3)}\u003C/style>\u003C/head>\u003Cbody>\u003Cvideo id=\"vjs-movie\" class=\"video-js vjs-default-skin vjs-big-play-centered\">\u003C/video>\u003Cscript>videojs(\"vjs-movie\", ' + JSON.stringify(this.setup) + ')\u003C/script>\u003C/body>\u003C/html>';\n\n          this.building('iframe');\n        },\n        flowplayer : function (id, setup, attributes, options) {\n          // FlowPlayer 6 (flash)\n          // note: problem with flashplayer\n          // support: mp4, flv, f4v, m4v, mov\n          // setup: https://flowplayer.org/docs/setup.html\n          // api: https://flowplayer.org/docs/api.html\n          // demo: http://demos.flowplayer.org/basics/js-setup-autoplay.html\n          // hds: https://flowplayer.electroteque.org/httpstreaming-hds/fp6\n          // hls: http://demos.flowplayer.org/api/hlsjs.html\n          // flv: http://demos.flowplayer.org/basics/flv.html\n\n          this.getTargetNode(id);\n          this.args = arguments;\n          this.attributes = Aak.setProperties(this.attributes, attributes || {});\n          this.options = Aak.setProperties(this.options, options || {});\n\n          this.setup = setup;\n          if (this.options.crossSetup === true) {\n            this.setup = {\n              width : setup.width || this.attributes.width,\n              height : setup.height || this.attributes.height,\n              autoplay : setup.autoplay || this.autoplay,\n              preload : 'auto'\n            };\n            if (setup.type === 'hls') {\n              this.setup.swf = location.protocol + '//releases.flowplayer.org/6.0.5/flowplayerhls.swf';\n              this.setup.engine = 'hlsjs';\n            } else if (['mp4', 'webm', 'ogg', 'ogv'].indexOf(setup.type) === -1) {\n              this.setup.swf = location.protocol + '//releases.flowplayer.org/6.0.5/flowplayer.swf';\n              this.setup.engine = 'flash';\n              this.setup.type = 'video/flash';\n            }\n            this.setup.clip = {\n              sources : [{\n                  type : this.getMimeType(this.setup.type || setup.type),\n                  src : setup.source\n                }\n              ]\n            };\n          }\n\n          this.attributes.srcdoc = '\u003Chtml>\u003Chead>\u003Clink rel=\"stylesheet\" href=\"' + location.protocol + '//releases.flowplayer.org/6.0.5/skin/functional.css\">\u003C/script>\u003Cscript src=\"' + location.protocol + '//code.jquery.com/jquery-1.11.2.min.js\">\u003C/script>\u003Cscript src=\"' + location.protocol + '//releases.flowplayer.org/6.0.5/flowplayer.min.js\">\u003C/script>\u003Cstyle type=\"text/css\">html, body{padding:0; margin:0;}\u003C/style>\u003C/head>\u003Cbody>\u003Cdiv id=\"fp-movie\">\u003C/div>\u003Cscript>flowplayer(\"#fp-movie\", ' + JSON.stringify(this.setup) + ');\u003C/script>\u003C/body>\u003C/html>';\n\n          this.building('iframe');\n        },\n        grindplayer : function (id, setup, attributes, options) {\n          // GrindPlayer 1 (flash)\n          // setup: http://osmfhls.kutu.ru/docs/grind/\n          // support: hls, rtmp\n\n          this.getTargetNode(id);\n          this.args = arguments;\n          this.attributes = Aak.setProperties(this.attributes, attributes || {});\n          this.options = Aak.setProperties(this.options, options || {});\n\n          this.setup = setup;\n          if (this.options.crossSetup === true) {\n            this.setup = {\n              src : setup.source,\n              streamType : \"live\",\n              scaleMode : \"letterbox\",\n              autoPlay : setup.autoplay || this.autoplay\n            };\n            if (setup.type === 'hls') {\n              this.setup.plugin_hls = \"//reeksite.com/public/swf/flashlsOSMF.swf\";\n            }\n            if (setup.proxy === true) {\n              this.setup.src = '//www.dianshibo.com/fetch.php/' + setup.source.substring(setup.source.indexOf('//') + 2);\n            }\n          }\n\n          this.attributes.src = setup.swf || this.attributes.src || \"//reeksite.com/public/swf/GrindPlayer.swf\";\n          this.attributes.height = setup.height || this.attributes.height;\n          this.attributes.width = setup.width || this.attributes.width;\n          this.attributes.flashvars = Aak.serialize(this.setup);\n\n          this.building('embed');\n        },\n        vlc : function (id, setup, attributes, options) {\n          // VLC Web Plugin (plugin)\n          // doc: http://tinyurl.com/omlzp39\n          // plugins: about:plugins\n          // chrome://flags/#enable-npapi\n          // https://www.chromium.org/developers/npapi-deprecation\n          // In September 2015 (Chrome 45) we will remove the override and NPAPI support will be permanently removed from Chrome. Installed extensions that require NPAPI plugins will no longer be able to load those plugins.\n\n          this.name = 'vlc';\n          this.getTargetNode(id);\n          this.args = arguments;\n          this.attributes = Aak.setProperties(this.attributes, attributes || {});\n          this.options = Aak.setProperties(this.options, options || {});\n\n          this.setup = setup;\n          if (this.options.crossSetup === true) {\n            this.attributes.src = setup.source;\n            this.attributes.height = setup.height || this.attributes.height;\n            this.attributes.width = setup.width || this.attributes.width;\n            this.attributes.controls = true;\n            if (setup.autoplay || this.autoplay) {\n              this.attributes.autoplay = true;\n            }\n          }\n\n          this.attributes.type = \"application/x-vlc-plugin\";\n          this.attributes.pluginspage = \"http://www.videolan.org\";\n          this.building('embed');\n        },\n        html5 : function (id, setup, attributes, options) { \n          // Video Tag (html5)\n          // basics: https://html5rocks.com/en/tutorials/video/basics/\n          // tag: http://www.w3schools.com/tags/tag_video.asp\n          // support: mp4, webm, ogg\n          // test: http://www.quirksmode.org/html5/tests/video.html\n\n          this.options = Aak.setProperties(this.options, options || {});\n\n          this.getTargetNode(id);\n          this.args = arguments;\n          this.attributes = Aak.setProperties({}, setup || {});\n          this.attributes.src = setup.source;\n          this.attributes.id = this.attributes.name = Aak.generateID();\n          this.attributes.height = this.attributes.height || this.target.node.clientHeight || \"100%\";\n          this.attributes.width = this.attributes.width || this.target.node.clientWidth || \"100%\";\n          this.attributes.type = this.getMimeType(this.attributes.type);\n          this.attributes.controls = 'controls';\n          this.attributes.preload = 'none';\n          if (this.attributes.autoplay || this.autoplay) {\n            this.attributes.autoplay = 'autoplay';\n          }\n          this.attributes.style = 'display: block; margin:0 auto;';\n          this.attributes = Aak.unsetProperties(this.attributes, 'source');\n\n          this.building('video');\n        }\n      };\n      \n      return new Player();\n    },\n    rules : {\n      // --------------------------------------------------------------------------------------------\n      // Anti-Adblock Killer\n      // --------------------------------------------------------------------------------------------\n      settings : {\n        host : ['localhost', 'reek.github.io', 'reeksite.com'],\n        onEnd : function () {\n\n          if (/\\/anti-adblock-killer(-pages)?\\/$/.test(location.pathname)) {\n            var settingsBox = Aak.getElement('#aak-settings-box');\n            var settingsNotice = Aak.getElement('#aak-settings-notice');\n\n            if (!Aak.useGM) {\n              settingsNotice.querySelector('div').innerHTML = 'In native mode, you must edit the options manually: \u003Ca href=\"' + Aak.nativeURL + '\">See\u003C/a>';\n            } else if (settingsBox && settingsNotice) {\n              settingsNotice.style.display = 'none';\n              settingsBox.style.display = 'block';\n              Aak.info('GM storage:', Aak.getValue());\n              Aak.info('GM options:', Aak.opts);\n              Aak.info('GM api:', Aak.useGM && Aak.apiGM());\n\n              // user config\n              Aak.createElement({\n                tag : 'div',\n                html : 'Version: ' + Aak.getVersion() + ' \u003Cbr>AakScript: true \u003Cbr>AakList: ' + (!Aak.getElement('#k2Uw7isHrMm5JXP1Vwdxc567ZKc1aZ4I')) + ' \u003Cbr>Browser: ' + Aak.getBrowser() + ' \u003Cbr>ScriptManager: ' + Aak.getScriptManager(),\n                append : '#aak-settings-config'\n              });\n\n              // create options \n              for (var optName in Aak.options) {\n                if (Aak.options.hasOwnProperty(optName)) {\n                  var opt = Aak.options[optName];\n                  var checked = Aak.opts[optName] === true ? \"checked\" : '';\n                  Aak.createElement({\n                    tag : 'div',\n                    html : '\u003Cinput id=\"' + optName + '\" class=\"css-checkbox\" ' + checked + ' type=\"' + opt.type + '\"/>\u003Clabel for=\"' + optName + '\" title=\"' + opt.info + '\" class=\"css-label\">' + opt.label + '\u003C/label>',\n                    append : '#aak-settings-' + opt.group\n                  });\n                }\n              }\n\n              // save options \n              Aak.onEvent(Aak.getElement(\"#aak-settings-save\"), \"click\", function () {\n                var elems = document.querySelectorAll('.css-checkbox');\n                for (var i = 0; i \u003C elems.length; i++) {\n                  var elem = elems[i];\n                  if (elem.checked) {\n                    Aak.setValue(elem.id, true);\n                  } else {\n                    Aak.setValue(elem.id, false);\n                  }\n                }\n                window.alert('Saved !');\n              });\n\n              // Clear GM storage\n              Aak.addCommands({\n                caption : 'Clear GM storage',\n                execute : function () {\n                  Aak.deleteValue();\n                  window.alert('Cleared !');\n                }\n              });\n            }\n          }\n        }\n      },\n      userscripts_domains : { // Redirect to Github\n        host : ['userscripts.org', 'userscripts.org:8080', 'userscripts-mirror.org'],\n        onStart : function () {\n          if (/155840$/.test(location.pathname)) {\n            Aak.go(Aak.homeURL);\n          }\n        }\n      },\n      openuserjs_org : {\n        host : ['openuserjs.org'],\n        onIdle : function () {\n          var element = Aak.getElement('a[href$=\"/issues\"]');\n          if (/Anti-Adblock_Killer_Reek/.test(location.pathname) && element) {\n            Aak.confirmReport(element);\n          }\n        }\n      },\n      greasyfork_org : {\n        host : ['greasyfork.org'],\n        onIdle : function () {\n          var element = Aak.getElement('a[href$=\"/feedback\"]');\n          if (/-anti-adblock-killer-reek/.test(location.pathname) && element) {\n            Aak.confirmReport(element);\n          }\n        }\n      },\n      monkeyguts_com : {\n        host : ['monkeyguts.com'],\n        onIdle : function () {\n          var element = Aak.getElement('a[href*=\"code.php?nav=forum\"]');\n          if (/monkeyguts.com\\/code.php\\?id=351/.test(location.href) && element) {\n            Aak.confirmReport(element);\n          }\n        }\n      },\n      // --------------------------------------------------------------------------------------------\n      // Specific\n      // --------------------------------------------------------------------------------------------\n      blogspot : {\n        // No Country Redirect (NCR)\n        // Prevent Blogger from Redirecting to Country-Specific Domains\n        // doc: http://tinyurl.com/7rm34jo\n        // issue: https://greasyfork.org/fr/forum/discussion/5953\n        // issue: https://github.com/reek/anti-adblock-killer/issues/490\n        // test: http://tinyurl.com/nomcxkc\n        host : ['.blogspot.'],\n        onStart : function () {\n          if (Aak.isTopframe) { // fix rediretion loop\n            var blog = location.host.replace('www.', '').split(\".\");\n            if (blog[blog.length - 1] != \"com\") {\n              var path = location.href.split(\"/\").slice(3).join('/');\n              Aak.go(\"http://\" + blog[0] + \".blogspot.com/ncr/\" + path);\n            }\n          }\n        }\n      },\n      blogspot_knowlet3389 : {\n        // note: also added abp rule\n        // issue: https://github.com/reek/anti-adblock-killer/issues/83\n        // source: http://pastebin.com/A3mCXQ5i\n        host : ['knowlet3389.blogspot.'],\n        onStart : function () {\n          Aak.setLocal('noad', false);\n          Aak.addStyle(\"#gAds { height: 17px; } #gAd27ã7ù { height: 17px; }\");\n        }\n      },\n      uptobox_uptostream : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/351\n        host : ['uptobox.com', 'uptostream.com'],\n        onStart : function () {\n          // Old solution [deprecated]\n          var id = location.pathname.match(/[0-9a-z]{12}/);\n          if (id !== null) {\n            Aak.addStyle(\"#\" + id[0] + \" { height: 12px; }\");\n          }\n          // New 12.05.2014\n          // + abp rule (alternative solution)\n          Aak.addStyle(\"#adblocktrap { height: 12px; }\");\n        },\n        onIdle : function () {\n          // remove ads\n          Aak.removeElement('*[src^=\"http://ads.uptobox.com/\"],*[href^=\"http://ads.uptobox.com/\"]');\n        }\n      },\n      anisubsia_com : {\n        host : ['anisubsia.com'],\n        onStart : function () {\n          // + abp rule #@#.adsantilok\n          Aak.addStyle(\".adsantilok { height: 5px; }\");\n        },\n        onIdle : function () {\n          Aak.uw.jAntiBlock = function () {};\n          Aak.uw.CekBlok = function () {};\n        }\n      },\n      freegameserverhost_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1512\n        host : ['freegameserverhost.com'],\n        onStart : function () {\n          Aak.addStyle(\"#fab13 { height: 11px; }\");\n        }\n      },\n      elahmad_com : {\n        host : ['elahmad.com'],\n        onStart : function () {\n          Aak.addStyle(\"#adblock { height: 1px; }\");\n        }\n      },\n      mrtzcmp3_net : {\n        host : ['mrtzcmp3.net'],\n        onStart : function () {\n          Aak.addStyle(\".rtm_ad { height: 1px; }\");\n        }\n      },\n      height_myTestAd : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1241\n        // issue: https://github.com/reek/anti-adblock-killer/issues/983\n        // issue: https://github.com/reek/anti-adblock-killer/issues/291\n        host : ['bknime.com', 'go4up.com', 'debrido.com'],\n        onStart : function () {\n          Aak.addStyle(\".myTestAd { height: 1px; }\");\n        }\n      },\n      debridfast_network : {\n        // issue: https://greasyfork.org/en/forum/discussion/9406\n        // issue: https://greasyfork.org/en/forum/discussion/7013\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1272\n        // issue: https://github.com/reek/anti-adblock-killer/issues/769\n        host : ['debridfast.com', 'getdebrid.com', 'debrid.us', 'leecher.us'],\n        onStart : function () {\n          Aak.addStyle(\".myTestAd, .my24Ad, .nabil { height: 1px; }\");\n        },\n        onIdle : function () {\n          document.querySelector('#simpleAd').innerHTML = '\u003Cp style=\"display:none;\">debridfast.com\u003C/p>';\n        }\n      },\n      bg_gledai_tv : {\n        host : ['bg-gledai.tv'],\n        onStart : function () {\n          Aak.addStyle(\".myAd { height: 1px; }\");\n        }\n      },\n      thepcspy_com : { // http://thepcspy.com/read/how_to_block_adblock/\n        host : ['thepcspy.com'],\n        onStart : function () {\n          Aak.addStyle(\".myTestAd { height: 1px; }\");\n          Aak.addStyle(\".blocked { display: none; }\");\n        },\n        onIdle : function () {\n          Aak.removeElement('.blocked');\n        }\n      },\n      vg_e24_no : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/292\n        host : ['vg.no', 'e24.no'],\n        onStart : function () {\n          // Add this rule, because EasyList allow all hidden elements.\n          Aak.addStyle(\".ad { display: none; }\");\n        }\n      },\n      automobile_sportive_com : {\n        host : ['automobile-sportive.com'],\n        onStart : function () {\n          Aak.addStyle(\".myTestAd { height: 51px; display: none; }\");\n        }\n      },\n      snsw_us : {\n        host : ['snsw.us'],\n        onStart : function () {\n          Aak.addStyle(\"#ad_1 { height: 1px; }\");\n        }\n      },\n      urlchecker_net : {\n        host : ['urlchecker.net'],\n        onStart : function () {\n          Aak.addStyle(\"#adchecker { height: 20px; }\");\n        }\n      },\n      skiplimite_tv : {\n        host : ['skiplimite.tv'],\n        onStart : function () {\n          Aak.addStyle(\"div.addthis_native_toolbox + div[id] { height: 12px; }\");\n        }\n      },\n      filecore_co_nz : {\n        host : ['filecore.co.nz'],\n        onStart : function () {\n          Aak.addStyle(\".adsense { height: 5px; }\");\n        }\n      },\n      thomas_n_ruth_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1111\n        // source: http://pastebin.com/fu7vkUA1\n        host : ['thomas-n-ruth.com'],\n        onStart : function () {\n          Aak.addStyle(\".Google { height: 5px; }\");\n        }\n      },\n      interfans_org : {\n        // test: http://www.interfans.org/forum/\n        host : ['interfans.org'],\n        onStart : function () {\n          Aak.addStyle(\".ad_global_header { height: 1px; display: none; }\");\n        }\n      },\n      maxdebrideur_com : {\n        host : ['maxdebrideur.com'],\n        onStart : function () {\n          Aak.addStyle(\".clear + div[id] { height: 12px; }\");\n        }\n      },\n      topzone_it : {\n        host : ['topzone.lt'],\n        onStart : function () {\n          Aak.addStyle(\".forumAd { height: 1px; display: none; }\");\n        }\n      },\n      nana10_co_il : {\n        host : ['.nana10.'],\n        onStart : function () {\n          Aak.addStyle(\"#advert-tracker { height: 1px; }\");\n        }\n      },\n      plej_tv : {\n        host : ['plej.tv'],\n        onStart : function () {\n          Aak.addStyle(\".advert_box { height: 1px; }\");\n        }\n      },\n      mangamint_com : {\n        // note: added rule to allow \".ad728\"\n        // issue: https://greasyfork.org/id/forum/discussion/8524\n        host : ['mangamint.com'],\n        onStart : function () {\n          Aak.addStyle(\".ad728 { height: 31px; }\");\n        }\n      },\n      debrideurstream_fr : {\n        host : ['debrideurstream.fr'],\n        onStart : function () {\n          Aak.addStyle(\"#content div[id][align=center] { height: 12px; }\");\n        }\n      },\n      preemlinks_com : {\n        host : ['preemlinks.com'],\n        onStart : function () {\n          Aak.addStyle(\"#divads { height: 1px; }\");\n        }\n      },\n      hentai_to : {\n        host : ['hentai.to'],\n        onStart : function () {\n          Aak.addStyle(\"#hentaito123 { height: 11px; }\");\n        }\n      },\n      prototurk_com : {\n        host : ['prototurk.com'],\n        onStart : function () {\n          Aak.addStyle(\"#reklam { height: 1px; }\");\n        }\n      },\n      mufa_de : {\n        host : ['mufa.de'],\n        onStart : function () {\n          Aak.addStyle(\"#leaderboard { height: 5px; }\");\n          Aak.addStyle(\"#large-rectangle { height: 5px; }\");\n          Aak.addStyle(\"#ad-header-468x60 { height: 5px; }\");\n        }\n      },\n      watcharab_com : {\n        host : ['watcharab.com'],\n        onStart : function () {\n          // + adp rule watcharab.com#@##adblock\n          Aak.addStyle(\"#adblock { height: 5px; }\");\n        }\n      },\n      freedomip_com : {\n        host : ['freedom-ip.com'],\n        onStart : function () {\n          Aak.addStyle(\".pub_vertical ins, .pub_vertical div { height: 11px; }\");\n        }\n      },\n      wakanim_tv : {\n        host : ['wakanim.tv'],\n        onStart : function () {\n          Aak.addStyle(\"#detector { display: none; }\");\n          Aak.addStyle(\"#nopub { display: block; }\");\n        }\n      },\n      simply_debrid_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/332\n        // source: http://pastebin.com/b7MAYXs4\n        host : ['simply-debrid.com'],\n        onStart : function () {\n          Aak.uw.adsbygoogle = {};\n          Aak.uw.adsbygoogle.loaded = true;\n        }\n      },\n      manga9_com : {\n        host : ['manga9.com', 'mangabee.co'],\n        onStart : function () {\n          Aak.addStyle(\".adblock { height: 31px; }\");\n        }\n      },\n      onemanga2_com : {\n        host : ['onemanga2.com'],\n        onStart : function () {\n          Aak.addStyle(\".afs_ads { height: 5px; }\");\n        }\n      },\n      mangabird_com : {\n        host : ['mangabird.com'],\n        onStart : function () {\n          Aak.addStyle(\".afs_ads { height: 5px; }\");\n        }\n      },\n      kodilive_eu : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1528\n        // source: http://pastebin.com/ZxvXKqtc\n        host : ['kodilive.eu'],\n        onStart : function () {\n          Aak.addStyle(\".Ad { height: 5px; }\");\n        }\n      },\n      backin_net : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=backin.net\n        host : ['backin.net'],\n        onStart : function () {\n          Aak.addStyle(\"#divad { height: 31px; }\");\n        }\n      },\n      mobile_tracker_free_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1082\n        host : ['mobile-tracker-free.com'],\n        onStart : function () {\n          Aak.addStyle(\"#myAds { height: 1px; }\");\n        }\n      },\n      workupload_com : {\n        // note: obfuscated\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1334\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1290\n        // source: http://pastebin.com/CPzd2Swx\n        host : ['workupload.com'],\n        onAlways : function () {\n          Aak.addStyle(\".adBlock, .adsbygoogle, #sad { height: 11px; }\");\n        }\n      },\n      today_in : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=intoday.in\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=businesstoday.in\n        // source: http://pastebin.com/gz539G7m\n        host : [\"intoday.in\", \"businesstoday.in\"],\n        onStart : function() {\n          Aak.addStyle('#adbocker_alt { display: none; }');\n          Aak.uw.openPopup = function(){};\n        }\n      },\n      jc_mp_com : {\n        // by: Giwayume\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1597\n        host : [\"jc-mp.com\"],\n        onStart : function() {\n          Aak.addStyle('.adsense {width: 1px; height: 1px; visibility: hidden; display: block; position: absolute;}');\n        }\n      },\n      mariage_franco_marocain_net : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=mariage-franco-marocain.net\n        host : [\"mariage-franco-marocain.net\"],\n        onStart : function() {\n          Aak.addStyle('#my_ad_div {height: 1px;}');\n        }\n      },\n      happy_hack_ru : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=happy-hack.ru\n        host : ['happy-hack.ru'],\n        onStart : function () {\n          Aak.addStyle(\"#blockblockF4 {visibility:invisible;display:none;} #blockblockF4 td {visibility:invisible;display:none;} #blockblockF4 td p {visibility:invisible;display:none;} #blockblockD3 {visibility:visible;display:block;}\");\n        }\n      },\n      forbes_com : {\n        // by: Giwayume\n        // issue: https://github.com/reek/anti-adblock-killer/issues/865\n        host : ['forbes.com'],\n        onStart : function () {\n          if (window.location.pathname.indexOf('/welcome') > -1) {\n            Aak.setCookie('welcomeAd', 'true', 86400000, '/');\n            Aak.setCookie('dailyWelcomeCookie', 'true', 86400000, '/');\n            window.location = Aak.getCookie('toUrl') || 'http://www.forbes.com/';\n          }\n        }\n      },\n      bait_adsbygoogle : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/547\n        host : ['bitcoinaliens.com'],\n        onStart : function () {\n          Aak.addBaitElement('ins.adsbygoogle');\n        }\n      },\n      bait_tester : {\n        host : ['osoarcade.com', 'd3brid4y0u.info', 'fileice.net', 'nosteam.ro', 'openrunner.com', 'easybillets.com', 'spox.fr', 'yovoyages.com', 'tv3.co.nz', 'freeallmusic.info', 'putlocker.com', 'sockshare.com', 'dramapassion.com', 'yooclick.com', 'online.ua'],\n        onStart : function () {\n          Aak.addBaitElement('div#tester');\n        }\n      },\n      bait_add : {\n        host : ['filecom.net', 'upshare.org', 'skippyfile.com', 'mwfiles.net', 'up-flow.org'],\n        onStart : function () {\n          Aak.addBaitElement('div#add');\n        }\n      },\n      bait_adpbtest : {\n        host : ['leaguesecretary.com', 'teknogods.com', 'hellsmedia.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#adpbtest');\n        }\n      },\n      bait_adtester : {\n        host : ['freesportsbet.com', 'sportsplays.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#ad-tester');\n        }\n      },\n      tgo_tv_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/303\n        host : ['tgo-tv.com'],\n        onStart : function () {\n          Aak.addStyle(\"#adb, #bannerad1, .load_stream { display: none; }\");\n          Aak.addBaitElement('div#tester');\n        },\n        onEnd : function () {\n          Aak.uw.threshold = 1000;\n          Aak.removeElement('.chat_frame'); // bug reload iframe\n        }\n      },\n      freegamehosting_nl : {\n        host : ['freegamehosting.nl'],\n        onStart : function () {\n          Aak.addBaitElement('div#adtest');\n        }\n      },\n      theweatherspace_com : {\n        host : ['theweatherspace.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#ab-bl-advertisement');\n        }\n      },\n      cleodesktop_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/711\n        host : ['cleodesktop.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#myTestAd');\n        }\n      },\n      imageraider_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/826\n        host : ['imageraider.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#myGContainer');\n        }\n      },\n      voici_fr : {\n        // issue: https://greasyfork.org/fr/forum/discussion/10093\n        // issue: https://github.com/reek/anti-adblock-killer/issues/826\n        // source: http://pastebin.com/zEVQHTiD\n        host : ['voici.fr', 'programme-tv.net'],\n        onStart : function () {\n          Aak.addBaitElement('div#sas_script2');\n        }\n      },\n      mil_ink : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1652\n        // source: http://pastebin.com/474NZzPJ\n        host : ['mil.ink'],\n        onStart : function () {\n          Aak.addBaitElement('div#ads_div');\n        }\n      },\n      cubeupload_com : {\n        // issue: https://greasyfork.org/en/forum/discussion/5919\n        host : ['cubeupload.com'],\n        onStart : function () {\n          Aak.createElement({\n            tag : 'iframe',\n            name : 'iframe',\n            src : 'about:blank',\n            style : 'display:none;',\n            append : document.documentElement\n          });\n        }\n      },\n      stream4free_eu : {\n        host : ['stream4free.eu'],\n        onStart : function () {\n          // +abp alt solution\n          Aak.addBaitElement('div#jpayday');\n          Aak.uw.jpayday_alert = 1;\n        }\n      },\n      _3dnews_ru : {\n        // issue: https://greasyfork.org/ru/forum/discussion/5750\n        host : ['3dnews.ru'],\n        onStart : function () {\n          Aak.setCookie('adblockwarn', 1);\n          Aak.addStyle(\"#earAds { width: 401px; }\");\n          Aak.addBaitElement('div#earAds');\n          Aak.uw.__AT_detected = true;\n        }\n      },\n      _3dsthem_es : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=3dsthem\n        host : ['3dsthem.es'],\n        onStart : function () {\n          //Aak.addScript(function () {});\n        },\n        onBeforeScript : function () {\n        /*\n          return [{\n              contains : 'main.js',\n              external : true,\n              override : '//pastebin.com/raw/2yGRPhRZ'\n            }\n          ];\n        */\n        }\n      },\n      _8muses_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=8muses\n        // issue: https://greasyfork.org/forum/discussion/8515\n        // issue: https://greasyfork.org/en/forum/discussion/6407\n        // source: http://pastebin.com/bMNDxecs\n        host : ['8muses.com'],\n        onBeforeScript : function () {\n          return [{\n              contains : \"typeof exo\",\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      happytrips_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=happytrips\n        // source: http://pastebin.com/EWSEbnvv\n        host : ['happytrips.com'],\n        onStart : function () {\n          Aak.setReadOnly('canRun', true);\n        }\n      },\n      lg_firmware_rom_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=lg-firmware-rom.com\n        host : ['lg-firmware-rom.com'],\n        onStart : function () {\n          Aak.setReadOnly('killads', true);\n        }\n      },      \n      mid_day_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=mid-day.com\n        host : ['mid-day.com'],\n        onStart : function () {\n          Aak.setReadOnly('canRun', true);\n        }\n      },\n      badtv_network : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=badtv.it\n        host : ['badtv.it', 'badtaste.it', 'badgames.it', 'badcomics.it'],\n        onStart : function () {\n          Aak.setCookie('adBlockChecked', 'disattivo');\n        }\n      },\n      independent_co_uk : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=independent.co.uk\n        host : ['independent.co.uk'],\n        onStart : function () {\n          Aak.setCookie('adblock_detected', 'ignored');\n        }\n      },\n      esmas_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=esmas.com\n        host : ['esmas.com'],\n        onStart : function () {\n          Aak.setReadOnly('opened_adbblock', false);\n        }\n      },\n      pinoy1tv_network : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=pinoy1tv\n        host : ['pinoy1tv.'],\n        onStart : function () {\n          Aak.setReadOnly('allowads', 1);\n        }\n      },\n      ewallstreeter_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=ewallstreeter.com\n        host : ['ewallstreeter.com'],\n        onStart : function () {\n          Aak.setReadOnly('OAS_rdl', 1);\n        }\n      },\n      business_standard_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=business-standard.com\n        host : ['business-standard.com'],\n        onStart : function () {\n          Aak.setReadOnly('adsLoaded', 1);\n          Aak.setCookie('_pw', 't');          \n        }\n      },\n      express_network : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=financialexpress.com\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=indianexpress.com\n        host : ['financialexpress.com', 'indianexpress.com'],\n        onStart : function () {\n          Aak.setReadOnly('RunAds', 1);\n        }\n      },\n      indiatimes_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=indiatimes\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=malayalam.samayam.com\n        // test: http://tinyurl.com/zxusvyf, \n        host : ['indiatimes.com', 'samayam.com', 'bangaloremirror.com'],\n        onBeforeScript : function () {\n          return [{\n              contains : '\\\\\\\\x61\\\\\\\\x64\\\\\\\\x62',\n              external : false,\n              remove : true\n            }, {\n              contains : 'function initBlock',\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      thechive_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1453\n        // source: http://pastebin.com/TdpPyrbb\n        host : ['thechive.com'],\n        onStart : function () {\n          Aak.addScript(function () {\n            Object.defineProperties(window, {\n              stephaneDetector : {\n                value : {\n                  hook : function (cb) {\n                    cb(false);\n                  },\n                  init : function () {},\n                  broadcastResult : function () {}\n                },\n                writable : false\n              }\n            });\n          });\n        }\n      },\n      richonrails_com : {\n        // by: Giwayume\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1447\n        // source: http://pastebin.com/Ewfwg8BG\n        host : ['richonrails.com'],\n        onIdle : function () {\n          Aak.addScript(function () {\n            var adsByGoogleHtml = '\"\u003Cins+id=\"aswift_0_expand\"+style=\"display:inline-table;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:750px;background-color:transparent\">\u003Cins+id=\"aswift_0_anchor\"+style=\"display:block;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:750px;background-color:transparent\">\u003Ciframe+marginwidth=\"0\"+marginheight=\"0\"+vspace=\"0\"+hspace=\"0\"+allowtransparency=\"true\"+scrolling=\"no\"+allowfullscreen=\"true\"+onload=\"var+i=this.id,s=window.google_iframe_oncopy,H=s&amp;&amp;s.handlers,h=H&amp;&amp;H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&amp;&amp;d&amp;&amp;(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else+if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}\"+id=\"aswift_0\"+name=\"aswift_0\"+style=\"left:0;position:absolute;top:0;\"+width=\"750\"+frameborder=\"0\"+height=\"90\">\u003C/iframe>\u003C/ins>\u003C/ins>\"';\n            $.ajax({\n              url : $(\".article-content\").data(\"url\"),\n              dataType : \"script\",\n              method : \"post\",\n              data : {\n                html : adsByGoogleHtml\n              },\n              success : function (result) {\n                var exec = result.replace(\"$('.article-content')\", \"$('.article-content-2')\");\n                new Function(exec)();\n              }\n            });\n            $(\".article-content\").after('\u003Cdiv class=\"article-content-2\">\u003C/div>').remove();\n          });\n        }\n      },\n      rmprepusb_com : {\n        host : ['rmprepusb.com'],\n        onStart : function () {\n          Aak.setCookie('jot_viewer', 3);\n        }\n      },\n      neodrive_co : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1001\n        host : ['neodrive.co'],\n        onAlways : function () {\n          // Prevent popunder\n          Aak.setCookie('KifPopCnt', 1, null, '/embed/');\n        }\n      },\n      hentaihaven_org : {\n        // issue: https://github.com/gorhill/uBlock/issues/1340\n        host : ['hentaihaven.org'],\n        onAlways : function () {\n          // Prevent popunder\n          Aak.setCookie('hh_ppndr1', 1);\n          Aak.setCookie('hh_ppndr2', 1);\n        }\n      },\n      primeshare_tv : {\n        host : ['primeshare.tv'],\n        onStart : function () {\n          Aak.addBaitElement('div#adblock');\n        }\n      },\n      debridnet_and_livedebrid : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=debridnet\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=livedebrid\n        host : ['debridnet.com', 'livedebrid.com'],\n        onStart : function () {\n          Aak.addStyle(\".myTestAd2 { height: 5px; }\");\n          Aak.addBaitElement('div.myTestAd2');\n        }\n      },\n      bluesatoshi_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/873\n        host : ['bluesatoshi.com'],\n        onStart : function () {\n          Aak.addStyle(\"#test { height: 280px; }\");\n          Aak.addBaitElement('div#test');\n        }\n      },\n      razercrypt_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/870\n        host : ['razercrypt.com'],\n        onStart : function () {\n          Aak.addStyle(\"#test { height: 250px; }\");\n          Aak.addBaitElement('div#test');\n        }\n      },\n      satoshiempire_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/872\n        host : ['satoshiempire.com'],\n        onStart : function () {\n          Aak.addStyle(\"#test { height: 250px; }\");\n          Aak.addBaitElement('div#test');\n        }\n      },\n      oneadfaucet_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/871\n        host : ['oneadfaucet.com'],\n        onStart : function () {\n          Aak.addStyle(\"#test { height: 250px; }\");\n          Aak.addBaitElement('div#test');\n        }\n      },\n      jkanime_net : {\n        host : ['jkanime.net'],\n        // @@||jkanime.net/assets/js/advertisement2.js\n        onStart : function () {\n          Aak.addBaitElement('div#reco');\n        }\n      },\n      _720pmkv_com : {\n        host : ['720pmkv.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#advert');\n        }\n      },\n      paidverts_com : {\n        host : ['paidverts.com'],\n        onStart : function () {\n          Aak.addBaitElement('div.afs_ads');\n        }\n      },\n      italiatv_org : {\n        host : ['italiatv.org'],\n        onStart : function () {\n          Aak.addBaitElement('div#fab13');\n        }\n      },\n      chrissmoove_com : {\n        host : ['chrissmoove.com'],\n        onStart : function () {\n          //Aak.addBaitElement('div#adserver');\n        }\n      },\n      eventhubs_com : {\n        host : ['eventhubs.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#blahyblaci1');\n        }\n      },\n      superanimes_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1295\n        // source: http://pastebin.com/FDPAKjTQ\n        host : ['superanimes.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#bannerLoja');\n        }\n      },\n      forum_pac_rom_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/243\n        host : ['forum.pac-rom.com'],\n        onStart : function () {\n          Aak.addBaitElement('div.banner_ads');\n        }\n      },\n      litv_tv : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1299\n        // source: http://pastebin.com/zcddvTuC\n        host : ['litv.tv'],\n        onStart : function () {\n          Aak.addBaitElement('div.player_mask');\n        }\n      },\n      leveldown_fr : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/595\n        host : ['leveldown.fr'],\n        onStart : function () {\n          Aak.addBaitElement('div#adblock');\n          Aak.addBaitElement('div#adblocktest');\n        }\n      },\n      globeslot_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/924\n        host : ['globeslot.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#add');\n          Aak.addBaitElement('div#add1');\n        }\n      },\n      antennesport_com : {\n        host : ['antennesport.com', 'serverhd.eu'],\n        onIdle : function () { // for antennesport\n          // Remove Pub\n          Aak.removeElement(\"#pub .pubclose\");\n          // Redirect to Player\n          Aak.setElement('#pub .embed iframe', {\n            src : '/embed/embed.php'\n          });\n        }\n      },\n      disableAlertbox : {\n        // issue: https://greasyfork.org/en/forum/discussion/8611\n        host : ['drivearabia.com', 'putlocker.com', 'doatoolsita.altervista.org', 'sockshare.com', 'free-movie-home.com', 'pc.online143.com', 'kooora.com', 'str3amtv.co.nr', 'str3amtv.altervista.org', 'str3am.altervista.org', 'filecom.net', 'pipocas.tv', 'generatupremium.biz', 'mega-debrid.eu', 'premiumst0re.blogspot.com', 'dl-protect.com', 'newsinlevels.com', 'vipracing.biz', 'businesstoday.in'],\n        onAlways : function () {\n          Aak.uw.alert = function () {};\n        }\n      },\n      generatupremium_biz : {\n        host : ['generatupremium.biz'],\n        onStart : function () {\n          // Disable Confirm Box\n          //Aak.uw.confirm = function (){};\n          Aak.setCookie('genera', false);\n        }\n      },\n      newstatesman_com : {\n        host : ['newstatesman.com'],\n        onStart : function () {\n          Aak.setCookie('donationPopup', 'hide');\n        }\n      },\n      adswizz_com : {\n        // by: Skr4tchGr3azyMonkiBallllllZzzz\n        // issue: https://github.com/reek/anti-adblock-killer/issues/809\n        host : ['yes.fm'],\n        onStart : function () {\n          Aak.addScript(function () {\n            window.com_adswizz_synchro_initialize = function () {};\n          });\n        }\n      },\n      derstandard_at : {\n        // by: Alexander255\n        // patch: http://pastebin.com/raw.php?i=r7Q4DrfB\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=derstandard\n        host : ['derstandard.at'],\n        onStart : function () {\n\n          var makeISOTimestampUTC = function () {\n            var pad = function (amount, width) {\n              var padding = \"\";\n              while (padding.length \u003C width - 1 && amount \u003C Math.pow(10, width - padding.length - 1)) {\n                padding += \"0\";\n              }\n              return padding + amount.toString();\n            };\n\n            var date = new Date();\n            return [pad(date.getUTCFullYear(), 4), \"-\",\n              pad(date.getUTCMonth() + 1, 2), \"-\",\n              pad(date.getUTCDate(), 2), \"T\",\n              pad(date.getUTCHours(), 2), \":\",\n              pad(date.getUTCMinutes(), 2), \":\",\n              pad(date.getUTCSeconds(), 2)].join();\n          };\n\n          document.cookie.split('; ').forEach(function (cookie) {\n            // Find main storage cookie\n            if (cookie.substr(0, 6) == \"MGUID=\") {\n              // Decompose information from main storage cookie\n              var values = {};\n              cookie.substr(6).split(\"&\").forEach(function (assignment) {\n                var pos = assignment.indexOf('=');\n                if (pos > -1) {\n                  values[assignment.substr(0, pos)] = assignment.substr(pos + 1);\n                }\n              });\n\n              // Update \"first viewed\" timestamp\n              values.Timestamp = makeISOTimestampUTC();\n\n              // Recompose information in main storage cookie\n              cookie = \"MGUID=\";\n              for (var key in values) {\n                if (values.hasOwnProperty(key)) {\n                  cookie += key + \"=\" + values[key] + \"&\";\n                }\n              }\n              cookie = cookie.substr(0, (cookie.length - 1));\n\n              // Update cookie\n              document.cookie = cookie;\n            }\n          });\n        }\n      },\n      tek_domains : {\n        // by: Reek, Alexander255\n        // issue: https://github.com/reek/anti-adblock-killer/issues/788\n        // issue: https://github.com/reek/anti-adblock-killer/issues/512\n        host : ['tek.no', 'gamer.no', 'teknofil.no', 'insidetelecom.no', 'prisguide.no', 'diskusjon.no', 'teknojobb.no', 'akam.no', 'hardware.no', 'amobil.no'],\n        onIdle : function () {\n\n          /*\n          var ad_frame = document.createElement(\"iframe\");\n          ad_frame.name = \"_frame\";\n          ad_frame.style.display = \"none\";\n          document.body.appendChild(ad_frame);\n          ad_frame.contentWindow.wrappedJSObject.inFIF = true;\n           */\n\n          // fix 27.11.2015\n          Aak.createElement({\n            tag : 'div',\n            id : 'google_ads_iframe_',\n            html : '\u003Cp>\u003C/p>',\n            append : 'body'\n          });\n\n        }\n      },\n      planetatvonlinehd_network : {\n        // issue: https://github.com/reek/anti-adblÿr§ùock-killer/issues/1467\n        // issue: https://github.com/reek/anti-adblock-killer/issues/159\n        host : ['planetatvonlinehd.blogspot.', 'planetatvonlinehd.com'],\n        onStart : function () {\n          Aak.addStyle('.adsantilok { height: 1px; }');\n          //Aak.uw.jQAntiAdsBlock = function (){}; // don't work\n        }\n      },\n      beta_speedtest_net : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/628\n        // issue: https://github.com/reek/anti-adblock-killer/issues/562\n        // issue: https://github.com/reek/anti-adblock-killer/issues/484\n        // source: http://paste2.org/53ymghX1\n        host : ['beta.speedtest.net'],\n        onAlways : function () {\n          Aak.uw.adsOoklaComReachable = true;\n          Aak.uw.scriptsLoaded = function () {};\n        }\n      },\n      binbucks_com : {\n        // by: Alexander255\n        // issue: https://github.com/reek/anti-adblock-killer/issues/545\n        host : ['binbucks.com'],\n        onIdle : function () {\n          Aak.uw.testJuicyPay = true;\n          Aak.uw.testSensePay = true;\n        }\n      },\n      whiskyprices_domains : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1284\n        // source: http://pastebin.com/Epr5tREL\n        host : ['whiskyprijzen.com', 'whiskyprices.co.uk', 'whiskypreise.com', 'whiskyprix.fr'],\n        onAlways : function () {\n          Aak.uw.OA_show = true;\n        }\n      },\n      nicoblog_org : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1184\n        // source: http://pastebin.com/MNHpLs2V\n        host : ['nicoblog.org'],\n        onIdle : function () {\n          var el = document.querySelector('.src');\n          el.removeAttribute('class');\n        }\n      },\n      di_se : {\n        // note: add this rule for chrome user\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1319\n        // source: http://pastebin.com/9bDPQzMX\n        host : ['di.se'],\n        onIdle : function () {\n          Aak.removeElement('#header_overlay');\n          Aak.removeElement('#message_modal');\n        }\n      },\n      megogo_net : {\n        // issue: PM\n        // source1: http://pastebin.com/ccHQg3hn\n        // source2: http://pastebin.com/gk0vEQHN\n        // note: two adblock check\n        host : ['megogo.net'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, \"adBlock\", {\n            enumerable : true,\n            writable : false,\n            value : false\n          });\n          Object.defineProperty(Aak.uw, \"showAdBlockMessage\", {\n            enumerable : true,\n            writable : false,\n            value : function () {}\n          });\n        }\n      },\n      libertaddigital_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1642\n        // source: http://pastebin.com/6Fzp0vrE\n        host : ['libertaddigital.com'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, \"ad_already_played\", {\n            enumerable : true,\n            writable : false,\n            value : true\n          });\n          Object.defineProperty(Aak.uw, \"puedeMostrarAds\", {\n            enumerable : true,\n            writable : false,\n            value : true\n          });\n        }\n      },     \n      folha_uol_com_br : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1396\n        // source: f( ( typeof paywall_access == \"undefined\" || paywall_access != true ) && ( typeof folha_ads == \"undefined\" || folha_ads != true ) ) {\n        host : ['folha.uol.com.br'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, \"paywall_access\", {\n            enumerable : true,\n            writable : false,\n            value : true\n          });\n          Object.defineProperty(Aak.uw, \"folha_ads\", {\n            enumerable : true,\n            writable : false,\n            value : true\n          });\n        }\n      },\n      gamer_com_tw : {\n        // by: mmis1000\n        // userscript: https://greasyfork.org/en/scripts/16525\n        // issue: : https://github.com/reek/anti-adblock-killer/issues/975\n        host : ['gamer.com.tw'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, 'AntiAd', {\n            enumerable : true,\n            writable : false,\n            value : null\n          });\n        }\n      },\n      armorgames_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/845\n        host : ['armorgames.com'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, 'ga_detect', {\n            enumerable : true,\n            writable : false,\n            value : null\n          });\n        }\n      },\n      mangahost_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/957\n        // issue: https://github.com/reek/anti-adblock-killer/issues/558\n        // source: http://pastebin.com/GrpbJENA\n        host : ['mangahost.com'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, \"testDisplay\", {\n            enumerable : true,\n            writable : false,\n            value : false\n          });\n        }\n      },\n      videowood_tv : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1339\n        // source: http://videowood.tv/build/assets/js/pembed-97a640f625.js\n        host : ['videowood.tv'],\n        onStart : function () {\n          Aak.uw.open = function () {}; // prevent popup\n          Aak.uw.config = {};\n          Object.defineProperty(Aak.uw.config, \"adb_remind\", {\n            enumerable : true,\n            writable : false,\n            value : false\n          });\n        }\n      },\n      infojobs_com_br : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1339\n        // source: http://pastebin.com/LPg6093U\n        // redirect: http://www.infojobs.com.br/nopublicity.aspx\n        host : ['infojobs.com.br'],\n        onStart : function () {\n          Aak.addScript(function () {\n            var webUI = webUI || {};\n            webUI.Utils = webUI.Utils || {};\n            Object.defineProperty(webUI.Utils, \"StopAdBlock\", {\n              enumerable : true,\n              writable : false,\n              value : function () {}\n            });\n        });\n        }\n      },\n      cloudwebcopy_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/714\n        host : ['cloudwebcopy.com'],\n        onStart : function () {\n          var setTimeoutClone = Aak.uw.setTimeout;\n          Aak.uw.setTimeout = null;\n          setTimeout(function () {\n            Aak.uw.setTimeout = setTimeoutClone;\n          }, 5000);\n        }\n      },\n      narkive_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/569\n        host : ['narkive.com'],\n        onAlways : function () {\n          Aak.uw.adblock_status = function () {\n            return false;\n          };\n        }\n      },\n      pregen_net : {\n        host : ['pregen.net'],\n        onStart : function () {\n          // skip page info\n          Aak.setCookie('pgn', 1);\n        }\n      },\n      phys_org : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/768\n        host : ['phys.org'],\n        onAlways : function () {\n          Aak.uw.chkAB = function () {};\n        }\n      },\n      onvasortir_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=onvasortir.com\n        host : ['onvasortir.com'],\n        onAlways : function () {\n          // +abp rule alt solution\n          Aak.uw.JeBloque = function () {};\n        }\n      },\n      fullhdzevki_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=fullhdzevki.com\n        host : ['fullhdzevki.com'],\n        onAlways : function () {\n          // +abp rule alt solution\n          Aak.uw.check = function () {};\n        }\n      },\n      ville_ideale_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/258\n        // source: http://pastebin.com/16mnmeMc\n        host : ['ville-ideale.com'],\n        onAlways : function () {\n          // +abp rule alt solution\n          Aak.uw.execsp = function () {};\n        }\n      },\n      notre_planete_info : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/258\n        // source: http://pastebin.com/qrS6QGGE\n        host : ['notre-planete.info'],\n        onAlways : function () {\n          // +abp rule alt solution\n          Aak.uw.pubpop = function () {};\n        }\n      },\n      apkmirror_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/378\n        // issue: https://github.com/reek/anti-adblock-killer/issues/224\n        // issue: https://github.com/reek/anti-adblock-killer/issues/78\n        host : ['apkmirror.com'],\n        onAlways : function () {\n          Aak.uw.doCheck = function () {};\n        }\n      },\n      mtlblog_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/948\n        // issue: https://greasyfork.org/forum/discussion/7753\n        // source: http://pastebin.com/BFrDPM6b\n        host : ['mtlblog.com'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, 'puabs', {\n            enumerable : true,\n            value : function () {}\n          });\n        }\n      },\n      anizm_com : {\n        // issue:\n        host : ['anizm.com'],\n        onAlways : function () {\n          Aak.uw.stopAdBlock = {};\n        }\n      },\n      diarioinformacion_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1550\n        host : ['diarioinformacion.com'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, 'pr_okvalida', {\n            enumerable : true,\n            value : true\n          });\n        }\n      },\n      cnbeta_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1301\n        // source: http://pastebin.com/vXNCztwx\n        host : ['cnbeta.com'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, 'JB', {\n            enumerable : true,\n            value : function () {}\n          });\n        }\n      },\n      themarker_haaretz : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1292\n        // source: http://pastebin.com/m08dkDT4\n        host : ['themarker.com', 'haaretz.co.il'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, 'AdBlockUtil', {\n            enumerable : true,\n            value : {}\n          });\n        }\n      },\n      pipocas_tv : {\n        // issue:\n        host : ['pipocas.tv'],\n        onStart : function () {\n          // Also added in disableAlertbox\n          // No popup\n          Aak.setCookie('popup_user_login', 'yes');\n        }\n      },\n      _15min_lt : {\n        // note: regulary update script\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=15min.it\n        // source: http://pastebin.com/YWf3HTqr\n        // test: http://tinyurl.com/h6c4336\n        host : ['15min.lt'],\n        onStart : function () {\n          Object.defineProperty(Aak.uw, 'ROUTE', {\n            enumerable : true,\n            writable : false,\n            value : '_be_reklamos'\n          });\n        }\n      },\n      sc2casts_com : {\n        // by: Giwayume\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1599\n        host : ['sc2casts.com'],\n        onStart : function() {\n          Aak.addScript(function() {\n            window._gaq = { push:function() {} };\n            Object.defineProperty(window, \"showdialog\", {\n              value: function() {},\n              configurable: false,\n              writable: false\n            });\n            Object.defineProperty(window, \"showPopup2\", {\n              value: function() {},\n              configurable: false,\n              writable: false\n            });\n          });\n        }\n      },\n      vgunetwork_com : {\n        // issue:\n        host : ['vgunetwork.com'],\n        onIdle : function () {\n          Aak.setCookie('stopIt', 1);\n          var close = Aak.getElement('#some_ad_block_key_close');\n          if (close) {\n            close.click();\n          }\n        }\n      },\n      linkcrypt_ws : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/286\n        // issue: https://github.com/reek/anti-adblock-killer/pull/67\n        host : ['linkcrypt.ws'],\n        onIdle : function () {\n          Aak.setElement('#ad_cont', {\n            id : '',\n            style : 'display:block;'\n          });\n          Aak.setElement('#container_check', {\n            style : 'display:none;'\n          });\n        }\n      },\n      eventosppv_me : {\n        // issue: \n        host : ['eventosppv.me'],\n        onIdle : function () {\n          Aak.removeElement('#nf37');\n        }\n      },\n      bolor_toli_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/552\n        host : ['bolor-toli.com'],\n        onEnd : function () {\n          var ads = document.getElementsByClassName('banner');\n          for (var i = 0; i \u003C ads.length; i++) {\n            var ad = ads[i];\n            ad.innerHTML = '\u003Cbr>';\n            ad.style.height = '1px';\n          }\n        }\n      },\n      vivo_sx : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/280\n        host : ['vivo.sx'],\n        onEnd : function () {\n          var alert = Aak.getElement('#alert-throttle');\n          if (alert) {\n            Aak.removeElement(alert);\n          }\n          var button = Aak.getElement('button#access');\n          if (button) {\n            button.removeAttribute('id');\n            button.removeAttribute('disabled');\n            button.innerHTML = 'Continue to video';\n          }\n          setTimeout(function () {\n            var input = Aak.getElement('input[name=\"throttle\"]');\n            if (input) {\n              Aak.removeElement(input);\n            }\n          }, 1000);\n        }\n      },\n      luxyad_com : { // skip redirect myanimes.li\n        // issue:\n        host : ['luxyad.com'],\n        onIdle : function () {\n          if ('/Information.php' == location.pathname) {\n            var href = location.href;\n            location.href = href.substr(href.indexOf('url=') + 4, href.length);\n          }\n        }\n      },\n      mrpiracy_domains : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1405\n        host : ['mrpiracy.xyz', 'mrpiracy.club'],\n        onBeforeScript : function () {\n          return [{\n              contains : 'Desativa o AdBlock para continuar',\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      dbplanet_net : {\n        // issue: PM\n        host : ['dbplanet.net'],\n        onStart : function () {\n          Aak.setCookie('newnoMoreAdsNow', 1);\n        }\n      },\n      aidemu_fr : {\n        // issue:\n        host : ['aidemu.fr'],\n        onStart : function () {\n          Aak.setCookie('adblockPopup', true);\n        }\n      },\n      eami_in : {\n        // issue:\n        host : ['eami.in'],\n        onAlways : function () {\n          Aak.setCookie('ad_locked', 1);\n        }\n      },\n      bigdownloader_com : {\n        // issue:\n        host : ['bigdownloader.com'],\n        onIdle : function () {\n          Aak.removeElement('#anti_adblock');\n        }\n      },\n      freeskier_com : {\n        // by: Gorhill\n        // issue: https://github.com/reek/anti-adblock-killer/issues/639\n        // note: also added list rule\n        host : ['freeskier.com'],\n        onIdle : function () {\n          var el = document.getElementById(\"adb-not-enabled\");\n          if (el !== null) {\n            el.style.removeProperty(\"display\");\n          }\n          el = document.getElementById(\"videoContainer\");\n          if (el !== null) {\n            el.style.removeProperty(\"display\");\n          }\n        }\n      },\n      gametrailers_com : {\n        // issue:\n        host : ['gametrailers.com'],\n        onIdle : function () {\n          Aak.removeElement('#ad_blocking');\n        }\n      },\n      scan_onepiece_naruto_mx : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/582\n        // issue: https://github.com/reek/anti-adblock-killer/issues/279\n        host : ['scan-mx.com', 'onepiece-mx.net', 'naruto-mx.net'],\n        onAlways : function () {\n          Aak.uw.ad_block_test = function () {};\n        },\n        onIdle : function () {\n          Aak.setElement('#yop', {\n            id : ''\n          });\n        }\n      },\n      // Bitcoins\n      bitcoinker_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/230\n        host : ['bitcoinker.com'],\n        onStart : function () {\n          Aak.uw.claim = function () {\n            return true;\n          };\n        },\n        onIdle : function () {\n          Aak.removeElement('#E33FCCcX2fW');\n        }\n      },\n      moondoge_co_in : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/384\n        // issue: https://github.com/reek/anti-adblock-killer/issues/232\n        // issue: https://github.com/reek/anti-adblock-killer/issues/233\n        // issue: https://github.com/reek/anti-adblock-killer/issues/236\n        host : ['moondoge.co.in', 'moonliteco.in', 'moonbit.co.in', 'bitcoinzebra.com'],\n        onIdle : function () {\n          Aak.removeElement('#AB, #E442Dv, #eCC5h');\n        }\n      },\n      bitcoiner_net : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/349\n        host : ['bitcoiner.net', 'litecoiner.net'],\n        onStart : function () {\n          Aak.addBaitElement('div#tester');\n          Aak.addBaitElement('div#ad-top');\n        }\n      },\n      bitcoins_nx_tc : {\n        // issue:\n        host : ['freebitcoins.nx.tc', 'getbitcoins.nx.tc'],\n        onAlways : function () {\n          Aak.uw.ad_block_test = function () {\n            return false;\n          };\n        }\n      },\n      freecoins4_me : {\n        // issue:\n        host : ['freecoins4.me'],\n        onAlways : function () {\n          Aak.uw.check = function () {\n            return false;\n          };\n        }\n      },\n      torrent_tv_ru : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/537\n        host : ['torrent-tv.ru'],\n        onAlways : function () {\n          Aak.uw.c_Oo_Advert_Shown = true;\n        }\n      },\n      cwtv_com : {\n        // by: Kalbasit\n        // pull: https://github.com/reek/anti-adblock-killer/pull/763\n        // issue: https://github.com/reek/anti-adblock-killer/issues/340\n        // issue: https://github.com/reek/anti-adblock-killer/issues/762\n        host : ['cwtv.com'],\n        onAlways : function () {\n          Aak.uw.CWTVIsAdBlocking = undefined;\n        }\n      },\n      bild_de : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=bild\n        host : ['bild.de'],\n        onBeforeScript : function () {\n          return [{\n              contains : 'http://www.bild.de/wa/ll/bild-de/unangemeldet-42925516.bild.html',\n              external : false,\n              replace : ['javascript', 'void(0);'].join(':')\n            }\n          ];\n        }\n      },\n      inn_co_il : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/532\n        host : ['inn.co.il'],\n        onStart : function () {\n          Aak.addScript(function () {\n            var TRC = {};\n            TRC.blocker = {\n              states : {\n                ABP_DETECTION_DISABLED : -2,\n                ABP_NOT_DETECTED : 0,\n                ABP_DETECTED : 1\n              },\n              createBlockDetectionDiv : function () {\n                return document.createElement(\"div\");\n              },\n              isBlockDetectedOnDiv : function () {\n                return 0;\n              },\n              isBlockDetectedOnClassNames : function () {\n                return 0;\n              },\n              getBlockedState : function () {\n                return 0;\n              }\n            };\n          });\n        }\n      },\n      bhaskar_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=bhaskar\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=divyabhaskar.co.in\n        host : ['bhaskar.com', 'divyabhaskar.co.in'],\n        onAlways : function () {\n          Aak.uw.openPopUpForBreakPage = function () {};\n          Aak.uw.canABP = true;\n          Aak.uw.canRunAds = true;\n          Aak.uw.canCheckAds = true;\n        }\n      },\n      turkanime_tv : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/446\n        // issue: https://github.com/reek/anti-adblock-killer/issues/139\n        // issue: https://greasyfork.org/tr/forum/discussion/4282/\n        host : ['turkanime.tv'],\n        onAlways : function () {\n          Aak.uw.adblockblock = function () {};\n          Aak.uw.BlokKontrol = {};\n        }\n      },\n      wtfbit_ch : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/407\n        host : ['wtfbit.ch'],\n        onAlways : function () {\n          Aak.uw.writeHTMLasJS = function () {};\n        }\n      },\n      aranzulla_it : {\n        // by: Robotex\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=aranzulla.it\n        // source: http://pastebin.com/yMM6YgxW\n        host : ['aranzulla.it'],\n        onStart : function() {\n          Aak.addStyle('#abt1 + STYLE + div[id][class] {display:none;}');\n        },\n        onBeforeScript : function () {\n          return [{\n              contains : 'navigator.userAgent||navigator.vendor||window.opera',\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      ndtv_com : {\n        // note: canRunAds inverted value\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=ndtv.com\n        // test: http://tinyurl.com/hcfncdv\n        host : ['ndtv.com'],\n        onStart : function () {\n          Aak.setReadOnly('___p__p', 1);\n          Aak.setReadOnly('getNoTopLatestNews', function () {});\n        }\n      },\n      lesechos_fr : {\n        // Reek, Giwayume\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=lesechos.fr\n        // source: http://pastebin.com/CMM8WGLj\n        host : ['lesechos.fr', 'lesechos.com'],\n        onStart : function() {\n          Aak.addScript(function() {\n            Object.defineProperty(window, \"checkAdBlock\", {\n              value: function() {},\n              configurable: false,\n              writable: false\n            });\n          });\n        },\n        onAlways : function () {\n          Aak.uw.call_Ad = 1;\n          Aak.uw.paywall_adblock_article = function () {};\n        }\n      },\n      bitvisits_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/266\n        host : ['bitvisits.com'],\n        onAlways : function () {\n          Aak.uw.blockAdblockUser = function () {};\n        }\n      },\n      exrapidleech_info : {\n        // by: Alexander255, Reek, Giwayume\n        // patch: http://pastebin.com/Q664diQ2\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=exrapidleech\n        // source: http://pastebin.com/5e27syjA\n        host : ['exrapidleech.info'],\n        onStart : function () {\n\n          var tomorrow = new Date();\n          tomorrow.setDate(tomorrow.getDate() + 1);\n\n          // prevent popup\n          Aak.setCookie('popcashpuCap', 1);\n          Aak.setCookie('popcashpu', 1);\n          Aak.setCookie('nopopatall', tomorrow.getTime().toString());\n          Aak.setCookie('noadvtday', 0);\n          //Aak.setCookie('bv_DSKskdck_s1d', 'bvDSKskdcks1d');\n\n          // hide notice\n          Aak.addStyle('div.alert.alert-danger.lead {opacity:0;}');\n          \n          // prevent redirect to verify page\n          Aak.setReadOnly('bdvbnr_pid', []);\n          Aak.setReadOnly('PopAds', 1);\n\n          Aak.addScript(function () {\n            (function () {\n              // prevent popup\n              window.open = function () {};\n\n              // prevent redirect to verify page\n              var frame1 = document.createElement('iframe');\n              frame1.src = 'http://bdfrm.bidvertiser.com/BidVertiser.dbm?pid=383865&bid=1737418&RD=';\n              frame1.id = 'bdvi';\n              frame1.style = 'display:none';\n              document.documentElement.appendChild(frame1);\n            })();\n          });\n        }\n      },\n      vipleague_domains : {\n        // note: also killed by AakList\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=vipbox\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=vipleague\n        // source: http://pastebin.com/NERVzHzS\n        host : [\"vipleague.is\", \"vipleague.ws\", \"vipleague.tv\", \"vipleague.se\", \"vipleague.tv\", \"vipleague.me\", \"vipleague.mobi\", \"vipleague.co\", \"vipleague.sx\", \"vipleague.ch\", \"vipbox.tv\", \"vipbox.co\", \"vipbox.biz\", \"vipbox.sx\", \"vipbox.eu\", \"vipbox.so\", \"vipbox.nu\", \"vipboxsa.co\", \"strikeout.co\", \"strikeout.me\", \"homerun.re\", \"vipboxtv.co\", \"vipapp.me\"],\n        onStart : function () {\n          Aak.uw.iExist = true;\n          Aak.setCookie('xclsvip', 1);\n          Aak.addStyle(\".vip_052x003 { height: 250px; }\");\n          Aak.addStyle(\".vip_09x827 { height: 26px; }\");\n          Aak.addStyle(\"#overlay { display: none; }\");\n        }\n      },\n      zoomtv_me : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=zoomtv.me\n        // source: http://pastebin.com/m4zAXGcw\n        host : ['zoomtv.me'],\n        onAlways : function () {\n          Aak.uw.iaxpEnabled = true;\n        }\n      },\n      vg_no : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/292\n        // +abp rule\n        host : ['vg.no', 'e24.no'],\n        onAlways : function () {\n          Aak.uw.__AB__ = function () {};\n        }\n      },\n      pornve_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/947\n        // source: http://pastebin.com/7TPPkq12\n        host : ['pornve.com'],\n        onAlways : function () {\n          Aak.uw.adxjwupdate = 1;\n        }\n      },\n      lol_moa_tw : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1114\n        host : ['lol.moa.tw'],\n        onIdle : function () {\n          Aak.addScript(function () {\n            var MoaObj = MoaObj || {};\n            MoaObj.ad = MoaObj.ad || {};\t\t\t\n            MoaObj.ad.hasAdblock = function () {\n              return false;\n            };\n            MoaObj.ad.checkABP = function () {\n              return false;\n            };\n          });\n        }\n      },\n      multiup_org : {\n        // by: Watilin\n        // note: alternative solution\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=multiup.org\n        host : ['multiup.org'],\n        onStart : function () {\n          Aak.setCookie('visit', 1); // prevent popup\n          Aak.setReadOnly('hi', function () {});\n        }\n      },\n      dailybitcoins_org : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/107\n        host : ['dailybitcoins.org'],\n        onIdle : function () {\n          Aak.removeElement('.ad-img');\n        }\n      },\n      kozaczek_zeberka : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/414\n        host : ['kozaczek.pl', 'zeberka.pl'],\n        onStart : function () {\n          Aak.setCookie('ablc', 1);\n          Aak.setCookie('cookie_policy', 1);\n        }\n      },\n      spankwire_sites : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/887\n        // source: http://pastebin.com/TFB1dtgb\n        host : ['spankwire.com', 'keezmovies.com', 'extremetube.com', 'mofosex.com'],\n        onStart : function () {\n          Aak.setCookie(\"abClosed\", \"true\");\n          Aak.setCookie(\"hide_ad_msg\", \"1\");\n        }\n      },\n      youporn_network : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/887\n        // source: http://pastebin.com/TFB1dtgb\n        host : ['youporn.com', 'youporngay.com'],\n        onStart : function () {\n          Aak.setCookie(\"adblock_message\", \"closed\");\n        }\n      },\n      citationmachine_net : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=citationmachine.net\n        host : ['citationmachine.net'],\n        onStart : function () {\n          Aak.setCookie(\"sbm_cm_citations\", 0);\n        }\n      },      \n      psarips_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/153\n        host : ['psarips.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#advert');\n        }\n      },\n      extratorrent_domains : {\n        host : ['extratorrent.cc', 'extratorrent.com'],\n        onStart : function () {\n          // prevent popup\n          // source are obfuscated in external js\n          Aak.setCookie('ppu_delay', 1);\n          Aak.setCookie('ppu_main', 1);\n          Aak.setCookie('ppu_sub', 1);\n          Aak.setCookie('ppu_show_on', 1);\n        }\n      },\n      tny_cz : {\n        host : ['tny.cz', 'pasted.co'],\n        onStart : function () {\n          // prevent popup\n          Aak.setCookie('__.popunderCap', 1);\n          Aak.setCookie('__.popunder', 1);\n        }\n      },\n      clubedohardware_com_br : { // two antiadblock\n        host : ['clubedohardware.com.br'],\n        onStart : function () {\n          if (Aak.contains(location.host, 'forum')) {\n            // Solution 1\n            Aak.addStyle(\"#banner, script { height: 51px; }\");\n            Aak.addBaitElement('div#banner');\n          } else { // Website\n            // Solution 1\n            Aak.addBaitElement('div.banner_topo');\n          }\n        },\n        onIdle : function () {\n          if (Aak.contains(location.host, 'forum')) {\n            // Solution 2\n            Aak.uw.addBlocking.hide();\n            Aak.uw.addBlocking.kill();\n          } else { // Website\n            // Solution 2\n            document.body.id = '';\n            Aak.removeElement('.adblock');\n          }\n        }\n      },\n      debrastagi_com : {\n        host : ['debrastagi.com'],\n        onIdle : function () {\n          Aak.removeElement('#stp-main');\n          Aak.removeElement('#stp-bg');\n        }\n      },\n      ddlfrench_org : {\n        host : ['ddlfrench.org'],\n        onIdle : function () {\n          // Fix bug display content\n          Aak.setElement('#dle-content .d-content', {\n            'class' : ''\n          });\n          Aak.setElement('#content', {\n            'id' : ''\n          });\n        }\n      },\n      megadebrid_eu : {\n        host : ['mega-debrid.eu'],\n        onEnd : function () {\n          // Activate button debrid\n          Aak.setElement('.realbutton', {\n            'onclick' : '',\n            'type' : 'submit'\n          });\n        }\n      },\n      slideplayer_domains : {\n        // by: Alexander255\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1333\n        // issue: https://github.com/reek/anti-adblock-killer/issues/515\n        // issue: https://github.com/reek/anti-adblock-killer/issues/296\n        // demo: http://slideplayer.fr/slide/1304026/#\n        host : ['slideplayer.*'],\n        onEnd : function () {\n\n          // Disable anti-adblocker\n          Aak.uw.force_remove_ads = true;\n\n          // Circumvent \"share to download\" rule\n          Aak.addScript(function () {\n            var slide_id = window.get_current_slide_id();\n            var slide_srv = document.getElementById(\"player_frame\").src.split(\"/\")[3];\n            var time = 86400 + Math.floor(Date.now() / 1000);\n            var secret = encodeURIComponent(window.strtr(window.MD5.base64(\"secret_preved slideplayer never solved \" + time + slide_id + \".ppt\"), \"+/\", \"- \"));\n\n            var url = \"http://player¤ªYù.slideplayer.org/download/\" + slide_srv + \"/\" + slide_id + \"/\" + secret + \"/\" + time + \"/\" + slide_id + \".ppt\";\n            var links = document.querySelectorAll(\"a.download_link\");\n            for (var i = 0; i \u003C links.length; i++) {\n              /* Remove original \"share to download\" popup event listener */\n              var events = $._data(links[i]).events.click;\n              events.splice(0, events.length);\n\n              /* Set normal link href instead */\n              links[i].href = url;\n            }\n          });\n\n        }\n      },\n      bokepspot_com : {\n        host : ['bokepspot.com'],\n        onStart : function () {\n          // Hide Disclaimer\n          Aak.setCookie('hideDialog', 'hide');\n        },\n        onIdle : function () {\n          // Remove Disable AdBlock\n          Aak.removeElement('#tupiklan');\n        }\n      },\n      picload_com : {\n        host : ['picload.org'],\n        onStart : function () {\n          Aak.setCookie('pl_adblocker', false);\n        },\n        onIdle : function () {\n          Aak.uw.ads_loaded = true;\n          Aak.uw.imageAds = false;\n          Aak.removeElement('div[oncontextmenu=\"return false;\"]');\n        }\n      },\n      freezedownload_com : {\n        host : ['freezedownload.com'],\n        onIdle : function () {\n          if (/freezedownload.com\\/download\\//.test(location.href)) {\n            Aak.removeElement('body > div[id]');\n          }\n        }\n      },\n      monnsutogatya_com : {\n        // issue: PM\n        // source: http://pastebin.com/1Lw60h6k\n        host : ['monnsutogatya.com'],\n        onIdle : function () {\n          Aak.addStyle(\"#site-box {display:block;}\");\n          Aak.removeElement('#for-ad-blocker');\n        }\n      },\n      rapid8_com : {\n        host : ['rapid8.com'],\n        onIdle : function () {\n          Aak.removeElement('div.backk + #blcokMzg');\n          Aak.removeElement('div.backk');\n        }\n      },\n      turkdown_com : {\n        host : ['turkdown.com'],\n        onIdle : function () {\n          // remove facebook box\n          Aak.removeElement('#duyuru');\n        }\n      },\n      filmovizija_domains : {\n        host : ['filmovizija.me', 'filmovizija.com', 'filmovizija.in', 'filmovizija.net'],\n        onIdle : function () {\n          /*\n          var d = new Date();\n          var weekday = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n          var n = weekday[d.getDay()];\n          Aak.setElement('#' + n, {\n          html : ''\n          });\n          Aak.removeElement('#' + n);\n           */\n        }\n      },\n      hackintosh_zone : {\n        // by: Alexander255\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=hackintosh.zone\n        // source: http://paste2.org/DnB9Oj4f\n        host : ['hackintosh.zone'],\n        onIdle : function () {\n\n          var head = document.getElementsByTagName(\"head\")[0];\n          // Fake Google ad frame content\n          var ad1 = document.createElement(\"ins\");\n          ad1.className = \"adsbygoogle\";\n          ad1.appendChild(document.createTextNode(\"AAK\"));\n          head.insertBefore(ad1, head.childNodes[0]);\n\n          /*\n          // Fake CleanMyMac ad frame size\n          var ad2 = document.createElement(\"div\");\n          ad2.id  = \"nycuhevgqi\";\n          Object.defineProperty(ad2.wrappedJSObject, 'clientHeight', {value: 1});\n          head.insertBefore(ad2, head.childNodes[0]);\n           */\n\n          var elems = document.querySelectorAll('.adsensegrey');\n          for (var i = 0; i \u003C elems.length; i++) {\n            var node = document.createElement(\"img\");\n            node.src = Aak.imgBait;\n            elems[i].appendChild(node);\n          }\n\n        },\n        onBeforeScript : function () {\n          return [{\n              contains : 'disable ADBlock completely',\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      privateinsta_com : {\n        host : ['privateinsta.com'],\n        onIdle : function () {\n          // + abp rule\n          Aak.uw.dont_scroll = false;\n          Aak.removeElement(\"#overlay_div\");\n          Aak.removeElement(\"#overlay_main_div\");\n        }\n      },\n      risikogesundheit_de : {\n        host : ['risiko-gesundheit.de'],\n        onIdle : function () {\n          setTimeout(function () {\n            window.stop();\n          }, 5000);\n        }\n      },\n      oneplaylist_eu_pn : {\n        host : ['oneplaylist.eu.pn'],\n        onIdle : function () {\n          // kill popunder\n          Aak.uw.makePopunder = false;\n        }\n      },\n      onmeda_de : {\n        // note: script obfuscated line 1110\n        // issue: https://greasyfork.org/forum/discussion/8576\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1067\n        // source: http://pastebin.com/qf46bN3z\n        // source: http://pastebin.com/RwHyF0NL\n        host : ['onmeda.de'],\n        onAlways : function () {\n          Aak.uw.$ADP = true;\n          Aak.uw.sas_callAd = function () {};\n          Aak.uw.sas_callAds = function () {};\n        }\n      },\n      turbodebrideur_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/599\n        // issue: https://github.com/reek/anti-adblock-killer/issues/563\n        // issue: https://github.com/reek/anti-adblock-killer/issues/526\n        host : ['turbodebrideur.com'],\n        onIdle : function () {\n          Aak.createElement({\n            tag : 'div',\n            id : 'pubdirecte',\n            html : '\u003Cimg  src=\"' + Aak.imgBait + '\"/>\u003Ca  href=\"#\">&nbsp;\u003C/a>',\n            append : 'body'\n          });\n        }\n      },\n      rockfile_eu : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1256\n        host : ['rockfile.eu'],\n        onIdle : function () {\n          Aak.createElement({\n            tag : 'iframe',\n            src : 'about:blank',\n            style : 'visibility:hidden;',\n            append : 'body'\n          });\n        }\n      },\n      linkbucks_antiadblock : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/932\n        // issue: https://github.com/reek/anti-adblock-killer/issues/469\n        // issue: https://github.com/reek/anti-adblock-killer/issues/277\n        // v3: http://pastebin.com/0gh8LMGH\n        // note: no solution, anti-adblock difficult to bypass --> http://pastebin.com/1NRq7WvZ\n        host : ['linkbucks.com', 'miniurls.co', 'picbucks.com', 'picturesetc.net', 'placepictures.com', 'poontown.net', 'qqc.co', 'qvvo.com', 'realfiles.net', 'rqq.co', 'seriousdeals.net', 'seriousfiles.com', 'seriousurls.com', 'sexpalace.gs', 'theseblogs.com', 'thesefiles.com', 'theseforums.com', 'thosegalleries.com', 'tinybucks.net', 'tinylinks.co', 'tnabucks.com', 'tubeviral.com', 'uberpicz.com', 'ubervidz.com', 'ubucks.net', 'ugalleries.net', 'ultrafiles.net', 'urlbeat.net', 'urlpulse.net', 'whackyvidz.com', 'youfap.me', 'yyv.co', 'zxxo.net', 'zff.co', 'linkbucksdns.co', 'miniurls.com', 'dyo.gs', 'goneviral.com', 'eafyfsuh.net', 'sasontnwc.net'],\n        onStart : function () {\n          // do nothing...\n        }\n      },\n      linkbucks_visitscript : {\n        // issue:\n        host : ['referencemega.com', 'fpabd.com', 'crackacc.com'],\n        onStart : function () {\n          // Skip visitScript when site use CloudFlare Rocket Script\n          Aak.setCookie('_lbGatePassed', true);\n        }\n      },\n      link_tl : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=link.tl\n        // issue: https://greasyfork.org/fr/forum/discussion/8437\n        // source: http://pastebin.com/1MkCnmL7\n        host : ['link.tl'],\n        onStart : function () {\n          Aak.addStyle('.adblock { height:1px; }');\n          Aak.uw.adblocker = false;\n        }\n      },\n      wstream_video : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1382\n        // source: http://pastebin.com/EiARVQXt\n        host : ['wstream.video'],\n        onStart : function () {\n          Aak.addStyle('#adiv { height:4px; }');\n        }\n      },\n      _4shared_com : {\n        host : ['4shared.com'],\n        onIdle : function () {\n          // Hide \"Disable AdBlodk\" messages\n          document.querySelector('body').classList.remove(\"jsBlockDetect\");\n        }\n      },\n      pro_domains : {\n        host : ['pro-zik.ws', 'pro-tect.ws', 'pro-ddl.ws', 'pro-sport.ws'],\n        onStart : function () {\n          Aak.setCookie('visitedf', true);\n          Aak.setCookie('visitedh', true);\n        }\n      },\n      comptoirhardware_com : {\n        host : ['comptoir-hardware.com'],\n        onAlways : function () {\n          Aak.uw.adblock = 'non';\n        }\n      },\n      bakersfield_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/657\n        // note: also solution to AakList\n        host : ['bakersfield.com'],\n        onAlways : function () {\n          Aak.uw.AD_SLOT_RENDERED = true;\n        }\n      },\n      ekstrabladet_dk : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=ekstrabladet\n        // source: http://pastebin.com/R029XpCr\n        host : ['ekstrabladet.dk', 'eb.dk'],\n        onAlways : function () {\n          Aak.uw.ADTECH = {};\n        }\n      },\n      pcgames_download_net : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1451\n        // issue: https://greasyfork.org/forum/discussion/9328\n        // source: http://pastebin.com/EBVZg3VB\n        host : ['pcgames-download.net'],\n        onAlways : function () {\n          Aak.setCookie('noAdblockNiceMessage', 1);\n          Aak.uw.mgCanLoad30547 = true;\n        }\n      },\n      lachainemeteo_com : {\n        // note: also killed by AakList\n        // issue: https://github.com/reek/anti-adblock-killer/issues/590\n        // issue: https://github.com/reek/anti-adblock-killer/issues/245\n        // issue: https://github.com/reek/anti-adblock-killer/issues/215\n        host : ['lachainemeteo.com'],\n        onAlways : function () {\n          Aak.uw.js_loaded = true;\n        }\n      },\n      mac4ever_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/997\n        // source: http://pastebin.com/RQnCEYK6\n        host : ['mac4ever.com'],\n        onAlways : function () {\n          Aak.uw.coquinou = function () {};\n        }\n      },\n      _5278bbs_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=5278bbs.com\n        host : ['5278bbs.com'],\n        onAlways : function () {\n          Aak.uw.myaabpfun12 = function () {};\n        }\n      },\n      thesimsresource_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=thesimsresource.com\n        // source: http://pastebin.com/DE9rbjxY\n        host : ['thesimsresource.com'],\n        onAlways : function () {\n          Aak.uw.gadsize = true;\n          Aak.uw.iHaveLoadedAds = true;\n        }\n      },\n      yellowbridge_com : {\n        host : ['yellowbridge.com'],\n        onAlways : function () {\n          Aak.uw.finalizePage = function () {\n            return;\n          };\n        }\n      },\n      game_debate_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1366\n        // source: http://pastebin.com/UzsiX0FK\n        host : ['game-debate.com'],\n        onAlways : function () {\n          Aak.uw.ad_block_test = function () {};\n        }\n      },\n      adscendmedia : {\n        host : ['adscendmedia.com'],\n        onStart : function () {\n          // adscendmedia - https://www.adscendmedia.com/\n          var ref = document.createElement('a').href = document.referrer;\n          var host = location.host;\n          var path = location.pathname;\n          if (Aak.contains(path, '/widget_adblock.php') && !Aak.contains(ref.host, host)) {\n            // Auto report\n            Aak.detected('Adscendmedia', ref.host, host);\n            // Notification\n            Aak.notification('You must subscribe to \u003Cb>AakList (Anti-Adblock Killer )\u003C/b> \u003Ca href=\"' + Aak.subscribeURL + '\" target=\"_blank\">Subscribe\u003C/a>');\n          }\n        }\n      },\n      adworkmedia : {\n        host : ['adworkmedia.com', 'loxtk.com', 'contentlockingnetworks.com'],\n        onStart : function () {\n          // AdWorkMedia - https://www.adworkmedia.com/\n          var ref = document.createElement('a').href = document.referrer;\n          var host = location.host;\n          var path = location.pathname;\n          if (Aak.contains(path, '/help/removeAB.php') && !Aak.contains(ref.host, host)) {\n            // Auto report\n            Aak.info('Adworkmedia', ref.host, host);\n            // Notification\n            Aak.notification('You must subscribe to \u003Cb>AakList (Anti-Adblock Killer )\u003C/b> \u003Ca href=\"' + Aak.subscribeURL + '\" target=\"_blank\">Subscribe\u003C/a>');\n          }\n        }\n      },\n      // --------------------------------------------------------------------------------------------\n      // Players\n      // --------------------------------------------------------------------------------------------\n      kissanime_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/451\n        // issue: https://github.com/reek/anti-adblock-killer/issues/381\n        // issue: https://github.com/reek/anti-adblock-killer/issues/302\n        // issue: https://github.com/reek/anti-adblock-killer/issues/257\n        // issue: https://github.com/reek/anti-adblock-killer/issues/178\n        // issue: https://github.com/reek/anti-adblock-killer/issues/196\n        // issue: https://github.com/reek/anti-adblock-killer/issues/56\n        host : ['kissanime.com', 'kissanime.to'],\n        onStart : function () {\n          // Masking ads\n          Aak.addStyle('iframe[id^=\"adsIfrme\"], .divCloseBut { display:none; }');\n          // Solution 1\n          Aak.uw.DoDetect2 = null;\n        },\n        onIdle : function () {\n\n          // Solution 1 abp rule\n          // @@||kissanime.com^$elemhide\n\n          var divContentVideo = document.querySelector('#divContentVideo');\n\n          // Solution 2\n          if (Aak.uw.DoDetect2) {\n            Aak.uw.DoDetect2 = null;\n            Aak.uw.CheckAdImage = null;\n            Aak.info('Solution 2');\n          } //Solution 3\n          else if (divContentVideo) {\n\n            var divDownload = document.querySelector('#divDownload').cloneNode(true);\n\n            setTimeout(function () {\n              divContentVideo.innerHTML = '';\n              Aak.uw.DoHideFake();\n              divContentVideo.appendChild(divDownload);\n              Aak.removeElement('iframe[id^=\"adsIfrme\"], .divCloseBut');\n              Aak.info('Solution 3');\n            }, 5500);\n          }\n        }\n      },\n      Kisscartoon_me : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/488\n        host : ['kisscartoon.me'],\n        onAlways : function () {\n          Aak.uw.xaZlE = function () {};\n        },\n        onIdle : function () {\n          Aak.removeElement('iframe[id^=\"adsIfrme\"]');\n        }\n      },\n      openload_domains : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=openload\n        host : ['openload.co', 'openload.io', 'openload.tv'],\n        onStart : function () {\n          Aak.uw.adblock = false;\n          Aak.uw.adblock2 = false;\n          Aak.uw.popAdsLoaded = true;\n          // hide fake play button used to open popunder\n          //Aak.addStyle('#videooverlay { display:none; }')\n        }\n      },\n      youwatch_org : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=youwatch\n        // test: http://youwatch.org/embed-59p7i3cdkse0-453x320.html\n        // test: http://youwatch.org/59p7i3cdkse0\n        host : ['youwatch.org', 'chouhaa.info', 'ahzahg6ohb.com', 'ahzahg6ohb.com'],\n        onStart : function () {\n          // skip anti-adblock\n          Aak.uw.adsShowPopup1 = 1;\n        },\n        onIdle : function () {\n          // renove ads + fake play button\n          Aak.removeElement('#player_imj, #player_imj + div[id]');\n        }\n      },\n      exashare_com : {\n        // by: Watilin\n        // pull: https://github.com/reek/anti-adblock-killer/pull/519\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=exashare.com\n        // test:  http://exashare.com/galw2ge2kzsv\n        host : ['exashare.com', 'chefti.info', 'bojem3a.info', 'ajihezo.info', 'yahmaib3ai.com', 'yahmaib3ai.com'],\n        onStart : function () {\n          // skip anti-adblock\n          Aak.uw.adsShowPopup1 = 1;\n        },\n        onIdle : function () {\n          // renove ads + fake play button\n          Aak.removeElement('#player_gaz, #player_gaz + div[id]');\n        }\n      },\n      an1me_se : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/190\n        host : ['an1me.se'],\n        onIdle : function () {\n          setTimeout(function () {\n            Aak.uw.isBlockAds2 = false;\n          }, 10000);\n        }\n      },\n      hqq_tv : { // putlocker.is\n        host : ['hqq.tv'],\n        onIdle : function () {\n          // + abp rule\n          // http://hqq.tv/player/embed_player.php?vid=R3DGHG3GKXX7&autoplay=no\n          if ('/player/embed_player.php' == location.pathname) {\n            document.querySelector('form[id^=\"form-\"]').submit();\n          }\n        }\n      },\n      // Poland\n      wp_domains : {\n        // Note: disable EasyPrivacy\n        // issue: https://github.com/reek/anti-adblock-killer/issues/956\n        // issue: https://github.com/reek/anti-adblock-killer/issues/905\n        // issue: https://github.com/reek/anti-adblock-killer/issues/300\n        host : ['biztok.pl', 'wp.tv', 'wp.pl', 'sportowefakty.pl', 'kafeteria.tv', 'kafeteria.pl', '.wrzuta.pl', 'pudelek.tv', 'komediowo.pl', 'sfora.pl', 'autokrata.pl', 'sportfan.pl', 'wawalove.pl', 'hotmoney.pl', 'aleseriale.pl', 'babol.pl', 'snobka.pl', 'nocoty.pl', 'money.pl', 'abczdrowie.pl', 'gadzetomania.pl', 'autokult.pl', 'komorkomania.pl'],\n        onStart : function () {\n          // prevent popup anti-adblock from abczdrowie.pl\n          Aak.setCookie('ABCABC', true);\n        },\n        onIdle : function () {\n          \n          Aak.hasElement('.wp-player', function () {\n          \n            var replacePlayerWP = function (mid, player) {\n              /* Request\n              http://get.wp.tv/?mid=1661056\n              http://wp.tv/player/mid,1661056,embed.json\n              http://get.wp.tv/?f=2896462.1426329056904.l.webm&rnd=1\n              https://wp.tv/player/mid,1747117,embed.json\n               */\n              Aak.request({\n                url : 'http://wp.tv/player/mid,' + mid + ',embed.json',\n                onload : function (result) {\n                  var res = result.responseText;\n                  var obj = JSON.parse(res);\n                  Aak.log(obj);\n\n                  var Player = new Aak.player();\n                  Player.videojs(player, {\n                    source : Aak.fixProtocolURL(obj.clip.url[1].url), // HD\n                    type : 'mp4',\n                    autoplay : false\n                  });\n                }\n              });\n            };\n\n            var replacePlayerWrzuta = function (key, channel, elem) {\n              Aak.request({\n                // http://www.wrzuta.pl/npp/embed/wolnapolska2/0I0HQ2mutJc\n                url : 'http://www.wrzuta.pl/npp/embed/' + channel + '/' + key,\n                onload : function (result) {\n                  var res = result.responseText;\n                  var obj = JSON.parse(res);\n                  Aak.log(obj);\n\n                  var Player = new Aak.player();\n                  Player.videojs(elem, {\n                    source : Aak.fixProtocolURL(obj.url[0].url), //HD\n                    type : 'mp4',\n                    autoplay : false\n                  });\n                }\n              });\n            };\n\n            // Using an external flash player is impossible because protected by crossdomain.xml\n            var players = document.querySelectorAll('.wp-player'); //  #Player0, #Player1, #mainPlayer\n            if (players.length) {\n              // fixbug gm_xhr loop request - http://tinyurl.com/pqa9htq\n              for (var i = 0; i \u003C players.length; i++) {\n                var mid = null;\n                var player = players[i];\n                var parent = player.parentNode;\n                var script = player.previousSibling;\n                var title = player.querySelector('.titleCont a.title');\n                var embedvideos = document.querySelectorAll('script[src*=\"/embed_video.js\"]');\n                Aak.log(player, parent, script, title);\n\n                if (embedvideos.length) {\n                  // pudelek.wrzuta.pl: http://tinyurl.com/l8jo5v2\n                  // pudelek.tv: http://tinyurl.com/klyzh6r, http://tinyurl.com/z7fr89v\n                  // pudelek.tv (triple): http://tinyurl.com/n9b27o2\n                  // film.wp.pl: http://tinyurl.com/q7k5bxp\n                  var embedvideo = embedvideos[i];\n                  var key = /key=(\\w+)/.exec(embedvideo.src)[1];\n                  var channel = /login=(\\w+)/.exec(embedvideo.src)[1];\n                  var autostart = /autoplay/.test(embedvideo.src);\n                  replacePlayerWrzuta(key, channel, player, autostart);\n                  Aak.log('embed_video.js');\n                } else if (title && /mid/.test(title.href)) {\n                  // sportowefakty.pl: http://tinyurl.com/l6zabcx\n                  mid = title.href.match(/mid[=,]([0-9]+)/);\n                  Aak.log('title.href');\n                } else if (parent.id) {\n                  if (parent.dataset.url) {\n                    // wp.tv: http://tinyurl.com/pzde29t\n                    mid = parent.dataset.url.match(/mid[=,]([0-9]+)/);\n                    Aak.log('parent.dataset.url');\n                  } else {\n                    if (parent.previousSibling.innerHTML) {\n                      // wiadomosci.wp.pl: http://tinyurl.com/gqtt9ca\n                      mid = parent.previousSibling.innerHTML.match(/mid[=,]([0-9]+)/);\n                      Aak.log('script.inline.innerHTML');\n                    } else {\n                      // kafeteria.tv: http://tinyurl.com/nofp58a\n                      // abczdrowie.pl: http://tinyurl.com/hx6s5et\n                      mid = parent.innerHTML.match(/mid[=,]([0-9]+)/);\n                      Aak.log('parent.innerHTML');\n                    }\n                  }\n                } else if (script && script.tagName == 'SCRIPT') {\n                  // film.wp.pl: http://tinyurl.com/mh9onfw\n                  // pudelek.tv (double): http://tinyurl.com/lefvwtx\n                  mid = script.innerHTML.match(/mid[=,]([0-9]+)/);\n                  Aak.log('script.src.innerHTML');\n                }\n                if (mid !== null && mid.length == 2) {\n                  replacePlayerWP(mid[1], player);\n                }\n              }\n            }\n          });\n        }\n      },\n      moje_filmy_network: {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1010\n        // source: http://pastebin.com/7G2RBnqq\n        host : ['moje-filmy.tk', 'moje-filmy.live'],\n        onIdle : function () {\n          var searchvalue = ['var playerInstance', '});'];\n          var script = Aak.hasScript(searchvalue[0]);\n\n          if (script) {\n            var source = script.innerHTML;\n            var str = source.substring(source.lastIndexOf(searchvalue[0]), source.lastIndexOf(searchvalue[1]) + searchvalue[1].length);\n            Aak.addScript(str);\n          }\n        }\n      },\n      tvn_pl : {\n        // by: Reek, Marek\n        // solution: http://tinyurl.com/ohbvz4r, http://tinyurl.com/jq8s462\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=tvn.pl\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=tvn24.pl\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=player.pl\n        // test: http://tinyurl.com/o6d9h66, http://tinyurl.com/z77m4zh\n        host : ['tvn.pl', 'tvn24.pl', 'player.pl'],\n        onEnd : function () {\n          Aak.hasElement('header.detailImage', function (thisElement) {\n            if (Aak.getCookie('country_code') && Aak.getSession('generateToken')) {\n                var parts = document.location.href.split(/[.,]/);\n                var id = parts[parts.length - 2];\n                var params = {\n                  platform : \"Mobile\",\n                  terminal : \"Android\",\n                  format : \"json\",\n                  v : \"2.0\",\n                  authKey : \"b4bc971840de63d105b3166403aa1bea\",\n                  type : \"episode\",\n                  id : id,\n                  sort : \"newest\",\n                  m : \"getItem\",\n                  deviceScreenHeight : 1600,\n                  deviceScreenWidth : 2560\n                };\n                var api = 'https://api.tvnplayer.pl/api/?' + Aak.serialize(params);\n                var proxy = 'http://www.proxy.xmc.pl/index.php?hl=3e5&q=';\t\n                \n                // Get videoUrl\n                Aak.request({\n                  url : Aak.getCookie('country_code') != 'PL' ? proxy + Aak.encodeURI(api) : api,\n                  headers : {\n                    \"User-Agent\" : \"Mozilla/5.0 (Linux; U; Android 4.2; en-us; Nexus 10 Build/JVP15I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30\"\n                  },\n                  onload : function (result) {\n                    var res = result.responseText;\n                    Aak.log(res);\n                    var o = JSON.parse(res);\n                    var videoUrl = o.item.videos.main.video_content[Number(Aak.opts.videoHD)].url;\n                    var generateToken = new Function('videoUrl', Aak.getSession('generateToken'));\n                    var videoUrlWithSeed = generateToken(videoUrl);\n                    var Player = new Aak.player();\n                    Player.videojs(thisElement, {\n                      source : videoUrlWithSeed,\n                      type : 'mp4',\n                      autoplay: false\n                    }, {}, {insert:'inner'});\n                  }\n                });\n            } else {\n              Aak.request({ // get and store generateToken function\n                url : 'http://pastebin.com/raw/D9qM4DR3',\n                onload : function (response) {\n                  var res = response.responseText;\n                  Aak.setSession('generateToken', res);\n                  Aak.request({ // get user ip\n                    url : 'http://ip-api.com/json',\n                    onload : function (response) {\n                      var res = response.responseText;\n                      var json = JSON.parse(res);\n                      Aak.setCookie('country_code', json.countryCode);\n                      Aak.refresh();\n                    }\n                  });\n                }\n              });\n            }\n          });\n        }\n      },\n      ipla_tv : {\n        // by: Marek\n        // solution: http://tinyurl.com/ptb4ybg\n        // issue. https://github.com/reek/anti-adblock-killer/issues/522\n        // test: http://tinyurl.com/hz7gpxx\n        host : ['ipla.tv'],\n        onIdle : function () {\n          Aak.addStyle('.html5-player-wrapper { display:none; }'); // chrome/opera\n          var oldPlayer = document.querySelector('.html5-player-wrapper, #vod-player');\n          Aak.request({\n            url : '/VOD/play-in-ipla/' + location.href.match(/\\/vod-(\\d+)/)[1],\n            onload : function (result) {\n              var videoURL;\n              var res = result.responseText;\n              var idn = res.match(/ipla:\\/\\/playvod-1\\|([a-z0-9]+)/)[1];\n              Aak.log(idn);\n              Aak.request({\n                url : 'http://getmedia.redefine.pl/vods/get_vod/?cpid=1&ua=mipla/23&media_id=' + idn,\n                onload : function (result) {\n                  var res = result.responseText;\n                  var o = JSON.parse(res);\n                  Aak.log(o);\n                  if (o.vod.video_hd) {\n                    videoURL = o.vod.video_hd;\n                  } else if (o.vod.video) {\n                    videoURL = o.vod.video;\n                  } else {\n                    videoURL = o.vod.copies[0].url;\n                  }\n\n                  var Player = new Aak.player();\n                  Player.videojs(oldPlayer, {\n                    source : videoURL,\n                    type : 'mp4',\n                    width : 820,\n                    height : 450,\n                    autoplay : false\n                  });\n                }\n              });\n            }\n          });\n        }\n      },\n      koscian_net : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/914\n        // source: http://pastebin.com/yGSPBRqe\n        host : ['koscian.net'],\n        onIdle : function () {\n          var elems = document.querySelectorAll('.ban');\n          for (var i = 0; i \u003C elems.length; i++) {\n            elems[i].remove();\n            //elems[i].innerHTML = '\u003Cbr>';\n          }\n        }\n      },\n      // France\n      playtv_fr : { // research solution\n        host : ['play.tv', 'playtv.fr'],\n        onAlways : function () {},\n        onEnd : function () {}\n      },\n      rmcsportbfmtv_com : { // webradio\n        host : ['rmcsport.bfmtv.com'],\n        onIdle : function () {\n\n          var flashvars = {\n            urlRadio : \"http://mp3lg4.tdf-cdn.com/10160/rmc.mp3\",\n            nom : \"live\",\n            categorie : \"live\",\n            urlSmart : \"\" // set empty to remove audio ad\n          };\n          var params = {\n            wmode : \"transparent\"\n          };\n\n          Aak.uw.swfobject.embedSWF(\"/swf/RMCLIVE.swf\", \"liveplayer\", \"70\", \"90\", \"10.0.0\", \"\", flashvars, params);\n        }\n      },\n      eclypsia_com : {\n        host : ['eclypsia.com'],\n        onAlways : function () {\n          // Solution 1\n          // abp rules\n\n          // Solution 2\n          Aak.uw.isABActivated = function () {\n            return false;\n          }; // Kill antiadblock\n          Aak.uw.refresh_iframe = function () {}; // Stop ads to be loaded\n        },\n        onEnd : function () {\n          // Solution 3\n          var element = document.querySelector('div[id^=\"webtv_iframe_\"]');\n          if (element !== null) {\n            var videoId = element.id.split('_')[2];\n            setTimeout(function () {\n              element.innerHTML = '\u003Ciframe frameborder=\"0\" width=\"812\" height=\"500\" src=\"http://www.dailymotion.com/embed/video/' + videoId + '?logo=0&autoPlay=1&autoMute=0\">\u003C/iframe>';\n            }, 1000);\n          }\n        }\n      },\n      m6web_fr : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/461\n        // test: http://tinyurl.com/ptn2vrl\n        host : ['m6web.fr'],\n        onEnd : function () {\n          var player = document.querySelector('object[id$=\"_flash_api\"]');\n          var script = Aak.hasScript('M6.Player.config');\n\n          if (player !== null && script !== null) {\n            var found = script.innerHTML.match(/M6.Player.config = (\\{.+\\});/);\n            var config = JSON.parse(found.pop());\n            \n            // Replace player\n            var Player = new Aak.player();\n            Player.videojs(player.parentNode, {\n              source : config.sources[1].src,\n              type : 'mp4',\n              autoplay : false\n            });\n\n          }\n        }\n      },\n      gamingroom_tv : {\n        host : ['gamingroom.tv'],\n        onAlways : function () {\n          Aak.uw.adblock_detect = function () {};\n          Aak.uw.GR_adblock_hide_video = function () {};\n          Aak.uw.adblock_video_msg_start = function () {};\n          Aak.uw.adblock_video_msg_stop = function () {};\n          Aak.uw.disable_chat = function () {};\n        }\n      },\n  ¯މ–ù    // Germany\n      now_domains : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/336\n        // test: http://tinyurl.com/peeobou\n        // test: http://jsbin.com/vucobejofo\n        host : ['voxnow.de', 'rtl-now.rtl.de', 'rtl2now.rtl2.de', 'n-tvnow.de', 'superrtlnow.de', 'rtlnitronow.de', 'nowtv.de'],\n        onIdle : function () {\n          /*\n          var Player = new Aak.player();\n          Player.editing('#videoplayer', {\n          unsetFlashvars : 'abcheck_enabled,adcall,adclasses,adconfig,admeta,adslog,agof,ama,angebot,as,asparts,breakad,connectioncheck,cslog,dev,dimmer,errorlog,feedback,fmsident,gtv,highlights,ivw,ivw_play,js,js_event_function,logo,logo_basewidth,logopos,nielsen,ord,osmf,svm,tile,videoplaza,videoplaza_base_url,videoplaza_share,videoplaza_tag,vpEnvironmentURL,xl'\n          });\n           */\n        }\n      },\n      rtl_de : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1541\n        // test: http://tinyurl.com/h7ccvqq\n        host : ['rtl.de'],\n        onIdle : function () {\n          Array.prototype.slice.call(document.querySelectorAll('div[data-widget=\"video\"]')).map(function (video) {\n            var cfg = Aak.intoObject(video.dataset.playerLayerCfg);\n            var file = cfg.videoinfo.mp4url;\n            Aak.log(video, cfg, file);\n\n            // Replace player\n            var Player = new Aak.player();\n            Player.videojs(video, {\n              source : file,\n              type : 'mp4',\n              autoplay : false\n            });\n          });\n        }\n      },\n      myspass_de : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/76\n        // test: http://tinyurl.com/lto9pyd\n        host : ['myspass.de'],\n        onIdle : function () {\n          var videoid = location.pathname.match(/\\/(\\d+)\\/$/);\n\n          if (videoid !== null) {\n            Aak.request({\n              url : 'http://www.myspass.de/myspass/includes/apps/video/getvideometadataxml.php?id=' + videoid[1],\n              onload : function (result) {\n                var res = result.responseText;\n                Aak.log(res);\n\n                // Get video\n                var parser = new window.DOMParser();\n                var dom = parser.parseFromString(res, \"application/xml\");\n                var file = dom.getElementsByTagName(\"url_flv\").item(0).textContent;\n\n                // Remove elements\n                Aak.removeElement('div.loadingGif');\n\n                // Replace player\n                var Player = new Aak.player();\n                Player.videojs('#player', {\n                  source : file,\n                  type : 'mp4',\n                  autoplay : false\n                });\n\n              }\n            });\n          }\n        }\n      },\n      // Nederland\n      rtlxl_nl : {\n        // test: http://tinyurl.com/l2zkv3d\n        host : ['rtlxl.nl', 'rtlnieuws.nl'],\n        onEnd : function () {\n          var Player = new Aak.player();\n          Player.editing('#_rtlosmf0', {\n            setFlashvars : {\n              adblock : false\n            }\n          });\n        }\n      },\n      // Norway\n      vgtv_network : {\n        // note: skip video ads + anti-adblock\n        // jwplayer: http://tinyurl.com/zyv79hg\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1402\n        // issue: https://github.com/reek/anti-adblock-killer/issues/367\n        // test: http://tinyurl.com/nwp85t, http://tinyurl.com/nwp85t\n        host : ['vgtv.no', 'vg.no'],\n        onEnd : function () {\n          var oldHash = null;\n          var videoId = null;\n          var videoIdRegex = /#\\!\\/video\\/(\\d+)\\//;\n\n          // check if the location hash changes\n          setInterval(function () {\n            var player = Aak.getElement('.video-player');\n\n            if (player && location.hash != oldHash && videoIdRegex.test(location.hash)) {\n              oldHash = location.hash;\n              videoId = oldHash.match(videoIdRegex)[1];\n/*\n              var hlsurl = 'https://svpsecurehdvod-vh.akamaihd.net/i/2016/03/20160312_56e421f86af45_vg01/,1280_720_3500,960_540_1500,640_360_800,480_270_500,.mp4.csmil/master.m3u8';\n              console.log(player)\n\n              // don't work with chrome\n              // player.innerHTML = '\u003Cdiv id=\"noAdPlayer\">This text will be replaced with a player.\u003C/div>';\n\n\n              // can't load m3u8 4032 status code\n              //console.log(unsafeWindow.jwplayer)\n\n              Aak.request({\n                url : 'http://svp.vg.no/svp/api/v1/vgtv/assets/' + videoId + '?additional=settings|chapters|cuePoints|externalId|barrels|externalCategoryId|nextAsset&appName=vgtv-website',\n                onload : function (result) {\n                  var res = result.responseText;\n                  var obj = JSON.parse(res);\n                  Aak.log(obj);\n\n                  // replace player\n                  var Player = new Aak.player();\n                  Player.vlc(player, {\n                    source : obj.streamUrls.hls, // m3u8\n                    type : 'hls',\n                    autoplay : false\n                  });\n                }\n              }, {}, {\n                insert : 'inner'\n              });\n*/\n            }\n          }, 1e3);\n        }\n      },\n      mtg_radio : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1495\n        host : ['play.radio1.se', 'play.bandit.se', 'play.lugnafavoriter.com', 'play.rixfm.se'],\n        onEnd : function () {\n          Aak.addScript(function () {\n            setTimeout(function () {\n              window.player_load_live(window.stream_id);\n            }, 1000);\n          });\n        }\n      },\n      dplay_network : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1463\n        host : ['dplay.com', 'dplay.dk', 'dplay.se'],\n        onStart : function () {\n          var date = new Date();\n          date.setDate(date.getDate() + 365);\n          var timestamp = date.getTime().toString();\n          var value = JSON.stringify({\n              \"notificationSubmission\" : \"submitted\",\n              \"reportingExpiry\" : timestamp,\n              \"notificationExpiry\" : timestamp\n            });\n          Aak.setCookie('dsc-adblock', value);\n        }\n      },\n      viasat_tv : {\n        // note: skip video ads + anti-adblock\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=tv3play\n        /* test: http://www.tv3play.no/programmer/redningsskoyta hds/hls\n                   http://www.tv3play.dk/programmer/linse-og-didde-ekstra hds/hls\n                   http://www.tv3play.se/program/glamourama hds/hls\n                   http://www.tv6play.se/program/99-saker-man-maste-gora-innan-man-dor hds/hls\n                   http://www.tv8play.se/program/efterlyst--1 hds/hls\n                   http://www.tv10play.se/program/garpens-europa hds/hls\n                   http://tvplay.skaties.lv/parraides/tv3-zinas hds/hls\n                   http://play.tv3.lt/programos/beatos-virtuve rtmp/hls\n                   http://tv3play.tv3.ee/sisu/puhapaev-sepoga rtmp/hls */\n        host : ['tv3play.no', 'tv3play.dk', 'tv3play.se', 'tv6play.se', 'tv8play.se', 'tv10play.se', 'tvplay.skaties.lv', 'play.tv3.lt', 'tv3play.tv3.ee'],\n        onIdle : function () {\n          Aak.hasElement('#video-player', function (thisElement) {\n            thisElement.id = '';\n            //var videoId = location.pathname.split('/').pop();\n            var videoId = thisElement.getAttribute('data-video-id');\n            Aak.log(thisElement, videoId);\n\n            // get video sources\n            Aak.request({\n              url : 'http://playapi.mtgx.tv/v3/videos/stream/' + videoId,\n              onload : function (result) {\n                var res = result.responseText;\n                var obj = JSON.parse(res);\n                Aak.log(obj);\n\n                /* Innholdet du prøver å se er kun tilgjengelig for brukere i Norge\n                Programmet er blokeret for visning fra denne geografiske position.\n                Programą galite matyti tik jungdamiesi iš Lietuvos interneto tiekėjų tinklų */\n                if (obj.msg) {\n                  return thisElement.innerHTML = obj.msg;\n                }\n\n                if (location.host === 'tv3play.tv3.ee') {\n                  var Player = new Aak.player();\n                  Player.grindplayer(thisElement, {\n                    source : obj.streams.medium,\n                    type : 'rtmp/mp4',\n                    autoplay : true\n                  });\n                } else {\n                  // create video tag for new player\n                  Aak.createElement({\n                    tag : 'video',\n                    id : 'noAdPlayer',\n                    classid : 'video-js vjs-default-skin',\n                    width : thisElement.clientWidth || 730,\n                    height : thisElement.clientHeight || 410,\n                    preload : 'auto',\n                    controls : true,\n                    autoplay : true,\n                    replace : thisElement\n                  });\n\n                  // parse sources\n                  var srcArray = [];\n                  if (obj.streams.high && obj.streams.high !== '') {\n                    srcArray.push({\n                      type : \"video/mp4\", // mp4\n                      src : obj.streams.high\n                    });\n                  }  if (obj.streams.hls && obj.streams.hls !== '') {\n                    srcArray.push({\n                      type : \"application/x-mpegURL\", // m3u8\n                      src : obj.streams.hls\n                    });\n                  }  if (obj.streams.medium && obj.streams.medium !== '') {\n                    var type = obj.streams.medium.indexOf('rtmp') === 0 ? 'rtmp/mp4' : 'application/f4m+xml';\n                    srcArray.push({\n                      type : type,\n                      src : obj.streams.medium\n                    });\n                  }\n                  Aak.log(srcArray, JSON.stringify(srcArray));\n                  \n                  // initialize new player\n                  Aak.addScript(Aak.intoString(function () {\n                      (function () {\n                        function onVjsReady() {\n                          if (typeof window.videojs !== 'function') {\n                            onVjsReady();\n                          } else {\n                            window.videojs(\"noAdPlayer\").src(/_SOURCES_/);\n                          }\n                        }\n                        onVjsReady();\n                      })();\n                    }).replace(\"/_SOURCES_/\", JSON.stringify(srcArray)));\n                }\n              }\n            });\n          });\n        }\n      },\n      // Russia\n      rutube_ru : { // research solution\n        /* test: http://rutube.ru/video/bd5f6047657f0bdcbfbb0edad2bb7c61/ */\n        host : ['rutube.ru'],\n        onEnd : function () {\n          Aak.hasElement('#rutubePlayerHolder', function () {            //dmFyIG9wdHMgPSBBYWsuZ2V0RWxlbWVudCgiI29wdGlvbnMiKTsNCiAgICAgICAgICAgIHZhciBvID0gQWFrLmludG9PYmplY3Qob3B0cy5kYXRhc2V0LnZhbHVlKTsNCiAgICAgICAgICAgIHZhciBtM3U4VXJsID0gby52aWRlb19iYWxhbmNlci5tM3U4Ow0KICAgICAgICAgICAgY29uc29sZS5sb2cobTN1OFVybCk7DQoNCiAgICAgICAgICAgIHZhciBQbGF5ZXIgPSBuZXcgQWFrLnBsYXllcigpOw0KICAgICAgICAgICAgUGxheWVyLnZpZGVvanMoJyNydXR1YmVQbGF5ZXJIb2xkZXInLCB7DQogICAgICAgICAgICAgICAgc291cmNlIDogbTN1OFVybCwNCiAgICAgICAgICAgICAgICB0eXBlIDogJ2hscycsDQogICAgICAgICAgICAgICAgLy9wcm94eTogdHJ1ZSwNCiAgICAgICAgICAgICAgICBhdXRvcGxheSA6IHRydWUNCiAgICAgICAgICAgICAgfTsgKTs=\n          });\n        }\n      },\n      // Italy\n      rai_tv : { // research solution\n        host : ['rai.tv'],\n        onStart : function () {},\n        onIdle : function () {}\n      },\n      // TV Stream\n      block_streams_tv : {\n        // note: redirect to http://block.streams.tv/\n        host : ['firstrow.co', 'firstrows.ru', 'firstrows.tv', 'firstrows.org', 'firstrows.co', 'firstrows.biz', 'firstrowus.eu', 'firstrow1us.eu', 'firstsrowsports.eu', 'firstrowsportes.tv', 'firstrowsportes.com', 'justfirstrowsports.com', 'hahasport.me', 'wiziwig.ru', 'wiziwig.sx', 'wiziwig.to', 'wiziwig.tv', 'myp2p.biz', 'myp2p.tv', 'myp2p.la', 'myp2p.ec', 'myp2p.eu', 'myp2p.sx', 'myp2p.ws', 'myp2p.com', 'atdhe.ru', 'atdhe.se', 'atdhe.bz', 'atdhe.top', 'atdhe.to', 'atdhe.me', 'atdhe.mx', ' atdhe.li', 'atdhe.al'],\n        onAlways : function () {\n          Aak.setCookie(\"adb\", 1); // prevent anti-adblock\n          Aak.uw.open = function () {}; // prevent popup\n          Aak.addStyle(\"#bannerInCenter, #hiddenBannerCanvas { display: none; }\"); // hide ads\n        }\n      },\n      buzina_xyz : {\n        // note: disable refcontrol, used by firstrowsports\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1268\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1243\n        // issue: https://github.com/reek/anti-adblock-killer/issues/889\n        // issue: https://greasyfork.org/forum/discussion/8975\n        // source: http://pastebin.com/8VTrkvS9\n        host : ['buzina.xyz', 'farmet.info', 'rimladi.com', 'kitorelo.com', 'omnipola.com', 'porosin.co.uk', 'rimleno.com', 'simple4alls.com', 'arsopo.com'],\n        onStart : function () {\n          Aak.addStyle(\"#adsframe { height: 151px; }\");\n        },\n        onIdle : function () {\n          if (/buzina.xyz/.test(location.host)) { // keeps same host stream\n            Aak.hasElement('iframe[src*=\".php?hash=\"]', function (thisElement) {\n              // http://arsopo.com/w2.php?hash=panda58\n              // http://www.buzina.xyz/nana1v1.php?onthetop\n              var parts = thisElement.src.split('/');\n              parts[2] = Aak.rules.buzina_xyz.host.pop();\n              Aak.log(thisElement, parts);\n              thisElement.src = parts.join('/');\n\n                /*\tdmFyIG8gPSB7CgkJCSAgICAicGxheWxpc3QiIDogW3sKCQkJICAgICAgICAicHJvdmlkZXIiIDogInJ0bXAiLAoJCQkgICAgICAgICJ1cmwiIDogInBhbmRhMT9lJTNEMTQ2NTA3MDMyNiUyNnN0JTNEUHJ0SFl5dkJ6ZDlaZDdoRF9mUkhUZzExMTEzMCIKCQkJICAgICAgfQoJCQkgICAgXSwKCQkJICAgICJwbHVnaW5zIiA6IHsKCQkJICAgICAgInJ0bXAiIDogewoJCQkgICAgICAgICJ1cmwiIDogImZsb3dwbGF5ZXIucnRtcC0zLjIuMTEuc3dmIiwgCgkJCQkJLy8idXJsIjogImh0dHA6Ly9yZWxlYXNlcy5mbG93cGxheWVyLm9yZy9zd2YvZmxvd3BsYXllci5ydG1wLTMuMi4xMS5zd2YiLAoJCQkgICAgICAgICJuZXRDb25uZWN0aW9uVXJsIiA6ICJydG1wOi8vMTg1LjgyLjIxNS40NTozNTc5L3ZvZC8iCgkJCSAgICAgIH0sCgkJCSAgICAgICJjb250cm9scyIgOiB7CgkJCQkgICAgInVybCI6ICJodHRwOi8vcmVsZWFzZXMuZmxvd3BsYXllci5vcmcvc3dmL2Zsb3dwbGF5ZXIuY29udHJvbHMtMy4yLjE2LnN3ZiIsIC8vIGFkZGVkIGJlY2F1c2UgbWlzc2luZwoJCQkgICAgICAgICJwbGF5IiA6IGZhbHNlLAoJCQkgICAgICAgICJzY3J1YmJlciIgOiBmYWxzZQoJCQkgICAgICB9CgkJCSAgICB9LAoJCQkgICAgInBsYXllcklkIiA6ICJwbGF5ZXIiLAoJCQkgICAgImNsaXAiIDogewoJCQkgICAgICAidXJsIiA6ICJwYW5kYTE/ZSUzRDE0NjUwNzAzMjYlMjZzdCUzRFBydEhZeXZCemQ5WmQ3aERfZlJIVGcxMTExMzAiCgkJCSAgICB9CgkJCSAgfQoKCQkJICB2YXIgbmV3VXJsID0gcGFydHMuc2xpY2UoMCwgMykuam9pbignLycpICsgJy9mbG93cGxheWVyLTMuMi4xNi5zd2Y/Y29uZmlnPScgKyBlc2NhcGUoSlNPTi5zdHJpbmdpZnkobykpOwoJCQkgIC8vdmFyIG5ld1VybCA9ICdodHRwOi8vcmVsZWFzZXMuZmxvd3BsYXllci5vcmcvc3dmL2Zsb3dwbGF5ZXItMy4yLjE2LnN3Zj9jb25maWc9JyArIGVzY2FwZShKU09OLnN0cmluZ2lmeShvKSk7CgkJCSAgY29uc29sZS5sb2cobmV3VXJsKTsKCQkJICB0aGlzRWxlbWVudC5zcmMgPSBuZXdVcmw7\n                */\n              \n            });\n          } else { // skip anti-adblock\n            Aak.removeElement('#adsframe');\n            Aak.getElement('#remove-over').click();\n          }\n        }\n      },\n      allmyvideos_net : {\n        // note: obfuscated\n        // issue: https://github.com/reek/anti-adblock-killer/issues/274\n        host : ['allmyvideos.net', 'amvtv.net'],\n        onStart : function () {\n          // skip fake play button\n          Aak.setCookie('_favbt33', 1);\n        }\n      },\n      ilive_domains : {\n        host : ['ilive.to', 'streamlive.to'],\n        onEnd : function () {\n          if (/^\\/embedplayer.php/i.test(location.pathname)) {\n            setTimeout(function () {\n              // Skip timer\n              Aak.uw.removeOverlayHTML();\n            }, 1000);\n          }\n        }\n      },\n      micast_tv : {\n        host : ['micast.tv'],\n        onStart : function () {\n          // prevent popunder\n          Aak.setCookie('vid_main', true);\n          Aak.setCookie('vid_sub', true);\n          // remove overlay\n          Aak.addScript(function () {\n            window.onload = function () {\n              if (window.removeOverlayHTML)\n                window.removeOverlayHTML();\n            };\n          });\n        }\n      },\n      pxstream_tv : {\n        host : ['pxstream.tv'],\n        onEnd : function () {\n          if (/^\\/embedrouter.php/.test(location.pathname)) {\n            setTimeout(function () {\n              // Skip timer and close ads\n              Aak.uw.closeAd();\n            }, 1000);\n          }\n        }\n      },\n      sawlive_tv : {\n        host : ['sawlive.tv'],\n        onIdle : function () {\n          if (/^\\/embed\\/watch\\//i.test(location.pathname)) {\n            // Skip timer and close ads\n            Aak.uw.display = false;\n            Aak.uw.closeMyAd();\n          }\n        }\n      },\n      goodcast_co : {\n        host : ['goodcast.co'],\n        onIdle : function () {\n          if (/^\\/stream.php/.test(location.pathname)) {\n            // remove ads allowed by easylist\n            Aak.uw.$(\".advertisement\").hide();\n            Aak.uw.$('.adsky iframe').attr(\"src\", \"about:blank\");\n          }\n        }\n      },\n      showsport_tv_com : {\n        host : ['showsport-tv.com'],\n        onIdle : function () {\n          if (/^\\/ch.php/.test(location.pathname)) {\n            // remove ads allowed by easylist\n            Aak.removeElement('#advertisement, .advertisement');\n          }\n        }\n      },\n      sharecast_to : {\n        host : ['sharecast.to'],\n        onIdle : function () {\n          if (/^\\/embed.php/.test(location.pathname)) {\n\n            // Disable popunders\n            var interval = setInterval(function () {\n                Aak.setCookie('vid_main', true);\n                Aak.setCookie('vid_sub', 2);\n                Aak.setCookie('vid_delay', true);\n              }, 100);\n\n            setTimeout(function () {\n              clearInterval(interval);\n            }, 5000);\n\n            // Remove transparent overlay\n            Aak.removeElement('#table1');\n          }\n        }\n      },\n      videomega_tv : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=videomega\n        host : ['videomega.tv'],\n        onStart : function () {\n          if (/^\\/view.php/.test(location.pathname)) {\n            // prevent popunder\n            Aak.setCookie('vid_mainpu', true);\n            Aak.setCookie('vid_subpu', true);\n            Aak.setCookie('vid_delay', true);\n          }\n        },\n        onEnd : function () {\n          // kill abc\n          // fix bug on firefox: The video could not be loaded, either because the server or network failed or because the format is not supported.\n          var script = Aak.hasScript('Please disable AdBlock Plugin to watch the video');\n          if (script) {\n            var source = script.innerHTML;\n            var substring = source.substring(source.lastIndexOf('eval('), source.lastIndexOf(')') + 1);\n            var deobfuscated = Aak.unpackScript(substring);\n            var newScript = 'if('+deobfuscated.substring(deobfuscated.indexOf('true'));\n            Aak.addScript(newScript);\n          }\n        }\n      },\n      flowplayer_antiadblock : {\n        host : ['videofun.me', 'videobug.net', 'video44.net', 'play44.net', 'byzoo.org', 'playbb.me', 'videowing.me', 'videozoo.me', 'easyvideo.me', 'playpanda.net'],\n        onEnd : function () {\n        \n          /*\n          http://www.animetoon.tv/black-lagoon-episode-1\n          http://videowing.me/embed?w=718&h=438&video=ongoing/yu-gi-oh_arc-v_-_53.mp4\n          http://playbb.me/embed.php?w=718&h=438&vid=at/nw/yu-gi-oh_arc-v_-_53.mp4\n          http://videozoo.me/embed.php?w=718&h=438&vid=at/nw/yu-gi-oh_arc-v_-_53.mp4\n          http://www.easyvideo.me/gogo/?w=718&h=438&file=yu-gi-oh_arc-v_-_53.mp4&sv=1\n          http://playpanda.net/embed.php?w=718&h=438&vid=at/nw/yu-gi-oh_arc-v_-_53.mp4\n           */\n\n          // allow fullscreen when abp is enabled and remove ad layer\n          // ads blocked by abp rule\n          if (/^\\/(embed|gogo|gplus)/.test(location.pathname)) {\n            var Player = new Aak.player();\n            Player.editing('#flowplayer_api', {\n              setAttributes : {\n                allowfullscreen : true\n              }\n            });\n          }\n        }\n      },\n      r3z : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=label:R3Z\n        // source: http://pastebin.com/C159kevn\n        host : ['cityam.com', 'computerworlduk.com', 'techworld.com', 'v3.co.uk'],\n        onStart : function () {\n          /* don't work with chrome\n          Object.defineProperty(Aak.uw, '_r3z', {\n            enumerable : true,\n            writable : false,\n            value : {}\n          });\n          */\n        },\n        onIdle : function () {\n          Aak.uw.$(\"#r3z-wait\").remove();\n          Aak.uw.$(\".r3z-hide\").removeClass(\"r3z-hide\");\n          Aak.uw._r3z = null;\n        }\n      },\n      google_jobrunner : {\n        // issue: https://greasyfork.org/en/forum/messages/405\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1343\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1342\n        // issue: https://github.com/reek/anti-adblock-killer/issues/831\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1274\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1262\n        // issue: https://github.com/reek/anti-adblock-killer/issues/561\n        host : ['next-episode.net', 'kingmaker.news', 'gamespowerita.com', 'todayidol.com', 'receive-a-sms.com', 'wakeupcallme.com', 'ringmycellphone.com', 'faqmozilla.org', 'thememypc.com'],\n        onAlways : function () {\n          Aak.uw.google_jobrunner = {};\n        }\n      },\n      // fuckadbock customized\n      fab_dawn_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1747\n        host : ['dawn.com'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('detectAdBlock', 'DetectAdBlock');\n        }\n      },\n      fab_sports_fr : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1217\n        // source: http://pastebin.com/SpEN5duS\n        host : ['sports.fr'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('fabInstance', 'FabInstance');\n        }\n      },\n      fab_europe1_fr : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1188\n        // source: http://pastebin.com/ULe1vzQR\n        host : ['europe1.fr'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('fabInstance', 'FabInstance');\n        }\n      },\n      fab_newyorker_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1177\n        host : ['newyorker.com'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('sniffAdBlock', 'SniffAdBlock');\n        }\n      },\n      fab_wired_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1061\n        // issue: https://greasyfork.org/fr/forum/discussion/8235\n        // source: http://pastebin.com/Pq14v4FC\n        host : ['wired.com'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('sniffAdBlock', 'SniffAdBlock');\n        }\n      },\n      fab_mangasproject_domains : {\n        // note: fuckadblock with custom instance name\n        // note: also added abp rule\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1127\n        // issue: https://greasyfork.org/fr/forum/discussion/4132\n        // issue: https://github.com/reek/anti-adblock-killer/issues/858\n        // source: https://mangas.zlx.com.br/mangazord_lib/js/lib/controllers/Leitor/Leitor.min.js\n        host : ['mangasproject.com.br', 'mangasproject.net.br', 'mangas.zlx.com.br'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('mangasLeitorSlider', Aak.generateID());\n        }\n      },\n      fab_qnimate_com : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/739\n        // issue: https://github.com/reek/anti-adblock-killer/issues/705\n        // note: fuckadblock customized\n        host : ['qnimate.com'],\n        onAlways : function () {\n          Aak.uw.adBlockDetected = function () {};\n        }\n      },\n      fab_eurotransport_de : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/858\n        // note: fuckadblock with custom instance name\n        host : ['eurotransport.de'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('antiAdBlock', Aak.generateID());\n        }\n      },\n      fab_cadetect : {\n        // by: Skr4tchGr3azyMonkiBallllllZzzz\n        // issue: https://github.com/reek/anti-adblock-killer/issues/784\n        // note: fuckadblock with custom instance name\n        host : ['tzetze.it', 'beppegrillo.it', 'la-cosa.it'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('cadetect', 'CADetect');\n        }\n      },\n      fab_agar_game : {\n        // note: fuckadblock with custom instance name\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1257\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1135\n        host : ['agario.sx', 'agarabi.com'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('agario_SX_ads', Aak.generateID());\n        }\n      },\n      fab_filespace_com : {\n        // note: fuckadblock with custom instance name\n        // source: http://pastebin.com/YAS0As87\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1037\n        host : ['filespace.com'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('fAB', Aak.generateID());\n        }\n      },\n      fab_topserialy_sk : {\n        // note: fuckadblock with custom instance name\n        // source: http://pastebin.com/42tUQ9aV\n        host : ['topserialy.sk'],\n        onStart : function () {\n          Aak.fakeFuckAdBlock('sratNaVas', Aak.generateID());\n        }\n      },\n      fab_customized : {\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1455\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1657\n        // source: http://pastebin.com/N42a5BjE\n        host : ['epicurious.com', 'desktopsolution.org', 'indiatimes.com', 'hindustantimes.com', 'happytrips.com'],\n        onStart : function() {\n            Aak.addScript(function () {\n            (function () {\n              var _setAttribute = window.Element.prototype.setAttribute;\n              window.Element.prototype.setAttribute = function (name, value) {\n                if (name == 'class' && value.indexOf('text_ads') != -1) {\n                  value = '';\n                  console.info(this, 'fab intercepted :-)');\n                }\n                _setAttribute.call(this, name, value);\n              };\n            })();\n          });\n        }\n      },\n      d3xt3er_antiadblock : {\n        // site: http://d3xt3r.com/anti-adblock\n        // case: http://sport-show.fr/js/advertisement-AdBlock.js\n        // case: http://www.2site.me/advertisement-AdBlock.js\n        host : ['sport-show.fr', 'vipflash.net', '2site.me'],\n        onStart : function () {\n          Aak.addStyle(\"#blockblockA {visibility:invisible;display:none;} #blockblockA td {visibility:invisible;display:none;} #blockblockA td p {visibility:invisible;display:none;} #blockblockB {visibility:visible;display:block;}\");\n        }\n      },\n      adblock_notify : {\n        // by: Skr4tchGr3azyMonkiBallllllZzzz\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1766\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1392\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1039\n        // issue: https://github.com/reek/anti-adblock-killer/issues/592\n        // issue: https://github.com/reek/anti-adblock-killer/issues/813\n        host : ['gametransfers.com', 'winandmac.com', 'free-steam-giveaways.com', 'canalwp.com', 'alphahistory.com', 'nordpresse.be', 'sospc.name', 'baboo.com.br'],\n        onAlways : function () {\n          Aak.setCookie('anCookie', true);\n          Aak.uw.anOptions = {};\n        }\n      },\n      lutte_adblock : {\n        // site: http://lutteadblock.blogspot.com/2014/11/le-script.html\n        // issue: https://github.com/reek/anti-adblock-killer/issues/938\n        // issue: https://github.com/reek/anti-adblock-killer/issues/580\n        host : ['lewebtvbouquetfrancophone.overblog.com', 'webtv.bloguez.com', 'latelegratuite.blogspot.com', 'totaldebrid.org', '37.187.173.205', 'tvgratuite.blogspot.com'],\n        onStart : function () {\n          Aak.addBaitElement('div#my_ad_div');\n          Aak.uw.jabbahud = function () {};\n        }\n      },\n      antiblock : {\n        // site: antiblock.org\n        // note: customized\n        // issue: \n        host : ['mybank.pl', 'rapidgrab.pl'],\n        onStart : function () {\n          Aak.addScript(function () {\n            (function () {\n              var _addEventListener = window.addEventListener;\n              window.addEventListener = function (type, listener, options) {\n                if (listener.toString().indexOf('.nextFunction()}') > -1) {\n                  listener = function () {\n                    console.info(['AntiAdbKiller', location.host, 'AntiBlock{customized}']);\n                  };\n                }\n                _addEventListener.call(this, type, listener, options);\n              };\n            })();\n          });\n        }\n      },\n      blockadblock : {\n        // site: blockadblock.com\n        // note: random instance name\n        // source: https://gist.github.com/Watilin/af75e0a2e82a2efb384bde9c7b41dec8\n        // issues: https://github.com/reek/anti-adblock-killer/issues?q=label:BlockAdBlock\n        // issue: https://greasyfork.org/forum/discussion/8273\n        // issue: https://greasyfork.org/forum/discussion/7625\n        host : ['blockadblock.com', 'linkdrop.net', 'revclouds.com', 'leporno.org', 'uploadshub.com', 'dasolo.org', 'fullstuff.net', 'zeusnews.it', 'cheminots.net', 'lolsy.tv', 'animes-mangas-ddl.com', 'noticiasautomotivas.com.br', 'darkstars.org', 'corepacks.com', 'naturalbd.com', 'coolsoft.altervista.org', 'openload.us', 'cda-online.pl', 'urbanplanet.org', 'mamahd.com', 'sadeempc.com', 'avmoo.com', 'thailande-fr.com', 'btaia.com', 'tusoft.org', 'hisse.net', 'europeup.com', 'nrj.fr', 'srnk.co', 'animmex.co', 'socketloop.com', 'crackhex.com', 'revealedtricks4u.com', 'pizzamaking.com', 'computerworm.net', 'yourlifeupdated.net'],\n        onStart : function () {\n          Aak.addScript(function () {\n            // variant 1\n            (function () {\n              var _setTimeout = window.setTimeout;\n              window.setTimeout = function (fn, delay) {\n             // console.log(fn.toString())\n                if (typeof fn === 'string' && fn.indexOf('bab_elementid') > -1) {\n                  fn = function () {\n                    console.info(['AntiAdbKiller', location.host, 'BlockAdBlock']);\n                  };\n                }\n                _setTimeout.call(this, fn, delay);\n              };\n            })();\n          });\n        }\n      },\n      gpt_sp : {\n        // by: Reek, Giwayume\n        // note: when adblock detected inject new ads, redirect to http://tinyurl.com/zq2z5o6\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1636\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1596\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1297\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1144\n        // issue: https://github.com/reek/anti-adblock-killer/issues/1542\n        // source: http://pastebin.com/8Ajitfb2\n        host : ['marketwatch.com', 'deadline.com', 'tweaktown.“æ:xùcom', 'nypost.com', 'realgm.com', 'nasdaq.com'],\n        onStart : function () {\n          Aak.addStyle(\".container--bannerAd, .col--ad { display: none; }\");\n          Aak.addScript(function () {\n            (function () {\n              // Giwayume \n              window._sp_ = window._sp_ || {};\n              window._sp_.config = window._sp_.config || {};\n              Object.defineProperty(window._sp_.config, \"content_control_callback\", {\n                value : function () {},\n                writable : false,\n                configurable : false\n              });\n              // Reek\n              var _addEventListener = window.EventTarget.prototype.addEventListener;\n              window.EventTarget.prototype.addEventListener = function (type, listener, options) {\n                if (type == 'sp.blocking') {\n                  listener = function () {\n                    console.info(['AntiAdbKiller', location.host, 'GPT{sp-blocking}']);\n                  };\n                }\n                _addEventListener.call(this, type, listener, options);\n              };\n            })();\n          });\n        }\n      },\n      krux_asl : {\n        // note: when adblock detected inject new ads\n        // source: http://pastebin.com/0HD7N84i\n        host : ['commentcamarche.net', 'journaldesfemmes.com', 'linternaute.com'],\n        onBeforeScript : function () {\n          return [{\n              detected : 'Krux{asl}',\n              contains : 'Asl.prototype.inject',\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      krux_adp : {\n        // note: when adblock detected inject new ads\n        // source: \n        host : ['fourchette-et-bikini.fr', 'meteocity.com'],\n        onStart : function () {\n          Aak.uw.adProtect = 1;\n        }\n      },\t \n      phoenix_goyavelab : {\n        // note: when adblock detected inject new ads\n        // note: script anti-adblock obfuscated,\n        // issue: https://github.com/reek/anti-adblock-killer/issues/\n        // doc: http://tinyurl.com/gl3ghq2\n        // source: http://pastebin.com/hsAmdSuf\n        host : ['demo-phoenix.com', 'dpstream.net', 'gum-gum-streaming.com', 'jeu.info', 'sofoot.com', 'gaara-fr.com', 'gaytube.com', 'tuxboard.com', 'xstory-fr.com', 'hentaifr.net', 'filmstreaming-hd.com', 'filmvf.net', 'hentaihaven.org', 'narutoshippudenvf.com', 'thebadbuzz.com', 'manga-news.com', 'jeu.video', 'mangas-fr.com'],\n        onAlways : function () {\n          //Aak.uw.__$dc = function () {};\n          Aak.addStyle('body {visibility: visible;}');\n        },\n        onBeforeScript : function () {\n          return [{ \n              detected : 'PhoenixGoyavelab',\n              contains : 'PHENV',\n              external : false,\n              remove: true\n            }\n          ];\n        }\n      },\n      ad_defend_uabp : {\n        // note: when adblock detected inject new ads\n        // source: http://pastebin.com/cFQCp80W\n        host : ['tvspielfilm.de', 'finanzen.ch'],\n        onBeforeScript : function () {\n          return [{\n              detected : 'AdDefend{UABPInject}',\n              contains : 'UABPInject',\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      ad_defend_uab : {\n        // note: when adblock detected inject new ads\n        // userscript: https://openuserjs.org/scripts/schwarztee/AdDefend_Klatsche\n        // userscript: https://gist.github.com/anonymous/a9b9956baf1d59a107c5\n        // source: http://pastebin.com/1VyW0u9m, http://pastebin.com/AZqhRxWU\n        // issue: https://github.com/reek/anti-adblock-killer/issues?q=label:AdDefend\n        // pull: https://github.com/reek/anti-adblock-killer/pull/467\n        host : ['watchgeneration.fr', 'turbo.fr', '24matins.fr', 'foot01.com', 'clubic.com', 'macg.co', 'begeek.fr', 'igen.fr', 'gamestar.de', 'focus.de', 'stern.de', 'sat1.', 'prosieben.', 'kabeleins.', 'sat1gold.', 'sixx.', 'prosiebenmaxx.', 'fem.com', 'the-voice-of-germany.', 'wetter.com', 'wetteronline.de', 'pcwelt.de', 'boerse-online.de', 'sportauto.de', 'auto-motor-und-sport.de', 'motor-klassik.de', '4wheelfun.de', 'autostrassenverkehr.de', 'lustich.de', 'spox.com', 'shz.de', 'transfermarkt.de', 'rp-online.de', 'motorradonline.de', '20min.ch', 'main-spitze.de', 'wormser-zeitung.de', 'lampertheimer-zeitung.de', 'wiesbdener-tagblatt.de', 'buerstaedter-zeitung.de', 'wiesbdener-kurier.de', 'rhein-main-presse.de', 'allgemeine-zeitung.de', 'ariva.de', 'spiegel.de', 'brigitte.de', 'dshini.net', 'gala.de', 'gamepro.de', 'gamona.de', 'pnn.de', 'promobil.de', 'sportal.de', 'webfail.com', 'computerbild.de', 'finanzen.net', 'comunio.de', 'medisite.fr'],\n        onBeforeScript : function () {\n          return [{\n              detected : 'AdDefend{uabInject}',\n              contains : 'uabInject',\n              external : false,\n              remove : true\n            }\n          ];\n        }\n      },\n      /* solved by AakLIst\n      tisoomi_indirekt : {\n      // inline: http://pastebin.com/npmXTUHw\n      // external: http://pastebin.com/hvWnCuDw\n      host : ['energy.de', 'getvids.de', 'gewinde-normen.de', 'podcast.de', 'spielespielen24.de', 'dialo.de'],\n      onBeforeScript : function (e) {\n      var target = e.target || e.srcElement;\n      var text = target.text;\n      if (Aak.contains(text, 'n=\"abcdefghijklm\",r=\"nopqrstuvwxyz\",i=\"0123456789\";var s=t==0?i:t==1?n')) {\n      Aak.stopScript(e);\n      Aak.log('Tisoomi Indirekt');\n      }\n      }\n      },\n       */\n      /* solved by AakLIst\n      tisoomi_direkt : {\n      // inline: http://pastebin.com/2vq38JXY\n      host : ['autozeitung.de', 'formel1.de', 'fremdwort.de', 'inside-handy.de', 'motorsport-total.com', 'aussenwirtschaftslupe.de', 'donnerwetter.de', 'wintotal.de'],\n      onBeforeScript : function (e) {\n      var target = e.target || e.srcElement;\n      var text = target.text;\n      if (Aak.contains(text, 'function detect()')) {\n      Aak.stopScript(e);\n      Aak.log('Tisoomi Direkt');\n      }\n      }\n      },\n       */\n      // --------------------------------------------------------------------------------------------\n      // Generic\n      // --------------------------------------------------------------------------------------------\n      generic : {\n        host : ['.*?'],\n        onRemove : function (removedNode) {\n          if (Aak.opts.removed) {\n            if (removedNode.src ||\n              removedNode.id ||\n              removedNode.className &&\n              !/^firebug/.test(removedNode.className)) {\n              // Node removed\n              Aak.log(removedNode);\n            }\n          }\n        },\n        onStart : function () {\n\n          // FuckAdBlock & BlockAdBlock v3 and v4\n          // site: http://www.sitexw.fr/fuckadblock/\n          // repo: https://github.com/sitexw/FuckAdBlock\n          // repo: https://github.com/sitexw/BlockAdBlock\n          // note: when fuckadblock.js or blockadblock.js is blocked\n          // demo v3: http://sh.st/vovHE\n          // demo v4: http://al.ly/qBbXH\n          // issue: https://github.com/reek/anti-adblock-killer/issues/888\n          // issue: https://github.com/reek/anti-adblock-killer/issues/824\n          Aak.fakeFuckAdBlock('fuckAdBlock', 'FuckAdBlock');\n          Aak.fakeFuckAdBlock('blockAdBlock', 'BlockAdBlock');\n\n          // canRunAds\n          // repo: https://github.com/MatthewGross/CanRunAds\n          // note: use externall script \"/js/ads.js\" -> var canRunAds = true;\n          Object.defineProperty(Aak.uw, 'canRunAds', {\n            enumerable : true,\n            writable : false,\n            value : true\n          });\n\n          // canShowAds\n          // issue: https://github.com/reek/anti-adblock-killer/issues/1197\n          Object.defineProperty(Aak.uw, 'canShowAds', {\n            enumerable : true,\n            writable : false,\n            value : true\n          });\n\n          // Adblocker Detecting Scripts: Method 2\n          // gist: https://gist.github.com/irazasyed/3d247d3d121e781a3872\n          // note: use externall script \"/js/ads.js\" -> isAdBlockActive = false;\n          Object.defineProperty(Aak.uw, 'isAdBlockActive', {\n            enumerable : true,\n            writable : false,\n            value : false\n          });\n\n          /*\n          window.iHaveLoadedAds = true;\n          var niceAdsCheck=true;\n          adblock = false\n          is_blocker = false;\n           */\n        },\n        onIdle : function () {\n\n          // AdBlock Detector (XenForo Rellect)\n          // site: http://tinyurl.com/pa28xdn\n          // cloneInto: http://tinyurl.com/k6qphme\n          // issue: https://github.com/reek/anti-adblock-killer/issues/805\n          // issue: https://github.com/reek/anti-adblock-killer/issues/804\n          // issue: https://github.com/reek/anti-adblock-killer/issues/591\n          if (Aak.uw.XenForo && typeof Aak.uw.XenForo.rellect == 'object') {\n            Aak.uw.XenForo.rellect = {\n              AdBlockDetector : {\n                start : function () {}\n              }\n            };\n            Aak.detected('AdBlock Detector (XenForo Rellect)');\n          }\n\n          /*\n          // Adunblock - http://adunblock.com/\n          if (Aak.getCookie('adblock') == 1) {\n          Aak.setCookie('adblock', 0);\n          Aak.setCookie('bar_closed', 1);\n          }\n           */\n\n          // Adblock Blocker\n          // https://wordpress.org/plugins/addblockblocker/\n          // http://tinyurl.com/nswn6fz\n          // http://pastebin.com/d65zr37m\n          /* can cause a bug\n          var ads = document.getElementsByClassName('afs_ads');\n          var ad = ads.length && ads[ads.length - 1];\n          if (ad && ad.innerHTML.length === 0 || ad.clientHeight === 0) {\n          Aak.addScript(function () {\n          getElementsByClassNameNative = HTMLDocument.prototype.getElementsByClassName;\n          HTMLDocument.prototype.getElementsByClassName = function (className) {\n          if (className == 'afs_ads') {\n          console.info(['AntiAdbKiller', location.host, 'AdblockBlocker', className]);\n          var uniqid = Date.now();\n          var bait = document.createElement(\"div\");\n          bait.innerHTML = '\u003Cbr>';\n          bait.className = uniqid;\n          document.body.appendChild(bait);\n          return document.getElementsByClassName(uniqid);\n          }\n          return getElementsByClassNameNative.apply(this, arguments);\n          };\n          });\n          }\n           */\n\n          // Adbuddy\n          if (typeof Aak.uw.closeAdbuddy === 'function') {\n            Aak.uw.closeAdbuddy();\n            Aak.detected('Adbuddy');\n          }\n\n          // AdBlock Alerter (WP)\n          // https://github.com/wp-plugins/adblock-alerter\n          //\n          if (Aak.getElement('div.adb_overlay > div.adb_modal_img')) {\n            // Remove Alert + Allow Scroll\n            Aak.removeElement('div.adb_overlay');\n            Aak.addStyle('html,body {height:auto; overflow: auto;}');\n            Aak.detected('AdBlockAlerter');\n          }\n\n          // Unknow Anti AdBlock system\n          if (Aak.getElement('#blockdiv') && Aak.contains(Aak.getElement('#blockdiv').innerHTML, 'disable ad blocking or use another browser without any adblocker when you visit')) {\n            Aak.removeElement('#blockdiv');\n          }\n\n          // Antiblock.org v2\n          // note: detect and store block id\n          // demo: http://tinyurl.com/nhyhpzk\n          var styles = document.querySelectorAll('style');\n          for (var i = 0; i \u003C styles.length; i++) {\n            var style = styles[i];\n            var cssRules = style.sheet.cssRules;\n            for (var j = 0; j \u003C cssRules.length; j++) {\n              var cssRule = cssRules[j];\n              var cssText = cssRule.cssText;\n              var pattern = /^#([a-z0-9]{4,10}) ~ \\* \\{ display: none; \\}/;\n              if (pattern.test(cssText)) {\n                var id = pattern.exec(cssText)[1];\n                if (Aak.hasScript(\"w.addEventListener('load',\" + id + \",false)\")) {\n                  Aak.aabs.abo2 = id;\n                  break;\n                }\n              }\n            }\n          }\n\n          var win = Aak.uw;\n          for (var prop in win) {\n            try {\n              if (!/^webkit/.test(prop) && /^[a-z0-9]{4,12}$/i.test(prop) && prop !== 'document' && (win[prop]instanceof HTMLDocument) === false && win.hasOwnProperty(prop) && typeof win[prop] === 'object') {\n                var method = win[prop];\n\n                // Antiblock.org v3 & BetterStopAdblock\n                // issue: https://github.com/reek/anti-adblock-killer/issues/833\n                if (method.deferExecution &&\n                  method.displayMessage &&\n                  method.getElementBy &&\n                  method.getStyle &&\n                  method.insert &&\n                  method.nextFunction) {\n                  if (method.toggle) {\n                    Aak.aabs.bsa = prop;\n                    Aak.detected('BetterStopAdblock{dom}');\n                  } else {\n                    Aak.aabs.abo3 = prop;\n                    Aak.detected('Antiblock3{dom}');\n                  }\n                  win[prop] = null; // kill instance\n                }\n\n                // BlockAdBlock\n                // site: blockadblock.com\n                // note: random instance name\n                // source: https://gist.github.com/Watilin/af75e0a2e82a2efb384bde9c7b41dec8\n                // issues: https://github.com/reek/anti-adblock-killer/issues?q=label%3ABlockAdBlock\n                if (method.bab) { // variant 1\n                  Aak.detected('BlockAdBlock{dom:variant1}');\n                  win[prop] = null;\n                } else if (Object.keys(method).length === 3 && Object.keys(method).map(function (value, index) {\n                    return value;\n                  }).join().length === 32) { // variant 2\n                  Aak.detected('BlockAdBlock{dom:variant2}');\n                  win[prop] = null;\n                }\n              }\n            } catch (e) {\n              //console.log('error', prop)\n            }\n          }\n\n          // Anti-Adblockers\n          var aabs = {\n            // Plugins WordPress\n            NoAdBlock : '(/plugins/no-adblock/|/blockBlock/blockBlock.jquery.js)',\n            BetterStopAdblock : '(/plugins/better-stop-adblock/|bsa-script-doctype.js|bsa-script-no-doctype.js)',\n            AdBlockBlocker : '/plugins/wordpress-adblock-blocker/',\n            AntiBlockBukssaAyman : '/plugins/anti-block/',\n            BlockAlyzer : '/plugins/blockalyzer-adblock-counter/',\n            AdBlockingDetector : '/plugins/ad-blocking-detector/',\n            // Plugins Website\n            Adworkmedia : '(adworkmedia|loxtk|contentlockingnetworks).com/gLoader.php',\n            Adscendmedia : 'adscendmedia.com/gwjs.php',\n            FuckAdBlock : '(/fuckadblock.js|/blockadblock.js)',\n            jQueryAdBlock : '/jquery.adblock.js',\n            jQueryAdblockDetector : '/jquery.adblock-detector.js',\n            AdBlockAdvertisement : '/advertisement.js',\n            AdBlockAdvert : '/advert.js',\n            AdBlockAdvCustom : '/advertisement(.+).js',\n            AdBlockAdframe : '/adframe.js',\n            AntiAdBuster : '/anti-ad-buster.js',\n            RTKAntiAdblock : '/blockcake.js',\n            AdblockDetector : '/AdblockDetector/handler.min.js',\n            jQueryAntiAdsBlock : '/jquery.antiadsblock.js',\n            Adbuddy : '/js/adbuddy.min.js',\n            AntiADsBlocker : '/aadb/script.js'\n          };\n\n          var scripts = document.scripts;\n          for (var y = 0; y \u003C scripts.length; y++) {\n            var script = scripts[y];\n            if (script.src) {\n              for (var key in aabs) {\n                if (new RegExp(aabs[key], 'i').test(script.src)) {\n                  Aak.detected([key, script.src]);\n                  break;\n                }\n              }\n            }\n          }\n\n        },\n        onInsert : function (insertedNode) {\n\n          // All Nodes\n          if (Aak.opts.inserted) {\n            if (insertedNode.src ||\n              insertedNode.id ||\n              insertedNode.className &&\n              !/firebug/.test(insertedNode.innerHTML)) {\n              // Node inserted\n              Aak.log(insertedNode);\n            }\n          }\n\n          // No-Adblock - http://www.no-adblock.com/\n          if (insertedNode.id &&\n            insertedNode.id.length == 4 &&\n            /^[a-z0-9]{4}$/.test(insertedNode.id) &&\n            insertedNode.nodeName == 'DIV' &&\n            insertedNode.firstChild &&\n            insertedNode.firstChild.id &&\n            insertedNode.firstChild.id == insertedNode.id &&\n            Aak.contains(insertedNode.innerHTML, 'no-adblock.com')) {\n            // Remove\n            Aak.detected('No-Adblock', false, location.href);\n            Aak.removeElement(insertedNode);\n            //Aak.log(insertedNode);\n          }\n\n          // StopAdblock - http://stopadblock.org/downloads/\n          if (insertedNode.id &&\n            insertedNode.id.length == 7 &&\n            /^a[a-z0-9]{6}$/.test(insertedNode.id) &&\n            insertedNode.nodeName == 'DIV' &&\n            insertedNode.parentNode &&\n            insertedNode.parentNode.id &&\n            insertedNode.parentNode.id == insertedNode.id + '2' &&\n            Aak.contains(insertedNode.innerHTML, 'stopadblock.org')) {\n            // Remove\n            Aak.detected('StopAdBlock', false, location.href);\n            Aak.removeElement(insertedNode);\n            //Aak.log(insertedNode);\n          }\n\n          // AntiAdblock (Packer)\n          var reIframeId = /^(zd|wd)$/;\n          var reImgId = /^(xd|gd)$/;\n          var reImgSrc = /\\/ads\\/banner.jpg/;\n          var reIframeSrc = /(\\/adhandler\\/|\\/adimages\\/|ad.html)/;\n\n          // Communs\n          if (insertedNode.id &&\n            reImgId.test(insertedNode.id) &&\n            insertedNode.nodeName == 'IMG' &&\n            reImgSrc.test(insertedNode.src) ||\n            insertedNode.id &&\n            reIframeId.test(insertedNode.id) &&\n            insertedNode.nodeName == 'IFRAME' &&\n            reIframeSrc.test(insertedNode.src)) {\n\n            // Variant 1\n            if (insertedNode.id == 'xd') {\n              Aak.detected('AntiAdblockPackerZdxd', false, location.href);\n            } // Variant 2\n            else if (insertedNode.id == 'gd') {\n              Aak.detected('AntiAdblockPackerWdgd', false, location.href);\n            }\n            // Remove\n            //Aak.log(insertedNode);\n            Aak.removeElement(insertedNode);\n          }\n\n          // Adunblock - http://adunblock.com/\n          var reId = /^[a-z]{8}$/;\n          var reClass = /^[a-z]{8} [a-z]{8}/;\n          var reBg = /^[a-z]{8}-bg$/;\n          var reMessage = /Il semblerait que vous utilisiez un bloqueur de publicité !/;\n\n          // Communs\n          if (typeof Aak.uw.vtfab != 'undefined' &&\n            typeof Aak.uw.adblock_antib != 'undefined' &&\n            insertedNode.parentNode &&\n            insertedNode.parentNode.nodeName == 'BODY' &&\n            insertedNode.id &&\n            reId.test(insertedNode.id) &&\n            insertedNode.nodeName == 'DIV' &&\n            insertedNode.nextSibling &&\n            insertedNode.nextSibling.className &&\n            insertedNode.nextSibling.nodeName == 'DIV') {\n\n            // Full Screen Message (Premium)\n            // \u003Cdiv id=\"lfyhsvdq\" class=\"tvwnoqdf svonexrk\" style=\"top: 100px; opacity: 1; visibility: visible;\">\n            // \u003Cdiv class=\"tvwnoqdf-bg\" style=\"display: block;\">\u003C/div>\n            if (insertedNode.className &&\n              reClass.test(insertedNode.className) &&\n              reBg.test(insertedNode.nextSibling.className) &&\n              insertedNode.nextSibling.style &&\n              insertedNode.nextSibling.style.display != 'none') {\n\n              // Remove Message\n              Aak.detected(\"AdUnBlockPremium\");\n              Aak.removeElement(insertedNode.nextSibling); // overlay\n              Aak.removeElement(insertedNode); // box\n            }\n            // Top bar Message (Free)\n            // \u003Cdiv id=\"vixmgrly\">\n            // \u003Cdiv id=\"mfnhaiyx\" class=\"lkrnvbyt\">\n            else if (insertedNode.nextSibling.id &&\n              reId.test(insertedNode.nextSibling.id) &&\n              reMessage.test(insertedNode.innerHTML)) {\n\n              // Remove Message\n              Aak.detected(\"AdUnBlockFree\");\n              Aak.removeElement(insertedNode);\n            }\n          }\n\n          // Antiblock - http://antiblock.org/\n          var reMsgId = /^[a-z0-9]{4,10}$/i;\n          var reTag1 = /^(div|span|b|i|font|strong|center)$/i;\n          var reTag2 = /^(a|b|i|s|u|q|p|strong|center)$/i;\n          var reWords1 = /ad blocker|ad block|ad-block|adblocker|ad-blocker|adblock|bloqueur|bloqueador|Werbeblocker|adblockert|&#1570;&#1583;&#1576;&#1604;&#1608;&#1603; &#1576;&#1604;&#1587;|блокировщиком/i;\n          var reWords2 = /kapat|disable|désactivez|désactiver|desactivez|desactiver|desative|desactivar|desactive|desactiva|deaktiviere|disabilitare|&#945;&#960;&#949;&#957;&#949;&#961;&#947;&#959;&#960;&#959;&#943;&#951;&#963;&#951;|&#1079;&#1072;&#1087;&#1088;&#1077;&#1097;&#1072;&#1090;&#1100;|állítsd le|publicités|рекламе|verhindert|advert|kapatınız/i;\n\n          // Antiblock.org (all version)\n          if (insertedNode.parentNode &&\n            insertedNode.id &&\n            insertedNode.style &&\n            insertedNode.childNodes.length &&\n            insertedNode.firstChild &&\n            !insertedNode.firstChild.id &&\n            !insertedNode.firstChild.className &&\n            reMsgId.test(insertedNode.id) &&\n            reTag1.test(insertedNode.nodeName) &&\n            reTag2.test(insertedNode.firstChild.nodeName)) {\n            //Aak.log(insertedNode);\n\n            // Kill audio message\n            var audio = insertedNode.querySelector(\"audio[loop]\");\n            if (audio) {\n              audio.pause();\n              Aak.detected('Antiblock{audio}');\n              Aak.removeElement(audio);\n            }\n            // Antiblock.org v2\n            // demo: http://tinyurl.com/h3mwta4\n            else if ((Aak.aabs.abo2 && insertedNode.id == Aak.aabs.abo2) ||\n              (insertedNode.firstChild.hasChildNodes() && reWords1.test(insertedNode.firstChild.innerHTML) && reWords2.test(insertedNode.firstChild.innerHTML))) {\n              Aak.detected('Antiblock2{insert}');\n              Aak.removeElement(insertedNode);\n            }\n            // Antiblock.org v3\n            // demo: http://tinyurl.com/qecfa7w\n            // case: http://tinyurl.com/zbrlr3a /* fork */\n            else if ((Aak.aabs.abo3 && insertedNode.id == Aak.aabs.abo3) ||\n              (insertedNode.firstChild.hasChildNodes() && insertedNode.firstChild.firstChild.nodeName == 'IMG' && /^data:image\\/png;base64/.test(insertedNode.firstChild.firstChild.src))) {\n              Aak.uw[Aak.aabs.abo3] = null;\n              Aak.detected('Antiblock3{insert}');\n              Aak.removeElement(insertedNode);\n            }\n            // BetterStopAdblock\n            // demo: http://tinyurl.com/js9zat4\n            // source: http://pastebin.com/YimkrtKB\n            // issue: http://tinyurl.com/zetgbtx\n            else if (Aak.aabs.bsa && insertedNode.id == Aak.aabs.bsa) {\n              Aak.uw[Aak.aabs.bsa] = null;\n              Aak.detected('BetterStopAdblock{insert}');\n              Aak.removeElement(insertedNode);\n            }\n            //  Many false positive\n            else {\n              //Aak.removeElement(insertedNode);\n            }\n          }\n        }\n      }\n    },\n    blockDetect : function () {\n\n      // Exclude domains\n      // issue: https://github.com/reek/anti-adblock-killer/issues/1466\n      // issue: https://github.com/reek/anti-adblock-killer/issues/1263\n      // issue: https://greasyfork.org/en/forum/discussion/8422/\n      // issue: https://github.com/reek/anti-adblock-killer/issues/986\n      // issue: https://github.com/reek/anti-adblock-killer/issues/857\n      // issue: https://github.com/reek/anti-adblock-killer/issues/617\n      // issue: https://greasyfork.org/fr/forum/discussion/5426\n      // issue: https://github.com/reek/anti-adblock-killer/issues/419\n      // issue: https://github.com/reek/anti-adblock-killer/issues/377\n      var excludes = [\"360.cn\", \"amazon.\", \"apple.com\", \"ask.com\", \"baidu.com\", \"bing.com\", \"bufferapp.com\", \"chatango.com\", \"chromeactions.com\", \"easyinplay.net\", \"ebay.com\", \"facebook.com\", \"flattr.com\", \"flickr.com\", \"ghacks.net\", \"google.\", \"imdb.com\", \"imgbox.com\", \"imgur.com\", \"instagram.com\", \"jsbin.com\", \"jsfiddle.net\", \"linkedin.com\", \"live.com\", \"mail.ru\", \"microsoft.com\", \"msn.com\", \"paypal.com\", \"pinterest.com\", \"preloaders.net\", \"qq.com\", \"reddit.com\", \"stackoverflow.com\", \"tampermonkey.net\", \"twitter.com\", \"vimeo.com\", \"wikipedia.org\", \"w3schools.com\", \"yahoo.\", \"yandex.ru\", \"youtu.be\", \"youtube.com\", \"xemvtv.net\", \"vod.pl\", \"agar.io\", \"pandoon.info\", \"fsf.org\", \"adblockplus.org\", \"plnkr.co\", \"exacttarget.com\", \"dolldivine.com\", \"popmech.ru\", \"calm.com\"];\n      var host = location.host;\n      var excluded = false;\n      excludes.forEach(function (exclude) {\n        if (new RegExp(exclude).test(host)) {\n          excluded = true;\n          if (Aak.opts.logExcluded) {\n            Aak.warn('Excluded');\n          }\n          return false;\n        }\n      });\n\n      // Include domains\n      // IsEventupported: http://tinyurl.com/oeez8c7\n      if (!excluded) {\n\n        var handlerEvents = function () {\n          var rule = Aak.rules[name];\n\n          rule.host.forEach(function (host) {\n            // Check host\n            if (new RegExp(host).test(location.host)) {\n\n              // Native mode\n              if (!Aak.useGM && Aak.isTopframe) {\n                Aak.warn('Run natively.');\n              }\n\n              // Log rule used\n              if (rule.host[0] != '.*?') {\n                Aak.detected('rule', rule);\n              }\n              \n              // Before DOM load\n              if (rule.onStart) {\n                rule.onStart();\n              }\n              // On all statements\n              if (rule.onAlways) {\n                rule.onAlways(); // start\n                Aak.onEvent(window, 'DOMContentLoaded', rule.onAlways); // idle\n                Aak.onEvent(window, 'load', rule.onAlways); // end\n              }\n              // Before Script Executed\n              if (rule.onBeforeScript) {\n\n                // options: contains, search, replace, override, remove, external\n                var optionsBeforeScript = rule.onBeforeScript();\n                if (typeof optionsBeforeScript == \"object\") {\n\n                  var handlerBeforeScript = function (e, options) {\n                    var isEvent = e instanceof window.Event;\n                    var thisScript = (e.target || e.srcElement) || e;\n\n                    options.forEach(function (o) { // hasAttribute\n                      var src = o.external ? 'src' : 'innerHTML';\n                      var search = new RegExp(o.contains, o.flags || '');\n\n                      if (thisScript[src] && thisScript[src].length && search.test(thisScript[src])) {\n\n                        // Stop script execution\n                        if (isEvent) {\n                          e.preventDefault();\n                          e.stopPropagation();\n                        }\n\n                        // Create new script\n                        var parent = thisScript.parentNode;\n                        var newScript = document.createElement('script');\n\n                        // Replace a part of the script\n                        if (o.replace) {\n                          newScript[src] = thisScript[src].replace(search, o.replace);\n                          parent.replaceChild(newScript, thisScript);\n                        } // Override script\n                        else if (o.override) {\n                          newScript[src] = o.override;\n                          parent.replaceChild(newScript, thisScript);\n                        } // Remove script\n                        else if (o.remove) {\n                          parent.removeChild(thisScript);\n                        }\n                        \n                        if (o.detected) {\n                          Aak.detected(o.detected);\n                        }\t\t\t\t\t\t\n\n                        if (Aak.opts.logInterceptedScripts) {\n                          Aak.log(src, o, thisScript, newScript);\n                        }\n                      }\n                    });\n                  };\n\n                  // Browser supporting event beforescriptexecute\n                  if ('onbeforescriptexecute' in document) {\n                    Aak.onEvent(window, 'beforescriptexecute', function (e) {\n                      handlerBeforeScript(e, optionsBeforeScript);\n                    });\n                  } else { // Browser not suppoting beforescriptexecute\n\n                    var loadDocument = function (optionsBeforeScript) {\n                      //if (document.referrer === '')\n                      //return;\n\n                      Aak.warn('onbeforescript-compatible');\n\n                      // Stop loading\n                      Aak.addScript('window.stop();'); // chrome/opera\n                      //Aak.addScript('document.open();'); // firefox\n\n                      // Get content\n                      Aak.request({\n                        url : location.href,\n                        headers : {\n                          \"Referer\" : document.referrer\n                        },\n                        onload : function (result) {\n                          var html = result.responseText;\n                          var parser = new window.DOMParser();\n                          var doc = parser.parseFromString(html, \"text/html\");\n                          var scripts = doc.scripts;\n\n                          for (var i = 0; i \u003C scripts.length; i++) {\n                            var thisScript = scripts[i];\n                            handlerBeforeScript(thisScript, optionsBeforeScript);\n                          }\n\n                          // Convert to string\n                          html = doc.documentElement.outerHTML;\n\n                          // Write new content to HTML document:\n                          Aak.addScript('document.open(); document.write(unescape(\"' + window.escape(html) + '\")); document.close();'); // chrome/opera\n                          //Aak.addScript('document.write(unescape(\"' + escape(html) + '\")); document.close();'); // firefox\n                        }\n                      });\n                    };\n                    loadDocument(optionsBeforeScript);\n                  }\n                }\n              } // After Script Executed\n              if (rule.onAfterScript) {\n                if ('onafterscriptexecute' in document) { // Mozilla Firefox\n                  Aak.onEvent(window, 'afterscriptexecute', rule.onAfterScript);\n                }\n              }\n              // When DOM Load\n              if (rule.onIdle) {\n                if (!Aak.useGM) { // Native mode\n                  rule.onIdle();\n                } else {\n                  //Aak.onEvent(window, 'DOMContentLoaded', rule.onIdle);\n                  Aak.onEvent(window, 'DOMContentLoaded', rule.onIdle);\n                }\n              }\n              // When Window Load\n              if (rule.onEnd) {\n                if (!Aak.useGM) { // Native mode\n                  rule.onEnd();\n                } else {\n                  Aak.onEvent(window, 'load', rule.onEnd);\n                }\n              }\n              // When DOM AttrModified\n              if (rule.onAttrModified) {\n                Aak.onEvent(window, 'DOMAtÜ6ï}îtrModified', rule.onAttrModified, false);\n              }\n              // When DOM SubtreeModified\n              if (rule.onSubtreeModified) {\n                Aak.onEvent(window, 'DOMSubtreeModified', rule.onSubtreeModified, false);\n              }\n              // When DOM Elements are Inserted in Document\n              if (rule.onInsert) {\n\n                // Mutation Observer\n                // doc: http://tinyurl.com/mxxzee4\n                // support: http://tinyurl.com/nepn7vy\n                if (typeof window.MutationObserver != 'undefined' ||\n                  typeof WebKitMutationObserver != 'undefined') {\n\n                  // Mutation Observer\n                  var MutationObserver1 = window.MutationObserver || window.WebKitMutationObserver;\n\n                  // Create an observer instance\n                  var obs1 = new MutationObserver1(function (mutations) {\n                      // We can safely use `forEach` because we already use mutation\n                      // observers that are more recent than `forEach`. (source: MDN)\n                      mutations.forEach(function (mutation) {\n                        // we want only added nodes\n                        if (mutation.addedNodes.length) {\n                          Array.prototype.forEach.call(mutation.addedNodes, function (addedNode) {\n                            if (Aak.opts.logInsertedNodes) {\n                              Aak.log(addedNode);\n                            }\n                            rule.onInsert(addedNode);\n                          });\n                        }\n                      });\n                    });\n                  // Observer\n                  obs1.observe(document, {\n                    childList : true,\n                    subtree : true\n                  });\n                }\n                // Mutation Events (Alternative Solution)\n                // doc: http://tinyurl.com/op95rfy\n                else {\n                  Aak.onEvent(window, \"DOMNodeInserted\", function (e) {\n                    if (Aak.opts.logInsertedNodes) {\n                      Aak.log(e.target);\n                    }\n                    rule.onInsert(e.target);\n                  }, false);\n                }\n              }\n              // When DOM Elements are Removed in Document\n              if (rule.onRemove) {\n\n                // Mutation Observer\n                // doc: http://tinyurl.com/mxxzee4\n                // support: http://tinyurl.com/nepn7vy\n                if (typeof window.MutationObserver != 'undefined' ||\n                  typeof WebKitMutationObserver != 'undefined') {\n\n                  // Mutation Observer\n                  var MutationObserver2 = window.MutationObserver || window.WebKitMutationObserver;\n\n                  // Create an observer instance\n                  var obs2 = new MutationObserver2(function (mutations) {\n                      // We can safely use `forEach` because we already use mutation\n                      // observers that are more recent than `forEach`. (source: MDN)\n                      mutations.forEach(function (mutation) {\n                        // we want only removed nodes\n                        if (mutation.removedNodes.length) {\n                          Array.prototype.forEach.call(mutation.removedNodes, function (removedNode) {\n                            if (Aak.opts.logRemovedNodes) {\n                              Aak.log(removedNode);\n                            }\n                            rule.onRemove(removedNode);\n                          });\n                        }\n                      });\n                    });\n                  // Observer\n                  obs2.observe(document, {\n                    childList : true,\n                    subtree : true\n                  });\n                }\n                // Mutation Events (Alternative Solution)\n                // doc: http://tinyurl.com/op95rfy\n                else {\n                  Aak.onEvent(window, \"DOMNodeRemoved\", function (e) {\n                    if (Aak.opts.logRemovedNodes) {\n                      Aak.log(e.target);\n                    }\n                    rule.onRemove(e.target);\n                  }, false);\n                }\n              }\n              \n              // Aak Events\n              Aak.onEvent(window, 'detected', function (e) {\n                Aak.info(['AntiAdbKiller', Aak.isTopframe ? 'topframe' : 'subframe', location.host, e.detail]);\n              });\n              \n            }\n          });\n        };\n\n        // Apply rules\n        for (var name in Aak.rules) {\n          if (Aak.rules.hasOwnProperty(name)) {\n            handlerEvents(Aak, name);\n          }\n        }\n      }\n    }\n  };\n\n  Aak.initialize();\n\n})(window);"}/!extdb.@st#4c5bbd59-5dbf-492b-b6d2-faf652a13893?{"origin":"normal","value":{"data":{},"ts":1.773566280012e+12}}0!extdb.@uid#4c5bbd59-5dbf-492b-b6d2-faf652a138938{"origin":"normal","value":"Anti-Adblock Killer | Reek"}ë:�ˆ� V          /!extdb.@st#4c5bbd59-5dbf-492b-b6d2-faf652a13893_{"origin":"normal","value":{"data":{"nextchecklist":"s1773652687883"},"ts":1.773566287883e+12}}­2ʊÁ W          /!extdb.@st#4c5bbd59-5dbf-492b-b6d2-faf652a13893‚{"origin":"normal","value":{"data":{"nextchecklist":"s1773652687883","nextcheckupdate":"s1774171088145"},"ts":1.773566288145e+12}}û*+X          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893õ{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566277635e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}1!extdb.@meta#6cacb4e8-442d-4344-b28d-3aa05d312687¡8{"origin":"normal","value":{"antifeatures":{},"author":"ElectroKnight22","blockers":[],"connects":[],"copyright":null,"deleted":1.773566302989e+12,"description":"Have you ever wanted Premium but think that the real thing is too good? Worry not, this script replaces the loser normal logo with the premium one, tricking you and your friends into thinking you are richer than you really are. Currently still testing so functionality may be rough or incomplete in some places. Please be understanding. (The adblocking feature is no longer functional, and no fixes are currently planned.)","description_i18n":{"ja":"Premium が欲しいけど、本物は立派すぎて手が出せないと思ったことはありませんか？ご心配なく。このスクリプトは、あの負け犬っぽい普通のロゴを Premium のロゴに置き換え、あなたや友達に「実は金持ちなんじゃないか」と勘違いさせることができます。現在まだテスト中のため、一部の機能が不安定であったり、不完全な場合があります。ご了承ください。(広告ブロック機能はすでに利用できなくなっており、現在のところ修正対応の予定はありません。)","zh_CN":"是否曾渴望拥有 Premium，却又觉得正版太过美好？别担心，这个脚本会将那有些寒酸的普通标志替换为 Premium 图标，让你和你的朋友们误以为你比实际上更有钱。目前仍在测试阶段，因此部分功能可能会不稳定或不完整，请多见谅。（广告拦截功能已失效，目前暂无后续的修复安排。）","zh_TW":"是否曾渴望擁有 Premium，卻又覺得正版太過美好？別擔心，這個腳本會將那魯蛇般的普通標誌替換為 Premium 圖示，讓你和你的朋友們誤以為你比實際上更有錢。目前仍在測試階段，因此部分功能可能會不穩定或不完整，請多見諒。（廣告攔截功能已失效，且目前暫無後續的修復安排。）"},"downloadURL":"https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.user.js","enabled":true,"evilness":0,"excludes":["*://www.youtube.com/live_chat*"],"fileURL":"https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.user.js","grant":["none"],"header":"// ==UserScript==\n// @name                    YouTube Premium Lite² [Beta]\n// @name:zh-TW              YouTube Premium Lite² [Beta 測試版]\n// @name:zh-CN              YouTube Premium Lite² [Beta 测试版]\n// @name:ja                 YouTube Premium Lite² [ベータ版]\n// @icon                    https://www.google.com/s2/favicons?sz=64&domain=youtube.com\n// @author                  ElectroKnight22\n// @namespace               electroknight22_youtube_premium_lite_squared_namespace\n// @version                 0.5.3\n// @match                   *://m.youtube.com/*\n// @match                   *://www.youtube.com/*\n// @exclude                 *://www.youtube.com/live_chat*\n// @require                 https://update.greasyfork.org/scripts/549881/1717291/YouTube%20Helper%20API.js\n// @grant                   none\n// @run-at                  document-idle\n// @inject-into             page\n// @license                 MIT\n// @description             Have you ever wanted Premium but think that the real thing is too good? Worry not, this script replaces the loser normal logo with the premium one, tricking you and your friends into thinking you are richer than you really are. Currently still testing so functionality may be rough or incomplete in some places. Please be understanding. (The adblocking feature is no longer functional, and no fixes are currently planned.)\n// @description:zh-TW       是否曾渴望擁有 Premium，卻又覺得正版太過美好？別擔心，這個腳本會將那魯蛇般的普通標誌替換為 Premium 圖示，讓你和你的朋友們誤以為你比實際上更有錢。目前仍在測試階段，因此部分功能可能會不穩定或不完整，請多見諒。（廣告攔截功能已失效，且目前暫無後續的修復安排。）\n// @description:zh-CN       是否曾渴望拥有 Premium，却又觉得正版太过美好？别担心，这个脚本会将那有些寒酸的普通标志替换为 Premium 图标，让你和你的朋友们误以为你比实际上更有钱。目前仍在测试阶段，因此部分功能可能会不稳定或不完整，请多见谅。（广告拦截功能已失效，目前暂无后续的修复安排。）\n// @description:ja          Premium が欲しいけど、本物は立派すぎて手が出せないと思ったことはありませんか？ご心配なく。このスクリプトは、あの負け犬っぽい普通のロゴを Premium のロゴに置き換え、あなたや友達に「実は金持ちなんじゃないか」と勘違いさせることができます。現在まだテスト中のため、一部の機能が不安定であったり、不完全な場合があります。ご了承ください。(広告ブロック機能はすでに利用できなくなっており、現在のところ修正対応の予定はありません。)\n// @downloadURL https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.user.js\n// @updateURL https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=youtube.com","icon64":null,"includes":[],"lastModified":1.773566015523e+12,"matches":["*://m.youtube.com/*","*://www.youtube.com/*"],"name":"YouTube Premium Lite² [Beta]","name_i18n":{"ja":"YouTube Premium Lite² [ベータ版]","zh_CN":"YouTube Premium Lite² [Beta 测试版]","zh_TW":"YouTube Premium Lite² [Beta 測試版]"},"namespace":"electroknight22_youtube_premium_lite_squared_namespace","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://www.youtube.com/live_chat*"],"orig_includes":[],"orig_matches":["*://m.youtube.com/*","*://www.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":9.007199254740991e+15,"requires":[{"abs_url":"https://update.greasyfork.org/scripts/541424/","unsafe_url":"https://update.greasyfork.org/scripts/549881/1717291/YouTube%20Helper%20API.js"}],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/1a2d1d00-0ca1-4a65-a397-f652ef1c6784"}},"updateURL":"https://update.greasyfork.org/scripts/541424/YouTube%20Premium%20Lite%C2%B2%20%5BBeta%5D.meta.js","uuid":"6cacb4e8-442d-4344-b28d-3aa05d312687","version":"0.5.3","webRequest":null}}¨|d-áZ          /!extdb.@st#4c5bbd59-5dbf-492b-b6d2-faf652a13893¢{"origin":"normal","value":{"data":{"autoPlay":"btrue","checkList":"btrue","checkUpdate":"btrue","debug":"bfalse","forceVLC":"btrue","logDetected":"bfalse","logExcluded":"bfalse","logInsertedNodes":"bfalse","logInterceptedScripts":"bfalse","logPlayer":"bfalse","logRemovedNodes":"bfalse","logXhr":"bfalse","nextchecklist":"s1773652687883","nextcheckupdate":"s1774171088145","videoHD":"btrue"},"ts":1.773566336797e+12}}Ž,pD$[          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893�{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566277635e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}/!extdb.@re#4c5bbd59-5dbf-492b-b6d2-faf652a13893¡{"origin":"normal","value":{"exc":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"inc":["http://*/*","https://*/*"],"match":[]}}ßæßÿ]          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893¡{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566277635e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}/!extdb.@re#4c5bbd59-5dbf-492b-b6d2-faf652a13893ê{"origin":"normal","value":{"exc":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?accounts\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/","/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"inc":["http://*/*","https://*/*"],"match":[]}}Ųñð_          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893…{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566277635e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}/!extdb.@re#4c5bbd59-5dbf-492b-b6d2-faf652a13893œ{"origin":"normal","value":{"exc":["/^[^:/#?]*:\\/\\/([^#?/]*\\.)?www\\.youtube\\.com(:[0-9]{1,5})?\\/.*$/"],"inc":["http://*/*","https://*/*"],"match":[]}}$ºþ$Pa          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893õ{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566277635e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_b<ûÅìlockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}/!extdb.@re#4c5bbd59-5dbf-492b-b6d2-faf652a13893T{"origin":"normal","value":{"exc":[],"inc":["http://*/*","https://*/*"],"match":[]}}Udl³c          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893ò{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.77356641873e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}»ѧ·´d          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893ó{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566419883e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}é\âŸJe          1!extdb.@meta#85ed5048-b1a5-4df0-ae71-bb1d35c341c9‰ {"origin":"normal","value":{"antifeatures":{},"author":null,"blockers":[],"connects":[],"copyright":null,"description":"A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.","description_i18n":{"zh_CN":"脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。","zh_HK":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_MO":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_TW":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。"},"downloadURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","enabled":true,"evilness":0,"excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"fileURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         youtube-adb\n// @name:zh-CN   YouTube去广告\n// @name:zh-TW   YouTube去廣告\n// @name:zh-HK   YouTube去廣告\n// @name:zh-MO   YouTube去廣告\n// @namespace    https://github.com/iamfugui/youtube-adb\n// @version      6.21\n// @description         A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.\n// @description:zh-CN   脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。\n// @description:zh-TW   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-HK   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-MO   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @match        *://*.youtube.com/*\n// @exclude      *://accounts.youtube.com/*\n// @exclude      *://www.youtube.com/live_chat_replay*\n// @exclude      *://www.youtube.com/persist_identity*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=YouTube.com\n// @grant        none\n// @license MIT\n// @downloadURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js\n// @updateURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=YouTube.com","icon64":null,"includes":[],"lastModified":1.773565287144e+12,"matches":["*://*.youtube.com/*"],"name":"youtube-adb","name_i18n":{"zh_CN":"YouTube去广告","zh_HK":"YouTube去廣告","zh_MO":"YouTube去廣告","zh_TW":"YouTube去廣告"},"namespace":"https://github.com/iamfugui/youtube-adb","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":2,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/ff3454bd-d399-49ec-b38f-88c3a2bf9248"}},"updateURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js","uuid":"85ed5048-b1a5-4df0-ae71-bb1d35c341c9","version":"6.21","webRequest":null}}XÔàÿ• f          !extdb.#updatex{"origin":"normal","value":{"black":{"last":1.773563926282e+12,"version":"1768576685662"},"scripts":1.773566923511e+12}}iÏ	"g          1!extdb.@meta#4c5bbd59-5dbf-492b-b6d2-faf652a13893£{"origin":"normal","value":{"antifeatures":{},"author":"Reek | reeksite.com","blockers":[],"connects":["*"],"copyright":null,"deleted":1.77356693256e+12,"description":"Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.","description_i18n":{},"downloadURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","enabled":true,"evilness":0,"excludes":[],"fileURL":"https://openuserjs.org/install/reek/Anti-Adblock_Killer_Reek.user.js","grant":["unsafeWindow","GM_addStyle","GM_getValue","GM_setValue","GM_xmlhttpRequest","GM_registerMenuCommand","GM_deleteValue","GM_listValues","GM_getResourceText","GM_getResourceURL","GM_log","GM_openInTab","GM_setClipboard","GM_info","GM_getMetadata"],"header":"// ==UserScript==\n// @name Anti-Adblock Killer | Reek\n// @namespace https://userscripts.org/scripts/show/155840\n// @description Helps you keep your Ad-Blocker active, when you visit a website and it asks you to disable.\n// @author Reek | reeksite.com\n// @version 10.0\n// @encoding utf-8\n// @license https://creativecommons.org/licenses/by-sa/4.0/\n// @icon https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png\n// @homepage https://github.com/reek/anti-adblock-killer/\n// @twitterURL https://twitter.com/antiadbkiller\n// @contactURL https://reek.github.io/anti-adblock-killer/#contact\n// @supportURL https://github.com/reek/anti-adblock-killer/issues\n// @contributionURL https://github.com/reek/anti-adblock-killer#donate\n// @updateURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @downloadURL https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js\n// @include http://*/*\n// @include https://*/*\n// @grant unsafeWindow\n// @grant GM_addStyle\n// @grant GM_getValue\n// @grant GM_setValue\n// @grant GM_xmlhttpRequest\n// @grant GM_registerMenuCommand\n// @grant GM_deleteValue\n// @grant GM_listValues\n// @grant GM_getResourceText\n// @grant GM_getResourceURL\n// @grant GM_log\n// @grant GM_openInTab\n// @grant GM_setClipboard\n// @grant GM_info\n// @grant GM_getMetadata\n// @run-at document-start\n// @connect *\n// ==/UserScript==","homepage":"https://github.com/reek/anti-adblock-killer/","icon":"https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-icon.png","icon64":null,"includes":["http://*/*","https://*/*"],"lastModified":1.773566419883e+12,"matches":[],"name":"Anti-Adblock Killer | Reek","name_i18n":{},"namespace":"https://userscripts.org/scripts/show/155840","options":{"check_for_updates":true,"comment":"","compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":9.007199254740991e+15,"requires":[],"resources":[],"supportURL":"https://github.com/reek/anti-adblock-killer/issues","sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/86ff21a8-b392-4512-b047-8176cca01ef1"}},"updateURL":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"4c5bbd59-5dbf-492b-b6d2-faf652a13893","version":"10.0","webRequest":null}}1!extdb.@meta#85ed5048-b1a5-4df0-ae71-bb1d35c341c9‰ {"origin":"normal","value":{"antifeatures":{},"author":null,"blockers":[],"connects":[],"copyright":null,"description":"A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.","description_i18n":{"zh_CN":"脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。","zh_HK":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_MO":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_TW":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。"},"downloadURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","enabled":true,"evilness":0,"excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"fileURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         youtube-adb\n// @name:zh-CN   YouTube去广告\n// @name:zh-TW   YouTube去廣告\n// @name:zh-HK   YouTube去廣告\n// @name:zh-MO   YouTube去廣告\n// @namespace    https://github.com/iamfugui/youtube-adb\n// @version      6.21\n// @description         A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.\n// @description:zh-CN   脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。\n// @description:zh-TW   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-HK   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-MO   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @match        *://*.youtube.com/*\n// @exclude      *://accounts.youtube.com/*\n// @exclude      *://www.youtube.com/live_chat_replay*\n// @exclude      *://www.youtube.com/persist_identity*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=YouTube.com\n// @grant        none\n// @license MIT\n// @downloadURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js\n// @updateURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=YouTube.com","icon64":null,"includes":[],"lastModified":1.773565287144e+12,"matches":["*://*.youtube.com/*"],"name":"youtube-adb","name_i18n":{"zh_CN":"YouTube去广告","zh_HK":"YouTube去廣告","zh_MO":"YouTube去廣告","zh_TW":"YouTube去廣告"},"namespace":"https://github.com/iamfugui/youtube-adb","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":1,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/ff3454bd-d399-49ec-b38f-88c3a2bf9248"}},"updateURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js","uuid":"85ed5048-b1a5-4df0-ae71-bb1d35c341c9","version":"6.21","webRequest":null}}ø¤“zi          1!extdb.@meta#85ed5048-b1a5-4df0-ae71-bb1d35c341c9¹ {"origin":"normal","value":{"antifeatures":{},"author":null,"blockers":[],"connects":[],"copyright":null,"deleted":1.77356694119e+12,"description":"A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.","description_i18n":{"zh_CN":"脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。","zh_HK":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_MO":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。","zh_TW":"腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。"},"downloadURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","enabled":true,"evilness":0,"excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"fileURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js","grant":["none"],"header":"// ==UserScript==\n// @name         youtube-adb\n// @name:zh-CN   YouTube去广告\n// @name:zh-TW   YouTube去廣告\n// @name:zh-HK   YouTube去廣告\n// @name:zh-MO   YouTube去廣告\n// @namespace    https://github.com/iamfugui/youtube-adb\n// @version      6.21\n// @description         A script to remove YouTube ads, including static ads and video ads, without interfering with the network and ensuring safety.\n// @description:zh-CN   脚本用于移除YouTube广告，包括静态广告和视频广告。不会干扰网络，安全。\n// @description:zh-TW   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-HK   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @description:zh-MO   腳本用於移除 YouTube 廣告，包括靜態廣告和視頻廣告。不會干擾網路，安全。\n// @match        *://*.youtube.com/*\n// @exclude      *://accounts.youtube.com/*\n// @exclude      *://www.youtube.com/live_chat_replay*\n// @exclude      *://www.youtube.com/persist_identity*\n// @icon         https://www.google.com/s2/favicons?sz=64&domain=YouTube.com\n// @grant        none\n// @license MIT\n// @downloadURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.user.js\n// @updateURL https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js\n// ==/UserScript==","homepage":null,"icon":"https://www.google.com/s2/favicons?sz=64&domain=YouTube.com","icon64":null,"includes":[],"lastModified":1.773565287144e+12,"matches":["*://*.youtube.com/*"],"name":"youtube-adb","name_i18n":{"zh_CN":"YouTube去广告","zh_HK":"YouTube去廣告","zh_MO":"YouTube去廣告","zh_TW":"YouTube去廣告"},"namespace":"https://github.com/iamfugui/youtube-adb","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://accounts.youtube.com/*","*://www.youtube.com/live_chat_replay*","*://www.youtube.com/persist_identity*"],"orig_includes":[],"orig_matches":["*://*.youtube.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","orig_run_in":[],"orig_tags":[],"use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"run_in":null,"sandbox":null,"tags":[],"unwrap":null,"user_modified":null},"position":9.007199254740991e+15,"requires":[],"resources":[],"supportURL":null,"sync":{"imported":9},"tfd":{"objUrl":{"url":"blob:chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/ff3454bd-d399-49ec-b38f-88c3a2bf9248"}},"updateURL":"https://update.greasyfork.org/scripts/459541/YouTube%E5%8E%BB%E5%B9%BF%E5%91%8A.meta.js","uuid":"85ed5048-b1a5-4df0-ae71-bb1d35c341c9","version":"6.21","webRequest":null}}