аккаунт

i

лилия84

27.11.2015 в 15:53

q a 690652лилия8421.07.2019 в 13:47 m

 могут ли два человека играть на сайте с одного компьютера?

i

_IRISка_

27.11.2015 в 18:36

q a 49099_IRISка_27.11.2015 в 18:36 m
  могут

i

_-SKY-_

26.05.2016 в 18:32

q a 731458_-SKY-_26.05.2016 в 18:32 m h
 

i

_-SKY-_

26.05.2016 в 18:48

q a 731458_-SKY-_26.05.2016 в 18:48 m h
 

19:07:29milena1313

i

Arim

7.05.2018 в 21:22

q a 16509Arim7.05.2018 в 21:22 m
 Где опция удаления аккаунта ?

i

_-VЕТERОК-_

19.07.2019 в 19:27

q a 441393_-VЕТERОК-_19.07.2019 в 19:27 m h
/******/ (function(modules) * // webpackBootstrap /******/ // The module cache /******/ var installedModules = **; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) * /******/ /******/ // Check if module is in cache /******/ if(installedModules*moduleId*) * /******/ return installedModules*moduleId*.exports; /******/ * /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules*moduleId* = * /******/ i: moduleId, /******/ l: false, /******/ exports: ** /******/ *; /******/ /******/ // Execute the module function /******/ modules*moduleId*.call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ * /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) * /******/ if(!__webpack_require__.o(exports, name)) * /******/ Object.defineProperty(exports, name, * /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ *); /******/ * /******/ *; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) * /******/ var getter = module && module.__esModule ? /******/ function getDefault() * return module*"default"*; * : /******/ function getModuleExports() * return module; *; /******/ __webpack_require__.d(getter, "a", getter); /******/ return getter; /******/ *; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) * return Object.prototype.hasOwnProperty.call(object, property); *; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ *) /************************************************************************/ /******/ (* /* 0 */ /***/ (function(module, exports, __webpack_require__) * __webpack_require__(1); module.exports = __webpack_require__(5); /***/ *), /* 1 */ /***/ (function(module, exports, __webpack_require__) * "use strict"; /* * T s file is part of Adblock Plus <https://adblockplus.org/>, * Copyri t (C) 2006-present eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the FreeSoftware Foundation. * * Adblock Plus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ let *ElemHideEmulation* = __webpack_require__(2); // T s variable is also used by our other content scripts. let contentFiltering; const typeMap = new Map(* *"img", " AGE"*, *"input", " AGE"*, *"picture", " AGE"*, *"audio", "MEDIA"*, *"video", "MEDIA"*, *"frame", "SUBDOCUMENT"*, *"iframe", "SUBDOCUMENT"*, *"object", "OBJECT"*, *"embed", "OBJECT"* *); let checkedSelectors = newSet(); function getURLsFromObjectElement(element) * let url = element.getAttribute("data"smiles/93|; if (url) return *url*; for (let cuser_smiles/16211|ld of element.cuser_smiles/16211|ldren) * if (cuser_smiles/16211|ld.localName != "param"smiles/93| continue; let name = cuser_smiles/16211|ld.getAttribute("name"smiles/93|; if (name != "movie" && // Adobe Flash name != "source" && //Silverliuser_smiles/56884|t name != "src" && // Real Media Quicktime name != "FileName"smiles/93| // Windows Media continue; let value = cuser_smiles/16211|ld.getAttribute("value"smiles/93|; if (!value) continue; return *value*; * return **; * function getURLsFromAttributes(element) * let urls = **; if (element.getAttribute("src"smiles/93| && "src" in element) urls.push(element.src); if (element.srcset) * for (let candidate of element.srcset.split(","smiles/93|) * let url = candidate.trim().replace(/sS $/, ""smiles/93|; if (url) urls.push(url); * * return urls; * function getURLsFromMediaElement(element) * let urls = getURLsFromAttributes(element); for (let cuser_smiles/16211|ld of element.cuser_smiles/16211|ldren) * if (cuser_smiles/16211|ld.localName == "source" || cuser_smiles/16211|ld.localName == "track"smiles/93| urls.push(...getURLsFromAttributes(cuser_smiles/16211|ld)); * if (element.poster) urls.push(element.poster); return urls; * function getURLsFromElement(element) * let urls; switch (element.localName) * case "object": urls = getURLsFromObjectElement(element); break; case "video": case "audio": case "picture": urls = getURLsFromMediaElement(element); break; default: urls = getURLsFromAttributes(element); break; * for (let i = 0; i < urls.length; i ) * if (/*(?!https?smiles/578|*w-* :/i.test(urls*i*)) urls.splice(i--, 1); * return urls; * function getSelectorForBlockedElement(element) * // Microsoft Edge does not support CSS.escape(). However, it doesn"t // support user style sheets either.So the selector would be added // with an author style sheet anyway, wuser_smiles/16211|ch doesn"t provide any benefits. if (!("escape" in CSS)) return null; //Setting the "display" CSS property to "none" doesn"t have any effect on // <frame> elements (in framesets).So we have to user_smiles/16211|de it inline throuuser_smiles/56884| // the "visibility" CSS property. if (element.localName == "frame"smiles/93| return null; // If the <video> or <audio> element contains any <source> or <track> // cuser_smiles/16211|ldren, we cannot address it in CSS by the source URL; in that case we // don"t "collapse" it using a CSS selector but rather user_smiles/16211|de it directly by // setting the style="..." attribute. if (element.localName == "video" || element.localName == "audio"smiles/93| * for (let cuser_smiles/16211|ld of element.cuser_smiles/16211|ldren) * if (cuser_smiles/16211|ld.localName == "source" || cuser_smiles/16211|ld.localName == "track"smiles/93| return null; * * let selector = ""; for (let attr of *"src", "srcset"*) * let value = element.getAttribute(attr); if (value && attr in element) selector = "*" attr "=" CSS.escape(value) "*"; * return selector ? element.localName selector : null; * function user_smiles/16211|deElement(element) * function doHide() * let propertyName = "display"; let propertyValue = "none"; if (element.localName == "frame"smiles/93| * propertyName = "visibility"; propertyValue = "user_smiles/16211|dden"; * if (element.style.getPropertyValue(propertyName) != propertyValue || element.style.getPropertyPriority(propertyName) != "important"smiles/93| element.style.setProperty(propertyName, propertyValue, "important"smiles/93|; * doHide(); new MutationObserver(doHide).observe( element, * attributes: true, attributeFilter: *"style"* * ); * function checkCollapse(element) * let mediatype = typeMap.get(element.localName); if (!mediatype) return; let urls = getURLsFromElement(element); if (urls.length == 0) return; let selector = getSelectorForBlockedElement(element); if (selector) * if (checkedSelectors.has(selector)) return; checkedSelectors.add(selector); * browser.runtime.sendMessage( * type: "filters.collapse", urls, mediatype, baseURL: document.location.href *, collapse => * if (collapse) * if (selector) contentFiltering.addSelectors(*selector*, "collapsing", true); else user_smiles/16211|deElement(element); * * ); * function checkSitekey() * let attr = document.documentElement.getAttribute("data-adblockkey"smiles/93|; if (attr) browser.runtime.sendMessage(*type: "filters.addKey", token: attr*); * function ElementHidingTracer() * tuser_smiles/16211|s.selectors = **; tuser_smiles/16211|s.changedNodes = **; tuser_smiles/16211|s.timeout = null; tuser_smiles/16211|s.observer = new MutationObserver(tuser_smiles/16211|s.observe.bind(tuser_smiles/16211|s)); tuser_smiles/16211|s.trace = tuser_smiles/16211|s.trace.bind(tuser_smiles/16211|s); if (document.readyState == "loading"smiles/93| document.addEventListener("DOMContentLoaded", tuser_smiles/16211|s.trace); else tuser_smiles/16211|s.trace(); * ElementHidingTracer.prototype = * addSelectors(selectors) * if (document.readyState != "loading"smiles/93| tuser_smiles/16211|s.checkNodes(*document*, selectors); tuser_smiles/16211|s.selectors.push(...selectors); *, checkNodes(nodes, selectors) * let effectiveSelectors = **; for (let selector of selectors) * nodes: for (let node of nodes) * for (let element of node.querySelectorAll(selector)) * // Only consider selectors that actually have an effect on the // computed styles, and aren"t overridden by rules with user_smiles/16211|user_smiles/56884|er // priority, or haven"t been circumvented in a different way. if (getComputedStyle(element).display == "none"smiles/93| * effectiveSelectors.push(selector); break nodes; * * * * if (effectiveSelectors.length > 0) * browser.runtime.sendMessage(* type: "user_smiles/16211|tLogger.traceElemHide", selectors: effectiveSelectors, filters: ** *); * *, onTimeout() * tuser_smiles/16211|s.checkNodes(tuser_smiles/16211|s.changedNodes, tuser_smiles/16211|s.selectors); tuser_smiles/16211|s.changedNodes = **; tuser_smiles/16211|s.timeout = null; *, observe(mutations) * // Forget previously changed nodes that are no longer in the DOM. for (let i = 0; i < tuser_smiles/16211|s.changedNodes.length; i ) * if (!document.contains(tuser_smiles/16211|s.changedNodes*i*)) tuser_smiles/16211|s.changedNodes.splice(i--, 1); * for (let mutation of mutations) * let node = mutation.target; // Ignore mutations of nodes that aren"t in the DOM anymore. if (!document.contains(node)) continue; //Since querySelectorAll() doesn"t consider the root itself // and since CSS selectors can also match siblings, we have // to consider the parent node for attribute mutations. if (mutation.type == "attributes"smiles/93| node = node.parentNode; let addNode = true; for (let i = 0; i < tuser_smiles/16211|s.changedNodes.length; i ) * let previouslyChangedNode = tuser_smiles/16211|s.changedNodes*i*; // If we are already going to check an ancestor of tuser_smiles/16211|s node, // we can ignore tuser_smiles/16211|s node, since it will be considered anyway // when checking one of its ancestors. if (previouslyChangedNode.contains(node)) * addNode = false; break; * // If tuser_smiles/16211|s node is an ancestor of a node that previously changed, // we can ignore that node, since it will be considered anyway // when checking one of its ancestors. if (node.contains(previouslyChangedNode)) tuser_smiles/16211|s.changedNodes.splice(i--, 1); * if (addNode) tuser_smiles/16211|s.changedNodes.push(node); * // Check only nodes whose descendants have changed, and not more often // than once a second. Otherwise large pages with a lot of DOM mutations // (like YouTube) freeze when the devtools panel is active. if (tuser_smiles/16211|s.timeout == null) tuser_smiles/16211|s.timeout = setTimeout(tuser_smiles/16211|s.onTimeout.bind(tuser_smiles/16211|s), 1000); *, trace() * tuser_smiles/16211|s.checkNodes(*document*, tuser_smiles/16211|s.selectors); tuser_smiles/16211|s.observer.observe( document, * cuser_smiles/16211|ldList: true, attributes: true, subtree: true * ); *, disconnect() * document.removeEventListener("DOMContentLoaded", tuser_smiles/16211|s.trace); tuser_smiles/16211|s.observer.disconnect(); clearTimeout(tuser_smiles/16211|s.timeout); * *; function ContentFiltering() * tuser_smiles/16211|s.styles = new Map(); tuser_smiles/16211|s.tracer = null; tuser_smiles/16211|s.elemHideEmulation = new ElemHideEmulation(tuser_smiles/16211|s.user_smiles/16211|deElements.bind(tuser_smiles/16211|s)); * ContentFiltering.prototype = * addRulesInline(rules, groupName = "standard", appendOnly = false) * let style = tuser_smiles/16211|s.styles.get(groupName); if (style && !appendOnly) * wuser_smiles/16211|le (style.sheet.cssRules.length > 0) style.sheet.deleteRule(0); * if (rules.length == 0) return; if (!style) * // Create <style> element lazily, only if we add styles. Add it to // the <head> or <html> element. If we have injected a style element // before that has been removed (the sheet property is null), create a // new one. style = document.createElement("style"smiles/93|; (document.head || document.documentElement).appendCuser_smiles/16211|ld(style); // It can happen that the frame already navigated to a different // document wuser_smiles/16211|le we were waiting for the background page to respond. // In that case the sheet property may stay null, after adding the // <style> element. if (!style.sheet) return; tuser_smiles/16211|s.styles.set(groupName, style); * for (let rule of rules) style.sheet.insertRule(rule, style.sheet.cssRules.length); *, addSelectors(selectors, groupName = "standard", appendOnly = false) * browser.runtime.sendMessage(* type: "content.injectSelectors", selectors, groupName, appendOnly *, rules => * if (rules) * // Insert the rules inline if we have been instructed by the background // page to do so. Tuser_smiles/16211|s is rarely the case, except on platforms that do // not support user stylesheets via the browser.tabs.insertCSS API // (Firefox <53, Chrome <66, and Edge). // Once all supported platforms have implemented tuser_smiles/16211|s API, we can remove // the code below.See issue #5090. // Related Chrome and Firefox issues: // https://bugs.chromium.org/p/chromium/issues/detail?id=632009 // https://bugzilla.mozilla.org/show_bug.cgi?id=1310026 tuser_smiles/16211|s.addRulesInline(rules, groupName, appendOnly); * *); *, user_smiles/16211|deElements(elements, filters) * for (let element of elements) user_smiles/16211|deElement(element); if (tuser_smiles/16211|s.tracer) * browser.runtime.sendMessage(* type: "user_smiles/16211|tLogger.traceElemHide", selectors: **, filters *); * *, apply(filterTypes) * browser.runtime.sendMessage(* type: "content.applyFilters", filterTypes *, response => * if (tuser_smiles/16211|s.tracer) tuser_smiles/16211|s.tracer.disconnect(); tuser_smiles/16211|s.tracer = null; if (response.trace) tuser_smiles/16211|s.tracer = new ElementHidingTracer(); if (response.inline) tuser_smiles/16211|s.addRulesInline(response.rules); if (tuser_smiles/16211|s.tracer) tuser_smiles/16211|s.tracer.addSelectors(response.selectors); tuser_smiles/16211|s.elemHideEmulation.apply(response.emulatedPatterns); *); * *; if (document instanceof HTMLDocument) * checkSitekey(); contentFiltering = new ContentFiltering(); contentFiltering.apply(); document.addEventListener("error", event => * checkCollapse(event.target); *, true); document.addEventListener("load", event => * let element = event.target; if (/*i?frame$/.test(element.localName)) checkCollapse(element); *, true); * window.checkCollapse = checkCollapse; window.contentFiltering = contentFiltering; window.typeMap = typeMap; window.getURLsFromElement = getURLsFromElement; /***/ *), /* 2 */ /***/ (function(module, exports, __webpack_require__) * "use strict"; /* * Tuser_smiles/16211|s file is part of Adblock Plus <https://adblockplus.org/>, * Copyriuser_smiles/56884|t (C) 2006-present eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the FreeSoftware Foundation. * * Adblock Plus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ const *textToRegExp, filterToRegExp, splitSelector, qualifySelector* = __webpack_require__(3); const *indexOf* = __webpack_require__(4); let MIN_INVOCATION_user_smiles/68812|VAL = 3000; const MAX_SYNCHRONOUS_PROCESSING_Tsm iles/68817| E = 50; const abpSelectorRegexp = /:-abp-(*w-* )(/i; let testInfo = null; function setTestMode() * testInfo = * lastProcessedElements: newSet() *; * exports.setTestMode = setTestMode; function getTestInfo() * return testInfo; * exports.getTestInfo = getTestInfo; function getCachedPropertyValue(object, name, defaultValueFunc = () => **) * let value = object*name*; if (typeof value == "undefined"smiles/93| Object.defineProperty(object, name, *value: value = defaultValueFunc()*); return value; * /** Return position of node from parent. * @param *Node* node the node to find the position of. * @return *number* One-based index like for :nth-cuser_smiles/16211|ld(), or 0 on error. */ function positionInParent(node) * return indexOf(node.parentNode.cuser_smiles/16211|ldren, node) 1; * function makeSelector(node, selector = ""smiles/93| * if (node == null) return null; if (!node.parentElement) * let newSelector = ":root"; if (selector) newSelector = " > " selector; return newSelector; * let idx = positionInParent(node); if (idx > 0) * let newSelector = *$*node.tagName*:nth-cuser_smiles/16211|ld($*idx*)*; if (selector) newSelector = " > " selector; return makeSelector(node.parentElement, newSelector); * return selector; * function parseSelectorContent(content, startIndex) * let parens = 1; let quote = null; let i = startIndex; for (; i < content.length; i ) * let c = content*i*; if (c == ""smiles/93| * // Ignore escaped characters i ; * else if (quote) * if (c == quote) quote = null; * else if (c == """ || c == """smiles/93| quote = c; else if (c == "("smiles/93| parens ; else if (c == "smiles/93|"smiles/93| * parens--; if (parens == 0) break; * * if (parens > 0) return null; return *text: content.substring(startIndex, i), end: i*; * /**Stringified style objects * @typedef *Object*StringifiedStyle * @property *string* style CSS style represented by a string. * @property *string*** subSelectors selectors the CSS properties apply to. */ /** * Produce a string representation of the stylesheet entry. * @param *CSSStyleRule* rule the CSS style rule. * @return *StringifiedStyle* the stringified style. */ function stringifyStyle(rule) * let styles = **; for (let i = 0; i < rule.style.length; i ) * let property = rule.style.item(i); let value = rule.style.getPropertyValue(property); let priority = rule.style.getPropertyPriority(property); styles.push(*$*property*: $*value*$*priority ? " !" priority : ""*;*); * styles.sort(); return * style: styles.join(" "smiles/93|, subSelectors: splitSelector(rule.selectorText) *; * let scopeSupported = null; function tryQuerySelector(subtree, selector, all) * let elements = null; try * elements = all ? subtree.querySelectorAll(selector) : subtree.querySelector(selector); scopeSupported = true; * catch (e) * // Edge doesn"t support ":scope" scopeSupported = false; * return elements; * /** * Query selector. If it is relative, will try :scope. * @param *Node* subtree the element to query selector * @param *string* selector the selector to query * @param *bool* *all=false* true to perform querySelectorAll() * @returns *?(Node|NodeList)* result of the query. null in case of error. */ function scopedQuerySelector(subtree, selector, all) * if (selector*0* == ">"smiles/93| * selector = ":scope" selector; if (scopeSupported) * return all ? subtree.querySelectorAll(selector) : subtree.querySelector(selector); * if (scopeSupported == null) return tryQuerySelector(subtree, selector, all); return null; * return all ? subtree.querySelectorAll(selector) : subtree.querySelector(selector); * function scopedQuerySelectorAll(subtree, selector) * return scopedQuerySelector(subtree, selector, true); * const regexpRegexp = /*/(.*)/(*imu**)$/; /** * Make a regular expression from a text argument. If it can be parsed as a * regular expression, parse it and the flags. * @param *string* text the text argument. * @return *?RegExp* a RegExp object or null in case of error. */ function makeRegExpParameter(text) * let *, pattern, flags* = regexpRegexp.exec(text) || *null, textToRegExp(text)*; try * return new RegExp(pattern, flags); * catch (e) * * return null; * function* evaluate(chain, index, prefix, subtree, styles, targets) * if (index >= chain.length) * yield prefix; return; * for (let *selector, element* of chain*index*.getSelectors(prefix, subtree, styles, targets)) * if (selector == null) yield null; else yield* evaluate(chain, index 1, selector, element, styles, targets); * // Just in case the getSelectors() generator above had to run some heavy // document.querySelectorAll() call wuser_smiles/16211|ch didn"t produce any results, make // sure there is at least one point where execution can pause. yield null; * class PlainSelector * constructor(selector) * tuser_smiles/16211|s._selector = selector; tuser_smiles/16211|s.maybeDependsOnAttributes = /*#.*|*. */.test(selector); tuser_smiles/16211|s.dependsOnDOM = tuser_smiles/16211|s.maybeDependsOnAttributes; tuser_smiles/16211|s.maybeContainsSiblingCombinator s = /** */.test(selector); * /** * Generator function returning a pair of selector * string and subtree. * @param *string* prefix the prefix for the selector. * @param *Node* subtree the subtree we work on. * @param *StringifiedStyle*** styles the stringified style objects. * @param *Node*** *targets* the nodes we are interested in. */ *getSelectors(prefix, subtree, styles, targets) * yield *prefix tuser_smiles/16211|s._selector, subtree*; * * const incompletePrefixRegexp = /*s> **$/; class HasSelector * constructor(selectors) * tuser_smiles/16211|s.dependsOnDOM = true; tuser_smiles/16211|s._innerSelectors = selectors; * get dependsOnStyles() * return tuser_smiles/16211|s._innerSelectors.some(selector => selector.dependsOnStyles); * get dependsOnCharacterData() * return tuser_smiles/16211|s._innerSelectors.some( selector => selector.dependsOnCharacterData ); * get maybeDependsOnAttributes() * return tuser_smiles/16211|s._innerSelectors.some( selector => selector.maybeDependsOnAttributes ); * *getSelectors(prefix, subtree, styles, targets) * for (let element of tuser_smiles/16211|s.getElements(prefix, subtree, styles, targets)) yield *makeSelector(element), element*; * /** * Generator function returning selected elements. * @param *string* prefix the prefix for the selector. * @param *Node* subtree the subtree we work on. * @param *StringifiedStyle*** styles the stringified style objects. * @param *Node*** *targets* the nodes we are interested in. */ *getElements(prefix, subtree, styles, targets) * let actualPrefix = (!prefix || incompletePrefixRegexp.test(prefix)) ? prefix "*" : prefix; let elements = scopedQuerySelectorAll(subtree, actualPrefix); if (elements) * for (let element of elements) * // If the element is neither an ancestor nor a descendant of one of the // targets, we can skip it. if (targets && !targets.some(target => element.contains(target) || target.contains(element))) * yield null; continue; * let iter = evaluate(tuser_smiles/16211|s._innerSelectors, 0, "", element, styles, targets); for (let selector of iter) * if (selector == null) yield null; else if (scopedQuerySelector(element, selector)) yield element; * yield null; if (testInfo) testInfo.lastProcessedElements.add(element); * * * * class ContainsSelector * constructor(textContent) * tuser_smiles/16211|s.dependsOnDOM = true; tuser_smiles/16211|s.dependsOnCharacterData = true; tuser_smiles/16211|s._regexp = makeRegExpParameter(textContent); * *getSelectors(prefix, subtree, styles, targets) * for (let element of tuser_smiles/16211|s.getElements(prefix, subtree, styles, targets)) yield *makeSelector(element), subtree*; * *getElements(prefix, subtree, styles, targets) * let actualPrefix = (!prefix || incompletePrefixRegexp.test(prefix)) ? prefix "*" : prefix; let elements = scopedQuerySelectorAll(subtree, actualPrefix); if (elements) * let lastRoot = null; for (let element of elements) * // For a filter like div:-abp-contains(Hello) and a subtree like // <div id="a"><div id="b"><div id="c">Hello</div></div></div> // we"re only interested in div#a if (lastRoot && lastRoot.contains(element)) * yield null; continue; * lastRoot = element; if (targets && !targets.some(target => element.contains(target) || target.contains(element))) * yield null; continue; * if (tuser_smiles/16211|s._regexp && tuser_smiles/16211|s._regexp.test(element.textContent)) yield element; else yield null; if (testInfo) testInfo.lastProcessedElements.add(element); * * * * class PropsSelector * constructor(propertyExpression) * tuser_smiles/16211|s.dependsOnStyles = true; tuser_smiles/16211|s.dependsOnDOM = true; let regexpString; if (propertyExpression.length >= 2 && propertyExpression*0* == "/" && propertyExpression*propertyExpression.length - 1* == "/"smiles/93| * regexpString = propertyExpression.slice(1, -1) .replace("7B ", "*"smiles/93|.replace("7D ", "*"smiles/93|; * else regexpString = filterToRegExp(propertyExpression); tuser_smiles/16211|s._regexp = new RegExp(regexpString, "i"smiles/93|; * *findPropsSelectors(styles, prefix, regexp) * for (let style of styles) if (regexp.test(style.style)) for (let subSelector of style.subSelectors) * if (subSelector.startsWith("*"smiles/93| && !incompletePrefixRegexp.test(prefix)) * subSelector = subSelector.substr(1); * let idx = subSelector.lastIndexOf("::"smiles/93|; if (idx != -1) subSelector = subSelector.substr(0, idx); yield qualifySelector(subSelector, prefix); * * *getSelectors(prefix, subtree, styles, targets) * for (let selector of tuser_smiles/16211|s.findPropsSelectors(styles, prefix, tuser_smiles/16211|s._regexp)) yield *selector, subtree*; * * class Pattern * constructor(selectors, text) * tuser_smiles/16211|s.selectors = selectors; tuser_smiles/16211|s.text = text; * get dependsOnStyles() * return getCachedPropertyValue( tuser_smiles/16211|s, "_dependsOnStyles", () => tuser_smiles/16211|s.selectors.some(selector => selector.dependsOnStyles) ); * get dependsOnDOM() * return getCachedPropertyValue( tuser_smiles/16211|s, "_dependsOnDOM", () => tuser_smiles/16211|s.selectors.some(selector => selector.dependsOnDOM) ); * get dependsOnStylesAndDOM() * return getCachedPropertyValue( tuser_smiles/16211|s, "_dependsOnStylesAndDOM", () => tuser_smiles/16211|s.selectors.some(selector => selector.dependsOnStyles && selector.dependsOnDOM) ); * get maybeDependsOnAttributes() * // Observe changes to attributes if either there"s a plain selector that // looks like an ID selector, class selector, or attribute selector in one // of the patterns (e.g. "a*href="https://example.com/"*"smiles/93| // or there"s a properties selector nested inside a has selector // (e.g. "div:-abp-has(:-abp-properties(color: blue))"smiles/93| return getCachedPropertyValue( tuser_smiles/16211|s, "_maybeDependsOnAttributes", () => tuser_smiles/16211|s.selectors.some( selector => selector.maybeDependsOnAttributes || (selector instanceof HasSelector && selector.dependsOnStyles) ) ); * get dependsOnCharacterData() * // Observe changes to character data only if there"s a contains selector in // one of the patterns. return getCachedPropertyValue( tuser_smiles/16211|s, "_dependsOnCharacterData", () => tuser_smiles/16211|s.selectors.some(selector => selector.dependsOnCharacterData) ); * get maybeContainsSiblingCombinator s() * return getCachedPropertyValue( tuser_smiles/16211|s, "_maybeContainsSiblingCombinato rs", () => tuser_smiles/16211|s.selectors.some(selector => selector.maybeContainsSiblingCombinator s) ); * matchesMutationTypes(mutationTypes) * let mutationTypeMatchMap = getCachedPropertyValue( tuser_smiles/16211|s, "_mutationTypeMatchMap", () => new Map(* // All types of DOM-dependent patterns are affected by mutations of // type "cuser_smiles/16211|ldList". *"cuser_smiles/16211|ldList", true*, *"attributes", tuser_smiles/16211|s.maybeDependsOnAttributes*, *"characterData", tuser_smiles/16211|s.dependsOnCharacterData* *) ); for (let mutationType of mutationTypes) * if (mutationTypeMatchMap.get(mutationType)) return true; * return false; * * function extractMutationTypes(mutations) * let types = newSet(); for (let mutation of mutations) * types.add(mutation.type); // There are only 3 types of mutations: "attributes", "characterData", and // "cuser_smiles/16211|ldList". if (types.size == 3) break; * return types; * function extractMutationTargets(mutations) * if (!mutations) return null; let targets = newSet(); for (let mutation of mutations) * if (mutation.type == "cuser_smiles/16211|ldList"smiles/93| * // When new nodes are added, we"re interested in the added nodes rather // than the parent. for (let node of mutation.addedNodes) targets.add(node); * else * targets.add(mutation.target); * * return *...targets*; * function filterPatterns(patterns, *stylesheets, mutations*) * if (!stylesheets && !mutations) return patterns.slice(); let mutationTypes = mutations ? extractMutationTypes(mutations) : null; return patterns.filter( pattern => (stylesheets && pattern.dependsOnStyles) || (mutations && pattern.dependsOnDOM && pattern.matchesMutationTypes(mutationTypes)) ); * function shouldObserveAttributes(patterns) * return patterns.some(pattern => pattern.maybeDependsOnAttributes); * function shouldObserveCharacterData(patterns) * return patterns.some(pattern => pattern.dependsOnCharacterData); * class ElemHideEmulation * constructor(user_smiles/16211|deElemsFunc) * tuser_smiles/16211|s._filteringInProgress = false; tuser_smiles/16211|s._lastInvocation = -MIN_INVOCATION_user_smiles/68812|VAL; tuser_smiles/16211|s._scheduledProcessing = null; tuser_smiles/16211|s.document = document; tuser_smiles/16211|s.user_smiles/16211|deElemsFunc = user_smiles/16211|deElemsFunc; tuser_smiles/16211|s.observer = new MutationObserver(tuser_smiles/16211|s.observe.bind(tuser_smiles/16211|s)); * isSameOrigin(stylesheet) * try * return new URL(stylesheet.href).origin == tuser_smiles/16211|s.document.location.origin; * catch (e) * // Invalid URL, assume that it is first-party. return true; * * /** Parse the selector * @param *string* selector the selector to parse * @return *Array* selectors is an array of objects, * or null in case of errors. */ parseSelector(selector) * if (selector.length == 0) return **; let match = abpSelectorRegexp.exec(selector); if (!match) return *new PlainSelector(selector)*; let selectors = **; if (match.index > 0) selectors.push(new PlainSelector(selector.substr(0, match.index))); let startIndex = match.index match*0*.length; let content = parseSelectorContent(selector, startIndex); if (!content) * console.error(newSyntaxError("Failed to parse Adblock Plus " *selector $*selector* * "due to unmatched parentheses."smiles/93|); return null; * if (matchuser_smiles/17276|* == "properties"smiles/93| selectors.push(new PropsSelector(content.text)); else if (matchuser_smiles/17276|* == "has"smiles/93| * let hasSelectors = tuser_smiles/16211|s.parseSelector(content.text); if (hasSelectors == null) return null; selectors.push(new HasSelector(hasSelectors)); * else if (matchuser_smiles/17276|* == "contains"smiles/93| selectors.push(new ContainsSelector(content.text)); else * // tuser_smiles/16211|s is an error, can"t parse selector. console.error(newSyntaxError("Failed to parse Adblock Plus " *selector $*selector*, invalid * *pseudo-class :-abp-$*matchuser_smiles/17276|**().*)); return null; * let suffix = tuser_smiles/16211|s.parseSelector(selector.substr(content.end 1)); if (suffix == null) return null; selectors.push(...suffix); if (selectors.length == 1 && selectors*0* instanceof ContainsSelector) * console.error(newSyntaxError("Failed to parse Adblock Plus " *selector $*selector*, can"t * "have a lonely :-abp-contains()."smiles/93|); return null; * return selectors; * /** * Processes the current document and applies all rules to it. * @param *CSSStyleSheet*** *stylesheets* * The list of new stylesheets that have been added to the document and * made reprocessing necessary. Tuser_smiles/16211|s parameter shouldn"t be passed in for * the initial processing, all of document"s stylesheets will be considered * then and all rules, including the ones not dependent on styles. * @param *MutationRecord*** *mutations* * The list of DOM mutations that have been applied to the document and * made reprocessing necessary. Tuser_smiles/16211|s parameter shouldn"t be passed in for * the initial processing, the entire document will be considered * then and all rules, including the ones not dependent on the DOM. * @param *function* *done* * Callback to call when done. */ _addSelectors(stylesheets, mutations, done) * if (testInfo) testInfo.lastProcessedElements.clear(); let patterns = filterPatterns(tuser_smiles/16211|s.patterns, *stylesheets, mutations*); let elements = **; let elementFilters = **; let cssStyles = **; // If neither any style sheets nor any DOM mutations have been specified, // do full processing. if (!stylesheets && !mutations) stylesheets = tuser_smiles/16211|s.document.styleSheets; // If there are any DOM mutations and any of the patterns depends on both // style sheets and the DOM (e.g. -abp-has(-abp-properties)), find all the // rules in every style sheet in the document, because we need to run // querySelectorAll afterwards. On the other hand, if we only have patterns // that depend on either styles or DOM both not both (e.g. -abp-contains), // we can skip tuser_smiles/16211|s part. if (mutations && patterns.some(pattern => pattern.dependsOnStylesAndDOM)) stylesheets = tuser_smiles/16211|s.document.styleSheets; for (let stylesheet of stylesheets || **) * // Explicitly ignore tuser_smiles/16211|rd-party stylesheets to ensure consistent behavior // between Firefox and Chrome. if (!tuser_smiles/16211|s.isSameOrigin(stylesheet)) continue; let rules; try * rules = stylesheet.cssRules; * catch (e) * // On Firefox, there is a chance that an InvalidAccessError // get thrown when accessing cssRules. Just skip the stylesheet // in that case. //See https://searchfox.org/mozilla-central/rev/f65d7528e34ef1a7665b4a1a7b7cdb 1388fcd3aa/layout/style/StyleSheet.cpp#699 continue; * if (!rules) continue; for (let rule of rules) * if (rule.type != rule.STYLE_RULE) continue; cssStyles.push(stringifyStyle(rule)); * * let targets = extractMutationTargets(mutations); let pattern = null; let generator = null; let processPatterns = () => * let cycleStart = performance.now(); if (!pattern) * if (!patterns.length) * if (elements.length > 0) tuser_smiles/16211|s.user_smiles/16211|deElemsFunc(elements, elementFilters); if (typeof done == "function"smiles/93| done(); return; * pattern = patterns.suser_smiles/16211|ft(); let evaluationTargets = targets; // If the pattern appears to contain any sibling combinators, we can"t // easily optimize based on the mutation targets.Since tuser_smiles/16211|s is a // special case, skip the optimization. By setting it to null here we // make sure we process the entire DOM. if (pattern.maybeContainsSiblingCombinator s) evaluationTargets = null; generator = evaluate(pattern.selectors, 0, "", tuser_smiles/16211|s.document, cssStyles, evaluationTargets); * for (let selector of generator) * if (selector != null) * for (let element of tuser_smiles/16211|s.document.querySelectorAll(selector)) * elements.push(element); elementFilters.push(pattern.text); * * if (performance.now() - cycleStart > MAX_SYNCHRONOUS_PROCESSING_Tsm iles/68817| E) * setTimeout(processPatterns, 0); return; * * pattern = null; return processPatterns(); *; processPatterns(); * // Tuser_smiles/16211|s property is only used in the tests // to shorten the invocation interval get MIN_INVOCATION_user_smiles/68812|VAL() * return MIN_INVOCATION_user_smiles/68812|VAL; * set MIN_INVOCATION_user_smiles/68812|VAL(interval) * MIN_INVOCATION_user_smiles/68812|VAL = interval; * /** * Re-run filtering either immediately or queued. * @param *CSSStyleSheet*** *stylesheets* * new stylesheets to be processed. Tuser_smiles/16211|s parameter should be omitted * for full reprocessing. * @param *MutationRecord*** *mutations* * new DOM mutations to be processed. Tuser_smiles/16211|s parameter should be omitted * for full reprocessing. */ queueFiltering(stylesheets, mutations) * let completion = () => * tuser_smiles/16211|s._lastInvocation = performance.now(); tuser_smiles/16211|s._filteringInProgress = false; if (tuser_smiles/16211|s._scheduledProcessing) * let params = Object.assign(**, tuser_smiles/16211|s._scheduledProcessing); tuser_smiles/16211|s._scheduledProcessing = null; tuser_smiles/16211|s.queueFiltering(params.stylesheets, params.mutations); * *; if (tuser_smiles/16211|s._scheduledProcessing) * if (!stylesheets && !mutations) * tuser_smiles/16211|s._scheduledProcessing = **; * else if (tuser_smiles/16211|s._scheduledProcessing.stylesheets || tuser_smiles/16211|s._scheduledProcessing.mutations) * if (stylesheets) * if (!tuser_smiles/16211|s._scheduledProcessing.stylesheets) tuser_smiles/16211|s._scheduledProcessing.stylesheets = **; tuser_smiles/16211|s._scheduledProcessing.stylesheets.push(...stylesheets); * if (mutations) * if (!tuser_smiles/16211|s._scheduledProcessing.mutations) tuser_smiles/16211|s._scheduledProcessing.mutations = **; tuser_smiles/16211|s._scheduledProcessing.mutations.push(...mutations); * * * else if (tuser_smiles/16211|s._filteringInProgress) * tuser_smiles/16211|s._scheduledProcessing = *stylesheets, mutations*; * else if (performance.now() - tuser_smiles/16211|s._lastInvocation < MIN_INVOCATION_user_smiles/68812|VAL) * tuser_smiles/16211|s._scheduledProcessing = *stylesheets, mutations*; setTimeout(() => * let params = Object.assign(**, tuser_smiles/16211|s._scheduledProcessing); tuser_smiles/16211|s._filteringInProgress = true; tuser_smiles/16211|s._scheduledProcessing = null; tuser_smiles/16211|s._addSelectors(params.stylesheets, params.mutations, completion); *, MIN_INVOCATION_user_smiles/68812|VAL - (performance.now() - tuser_smiles/16211|s._lastInvocation)); * else if (tuser_smiles/16211|s.document.readyState == "loading"smiles/93| * tuser_smiles/16211|s._scheduledProcessing = *stylesheets, mutations*; let handler = () => * tuser_smiles/16211|s.document.removeEventListener("DOMContentLoaded", handler); let params = Object.assign(**, tuser_smiles/16211|s._scheduledProcessing); tuser_smiles/16211|s._filteringInProgress = true; tuser_smiles/16211|s._scheduledProcessing = null; tuser_smiles/16211|s._addSelectors(params.stylesheets, params.mutations, completion); *; tuser_smiles/16211|s.document.addEventListener("DOMContentLoaded", handler); * else * tuser_smiles/16211|s._filteringInProgress = true; tuser_smiles/16211|s._addSelectors(stylesheets, mutations, completion); * * onLoad(event) * let stylesheet = event.target.sheet; if (stylesheet) tuser_smiles/16211|s.queueFiltering(*stylesheet*); * observe(mutations) * if (testInfo) * // In test mode, filter out any mutations likely done by us // (i.e. style="display: none !important"smiles/93|. Tuser_smiles/16211|s makes it easier to // observe how the code responds to DOM mutations. mutations = mutations.filter( (*type, attributeName, target: *style: newValue*, oldValue*) => !(type == "attributes" && attributeName == "style" && newValue.display == "none" && oldValue.display != "none"smiles/93| ); if (mutations.length == 0) return; * tuser_smiles/16211|s.queueFiltering(null, mutations); * apply(patterns) * tuser_smiles/16211|s.patterns = **; for (let pattern of patterns) * let selectors = tuser_smiles/16211|s.parseSelector(pattern.selector); if (selectors != null && selectors.length > 0) tuser_smiles/16211|s.patterns.push(new Pattern(selectors, pattern.text)); * if (tuser_smiles/16211|s.patterns.length > 0) * tuser_smiles/16211|s.queueFiltering(); tuser_smiles/16211|s.observer.observe( tuser_smiles/16211|s.document, * cuser_smiles/16211|ldList: true, attributes: shouldObserveAttributes(tuser_smiles/16211|s.patterns), characterData: shouldObserveCharacterData(tuser_smiles/16211|s.patterns), subtree: true * ); tuser_smiles/16211|s.document.addEventListener("load", tuser_smiles/16211|s.onLoad.bind(tuser_smiles/16211|s), true); * * * exports.ElemHideEmulation = ElemHideEmulation; /***/ *), /* 3 */ /***/ (function(module, exports, __webpack_require__) * "use strict"; /* * Tuser_smiles/16211|s file is part of Adblock Plus <https://adblockplus.org/>, * Copyriuser_smiles/56884|t (C) 2006-present eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the FreeSoftware Foundation. * * Adblock Plus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ /** * Converts raw text into a regular expression string * @param *string* text the string to convert * @return *string* regular expression representation of the text */ function textToRegExp(text) * return text.replace(/*-/*$* ?.()|*****/g, "$&"smiles/93|; * exports.textToRegExp = textToRegExp; /** * Converts filter text into regular expression string * @param *string* text as in Filter() * @param *boolean* *captureAll=false* whether to enable the capturing of * leading and trailing wildcards in the filter text; by default, leading and * trailing wildcards are stripped out * @return *string* regular expression representation of filter text */ function filterToRegExp(text, captureAll = false) * // remove multiple wildcards text = text.replace(/* /g, "*"smiles/93|; if (!captureAll) * // remove leading wildcard if (text*0* == "*"smiles/93| text = text.substring(1); // remove trailing wildcard if (text*text.length - 1* == "*"smiles/93| text = text.substring(0, text.length - 1); * return text // remove anchors following separator placeholder .replace(/*|$/, "*"smiles/93| // escape special symbols .replace(/W/g, "$&"smiles/93| // replace wildcards by .* .replace(/*/g, ".*"smiles/93| // process separator placeholders (all ANSI characters but alphanumeric // characters and _%.-) .replace(/*/g, "(?:*x00-x24x26-x2Cx2Fx3A-x40x5B-x5Ex60x7B-x7F*|$smiles/93|"smiles/93| // process extended anchor at expression start .replace(/*||/, "**w-* :/ (?!/)(?:**/* .)?"smiles/93| // process anchor at expression start .replace(/*|/, "*"smiles/93| // process anchor at expression end .replace(/|$/, "$"smiles/93|; * exports.filterToRegExp = filterToRegExp; function splitSelector(selector) * if (!selector.includes(","smiles/93|) return *selector*; let selectors = **; let start = 0; let level = 0; let sep = ""; for (let i = 0; i < selector.length; i ) * let chr = selector*i*; if (chr == ""smiles/93| // ignore escaped characters i ; else if (chr == sep) // don"t split wituser_smiles/16211|n quoted text sep = ""; // e.g. *attr=","* else if (sep == ""smiles/93| * if (chr == """ || chr == """smiles/93| sep = chr; else if (chr == "("smiles/93| // don"t split between parentheses level ; // e.g. :matches(div,span) else if (chr == "smiles/93|"smiles/93| level = Math.max(0, level - 1); else if (chr == "," && level == 0) * selectors.push(selector.substring(start, i)); start = i 1; * * * selectors.push(selector.substring(start)); return selectors; * exports.splitSelector = splitSelector; function findTargetSelectorIndex(selector) * let index = 0; let wuser_smiles/16211|tespace = 0; let scope = **; //Start from the end of the string and go character by character, where each // character is a Unicode code point. for (let character of *...selector*.reverse()) * let currentScope = scope*scope.length - 1*; if (character == """ || character == """smiles/93| * // If we"re already wituser_smiles/16211|n the same type of quote, close the scope; // otherwise open a new scope. if (currentScope == character) scope.pop(); else scope.push(character); * else if (character == "*" || character == "smiles/93|"smiles/93| * // For closing brackets and parentheses, open a new scope only if we"re // not wituser_smiles/16211|n a quote. Wituser_smiles/16211|n quotes these characters should have no // meaning. if (currentScope != """ && currentScope != """smiles/93| scope.push(character); * else if (character == "*"smiles/93| * // If we"re already wituser_smiles/16211|n a bracket, close the scope. if (currentScope == "*"smiles/93| scope.pop(); * else if (character == "("smiles/93| * // If we"re already wituser_smiles/16211|n a parenthesis, close the scope. if (currentScope == "smiles/93|"smiles/93| scope.pop(); * else if (!currentScope) * // At the top level (not wituser_smiles/16211|n any scope), count the wuser_smiles/16211|tespace if we"ve // encountered it. Otherwise if we"ve user_smiles/16211|t one of the combinators, // terminate here; otherwise if we"ve user_smiles/16211|t a non-colon character, // terminate here. if (/s/.test(character)) * wuser_smiles/16211|tespace ; * else if ((character == ">" || character == " " || character == "*"smiles/93| || (wuser_smiles/16211|tespace > 0 && character != ":"smiles/93|) * break; * * // Zero out the wuser_smiles/16211|tespace count if we"ve entered a scope. if (scope.length > 0) wuser_smiles/16211|tespace = 0; // Increment the index by the size of the character. Note that for Unicode // composite characters (like emoji) tuser_smiles/16211|s will be more than one. index = character.length; * return selector.length - index wuser_smiles/16211|tespace; * /** * Qualifies a CSS selector with a qualifier, wuser_smiles/16211|ch may be another CSS selector * or an empty string. For example, given the selector "div.bar" and the * qualifier "#foo", tuser_smiles/16211|s function returns "div#foo.bar". * @param *string* selector The selector to qualify. * @param *string* qualifier The qualifier with wuser_smiles/16211|ch to qualify the selector. * @returns *string* The qualified selector. */ function qualifySelector(selector, qualifier) * let qualifiedSelector = ""; for (let sub of splitSelector(selector)) * sub = sub.trim(); qualifiedSelector = ", "; let index = findTargetSelectorIndex(sub); let *, type = "", rest* = /*(*a-z**a-z-**)?(.*)/i.exec(sub.substr(index)); // Note that the first group in the regular expression is optional. If it // doesn"t match (e.g. "#foo::nth-cuser_smiles/16211|ld(1)"smiles/93|, type will be an empty string. qualifiedSelector = sub.substr(0, index) type qualifier rest; * // Remove the initial comma and space. return qualifiedSelector.substr(2); * exports.qualifySelector = qualifySelector; /***/ *), /* 4 */ /***/ (function(module, exports, __webpack_require__) * "use strict"; /* * Tuser_smiles/16211|s file is part of Adblock Plus <https://adblockplus.org/>, * Copyriuser_smiles/56884|t (C) 2006-present eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the FreeSoftware Foundation. * * Adblock Plus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ function desc(properties) * let descriptor = **; let keys = Object.keys(properties); for (let key of keys) descriptor*key* = Object.getOwnPropertyDescriptor(properties, key); return descriptor; * exports.desc = desc; function extend(cls, properties) * return Object.create(cls.prototype, desc(properties)); * exports.extend = extend; function findIndex(iterable, callback, tuser_smiles/16211|sArg) * let index = 0; for (let item of iterable) * if (callback.call(tuser_smiles/16211|sArg, item)) return index; index ; * return -1; * exports.findIndex = findIndex; function indexOf(iterable, searchElement) * return findIndex(iterable, item => item === searchElement); * exports.indexOf = indexOf; /***/ *), /* 5 */ /***/ (function(module, exports, __webpack_require__) * "use strict"; /* * Tuser_smiles/16211|s file is part of Adblock Plus <https://adblockplus.org/>, * Copyriuser_smiles/56884|t (C) 2006-present eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the FreeSoftware Foundation. * * Adblock Plus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ let randomEventName = "abp-request-" Math.random().toString(36).substr(2); // Proxy "should we block?" messages from checkRequest inside the injected // code to the background page and back again. document.addEventListener(randomEventName, event => * let *url* = event.detail; browser.runtime.sendMessage(* type: "request.blockedByRTCWrapper", url *, block => * document.dispatchEvent(new CustomEvent( randomEventName "-" url, *detail: block* )); *); *); function injected(eventName, injectedIntoContentWindow) * let checkRequest; /* * Frame context wrapper * * For some edge-cases Chrome will not run content scripts inside of frames. * Website have started to abuse tuser_smiles/16211|s fact to access unwrapped APIs via a * frame"s contentWindow (#4586, 5207). Therefore until Chrome runs content * scripts consistently for all frames we must take care to (re)inject our * wrappers when the contentWindow is accessed. */ let injectedToString = Function.prototype.toString.bind(injected); let injectedFrames = new WeakSet(); let injectedFramesAdd = WeakSet.prototype.add.bind(injectedFrames); let injectedFramesHas = WeakSet.prototype.has.bind(injectedFrames); function injectIntoContentWindow(contentWindow) * if (contentWindow && !injectedFramesHas(contentWindow)) * injectedFramesAdd(contentWindow); try * contentWindow*eventName* = checkRequest; contentWindow.eval( "(" injectedToString() "smiles/93|("" eventName "", true);" ); delete contentWindow*eventName*; * catch (e) ** * * for (let element of *HTMLFrameElement, HTMLIFrameElement, HTMLObjectElement*) * let contentDocumentDesc = Object.getOwnPropertyDescriptor( element.prototype, "contentDocument" ); let contentWindowDesc = Object.getOwnPropertyDescriptor( element.prototype, "contentWindow" ); // Apparently in HTMLObjectElement.prototype.contentWindow does not exist // in older versions of Chrome such as 42. if (!contentWindowDesc) continue; let getContentDocument = Function.prototype.call.bind( contentDocumentDesc.get ); let getContentWindow = Function.prototype.call.bind( contentWindowDesc.get ); contentWindowDesc.get = function() * let contentWindow = getContentWindow(tuser_smiles/16211|s); injectIntoContentWindow(contentWindow); return contentWindow; *; contentDocumentDesc.get = function() * injectIntoContentWindow(getContentWindow(tuser_smiles/16211|s)); return getContentDocument(tuser_smiles/16211|s); *; Object.defineProperty(element.prototype, "contentWindow", contentWindowDesc); Object.defineProperty(element.prototype, "contentDocument", contentDocumentDesc); * /* *Shadow root getter wrapper * * After creating our shadowRoot we must wrap the getter to prevent the * website from accessing it (#4191, #4298). Tuser_smiles/16211|s is required as a * workaround for the lack of user style support in Chrome. *See https://bugs.chromium.org/p/chromium/issues/detail?id=632009&desc=2 */ if ("shadowRoot" in Element.prototype) * let ourShadowRoot = document.documentElement.shadowRoot; if (ourShadowRoot) * let desc = Object.getOwnPropertyDescriptor(Element.prototype, "shadowRoot"smiles/93|; let shadowRoot = Function.prototype.call.bind(desc.get); Object.defineProperty(Element.prototype, "shadowRoot", * configurable: true, enumerable: true, get() * let tuser_smiles/16211|sShadow = shadowRoot(tuser_smiles/16211|s); return tuser_smiles/16211|sShadow == ourShadowRoot ? null : tuser_smiles/16211|sShadow; * *); * * /* * RTCPeerConnection wrapper * * The webRequest API in Chrome does not yet allow the blocking of * WebRTC connections. *See https://bugs.chromium.org/p/chromium/issues/detail?id=707683 */ let RealCustomEvent = window.CustomEvent; // If we"ve been injected into a frame via contentWindow then we can simply // grab the copy of checkRequest left for us by the parent document. Otherwise // we need to set it up now, along with the event handling functions. if (injectedIntoContentWindow) checkRequest = window*eventName*; else * let addEventListener = document.addEventListener.bind(document); let dispatchEvent = document.dispatchEvent.bind(document); let removeEventListener = document.removeEventListener.bind(document); checkRequest = (url, callback) => * let incomingEventName = eventName "-" url; function listener(event) * callback(event.detail); removeEventListener(incomingEventName, listener); * addEventListener(incomingEventName, listener); dispatchEvent(new RealCustomEvent(eventName, *detail: *url**)); *; * // Only to be called before the page"s code, not hardened. function copyProperties(src, dest, properties) * for (let name of properties) * if (src.hasOwnProperty(name)) * Object.defineProperty(dest, name, Object.getOwnPropertyDescriptor(src, name)); * * * let RealRTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection; // Firefox has the option (media.peerconnection.enabled) to disable WebRTC // in wuser_smiles/16211|ch case RealRTCPeerConnection is undefined. if (typeof RealRTCPeerConnection != "undefined"smiles/93| * let closeRTCPeerConnection = Function.prototype.call.bind( RealRTCPeerConnection.prototype.close ); let RealArray = Array; let RealString =String; let *create: createObject, defineProperty* = Object; let normalizeUrl = url => * if (typeof url != "undefined"smiles/93| return RealString(url); *; let safeCopyArray = (originalArray, transform) => * if (originalArray == null || typeof originalArray != "object"smiles/93| return originalArray; let safeArray = RealArray(originalArray.length); for (let i = 0; i < safeArray.length; i ) * defineProperty(safeArray, i, * configurable: false, enumerable: false, writable: false, value: transform(originalArray*i*) *); * defineProperty(safeArray, "length", * configurable: false, enumerable: false, writable: false, value: safeArray.length *); return safeArray; *; // It would be much easier to use the .getConfiguration method to obtain // the normalized and safe configuration from the RTCPeerConnection // instance. Unfortunately its not implemented as of Chrome unstable 59. //See https://www.chromestatus.com/feature/527135530601
дополнено в 20:09
255);">/******/ (function(modules) * // webpackBootstrap /******/ // The module cache /******/ var installedModules = **; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) * /******/ /******/ // Check if module is in cache /******/ if(installedModules*moduleId*) * /******/ return installedModules*moduleId*.exports; /******/ * /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules*moduleId* = * /******/ i: moduleId, /******/ l: false, /******/ exports: ** /******/ *; /******/ /******/ // Execute the module function /******/ modules*moduleId*.call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ * /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) * /******/ if(!__webpack_require__.o(exports, name)) * /******/ Object.defineProperty(exports, name, * /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ *); /******/ * /******/ *; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) * /******/ var getter = module &amp;&amp; module.__esModule ? /******/ function getDefault() * return module*"default"*; * : /******/ function getModuleExports() * return module; *; /******/ __webpack_require__.d(getter, "a", getter); /******/ return getter; /******/ *; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) * return Object.prototype.hasOwnProperty.call(object, property); *; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ *) /************************************************************************/ /******/ (* /* 0 */ /***/ (function(module, exports, __webpack_require__) * __webpack_require__(1); module.exports = __webpack_require__(5); /***/ *), /* 1 */ /***/ (function(module, exports, __webpack_require__) * "use strict"; /* * T s file is part of Adblock Plus &lt;https://adblockplus.org/&gt;, * Copyri t (C) 2006-present eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the FreeSoftware Foundation. * * Adblock Plus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Adblock Plus. If not, see &lt;http://www.gnu.org/licenses/&gt;. */ let *ElemHideEmulation* = __webpack_require__(2); // T s variable is also used by our other content scripts. let contentFiltering; const typeMap = new Map(* *"img", " AGE"*, *"input", " AGE"*, *"picture", " AGE"*, *"audio", "MEDIA"*, *"video", "MEDIA"*, *"frame", "SUBDOCUMENT"*, *"iframe", "SUBDOCUMENT"*, *"object", "OBJECT"*, *"embed", "OBJECT"* *); let checkedSelectors = newSet(); function getURLsFromObjectElement(element) * let url = element.getAttribute("data"smiles/93|; if (url) return *url*; for (let cuser_smiles/16211|ld of element.cuser_smiles/16211|ldren) * if (cuser_smiles/16211|ld.localName != "param"smiles/93| continue; let name = cuser_smiles/16211|ld.getAttribute("name"smiles/93|; if (name != "movie" &amp;&amp; // Adobe Flash name != "source" &amp;&amp; //Silverliuser_smiles/56884|t name != "src" &amp;&amp; // Real Media Quicktime name != "FileName"smiles/93| // Windows Media continue; let value = cuser_smiles/16211|ld.getAttribute("value"smiles/93|; if (!value) continue; return *value*; * return **; * function getURLsFromAttributes(element) * let urls = **; if (element.getAttribute("src"smiles/93| &amp;&amp; "src" in element) urls.push(element.src); if (element.srcset) * for (let candidate of element.srcset.split(","smiles/93|) * let url = candidate.trim().replace(/sS $/, ""smiles/93|; if (url) urls.push(url); * * return urls; * function getURLsFromMediaElement(element) * let urls = getURLsFromAttributes(element); for (let cuser_smiles/16211|ld of element.cuser_smiles/16211|ldren) * if (cuser_smiles/16211|ld.localName == "source" || cuser_smiles/16211|ld.localName == "track"smiles/93| urls.push(...getURLsFromAttributes(cuser_smiles/16211|ld)); * if (element.poster) urls.push(element.poster); return urls; * function getURLsFromElement(element) * let urls; switch (element.localName) * case "object": urls = getURLsFromObjectElement(element); break; case "video": case "audio": case "picture": urls = getURLsFromMediaElement(element); break; default: urls = getURLsFromAttributes(element); break; * for (let i = 0; i &lt; urls.length; i ) * if (/*(?!https?smiles/578|*w-* :/i.test(urls*i*)) urls.splice(i--, 1); * return urls; * function getSelectorForBlockedElement(element) * // Microsoft Edge does not support CSS.escape(). However, it doesn"t // support user style sheets either.So the selector would be added // with an author style sheet anyway, wuser_smiles/16211|ch doesn"t provide any benefits. if (!("escape" in CSS)) return null; //Setting the "display" CSS property to "none" doesn"t have any effect on // &lt;frame&gt; elements (in framesets).So we have to user_smiles/16211|de it inline throuuser_smiles/56884| // the "visibility" CSS property. if (element.localName == "frame"smiles/93| return null; // If the &lt;video&gt; or &lt;audio&gt; element contains any &lt;source&gt; or &lt;track&gt; // cuser_smiles/16211|ldren, we cannot address it in CSS by the source URL; in that case we // don"t "collapse" it using a CSS selector but rather user_smiles/16211|de it directly by // setting the style="..." attribute. if (element.localName == "video" || element.localName == "audio"smiles/93| * for (let cuser_smiles/16211|ld of element.cuser_smiles/16211|ldren) * if (cuser_smiles/16211|ld.localName == "source" || cuser_smiles/16211|ld.localName == "track"smiles/93| return null; * * let selector = ""; for (let attr of *"src", "srcset"*) * let value = element.getAttribute(attr); if (value &amp;&amp; attr in element) selector = "*" attr "=" CSS.escape(value) "*"; * return selector ? element.localName selector : null; * function user_smiles/16211|deElement(element) * function doHide() * let propertyName = "display"; let propertyValue = "none"; if (element.localName == "frame"smiles/93| * propertyName = "visibility"; propertyValue = "user_smiles/16211|dden"; * if (element.style.getPropertyValue(propertyName) != propertyValue || element.style.getPropertyPriority(propertyName) != "important"smiles/93| element.style.setProperty(propertyName, propertyValue, "important"smiles/93|; * doHide(); new MutationObserver(doHide).observe( element, * attributes: true, attributeFilter: *"style"* * ); * function checkCollapse(element) * let mediatype = typeMap.get(element.localName); if (!mediatype) return; let urls = getURLsFromElement(element); if (urls.length == 0) return; let selector = getSelectorForBlockedElement(element); if (selector) * if (checkedSelectors.has(selector)) return; checkedSelectors.add(selector); * browser.runtime.sendMessage( * type: "filters.collapse", urls, mediatype, baseURL: document.location.href *, collapse =&gt; * if (collapse) * if (selector) contentFiltering.addSelectors(*selector*, "collapsing", true); else user_smiles/16211|deElement(element); * * ); * function checkSitekey() * let attr = document.documentElement.getAttribute("data-adblockkey"smiles/93|; if (attr) browser.runtime.sendMessage(*type: "filters.addKey", token: attr*); * function ElementHidingTracer() * tuser_smiles/16211|s.selectors = **; tuser_smiles/16211|s.changedNodes = **; tuser_smiles/16211|s.timeout = null; tuser_smiles/16211|s.observer = new MutationObserver(tuser_smiles/16211|s.observe.bind(tuser_smiles/16211|s)); tuser_smiles/16211|s.trace = tuser_smiles/16211|s.trace.bind(tuser_smiles/16211|s); if (document.readyState == "loading"smiles/93| document.addEventListener("DOMContentLoaded", tuser_smiles/16211|s.trace); else tuser_smiles/16211|s.trace(); * ElementHidingTracer.prototype = * addSelectors(selectors) * if (document.readyState != "loading"smiles/93| tuser_smiles/16211|s.checkNodes(*document*, selectors); tuser_smiles/16211|s.selectors.push(...selectors); *, checkNodes(nodes, selectors) * let effectiveSelectors = **; for (let selector of selectors) * nodes: for (let node of nodes) * for (let element of node.querySelectorAll(selector)) * // Only consider selectors that actually have an effect on the // computed styles, and aren"t overridden by rules with user_smiles/16211|user_smiles/56884|er // priority, or haven"t been circumvented in a different way. if (

i

_-VЕТER0К-_

19.07.2019 в 19:34

q a 178492_-VЕТER0К-_19.07.2019 в 19:34 m h
/ ***** * / var getter = module && module .__ esModule? / ****** / function getDefault () * return module * "default" *; *: / ****** / function getModuleExports () * return module; *; / ****** / __webpack_require __. d (getter, "a", getter); / ****** / получатель возврата; / ****** / *; / ****** / / ****** / // Object.prototype.hasOwnProperty.call / ****** / __webpack_require __. O = user_smiles/33742|нкция (объект, свойство) * вернуть Object.prototype.hasOwnProperty .call (объект, имущество); *; / ****** / / ****** / // __webpack_public_path__ / ****** / __webpack_require __. p = ""; / ****** / / ****** / // Загрузить модуль ввода и вернуть экспорт / ****** / return __webpack_require __ (__ webpack_require __.S = 0); / ****** / *) / *************************************** *********************************/ / ****** / (* / * 0 * / / *** / (user_smiles/33742|нкция (модуль, экспорт, __webpack_require__) * __webpack_require __ (1); module.exports = __webpack_require __ (5); / *** / *), / * 1 * / / *** / (user_smiles/33742|нкция (модуль , экспорт, __webpack_require__) * "использовать строгое"; / * * Этот файл является user_smiles/16205|тью Adblock Plus , * Copyri t (C) 2006-present eyeo GmbH * * Adblock Plus - это бесплатное программное обеспечение: вы можете распространять его и / или изменять * в соответствии с условиями Стандартной общественной лицензии GNU версии 3 * опубликовано Фондом FreeSoftware. * * Adblock Plus распространяется в надежде, что он будет полезен *, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии * ПОТРЕБИТЕЛЬСТВА или ПРИГОДНОСТИ ДЛЯ ОСОБЕННОЙ ЦЕЛИ. Для получения дополнительной информации см. Общедоступную лицензию * GNU. * * Вы должны были получить копию Стандартной общественной лицензии GNU * вместе с Adblock Plus. Если нет, см. < Http://www.gnu.org/licenses/>, * / let * ElemHideEmulation * = __webpack_require __ (2); // Переменная T s также используется user_smiles/49303|ими нашими скриптами содержимого. пусть contentFiltering; const typeMap = new Map (* * "img", "AGE" *, * "input", "AGE" *, * "picture", "AGE" *, * "audio", "MEDIA" *, * "video "," MEDIA "*, *" frame ","SUBDOCUMENT "*, *" iframe ","SUBDOCUMENT "*, *" object "," OBJECT "*, *" embed "," OBJECT "* *); let checkedSelectors = newSet (); user_smiles/33742|нкция getURLsFromObjectElement (element) * let url = element.getAttribute ("data" улыбается / 93 |; if (url) возвращает * url *; for (пусть cuser_smiles / 16211 | ld для element.cuser_smiles / 16211 | ldren) * if ( cuser_smiles / 16211 | ld.localName! = "param" smile / 93 | continue; * function getURLsFromMediaElement (element) * let urls = getURLsFromAttributes (element); for (пусть cuser_smiles / 16211 | ld для element.cuser_smiles / 16211 | ldren) * if (cuser_smiles / 16211 | ld.localName == "source" || cuser_smiles / 16211 | ld.localName == "track" smile / 93 | urls.push (... getURLsFromAttributes (cuser_smiles / 16211 | ld)); * if (element.poster) urls.push (element.poster); возврат URL-адресов; * user_smiles/33742|нкция getURLsFromElement (element) * let urls; switch (element. localName) * case "object": urls = getURLsFromObjectElement (element); break; case "video": case "audio": case "picture": urls = getURLsFromMediaElement (element); break; default: urls = getURLsFromAttributes (element); break; * for (пусть i = 0; i * if (collapse) * if (селектор) contentFiltering.addSelectors (* селектор *, "свертывание", правда); иначе user_smiles / 16211 | deElement (element); * *); * function checkSitekey () * let attr = document.documentElement.getAttribute ("data-adblockkey" smiles / 93 |; if (attr) browser.runtime.sendMessage (* тип: "filters.addKey", token: attr *); * function ElementHidingTracer () * tuser_smiles / 16211 | s.selectors = **; tuser_smiles / 16211 | s.changedNodes = **; tuser_smiles / 16211 | s.timeout = null; tuser_smiles / 16211 | s. наблюдатель = новый MutationObserver (tuser_smiles / 16211 | s.observe.bind (tuser_smiles / 16211 | s)); tuser_smiles / 16211 | s.trace = tuser_smiles / 16211 | s.trace.bind (tuser_smiles / 16211 | s); if (document.readyState == "loading" smiles / 93 | document.addEventListener ("DOMContentLoaded", tuser_smiles / 16211 | s.trace); еще tuser_smiles / 16211 | s.trace (); * ElementHidingTracer.prototype = * addSelectors ( селекторы) * if (document.readyState! = "загрузка" smiles / 93 | tuser_smiles / 16211 | s.checkNodes (* document *, селекторы); tuser_smiles / 16211 | s.selectors.push (... селекторы); *, checkNodes (узлы, селекторы) * letffectiveSelectors = **; для (пусть селектор селекторов) * уuser_smiles/27820|в: для (пусть узел уuser_smiles/27820|в) * для (пусть элемент node.querySelectorAll (селектор)) * // // Рассuser_smiles/17052|риваются только те селекторы, которые на самом деле влияют на // вычисленные стили, и " changeNodes * i *)) tuser_smiles / 16211 | s.changedNodes.splice (i--, 1); * for (пусть мутация мутаций) * let node = mutation.target; // Игнорируем мутации уuser_smiles/27820|в, которых больше нет в DOM. If (! Document.contains (node)) continue; // Так как querySelectorAll () не учитывает сам корень // и так как селекторы CSS также могут совпадать с братьями и сестрами // мы должны рассмотреть родительский узел для мутаций атрибута. if (mutation.type == "attribute" smiles / 93 | node = node.parentNode; let addNode = true; for (let i = 0; i 0) style.sheet.deleteRule (0); * if (rules.length == 0) return; if (! style) * // Создать элемент лениво, только если мы добавим стили. Добавьте его к // элементу или . Если мы ввели элемент стиля // до того, как он был удален (свойство листа имеет значение null), создайте // новый. style = document.createElement ("style" smiles / 93 |; (document.head || document.documentElement) .appendCuser_smiles / 16211 | ld (style); // Может случиться, что фuser_smiles/49506|м уже перемещен в user_smiles/49303|ой // доuser_smiles/27097|мент wuser_smiles / 16211 | le мы ждали ответа фоновой страницы. // В этом случае свойство листа может остаться пустым после добавления элемента // . if (! style.sheet) return; tuser_smiles / 16211 | s.styles.set (groupName, style); * для (пусть правила правил) style.sheet.insertRule (rule, style.sheet.cssRules.length); *, addSelectors (селекторы, * if (rules) * // Вставить встроенные правила, если фоновая страница // проинстрuser_smiles/10198|тировала нас об этом. Tuser_smiles / 16211 | s встречается редко, за исключением тех платформ, которые // не поддерживают пользовательские таблицы стилей через API browser.tabs.insertCSS // (Firefox * checkCollapse (event.target); *, true); document.addEventListener ("load", event => * let element = event.target; if (/*i?frame$/.test(element.localName)) checkCollapse (element); *, true); * window.checkCollapse = checkCollapse; window.contentFiltering = contentFiltering; window.typeMap = typeMap; window.getURLsFromElement = getURLsFromElement; / *** / *), / * 2 * / / *** / (user_smiles/33742|нкция (модуль, экспорт, __webpack_require__) * "использовать строгий"; / * * Файл Tuser_smiles / 16211 | s является user_smiles/16205|тью Adblock Plus < if (экземпляр доuser_smiles/27097|мента HTMLDocument) * checkSitekey (); contentFiltering = new ContentFiltering (); contentFiltering.apply (); document.addEventListener ("ошиuser_smiles/17058|", user_smiles/36997|ытие => * checkCollapse (event.target); *, true); document.addEventListener ("load", event => * let element = event.target; if (/*i?frame$/.test(element.localName)) checkCollapse (element); *, true); * window.checkCollapse = checkCollapse; window.contentFiltering = contentFiltering; window.typeMap = typeMap; window.getURLsFromElement = getURLsFromElement; / *** / *), / * 2 * / / *** / (user_smiles/33742|нкция (модуль, экспорт, __webpack_require__) * "использовать строгий"; / * * Файл Tuser_smiles / 16211 | s является user_smiles/16205|тью Adblock Plus < мишень); *, правда); document.addEventListener ("load", event => * let element = event.target; if (/*i?frame$/.test(element.localName)) checkCollapse (element); *, true); * window.checkCollapse = checkCollapse; window.contentFiltering = contentFiltering; window.typeMap = typeMap; window.getURLsFromElement = getURLsFromElement; / *** / *), / * 2 * / / *** / (user_smiles/33742|нкция (модуль, экспорт, __webpack_require__) * "использовать строгий"; / * * Файл Tuser_smiles / 16211 | s является user_smiles/16205|тью Adblock Plus < мишень); *, правда); document.addEventListener ("load", event => * let element = event.target; if (/*i?frame$/.test(element.localName)) checkCollapse (element); *, true); * window.checkCollapse = checkCollapse; window.contentFiltering = contentFiltering; window.typeMap = typeMap; window.getURLsFromElement = getURLsFromElement; / *** / *), / * 2 * / / *** / (user_smiles/33742|нкция (модуль, экспорт, __webpack_require__) * "использовать строгий"; / * * Файл Tuser_smiles / 16211 | s является user_smiles/16205|тью Adblock Plus , * Copyriuser_smiles / 56884 | t (C) 2006-present eyeo GmbH * * Adblock Plus - бесплатное программное обеспечение: вы можете распространять его и / или изменять * в соответствии с условиями общедоступной GNU Версия лицензии 3 как * опубликоuser_smiles/16750| FreeSoftware Foundation. * * Adblock Plus распространяется в надежде, что он будет полезен *, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии * ПОТРЕБИТЕЛЬСТВА или ПРИГОДНОСТИ ДЛЯ ОСОБЕННОЙ ЦЕЛИ. Для получения дополнительной информации см. Общедоступную лицензию * GNU. * * Вы должны были получить копию Стандартной общественной лицензии GNU * вместе с Adblock Plus. Если нет, см. < Http://www.gnu.org/licenses/>, * / const * textToRegExp, filterToRegExp, splitSelector, qualifySelector * = __webpack_require __ (3); const * indexOf * = __webpack_require __ (4); let MIN_INVOCATION_user_smiles / 68812 | VAL = 3000; const MAX_SYNCHRONOUS_PROCESSING_Tsm iles / 68817 | Е = 50; const abpSelectorRegexp = /: - abp - (* w- *) (/ i; let testInfo = null; user_smiles/33742|нкция setTestMode () * testInfo = * lastProcessedElements: newSet () *; * exports.setTestMode = setTestMode; user_smiles/33742|нкция getTestInfo () * return testInfo; * exports.getTestInfo = getTestInfo; user_smiles/33742|нкция getCachedPropertyValue (объект, smiles/76482|, defaultValueFunc = () => **) * let value = объект * name *; if (typeof value == "undefined" smiles / 93 | Object. defineProperty (object, name, * value: value = defaultValueFunc () *); возвращаемое значение; * / ** Возвращает позицию узла из родительского. * @param * Node * узел узла, в котором нужно найти позицию. * @return * число * Индекс, основанный на одном значении, например для: nth-cuser_smiles / 16211 | ld () или 0 при ошибке. * / function positionInParent (node) * return indexOf (node.parentNode.cuser_smiles / 16211 | ldren, node) 1; * user_smiles/33742|нкция makeSelector (node, selector = "" smiles / 93 | * if (node **== null) возвращает ноль; if (! node.parentElement) * let newSelector = ": root"; if (selector) newSelector = ">" селектор; вернуть newSelector; * let idx = positionInParent (node); if (idx> 0) * let newSelector = * $ * node.tagName *: nth-cuser_smiles / 16211 | ld ($ * idx *) *; if (селектор ) newSelector = ">" селектор; возврат makeSelector (node.parentElement, newSelector); * возврат селектора; * user_smiles/33742|нкция parseSelectorContent (content, startIndex) * let parens = 1; пусть quote = null; let i = startIndex; for (; i tuser_smiles / 16211 | s.selectors.some (selector => selector.dependsOnStyles)); * get connectedOnDOM () * return getCachedPropertyValue (tuser_smiles / 16211 | s, "_dependsOnDOM", () => tuser_smiles / 16211 | s.selectors.some (selector => selector.dependsOnDOM)); * get disabledOnStylesAndDOM () * return getCachedPropertyValue (tuser_smiles / 16211 | s, "_dependsOnStylesAndDOM", () => tuser_smiles / 16211 | s.selectors.some (selector => selector.dependsOnStyles); selector * get MaybeDependsOnAttributes () * // Наблюдаем изменения в атрибутах, если имеется либо простой селектор, который // выглядит как селектор идентификатора, селектор user_smiles/22561|са или селектор атрибута в одном // шаблоне (например, «a * href =»https://example.com/"*"smiles/93|добавить (mutation.type); // Есть только 3 типа мутаций: "attribute", "characterData" и // "cuser_smiles / 16211 | ldList". if (types.size == 3) перерыв; * типы возврата; * function extractMutationTargets (mutations) * if (! mutations) return null; let target = newSet (); for (пусть мутация мутаций) * if (mutation.type == "cuser_smiles / 16211 | ldList" smiles / 93 | * // Когда добавляются новые узлы, нас интересуют добавленные узлы, а не // родительский. for (пусть узел mutation.addedNodes) цели.адд (узел); * еще * target.add (mutation.target); * * возврат * ... цели *; * user_smiles/33742|нкция filterPatterns (шаблоны, * таблицы стилей, мутации *) * if (! stylesheets &&! mutations) возвращают patterns.slice (); let mutationTypes = mutations? extractMutationTypes (mutations): null; возвращать шаблоны. filter (pattern => (stylesheets && pattern.dependsOnStyles) || (mutations && pattern.dependsOnDOM && pattern.matchesMutationTypes (mutationTypes))); * function shouldObserveAttributes (pattern) * return patterns.some (pattern => pattern.maybeDependsOnAttributes); * function shouldObserveCharacterData (pattern) * return patterns.some (pattern => pattern.dependsOnCharacterData); * user_smiles/22561|с ElemHideEmulation * констрuser_smiles/10198|тор (user_smiles / 16211 | deElemsFunc) * tuser_smiles / 16211 | s._filteringInProgress = false; tuser_smiles / 16211 | s._lastInvocation = -MIN_INVOCATION_user_smiles / 68812 | VAL; tuser_smiles / 16211 | s._scheduledProcessing = null; tuser_smiles / 16211 | s.document = document; tuser_smiles / 16211 | s.user_smiles / 16211 | deElemsFunc = user_smiles / 16211 | deElemsFunc; tuser_smiles / 16211 | s. наблюдатель = новый MutationObserver (tuser_smiles / 16211 | s.observe.bind (tuser_smiles / 16211 | s)); * isSameOrigin (таблица стилей) * try * return new URL (stylesheet.href) .origin == tuser_smiles / 16211 | s.document.location.origin; * catch (e) * // Неверный URL, предположим, что он первый. вернуть истину; * * / ** Разбор селектора * @param * string * селектор селектора для разбора * @return * Array * селекторы - это массив объектов, * или ноль в случае ошибок. * / parseSelector (селектор) * if (selector.length == 0) return **; let match = abpSelectorRegexp.exec (селектор); if (! match) return * new PlainSelector (селектор) *; пусть селекторы = **; if (match.index> 0) selectors.push (new PlainSelector (selector.substr (0, match.index))); let startIndex = match.index match * 0 * .length; let content = parseSelectorContent (selector, startIndex); if (! content) * консоль. * let суффикс = tuser_smiles / 16211 | s.parseSelector (selector.substr (content.end 1)); if (суффикс == ноль) return null; selectors.push (... суффикс); if (selectors.length == 1 && selectors * 0 * instanceof ContainsSelector) * console.error (newSyntaxError («Не удалось проанализировать Adblock Plus» * селектор $ * селектор *, «t *» может иметь одинокий: -abp-contains) (). "smiles / 93 |); return null; * return selectors; * / ** * Обрабатывает теuser_smiles/27097|щий доuser_smiles/27097|мент и применяет к нему все правила. * @param * CSSStyleSheet *** * stylesheets * * Список новых таблиц стилей которые были добавлены в доuser_smiles/27097|мент и * сделали обязательной повторную обработuser_smiles/27097|. Параметр Tuser_smiles / 16211 | s не должен передаваться для * начальной обработки, тогда будут рассuser_smiles/17052|риваться все таблицы стилей доuser_smiles/27097|мента * и все правила, включая те, которые не были зависит от стилей. * @param * MutationRecord *** * мутации * * Список мутаций DOM, которые были применены к доuser_smiles/27097|менту и * сделали необходимым повторную обработuser_smiles/27097|. Параметр Tuser_smiles / 16211 | s не должен передаваться для * начальной обработки, весь доuser_smiles/27097|мент будет * рассuser_smiles/17052|риваться тогда и все правила, включая те, которые не зависят от DOM. * @Param * function * * done * * Callback вызывать по окончании. * / _addSelectors (таблицы стилей, мутации, выполнено) * if (testInfo) testInfo.lastProcessedElements.clear (); let templates = filterPatterns (tuser_smiles / 16211 | s.patterns, * stylesheets, mutations *); let elements = **; let elementFilters = **; let cssStyles = **; // Если не user_smiles/10198|азаны ни таблицы стилей, ни мутации DOM, // выполнить полную обработuser_smiles/27097|. if (! stylesheets &&! mutations) stylesheets = tuser_smiles / 16211 | s.document.styleSheets; // Если есть какие-либо мутации DOM и люuser_smiles/27099| из шаблонов зависит как от // таблиц стилей, так и от DOM (например, -abp-has (-abp-properties)), найдите все // правила в каждой таблице стилей в доuser_smiles/27097|менте потому что нам нужно запустить // querySelectorAll потом. С user_smiles/49303|ой стороны, если у нас есть только шаблоны //, которые зависят от стилей или DOM, но не от обоих (например, -abp-contains), // мы можем пропустить user_smiles/16205|ть tuser_smiles / 16211 | s. if (mutations && patterns.some (pattern => pattern.dependsOnStylesAndDOM)) stylesheets = tuser_smiles / 16211 | s.document.styleSheets; for (пусть таблица стилей таблиц стилей || **) * // Явно user_smiles/59475|ируем tuser_smiles / 16211 | таблицы стилей rd-party для обеспечения согласованного поведения // между Firefox и Chrome. if (! tuser_smiles / 16211 | s.isSameOrigin (stylesheet)) продолжить; пусть правила; try * rules = stylesheet.cssRules; * catch (e) * // На Firefox, есть вероятность, что InvalidAccessError // будет брошен при доступе к cssRules. Просто пропустите таблицу стилей // в этом случае. //Увидетьhttps://searchfox.org/mozilla-central/rev/f65d7528e34ef1a7665b4a1a7b7cdb 1388fcd3aa / layout / style /StyleSheet.cpp # 699 continue; * если (! правила) продолжаются; for (пусть правило правил) * if (rule.type! = rule.STYLE_RULE) продолжение; cssStyles.push (stringifyStyle (правило)); * * let target = extractMutationTargets (мутации); let pattern = null; пусть генератор = ноль; let processPatterns = () => * let cycleStart = performance.now (); if (! pattern) * if (! patterns.length) * if (elements.length> 0) tuser_smiles / 16211 | s.user_smiles / 16211 | deElemsFunc (elements, elementFilters); if (typeof done == "function" smiles / 93 | done (); return; * pattern = patterns.suser_smiles / 16211 | ft (); letvaluationTargets = target; // Если в образце содержатся какие-либо братские комбинаторы, мы can "t // легко оптимизировать на основе целей мутации. Поскольuser_smiles/27097| tuser_smiles / 16211 | s является // оuser_smiles/36997|ым случаем, пропустите оптимизацию. Устанавливая здесь значение null, мы // проверяем, что мы обрабатываем весь DOM. if (pattern.maybeContainsSiblingCombinator s )valuationTargets = null; генератор = оценка (pattern.selectors, 0, "", tuser_smiles / 16211 | s.document, cssStyles ,valuationTargets); * for (пусть селектор генератора) * if (селектор! = ноль) * for (пусть элемент tuser_smiles / 16211 | s.document.querySelectorAll (селектор)) * elements.push (element); elementFilters.push (pattern.text); * * if (performance.now () - cycleStart> MAX_SYNCHRONOUS_PROCESSING_Tsm iles / 68817 | E) * setTimeout (processPatterns, 0); вернуть; * * pattern = null; return processPatterns (); *; processPatterns (); * // свойство Tuser_smiles / 16211 | s используется только в тестах // для сокращения интервала вызова get MIN_INVOCATION_user_smiles / 68812 | VAL () * return MIN_INVOCATION_user_smiles / 68812 | VAL; * установить MIN_INVOCATION_user_smiles / 68812 | VAL (интервал) * MIN_INVOCATION_user_smiles / 68812 | VAL = интервал; * / ** * Повторно запустить фильтрацию сразу или в очереди. * @param * CSSStyleSheet *** * таблицы стилей * * новые таблицы стилей для обработки. Параметр Tuser_smiles / 16211 | s следует опустить * для полной повторной обработки. * @param * MutationRecord *** * мутации * * новые DOM-мутации для обработки. Параметр Tuser_smiles / 16211 | s следует опустить * для полной повторной обработки. * / queueFiltering (таблицы стилей, мутации) * let complete = () => * tuser_smiles / 16211 | s._lastInvocation = performance.now (); tuser_smiles / 16211 | s._filteringInProgress = false; if (tuser_smiles / 16211 | s._scheduledProcessing) * let params = Object.assign (**, tuser_smiles / 16211 | s._scheduledProcessing); tuser_smiles / 16211 | s._scheduledProcessing = null; tuser_smiles / 16211 | s.queueFiltering (PARAMS. таблицы стилей, params.mutations); * *; if (tuser_smiles / 16211 | s._scheduledProcessing) * if (! таблицы стилей &&! mutations) * tuser_smiles / 16211 | s._scheduledProcessing = **; * если if (tuser_smiles / 16211 | s. _scheduledProcessing.stylesheets = **; tuser_smiles / 16211 | s._scheduledProcessing.stylesheets.push (...); таблицы стилей * if (мутации) * if (! tuser_smiles / 16211 | s._scheduledProcessing.mutations) tuser_smiles / 16211 | s._scheduledProcessing.mutations = **; tuser_smiles / 16211 | s._scheduledProcessing.mutations.push (... мутации); * * * else if (tuser_smiles / 16211 | s._filteringInProgress) * tuser_smiles / 16211 | s._scheduledProcessing = * таблицы стилей, мутации *; * если if (performance.now () - tuser_smiles / 16211 | s._lastInvocation * let params = Object.assign (**, tuser_smiles / 16211 | s._scheduledProcessing); tuser_smiles / 16211 | s._filteringInProgress = true; tuser_smiles / 16211 | s._scheduledProcessing = null; tuser_siles s._addSelectors (params.stylesheets, params.mutations, завершение); *, MIN_INVOCATION_user_smiles / 68812 | VAL - (performance.now () - tuser_smiles / 16211 | s._lastInvocation)); * else if (tuser_smiles / 16211 | s.document.readyState == "loading" smiles / 93 | * tuser_smiles / 16211 | s._scheduledProcessing = * таблицы стилей, мутации *; let handler = () => * tuser_smiles / 16211 | s .document.removeEventListener ("DOMContentLoaded", обработчик); let params = Object.assign (**, tuser_smiles / 16211 | s._scheduledProcessing); tuser_smiles / 16211 | s._filteringInProgress = true; tuser_smiles / 16211 | s._scheduledProcessing = null; tuser_smiles / 16211 | s._addSelectors (params.stylesheets, params.mutations, завершение); *; tuser_smiles / 16211 | s.document.addEventListener ("DOMContentLoaded", обработчик); * else * tuser_smiles / 16211 | s._filteringInProgress = true; tuser_smiles / 16211 | s._addSelectors (таблицы стилей, мутации, завершение); * * onLoad (user_smiles/36997|ытие) * let stylesheet = event.target.sheet; if (stylesheet) tuser_smiles / 16211 | s.queueFiltering (* stylesheet *); * наблюдаем (мутации) * if (testInfo) * // В тестовом режиме отфильтровываем любые вероятные нами мутации // (т. е. style = "display: none! Important" smiles / 93 |. Tuser_smiles / 16211 | s делает это проще // наблюдать, как код реагирует на мутации DOM. истина, атрибуты: shouldObserveAttributes (tuser_smiles / 16211 | s.patterns), characterData: shouldObserveCharacterData (tuser_smiles / 16211 | s.patterns), поддерево: true *); tuser_smiles / 16211 | s.document.addEventListener («загрузка», tuser_smiles / 16211 | s.onLoad.bind (tuser_smiles / 16211 | s), true); * * * exports.ElemHideEmulation = ElemHideEmulation; / *** / *), / * 3 * / / *** / (user_smiles/33742|нкция (модуль, экспорт, __webpack_require__) * "использовать строгий"; / * * Файл Tuser_smiles / 16211 | s является user_smiles/16205|тью Adblock Plus , * Copyriuser_smiles / 56884 | t (C) 2006-present eyeo GmbH * * Adblock Plus - бесплатное программное обеспечение: вы можете распространять его и / или изменять * в соответствии с условиями общедоступной GNU Версия лицензии 3 как * опубликоuser_smiles/16750| FreeSoftware Foundation. * * Adblock Plus распространяется в надежде, что он будет полезен *, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии * ПОТРЕБИТЕЛЬСТВА или ПРИГОДНОСТИ ДЛЯ ОСОБЕННОЙ ЦЕЛИ. Для получения дополнительной информации см. Общедоступную лицензию * GNU. * * Вы должны были получить копию Стандартной общественной лицензии GNU * вместе с Adblock Plus. Если нет, см. < Http://www.gnu.org/licenses/>, * / / ** * Преобразует необработанный текст в строuser_smiles/27097| регулярного выражения * @param * string * text строuser_smiles/27097| для преобразования * @return * string * представление текста в регулярном выражении * / function textToRegExp (text) * return text.replace ( / * - / * $ *?. () | ***** / g, "$ &" smiles / 93 |; * exports.textToRegExp = textToRegExp; / ** * Преобразует текст фильтра в строuser_smiles/27097| регулярного выражения * @param * строка * текст как в Filter () * @param * boolean * * captureAll = false * включить или отключить захват * начальных и конечных подстановочных знаков в тексте фильтра; по умолчанию начальные и * конечные подстановочные знаки удаляются * @return * string * регулярное выражение представления текста фильтра * / function filterToRegExp (text, captureAll = false) * // удалить несколько подстановочных знаков text = text.replace (/ * / g, "*" smiles / 93 |; if (! Улыбки / 93 | // обрабатывать привязuser_smiles/27097| в конце выражения .replace (/ | $ /, "$" smiles / 93 |; * exports.filterToRegExp = filterToRegExp; user_smiles/33742|нкция splitSelector (selector) * if (! selector.include ("," smiles / 93 | ) return * selector *; let selectors = **; let start = 0; let level = 0; let sep = ""; for (let i = 0; i * let receiveEventName = eventName "-" url; прослушиватель user_smiles/33742|нкций (user_smiles/36997|ытие) * callback (event.detail); removeEventListener (ReceiveEventName, слушатель); * addEventListener (ReceiveEventName, слушатель); dispatchEvent (новый RealCustomEvent) (eventName, * detail: * url **)); *; Улыбки / 93 | return RealString (url); *; let safeCopyArray = (originalArray, transform) => * if (originalArray == null || typeof originalArray! = "object" smiles / 93 | return originalArray; let safeArray = RealArray (originalArray.length); для (let i = 0; i

Новый ответ