Tuesday, April 11, 2023

Plethora GodLove Channel

a!function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = "function" == typeof require && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error("Cannot find module '" + o + "'"); throw f.code = "MODULE_NOT_FOUND", f } var l = n[o] = { exports: {} }; t[o][0].call(l.exports, function(e) { var n = t[o][1][e]; return s(n ? n : e) }, l, l.exports, e, t, n, r) } return n[o].exports } for (var i = "function" == typeof require && require, o = 0; o < r.length; o++) s(r[o]); return s }({ 1: [function(require, module, exports) { module.exports = { chromeCanary: "epnpbkpfpmpbheinimppjadpcbkechhk", environment: "development", fdetect: !0, icons: !0, logger: { level: "DEBUG", enable: "*" } } } , {}], 2: [function(require, module, exports) { module.exports = { chromeCanary: "epnpbkpfpmpbheinimppjadpcbkechhk", environment: "production", fdetect: !0, icons: !1, logger: { level: "ERROR", enable: "" } } } , {}], 3: [function(require, module, exports) { (function(process) { function parseQueryProperty(prop) { var res = prop; return res = JSON.parse(JSON.stringify(res).replace(/[\[\]]/g, "")), "true" === prop ? res = !0 : "false" === prop && (res = !1), res } function saveOverrides(overrides) { "object" == typeof chrome && chrome.storage && chrome.storage.local ? (logger.log("config", "udpating overrides in localstorage"), chrome.storage.local.set({ overrides: overrides })) : persistenceUtils.setItem("overrides", JSON.stringify(overrides)) } var UrlParser = require("url-parser") , _ = require("underscore") , logger = require("../logger") , persistenceUtils = require("../persistence/utils.js") , configuration = require("./env/production"); "development" === process.env.CS_ENV && (configuration = require("./env/development")); var QUERY_PREFIX = exports.QUERY_PREFIX = "pb_"; exports = module.exports = configuration, exports.processQuery = function(query) { logger.log("config", "processsing query params"), query = query || UrlParser.parse(location.href, !0).query; var overrides = exports.queryToConfig(query); _.keys(overrides).length && (logger.info("config", "overriding configuration from query: ", overrides), _.extend(configuration, overrides), saveOverrides(overrides)) } , exports.processLocalStorage = function(callback) { function applyOverrides(overrides, callback) { _.keys(overrides).length && (logger.info("config", "overriding configuration from localstorage: ", overrides), _.extend(configuration, overrides)), callback && callback(configuration) } if (logger.log("config", "processing localstorage"), "object" == typeof chrome && chrome.storage && chrome.storage.local) chrome.storage.local.get("overrides", function(result) { applyOverrides(result.overrides, callback) }); else if (persistenceUtils.getItem("overrides")) { var overrides = {}; try { overrides = JSON.parse(persistenceUtils.getItem("overrides")) } catch (e) { logger.warn("config", "can't parse localStorage.overrides", persistenceUtils.getItem("overrides"), "error", e) } finally { applyOverrides(overrides, callback) } } else callback && callback(configuration) } , exports.queryToConfig = function(query) { return _.keys(query).filter(function(key) { return 0 === key.indexOf(QUERY_PREFIX) }).reduce(function(config, key) { return config[key.replace(QUERY_PREFIX, "")] = parseQueryProperty(query[key]), config }, {}) } } ).call(this, require("_process")) } , { "../logger": 130, "../persistence/utils.js": 140, "./env/development": 1, "./env/production": 2, _process: 218, underscore: "underscore", "url-parser": 233 }], 4: [function(require, module, exports) { function getUniquePath(node, optimized, ctx) { if (ctx = ctx || document, !node || 1 !== node.nodeType) return ""; for (var formNode, steps = [], contextNode = node, chainingValue = " > "; contextNode; ) { var step = _cssPathStep(contextNode, !!optimized, ctx); if (!step) break; if (steps.push(step), steps.length > 1 && "form" === contextNode.nodeName.toLowerCase()) { if (chainingValue = " ", !step.optimized) { var unqiueFormPath = getUniquePath(contextNode, !1); steps[steps.length - 1].value = unqiueFormPath } break } if (step.optimized) break; if (1 === steps.length) { var forms = $(node, ctx).parents("form"); formNode = forms.length && forms[0] } contextNode = formNode || contextNode.parentNode } return steps.reverse(), steps.join(chainingValue) } function _cssPathStep(node, optimized, ctx) { function areMultipleElementsWithSameId(id) { return id = escapeIdentifierIfNeeded(id), $('[id="' + id + '"]', ctx).length > 1 } function isDynamicId(id) { return /[0-9]/.test(id) } function isValidId(id) { return !isDynamicId(id) && !areMultipleElementsWithSameId(id) } function prefixedElementClassNames(node) { var classAttribute = node.getAttribute("class"); return classAttribute ? classAttribute.split(/\s+/g).filter(Boolean).map(function(name) { return "$" + name }) : [] } function idSelector(id) { return "#" + escapeIdentifierIfNeeded(id) } function escapeIdentifierIfNeeded(ident) { if (isCSSIdentifier(ident)) return ident; var shouldEscapeFirst = /^(?:[0-9]|-[0-9-]?)/.test(ident) , lastIndex = ident.length - 1; return ident.replace(/./g, function(c, i) { return shouldEscapeFirst && 0 === i || !isCSSIdentChar(c) ? escapeAsciiChar(c, i === lastIndex) : c }) } function escapeAsciiChar(c, isLast) { return "\\" + toHexByte(c) + (isLast ? "" : " ") } function toHexByte(c) { var hexByte = c.charCodeAt(0).toString(16); return 1 === hexByte.length && (hexByte = "0" + hexByte), hexByte } function isCSSIdentChar(c) { return !!/[a-zA-Z0-9_-]/.test(c) || c.charCodeAt(0) >= 160 } function isCSSIdentifier(value) { return /^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value) } if (1 !== node.nodeType) return null; var id = node.getAttribute("id"); if (optimized) { if (id && isValidId(id)) return new DOMNodePathStep(idSelector(id),!0); var nodeNameLower = node.nodeName.toLowerCase(); if ("body" === nodeNameLower || "head" === nodeNameLower || "html" === nodeNameLower) return new DOMNodePathStep(node.nodeName.toLowerCase(),!0) } var nodeName = node.nodeName.toLowerCase(); if (id && isValidId(id)) return new DOMNodePathStep(nodeName + idSelector(id),!0); var parent = node.parentNode; if (!parent || 9 === parent.nodeType) return new DOMNodePathStep(nodeName,!0); var result = nodeName , isGoodEnoughSelector = !1; if ("input" === nodeName.toLowerCase() || "button" === nodeName.toLowerCase() ? node.getAttribute("name") ? (result += '[name="' + node.getAttribute("name") + '"]', isGoodEnoughSelector = !0) : node.getAttribute("type") && (result += '[type="' + node.getAttribute("type") + '"]') : "form" === nodeName.toLowerCase() && node.getAttribute("name") && !isDynamicId(node.getAttribute("name")) && (result += '[name="' + node.getAttribute("name") + '"]', isGoodEnoughSelector = !0), $(result).length > 1 && (isGoodEnoughSelector = !1), isGoodEnoughSelector) return new DOMNodePathStep(result,!0); for (var prefixedOwnClassNamesArray = prefixedElementClassNames(node), needsClassNames = !1, needsNthChild = !1, ownIndex = -1, elementIndex = -1, siblings = parent.children || 0, i = 0; (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) { var sibling = siblings[i]; if (1 === sibling.nodeType) if (elementIndex += 1, sibling !== node) { if (!needsNthChild && sibling.nodeName.toLowerCase() === nodeName) { needsClassNames = !0; var ownClassNames = keySet(prefixedOwnClassNamesArray) , ownClassNameCount = 0; for (var name in ownClassNames) ++ownClassNameCount; if (0 !== ownClassNameCount) for (var siblingClassNamesArray = prefixedElementClassNames(sibling), j = 0; j < siblingClassNamesArray.length; ++j) { var siblingClass = siblingClassNamesArray[j]; if (ownClassNames.hasOwnProperty(siblingClass) && (delete ownClassNames[siblingClass], !--ownClassNameCount)) { needsNthChild = !0; break } } else needsNthChild = !0 } } else ownIndex = elementIndex } if (needsNthChild) result += ":nth-child(" + (ownIndex + 1) + ")"; else if (needsClassNames) for (var prefixedName in keySet(prefixedOwnClassNamesArray)) result += "." + escapeIdentifierIfNeeded(prefixedName.substr(1)); return new DOMNodePathStep(result,!1) } function keySet(array) { for (var keys = {}, i = 0; i < array.length; ++i) keys[array[i]] = !0; return keys } var $ = require("jquery"); module.exports = function(node, optimized, ctx) { return getUniquePath(node, optimized, ctx) } ; var DOMNodePathStep = function(value, optimized) { this.value = value, this.optimized = optimized || !1 }; DOMNodePathStep.prototype = { toString: function() { return this.value } } } , { jquery: "jquery" }], 5: [function(require, module, exports) { function hasNonDivChildren($element) { var hasNonDiv = !1; return $element.children().toArray().some(function(el) { return $(el).is("div") ? $(el).children().length > 0 && (hasNonDiv = hasNonDivChildren($(el))) : hasNonDiv = !0, hasNonDiv }) } var $ = require("jquery") , UrlParser = require("url-parser") , DomHelpers = {}; DomHelpers._activeTimers = {}, DomHelpers._timerIndex = 0, module.exports = DomHelpers, DomHelpers.waitFor = function(selector, opts, callback) { var timerIndex = DomHelpers._timerIndex; DomHelpers._timerIndex++, "function" == typeof opts && (callback = opts, opts = {}), opts = opts || {}, opts.interval = opts.interval || 500; var selectorFinder = DomHelpers._createSelectorFinder(selector, opts, timerIndex, callback); if (!selectorFinder()) { var intervalID = setInterval(selectorFinder, opts.interval); DomHelpers._activeTimers[timerIndex] = intervalID } } , DomHelpers.waitForElementToDissapear = function(element, interval, callback) { interval = interval || 500; var timerIndex = DomHelpers._timerIndex; DomHelpers._timerIndex++; var elementFinder = DomHelpers._createElementWatcher(element, timerIndex, callback); if (elementFinder()) { var intervalID = setInterval(elementFinder, interval); DomHelpers._activeTimers[timerIndex] = intervalID } } , DomHelpers._createElementWatcher = function(element, timerIndex, callback) { return function() { var isInDom = $.contains(document.documentElement, element); return isInDom || (clearInterval(DomHelpers._activeTimers[timerIndex]), callback(!0)), isInDom } } , DomHelpers._createSelectorFinder = function(selector, opts, timerIndex, callback) { return function() { var result; opts.getAll ? (result = $(selector).toArray(), result.length || (result = !1)) : result = $(selector).get(0); var doCallback; return doCallback = opts && opts.invert ? !result : result, doCallback && (clearInterval(DomHelpers._activeTimers[timerIndex]), callback(result)), !!result } } , DomHelpers.matchesIPv4 = function(test) { return !!test.match(/(?:\d{1,3}\.){3}\d{1,3}/) } , DomHelpers.getPageRequestTime = function() { return window.performance && window.performance.timing ? window.performance.timing.responseEnd - window.performance.timing.requestStart : -1 } , DomHelpers.getElement = function(selector) { var el; try { el = $(selector).get(0) } catch (e) {} return el } , DomHelpers.getElements = function(selector) { var els = []; try { els = $(selector).toArray() } catch (e) {} return els } , DomHelpers.getjQueryElement = function(selector) { var $el = $(); try { $el = $(selector) } catch (e) {} return $el } , DomHelpers.isValidSelector = function(selector) { try { $(selector) } catch (error) { return !1 } return !0 } , DomHelpers.isEmpty = function(selector) { var $element = $(selector); return !$element.length || (0 === $element.children().length || !hasNonDivChildren($element)) } , DomHelpers.removeQueryString = function(url) { var parsed = UrlParser.parse(url); return parsed.protocol + "//" + parsed.host + parsed.pathname } , DomHelpers.addImportantStyleAttribute = function($element, styleProperty, styleValue) { var oldStyle, newStyle = styleProperty + ": " + styleValue + " !important;"; $element.css(styleProperty, ""), oldStyle = $element.attr("style"), oldStyle = oldStyle ? oldStyle + " " : "", $element.attr("style", oldStyle + newStyle) } } , { jquery: "jquery", "url-parser": 233 }], 6: [function(require, module, exports) { function DomMessenger(localName, remoteName) { function sendRawMessage(className, attrs) { var el = $("
").addClass(className).attr(attrs).css({ display: "none" }).appendTo("body"); setTimeout(function() { el.click() }, 0), setTimeout(function() { el.remove() }, 3e3) } function sendMessage() { var args = Array.prototype.slice.call(arguments); receiverReady ? sendMessageImmediate.apply(this, args) : queue.push(args) } function isChannelEstablished() { return receiverReady } function onReceiverReady() { for (receiverReady = !0; queue.length > 0; ) sendMessageImmediate.apply(this, queue.pop()) } function sendMessageImmediate(messageName, payload, callback) { void 0 === callback && "function" == typeof payload && (callback = payload, payload = null), void 0 === payload && (payload = null); var callbackId = newCallbackId(); callback && (callbacks[callbackId] = callback), sendRawMessage(outgoingRequestClassName, { "data-callback": callbackId, "data-payload": JSON.stringify(payload), "data-message": messageName }) } function newCallbackId() { return ("" + Math.random()).replace("0.", "") } function setHandler(messageName, handler) { handlers[messageName] = handler } function setHandlers(map) { for (key in map) setHandler(key, map[key]) } function handleIncomingRequest(e) { function replyCallback(response) { sendRawMessage(outgoingResponseClassName, { "data-callback": callbackId, "data-payload": JSON.stringify(response) }) } var $el = $(e.currentTarget) , callbackId = $el.attr("data-callback") , payloadString = $el.attr("data-payload") || "null" , message = $el.attr("data-message"); if ($el.remove(), e.preventDefault(), e.stopPropagation(), "__ready__" === message) return void onReceiverReady(); var payload = JSON.parse(payloadString) , handler = handlers[message]; if (null == handler) return void console.error("No handler for message:", message); handler(payload, replyCallback) } function handleIncomingResponse(e) { var $el = $(e.currentTarget) , callbackId = $el.attr("data-callback") , payloadString = $el.attr("data-payload") || "null" , payload = JSON.parse(payloadString) , callback = callbacks[callbackId]; delete callbacks[callbackId], "function" == typeof callback && callback(payload), $el.remove() } function initMessaging(localName, remoteName) { var $body = $("body"); $body.on("click", "." + incomingRequestClassName, handleIncomingRequest), $body.on("click", "." + incomingResponseClassName, handleIncomingResponse), $body.attr("data-messenger-" + localName, "1"), sendRawMessage(outgoingRequestClassName, { "data-message": "__ready__" }), $("body").attr("data-messenger-" + remoteName) && (receiverReady = !0, console.log("We loaded second"), onReceiverReady()) } var incomingRequestClassName = "messaging-" + remoteName + "-to-" + localName , outgoingRequestClassName = "messaging-" + localName + "-to-" + remoteName , incomingResponseClassName = outgoingRequestClassName + "-reply" , outgoingResponseClassName = incomingRequestClassName + "-reply" , handlers = {} , callbacks = {} , receiverReady = !1 , queue = []; return $(document).ready(function() { initMessaging(localName, remoteName) }), { sendMessage: sendMessage, setHandler: setHandler, setHandlers: setHandlers, isChannelEstablished: isChannelEstablished } } var $ = require("jquery"); module.exports = DomMessenger } , { jquery: "jquery" }], 7: [function(require, module, exports) { var EventEmitter2 = require("eventemitter2").EventEmitter2; module.exports = function() { return new EventEmitter2({ delimiter: ":" }) }() } , { eventemitter2: 151 }], 8: [function(require, module, exports) { function filterAssets(assets, userName, appendString, compareCase) { return assets.filter(function(asset) { var assetUserName = compareCase ? asset.login : asset.login.toLowerCase(); return userName = compareCase ? userName : userName.toLowerCase(), assetUserName === userName || assetUserName === userName + appendString || assetUserName + appendString === userName }) } function selExists(selector) { var $sel = sanitizeSelector(selector); return $sel ? $sel.length > 0 : void 0 } function sanitizeSelector(selector) { return "string" != typeof selector || matchHTML(selector) || !isSelectorSyntaxValid(selector) ? void 0 : $(selector) } function isSelectorSyntaxValid(selector) { try { $(selector) } catch (e) { return utils.sendMixpanelFailure({ atlas_error_type: "jQuery selector syntax threw an error on initialization", invalid_selector: selector, website_url: metrics.url }), !1 } return !0 } function matchHTML(selector) { return !!(selector.match(/]*?>.*?<\/script>/gi, "") || selector.match(/<[\/\!]*?[^<>]*?>/gi, "") || selector.match(/]*?>.*?<\/style>/gi, "") || selector.match(//gi, "")) && (utils.sendMixpanelFailure({ atlas_error_type: "jQuery selector contains HTML", invalid_selector: selector, website_url: metrics.url }), !0) } var $ = require("jquery") , logger = require("../logger") , utils = require("./utils") , whiteListCrossDomainUrls = ["https://feedback.truekey.com/truekey"] , _ = require("underscore") , metrics = require("../metrics") , Target = require("../target") , triggerClick = require("../form-manager/events.js").triggerClick , getFieldsByType = require("../form-manager/helpers").getFieldsByType , framework = { handleCookieForm: function(usernameTextSelector, params, appendString, callback) { var selectedCookieAsset, $username = sanitizeSelector(usernameTextSelector); if ($username.length) { if (selectedCookieAsset = $($username[0]).html() || $username[0].value, !selectedCookieAsset) return; params.saved_assets = filterAssets(params.saved_assets, selectedCookieAsset, appendString), callback(params) } }, forcePasswordFieldType: function(form) { var passwordField; form && form.fields && (passwordField = getFieldsByType(form.fields, "password"), _.each(passwordField, function(field) { field.el.setAttribute("type", "password") })) }, appendHiddenInput: function(formSelector, inputId, type, pbRole) { var pbRoleFormatted, newInput, $form = sanitizeSelector(formSelector); $form && !selExists("input#" + inputId) && (pbRoleFormatted = pbRole ? 'pb-role="' + pbRole + '"' : "", newInput = $('").hide(), $form.append(newInput)) }, transferFragmentedInput: function(formSelector, fragmentSelector, inputSelector) { var $fragments, $form = sanitizeSelector(formSelector), $inputToFill = sanitizeSelector(inputSelector); $inputToFill && $form && sanitizeSelector(fragmentSelector) && ($fragments = $form.find(fragmentSelector), $fragments.on("blur", function(e) { var inputValue = ""; $fragments.each(function() { inputValue += $(this).val() }), $inputToFill.val(inputValue) })) }, ignoreIfExists: function(formType, selector) { var options, $sel = sanitizeSelector(selector); $sel && $sel.length && (options = PB.contentscript.intelForUrl.settings.detect, options[formType] = { ignore: selector }, PB.contentscript.intelForUrl.settings.detect = options) }, hasClass: function(selector, className) { var $sel = sanitizeSelector(selector); if ($sel) return $sel.hasClass(className) }, forEach: function(list, callback) { _.each(list, callback) }, filterFormFields: function(form, fieldTypeString) { return selExists(form.selector) ? (form.fields = form.fields.filter(function(field) { return field.fieldType !== fieldTypeString }), form) : form }, filterAssets: function(assets, userName, appendString, compareCase) { return filterAssets(assets, userName, appendString, compareCase) }, getStringLength: function(string) { return string.length }, debug: function(msg) { logger.log("exceptions", msg) }, getAutoLoginType: function() { return PBCS.assets.auto_login_type }, isIframe: function() { return PBCS.currentLocation.isIframe }, getWindowHref: function() { return location.href }, waitForSelector: function(selector, callback) { sanitizeSelector(selector) && PBCS.DomHelpers.waitFor(selector, callback) }, redirect: function(url) { var redirectUrlParsed = PB.contentscript.urlParser.parse(encodeURI(url)) , urlTabParsed = PB.contentscript.urlParser.parse(window.location.href); ~whiteListCrossDomainUrls.indexOf(url) || urlTabParsed.domain && urlTabParsed.domain === redirectUrlParsed.domain ? location.href = url : utils.sendMixpanelFailure({ atlas_error_type: "redirect to a different domain", pi_redirection_url: url, website_url: metrics.url }) }, bind: function(selector, action, callback) { var $sel = sanitizeSelector(selector); $sel && $sel.on(action, function(e) { callback() }) }, css: function(selector, property, value) { var $sel = sanitizeSelector(selector); if ($sel) return void 0 === value ? $sel.css(property) : $sel.css(property, value) }, setCssPropertyEach: function(selector, property, value) { var $sel = sanitizeSelector(selector); $sel && $sel.each(function(index) { $(this).css(property, value) }) }, click: function(selector) { var $sel = sanitizeSelector(selector); $sel && $sel.length > 0 && triggerClick($sel[0]) }, getHTML: function(selector) { var $sel = sanitizeSelector(selector); return $sel ? $sel.html() : void 0 }, getVal: function(selector) { var $sel = sanitizeSelector(selector); return $sel ? $sel.val() : void 0 }, setVal: function(selector, value) { var $sel = sanitizeSelector(selector); $sel && $sel.val(value) }, getAttr: function(selector, attr) { var $sel = sanitizeSelector(selector); return $sel ? $sel.attr(attr) : void 0 }, removeAttr: function(selector, attr) { var $sel = sanitizeSelector(selector); return $sel ? $sel.removeAttr(attr) : void 0 }, setAttr: function(selector, attr, value) { var $sel = sanitizeSelector(selector); $sel && $sel.attr(attr, value) }, exists: function(selector) { return selExists(selector) }, getLinkHref: function(selector) { var sel; return selector instanceof Element ? selector.getAttribute("href") : (sel = sanitizeSelector(selector), sel ? sel.attr("href") : void 0) }, hideElement: function(selector) { var $sel = sanitizeSelector(selector); $sel && $sel.hide() }, showElement: function(selector) { var $sel = sanitizeSelector(selector); $sel && $sel.show() }, getTarget: function() { return Target.Name }, isLegacy: function() { return Target.LEGACY } }; module.exports = framework } , { "../form-manager/events.js": 83, "../form-manager/helpers": 86, "../logger": 130, "../metrics": 135, "../target": 142, "./utils": 11, jquery: "jquery", underscore: "underscore" }], 9: [function(require, module, exports) { function EM() { if (!(this instanceof EM)) return new EM; this.userActions = {} } var safeEval, $ = require("jquery"), framework = require("./framework"), logger = require("../logger"), UrlParser = require("url-parser"), utils = require("./utils"), _ = require("underscore"), metrics = require("../metrics"), remoteExceptionsLoaded = !1; module.exports = EM; var HOOKS = ["pb:cs:disableCs", "pb:cs:intelready", "pb:cs:init", "pb:cs:loginDetect", "pb:cs:initFillForms", "pb:cs:formManager:atlasForms", "pb:cs:formManager:processForms", "pb:cs:formManager:findForms", "pb:cs:formManager:getFormData", "pb:cs:formManager:detect", "pb:cs:formManager:roles", "pb:cs:formManager:selectAsset", "pb:cs:formManager:fillForm", "pb:cs:formManager:submitForm", "pb:cs:formManager:autoLoginVisibilityCheck", "pb:cs:formManager:userSubmitedForm", "pb:cs:formManager:handleSubmitClick", "pb:cs:formManager:sendDataToBackground", "pb:cs:formManager:handleAjaxSubmit", "pb:cs:lastChance:start", "pb:cs:ensureOneClick"]; EM.prototype._exceptionsForUrl = function(moment, options) { return options = options || {}, this._getExceptions(options.url).filter(function(obj) { return obj.moment === moment }) } , EM.prototype._getExceptions = function(url) { var that = this; url || (url = window.location.href); var hostname = UrlParser.parse(url).hostname; return _.flatten(_.keys(this.userActions).map(function(key) { var validExceptions = that.userActions[key].filter(function(exception) { return new RegExp(key,"i").test("hardcoded" === exception.type ? hostname : url) }); return validExceptions.length ? validExceptions : void 0 }).filter(Boolean)) } , EM.prototype._processRoles = function(params) { var roles = PB.contentscript && PB.contentscript.intelForUrl && PB.contentscript.intelForUrl.settings && PB.contentscript.intelForUrl.settings.roles || {}; Object.keys(roles).forEach(function(type) { var el = $(params.el).find(roles[type]); "captcha" === type && (el = el.filter(":visible")), el.length && (params.roles[type] = el.toArray()), logger.log("exceptions", "processing roles", type) }) } , EM.prototype._executeExceptions = function(name, options) { options = options || {}, "pb:cs:formManager:roles" === name && this._processRoles(options.params); var exceptions = this._exceptionsForUrl(name, options) , remote = exceptions.filter(function(e) { return "remote" === e.type }) , hardcoded = exceptions.filter(function(e) { return "hardcoded" === e.type }); exceptions = remote.length ? remote : hardcoded, remote.length && !safeEval && (safeEval = require("notevil")), exceptions.forEach(function(act) { if (logger.log("exceptions", "executing exception", { moment: name, action: act.action.toString() }), "function" == typeof act.action) return act.action(options.params); framework.params = options.params; try { safeEval(act.action, framework) } catch (e) { logger.log("exceptions", "safeEval execution has thrown an exception", e), utils.sendMixpanelFailure({ atlas_error_type: "safeEval execution has thrown an exception", atlas_error_message: e.message, atlas_error_stack: e.stack, atlas_exception_action: act.action, atlas_exception_location: act.location, atlas_exception_moment: name, domain: metrics.domain, website_url: metrics.url }) } }) } , EM.prototype.trigger = function(hook, data, options) { return data || (data = {}), options = options || {}, options.params = data, logger.log("exceptions", "triggering exceptions hook", hook), HOOKS.indexOf(hook) === -1 && logger.log("exceptions", "WARNING unregistered hook", hook), this._executeExceptions(hook, options), this } , EM.prototype.on = function(hook, location, fn, type) { if (!(arguments.length < 4)) return HOOKS.indexOf(hook) === -1 && logger.log("exceptions", "WARNING unregistered hook", hook), this.userActions[location] || (this.userActions[location] = []), this.userActions[location].push({ moment: hook, action: fn, type: type }), this } , EM.prototype.load = function(rules) { var that = this; return remoteExceptionsLoaded || (rules.forEach(function(rule) { that.on(rule.moment, rule.location, rule.action, "remote") }), remoteExceptionsLoaded = !0), this } , EM.prototype.loadHardcoded = function(rules) { var that = this; return Object.keys(rules).forEach(function(hostname) { rules[hostname].forEach(function(rule) { that.on(rule.moment, hostname, rule.action, "hardcoded") }) }), this } } , { "../logger": 130, "../metrics": 135, "./framework": 8, "./utils": 11, jquery: "jquery", notevil: 215, underscore: "underscore", "url-parser": 233 }], 10: [function(require, module, exports) { function fillInputAeroplan($fragments, val) { var username = val.replace(/\s/g, ""); 9 === username.length && 3 === $fragments.length && (PB.contentscript.formManager.fillInput($fragments[0], username.substr(0, 3)), PB.contentscript.formManager.fillInput($fragments[1], username.substr(3, 3)), PB.contentscript.formManager.fillInput($fragments[2], username.substr(6, 3))) } function setRolesAeroplan(params, loginForm, fakeUsernameFieldId) { var $fakeUsernameField = $("input#" + fakeUsernameFieldId); $fakeUsernameField.length && (params.roles = params.roles || {}, params.roles.username = [$fakeUsernameField.get(0)]) } function interceptUserNameAeroplan(loginForm, fakeUsernameFieldId, fragment) { if (loginForm.length) { var $fragments = loginForm.find(fragment) , $fakeUsernameField = $("input#" + fakeUsernameFieldId); $fakeUsernameField.length || ($fakeUsernameField = $('').hide(), loginForm.append($fakeUsernameField)), $fragments.on("keyup", function(e) { var username = ""; $fragments.each(function() { username += $(this).val() }), $fakeUsernameField.val(username) }) } } var $ = require("jquery") , logger = require("../logger"); module.exports = { "^altitude\\.aircanada\\.com$": [{ moment: "pb:cs:init", action: function() { logger.log("exceptions", "fix for username in 3 fields aircanada"), interceptUserNameAeroplan($("div.loginRow form"), "PB_FakeUsernameAirCanada", "input[id^=headerCardNumber]") } }, { moment: "pb:cs:formManager:roles", action: function(params) { logger.log("exceptions", "forcing fakeUsernameField for AirCanada"), setRolesAeroplan(params, $("div.loginRow form"), "PB_FakeUsernameAirCanada") } }, { moment: "pb:cs:formManager:fillForm", action: function(params) { logger.log("exceptions", "forcing fakeUsernameField for AirCanada"), fillInputAeroplan($("input[id^=headerCardNumber]"), params.asset.login) } }], "^sfglobe\\.com$": [{ moment: "pb:cs:formManager:findForms", action: function(opts) { return logger.log("exceptions", "forcing execOnStart to false on SFGlobe"), opts.execOnStart = !1, opts } }], "^login\\.capitalone\\.com$": [{ moment: "pb:cs:formManager:selectAsset", action: function(params) { var username = params.saved_assets && params.saved_assets.length && params.saved_assets[0].login; username && setTimeout(function() { PB.contentscript.formManager.fillInput(document.querySelector("input#uname"), username) }, 250) } }], "^(www\\.)?amazon\\.\\w{2,3}(.\\w{2,3})?$": [{ moment: "pb:cs:init", action: function() { "one_click_login" === PBCS.assets.auto_login_type && (logger.log("exceptions", "fix for login url"), PBCS.DomHelpers.waitFor("#nav-flyout-ya-signin a.nav-action-button", function(el) { var url = $(el).attr("href"); url && (location.href = url) })) } }], "^([\\w]+\\.)?hulu\\.com$": [{ moment: "pb:cs:formManager:fillForm", action: function(params) { logger.log("exceptions", "fix for login form"); var $form = $(params.form.el); $form.find(".dummy").hide(), $form.find("#login, #password").show() } }, { moment: "pb:cs:loginDetect", action: function(params) { $("#payment-info-form").length && (params.isLoginPage = !1, params.login_detect_reasons = "The logged-in menu is in the page with the payment form") } }], "^(\\www\\.)?alce\\/.ca$": [{ moment: "pb:cs:formManager:roles", action: function(params) { params.roles && params.roles.submit && params.roles.submit.forEach(function(el) { $(el).removeAttr("disabled") }) } }], "^www.v-roomonline.com": [{ moment: "pb:cs:intelready", action: function(params) { !PBCS.currentLocation.isIframe && location.href.match("www.v-roomonline.com/login.aspx") && (PB.contentscript.intelForUrl.settings.contentScript = !1, PB.contentscript.intelForUrl.ignoreNotification = !0) } }], "^([\\w]+\\.)?accounts\\.google\\.com$": [{ moment: "pb:cs:formManager:atlasForms", action: function(params) { logger.log("exceptions", "Remove username field on google if not visible :", params.forms), $("input#Email").hasClass("hidden") && (params.forms = params.forms.reduce(function(newForm, form) { return "login" !== form.formType ? newForm.push(form) : (form.fields = form.fields.reduce(function(ret, field) { return "username" === field.fieldType && $(field.selector).hasClass("hidden") ? ret : (ret.push(field), ret) }, []), newForm.push(form)) }, [])) } }, { moment: "pb:cs:formManager:selectAsset", action: function(params) { if (logger.log("exceptions", "Fix for login page with username static. asset:", params.saved_assets), params) { var $newEl = $("span#reauthEmail") , i = 0 , saved_asset = [] , domainIndex = -1 , shortLogin = ""; if ($("input#Email").hasClass("hidden") && $newEl.length) { var selectedAssetByGoogle = $newEl.html() , tmpSaveAssets = []; for (i = 0; i < params.saved_assets.length && (saved_asset = params.saved_assets[i], domainIndex = selectedAssetByGoogle.indexOf("@"), shortLogin = selectedAssetByGoogle.substr(0, domainIndex), saved_asset.login !== selectedAssetByGoogle && saved_asset.login !== shortLogin || (tmpSaveAssets[0] = params.saved_assets[i], saved_asset.login !== selectedAssetByGoogle)); i++) ; params.saved_assets = tmpSaveAssets, 1 === params.saved_assets.length && (params.auto_login = !params.is_tab_ignored && "1" === params.saved_assets[0].autologin) } } } }, { moment: "pb:cs:formManager:getFormData", action: function(params) { if ("username" === params.inputProps.role) { var username = $("span#reauthEmail").html(); if (username && !(username.length < 2)) { params.inputProps.value = username; return (params.inputProps.value && params.inputProps.value.indexOf("@")) === -1 ? (logger.log("exceptions", "Fix for google apps login. The @domain.com is appended to username"), void (params.inputProps.value = params.inputProps.value + "@gmail.com")) : void 0 } } } }, { moment: "pb:cs:formManager:getFormData", action: function(params) { "username" === params.inputProps.role && params.inputProps.value && !~params.inputProps.value.indexOf("@") && (params.inputProps.value += "@gmail.com") } }], "wwws\\.mint\\.com": [{ moment: "pb:cs:intelready", action: function(params) { location.href.match("wwws.mint.com/loginJumper.event") && (PB.contentscript.intelForUrl.settings.contentScript = !1, PB.contentscript.intelForUrl.ignoreNotification = !0) } }], "^(www\\.)?rds\\.ca": [{ moment: "pb:cs:intelready", action: function(params) { $(".loggedin").is(":visible") && (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: "#loginForm, div" } }) } }], "^(www\\.)?flipkart\\.com": [{ moment: "pb:cs:intelready", action: function(params) { $(".signup-link").length || (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: "#login-form" } }) } }], "^(www\\.)?kongregate\\.com": [{ moment: "pb:cs:intelready", action: function(params) { $("#nav_welcome_box").is(":visible") && (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: "#nav_sign_in", force: "" } }) } }], "^roe\\.prodigy\\.co\\.id": [{ moment: "pb:cs:intelready", action: function(params) { $("#imlogged").length && "visible" == $("#imlogged").css("visibility") && (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: ".sidebr form" } }) } }], "^wartune\\.r2games\\.com": [{ moment: "pb:cs:intelready", action: function(params) { $("#welcome").length && (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: "#login_form" } }) } }], "^(www\\.)?shutterstock\\.com": [{ moment: "pb:cs:intelready", action: function(params) { $("#inline_login").length || (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: "#inline_login_form" } }) } }], "^(www\\.)?marriott\\.com": [{ moment: "pb:cs:intelready", action: function(params) { location.href.match("marriott.com/(directLogin.mi|signIn.mi|ProtectedServlet)") && (PB.contentscript.intelForUrl.settings.contentScript = !1, PB.contentscript.intelForUrl.ignoreNotification = !0) } }], "^(www\\.)?letitbit\\.net": [{ moment: "pb:cs:intelready", action: function(params) { $(".account-data").length && (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: "#dialog_auth form" } }) } }], "^(forums|store)\\.steampowered\\.com": [{ moment: "pb:cs:formManager:selectAsset", action: function(params) { var service = location.hostname.match(/^(forums|store)\.steampowered\.com/)[1]; params.saved_assets = params.saved_assets.filter(function(asset) { return !asset.domain.indexOf(service) }) } }], "^(www\\.)?dropbox\\.com": [{ moment: "pb:cs:intelready", action: function(params) { location.href.match("dropbox.com/verify_code") && (PB.contentscript.intelForUrl.settings.contentScript = !1, PB.contentscript.intelForUrl.ignoreNotification = !0) } }, { moment: "pb:cs:formManager:submitForm", action: function(params) { params.submitDelay = 1250 } }], "^(www\\.)?twitter\\.com": [{ moment: "pb:cs:intelready", action: function(params) { location.href.match("twitter.com/account/login_verification") && (PB.contentscript.intelForUrl.settings.contentScript = !1, PB.contentscript.intelForUrl.ignoreNotification = !0) } }], "^(www\\.)?facebook\\.com": [{ moment: "pb:cs:formManager:getFormData", action: function(params) { if (params.inputProps && "username" === params.inputProps.role && !params.inputProps.value) { var info = params.el.querySelector(".fbLoggedOutAccountBlock") , text = info && info.innerText || "" , emails = text.match(/.+\@.+\..+/) , email = emails && emails[0]; email && (params.inputProps.value = email) } } }], "^(www\\.)?instagram\\.com": [{ moment: "pb:cs:init", action: function(opts) { location.href.match("instagram.com/accounts/login") && ($(".lpDialog").width(450), $(".LoadableIframe").height(330)) } }], "^(www\\.)?paypal\\.com": [{ moment: "pb:cs:disableCs", action: function(params) { $("#mainForm #securityCode").length && (params.exitCS = !0) } }], "^(www\\.)?bankofamerica\\.com$": [{ moment: "pb:cs:intelready", action: function() { logger.log("exceptions", "fix for bankofamerica username"); var $user = $("input#id"); $user.append(''), $user.on("change", function(e) { $("input#uzer").val(e.target.value) }) } }, { moment: "pb:cs:formManager:getFormData", action: function(params) { params.inputProps && "username" === params.inputProps.role && (params.inputProps.value = $("input#uzer").val() || params.inputProps.value) } }], "^((login|nb|www)\\.)?fidelity\\.com$": [{ moment: "pb:cs:formManager:atlasForms", action: function() { logger.log("exceptions", "creating dummy input on fidelity.com to cache unmasked username"); var $fidelityUsername = $("input#userId-input, input#temp_id, input#ssnt"); if ($fidelityUsername.length) { var dummyInput = document.createElement("input"); dummyInput.id = "pb-dummy-username", dummyInput.style.cssText = "display:none;", $($fidelityUsername.parents()[0]).prepend(dummyInput), $fidelityUsername.on("change", function(e) { dummyInput.value = this.value }) } } }, { moment: "pb:cs:formManager:getFormData", action: function(params) { if (logger.log("exceptions", "override username value when saving asset on fidelity.com"), params.inputProps && "username" === params.inputProps.role) { var dummyUsername = document.querySelector("input#pb-dummy-username"); params.inputProps.value = dummyUsername && dummyUsername.value || params.inputProps.value } } }, { moment: "pb:cs:formManager:fillForm", action: function(params) { if (params && params.form && params.asset && params.asset.login) { var usernameField = params.form && params.form.fields && params.form.fields.filter(function(field) { return "username" === field.fieldType }) , el = usernameField[0] && usernameField[0].el; setTimeout(function() { logger.log("exceptions", "setting attribute with unmasked value to ensure autofill on fidelity.com"), el.setAttribute("data-unmasked", params.asset.login), $("#ssnt", "#SSN, #hiddenId").val(params.asset.login), PB.contentscript.formManager.fillInput(el, params.asset.login) }, 4e3) } } }, { moment: "pb:cs:formManager:submitForm", action: function(params) { (location.href.indexOf("login.fidelity.com") > -1 || location.href.indexOf("nb.fidelity.com") > -1 || location.href.indexOf("www.fidelity.com") > -1) && (logger.log("exceptions", "delaying autosubmit for 1sec on fidelity.com"), params.submitDelay = 5e3) } }], "^itunesconnect\\.apple\\.com": [{ moment: "pb:cs:formManager:selectAsset", action: function(params) { params.saved_assets = params.saved_assets.filter(function(asset) { return !asset.domain.indexOf("itunesconnect") }) } }], "signup\\.live\\.com": [{ moment: "pb:cs:formManager:getFormData", action: function(params) { var usernameField = $("#MemberName") , nextLabel = $("#MemberName + label") , labelVisible = "none" !== nextLabel.css("display"); "username" === params.inputProps.role && labelVisible && (params.inputProps.value = usernameField.val() + nextLabel.text()) } }], "edit\\.yahoo\\.com": [{ moment: "pb:cs:intelready", action: function(params) { var confirm = document.getElementById("confirm-password"); confirm && confirm.setAttribute("pb-role", "password") } }, { moment: "pb:cs:disableCs", action: function(params) { ($("#captchaV5ClassicCaptchaImg").length || $('form[data="sendSMSValidationConfigs"]').length || $("#timer-message").length) && (params.exitCS = !0) } }], "new\\.aol\\.com": [{ moment: "pb:cs:formManager:getFormData", action: function(params) { "username" === params.inputProps.role && params.inputProps.value.indexOf("@aol.com") === -1 && (params.inputProps.value += "@aol.com") } }], "^(www\\.)?firstrepublichb\\.com": [{ moment: "pb:cs:intelready", action: function(params) { "https://www.firstrepublichb.com/tob/live/usp-core/app/initialLogin" === location.href && (PB.contentscript.intelForUrl.settings.contentScript = !1, PB.contentscript.intelForUrl.ignoreNotification = !0) } }, { moment: "pb:cs:formManager:fillForm", action: function(params) { if (params && params.form) { params.asset.login && location.href.match("firstrepublichb.com/onlineserv/HB/.*cgi") && setTimeout(function() { PB.contentscript.formManager.fillForm(params.form, params.asset, !0) }, 250) } } }], "^(www\\.)?my\\.screenname\\.aol\\.com$": [{ moment: "pb:cs:formManager:findForms", action: function(opts) { document.querySelector("#asq > form") && (logger.log("exceptions", "forcing 2 steps on screenname.aol.com "), opts.filters["two-factor"] = { force: "#asq > form" }) } }], "^(www\\.)?t-online\\.de$": [{ moment: "pb:cs:intelready", action: function(opts) { $("iframe#LoginFrame").height(300).width(431), $("#Thead3").css("z-index", "9999"), $("object").each(function() { var params = $(this).children("param[name=wmode], param[name=wMode]"); params.size() ? params.val("transparent") : $(this).prepend('') }) } }], "^(www\\.)?naver\\.com$": [{ moment: "pb:cs:init", action: function(opts) { $(".login #loginframe").width(440).height(320) } }], "^login\\.yahoo\\.com$": [{ moment: "pb:cs:formManager:submitForm", action: function(params) { params.submitDelay = 1250 } }], "accesd\\.desjardins\\.com": [{ moment: "pb:cs:intelready", action: function(params) { $("[name=LogonForm]").length && "document.LogonForm.submit()" === $(document.body).attr("onload") && (PB.contentscript.intelForUrl.settings.contentScript = !1, PB.contentscript.intelForUrl.ignoreNotification = !0) } }], "www\\.engadget\\.com": [{ moment: "pb:cs:intelready", action: function(params) { $("#user-menu").length && (PB.contentscript.intelForUrl.settings.detect = { login: { ignore: "form#login-form" } }) } }], "mockflow\\.com": [{ moment: "pb:cs:loginDetect", action: function(params) { !!~$("#indexContent").text().indexOf("Account created") && (params.isLoginPage = !1, params.login_detect_reasons = "Ajax submit shows a blocking success message") } }], "wix\\.com": [{ moment: "pb:cs:loginDetect", action: function(params) { $("div.wm-logged-in").length && (params.isLoginPage = !1, params.login_detect_reasons = "The logged-in menu is in the page.") } }], "mya\\.godaddy\\.com": [{ moment: "pb:cs:loginDetect", action: function(params) { $("#PageBody").length && (params.isLoginPage = !1, params.login_detect_reasons = "#PageBody class is in the DOM") } }], "hautelook\\.com": [{ moment: "pb:cs:loginDetect", action: function(params) { $(".secondary-nav__account-menu").length && (params.isLoginPage = !1, params.login_detect_reasons = "Account submenu is in the DOM.") } }] } } , { "../logger": 130, jquery: "jquery" }], 11: [function(require, module, exports) { var utils = { sendMixpanelFailure: function(params) { FA.Framework.sendMessage({ faTrigger: "mixpanel_track", mixpanel_event: "atlas_remote_exception_failure", mixpanel_params: params }) } }; module.exports = utils } , {}], 12: [function(require, module, exports) { module.exports = { name: "fdetect", repository: "passwordbox/fdetect", "private": !0, description: "deterministic form detection module in javascript, used for the short tail.", version: "0.3.1", main: "lib/index.js", json: ["component.json"], scripts: ["lib/index.js", "lib/utils/google-cssPath.js", "lib/utils/*.js", "lib/finder/*.js", "lib/field-finders/*.js", "lib/form-classifiers/*.js", "lib/element-categorizers/*.js", "lib/form-finders/*.js"], dependencies: { "passwordbox/jquery": "1.8.2", "jashkenas/underscore": "*", "visionmedia/debug": "*", "passwordbox/visible": "*", "passwordbox/measure": "*" }, development: { dependencies: { "chaijs/chai": "*", "component/domify": "*" }, styles: ["test/index.css"], scripts: ["test/lib/finder/finder.js", "test/lib/utils/concat-regexp.js", "test/lib/it-should/index.js", "test/lib/utils/simple_statistics.js", "test/lib/login/tests.js", "test/lib/login/index.js", "test/lib/signup/tests.js", "test/lib/signup/index.js", "test/lib/payment/tests.js", "test/lib/payment/index.js", "test/lib/two-factor/tests.js", "test/lib/two-factor/index.js", "test/lib/reset/tests.js", "test/lib/reset/index.js", "test/lib/performance/tests.js", "test/lib/performance/index.js"], templates: ["test/lib/**/fixtures/*.html"] } } } , {}], 13: [function(require, module, exports) { module.exports = require("./lib") } , { "./lib": 72 }], 14: [function(require, module, exports) { function is(type, el) { var matches = []; return isLogin(el) && matches.push("login"), isSignup(el) && matches.push("signup"), isReset(el) && matches.push("reset"), 1 == matches.length && !!~matches.indexOf(type) } var isLogin = require("./login") , isSignup = require("./signup") , isReset = require("./reset"); module.exports = is } , { "./login": 15, "./reset": 16, "./signup": 17 }], 15: [function(require, module, exports) { function isLogin(el) { return withLoginAttributes(el) } function withLoginAttributes(el) { var attrs = ["id", "action", "class", "name", "title", "onsubmit"] , regexps = concat([/(sign|log)(.?)[io]n/i, /\bsso\b/i, /user_session$/i]); $(el); return attrs.some(function(attr) { var text = $(el).attr(attr); return regexps.some(function(reg) { return reg.test(text) }) }) } var concat = (require("../field-finders/signup-button"), require("../field-finders/login-button"), require("../utils/sort-by-dom").sort, require("../utils/concat-regexp")) , $ = require("jquery"); module.exports = isLogin } , { "../field-finders/login-button": 42, "../field-finders/signup-button": 48, "../utils/concat-regexp": 73, "../utils/sort-by-dom": 80, jquery: "jquery" }], 16: [function(require, module, exports) { function isReset(el) { return withResetAttributes(el) } function withResetAttributes(el) { var attrs = ["id", "action", "class", "name", "title", "onsubmit"] , regexps = concat([/(change|reset|edit|update)(.?)(password|form)/i, /edit(passwd|password)/i, /update.*setting(s?)/i, /settings.profile/i]); $(el); return attrs.some(function(attr) { var text = $(el).attr(attr); return regexps.some(function(reg) { return reg.test(text) }) }) } var concat = require("../utils/concat-regexp") , $ = require("jquery"); module.exports = isReset } , { "../utils/concat-regexp": 73, jquery: "jquery" }], 17: [function(require, module, exports) { function isSignup(el) { return withSignupAttributes(el) || withSignupText(el) } function withSignupAttributes(el) { return filterElementByAttributes(el, ["id", "action", "class", "name", "title", "onsubmit"], concat([/sign.?up/i, /enroll/i, /join/i, /reg/i]), concat([/(change|reset|edit|update)(.?)(password|form)/i, /edit(passwd|password)/i, /update.*setting(s?)/i])) } function withSignupText(el) { var regexps = [/sign.?up|register/i] , $el = $(el) , links = $el.find("a").text() , text = $el.text().replace(links, ""); return regexps.some(function(reg) { return reg.test(text) }) } var concat = (require("../field-finders/signup-button"), require("../field-finders/login-button"), require("../utils/sort-by-dom").sort, require("../utils/concat-regexp")) , $ = require("jquery") , filterElementByAttributes = require("../utils/filter-element-by-attributes"); module.exports = isSignup } , { "../field-finders/login-button": 42, "../field-finders/signup-button": 48, "../utils/concat-regexp": 73, "../utils/filter-element-by-attributes": 74, "../utils/sort-by-dom": 80, jquery: "jquery" }], 18: [function(require, module, exports) { function isTwoFactor(el) { return withTwoFactorText(el) || withTwoFactorAttributes(el) } function withTwoFactorAttributes(el) { var attrs = ["id", "action", "class", "name", "title", "onsubmit"] , regexps = [/(two|second).*factor/i, /(otc|otp|verification)/i]; $(el); return attrs.some(function(attr) { var text = $(el).attr(attr); return regexps.some(function(reg) { return reg.test(text) }) }) } function withTwoFactorText(el) { var text = $(el).text(); return [/two.{1}factor\sauthentication/i, /enter\s(the\s)?security\scode/i].some(function(reg) { return reg.test(text) }) } var $ = require("jquery"); module.exports = isTwoFactor } , { jquery: "jquery" }], 19: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").accept(/address.*label/i).reject(/email/i).lookup("id", "class", "name") } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:address_title").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 20: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").lookup("id", "class", "name").accept(/address/i, /^street/i, /shipadd-add/i, /(billing|shipping).*street/i, /ad.*line.*\d/i, /ship_addr.*/i).reject(/email/i, /name/i, /city/i, /state/i, /region/i, /postal/i, /phone/i, /zip/i, /label/i, /careof/i) } function findByLabelText() { return this.select("label").lookup("text", "val").accept(/street.*address/i, /address.*line/i, /(billing|shipping).*street/i).reject(/email/i, /name/i, /city/i, /state/i, /region/i, /postal/i, /phone/i, /zip/i, /label/i, /careof/i).map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:address").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 21: [function(require, module, exports) { function findByLabelText() { return this.select("label").accept(/date.*of.*birth/i).reject(/day/i, /month/i, /year/i).lookup("text").map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:birthday_date").map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 22: [function(require, module, exports) { function findByAttributes() { return this.accept(/birthday.*day/i, /day.*birthday/i).reject(/month/i, /year/i).select("select,input[type=text]").lookup("id", "autocomplete", "name", "data").fullText(!0) } function findByLabelText() { return this.select("label").accept(/day/i).lookup("text").map(findInputsForLabels).filter(function(el) { return "text" === el.type }).lookup("id").accept(/birth/i).reject(/month/i, /year/i) } function findByOptionText() { return this.accept(/birth.*day/i).reject(/month/i, /year/i).select("select").lookup("id", "class", "name").filter(function(el) { var options = $(el).find("option").toArray(); return options.length >= 28 && options.length <= 32 && options.every(function(el) { return /\d\d?/i.test($(el).val()) }) }) } var finder = require("../finder") , $ = require("jquery") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:birthday_day").map("findByAttributes", findByAttributes).map("findByOptionText", findByOptionText).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75, jquery: "jquery" }], 23: [function(require, module, exports) { function findByLabelText() { return this.select("label").accept(/month/i).lookup("text").map(findInputsForLabels).filter(function(el) { return "text" === el.type }).lookup("id").accept(/birth/i) } function findByOptionText() { return this.accept(/date|birth/i).select("select").lookup("id", "class", "name").filter(function(el) { var options = $(el).find("option").toArray(); return options.length >= 12 && options.length <= 14 && options.some(function(el) { return ["text", "val"].some(function(fn) { return /birth.*month/i.test($(el)[fn]()) }) }) }) } function findByAttributes() { return this.accept(/birth.*month/i, /month.*birth/i).reject(/year/i).select("select,input[type=text]").lookup("id", "autocomplete", "name", "data").fullText(!0) } var finder = require("../finder") , $ = require("jquery") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:birthday_month").map("findByAttributes", findByAttributes).map("findByOptionText", findByOptionText).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75, jquery: "jquery" }], 24: [function(require, module, exports) { function findByOptionText() { return this.accept(/date|birth/i).select("select").lookup("id", "class", "name").filter(function(el) { var options = $(el).find("option").toArray(); return options.length >= 12 && options.length <= 14 && options.some(function(el) { return ["text", "val"].some(function(fn) { return /birth.*year/i.test($(el)[fn]()) }) }) }) } function findByAttributes() { return this.accept(/birth.*year/i, /year.*birth/i).reject(/month/i).select("select,input[type=text]").lookup("id", "autocomplete", "name", "data").fullText(!0) } function findByLabelText() { return this.select("label").accept(/year/i).lookup("text").map(findInputsForLabels).filter(function(el) { return "text" === el.type }).lookup("id").accept(/birth/i) } var finder = require("../finder") , $ = require("jquery") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:birthday_year").map("findByAttributes", findByAttributes).map("findByOptionText", findByOptionText).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75, jquery: "jquery" }], 25: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").lookup("name", "id", "aria-label").accept(/captcha|turing/i, /keyval/i, /enter\sthe\scharacters\syou\ssee/i) } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:captcha").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 26: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text],input[type=radio],select:not([type=hidden])").accept(/(credit|card|cc)(.*)?(type|brand)/i).lookup("id", "class", "name") } function findByLabelText() { return this.select("label").accept(/(credit|card|cc)(.*)?(type|brand)/i).lookup(["text", "val"]).map(findInputsForLabels).filter(function(el) { return "hidden" !== el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:card_type").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 27: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text],input[type=password],input[type=tel],input:not([type]),input[type=number]").lookup("id", "class", "name", "autocomplete", "x-autocompletetype").lookupAttributeNames(!0).accept(/^cc-number$/i, /(credit|card|cc).*(num|no)/i, /data-creditcard/i).reject(/(gift|address|cvv|CID|verification).*(num|no)/i, /accountNumber/i) } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:card_number").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 28: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").accept(/card.*label/i).reject(/email/i).lookup("id", "class", "name") } function findByLabelText() { return this.select("label").accept(/save.*?as/i).lookup("text", "val").map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:card_title").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 29: [function(require, module, exports) { function findByAttributes() { return this.accept(/city/i).select("input[type=text]").lookup("id", "class", "name") } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:city").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 30: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").lookup("id", "name").accept(/(comp|company|business).*name/i).reject(/first/i, /last/i) } function findByLabelText() { return this.select("label").accept(/(company|business).*name/i).reject(/first/i, /last/i).lookup("text", "val").map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:company_name").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 31: [function(require, module, exports) { function findByConfirmPassword() { return this.select("input[type=password]").lookup("id", "name", "placeholder").accept(/again/i, /confirm/i, /check/i, /retype/i, /pass(word)?2/, /verpass/i, /passwordverify/i) } function findByLabelConfirmPassword() { return this.select("label").lookup("text", "val").accept(/confirm.*password/i, /re(-)?enter(.)?new password/i).map(findInputsForLabels).filter(function(el) { return "password" === el.type || "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:confirm-password").map("findByConfirmPassword", findByConfirmPassword).map("findByLabelConfirmPassword", findByLabelConfirmPassword) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 32: [function(require, module, exports) { function findByAttributes() { return this.accept(/country/i).reject(/state/i).select("select,input[type=text]").lookup("id", "class", "name") } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:country").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 33: [function(require, module, exports) { function findByTypePassword() { return this.select("input[type=password]").lookup("id", "name").accept(/old/i, /mw-input-wpPassword/i, /current/i, /editmy_password/i, /iCurPassword/i, /curpass/i, /xpassword/i).reject(/email/i) } function findByLabelText() { return this.select("label").lookup("text", "val").accept(/old.*password/i, /current.*password/i).map(findInputsForLabels).filter(function(el) { return "text" === el.type || "password" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:current-password").map("findByTypePassword", findByTypePassword).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 34: [function(require, module, exports) { function findByAttributes() { return this.accept(/cvv/i, /cvc/i, /^cid$/i, /security.*code/i, /(billing|shipping|number|card|cc).*(cv|sid|cid|security|verification|(s.*code))/i, /(cv|sid|cid|security|verification|(s.*code)).*(billing|shipping|number|card|cc)/i).reject(/postal/i, /pin.*num/i, /gift/i).select("input[type=text],input[type=password],input[type=tel]").lookup("id", "class", "name") } function findByLabelText() { return this.select("label").accept(/cvv/i, /security.*code/i).lookup("text", "val").map(findInputsForLabels).filter(function(el) { return ~["text", "password"].indexOf(el.type) }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:cvv").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 35: [function(require, module, exports) { function findByType() { return this.select("input[type=email]") } function findByAttributes() { return this.accept(/email/i).select("input[type=text],input[type=textbox],input:not([type])").lookup("id", "class", "name", "value", "placeholder") } function findByLabelText() { return this.select("label").lookup("text").accept(/\bemail\b/i).map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:email").map("findByType", findByType).map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 36: [function(require, module, exports) { function findByAttributes() { return this.accept(/\b(expiry|expiration|cc-exp\b)/i).reject(/month|year/i).select("input[type=text]").lookup("id", "class", "name") } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:expiry_date").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 37: [function(require, module, exports) { function findByAttributes() { return this.select("select,input[type=text],input[type=tel]").lookup("id", "autocomplete", "name").accept(/(exp|card).*month/i, /ccmonth/i, /exp.*date.*month/i) } function findByOptionText() { return this.select("select").lookup("id", "class", "name").accept(/date/i).filter(function(el) { var options = $(el).find("option").toArray(); return options.length >= 12 && options.length <= 14 && options.some(function(el) { return ["text", "val"].some(function(fn) { return /month/i.test($(el)[fn]()) }) }) }) } var finder = require("../finder") , $ = require("jquery"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:expiry_date_month").map("findByAttributes", findByAttributes).map("findByOptionText", findByOptionText) } , { "../finder": 54, jquery: "jquery" }], 38: [function(require, module, exports) { function findByAttributes() { return this.select("select,input[type=text],input[type=tel]").lookup("autocomplete", "id", "name").accept(/^cc-exp-year$/i, /ccyear/i, /(exp|card).*year/i, /exp.*date.*year/i) } function findByOptionText() { var accept = concat([/year/i, /\d{2,4}/i]) , reject = concat([/month/i, /\d{2}\/\d{2}\/\d{2,4}/i]); return this.select("select").reject(/gift/i, /month/i).accept(/date/i, /year/i, /yr/i).lookup("id", "class", "name").filter(function(el) { return $(el).find("option").toArray().every(function(el) { return ["text", "val"].some(function(fn) { var text = $(el)[fn]() , accepted = accept.some(function(re) { return re.test(text) }) , rejected = reject.some(function(re) { return re.test(text) }); return accepted && !rejected }) }) }) } var finder = require("../finder") , concat = require("../utils/concat-regexp") , $ = require("jquery"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:expiry_date_year").map("findByAttributes", findByAttributes).map("findByOptionText", findByOptionText) } , { "../finder": 54, "../utils/concat-regexp": 73, jquery: "jquery" }], 39: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").accept(/first.*name/i, /shipadd-fname/i).reject(/last/i, /full/i, /nick/i).lookup("id", "class", "name") } function findByLabelText() { return this.select("label").accept(/first.*name/i).lookup("text", "val").map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:first_name").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 40: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").accept(/(customer|holder|card|creditcard|account|full).*name/i, /ccname/i, /name.*card/i, /signup_name/i).reject(/first.*name/i, /last.*name/i, /nick.*name/i).lookup("id", "name", "placeholder") } function findFirstAndLastName() { return this.select("input[type=text]").lookup("id").accept(/first_and_last_name/i) } function findByLabelText() { return this.select("label").accept(/full.name/i, /and.last/i).reject(/first/i, /last/i).lookup("text", "val").map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:full_name").map("findByAttributes", findByAttributes).map("findFirstAndLastName", findFirstAndLastName).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 41: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").accept(/last(.*)?name/i, /shipadd-lname/i).reject(/first/i, /full/i).lookup("id", "class", "name") } function findByLabelText() { return this.select("label").accept(/last(.*)?name/i).lookup("text", "val").map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:last_name").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 42: [function(require, module, exports) { function firstElementAfterPassword(els) { var credentials = domOrder.sort(findPasswords(this.context()).concat(findUsernames(this.context())).concat(findEmails(this.context()))) , credential = credentials.pop(); return credential ? domOrder.after(credential, els).slice(0, 1) : els } function findByLabel() { return this.select("[type=submit]").lookup("text").accept(/(log|sign).*in/i, /entrer|enter/i).reject(/join/i, /password/i, /create.*account/i, /find.*friends/i, /register/i, /enroll/i, /sign.*up/i, /(remember|fb|google_apps_sign_in_link|facebook|social|password|passwd|pwd|pswd|passwd|reset|forgot|forget|frgt|problem|learn|create|trouble)/i) } function findInputs() { return this.select("[type=submit]", "input[type=button]", "input[type=image]").lookup("name", "id", "value", "text").reject(/join/i, /create.*account/i, /find.*friends/i, /register/i, /enroll/i, /sign.*up/i, /(remember|fb|google_apps_sign_in_link|facebook|social|password|passwd|pwd|pswd|passwd|reset|forgot|forget|frgt|problem|learn|create|trouble)/i, /get.started/i) } function findLinksAndButtons() { return this.select("button", "a", "div[role=button]").lookup("id", "class", "title", "text", "onclick").reject(/join/i, /register/i, /enroll/i, /create.*account/i, /find.*friends/i, /sign.*up/i, /(remember|fb|google_apps_sign_in_link|facebook|social|password|passwd|pwd|pswd|passwd|reset|forgot|forget|frgt|problem|learn|trouble)/i).accept(/(sign|log).?[io]n/i, /sso/i, /submit/i, /entrer|enter/i) } function findDivsWithonClick() { return this.select("div").lookup("onclick").accept(/submit/i).reject(/enroll|join|register|sign.*up/i, /create.*account/i, /find.*friends/i) } var finder = require("../finder") , findPasswords = require("./password") , findUsernames = require("./username") , findEmails = require("./email") , domOrder = require("../utils/sort-by-dom"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:login_button").map("findInputs", findInputs).map("findByLabel", findByLabel).map("findLinksAndButtons", findLinksAndButtons).map("findDivsWithonClick", findDivsWithonClick).finalize("firstElementAfterPassword", firstElementAfterPassword) } , { "../finder": 54, "../utils/sort-by-dom": 80, "./email": 35, "./password": 44, "./username": 52 }], 43: [function(require, module, exports) { function findByTypePassword() { return this.select("input[type=password]").lookup("id", "name", "ng-model").accept(/new/i, /f_password/i, /pass(word)?1/, /identity\[password\]/i, /regi_password/i).reject(/password2/i, /again/i, /confirm/i, /check/i, /retype/i) } function findByLabelText() { return this.select("label").lookup("text", "val").accept(/new(.?)password/i).reject(/confirm/i, /check/i, /re(-)?enter/i, /retype/i, /again/i).map(findInputsForLabels).filter(function(el) { return "password" === el.type || "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:new-password").map("findByTypePassword", findByTypePassword).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 44: [function(require, module, exports) { function findByType() { return this.select("input[type=password]").lookup("id", "name").reject(/code/i, /old(.)?password/i, /password(.)?old/i) } function findByAttributes() { return this.select("input[type=text]").lookup("id", "class", "name").accept(/password/i).reject(/code/i, /pin/i) } function keepOnlyPasswordTypes(els) { var strongerMatches = els.filter(function(el) { return "password" === el.type }); return els.length > 1 && strongerMatches.length && strongerMatches.length < els.length ? strongerMatches : els } function findByLabelText() { return this.select("label").lookup("text", "val").accept(/.*password$/i).reject(/old/i).map(findInputsForLabels).filter(function(el) { return "text" === el.type }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:password").map("findByType", findByType).map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText).finalize("keepOnlyPasswordTypes", keepOnlyPasswordTypes) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 45: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text],input[type=tel],input:not([type])").lookup("id", "class", "name", "placeholder", "label").accept(/phone/i, /mobile.*number/i).reject(/annotation/i, /phone.*ext/i) } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:phone").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 46: [function(require, module, exports) { function findResetInputs() { return this.select("[type=submit]", "input[type=button]").lookup("class", "id", "value", "text").accept(/save/i, /^continue$/i, /change.*password/i, /change!/i, /resetpassword/i, /^submit$/i, /update/i).reject(/(log|sign).*in/i, /(sign|log).?[io]n/i, /sso/i, /(remember|fb|facebook|social|forgot|forget|frgt|problem|learn|trouble)/i, /join/i, /register/i, /enroll/i, /create.*account/i, /sign.*up/i, /cancel/i, /entrer/i, /email/i, /checkpoint/i) } function findResetLinksAndButtons() { return this.select("a", "button").lookup("id", "class", "title", "html").accept(/save/i, /^continue$/i, /change password/i, /change!/i, /resetpassword/i, /update/i).reject(/(log|sign).*in/i, /(sign|log).?[io]n/i, /sso/i, /(remember|fb|facebook|social|forgot|forget|frgt|problem|learn|trouble)/i, /join/i, /register/i, /enroll/i, /create.*account/i, /sign.*up/i, /cancel/i, /entrer/i, /email/i, /click here/i) } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:reset_button").map("findResetInputs", findResetInputs).map("findResetLinksAndButtons", findResetLinksAndButtons) } , { "../finder": 54 }], 47: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text]").lookup("name", "id", "placeholder", "title").accept(/search/i) } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:search").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 48: [function(require, module, exports) { function firstElementAfterPassword(els) { var passwords = findPasswords(this.context()) , password = domOrder.sort(passwords)[0]; return password ? domOrder.after(password, els).slice(0, 1) : els } function findInputs() { return this.select("[type=submit]", "input[type=button]", "input[type=image]").lookup("name", "class", "id", "value", "text").accept(/join/i, /create.*account/i, /register/i, /enroll/i, /sign.*up/i, /get started/i, /submit/i).reject(/(sign|log).?[io]n/i, /sso/i, /(remember|fb|facebook|social|password|passwd|pwd|pswd|passwd|reset|forgot|forget|frgt|problem|learn|trouble)/i) } function findLinksAndButtons() { return this.select("a", "button").lookup("id", "class", "title", "html").accept(/join/i, /register/i, /enroll/i, /create.*account/i, /sign.*up/i).reject(/(sign|log).?[io]n/i, /sso/i, /(remember|fb|facebook|social|password|passwd|pwd|pswd|passwd|reset|forgot|forget|frgt|problem|learn|trouble)/i) } function findDivsWithonClick() { return this.select("div").lookup("onclick").accept(/enroll|join|register|sign.*up/i, /create.*account/i) } var finder = require("../finder") , findPasswords = require("./password") , domOrder = require("../utils/sort-by-dom"); module.exports = function(el, opts) { return new Finder({ context: el },opts).toArray() } ; var Finder = finder("field:signup_button").map("findInputs", findInputs).map("findLinksAndButtons", findLinksAndButtons).map("findDivsWithonClick", findDivsWithonClick).finalize("firstElementAfterPassword", firstElementAfterPassword) } , { "../finder": 54, "../utils/sort-by-dom": 80, "./password": 44 }], 49: [function(require, module, exports) { function findByAttributes() { return this.select("select,input[type=text]").lookup("id", "class", "name").accept(/state|province|region/i) } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:state").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 50: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text],input[type=tel]").lookup("id", "class", "name").accept(/(code|token|otc|otp)/i, /sms.*pin/i, /(two.*factor)|verification|security.*code/i).reject(/postal/i, /pin.*num/i, /credit|card/i, /cvv|cid/i) } function findByLabelText() { return this.select("label").accept(/authentication.*code/i).lookup("text", "val").map(findInputsForLabels).filter(function(el) { return ~["text", "tel"].indexOf(el.type) }) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:two_factor_code").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75 }], 51: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=submit], button").lookup("name", "id", "value", "text").reject(/join/i, /create.*account/i, /register/i, /enroll/i, /sign.*up/i, /send/i, /sso/i, /cancel/i, /(remember|fb|facebook|social|password|passwd|pwd|pswd|passwd|reset|forgot|forget|frgt|problem|learn|create|trouble)/i) } function firstElementAfterCode(els) { var codes = findCodes(this.context()); if (!codes || !codes.length) return els; var firstCode = domOrder.sort(codes)[0]; return domOrder.after(firstCode, els).slice(0, 1) } var finder = require("../finder") , domOrder = (require("../utils/find-inputs-for-labels"), require("../utils/sort-by-dom")) , findCodes = require("./two-factor-code"); module.exports = function(el, opts) { return new Finder({ context: el },opts).toArray() } ; var Finder = finder("field:two_factor_submit").map("findByAttributes", findByAttributes).finalize("firstElementAfterCode", firstElementAfterCode) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75, "../utils/sort-by-dom": 80, "./two-factor-code": 50 }], 52: [function(require, module, exports) { function findByContainerText() { return this.select("input[type=text]").map(function(el) { return el.parentNode }).filter(function(el) { var inputs = el.querySelectorAll("input"); return !$(el).data("pb-role") && 1 == inputs.length }).lookup("text").accept(/(user|login).*(id|name)/i).reject(/remember/i, /recovery/i, /altemail/i, /nick/i, /first/i, /last/i, /full/i, /search/i, /membership/i, /phone/i, /mobile.*number/i, /login\:description/i).map(function(el) { return el.querySelector("input") }) } function findByAttributes() { return this.select("input[type=text],input:not([type])").lookup("name", "id", "placeholder", "title", "value", "label", "aria-label").fullText(!0).reject(/remember/i, /recovery/i, /altemail/i, /nick/i, /first/i, /last/i, /full/i, /search/i, /membership/i, /phone/i, /mobile.*number/i, /login\:description/i).accept(/login/i, /(member|online|user).*(id|name)/i, /uname/i, /(id|name|user).*session/i, /(cust|customer)id/i, /\bid\b/i, /session_key/i, /accesscard/i, /^(\s+)?id(\s+)?$/i) } function findByLabelText() { return this.select("label").lookup("text").accept(/(user|login).*(id|name)/i).reject(/nick/i, /first/i, /last/i, /full/i, /recovery/i, /search/i, /membership/i, /phone/i, /mobile.*number/i, /remember/i).map(findInputsForLabels).filter(function(el) { return "text" === el.type }).lookup("id", "class").reject(/recovery/i, /alternate/i) } var finder = require("../finder") , findInputsForLabels = require("../utils/find-inputs-for-labels") , $ = require("jquery"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:username").map("findByAttributes", findByAttributes).map("findByLabelText", findByLabelText).map("findByContainerText", findByContainerText) } , { "../finder": 54, "../utils/find-inputs-for-labels": 75, jquery: "jquery" }], 53: [function(require, module, exports) { function findByAttributes() { return this.select("input[type=text],input[type=tel]").lookup("id", "class", "name").accept(/(zip|postal).*(code)?/i) } var finder = require("../finder"); module.exports = function(el) { return new Finder({ context: el }).toArray() } ; var Finder = finder("field:zip").map("findByAttributes", findByAttributes) } , { "../finder": 54 }], 54: [function(require, module, exports) { function createFinder(name) { function Finder(attrs, opts) { if (!(this instanceof Finder)) return new Finder(attrs); this.attrs = attrs || {}, this.fieldType(name); var cache = !0; opts && void 0 !== opts.cache && (cache = opts.cache), this.cache = cache } if ("string" != typeof name) throw new TypeError("finder name required"); Finder.map = function(name, fn) { return this.fns.map.push(getFunctionWithName(name, fn)), this } , Finder.reduce = function(name, fn) { return this.fns.reduce.push(getFunctionWithName(name, fn)), this } , Finder.finalize = function(name, fn) { return this.fns.finalize.push(getFunctionWithName(name, fn)), this } , Finder.fns = { map: [], reduce: [], finalize: [] }, Finder.fieldType = name, Finder.prototype = {}, Finder.prototype.finder = Finder; for (var key in proto) Finder.prototype[key] = proto[key]; return Finder } function getFunctionWithName(name, fn) { return name && fn ? [name, fn] : [name.name || "", name] } var proto = require("./proto"); module.exports = createFinder } , { "./proto": 55 }], 55: [function(require, module, exports) { function wrap(args) { return [].slice.call(args).reduce(function(ret, arg) { return _.isArray(arg) ? ret = ret.concat(arg) : ret.push(arg), ret }, []) } function value(el, prop) { switch (prop) { case "data": return el.getAttribute && el.getAttribute("data"); case "label": var label = findLabelForInput(el); if (label) return $(label).text(); break; default: var $el = $(el); return "function" == typeof $el[prop] ? $el[prop]() : $(el).attr(prop) || el[prop] } } function attributeNames(el) { for (var arr = [], i = 0, attrs = el.attributes, l = attrs.length; i < l; i++) arr.push(attrs.item(i).nodeName); return arr } var $ = require("jquery") , _ = require("underscore") , cssPath = require("../../../css-path") , identity = function(o) { return o } , findLabelForInput = require("../utils/find-label-for-input") , concat = require("../utils/concat-regexp") , debug = require("debug")("fdetect:finder") , version = require("../utils/version"); exports.fullText = function(b) { return arguments.length ? (this.attrs.fullText = !!b, this) : this.attrs.fullText } , exports.debug = function(k, v) { if (!arguments.length) return this.attrs.debug; if (require("debug").enabled("fdetect:finder:" + this.fieldType())) { if (this._debug = this._debug || {}, 1 == arguments.length && "cache" == k && !this.owner && require("debug").enabled("fdetect:finder:cache")) return this._debug.cache = $(this.context()).find("*").toArray().reduce(function(res, e) { var $e = require("jquery")(e) , sel = cssPath(e); $e.data(version + ":pb-ignore") && res.ignore.push(sel); var role = $e.data(version + ":pb-role"); return role && (res[role] = res[role] || [], res[role].push(sel)), res }, { ignore: [] }), this; if (1 == arguments.length && "object" == typeof k) for (var key in k) this.debug(key, k[key]); else v && (this._debug[k] = this._debug[k] || [], v instanceof Array ? this._debug[k] = this._debug[k].concat(v) : this._debug[k].push(v)); return this.owner && this.owner.debug(this._debug), this } } , exports.accept = function() { return arguments.length ? (this.attrs.accept = concat(wrap(arguments)), this) : this.attrs.accept } , exports.fieldType = function(name) { return arguments.length ? (this.attrs.fieldType = name, this) : this.attrs.fieldType } , exports.reject = function() { return arguments.length ? (this.attrs.reject = concat(wrap(arguments)), this) : this.attrs.reject } , exports.lookupAttributeNames = function(b) { return arguments.length ? (this.attrs.lookupAttributeNames = !!b, this) : this.attrs.lookupAttributeNames } , exports.lookup = function() { return arguments.length ? (this.attrs.lookup = wrap(arguments), this) : this.attrs.lookup } , exports.select = function() { return arguments.length ? (this.attrs.select = wrap(arguments), this) : this.attrs.select } , exports.context = function(el) { return arguments.length ? (this.attrs.context = el, this) : this.attrs.context } , ["map", "filter", "reduce"].forEach(function(name) { exports[name] = function(fn) { var els = this.run(fn.name || name); els = els[name](fn, []); var finder = new this.finder; return finder.context(this.context()), finder.owner = this, finder.els = els, finder } }), exports.toArray = function() { var self = this , map = this.finder.fns.map , reduce = this.finder.fns.reduce , finalize = this.finder.fns.finalize; this.debug("cache"); var els = this.run("main"); return map.length && (els = map.reduce(function(ret, arr) { var name = arr[0] , fn = arr[1] , finder = new self.finder({ context: self.context() },{ cache: self.cache }); return finder.owner = self, finder = fn.call(finder), finder.els = (finder.els || []).concat(self.els || []), finder.run(name).forEach(function(el) { ~ret.indexOf(el) || ret.push(el) }), ret }, els)), reduce.length && (els = reduce.reduce(function(ret, arr) { var name = arr[0] , fn = arr[1] , tmp = ret.reduce(fn.bind(self), []); return self.debug(name, tmp), tmp }, els)), finalize.length && (els = finalize.reduce(function(ret, arr) { var name = arr[0] , fn = arr[1] , tmp = fn.call(self, ret); return self.debug(name, tmp), tmp }, els)), els.forEach(function(el) { $(el).data(version + ":pb-role", self.fieldType()), debug("WARNING caching " + self.fieldType() + " with selector " + cssPath(el)) }), this.log(), els } , exports.log = function() { require("debug").enabled("fdetect:finder:" + this.fieldType()) } , exports.run = function(name) { var self = this , selectors = this.select() || [] , res = selectors.reduce(function(arr, sel) { return $(sel, self.context()).toArray().forEach(function(el) { ~arr.indexOf(el) || arr.push(el) }), arr }, this.els || []) , cachedElements = []; return this.cache && (res = res.filter(function(el) { var role = $(el).data(version + ":pb-role"); return role == self.fieldType() && cachedElements.push(el), !role })), res = _.uniq(res.filter(identity)), res = this._accept(res), res = this._reject(res), res = _.uniq(cachedElements.concat(res)), res.forEach(function(el) { self.debug(name, el) }), res } , exports._accept = function(els) { var regexps = this.accept() || []; if (!regexps.length) return els; var fullText = this.fullText() , attributes = this.lookup() || [] , lookupAttributeNames = this.lookupAttributeNames(); return els.filter(function(el) { if (fullText) { var text = attributes.map(function(prop) { return value(el, prop) }); return lookupAttributeNames && (text = text.concat(attributeNames(el))), text = text.filter(identity).join(" "), regexps.some(function(re) { return re.test(text) }) } var foundAttributeMatch = attributes.some(function(prop) { var val = value(el, prop); return regexps.some(function(re) { return re.test(val) }) }); return !foundAttributeMatch && lookupAttributeNames && (foundAttributeMatch = attributeNames(el).some(function(val) { return regexps.some(function(re) { return re.test(val) }) })), foundAttributeMatch }) } , exports._reject = function(els) { var regexps = this.reject() || []; if (!regexps.length) return els; var fullText = this.fullText() , attributes = this.lookup() || [] , lookupAttributeNames = this.lookupAttributeNames(); return els.filter(function(el) { if (fullText) { var text = attributes.map(function(prop) { return value(el, prop) }); return lookupAttributeNames && (text = text.concat(attributeNames(el))), text = text.filter(identity).join(" "), regexps.every(function(re) { return !re.test(text) }) } return attributes.every(function(prop) { var val = value(el, prop) , res = regexps.every(function(re) { return !re.test(val) }); return res && lookupAttributeNames && (res = attributeNames(el).every(function(val) { return regexps.every(function(re) { return !re.test(val) }) })), res }) }) } } , { "../../../css-path": 4, "../utils/concat-regexp": 73, "../utils/find-label-for-input": 76, "../utils/version": 81, debug: 148, jquery: "jquery", underscore: "underscore" }], 56: [function(require, module, exports) { function classify(el) { return { title: findAddressTitle(el), first_name: findFirstName(el), last_name: findLastName(el), full_name: findFullName(el), birthday_day: findBirthdayDay(el), birthday_month: findBirthdayMonth(el), birthday_year: findBirthdayYear(el), birthday_date: findBirthdayDate(el), city: findCity(el), country: findCountry(el), state: findState(el), zip: findZip(el), email: findEmail(el), phone: findPhone(el), company_name: findCompanyName(el), address: findAddress(el) } } var findFullName = require("../field-finders/full-name") , findFirstName = require("../field-finders/first-name") , findLastName = require("../field-finders/last-name") , findAddress = require("../field-finders/address") , findAddressTitle = require("../field-finders/address-title") , findCity = require("../field-finders/city") , findCountry = require("../field-finders/country") , findState = require("../field-finders/state") , findZip = require("../field-finders/zip") , findEmail = require("../field-finders/email") , findPhone = require("../field-finders/phone") , findCompanyName = require("../field-finders/company-name") , findBirthdayDay = require("../field-finders/birthday-day") , findBirthdayMonth = require("../field-finders/birthday-month") , findBirthdayYear = require("../field-finders/birthday-year") , findBirthdayDate = require("../field-finders/birthday-date"); module.exports = classify } , { "../field-finders/address": 20, "../field-finders/address-title": 19, "../field-finders/birthday-date": 21, "../field-finders/birthday-day": 22, "../field-finders/birthday-month": 23, "../field-finders/birthday-year": 24, "../field-finders/city": 29, "../field-finders/company-name": 30, "../field-finders/country": 32, "../field-finders/email": 35, "../field-finders/first-name": 39, "../field-finders/full-name": 40, "../field-finders/last-name": 41, "../field-finders/phone": 45, "../field-finders/state": 49, "../field-finders/zip": 53 }], 57: [function(require, module, exports) { function classifyForm(el, type) { switch (type) { case "payment": return classifyPaymentForm(el); case "address": return classifyAddressForm(el); case "login": return classifyLoginForm(el); case "signup": return classifySignupForm(el); case "reset": return classifyResetForm(el); case "two-factor": return classifyTwoFactorForm(el); default: throw new TypeError("#classifyForm(el, type): type must be one of `login`, `signup`, `reset`, `payment`, `address`, `two-factor`, `reset`.") } } var classifyPaymentForm = require("./payment") , classifyAddressForm = require("./address") , classifyLoginForm = require("./login") , classifySignupForm = require("./signup") , classifyResetForm = require("./reset") , classifyTwoFactorForm = require("./two-factor"); module.exports = classifyForm } , { "./address": 56, "./login": 58, "./payment": 59, "./reset": 60, "./signup": 61, "./two-factor": 62 }], 58: [function(require, module, exports) { function classify(el) { findSearch(el); var passwords = findPassword(el) , captchas = findCaptcha(el) , emails = findEmail(el) , usernames = _.uniq(emails.concat(findUsername(el))) , states = findState(el) , loginButtons = findLoginButton(el) , signupButtons = findSignupButton(el) , allButtons = domOrder.sort(loginButtons.concat(signupButtons)); if (loginButtons = ~loginButtons.indexOf(allButtons[0]) ? [allButtons[0]] : [], !usernames.length) { var inputs = $(el).find("input[type=text],input[type=email]").toArray().filter(function(el) { return !$(el).data(version + ":pb-role") && !$(el).data(version + ":pb-ignore") }); inputs && inputs.length && usernames.push(inputs[inputs.length - 1]) } return { username: usernames, password: passwords, captcha: captchas, submit: loginButtons, state: states } } var findUsername = require("../field-finders/username") , findEmail = require("../field-finders/email") , findPassword = require("../field-finders/password") , findLoginButton = require("../field-finders/login-button") , findSignupButton = require("../field-finders/signup-button") , findCaptcha = require("../field-finders/captcha") , findState = require("../field-finders/state") , findSearch = require("../field-finders/search") , domOrder = require("../utils/sort-by-dom") , version = require("../utils/version") , $ = (require("visible"), require("jquery")) , _ = require("underscore"); module.exports = classify } , { "../field-finders/captcha": 25, "../field-finders/email": 35, "../field-finders/login-button": 42, "../field-finders/password": 44, "../field-finders/search": 47, "../field-finders/signup-button": 48, "../field-finders/state": 49, "../field-finders/username": 52, "../utils/sort-by-dom": 80, "../utils/version": 81, jquery: "jquery", underscore: "underscore", visible: 236 }], 59: [function(require, module, exports) { function classify(el, includeAddressFields) { var paymentFields = { card_number: findCreditCardNumbers(el), cvv: findCVV(el), expiry_date_year: findExpirationYear(el), expiry_date_month: findExpirationMonth(el), expiry_date: findExpirationDate(el), full_name: findFullName(el), first_name: findFirstName(el), last_name: findLastName(el), card_type: findCreditCardType(el), captcha: findCaptcha(el), title: findCardTitle(el) } , addressFields = 0 == includeAddressFields ? {} : addressClassifier(el); return _.extend(addressFields, paymentFields) } var findCreditCardNumbers = require("../field-finders/cc-number") , findCreditCardType = require("../field-finders/card-type") , findCVV = require("../field-finders/cvv") , findExpirationYear = require("../field-finders/expiration-year") , findExpirationMonth = require("../field-finders/expiration-month") , findExpirationDate = require("../field-finders/expiration-date") , findFullName = require("../field-finders/full-name") , findFirstName = require("../field-finders/first-name") , findLastName = require("../field-finders/last-name") , findCaptcha = require("../field-finders/captcha") , findCardTitle = require("../field-finders/cc-title") , addressClassifier = require("./address") , _ = require("underscore"); module.exports = classify } , { "../field-finders/captcha": 25, "../field-finders/card-type": 26, "../field-finders/cc-number": 27, "../field-finders/cc-title": 28, "../field-finders/cvv": 34, "../field-finders/expiration-date": 36, "../field-finders/expiration-month": 37, "../field-finders/expiration-year": 38, "../field-finders/first-name": 39, "../field-finders/full-name": 40, "../field-finders/last-name": 41, "./address": 56, underscore: "underscore" }], 60: [function(require, module, exports) { function classify(el) { var c = {} , confirm_password = findConfirmPassword(el) , new_password = findNewPassword(el) , resetButton = findResetButton(el); (resetButton.length && 1 == resetButton.length || 2 == resetButton.length) && (c.submit = resetButton, new_password.length || (new_password = findPassword(el))); var current_password = findCurrentPassword(el); return current_password.length && (c.current_password = [current_password[0]]), new_password.length && (c.new_password = [new_password[0]]), confirm_password.length && (c.confirm_password = [confirm_password[0]]), c } var findPassword = require("../field-finders/password") , findCurrentPassword = require("../field-finders/current-password") , findNewPassword = require("../field-finders/new-password") , findConfirmPassword = require("../field-finders/confirm-password") , findResetButton = require("../field-finders/reset-button"); module.exports = classify } , { "../field-finders/confirm-password": 31, "../field-finders/current-password": 33, "../field-finders/new-password": 43, "../field-finders/password": 44, "../field-finders/reset-button": 46 }], 61: [function(require, module, exports) { function classify(el, includeAddressFields) { findSearch(el); var password = findPassword(el) , captcha = findCaptcha(el) , username = findUsername(el) , email = findEmail(el) , signupButtons = findSignupButton(el, { cache: !1 }) , loginButtons = findLoginButton(el) , allButtons = domOrder.sort(signupButtons.concat(loginButtons)); signupButtons = ~signupButtons.indexOf(allButtons[0]) ? [allButtons[0]] : [], username.length || (username = email, email = []); var signupFields = { username: username, email: email, password: password, captcha: captcha, submit: signupButtons } , addressFields = 0 == includeAddressFields ? {} : addressClassifier(el); return _.extend(addressFields, signupFields) } var findSearch = require("../field-finders/search") , findUsername = require("../field-finders/username") , findEmail = require("../field-finders/email") , findPassword = require("../field-finders/password") , findCaptcha = require("../field-finders/captcha") , findLoginButton = require("../field-finders/login-button") , findSignupButton = require("../field-finders/signup-button") , addressClassifier = require("./address") , domOrder = (require("debug")("fdetect:form-finders:signup"), require("../utils/sort-by-dom")) , _ = require("underscore"); module.exports = classify } , { "../field-finders/captcha": 25, "../field-finders/email": 35, "../field-finders/login-button": 42, "../field-finders/password": 44, "../field-finders/search": 47, "../field-finders/signup-button": 48, "../field-finders/username": 52, "../utils/sort-by-dom": 80, "./address": 56, debug: 148, underscore: "underscore" }], 62: [function(require, module, exports) { function classify(el) { return { code: findCode(el), submit: findSubmit(el, { cache: !1 }) } } var findCode = (require("../field-finders/username"), require("../field-finders/email"), require("../field-finders/password"), require("../field-finders/search"), require("../field-finders/two-factor-code")) , findSubmit = require("../field-finders/two-factor-submit"); module.exports = classify } , { "../field-finders/email": 35, "../field-finders/password": 44, "../field-finders/search": 47, "../field-finders/two-factor-code": 50, "../field-finders/two-factor-submit": 51, "../field-finders/username": 52 }], 63: [function(require, module, exports) { function containerWithAddress(type, ctx) { if ("address" !== type) return []; ctx = ctx || document.body; var els = findStreetAddressFields(ctx).filter(function(el) { return isNotIgnored(el) }) , res = els.map(matchParents(type)); return _.uniq(res) } function matchParents(type) { return function(el) { for (var rounds = 5, parent = el.parentNode, lastMatch = parent, previousMatches = getFoundFields(addressFields(parent)); --rounds && parent.parentNode; ) if (parent = parent.parentNode, !$(parent).data(version + ":pb-ignore")) { if ($(parent).data(version + ":pb-role") === "form:" + type) return parent; var fields = addressFields(parent) , cc = findCC(parent) , pw = findPassword(parent); if (cc.length || pw.length || fields.state.length > 1) break; var matches = getFoundFields(fields); if (matches.length > previousMatches.length && (previousMatches = matches, lastMatch = parent), "FORM" === parent.nodeName) break } return previousMatches.length > 3 && lastMatch } } function addressFields(el) { return addressClassifier(el) } function getFoundFields(roles) { return _.uniq(Object.keys(roles).filter(function(key) { return !!roles[key].length })) } var addressClassifier = (require("debug")("fdetect:form-finders:payment:address-container"), require("../form-classifiers/address")) , findStreetAddressFields = require("../field-finders/address") , findCC = require("../field-finders/cc-number") , findPassword = require("../field-finders/password") , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , version = (require("../utils/is-not-in-form"), require("../utils/version")) , _ = require("underscore"); exports = module.exports = containerWithAddress, exports.name = "containerWithAddress" } , { "../field-finders/address": 20, "../field-finders/cc-number": 27, "../field-finders/password": 44, "../form-classifiers/address": 56, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/version": 81, debug: 148, jquery: "jquery", underscore: "underscore" }], 64: [function(require, module, exports) { function containerWitCreditCard(type, ctx) { if ("payment" !== type) return []; ctx = ctx || document.body; var els = findCreditCardFields(ctx).filter(function(el) { return isNotIgnored(el) }); els = els.filter(function(el) { return !$(el).parents("form").toArray().filter(function(form) { return $(form).data(version + ":pb-role") === "form:" + type }).length }); var res = els.map(matchParents(type)); return _.uniq(res) } function matchParents(type) { return function(el) { for (var rounds = 5, parent = el.parentNode, lastMatch = parent, previousMatches = countFields(paymentFields(parent)); --rounds && parent.parentNode; ) if (parent = parent.parentNode, !$(parent).data(version + ":pb-ignore")) { if ($(parent).data(version + ":pb-role") === "form:" + type) return parent; var fields = paymentFields(parent); if (fields.card_number.length > 1) break; var matches = countFields(fields); if (matches.length > previousMatches.length && (previousMatches = matches, lastMatch = parent), "FORM" === parent.nodeName) break } return previousMatches.length > 3 && lastMatch } } function paymentFields(el) { return paymentClassifier(el, !1) } function countFields(roles) { return Object.keys(roles).filter(function(key) { return !!roles[key].length }) } var findCreditCardFields = (require("debug")("fdetect:form-finders:payment:cc-container"), require("../field-finders/cc-number")) , paymentClassifier = require("../form-classifiers/payment") , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , version = (require("../utils/is-not-in-form"), require("../utils/version")) , _ = require("underscore"); exports = module.exports = containerWitCreditCard, exports.name = "containerWitCreditCard" } , { "../field-finders/cc-number": 27, "../form-classifiers/payment": 59, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/version": 81, debug: 148, jquery: "jquery", underscore: "underscore" }], 65: [function(require, module, exports) { function containerWithPassword(type, ctx) { if (!~["login", "signup"].indexOf(type)) return []; ctx = ctx || document.body; var els = findPasswords(ctx).filter(function(el) { return isNotIgnored(el) && isNotInForm(el, "login" == type ? "signup" : "login") }); els = els.filter(function(el) { return !$(el).parents("form").toArray().filter(function(form) { var hasPbRole = $(form).data(version + ":pb-role") === "form:" + type , hasPbLogin = $(form).attr("pb-autologin") , hasPbSignup = $(form).attr("pb-signup"); return hasPbRole || hasPbLogin || hasPbSignup }).length }); var res = els.map(matchParents(type)); return _.uniq(res) } function matchParents(formType) { return function(el) { return "login" === formType ? findLogin(el) : "signup" === formType ? findSignup(el) : void 0 } } function findLogin(el) { for (var rounds = 5, parent = el.parentNode, lastMatch = parent, previousFieldsCount = sum(loginFieldsCount(parent)); --rounds && parent.parentNode; ) if (parent = parent.parentNode, !$(parent).data(version + ":pb-ignore")) { if ("form:login" === $(parent).data(version + ":pb-role")) return parent; var foundSignupForm = "FORM" == parent.nodeName && isType("signup", parent); if (foundSignupForm) return; var fieldsCount = sum(loginFieldsCount(parent)); fieldsCount < sum(signupFieldsCount(parent)) || fieldsCount > previousFieldsCount && (previousFieldsCount = fieldsCount, lastMatch = parent) } var fields = loginFieldsCount(lastMatch); if (isType("login", lastMatch)) { if (fields.username <= 2 && fields.password <= 1) return lastMatch } else if (!isType("signup", lastMatch)) { var inputs = lastMatch.querySelectorAll("input"); if (1 == fields.username && 1 == fields.password && 1 == fields.submit && inputs.length < 35) return lastMatch } } function findSignup(el) { for (var rounds = 5, parent = el.parentNode, lastMatch = parent, previousFieldsCount = sum(signupFieldsCount(parent)); --rounds && parent.parentNode; ) if (parent = parent.parentNode, !$(parent).data(version + ":pb-ignore")) { if ("form:signup" === $(parent).data(version + ":pb-role")) return parent; var cc = findCC(parent); if (cc.length) break; var fieldsCount = sum(signupFieldsCount(parent)); if (fieldsCount > previousFieldsCount && (previousFieldsCount = fieldsCount, lastMatch = parent), "FORM" === parent.nodeName) break } var fields = signupFieldsCount(lastMatch); if (isType("signup", lastMatch)) { if (Object.keys(fields).filter(function(role) { return fields[role] }).length >= 2 && fields.password >= 1) return lastMatch } else if (!isType("login", lastMatch) && 1 == fields.username && 2 == fields.password) return lastMatch } function signupFieldsCount(el) { var roles = signupClassifier(el, !1); return Object.keys(roles).reduce(function(ret, key) { return roles[key].length && (ret[key] = ret[key] || 0, ret[key] += roles[key].length), ret }, {}) } function loginFieldsCount(el) { var roles = loginClassifier(el); return Object.keys(roles).reduce(function(ret, key) { return roles[key].length && (ret[key] = ret[key] || 0, ret[key] += roles[key].length), ret }, {}) } function sum(count) { return Object.keys(count).reduce(function(sum, prop) { return sum + count[prop] }, 0) } var findPasswords = (require("debug")("fdetect:form-finders:password-container"), require("../field-finders/password")) , findCC = require("../field-finders/cc-number") , loginClassifier = require("../form-classifiers/login") , signupClassifier = require("../form-classifiers/signup") , isType = require("../element-categorizers") , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , isNotInForm = require("../utils/is-not-in-form") , version = require("../utils/version") , _ = require("underscore"); exports = module.exports = containerWithPassword, exports.name = "containerWithPassword" } , { "../element-categorizers": 14, "../field-finders/cc-number": 27, "../field-finders/password": 44, "../form-classifiers/login": 58, "../form-classifiers/signup": 61, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/version": 81, debug: 148, jquery: "jquery", underscore: "underscore" }], 66: [function(require, module, exports) { function emptyForm(type, ctx) { if (!~["login"].indexOf(type)) return []; ctx = ctx || document; var els = $(ctx).find("form").toArray().filter(function(el) { return isEmpty(el) && isNotIgnored(el) }); if (!els.length) return []; var cached = [] , parents = els.map(function(el) { var parent = el.parentNode; return $(parent).data(version + ":pb-role") === "form:" + type && cached.push(parent), parent }).filter(isNotIgnored).filter(isNotInForm); if (cached.length) return cached; var logins = parents.filter(is("login")).filter(function(el) { var roles = classifyLoginForm(el); return 1 == roles.username.length && roles.password.length <= 1 && 1 == roles.submit.length }) , others = parents.filter(function(e) { return !isType("login", e) && !isType("signup", e) }).filter(function(el) { var roles = classifyLoginForm(el); return 1 == roles.username.length && 1 == roles.password.length && 1 == roles.submit.length }); return logins.concat(others) } function is(type) { return function(el) { return isType(type, el) } } function isEmpty(el) { return el && !el.innerHTML } var classifyLoginForm = (require("debug")("fdetect:form-finders:empty-form"), require("../form-classifiers/login")) , isType = require("../element-categorizers") , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , isNotInForm = require("../utils/is-not-in-form") , version = (require("../utils/is-not-in-ignored-element"), require("../utils/version")); exports = module.exports = emptyForm, exports.name = "emptyForm" } , { "../element-categorizers": 14, "../form-classifiers/login": 58, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/is-not-in-ignored-element": 79, "../utils/version": 81, debug: 148, jquery: "jquery" }], 67: [function(require, module, exports) { function formWithTwoFactor(formType, ctx) { if ("two-factor" !== formType) return []; ctx = ctx || document; var els = $(ctx).find("form").toArray().filter(function(el) { return isNotIgnored(el) }) , cached = els.reduce(function(cache, el) { return $(el).data(version + ":pb-role") === "form:" + formType && cache.push(el), cache }, []); return cached.length ? cached : els.filter(function(el) { return is2Factor(el) && has2FactorField(el) && hasNoUsernameOrPassword(el) }) } function has2FactorField(el) { return 1 == findCodeField(el).length } function hasNoUsernameOrPassword(el) { var search = findSearch(el) , username = findUsername(el) , email = findEmail(el) , password = findPassword(el); return !(search.length || username.length || email.length || password.length) } var findCodeField = (require("debug")("fdetect:form-finders:payment:form-with-2fa"), require("../field-finders/two-factor-code")) , findUsername = require("../field-finders/username") , findEmail = require("../field-finders/email") , findPassword = require("../field-finders/password") , findSearch = require("../field-finders/search") , is2Factor = require("../element-categorizers/two-factor") , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , version = (require("../utils/is-not-in-form"), require("../utils/is-not-in-ignored-element"), require("../utils/version")); exports = module.exports = formWithTwoFactor, exports.name = "formWithTwoFactor" } , { "../element-categorizers/two-factor": 18, "../field-finders/email": 35, "../field-finders/password": 44, "../field-finders/search": 47, "../field-finders/two-factor-code": 50, "../field-finders/username": 52, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/is-not-in-ignored-element": 79, "../utils/version": 81, debug: 148, jquery: "jquery" }], 68: [function(require, module, exports) { function formWithAddressFields(type, ctx) { if ("address" !== type) return []; ctx = ctx || document.body; var els = $(ctx).find("form").toArray().filter(function(el) { return isNotIgnored(el) }) , cached = els.reduce(function(cache, el) { return $(el).data(version + ":pb-role") === "form:" + type && cache.push(el), cache }, []); return cached.length ? cached : (els = els.filter(function(el) { return isNotInForm(el) }), els.filter(hasNoPassword).filter(hasNoCC).filter(hasAddressFields(4))) } function hasNoPassword(el) { return !findPassword(el).length } function hasNoCC(el) { return !findCreditCardNumber(el).length } function hasAddressFields(min) { return min = min || 1, function(el) { var roles = addressClassifier(el); return Object.keys(roles).filter(function(key) { return !!roles[key].length }).length >= min } } var addressClassifier = (require("debug")("fdetect:form-finders:form-with-address"), require("../form-classifiers/address")) , findCreditCardNumber = require("../field-finders/cc-number") , findPassword = require("../field-finders/password") , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , isNotInForm = require("../utils/is-not-in-form") , version = (require("../utils/is-not-in-ignored-element"), require("../utils/version")); exports = module.exports = formWithAddressFields, exports.name = "formWithAddressFields" } , { "../field-finders/cc-number": 27, "../field-finders/password": 44, "../form-classifiers/address": 56, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/is-not-in-ignored-element": 79, "../utils/version": 81, debug: 148, jquery: "jquery" }], 69: [function(require, module, exports) { function formWithCreditCard(formType, ctx) { if ("payment" !== formType) return []; ctx = ctx || document.body; var els = $(ctx).find("form").toArray().filter(function(el) { return isNotIgnored(el) }) , cached = els.reduce(function(cache, el) { return $(el).data(version + ":pb-role") === "form:" + formType && cache.push(el), cache }, []); return cached.length ? cached : (els = els.filter(function(el) { return isNotInForm(el) }), els.filter(hasPaymentFields)) } function hasPaymentFields(el) { var roles = paymentClassifier(el) , fields = Object.keys(roles).filter(function(key) { return !!roles[key].length }); return 1 == roles.card_number.length && fields.length >= 2 } var paymentClassifier = (require("debug")("fdetect:form-finders:payment:form-with-cc"), require("../form-classifiers/payment")) , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , isNotInForm = require("../utils/is-not-in-form") , version = (require("../utils/is-not-in-ignored-element"), require("../utils/version")); exports = module.exports = formWithCreditCard, exports.name = "formWithCreditCard" } , { "../form-classifiers/payment": 59, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/is-not-in-ignored-element": 79, "../utils/version": 81, debug: 148, jquery: "jquery" }], 70: [function(require, module, exports) { function formWithPassword(type, ctx) { if (!~SUPPORTED_TYPES.indexOf(type)) return []; ctx = ctx || document.body; var els = ctx.nodeName && "form" == ctx.nodeName.toLowerCase() ? $(ctx) : $(ctx).find("form"); els = isNotOtherFormType(type, els); var cached = els.reduce(function(cache, el) { return $(el).data(version + ":pb-role") === "form:" + type && cache.push(el), cache }, []); if (cached.length) return cached; switch (els = els.filter(function(el) { var validator = "reset" == type ? isResetForm : hasPasswordOrUsername; return isNotIgnored(el) && validator(el) }), els = els.filter(function(el) { return isNotInForm(el) }), type) { case "reset": return findResets(els); case "signup": return findSignups(els); default: return findLogins(els) } } function isNotOtherFormType(type, els) { var filteredForms = els.toArray(); return SUPPORTED_TYPES.forEach(function(supTypes) { type != supTypes && (filteredForms = filteredForms.filter(isNot(supTypes))) }), filteredForms } function hasThreeVisiblePasswords(el) { return 3 === $("input[type=password]", el).filter(function() { return visible(this) }).length } function hasPasswordOrUsername(el) { return !!(findPasswords(el).length || findEmails(el).length || findUsernames(el).length) } function isResetForm(el) { return hasThreeVisiblePasswords(el) || hasNewPasswordOrReset(el) } function hasNewPasswordOrReset(el) { return !!findNewPasswords(el).length || !!findResetButton(el).length } function findLogins(els) { if (!els.length) return []; var logins = els.filter(is("login")).filter(function(el) { var roles = classifyLoginForm(el); return roles.visiblePassword = roles.password.filter(visible), roles.username.length <= 2 && roles.visiblePassword.length <= 1 || 1 == roles.password.length && 1 == roles.submit.length && 0 == roles.username.length }) , others = els.filter(function(e) { return !isType("login", e) && !isType("signup", e) }).filter(function(el) { var roles = classifyLoginForm(el) , keys = Object.keys(roles).filter(function(role) { return roles[role].length }) , inputs = el.querySelectorAll("input"); return roles.username.length <= 1 && 1 == roles.password.length && 1 == roles.submit.length && inputs.length < 35 || 1 == roles.username.length && 1 == roles.password.length && keys.length < 3 && inputs.length < 35 }); return logins.concat(others) } function findSignups(els) { if (!els.length) return []; var signups = els.filter(is("signup")).filter(function(el) { var roles = classifySignupForm(el); return Object.keys(roles).filter(function(role) { return roles[role].length }).length >= 2 && roles.password.length >= 1 }) , others = els.filter(function(e) { return !isType("login", e) && !isType("signup", e) }).filter(function(el) { var roles = classifySignupForm(el); return roles.username.length >= 1 && roles.username.length <= 2 && 2 == roles.password.length }); return signups.concat(others) } function findResets(els) { var resets = els.filter(is("reset")); return (resets.length ? resets : els).filter(function(el) { var roles = classifyResetForm(el); return roles && roles.new_password && (roles.confirm_password || roles.current_password || resets.length) }) } function is(type) { return function(el) { return isType(type, el) } } function isNot(type) { return function(el) { return !isType(type, el) } } var findUsernames = (require("debug")("fdetect:form-finders:form-with-password"), require("../field-finders/username")) , findEmails = require("../field-finders/email") , findPasswords = require("../field-finders/password") , findNewPasswords = require("../field-finders/new-password") , findResetButton = require("../field-finders/reset-button") , classifyLoginForm = require("../form-classifiers/login") , classifySignupForm = require("../form-classifiers/signup") , classifyResetForm = require("../form-classifiers/reset") , isType = require("../element-categorizers") , visible = require("visible") , $ = require("jquery") , isNotIgnored = require("../utils/is-not-ignored") , isNotInForm = require("../utils/is-not-in-form") , version = (require("../utils/is-not-in-ignored-element"), require("../utils/version")); exports = module.exports = formWithPassword, exports.name = "formWithPassword"; var SUPPORTED_TYPES = ["signup", "login", "reset"] } , { "../element-categorizers": 14, "../field-finders/email": 35, "../field-finders/new-password": 43, "../field-finders/password": 44, "../field-finders/reset-button": 46, "../field-finders/username": 52, "../form-classifiers/login": 58, "../form-classifiers/reset": 60, "../form-classifiers/signup": 61, "../utils/is-not-ignored": 77, "../utils/is-not-in-form": 78, "../utils/is-not-in-ignored-element": 79, "../utils/version": 81, debug: 148, jquery: "jquery", visible: 236 }], 71: [function(require, module, exports) { function findForms(el, formType) { var res = strategies(formType).reduce(function(ret, strategy, i) { var name = strategy.name + " - " + formType; trace.start(name); var els = strategy(formType, el); return trace.end(name), els.forEach(function(el) { $(el).data(version + ":pb-role", "form:" + formType), $(el).data(version + ":pb-form-finder", strategy.name), ~ret.indexOf(el) || ret.push(el), "payment" != formType && $(el).parents().data("pb-ignore", !0) }), ret }, []); return _.uniq(res) } function strategies(formType) { switch (formType) { case "two-factor": return [formWithTwoFactorStrategy]; case "login": return [formWithPasswordStrategy, emptyFormStrategy, containerWithPasswordStrategy]; case "signup": return [formWithPasswordStrategy, containerWithPasswordStrategy]; case "payment": return [formWithCCStrategy, containerWithCCStrategy]; case "address": return [containerWithAddressFieldsStrategy, formWithAddressFieldsStrategy]; case "reset": return [formWithPasswordStrategy]; default: return [formWithTwoFactorStrategy, containerWithPasswordStrategy, formWithPasswordStrategy, containerWithCCStrategy, formWithCCStrategy, containerWithAddressFieldsStrategy, formWithAddressFieldsStrategy] } } var formWithPasswordStrategy = require("./form-with-password") , emptyFormStrategy = require("./empty-form") , containerWithPasswordStrategy = require("./container-with-password") , formWithCCStrategy = require("./form-with-cc") , containerWithCCStrategy = require("./container-with-cc") , formWithAddressFieldsStrategy = require("./form-with-address-fields") , containerWithAddressFieldsStrategy = require("./container-with-address") , formWithTwoFactorStrategy = require("./form-with-2fa") , _ = require("underscore") , $ = (require("debug")("fdetect:form-finders"), require("jquery")) , version = require("../utils/version") , measure = require("../../../measure") , trace = measure(version); module.exports = findForms } , { "../../../measure": 132, "../utils/version": 81, "./container-with-address": 63, "./container-with-cc": 64, "./container-with-password": 65, "./empty-form": 66, "./form-with-2fa": 67, "./form-with-address-fields": 68, "./form-with-cc": 69, "./form-with-password": 70, debug: 148, jquery: "jquery", underscore: "underscore" }], 72: [function(require, module, exports) { function getForms(options) { options = options || {}; var res = []; trace.flush(); var elsByFormType = detect(options) , performance = trace.measures(); trace.flush(); for (var formType in elsByFormType) { elsByFormType[formType].forEach(function(el) { var ret = [] , fieldsByFieldType = getFields(el, formType); for (var fieldType in fieldsByFieldType) { fieldsByFieldType[fieldType].forEach(function(el) { var field = { fieldType: fieldType, el: el, selector: cssPath(el) }; ret.push(field) }) } var formFinderName = $(el).data(version + ":pb-form-finder"); res.push({ el: el, version: exports.version, selector: cssPath(el), formType: formType, formFinder: formFinderName, url: location.href, fields: ret, context: cssPath(options.ctx || document.body), performance: performance }) }) } return res } function detect(options) { trace.start("detect"), options = options || {}; var opts = {}; _.isString(options.detect) && (opts.detect = options.detect.split(" ")), opts.detect && opts.detect.length || (opts.detect = options.detect && options.detect.length ? options.detect : FORM_TYPES), opts.ctx = options.ctx || document.body, opts.filters = options.filters || {}, FORM_TYPES.forEach(function(formType) { opts[formType] = !!~opts.detect.indexOf(formType), opts.filters[formType] = opts.filters[formType] || {} }); var res = opts.detect.reduce(function(ret, formType) { return !opts[formType] || ret.reset && ret.reset.length ? ret : (ret[formType] = get(formType, { ctx: opts.ctx, filters: opts.filters, isMutation: options.isMutation }), ret) }, {}); return trace.end("detect"), res } function get(formType, options) { var ignoreString = Object.keys(options.filters).map(function(key) { return options.filters[key].ignore }).filter(Boolean).join(","); if (options.filters[formType] && options.filters[formType].force && options.filters[formType].force.length) { var res = $(options.filters[formType].force + ":not(" + ignoreString + ")", options.ctx); if (res && res.length) return res.toArray() } var ctx = options.isMutation && options.ctx.parentElement ? options.ctx.parentElement : options.ctx , els = $(ignoreString, ctx); return els.data(version + ":pb-ignore", !0), els.find("*").data(version + ":pb-ignore", !0), _.uniq(findForms(options.ctx, formType)).filter(identity) } var findForms = require("./form-finders") , getFields = require("./form-classifiers") , version = require("./utils/version") , $ = require("jquery") , _ = require("underscore") , identity = function(_) { return _ } , measure = require("../../measure") , trace = measure(version) , cssPath = require("../../css-path") , FORM_TYPES = ["reset", "two-factor", "login", "signup", "payment", "address"]; exports = module.exports = detect, exports.roles = getFields, exports.getForms = getForms, exports.version = version } , { "../../css-path": 4, "../../measure": 132, "./form-classifiers": 57, "./form-finders": 71, "./utils/version": 81, jquery: "jquery", underscore: "underscore" }], 73: [function(require, module, exports) { function concat(regexps) { return reduce(groupByModifiers(decompose(regexps))) } function decompose(regexps) { return regexps.map(function(re) { return "string" == typeof re ? { source: re, modifiers: "" } : { source: re.source, modifiers: (re.ignoreCase ? "i" : "") + (re.multiline ? "m" : "") + (re.global ? "g" : "") } }) } function groupByModifiers(src) { return src.reduce(function(res, re) { return res[re.modifiers] = res[re.modifiers] || "", res[re.modifiers].length && (res[re.modifiers] += "|"), res[re.modifiers] += "(" + re.source + ")", res }, {}) } function reduce(groups) { return Object.keys(groups).reduce(function(res, g) { return res.push(new RegExp(groups[g],g)), res }, []) } module.exports = concat } , {}], 74: [function(require, module, exports) { function filterElementByAttributes(el, attrs, acceptedRegex, rejectedRegex) { if (arguments.length < 3 || !el || !attrs.length || !acceptedRegex.length) return !1; rejectedRegex = rejectedRegex || []; var $el = $(el) , foundMatch = attrs.some(function(attr) { var text = $el.attr(attr); return acceptedRegex.some(function(reg) { return reg.test(text) }) }); return foundMatch && (foundMatch = !attrs.some(function(attr) { var text = $el.attr(attr); return rejectedRegex.some(function(reg) { return reg.test(text) }) })), foundMatch } var $ = require("jquery"); module.exports = filterElementByAttributes } , { jquery: "jquery" }], 75: [function(require, module, exports) { function findInputForLabel(el) { var input, label = $(el), id = label.attr("for"); if (id) { label.parents().toArray().some(function(e) { var selector = "input[id='" + id + "'],input[name='" + id + "'],select[id='" + id + "'],select[name='" + id + "']" , el = $(e).find(selector)[0]; if (el && "hidden" != el.type) return input = el, !0 }) } else input = label.find("input:not([type=hidden])")[0], !input && el.nextElementSibling && (input = "INPUT" == el.nextElementSibling.nodeName && el.nextElementSibling); return input } var $ = require("jquery"); module.exports = findInputForLabel } , { jquery: "jquery" }], 76: [function(require, module, exports) { function findLabelForInput(el) { return parentLabel(el) || forLabel(el) || siblingLabel(el) } function parentLabel(el) { return $(el).parent("label")[0] } function forLabel(el) { var label, id = $(el).attr("id"); return id && (label = document.querySelector("label[for='" + id + "']")), label } function siblingLabel(el) { return $(el).prev("label").toArray().filter(function(el) { return el && el.getAttribute && !el.getAttribute("for") })[0] } var $ = require("jquery"); module.exports = findLabelForInput } , { jquery: "jquery" }], 77: [function(require, module, exports) { function isNotIgnored(el) { return !$(el).data(version + ":pb-ignore") } var $ = require("jquery") , version = require("./version"); module.exports = isNotIgnored } , { "./version": 81, jquery: "jquery" }], 78: [function(require, module, exports) { function isNotInForm(el, formTypes) { var role = $(el).data(version + ":pb-role") , roles = "string" == typeof formTypes && formTypes.split(" ").map(function(r) { return "form:" + r }); if (role) if (roles) { if (~roles.indexOf(role)) return !1 } else if (~role.indexOf("form:")) return !1; var target = el.parentNode , ret = !0; try { for (; target && ret; ) { var tag = $(target).data(version + ":pb-role") || ""; tag && (ret = roles ? !~roles.indexOf(tag) : !~tag.indexOf("form:")), target = target.parentNode } } catch (e) { ret = !0 } return ret } var $ = require("jquery") , version = require("./version"); module.exports = isNotInForm } , { "./version": 81, jquery: "jquery" }], 79: [function(require, module, exports) { function isNotInIgnoredElement(el) { var target = el.parentNode , ret = !0; try { for (; target && ret; ) ret = !~$(target).data(version + ":pb-ignore"), target = target.parentNode } catch (e) { ret = !0 } return ret } var $ = require("jquery"); module.exports = isNotInIgnoredElement } , { jquery: "jquery" }], 80: [function(require, module, exports) { function comparePosition(a, b) { return a.compareDocumentPosition ? a.compareDocumentPosition(b) : a.contains ? (a != b && a.contains(b) && 16) + (a != b && b.contains(a) && 8) + (a.sourceIndex >= 0 && b.sourceIndex >= 0 ? (a.sourceIndex < b.sourceIndex && 4) + (a.sourceIndex > b.sourceIndex && 2) : 1) + 0 : 0 } exports.sort = function(els) { return els.sort(function(a, b) { return 3 - (6 & comparePosition(a, b)) }) } , exports.before = function(el, els) { return els.filter(function(e) { return 3 - (6 & comparePosition(el, e)) > 0 }) } , exports.after = function(el, els) { return els.filter(function(e) { return 3 - (6 & comparePosition(el, e)) < 0 }) } } , {}], 81: [function(require, module, exports) { var meta = require("../../component.json") , src = meta.repository.split("/") , org = src[0] , repo = src[1] , version = meta.version; module.exports = org + "~" + repo + "@" + version } , { "../../component.json": 12 }], 82: [function(require, module, exports) { function sendFeedback(opts) { opts = opts || {}; var $forms = $("form") , $formsWithPassword = $("form:has(input[type=password])") , passwordFields = $("input[type=password]").toArray().map(cssPath) , params = { feedback_type: opts.type || "feedback", feedback_content: opts.content || "no_content", website_url: metrics.url, domain: metrics.domain, browser_name: metrics.browserName, browser_version: metrics.browserVersion, context: metrics.context, asset_count_for_domain: metrics.assetCountForDomain, is_logged_in: metrics.isUserLoggedIn, page_atlas_api_timeout: metrics.apiTimeout, page_atlas_forms_found_in_page: metrics.atlasForms.length, page_fdetect_forms_found_in_page: metrics.fdetectForms.length, page_atlas_forms_from_background: metrics.backgroundForms.length, page_atlas_forms_from_localstorage: metrics.localStorageForms.length, page_forms_count: $forms.length, page_forms_with_password_count: $formsWithPassword.length, page_password_fields_selectors: passwordFields.join(", ") }; exports.framework.sendMessage({ faTrigger: "mixpanel_track", mixpanel_event: "exp_feedback_from_users", mixpanel_params: params }) } function reportBrokenSite(request, opts) { opts = opts || {}; var notify = opts.notify || alert; location.href === request.pageUrl && (sendFeedback({ type: "report_broken_site", content: request.content }), notify("Your report has been sent to the True Key app’s support/engineering team. They will take a closer look at your issue as soon as possible.\n\nDon’t worry, you’ll remain anonymous.")) } function reportFeedback(request) { location.href === request.pageUrl && sendFeedback({ type: "feedback" }) } var $ = require("jquery") , framework = require("../framework") , cssPath = require("../css-path") , metrics = require("../metrics"); exports.reportBrokenSite = reportBrokenSite, exports.reportFeedback = reportFeedback, exports.framework = framework } , { "../css-path": 4, "../framework": 121, "../metrics": 135, jquery: "jquery" }], 83: [function(require, module, exports) { function triggerClick(el) { triggerEvent(el, "mousedown", { detail: 0 }), triggerEvent(el, "mouseup", { detail: 0 }), el.click(), (Target.IOS || Target.ANDROID) && (triggerEvent(el, "touchstart", { detail: 0 }), triggerEvent(el, "touchend", { detail: 0 })) } function fillInput(input, value) { input.focus(), "password" === input.type && input.setAttribute("hercules-fillInputInProgress", "true"), triggerEvent(input, "focus"), triggerEvent(input, "keydown"), input.value = value, triggerEvent(input, "input", { bubbles: !0 }), triggerEvent(input, "change"), triggerEvent(input, "keyup"), triggerEvent(input, "keypress"), triggerEvent(input, "payload"), triggerEvent(input, "blur") } function triggerEvent(el, type, options) { var e, bubbles = !1, cancelable = !0; options = options || {}, bubbles = _.has(options, "bubbles") ? options.bubbles : bubbles, cancelable = _.has(options, "cancelable") ? options.cancelable : cancelable, options.bubbles = bubbles, options.cancelable = cancelable, "string" == typeof el && (options = type, type = el, el = document), e = Target.EDGE ? new Event(type,options) : createEvent(type, options), el.dispatchEvent ? Target.EDGE ? el.dispatchEvent(e, !0) : el.dispatchEvent(e) : el.fireEvent("on" + type, e) } function createEvent(type, options) { if (!document.createEvent) return createIeEvent(type, options); switch (type) { case "dblclick": case "click": case "mousedown": case "mouseup": return createMouseEvent(type, options); case "keydown": case "keyup": return createKeyboardEvent(type, options); case "change": case "blur": return createHtmlEvent(type, options); default: return createCustomEvent(type, options) } } function createCustomEvent(type, options) { options = eventOptions(options); var e = document.createEvent("CustomEvent"); try { e.initCustomEvent(type, options.bubbles, options.cancelable) } catch (err) { try { e.initEvent(type, options.bubbles, options.cancelable, options.view) } catch (err) { e = new Event(type,{ bubbles: options.bubles, cancelable: options.cancelable }) } } return e } function createIeEvent(type, options) { options = eventOptions(type, options); var e = document.createEventObject(); return e.altKey = options.alt, e.bubbles = options.bubbles, e.button = options.button, e.cancelable = options.cancelable, e.clientX = options.clientX, e.clientY = options.clientY, e.ctrlKey = options.ctrl, e.detail = options.detail, e.metaKey = options.meta, e.screenX = options.screenX, e.screenY = options.screenY, e.shiftKey = options.shift, e.keyCode = options.key, e.charCode = options.key, e.view = options.view, e } function eventOptions(type, options) { var defaults = { alt: !1, bubbles: !0, button: 0, cancelable: !0, clientX: 0, clientY: 0, ctrl: !1, detail: 1, key: 0, meta: !1, relatedTarget: null, screenX: 0, screenY: 0, shift: !1, view: window } , opts = {}; options = options || {}; for (var prop in defaults) opts[prop] = options[prop] || defaults[prop]; return "dblclick" === type && (opts.detail = 2), opts } function createMouseEvent(type, options) { options = eventOptions(type, options); var e = document.createEvent("MouseEvent"); try { e.initMouseEvent(type, options.bubbles, options.cancelable, options.view, options.detail, options.screenX, options.screenY, options.clientX, options.clientY, options.ctrl, options.alt, options.shift, options.meta, options.button, options.relatedTarget) } catch (err) { try { e.initEvent(type, options.bubbles, options.cancelable, options.view) } catch (err) { e = new Event(type,{ bubbles: options.bubbles, cancelable: options.cancelable }) } } return e } function createKeyboardEvent(type, options) { options = eventOptions(type, options); var e = document.createEvent("KeyboardEvent"); try { (e.initKeyboardEvent || e.initKeyEvent).call(e, type, options.bubbles, options.cancelable, options.view, options.ctrl, options.alt, options.shift, options.meta, options.key, options.key), e.keyCode !== options.key && (Object.defineProperty(e, "keyCode", { get: function() { return options.key } }), Object.defineProperty(e, "charCode", { get: function() { return options.key } }), Object.defineProperty(e, "which", { get: function() { return options.key } })) } catch (err) { try { e.initEvent(e, type, options.bubbles, options.cancelable, options.view) } catch (err) { e = new Event(type,{ bubbles: options.bubbles, cancelable: options.cancelable }) } } return e } function createHtmlEvent(type, options) { options = eventOptions(type, options); var e = document.createEvent("HTMLEvents"); try { (e.initEvent || e.initHtmlEvent).call(e, type, options.bubbles, options.cancelable, options.view) } catch (err) { e = new Event(type,{ bubbles: options.bubbles, cancelable: options.cancelable }) } return e } var Target = require("../target") , _ = require("underscore"); exports.fillInput = fillInput, exports.triggerClick = triggerClick, exports.triggerEvent = triggerEvent } , { "../target": 142, underscore: "underscore" }], 84: [function(require, module, exports) { function validFieldFound(field, cache, isCaptcha) { var isValid = !1; return field.el && !cache ? isValid = !0 : field.el && cache && !field.el.fieldFound ? isValid = !0 : isCaptcha && (isValid = !0), isValid } var $ = require("jquery") , isUrlAlreadyReported = require("./helpers").isUrlAlreadyReported , metrics = require("../metrics") , logger = require("../logger"); module.exports = function(form, cache, suppressLogs) { var allFieldsFound = form.fields.every(function(field) { if (!field.fieldType || "string" != typeof field.fieldType) return !1; var isCaptcha = "captcha" === field.fieldType , $el = $(field.selector); if ($el.size() > 1) { isUrlAlreadyReported("form_field_selector_" + field.selector, metrics.url) || FA.Framework.sendMessage({ faTrigger: "mixpanel_track", mixpanel_event: "atlas_forms_have_issues", mixpanel_params: { atlas_form_issue_type: "form_field_selector", form_selector: form.selector, field_selector: field.selector, field_type: field.fieldType, field_match_count: $el.size(), website_url: metrics.url, domain: metrics.domain } }), field.el = $(form.selector).find(field.selector).get(0), suppressLogs || logger.warn("form-manager", "field selector matches multiple elements " + form.formType + '="' + form.selector + '", field ' + field.fieldType + '="' + field.selector) } else field.el = $el.get(0); isCaptcha || field.el ? field.el && field.el.fieldFound && (suppressLogs || logger.warn("form-manager", "rejecting " + form.formType + '="' + form.selector + '", field ' + field.fieldType + '="' + field.selector + '" element already in a form')) : suppressLogs || logger.info("form-manager", "rejecting " + form.formType + '="' + form.selector + '", field ' + field.fieldType + '="' + field.selector + '" not in the page'); var result = validFieldFound(field, cache, isCaptcha); return result || $(form.selector).attr("yield-handling", "true"), result }); return cache && allFieldsFound && form.fields.forEach(function(field) { "captcha" !== field.fieldType && (field.el.fieldFound = !0) }), allFieldsFound } } , { "../logger": 130, "../metrics": 135, "./helpers": 86, jquery: "jquery" }], 85: [function(require, module, exports) { function isPageAttrEnglish() { var string = $("html, body").attr("lang") || ""; return /^en/i.test(string) } var $ = require("jquery") , logger = require("../logger") , reprocessLoginDetectHints = require("./reprocess-login-detect-hints"); module.exports = function() { var intervalCount = 0 , _this = this , opts = { intervalTime: 3e3, maxIntervalCount: 4, disable: !1 }; if (PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:handleAjaxSubmit", opts), opts.disable) return logger.info("form-manager", "#handleAjax has been disabled by remote exception."), "disabled"; PBCS.init.formStatus.handleAjax = !0, logger.info("form-manager", "#handleAjax settings: intervalTime " + opts.intervalTime + "; maxIntervalCount " + opts.maxIntervalCount), this.checkInterval && clearInterval(this.checkInterval), this.checkInterval = setInterval(function() { var detect, hints; if (logger.log("form-manager", "#handleAjax interval: " + intervalCount), intervalCount > opts.maxIntervalCount) clearInterval(_this.checkInterval), PB.contentscript.reinit(), _this.checkInterval = void 0; else { hints = reprocessLoginDetectHints(), detect = new PB.LoginDetect(document.body,document.URL,hints); var loginResult = { isLoginPage: detect.isLoginPage(), hasLoginValidationError: detect.hasLoginValidationError() }; PB.contentscript.exceptionsManager.trigger("pb:cs:loginDetect", loginResult), logger.debug("form-manager", "#handleAjax detect.isLoginPage(): " + loginResult.isLoginPage), logger.debug("form-manager", "#handleAjax detect.hasLoginValidationError(): " + loginResult.hasLoginValidationError), loginResult.login_detect_reasons && logger.info("form-manager", "#handleAjax exception login_detect_reasons: " + loginResult.login_detect_reasons), !loginResult.isLoginPage || isPageAttrEnglish() && loginResult.hasLoginValidationError ? (clearInterval(_this.checkInterval), PB.contentscript.reinit(), _this.checkInterval = void 0) : intervalCount++ } }, opts.intervalTime) } } , { "../logger": 130, "./reprocess-login-detect-hints": 92, jquery: "jquery" }], 86: [function(require, module, exports) { function addRolesToDom(roles) { roles.forEach(function(role) { role.el && $(role.el).attr("pb-role", role.fieldType) }) } function getFieldsByType(fields, types) { return fields && types ? (_.isArray(types) || (types = [types]), fields.filter(function(field) { return ~types.indexOf(field.fieldType) })) : [] } function isUrlAlreadyReported(type, url) { var records = persistenceUtils.getItem("tk_reported_urls"); try { records = JSON.parse(records) } catch (e) { logger.log("form-manager", "error parsing is url already reported data", e) } return records || (records = {}), records[type] ? !!_.find(records[type], function(record) { return record.url === url }) || (records[type].push({ url: url }), persistenceUtils.setItem("tk_reported_urls", JSON.stringify(records)), !1) : (records[type] = [{ url: url }], persistenceUtils.setItem("tk_reported_urls", JSON.stringify(records)), !1) } function hasCaptcha(ctx, opts) { ctx = ctx || document; var $captcha = $("[id*=captcha],[class*=captcha],[src*=captcha],[src*=mollom],[alt*=captcha]", ctx); return opts = opts || {}, _.defaults(opts, { visibilityCheck: !0 }), opts.visibilityCheck && ($captcha = $captcha.filter(function() { return isVisible(this) })), $captcha = $captcha.filter(function() { return !$(this).is("div") || !DomHelpers.isEmpty(this) }), !!$captcha.length } function formHasVisibleCaptcha(form) { var captchaField = getFieldsByType(form.fields, "captcha") , hasVisibleCaptcha = !1 , $captcha = []; return captchaField.length && ($captcha = $(captchaField[0].selector)), $captcha.length ? (logger.log("form-manager", "form has an Atlas-defined captcha field present on the page, checking it's visibility"), $captcha = $captcha.filter(function() { return isVisible(this) }), hasVisibleCaptcha = !!$captcha.length) : (logger.log("form-manager", "form has no captcha field defined, or no defined fields present, checking for potential captcha fields"), hasVisibleCaptcha = hasCaptcha(form.el)), hasVisibleCaptcha } var $ = require("jquery") , _ = require("underscore") , logger = require("../logger") , isVisible = require("visible") , DomHelpers = require("../dom-helpers") , persistenceUtils = require("../persistence/utils.js"); module.exports = { addRolesToDom: addRolesToDom, getFieldsByType: getFieldsByType, isUrlAlreadyReported: isUrlAlreadyReported, hasCaptcha: hasCaptcha, formHasVisibleCaptcha: formHasVisibleCaptcha } } , { "../dom-helpers": 5, "../logger": 130, "../persistence/utils.js": 140, jquery: "jquery", underscore: "underscore", visible: 236 }], 87: [function(require, module, exports) { function addIconsToForm(form, opts) { logger.log("icons", "Adding icons to form.", form), opts = opts || {}, opts.hasOwnProperty("visible") || (opts.visible = !0), opts.technique = opts.technique || form.technique, $(form.el).attr("autocomplete", "off"); var curriedAddIconToField = function(field) { return addIconToField(field, form.formType, opts) }; form.fields.forEach(curriedAddIconToField) } function addIconToField(field, formType, opts) { var enabledFieldType = ~ENABLED_FIELD_TYPES.indexOf(field.fieldType) , $el = $(field.el) , tkIconType = "main"; if (InputWatcher.isInputWatched($el)) return logger.log("icons", "Exiting. Not adding icon for this field. Input is being watched.", field), !1; if (!enabledFieldType) return "submit" !== field.fieldType && logger.log("icons", "Not adding icon for this field.", field.fieldType, "should not contain an icon. Selector:", field.selector), !1; logger.log("icons", "Adding icons to field.", field), opts = opts || {}, opts.hasOwnProperty("visible") || (opts.visible = !0), opts.debug && opts.technique && !~opts.technique.indexOf("atlas") && (tkIconType = "black"); var defaultIcon = tkIcons[tkIconType]["default"] || tkIcons.main["default"] , $icon = $("") , zIndex = $el.css("z-index") , compareTo = "auto" === zIndex ? 0 : zIndex; "login" === formType && removeExistingIcon($el, field.fieldType), $el.parent().append($icon); var zIndexes = $el.siblings().map(function() { return +$(this).css("z-index") }); _.each(zIndexes, function(value) { !isNaN(value) && value + 1 > compareTo && (zIndex = value + 1) }), $icon.css({ display: "none", position: "absolute", background: "url(" + defaultIcon + ") center right no-repeat", width: 30, height: $el.outerHeight(), zIndex: zIndex, visibility: opts.visible ? "visible" : "hidden" }).attr("pb-icon", field.fieldType).attr("icon-type", tkIconType), opts.visible && $icon.fadeIn(800), InputWatcher.watchInput($el); var onMove = function() { updatePosition($el, $icon) }; $(Target.IE ? window.self : window).on("resize", onMove), $el.on("pbOnMove", onMove), $el.on("pbOnShow", function() { $icon.show() }), $el.on("pbOnHide", function() { $icon.hide() }), onMove() } function defineIconClick($icon, callback) { var iconType = $icon.attr("icon-type") || "main" , iconDefault = tkIcons[iconType]["default"] , iconHover = iconDefault; tkIcons[iconType].hover && (iconHover = tkIcons[iconType].hover), $icon.css({ cursor: "pointer" }).hover(function() { $icon.css("background-image", "url(" + iconHover + ")") }, function() { $icon.css("background-image", "url(" + iconDefault + ")") }), $icon.off("click"), $icon.on("click", function(e) { e.preventDefault(), e.stopPropagation(), callback(e) }) } function removeIconClick($icon) { try { $icon instanceof $ && ($icon.css("cursor", "default"), $icon.unbind("mouseenter mouseleave"), $icon.off("click")) } catch (e) { logger.error("icons", "Could not unbind Icon functionality.", e) } } function updatePosition($el, $icon) { var position = $el.position() , offsetParent = $el.offsetParent(); isNaN(position.left) && (position.left = 0), isNaN(position.top) && (position.top = 0), offsetParent.is("body") && (offsetParent.css("margin-left") === offsetParent.css("margin-right") && "auto" === offsetParent.css("margin-left") || (position.left -= parseInt(offsetParent.css("margin-left")) - parseInt(offsetParent.css("margin-right")))); var marginTop = parseInt($el.css("margin-top")); _.isNaN(marginTop) && (marginTop = 0), isNaN(position.left) && (position.left = 0), $icon.css({ top: position.top + marginTop, left: position.left + $el.outerWidth() - 30, height: $el.outerHeight() }) } function removeExistingIcon($el, fieldType) { var $existingIcon = $el.siblings("passwordboxicon[pb-icon=" + fieldType + "]"); $existingIcon.length && $existingIcon.remove() } var InputWatcher = require("../../input-watcher") , $ = require("jquery") , _ = require("underscore") , Target = require("../../target") , logger = require("../../logger"); exports.addIconsToForm = addIconsToForm, exports.addIconToField = addIconToField, exports.defineIconClick = defineIconClick, exports.removeIconClick = removeIconClick; var ENABLED_FIELD_TYPES = ["username", "password", "card_number", "current_password", "new_password", "confirm_password"] , tkIcons = require(Target.LEGACY ? "./pb-icons.json" : "./tk-icons.json") } , { "../../input-watcher": 124, "../../logger": 130, "../../target": 142, "./pb-icons.json": 88, "./tk-icons.json": 89, jquery: "jquery", underscore: "underscore" }], 88: [function(require, module, exports) { module.exports = { main: { "default": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowOTNGRTI3REQyOTQxMUUxOTY3NDk1OEY5Nzc4MDgyRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowOTNGRTI3RUQyOTQxMUUxOTY3NDk1OEY5Nzc4MDgyRCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA5M0ZFMjdCRDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA5M0ZFMjdDRDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+vG1KUAAABBpJREFUeNqElF1oHFUUx/93ZnZm9iOb3c2XyaaJqW0Sq2Jiq1YJNlDqBxSqQmtAfRAfpKJSQR8UpIhglYoRwYeKor5JqEIV1FBroi3SxESLaa3VtKY2H2V3s5vsZmd2Pu69nh2fs7lwmZnLnfO/53f/57B3v+i/Sw8ZIV2rg6aGmaIYiqqYUFiIqYrOAJUJyWVEbxchrU5I6QuASUgpJLjwuS9oBw3X2zfw+nmsM7RUzLhTUwUc/xJCoSjCRj3qws2IhdugqjqJKxSX4YbEZhihVrjeGrjP4XEXrmvTtwXbseG4rBpvfaFCcc0KG9FIb/ogwuE4LUksFy/hujWLRKwTiqLRmg9dycPQFHh+BYIHudC7R9OFT0/X4zZqDK1UtqSCKHZ0v4xoTP1/leCc+u0w8sVJ1Ec7KSMenJzJchBYSoCTmM89elanT2JEssZQXJdJx62e0MHkhU/x2TcPw/Eq2NbxBByHo+IUkVu5jOXVK7CcPCQdomRlULazhM5CobhEInxjoUqF7scRxD+ChdwFjE6dQHEtj6jZhELpX6xZFdzc/jS600NkiwQyhb/Q0TRIWHsoSw/be56iK4zAdouiJjqrIqSueUHQB3a8hntveRYauW5k7HHYto2Bu49gU1tPsLmzZRdOnH6OTGKib8tjWMz9gabkFoxNv0d4DdTMyLaFtGwR8FaVEBriNyISjmGllEM6tScQmZj5BKOTr1bNh1s3P4rRicNwfRttTdvwwy/DWC1dJ8TOBugcKe2KRCreieNjb2LPIQUzl0/iyfu/RLpxAB5h/W7yDZz5/X3K+ipaG/rxz8IU5hbPBgHmFn+FVSnDsmujUxwykeNyCOGRw9pBTsVC9gri0UaYeoqyUOgODeQKZYS0SIBYV1uQbu4PAtze/QgWM3+TUcq1M/LIcRVyl0J1uXfXMzh9TGLf4PO4unQOX58ZhqYDB3YPY+89b1ERN2F8+iMMbn8hsPT41MfYedsQulp3IrM8V1NICylh6ZHQByMvobfrDjrpVnBZwfFTRzH95zg+//YIhh56BX09DxKyaczM/oj9u9/G9xPH8NVP71BdcaorY0N7s/0vbj0oJVMyK/NUPxZM0yRcEol4KpgrpWu4r+8AbtrUi7PnR+iPEBWuRrU1TyhNFFbn0VzXAS0c844e+vnDdTOCnRwXzGptCHc1yKifgMJ1pkpCycjePiJmG05OjODcbAwtjR2wrLXqxVMJhME9QybM3mWH84xtiWs10TEev8igXmRCo6oXkKpXRy0nKVSe9DSe4qpIxox00tRNdWXFzlMfzSqyOStEJKfKaF6qzHeMTNDQawpV+1jQvEBFQkiYQAlMLUnJlxhEPTW+JDWqBs/zNXhaFr6ehTQLkIZkTCfMfoCasZo6+E+AAQCmTgzZSvGiZwAAAABJRU5ErkJggg==", hover: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMzBDREM2Q0QyOTUxMUUxOTY3NDk1OEY5Nzc4MDgyRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMzBDREM2REQyOTUxMUUxOTY3NDk1OEY5Nzc4MDgyRCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA5M0ZFMjdGRDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA5M0ZFMjgwRDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+eoBaUQAABCJJREFUeNqElGtoHFUYht8zMzuX3c02zdVcmjS9ZJNoaWILVgk2UGoVClWhNaD+EH8URaWC/lDQUgSrVIwICgUl+k9CFaqghrYm2ipNmjTBNGo1rakmad1cdrObndm5nHP8dvzddeAws4ed7z3fM+/7sXc/7zqmR4y4rpVBUy1FUQxNVUymsIiiKroCqIqQXET1xiCilQVSBh7AOKT0JXgQ8MBXmQiE8PIHuo99iNtcWkXceF1TBdzgKiKRGCxjHcqsGsSteqiqTuKkxRjuKN8EI1IHz1+j8hw+9+B5Dv224bgOXI8V691eKJ1d+8cyYrVtDc/AshK0JbGcvYpb9gzK481QFI32AujKCgxNgR8UIDj1IgJ69ml5COju+XwRJS4tl7e5ghh2tr6MWFz9b1cA5yaOYiU7inWx5pBU8eRM5sPCUgKcxALu0724AhITvJSQ4nlMuF7xhC5Gpz/Bp18/DNcvoKPpCbguR8HNYilzDcur12G7K5B0iJydQt5ZJHQ20tmbJML/X6hQENJ1BfGPYn5pGoNjp5FdW0HMrEY69xfW7ALaG59Ga0MvVFaOVPp3NFX3ENYkdeljR/Ip+oRROF62pJBmF4TQNT8sum/na7jvzmehKSYGhh6H4zjovuc4NtQnwz831+7G6fPPkUlMdG55DAtLv6B6/RYMjb9HeA1RsiPHEcJ2RMhbVSKoTGxE1Iojk1tCQ8XeUGRkqh+Do68WzYe7Nj2KwZGj8AIH9dUd+O5SH1ZztwixW1qo4ErhFCQqEs04NfQm9h5RMHXtDJ584As0VHXDp/e/HX0DF35+n7q+gbrKLvw5P4bZhYthgdmFy7ALedhOaXSK64HMwCGETw5rBDkV84vXkYhVwdQrqAuFTGFgKZ1HRIuGiHW1Fg01XWGB7a2PYCH1BxklH5QU8j0pCuQuhXK5f/dhnD8pcaDnedy4OYmvLvRB04FDe/qw/963KMTVGB7/CD07XggtPTz2MXZt60VL3S6klmdLotMiiiV9Evpg4CW0tdxNJ90KLgs4de4Exn8bxmffHEfvQ6+gM/kgIRvH1Mz3OLjnbZwdOYkvf3iHclWcRkbR3iWF2MEXt3pSskgqM0f5sWGaJuGSKE9UhCuT+xv3dx7C5g1tuHhlgN6IUHA1ytYcoTSRXp1DTVkTNCueO3Hkp8RtO4Kz/rBgdnel1bJNxoIkFJ5gqiSUjOwdIGrW48zIACZn4qitaoJtrxU/PEXAAvcNXm62TbmcX3JscbYkOsYT/QxqPxMapV5Aqv5GGjlJofJ2X+MdXBXtcaOhw9RNI5NxrtAcnVBkzWUhohOqjE1LlTmukaJOJUoKFedYOLxAISEkTGAWTJ2Vkv/IIDbT4GujQbXd94MofG0MgT4Jaf4KaXDGdMIchKgZK6mDfwUYAKr8DqKXqYU3AAAAAElFTkSuQmCC" }, black: { "default": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA0JJREFUeNqMVE0so2EQflqtsqpIUESkNLItNnv1s0LCTSQSB5xwsXFyd9hk4yxue3FoiBAHB8KBbDjtxTa1ye6mIQ71bzUEVaW/O89Ej1qTTN7ve9935pl5ZuY1TExMfM3NzbXm5eVBVqPZbDaJGnJycowmk8loMBiMSZGSkpJ4fn5+PJFIRGUvkUqlYrLN/5h8x0XCw8PD3/CKmMT4ixji5uYGBCsoKEBxcTGKiooggDAajRBHqK+v171IJAJxjlgshufnZzw9PanyW+R1oFAo9E/A7B0dHQpCOTs7w8XFBcrLyyGZQSLH7e0tJGpEo1H9T4OlVc6CyCCmx8fHhFCG3t5ezYjCDJaWlhAIBFBWVqb/jFqoVKf8JxiB05ogcgYxynkyfXlrawtTU1NKQ3t7uzoNh8M4Pz/H5eUlJHsFYXZ3d3cKfn19rdllBRJnrCQsFguOjo6wvb2tTmw2G66urrQmnZ2daGlpgVCM09NTNDY2oqqqSgPp7u7WWpKZbEBJZhAMBjE0NISFhQU1nJ6eVpDBwUEFampqUqesEc+ZcWtrK6qrq3F8fMz9ZFagl2JqDex2uzYF6aHz2tpabG5uYn5+HuxOOmcwBHQ4HFhZWdGOlWAzAwmAArHD5ubmlCKv14vJyUm4XC6lZ3FxEWtra0plXV0d9vf34ff71cHBwQFpYy3f1gysZWlpqXYT68CZsVqtOkeU+/t7rSPBCgsL4XQ6db+trQ0nJyekOf6mjEhLf3+/ZjMwMIDDw0MsLy/rHI2Pj2NkZETBNzY20NfXp4Gtr6+jq6tLM5fOzEidSWYoRaCZmRm43W7U1NQoXazD7u4uPB4PRkdH0dzcrJT5fD6MjY1hdXVVZ42ADIbMZAIy9PT0RGU1kxLORXpo+QxR2Y2MmlTt7OyoU2bP+xx0nnOopYFCs7OztlczEvksGXySyx9kGN+L2uiIDtlZ8pjqIJO2yspKPDw86BCzxfm4VlRU/Babn3L3e0bqxMAjq4fO2Qhi5CCg7LmFjgbZcwtYgzSARUD+SFB70hQ+CXBPbP9Ks0TIBF+MjEC8QCUQVSQga0D2fsjqFHXJ90cBeCdnXnH8S9QvmmBHvthklf8CDADF4BuEaCwqKgAAAABJRU5ErkJggg==" }, experimental: { "default": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAQCAYAAAABOs/SAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA0tJREFUeNrEVUtIVFEY/s69M47jNJpDWpllISkmRUEmRRERiCBBRLkoeqxaRIu0omgTtWhRkBBFLSp60KJlGaVELyqzIkxLsYdFPged7DUzztxz7zn954yJTFGMm87wcR73zP3+739dJqXE/xiu8w3l9YwBkkk1oMxghgQd6bU6YVKw0jwGIRlsB7D1bICPwnIYqlc8XpMSsQH6GQY87gwmmQ0hRogYMAnQMxELhy4K2EIZRSYRmUQCQpvIUlfMbSBnUiHWLr+kDxxhoWvgBp6/OQbTlBDkDpNgCwaukKTUJljWBIgdIrbtxKYv9Ax+73QUzViHD/23MfStRatXgv5Gygk1NTX/JKurqxtbG7ZNsXMSFj95dRINT/fodbo7B+qZCT8CmYtIfZ4mZCwAT1qBJp2atRJpxlQin0ByKbUjsYjezC/cCJfpIXdzDITakeWdi6plpyj+fkgp8OLdAbrlxeKig2jqOIIlxbW43LgOnI+5+gJhaxLHRcK2ZGLDoSzldqKkimdVonDGKgQ/v8b3cAhlJTvhNr1433cTcT6Movzt+Dh4F5FYEOXFu/G+9w4i0ch44h2EjnHv7xg9+20YnNzpjLr62oN9qH90ANMCpZg3ez1yJhfjbU8j7r88jPbuM8jMmIN4XKKzu55c70FX7yNNyvnY+6KEDaPz+PXvxA6p/ZVcw9+D6Pz4AOGREJEWUWk5sHhcx5OTa2wnRokE5E5eoO8X5q/WpJGowB9UJqtPKicOKRLFiC1VZxG3wshIz0bnp3voHWwj91cg+LUVc6dXk2Fd8KUXYGZuOZ6+voSy0k1UaqfJmCD+ENd/lBMZG47+QPOrqwhk5SPTl4ueYBuaXl6B3xfA5qoyVCw+pJPrVvNelBZUo2+wFQ9bLlIiZsPnmYJBEUw5q9n+E0uvU4Ngqm1SA9NQ+lWDUmeBrDwsLKnE52+t+DTQBo9rCr7+GEY4YoPHHSjDVVs9WtOUWsuMcP7GxdhMl2FmuA3GDGJU5Cpqag596Sd15+Dzpul4RqMhHVNNSozU2ywHsj9lxeM3tcfLPTFprSD+MpfBZpvMCKRR+nq8DP50N2KWtKIxe8jiot0R8ubxXc8+/Ppvql859r8+iz8FGABgR4wFnZ402AAAAABJRU5ErkJggg==", hover: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAQCAYAAAABOs/SAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA05JREFUeNrEVUtIVFEY/s69M44z02gNaWnWFJKiUhRoUhQRQQS2CCmDoseqRbQoK4o2UYsWBS2i16KgBy1aRtGD6EVmVkRqKvawGNMcbDQf87zn3nP67xkTmSKZNp3h4zzumfv93/+6TEqJ/zHYpbtLJGOAZDI17ENNHYHWtJdgUmgVhQxCMpgWYKpZAx+DYTHUrXjOMiF2aKCfpsHl9DDJTCZEnIgBnUCPmK4RsbDoooApbKPo/UQmkYKAzccyVuzgJpA3pRjrl19VB5Yw0NV3G6/fn4SuSwjSrhNMwcBtpCk1CYbxD8QWEZtmatMbfgWfuwAls2rx+dsDfB9+q9Tbgv5GygmBQGBSsmAwOL7WTJNiZ6UsfvHuDO693K/W2c482M90+ODPWUzqCxUhY364sgKKdEbuSmRpM4g88+Ry2GrjiajaLCjeDIfuIndz9IXbkeuej5plZyn+PsoygTcfD9MtNypLjqCx4ziWlNbj2v1acD7u6suE7WkcVwg70ok1i7KUm6mSKp2zFsWzViE00IaRSBhVZbvh1N341HsHST6IkqKd+NL/CNFECNWl+/Cp5yGisehE4l2Ejgnv7xg7+21onNxpjbn65tODuNVwGDP9FSifuwF5U0vx4et9PGk+hvbuC8jxzEMyKdHZfYtc70JXT4Mi5Xz8fTHCxrF54vp3YovU/kquwZEQOr88RSQeJtISCCojgydVPDm5xrQSlEhA/tSF6n5x0WpFGo0J/EFluvq0cuKQIlWM2FZzEUkjAk/2NHQGH6Onv5XcvwahoRbML6gjw7rgzQ5gdn41XrZdRVXFFiq182RMCH+I6yTlRMZGYqNoencD/twi5Hjz8TXUisbm6/B5/dhaU4U1lUdVct1tOoCKQB16+1vw7O0VSsRp8Lqmo1+EMm+Zh04vFdQgmN0jqYEp2PrtBmWf+XMLsahsLQaGWxDsa4XLMR1Do4OIRE3wpAXbcLutntjbmFnLjHLe5GCs3KHpPqfGqHsyRW5HzZ7DP76RukvwurNUPGOxsIqpIpV2LxdxC/JjxoonbupPVXsS0tikMbbOobEFOtMKsnTd43Iz5st2ImHIeCxhdhtcPLOEPHdqz6vmX//N9CvH/tdn8acAAwBDf43zdSmDdAAAAABJRU5ErkJggg==" } } } , {}], 89: [function(require, module, exports) { module.exports = { main: { "default": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzU4NUJBRkU1QkVFMTFFNDkyRkVDMDk0Nzk5RDFBMDQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzU4NUJBRkQ1QkVFMTFFNDkyRkVDMDk0Nzk5RDFBMDQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA5M0ZFMjdERDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA5M0ZFMjdFRDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+MHuEgAAAAWtJREFUeNq8VCFMxEAQ3DZ1RRdfSUBTcg6JwdfjeQsaJCXYDxZ03/+7BtD/BsMLDAFdXebu9r7bpnxLSZhkvr9719vu7uxRVVXUiUlxDUbCjo2vA/qMPvr0M17AI2En7BsFX3xxBIZi7Qk8FvYh+9z+sJHx4EBEMXiHlw+MlalP/M7E+ox9xHvu+Z1B8HT9PM+r+0B0CU5x6DP7FAcu2NYlPAOv4HtzPfpdIFcSIs2Sgy7Bd/DEHO7WMlVKMfRii+rOwVTYqfGNVF2wkbJUW6ZyPCNTwho5Z6j3n7I4HC76Egq4/l0bS5b0XMi75P05B7a46S9dsGXt0WQwKXbwfAVT7tEotFWnG637sDJfbUv0Be6Ba/jm7NsHb50ghojBb1wxdjZWXBo3pB/ggkvnyrbmmYvHDGxomuqC2Ox2zazYeYk3N0emHoTUB6HuUaaWrbWkceXY/7U4eFjHZEQdgRatSzb5kxj+A98CDADG3MBsPyzvawAAAABJRU5ErkJggg==", hover: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTc5Mjk4REY1QkVFMTFFNDkyRkVDMDk0Nzk5RDFBMDQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTc5Mjk4REU1QkVFMTFFNDkyRkVDMDk0Nzk5RDFBMDQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA5M0ZFMjdERDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA5M0ZFMjdFRDI5NDExRTE5Njc0OTU4Rjk3NzgwODJEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+21Iy/AAAAWtJREFUeNq8VEFOhEAQbAgP4Ak8gTsm6gvAxLvx6klfIH7AYV/gejdxfYG7Bw+edC/ejCZ+gB9gz0wNNAQXHBMrqV26e5hmuquHmqahUVw8PTITYafGNwK9xxRD+hkPzELYBXxeCMUXJ8xYxFbME2Hn8Ln1ce/EsxMRpcwXfvnAWCr75N+FiC/gI6z5wDuzEOj6BUHQ9YHoXj/xpiv4jpH4DrYuoWIese/V9eh3iVxJiDRrJF0z35hnZnMXU1ktxTCJHaq7YZbCLo3PU3VRK2WpNpVV/J+YEnaocEK9/hzicDicOlCE+o8trCHppZB3jfUVEltcT5cu2hG7MiewPXtmXqJHXhiqTm+q+7AxX21L9MXcY27Zt4Rvn3nqBDFHDGHvirGzsUFp3JC+M2/bntjYFjOX+gxsbJrqktjTJWZW7Lyk7c2hslJIfRa6HqlsPYgVvSvHPnfiwLD6nGiIHCWTl2z+JzH8B74FGABl7MD684BFAgAAAABJRU5ErkJggg==" }, black: { "default": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAMAAAA/D5+aAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD9QTFRFQEBA7+/vz8/Pj4+PICAgn5+fUFBQ39/fv7+/f39/r6+vcHBwEBAQYGBgq6urMDAwxsbGqqqqgICArKys////gZeJlwAAABV0Uk5T//////////////////////////8AK9l96gAAAJFJREFUeNpskEcWxCAMQ12oqVN0/7OOyMtiIPjBwgjJHwRXSQZM0NXdugPVH1JW7hM46dTcSUsoQLxW2ZY+0AIPjqNdsnGWZpXPW7RFPzD2Sox9xBARh/C+CpzN6EoNI03fZcFfHcMtaXL4d43wpL1kG79BzJhX/52UClsNQKDFymNWXAEmzjASnWVOOKufAAMAFjYaiCFpQEIAAAAASUVORK5CYII=" }, experimental: { "default": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAQCAYAAADj5tSrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdJJREFUeNqkVEsvQ1EQ/m5vi+vVR0IqkZCKRghiIZEQQRcsWHdp4RfYqESsRILfgESsGksbFsWCpDtBiHiFRCLxqnq0tNpr5tym2iB6byeZzPnOzDnfecyMhJHVLgBLpC7okwvSYXV+cPu/QDPpAmzVLihWfRTRsAtP13y4uv9CTaTu3whm+h2ALGmArMCZoq3J6famvxxbVx/wuBQxZsvYqGSRjHXb4HYWivHaWQQORRZjtoxZ2M9xhknmdsLwNhbD21oGfKpYOXgBSmTNEuZ59nOcHjFnoYSKqY0QUUtwOiyY7bVj/zaGlsoC+DZD8B+8AklV93OlSTpqFd4b0biK3et3jLaXY3j1HoglgQKTIPStP6CtugiKRRJcwRsDz5UpMnvU1KnJyibD//59k+BlNINawmzwGYtDFZjefsJEl008F8/zLfPKLq6HyT47vM2luAvFEX5P4DxlGfM8+9P1YyiFO63wH0Xg36NsMkucBwD9kbCEeZ79HKdHJOpdKqqafjgGGkoQp90DpxF46othodOvHb9lB90cgnqXZPjje2oKEbjQ/okt43wq/oSa3Q/H+PojtHfS6kfg7AYJsTbH7BqhbrpMWqvzgJdibQ7yJcAAe2uoYeV+Pj8AAAAASUVORK5CYII=", hover: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAQCAYAAADj5tSrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAe5JREFUeNqklM9LVFEUxz/vzQxq5ohkRD4JnWIoiBbSpghCmFBBWoarWrh3axK0EMKC/oQioo24tMUICREFbkKiBGUQGaXpB46YWszY9OZ1zn01OpT43syBy7nfc8695577PfdaDD+/AjyVkSCcrMi45T0afHNYYFTGYxrjCaIN4VL82k1Q3NbDnT4s1JaR/F+C+9dPQcTygWiDq45n1gSq3j7I8Wplh1QybuaqFdcqVUlGUw5nnWYzTy9t0XYkauaqFauoX+PCiCXEexw9XrmWu9ccMvkik2/z6iXWHKP0owQeDF1sJ9neyPiLHLhi+L6OEG8FIX5PZOH4zEepz8KRzSYGHN5/KnCho4mxdI7J+Q0oe6Gvq5Lk0pm47G1RKJWZz+4wcvkEN6eysOtCQ4QHfZ2MTq/S09VCU8yWXB5z79api/iIev6eWnTErpn3vUrmlrf3pbZ4+PorT250c+/lZ+70nmRsJmfsWmVd3WWI7+9kqOcYXzaKfCu4LOd9rVjt6q+8n5pauLeDqQ+bfmdFbVy9rp9lXwtWu/o1rvYW3icD59souWVmF7dInWslJqSkFzargwK28IF0Xk20MJvxeVKtuJ4Xn5HP7h/H7ek1/8H9eT8GV3+QmLUBu2tYftNnortCHjBr1gaQ3wIMACe+r9e4xFGaAAAAAElFTkSuQmCC" } } } , {}], 90: [function(require, module, exports) { function addEventListeners() { emitter.on("form-manager:request-bind-hash-change", me._onRequestBindHashChange) } function _onRequestBindHashChange() { window.onhashchange = function() { logger.log("form-manager", "#onhashchange", "handleAjaxSubmit via hash change"), handleAjaxSubmit() } } function getSelectedAsset(response) { var saved_assets, selection; try { saved_assets = response.faAssets || [] } catch (exception) { logger.log("form-manager", "error parsing assets", { exception: exception, faAssets: response.faAssets }) } return selection = { saved_assets: saved_assets, auto_login: response.auto_login, is_tab_ignored: response.is_tab_ignored, auto_login_type: response.auto_login_type }, PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:selectAsset", selection), selection } function refactorForm(form) { var isFormJSObj = !!form.attrs; return { hostname: form.hostname, domain: form.domain, formType: isFormJSObj ? form.formType() : form.formType, selector: isFormJSObj ? form.selector() : form.selector, url: form.url || location.href, form_detection_technique: form.technique, fields: form.fields.map(function(field) { return { fieldType: isFormJSObj ? field.fieldType() : field.fieldType, selector: isFormJSObj ? field.selector() : field.selector } }) } } function submitForm(form, options) { var captcha; if (options = options || {}, options.form = form, "fdetect" === form.technique && triggerExceptionsForCurrentPage(form.fields, form.el), captcha = getFieldsByType(form.fields, "captcha").shift()) { var captchaEl = captcha.el; if (captchaEl || (captchaEl = captcha.el = $(captcha.selector).get(0)), captchaEl && isVisible(captchaEl)) return logger.info("form-manager", "submit canceled because of captchas in the form"), captchaEl.focus(), void (PBCS.init.formStatus.blocked = !0) } var submits = getFieldsByType(form.fields, "submit") , params = { submitDelay: 250 }; if (PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:submitForm", params), submits.length) { logger.info("form-manager", "clicking on submit button with delay=", params.submitDelay), PBCS.frameFactory.create({ id: "banner-connecting" }); var submit = submits[0]; submit.el || (submit.el = $(submit.selector).get(0)), setTimeout(function() { Events.triggerClick(submit.el) }, params.submitDelay), PBCS.init.formStatus.complete = !0 } else { var method = $(form.el).attr("method"); method && "post" === method.toLowerCase() && (logger.info("form-manager", "triggering form submit event with delay=", params.submitDelay), PBCS.frameFactory.create({ id: "banner-connecting" }), setTimeout(function() { $(form.el).submit() }, params.submitDelay), PBCS.init.formStatus.complete = !0) } } function fillForm(form, asset, disableExceptions) { disableExceptions || PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:fillForm", { asset: asset, form: form }); var selectedAsset = { id: asset.faAssetId, username: asset.login, website_url: asset.url }; PB.contentscript.bgdata.lastAccountSelected = selectedAsset, FA.Framework.sendMessage({ faTrigger: "setLastAccountSelected", asset: selectedAsset }), getFieldsByType(form.fields, "username").forEach(function(username) { logger.info("form-manager", 'filling username="' + username.selector + '"'), username.el || (username.el = $(username.selector).get(0)), Events.fillInput(username.el, asset.login) }), getFieldsByType(form.fields, "password").forEach(function(password) { logger.info("form-manager", 'filling password="' + password.selector + '"'), password.el || (password.el = $(password.selector).get(0)), Events.fillInput(password.el, asset.password) }); var captchas = getFieldsByType(form.fields, "captcha"); captchas.length && (captchas[0].el || (captchas[0].el = $(captchas[0].selector).get(0)), captchas[0].el && captchas[0].el.focus()), sendFillFormEvent(form) } function triggerExceptionsForCurrentPage(fields, el) { var exceptions = {} , exceptionsForType = []; PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:roles", { roles: exceptions, el: el }); for (var fieldType in exceptions) { for (var i = fields.length - 1; i >= 0; i--) fields[i].fieldType === fieldType && fields.splice(i, 1); exceptionsForType = exceptions[fieldType], exceptionsForType.forEach(function(exception) { fields.push({ el: exception, selector: PBCS.cssPath(exception), fieldType: fieldType }) }) } } function processLoginForm(form) { if (form && form.el) { var el = form.el; PB.contentscript.intelForUrl; logger.log("form-manager", "processing login form", form), $(el).attr("pb-autologin", !0), "fdetect" === form.technique && triggerExceptionsForCurrentPage(form.fields, el), ~form.technique.indexOf("atlas") && form.partial && (PBCS.multistep = form.partial); var roles = form.fields; addRolesToDom(roles), addIconsToForm(form, { visible: !!PB.contentscript.is_signed_up, debug: config.icons }), interceptSubmit(el, "login", roles, form); var focusedEl = _.findWhere(form.fields, { fieldType: "password" }); focusedEl || (focusedEl = _.findWhere(form.fields, { fieldType: "username" })), focusedEl && focusedEl.selector && PB.contentscript.checkAndDisplayLoggedOutInpage(focusedEl.selector), emitter.emit("form-manager:request-bind-hash-change") } } function interceptSubmit(el, type, roles, form) { function getFormData() { var triggerParams, inputsData = [], rolesForFieldType = []; return ["username", "password"].forEach(function(inputType) { if (rolesForFieldType = roles.filter(function(role) { return role.fieldType === inputType }), rolesForFieldType.length) rolesForFieldType.forEach(function(role) { var value, $el = $(role.selector); if ($el.length) { "login" === type && "username" === inputType && "www.accountonline.com" === location.hostname && $("#USERNAME").length && ($el = $("#USERNAME")), value = $el.prop("value"), "username" === inputType && (value = value.trim()); var inputProps = { name: $el.prop("name"), value: value, type: $el.prop("type"), role: inputType }; triggerParams = { inputProps: inputProps, el: el }, PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:getFormData", triggerParams), inputsData.push(inputProps) } }); else { var inputProps = { value: null, role: inputType }; triggerParams = { inputProps: inputProps, el: el }, PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:getFormData", triggerParams), inputProps.value && inputsData.push(inputProps) } }), "signup" === type && inputsData.push({ name: "pbIsSignupForm", value: "true", type: "hidden" }), inputsData } function sendDataToBackground(meta) { var formInputs = getFormData(); meta = meta || {}, form.formType = form.formType || type, logger.log("form-manager", form.formType, " form. sending user data to background", form); var assetUrl = metrics.url; !Target.FIREFOX && ~assetUrl.indexOf("www.amazon.") && ~assetUrl.match(/ap\/(signin|register)/) && (assetUrl = PB.utils.standardizeProtocol(PB.utils.getUrlHostname(assetUrl))); var params = { url: assetUrl }; if (PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:sendDataToBackground", params), assetUrl != params.url && (logger.log("form-manager", "the URL has been changed by a remote exception from", assetUrl, "to", params.url), assetUrl = params.url), formInputs.length) { var triggerData = _.extend(meta, { faForm: formInputs, faTrigger: "tAssetDetection", domain: metrics.domain, url: assetUrl, form: PB.contentscript.formManager.stripElementsFromForm(form), is_signed_up: PB.contentscript.is_signed_up, allowAutosave: PB.contentscript.intelForUrl.settings.autologin }); FA.Framework.sendMessage(triggerData); var loginType = PBCS.assets.auto_login_type ? PBCS.assets.auto_login_type : "manual_" + form.formType , data = { tabId: metrics.tabId, url: metrics.url, login_type: loginType, asset_count_for_domain: metrics.assetCountForDomain, domain: metrics.domain, browser_name: metrics.browserName, browser_version: metrics.browserVersion, context: metrics.context, form: refactorForm(form), form_type: form.formType, form_partial_type: form.partial, form_trigger_selector: form.trigger, form_selector: form && form.selector, form_detection_technique: form && form.technique, pb_cs_version: metrics.csVersion, page_request_time_in_ms: metrics.pageRequestTime, page_time_before_submit_form_in_sec: ((new Date).getTime() - window.performance.timing.domLoading) / 1e3, page_atlas_api_timeout: metrics.apiTimeout, page_atlas_forms_found_in_page: metrics.atlasForms.length, page_atlas_forms_count_at_atlas_process: metrics.atlasFormsCountAtAtlasProcess, page_atlas_forms_count_at_fdetect_process: metrics.atlasFormsCountAtFdetectProcess, page_fdetect_forms_found_in_page: metrics.fdetectForms.length, page_atlas_forms_from_background: metrics.backgroundForms.length, page_atlas_forms_from_localstorage: metrics.localStorageForms.length, is_browser_local_storage_available: PB.contentscript.isLocalStorageAvailable, is_last_chance: !1, experiments: ["desktop_remove_fdetect_login_forms:" + (PB.contentscript && PB.contentscript.removeFdetectExperiment)] }; FA.Framework.sendMessage({ faTrigger: "recordSubmit", data: data }), ~loginType.indexOf("manual") && (PB.contentscript.bgdata.lastAccountSelected = !1, FA.Framework.sendMessage({ faTrigger: "setLastAccountSelected", asset: !1 })), handleAjaxSubmit() } } var inputs, $inputs, submit, sendData = _.debounce(sendDataToBackground, 3e3, !0), $el = $(el); inputs = getFieldsByType(roles, ["username", "password"]).map(function(field) { return field.el }), submit = getFieldsByType(roles, "submit")[0], $inputs = $(inputs), $inputs.on("keydown", function(e) { return 13 === (e.keyCode ? e.keyCode : e.which) && (PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:userSubmitedForm"), sendData()), !0 }); var params = { submitButtonEventToListenFor: "click" }; PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:handleSubmitClick", params), submit && submit.selector && (logger.info("form-manager", 'listening for a "', params.submitButtonEventToListenFor, '" event on the submit button'), $(submit.selector).on(params.submitButtonEventToListenFor, function() { PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:userSubmitedForm"), sendData() }), (Target.IOS || Target.ANDROID) && (logger.info("form-manager", 'listening for a "touchend" event on the submit button.'), $(submit.selector).on("touchend", function() { PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:userSubmitedForm"), sendData() }))), $el.on("submit", function(e) { if (getFormData().length) { var metaData = {}; PB.contentscript.is_signed_up || (metaData.token = Math.floor(1e9 * Math.random()), metaData.domain = PB.utils.getUrlBaseDomain(location.href)), PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:userSubmitedForm"), sendData(metaData) } }), $inputs.one("keypress", function() { submit && submit.el || (window.onbeforeunload = function() { sendData() } ) }) } function isPassGenEnabled(nbOfPasswordFields, formTechnique) { var domainsValidated, BI_disabled = PB.contentscript.intelForUrl.settings.autologin === !1, domainIsWhitelisted = ~formTechnique.indexOf("atlas") || "last-chance" === formTechnique; return domainIsWhitelisted || (domainsValidated = ["facebook.com", "google.com", "live.com", "yahoo.com", "paypal.com", "linkedin.com", "amazon.com", "ebay.co.uk", "ebay.fr", "ebay.ca", "ebay.com", "twitter.com", "salesforce.com", "dropbox.com", "reddit.com", "netflix.com", "evernote.com", "pinterest.com", "imgur.com", "etsy.com", "adobe.com", "walmart.com", "conduit.com", "quickbooks.intuit.com", "forbes.com", "amazonaws.com", "wikipedia.org", "tumblr.com", "weather.com", "wordpress.com", "yelp.com", "zillow.com", "pandora.com", "vimeo.com"], domainIsWhitelisted = domainsValidated.indexOf(PB.utils.getUrlBaseDomain(location.hostname)) >= 0), (!PB.contentscript.bgdata || !PB.contentscript.bgdata.isOffline) && domainIsWhitelisted && !BI_disabled && PB.contentscript.logged_in && nbOfPasswordFields && !("IE" === browser.name && 8 === parseInt(browser.version)) } function processSignupForm(form, el) { if (form && form.el) { el = form.el; var $el, roles = form.fields, passwordFields = []; if (logger.log("form-manager", "processing signup form", form), $(el).attr("pb-signup", !0), "fdetect" === form.technique && triggerExceptionsForCurrentPage(form.fields, el), roles = form.fields, addRolesToDom(roles), addIconsToForm(form, { visible: !!PB.contentscript.is_signed_up, debug: config.icons }), emitter.emit("form-manager:request-bind-hash-change"), "https://twitter.com/" !== location.href && interceptSubmit(el, "signup", roles, form), passwordFields = roles.filter(function(role) { return "password" === role.fieldType }).map(function(role) { return role.el }), isPassGenEnabled(passwordFields.length, form.technique)) { $el = $(el), passwordFields = $(passwordFields); var showPassGen = function() { var settings = PB.contentscript.passgenSettings; PBCS.frameFactory.create({ id: "tooltip-passwordGenerator", attachTo: passwordFields.first(), options: { disableLetters: settings["passgen.letters"] === !1, disableSymbols: settings["passgen.symbols"] === !1, disableDigits: settings["passgen.digits"] === !1, disableCapitals: settings["passgen.capitals"] === !1, nbCharacters: settings["passgen.stringLength"] } }).on("passwordGenerated", function(payload) { passwordFields.each(function() { Events.fillInput(this, payload.password) }), sendFillFormEvent(form) }) }; PB.contentscript.passgenSettings["passgen.enabled"] !== !1 && passwordFields.first().one("focus", function(e) { showPassGen() }); defineIconClick($el.find("passwordboxicon[pb-icon=password]").first(), function(e) { showPassGen() }) } } } function clearForm() { $("[pb-autologin] passwordboxicon[pb-icon=username]").off("click"), $("[pb-role=username],[pb-role=password]").val($(this).attr("placeholder")) } function fdetectOptions(opts) { function createOrAppendSelector(detect, formType, selector) { detect[formType] = detect[formType] || {}, detect[formType].ignore = detect[formType].ignore ? detect[formType].ignore + ", " + selector : selector } opts = opts || {}; var settings = PB.contentscript.intelForUrl.settings; return settings.detect || (settings.detect = {}), opts.forms.length && (settings.detect = _.reduce(opts.forms, function(detect, form) { return createOrAppendSelector(detect, form.formType, form.selector), detect }, settings.detect)), opts.filters = opts.filters || settings.detect || {}, opts.detect || (opts.detect = detectOptions(opts.loginForms && !!opts.loginForms.length, opts.signupForms && !!opts.signupForms.length)), opts.ctx = opts.ctx || document.body, opts.execOnStart = "undefined" == typeof opts.execOnStart || opts.execOnStart, PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:findForms", opts), opts } function detectOptions(isLoginFoundByAtlas, isSignupFoundByAtlas) { var pb = PBCS.currentLocation.isPasswordbox || PBCS.currentLocation.isPsswrdbx , settings = PB.contentscript.intelForUrl.settings , checkout = settings.checkout , defaultFormTypes = ["two-factor"]; isLoginFoundByAtlas || defaultFormTypes.push("login"), isSignupFoundByAtlas || defaultFormTypes.push("signup"); var detect = []; return pb || detect.push("reset"), pb || (detect = detect.concat(defaultFormTypes)), !Target.IE && checkout && detect.concat("payment"), detect } function getSimplifiedForm(form, discardEl) { var simplifiedForm = form , isLegacy = !!form.attrs; return isLegacy && (simplifiedForm = {}, simplifiedForm.formType = form.formType(), simplifiedForm.technique = form.technique, simplifiedForm.hostname = form.hostname, simplifiedForm.foundFormsWithMeta = form.foundFormsWithMeta, simplifiedForm.metaTypeTechnique = form.metaTypeTechnique, simplifiedForm.selector = form.selector(), simplifiedForm.el = form.el(), simplifiedForm.isMutation = form.attrs.isMutation, simplifiedForm.performance = form.attrs.performance.reduce(function(acc, perf) { return acc += parseInt(perf.duration, 10) }, 0)), discardEl && delete simplifiedForm.el, simplifiedForm.fields = form.fields.map(function(field) { var newField = {}; return discardEl || (newField.el = isLegacy ? field.el() : field.el), newField.selector = isLegacy ? field.selector() : field.selector, newField.fieldType = isLegacy ? field.fieldType() : field.fieldType, newField }), simplifiedForm } function stripElementsFromForm(form) { var newForm = _.omit(form, ["el", "fields"]); return newForm.fields = [], form.fields.forEach(function(field) { newForm.fields.push(_.omit(field, "el")) }), newForm } function isFormCompletelyVisible(form) { var fields = form.fields.filter(function(field) { return "captcha" !== field.fieldType }); return form.isVisible = isVisible(form.el) && fields.every(function(field) { return isVisible(field.el) }), form.isVisible } function _filterVisibleForms(forms, formType) { return !!forms && ("string" == typeof formType && (forms = _.filter(forms, function(form) { return form.formType === formType })), !!_.find(forms, function(form) { return PB.contentscript.isVisible(form.el) })) } function hasVisibleLoginForms() { return _filterVisibleForms(me.forms, "login") } function fillAndSubmitForm(form, options) { if (logger.log("form-manager", "starting filling and submitting of the form", form, "with options", options), form.faFilled && form.faSubmitted) return void logger.info("form-manager", "fillAndSubmitForm: form has been previously filled and submitted. exiting fillAndSubmitForm"); var preventBlock = !1 , selectedAsset = options.selectedAsset , autoLogin = options.autoLogin , isTabIgnored = (options.loginType, options.isTabIgnored); isFormCompletelyVisible(form), form.faFilled && !PB.contentscript.multi_account_selected || (PB.contentscript.formManager.fillForm(form, selectedAsset), form.faFilled = !0), form.el = form.el || $(form.selector).get(0); var $form = $(form.el) , singled_out = "true" === $form.attr("pb-autologin") || "www.passwordbox.com" === location.host; if (autoLogin) { var customAutologin = selectedAsset.autologin; "1" !== customAutologin || isTabIgnored ? "0" === customAutologin ? (logger.info("form-manager", "autologin disabled: user turned off the instant login for this asset"), autoLogin = !1) : isTabIgnored && (logger.info("form-manager", "autologin disabled: decision made by the background. tab is ignored"), autoLogin = !1) : autoLogin = !0 } else logger.info("form-manager", "autologin disabled: decision made by the background (ex: tab is ignored, or instant login is disabled)"); var overridesForThisDomain = PB.contentscript.intelForUrl.settings; overridesForThisDomain.autologin === !1 && (logger.info("form-manager", "autologin disabled: server-side setting disabled autologin"), autoLogin = !1), overridesForThisDomain.autoSubmitForm === !1 && (logger.info("form-manager", "autologin disabled: server-side setting disabled auto submit"), autoLogin = !1), location.href.indexOf("twitter.com/intent/tweet") > -1 && "update-form" === $form.attr("id") && (logger.info("form-manager", "autologin disabled: special rule for twitter's tweet intent"), autoLogin = !1); var params = { ignoreVisibility: !1 }; PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:autoLoginVisibilityCheck", params), !autoLogin || params.ignoreVisibility || form.isVisible || (logger.info("form-manager", "autologin disabled: the form is not visible"), autoLogin = !1, form.trigger && addListenerToFormTrigger(form, function() { form.faFilled = !1, fillAndSubmitForm(form, options) }), form.trigger && $(form.trigger).length || (preventBlock = !0)), PB.contentscript.multi_account_selected && (logger.info("form-manager", "autologin enabled: multi-account selector used, we want to auto-submit"), autoLogin = !0, preventBlock = !1, PBCS.multistep || (PB.contentscript.multi_account_selected = !1)), PBCS.multistep && PB.contentscript.bgdata && PB.contentscript.bgdata.multistep && PBCS.multistep === PB.contentscript.bgdata.multistep && (logger.info("form-manager", "autologin disabled: already filled/submitted this form"), autoLogin = !1, preventBlock = !1); var formAction = $form.closest("form").attr("action"); if (formAction) { var whitelist = ["huffingtonpost.ca"] , anchor = document.createElement("a"); anchor.href = formAction; var pageDomain = UrlParser.parse(location.href).domain , anchorDomain = UrlParser.parse(anchor.href).domain; anchorDomain && anchorDomain !== pageDomain && !~whitelist.indexOf(pageDomain) && (logger.info("form-manager", "autologin disabled: the form points to a different domain"), autoLogin = !1, preventBlock = !1) } autoLogin && formHasVisibleCaptcha(form) && (logger.info("form-manager", "autologin disabled: captcha found in the form"), autoLogin = !1, preventBlock = !1), form.faSubmitted && (logger.info("form-manager", "autologin disabled: form has been previously submitted"), autoLogin = !1, preventBlock = !1), form.blockSubmit && (logger.info("form-manager", "autologin disabled: form has been blocked from submission"), autoLogin = !1, preventBlock = !1), selectedAsset.login || (autoLogin = !1, preventBlock = !1), autoLogin && singled_out ? (PBCS.multistep && "username" === PBCS.multistep || FA.Framework.sendMessage({ faTrigger: "tIgnoreTab" }), PBCS.assets.auto_login_type || (PBCS.assets.auto_login_type = "seamless_login"), PB.contentscript.formManager.submitForm(form, { asset_count_for_domain: metrics.assetCountForDomain, asset_title: selectedAsset.name }), form.faSubmitted = !0) : !preventBlock && options.autoLogin && (PBCS.init.formStatus.blocked = !0) } function foundLoginForm(form) { var atlasForm = getSimplifiedForm(form); processLoginForm(atlasForm), PB.contentscript.initFillForms(PBCS.assets, [atlasForm]) } function foundSignupForm(form) { processSignupForm(getSimplifiedForm(form)) } function foundResetForm(form, el) { processResetForm(getSimplifiedForm(form), el) } function addMetaTrackingData(form, metaForUrl) { return form.technique = "fdetect", form.foundFormsWithMeta = metaForUrl && metaForUrl.forms && metaForUrl.forms.map(function(atlasForm) { return atlasForm.selector }).join(","), form.metaTypeTechnique = metaForUrl && metaForUrl.technique, form.url = location.href, form.domain = PB.contentscript.urlParser.parse(location.href).domain, form.hostname = location.hostname, form } function usefDetect(opts, fn) { var finder, login, options = fdetectOptions(opts), disableObserveMutation = Target.IE; logger.info("form-manager", "starting fdetect with disableObserveMutation =", disableObserveMutation, "and with options,", options), finder = new PB.contentscript.Form.find(options), finder.on("login", function(form, el) { logger.info("form-manager", "fdetect found " + form.formType() + '="' + form.selector() + '"'), login = el, !disableObserveMutation && login && finder.pause(), form = addMetaTrackingData(form, options), foundLoginForm(form) }), finder.on("reset", function(form, el) { logger.info("form-manager", "fdetect found " + form.formType() + '="' + form.selector() + '"'), disableObserveMutation || finder.pause(), form = addMetaTrackingData(form, options), foundResetForm(form, el) }), fn && finder.once("forms", function(forms) { forms = forms.filter(function(form) { return "signup" !== form.attrs.formType }), logger.info("form-manager", "finished fdetect processing, found " + (forms && forms.length) + " forms in the page"), forms = forms.map(function(form) { return form = getSimplifiedForm(form), form = addMetaTrackingData(form, options) }), PB.contentscript.formManager.forms = PB.contentscript.formManager.forms.concat(forms), metrics.fdetectForms = forms, fn() }), disableObserveMutation ? finder.exec() : finder.start() } function addListenerToFormTrigger(form, cb) { if (!form.listenerAdded) { form.listenerAdded = !0, logger.log("form-manager", "adding listener on trigger", form), _isAtlasObserving = !0; var delegate = function(criteria, listener) { return function(e) { var el = e.target; do if (el.tagName && criteria(el)) return e.delegateTarget = el, void listener.apply(this, arguments); while (el = el.parentNode) } } , filter = function(el) { return $(el).is(form.trigger) } , handler = function(e) { logger.log("form-manager", "form trigger click", form); var meta = { forms: [form], technique: "atlas-trigger" }; setTimeout(function() { cb(meta) }, 2e3) }; document.body.addEventListener("click", delegate(filter, handler), !0) } } function findFormForThisPage(meta) { var el, forms = [], els = []; meta.forms.forEach(function(form) { try { el = $(form.selector).get(0) } catch (err) { return void logger.log("form-manager", "invalid selector", form) } if (el) { var found = _.find(els, function(elExists) { return elExists.el === el }); found ? (els.push({ selector: found.selector, el: found.el, duplicate: !0 }), els.push({ selector: form.selector, el: el, duplicate: !0 })) : els.push({ selector: form.selector, el: el }), form.el = el, form.selector = form.selector, forms.push(form) } }); var duplicateSelectorEls = _.filter(els, function(el) { return el.duplicate }); if (duplicateSelectorEls.length) { if (!isUrlAlreadyReported("form_selector", metrics.url)) { var selectorsString = _.reduce(duplicateSelectorEls, function(string, nextEl, index) { return nextEl.selector + (index > 0 ? ", " + string : string) }, ""); FA.Framework.sendMessage({ faTrigger: "mixpanel_track", mixpanel_event: "atlas_forms_have_issues", mixpanel_params: { atlas_form_issue_type: "form_selector", duplicate_selectors: selectorsString, website_url: metrics.url, domain: metrics.domain } }) } } return forms } function processAtlasForms(meta) { var forms; if (meta.isWaitFor || logger.info("form-manager", "found " + meta.forms.length + " forms in atlas using " + meta.technique), metrics.atlasFormsCountAtAtlasProcess = meta.forms.length, forms = findFormForThisPage(meta), forms.length) { var intel = PB.contentscript.intelForUrl && PB.contentscript.intelForUrl.settings; intel && intel.detect && !meta.isWaitFor && (forms = forms.filter(function(form) { var ignore = intel.detect[form.formType] && intel.detect[form.formType].ignore; return !$(form.selector).is(ignore) })), forms = forms.filter(function(form) { if (!$(form.el).find("input").length) return !1; var result = findFieldsForThisPage(form, !0); return meta.waitForCB && meta.waitForCB(result), result }), PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:atlasForms", { forms: forms }), logger.info("form-manager", "atlas forms in the page", forms), forms.forEach(function(form) { "login" === form.formType ? foundLoginForm(form) : "signup" === form.formType ? foundSignupForm(form) : "reset" === form.formType && foundResetForm(form) }), forms.forEach(function(form) { var currForm = getSimplifiedForm(form, !1); _.findWhere(PB.contentscript.formManager.forms, { formType: currForm.formType, selector: currForm.selector }) || PB.contentscript.formManager.forms.push(currForm) }), metrics.atlasForms = forms } else logger.info("form-manager", "did not find any forms using atlas"); return meta.isWaitFor || watcher.observeMissingForms(meta.forms, function(form, waitForCB) { processAtlasForms({ forms: [form], isWaitFor: !0, waitForCB: waitForCB }) }), forms } function processForms(opts, fn) { var forms, foundMeta = opts.forms && opts.forms.length, exceptionOpts = { fdetect: config.fdetect }; if (logger.log("form-manager", "processing forms..."), PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:processForms", exceptionOpts), "function" == typeof opts && (fn = opts, opts.ctx = document.body), foundMeta) { logger.log("form-manager", "atlas forms received", opts.forms), opts.forms = removeInvalidSelectors(opts.forms), opts.forms.forEach(function(form) { form.technique = form.technique || opts.technique }), forms = processAtlasForms(opts), opts.loginForms = forms.filter(function(form) { return "login" === form.formType }), opts.signupForms = forms.filter(function(form) { return "signup" === form.formType }), opts.resetForms = forms.filter(function(form) { return "reset" === form.formType }); if (opts.loginForms.some(function(form) { return form.partial }) || opts.loginForms.length && opts.signupForms.length || opts.resetForms.length) return fn && fn() } if (PB.contentscript.herculesExperimentEnabled && (opts.disableFdetect = !0), opts.disableFdetect || !exceptionOpts.fdetect) return logger.log("form-manager", "fdetect is disabled"), fn && fn(); metrics.atlasFormsCountAtFdetectProcess = opts.forms.length, $.isReady ? usefDetect(opts, fn) : $(function() { usefDetect(opts, fn) }) } function removeInvalidSelectors(forms) { return forms.filter(function(form) { return DomHelpers.isValidSelector(form.selector) ? form.fields.every(function(field) { var isFieldValid = DomHelpers.isValidSelector(field.selector); return isFieldValid || logger.info("form-manager", "Ignoring Atlas Form with invalid field selector", form, " invalid field selector : ", field.selector), isFieldValid }) : (logger.info("form-manager", "Ignoring Atlas Form with invalid form selector", form), !1) }) } var me, $ = require("jquery"), _ = require("underscore"), addIconsToForm = require("./icons").addIconsToForm, defineIconClick = require("./icons").defineIconClick, handleAjaxSubmit = require("./handle-ajax-submit"), reprocessLoginDetectHints = require("./reprocess-login-detect-hints"), findFieldsForThisPage = require("./find-fields"), watcher = require("./watcher"), UrlParser = require("url-parser"), Events = require("./events"), processResetForm = require("./process-reset-form").process, addRolesToDom = require("./helpers").addRolesToDom, getFieldsByType = require("./helpers").getFieldsByType, hasCaptcha = require("./helpers").hasCaptcha, formHasVisibleCaptcha = require("./helpers").formHasVisibleCaptcha, isUrlAlreadyReported = require("./helpers").isUrlAlreadyReported, sendFillFormEvent = require("./send-fill-form-event"), Target = require("../target"), config = require("../config"), logger = require("../logger"), UAParser = require("ua-parser-js"), browser = UAParser(window.navigator.userAgent).browser, isVisible = require("visible"), DomHelpers = require("../dom-helpers"), metrics = require("../metrics"), emitter = require("../event-emitter"), _isAtlasObserving = !1; module.exports = me = { processForms: processForms, fillForm: fillForm, submitForm: submitForm, getSelectedAsset: getSelectedAsset, clearForm: clearForm, fillInput: Events.fillInput, sendFillFormEvent: sendFillFormEvent, getSimplifiedForm: getSimplifiedForm, fillAndSubmitForm: fillAndSubmitForm, stripElementsFromForm: stripElementsFromForm, forms: [], addListenerToFormTrigger: addListenerToFormTrigger, hasCaptcha: hasCaptcha, reprocessLoginDetectHints: reprocessLoginDetectHints, handleAjaxSubmit: handleAjaxSubmit, addEventListeners: addEventListeners, _onRequestBindHashChange: _onRequestBindHashChange, hasVisibleLoginForms: hasVisibleLoginForms }, addEventListeners() } , { "../config": 3, "../dom-helpers": 5, "../event-emitter": 7, "../logger": 130, "../metrics": 135, "../target": 142, "./events": 83, "./find-fields": 84, "./handle-ajax-submit": 85, "./helpers": 86, "./icons": 87, "./process-reset-form": 91, "./reprocess-login-detect-hints": 92, "./send-fill-form-event": 93, "./watcher": 94, jquery: "jquery", "ua-parser-js": 227, underscore: "underscore", "url-parser": 233, visible: 236 }], 91: [function(require, module, exports) { function process(atlasForm, formEl) { var formEl, $formEl; return me.form = atlasForm, formEl = formEl || atlasForm.el, $formEl = $(formEl), !$formEl.attr("pb-signup") && !$formEl.attr("pb-autologin") && (logger.log("form-manager", "processing reset form", atlasForm), $formEl.attr("pb-reset", !0), me._processRoles(), addRolesToDom(atlasForm.fields), me.assets = _.filter(PBCS.assets.faAssets, function(asset) { return asset.owner }), me.assets.length ? (me._injectIcons($formEl), emitter.emit("form-manager:request-bind-hash-change"), void me._bindHandlersToInputs($formEl)) : (logger.log("form-manager", "Exiting processing reset form. No valid asset for this website."), !1)) } function _processRoles() { me.fields.submit = getFieldsByType(me.form.fields, "submit"), me.fields.$submit = $(me.fields.submit.length && me.fields.submit[0].el), me.fields.currentPassword = getFieldsByType(me.form.fields, "current_password"), me.fields.$currentPassword = $(me.fields.currentPassword.length && me.fields.currentPassword[0].el), me.fields.confirmPassword = getFieldsByType(me.form.fields, "confirm_password"), me.fields.newPassword = getFieldsByType(me.form.fields, "new_password"), me.fields.$newPassword = $(me.fields.newPassword.length && me.fields.newPassword[0].el), me.fields.$confirmPassword = $(me.fields.confirmPassword.length && me.fields.confirmPassword[0].el) } function _injectIcons($formEl) { var newPasswordFieldIcon, frameAssets; PB.contentscript.passgenSettings["passgen.enabled"]; addIconsToForm(me.form, { visible: !!PB.contentscript.is_signed_up, debug: config.icons }), newPasswordFieldIcon = $formEl.find("passwordboxicon[pb-icon=new_password]").first(), 1 === me.assets.length ? (logger.log("form-manager", "processing reset form with exactly one asset.", me.form), me.assetToUse = me.assets[0], defineIconClick(newPasswordFieldIcon, me._showPassGen), PB.contentscript.passgenSettings["passgen.enabled"] !== !1 && me.fields.$newPassword.one("focus", me._showPassGen), me._fillResetAndReport(me.assetToUse, me.form)) : me.assets.length > 1 && (logger.log("form-manager", "processing reset form with more than one user asset.", me.form), currentPasswordFieldIcon = $formEl.find("passwordboxicon[pb-icon=current_password]").first(), frameAssets = me.assets.map(function(asset) { return { id: asset.faAssetId, username: asset.login, title: asset.name } }), currentPasswordFieldIcon.length ? (defineIconClick(newPasswordFieldIcon, _.bind(me._showPassGen, me, frameAssets, me.form)), defineIconClick(currentPasswordFieldIcon, _.bind(me._showMultiAccount, me, frameAssets, me.form, !1)), me._showMultiAccount(frameAssets, me.form, !1), PB.contentscript.passgenSettings["passgen.enabled"] !== !1 && me.fields.$newPassword.one("focus", me._showPassGen)) : (defineIconClick(newPasswordFieldIcon, _.bind(me._showMultiAccount, me, frameAssets, me.form, !0)), me._showMultiAccount(frameAssets, me.form, !0))) } function _bindHandlersToInputs($formEl) { var $inputs = me.fields.$currentPassword.add(me.fields.$newPassword).add(me.fields.$confirmPassword); $inputs.on("keydown", me._keydownHandler), me.fields.$submit.on("click", me._submitClickHandler), $formEl.on("submit", me._submitHandler), $inputs.one("input", me._inputHandler) } function _submitClickHandler() { me._sendData() } function _keydownHandler(e) { return 13 === (e.keyCode ? e.keyCode : e.which) && (PB.contentscript.exceptionsManager.trigger("pb:cs:formManager:userSubmitedForm"), me._sendData(me.assetToUse)), !0 } function _submitHandler() { var metaData = {}; PB.contentscript.is_signed_up || (metaData.token = Math.floor(1e9 * Math.random()), metaData.domain = PB.utils.getUrlBaseDomain(location.href)), me._sendData(me.assetToUse, metaData) } function _inputHandler() { me.fields.submit.length || (window.onbeforeunload = me._sendData) } function _handleResetSelectedAsset(form, selectedAsset) { me.assetToUse = _.find(me.assets, function(asset) { return asset.faAssetId === selectedAsset.id }), me._fillResetAndReport(me.assetToUse, me.form) } function _handleResetSelectedAssetAndShowPassGen(form, selectedAsset) { me._handleResetSelectedAsset(form, selectedAsset), PB.contentscript.passgenSettings["passgen.enabled"] !== !1 && me._showPassGen() } function _showMultiAccount(frameAssets, form, showPassGen) { var inpageType, attachTo = me.fields.$currentPassword.length ? me.fields.$currentPassword : me.fields.$newPassword; inpageType = me.fields.currentPassword.length ? "fillPassword" : "updatePassword", PBCS.frameFactory.create({ id: "tooltip-accountSelector", attachTo: attachTo, options: { inpageType: inpageType, assets: frameAssets, form: PB.contentscript.formManager.stripElementsFromForm(form), onSelectedAsset: showPassGen ? me._handleResetSelectedAssetAndShowPassGen : me._handleResetSelectedAsset } }) } function _fillResetAndReport(asset, form) { me.fields.currentPassword.length ? me.fields.newPassword.length ? asset && (logger.log("form-manager", "processResetForm(fillResetAndReport): Old password and new password me.fields found, filling old and focusing on new."), me._injectPassword(asset.password), sendFillFormEvent(form)) : logger.log("form-manager", "processResetForm(fillResetAndReport): No new password field, this should not happen, every reset form should have a new password field.") : logger.log("form-manager", "processResetForm(fillResetAndReport): No current(old) password field, will not inject current password or report."), me.fields.$newPassword.length && me.fields.$newPassword.focus() } function _injectPassword(password) { Events.fillInput(me.fields.currentPassword[0].el, password), me.fields.$currentPassword.one("focus", _passwordFocusHandler(password)) } function _passwordFocusHandler(password) { return function(e) { $(e.target).val().length || Events.fillInput(e.target, password) } } function _sendDataToBackground(meta) { var formInputs; if (!me.assetToUse) return void logger.log("form-manager", "processResetForm: canceling background reporting, no asset."); meta = meta || {}, formInputs = [{ name: "username", value: me.assetToUse.login, type: "text", role: "username" }, { name: "newpassword", value: me.fields.$newPassword.val(), type: "password", role: "password" }], logger.log("form-manager", "reset form. sending user data to background", formInputs), FA.Framework.sendMessage(_.extend(meta, { faForm: formInputs, faTrigger: "tAssetDetection", form: PB.contentscript.formManager.stripElementsFromForm(me.form), domain: PB.contentscript.urlParser.parse(location.href).domain, url: location.href, is_signed_up: !0, allowAutosave: !0, formType: "reset" })), PBCS.frameFactory.create({ id: "banner-update", options: { siteName: location.hostname, formType: "reset" } }) } function _showPassGen() { var settings = PB.contentscript.passgenSettings; PBCS.frameFactory.create({ id: "tooltip-passwordGenerator", attachTo: me.fields.$newPassword, options: { disableLetters: settings["passgen.letters"] === !1, disableSymbols: settings["passgen.symbols"] === !1, disableDigits: settings["passgen.digits"] === !1, disableCapitals: settings["passgen.capitals"] === !1, nbCharacters: settings["passgen.stringLength"] } }).on("passwordGenerated", function(payload) { me.fields.newPassword.length && Events.fillInput(me.fields.newPassword[0].el, payload.password), me.fields.confirmPassword.length && Events.fillInput(me.fields.confirmPassword[0].el, payload.password) }) } var $ = require("jquery") , _ = require("underscore") , addIconsToForm = require("./icons").addIconsToForm , addRolesToDom = require("./helpers").addRolesToDom , config = require("../config") , defineIconClick = require("./icons").defineIconClick , emitter = require("../event-emitter") , Events = require("./events") , getFieldsByType = require("./helpers").getFieldsByType , logger = require("../logger") , sendFillFormEvent = require("./send-fill-form-event") , me = { process: process, _processRoles: _processRoles, _injectIcons: _injectIcons, _bindHandlersToInputs: _bindHandlersToInputs, _submitClickHandler: _submitClickHandler, _keydownHandler: _keydownHandler, _submitHandler: _submitHandler, _inputHandler: _inputHandler, _handleResetSelectedAsset: _handleResetSelectedAsset, _handleResetSelectedAssetAndShowPassGen: _handleResetSelectedAssetAndShowPassGen, _showMultiAccount: _showMultiAccount, _fillResetAndReport: _fillResetAndReport, _injectPassword: _injectPassword, _passwordFocusHandler: _passwordFocusHandler, _sendDataToBackground: _sendDataToBackground, _showPassGen: _showPassGen, _sendData: _.debounce(_sendDataToBackground, 1500, !0), assets: [], assetToUse: void 0, fields: { newPassword: "", $newPassword: "", confirmPassword: "", $confirmPassword: "", currentPassword: "", $currentPassword: "", submit: "" }, form: void 0 }; module = module.exports = me } , { "../config": 3, "../event-emitter": 7, "../logger": 130, "./events": 83, "./helpers": 86, "./icons": 87, "./send-fill-form-event": 93, jquery: "jquery", underscore: "underscore" }], 92: [function(require, module, exports) { function currentFormsInPage() { var forms = []; return (PB.contentscript.atlasMetaForUrl && PB.contentscript.atlasMetaForUrl.forms && PB.contentscript.atlasMetaForUrl.forms.data || []).forEach(function(form) { var el; try { el = $(form.selector).get(0) } catch (err) { return void logger.warn("form-manager", "invalid atlas form selector: " + (form && form.selector)) } el && isVisible(el) && findFieldsForThisPage(form, !1) && forms.push(form) }), forms } var $ = require("jquery") , isVisible = require("visible") , findFieldsForThisPage = require("./find-fields") , logger = require("../logger"); module.exports = function() { var forms = currentFormsInPage() , hints = { hasLoginForm: !1, hasSignupForm: !1, hasTwoFactorForm: !1 }; return forms.forEach(function(form) { "login" === form.formType ? hints.hasLoginForm = !0 : "signup" === form.formType ? hints.hasSignupForm = !0 : "two-factor" === form.formType && (hints.hasTwoFactorForm = !0) }), hints } } , { "../logger": 130, "./find-fields": 84, jquery: "jquery", visible: 236 }], 93: [function(require, module, exports) { function reduceFormForMixpanel(form) { var formData = {}; return form.attrs ? (formData.formType = form.formType(), formData.selector = form.selector()) : (formData.formType = form.formType, formData.selector = form.selector), formData.url = location.href.substring(0, 254 - JSON.stringify(formData).length), formData } function reduceFormForPISession(form) { return { formId: form.formId, formType: form.formType, isVisible: form.isVisible, selector: form.selector, element: hercules.domHelpers.buildElementModel({ element: form.selector }), technique: form.technique, fields: _.map(form.fields, function(el) { return { fieldType: el.fieldType, selector: el.selector, element: hercules.domHelpers.buildElementModel({ element: el.selector }) } }) } } var hasCaptcha = require("./helpers").hasCaptcha , metrics = require("../metrics") , hercules = (require("url-parser"), require("hercules")) , _ = require("underscore"); module.exports = function(form) { var url = PB.contentscript.urlParser.parse(location.href); if (!PBCS.DomHelpers.matchesIPv4(window.location.hostname) && !url.port) { var formData = reduceFormForMixpanel(form) , timeNow = (new Date).getTime() , mixpanelParams = { website_url: metrics.url, domain: metrics.domain, pb_cs_version: metrics.csVersion, browser_name: metrics.browserName, browser_version: metrics.browserVersion, context: metrics.context, asset_count_for_domain: metrics.assetCountForDomain, form_type: formData.formType, form: JSON.stringify(formData), form_is_in_iframe: PBCS.currentLocation.isIframe, form_detection_technique: form.technique, form_is_visible: form.isVisible, atlas_failed_forms_found: form.foundFormsWithMeta || "none", atlas_failed_technique_used: form.metaTypeTechnique, form_is_found_with_mutation: form.isMutation, fdetect_time_to_execute: form.performance, form_partial_type: form.partial, form_selector: form.selector, form_with_captcha: hasCaptcha(form.el), is_cs_reinit: metrics.reinit, is_reinit_loop_activated: metrics.reInitLoopActivated, page_request_time_in_ms: metrics.pageRequestTime, perf_timing_since_dom_loading: timeNow - window.performance.timing.domLoading, perf_timing_since_dom_interactive: timeNow - window.performance.timing.domInteractive, perf_timing_since_contentscript_init: timeNow - window.TK_CS_INIT_MOMENT }; FA.Framework.sendMessage({ faTrigger: "mixpanel_track", mixpanel_event: "fillForm", mixpanel_params: mixpanelParams }), setTimeout(function() { hercules.piSession.emitPISessionOperation("form_automatically_filled", { authFlowMarker: !0, extendSession: !0, form: reduceFormForPISession(form) }) }, 0) } } } , { "../metrics": 135, "./helpers": 86, hercules: 163, underscore: "underscore", "url-parser": 233 }], 94: [function(require, module, exports) { function observeMissingForms(forms, callback) { forms.forEach(function(form) { var $element = DomHelpers.getjQueryElement(form.selector); if (0 === $element.length) waitForSelectorToAppear(form.selector, form, callback), logger.log("form-manager:watcher", "Waiting for form to appear with selector :", form.selector); else if (1 === $element.length) { var hasInputs = $element.find("input"); hasInputs.length && findFieldsForThisPage(form, !1, !0) ? waitForElementToDisappear($element[0], form, callback) : waitForSelectorToAppear(form.selector, form, callback) } else $element.length > 1 && $(form.selector).attr("yield-handling", "true") }) } function waitForSelectorToAppear(selector, form, callback) { DomHelpers.waitFor(selector, function() { if (!DomHelpers.getjQueryElement(form.selector).find("input").length || !findFieldsForThisPage(form, !1, !0)) return void setTimeout(function() { waitForSelectorToAppear(form.selector, form, callback) }, 500); logger.log("form-manager:watcher", "Found form with selector :", selector), ~form.technique.indexOf("-wait-for") || (form.technique = form.technique + "-wait-for"), callback(form, atlasProcessCallback) }); var atlasProcessCallback = function() { waitForElementToDisappear(DomHelpers.getElement(form.selector), form, callback) } } function waitForElementToDisappear(element, form, callback) { logger.log("form-manager:watcher", "Waiting for form element to disappear", element, form.selector), DomHelpers.waitForElementToDissapear(element, !1, function() { form.faFilled && (form.faFilled = !1), _.each(form.fields, function(field) { field.el && (field.el.fieldFound = !1) }), logger.log("form-manager:watcher", "Form element has disappeared :", element, form.selector), logger.log("form-manager:watcher", "Waiting for form to appear with selector :", form.selector), waitForSelectorToAppear(form.selector, form, callback) }) } var logger = require("../logger") , DomHelpers = require("../dom-helpers") , _ = require("underscore") , $ = require("jquery") , findFieldsForThisPage = require("./find-fields"); exports.observeMissingForms = observeMissingForms, exports.waitForSelectorToAppear = waitForSelectorToAppear, exports.waitForElementToDisappear = waitForElementToDisappear } , { "../dom-helpers": 5, "../logger": 130, "./find-fields": 84, jquery: "jquery", underscore: "underscore" }], 95: [function(require, module, exports) { var Form = require("./lib/form") , finder = require("./lib/finder"); exports = module.exports = Form, exports.Finder = finder, Form.find = function(opts) { return new finder(opts) } } , { "./lib/finder": 101, "./lib/form": 103 }], 96: [function(require, module, exports) { function Asset(data) { this.attrs = {}, this.set(data) } function splitName(fullName) { var result = {}; result.full = fullName, result.first = "", result.last = ""; var sName = fullName.split(" "); if (1 == sName.length) result.first = sName[0]; else if (2 == sName.length) result.first = sName[0], result.last = sName[1]; else if (sName.length > 2) { result.first = sName[0] + " " + sName[1]; for (var i = 2; i < sName.length; i++) result.last += sName[i], i !== sName.length - 1 && (result.last += " ") } return result } module.exports = Asset, Asset.prototype.set = function(data) { for (var key in data) "function" == typeof this[key] && this[key](data[key]) } , Asset.attr = function(name) { return this.attrs = this.attrs || [], this.attrs.push(name), this.prototype[name] = function(val) { return arguments.length ? (this.attrs[name] = val, this) : this.attrs[name] } , this } , Asset.attr("first_name").attr("last_name").attr("full_name").attr("username").attr("password").attr("email").attr("address").attr("city").attr("country").attr("state").attr("zip").attr("phone").attr("cellular").attr("card_number").attr("cvv").attr("card_type").attr("expiry_date_month").attr("expiry_date_year").attr("expiry_date"), Asset.prototype.each = Asset.prototype.forEach = function(fn) { for (var i = 0, l = Asset.attrs.length; i < l; i++) { var attr = Asset.attrs[i] , val = this[attr](); val && fn(attr, val) } } , Asset.prototype.full_name = function(val) { if (this.attrs = this.attrs || {}, !arguments.length) return this.attrs.full_name; var names = splitName(val); return this.attrs.full_name = names.full, this.first_name(names.first), this.last_name(names.last), this } , Asset.prototype.expiry_date = function() { return this.expiry_date_month() + "/" + this.expiry_date_year() } } , {}], 97: [function(require, module, exports) { function Field(attrs) { if (!(this instanceof Field)) return new Field(attrs); attrs = attrs || {}, this.attrs = {}; for (var key in attrs) attrs.hasOwnProperty(key) && ("function" == typeof this[key] ? this[key](attrs[key]) : this.attrs[key] = attrs[key]) } var Accessible = require("../utils/accessible") , trigger = require("../utils/trigger-event") , visible = (require("debug")("form:field"), require("visible")); module.exports = Field; var mixins = { input: require("./input"), select: require("./select") }; Accessible(Field), Field.attr("fieldType").attr("selector").attr("scores"), Field.prototype.el = Field.prototype.element = function(val) { if (!arguments.length) { if (this.attrs.el) return this.attrs.el; var ctx = this.form.el() , el = ctx && ctx.querySelector(this.selector()); return this.attrs.el = el, el } this.attrs.el = val; var nodeName = val && val.nodeName && val.nodeName.toLowerCase() , mixin = mixins[nodeName]; return mixin && mixin(this), this } , Field.prototype.selector = function(val) { return arguments.length ? (this.attrs.selector = val, this) : this.attrs.selector } , Field.prototype.fieldType = function(type) { return arguments.length ? (this.attrs.fieldType = type, this) : this.attrs.fieldType } , Field.prototype.fill = function(val) { var el = this.el(); return el ? (el.focus && el.focus(), trigger(el, "focus"), el.value = val, trigger(el, "change"), trigger(el, "keyup"), el.blur && el.blur(), trigger(el, "blur"), this) : this } , Field.prototype.clear = function() { return this.fill("") } , Field.prototype.click = function() { var el = this.el(); return el.click(), trigger(el, "click"), this } , Field.prototype.toJSON = function(shallow) { var json = {}; if (shallow) json.fieldType = this.attrs.fieldType, json.selector = this.attrs.selector; else for (var key in this.attrs) if (this.attrs.hasOwnProperty(key)) if ("function" == typeof this[key]) { var val = this[key](); ~["string", "number"].indexOf(typeof val) && (json[key] = val) } else { var val = this.attrs[key]; ~["string", "number"].indexOf(typeof val) && (json[key] = val) } return !shallow && this.el() && (json.visible = visible(this.el())), json } } , { "../utils/accessible": 106, "../utils/trigger-event": 111, "./input": 98, "./select": 99, debug: 148, visible: 236 }], 98: [function(require, module, exports) { function Input(obj) { if (obj) return mixin(obj) } function mixin(obj) { return obj.fill = Input.prototype.fill, obj } var trigger = require("../utils/trigger-event"); module.exports = Input, Input.prototype.fill = function(val) { var input = this.el(); return input ? (input.focus && input.focus(), trigger(input, "focus"), input.value = val, trigger(input, "input", { bubbles: !0 }), trigger(input, "keyup"), trigger(input, "change"), input.blur && input.blur(), trigger(input, "blur"), this) : this } } , { "../utils/trigger-event": 111 }], 99: [function(require, module, exports) { function Select(obj) { if (obj) return mixin(obj) } function mixin(obj) { return obj.fill = Select.prototype.fill, obj } var trigger = require("../utils/trigger-event") , states = require("./states"); module.exports = Select, Select.prototype.fill = function(val) { var select = this.el(); if (!select) return this; select.focus && select.focus(), trigger(select, "focus"); var options = select.querySelectorAll("option") , regex = new RegExp(val,"i"); "state" == this.fieldType() && 2 == options[options.length - 1].innerText.length && (regex = new RegExp(states[val])); for (var i = 0, l = options.length; i < l; i++) { var option = options[i]; regex.test(option.innerText) || regex.test(option.value) ? option.selected = !0 : option.selected = !1 } return trigger(select, "change"), select.blur && select.blur(), trigger(select, "blur"), this } } , { "../utils/trigger-event": 111, "./states": 100 }], 100: [function(require, module, exports) { module.exports = { Alabama: "AL", Alaska: "AK", "American Samoa": "AS", Arizona: "AZ", Arkansas: "AR", California: "CA", Colorado: "CO", Connecticut: "CT", Delaware: "DE", "District Of Columbia": "DC", "Federated States Of Micronesia": "FM", Florida: "FL", Georgia: "GA", Guam: "GU", Hawaii: "HI", Idaho: "ID", Illinois: "IL", Indiana: "IN", Iowa: "IA", Kansas: "KS", Kentucky: "KY", Louisiana: "LA", Maine: "ME", "Marshall Islands": "MH", Maryland: "MD", Massachusetts: "MA", Michigan: "MI", Minnesota: "MN", Mississippi: "MS", Missouri: "MO", Montana: "MT", Nebraska: "NE", Nevada: "NV", "New Hampshire": "NH", "New Jersey": "NJ", "New Mexico": "NM", "New York": "NY", "North Carolina": "NC", "North Dakota": "ND", "Northern Mariana Islands": "MP", Ohio: "OH", Oklahoma: "OK", Oregon: "OR", Palau: "PW", Pennsylvania: "PA", "Puerto Rico": "PR", "Rhode Island": "RI", "South Carolina": "SC", "South Dakota": "SD", Tennessee: "TN", Texas: "TX", Utah: "UT", Vermont: "VT", "Virgin Islands": "VI", Virginia: "VA", Washington: "WA", "West Virginia": "WV", Wisconsin: "WI", Wyoming: "WY" } } , {}], 101: [function(require, module, exports) { function FormFinder(opts) { opts = opts || {}, this.ctx(document), this.execOnStart(!0), this.set(opts), this.watched = [], this.found = [], this.running = !1 } function hasInput(el) { if (el) { if ("INPUT" == el.nodeName && "password" == el.type) return !0; var inputs = el.querySelectorAll && el.querySelectorAll("input[type=password]"); return !(!inputs || !inputs.length) } } function within(el, parent) { for (var node = el; node = node.parentNode; ) if (node == parent) return !0; return !1 } var setImmediate, debug = require("debug")("form:finder"), fdetect = require("../../../fdetect"), Accessible = require("../utils/accessible"), Emitter = require("component-emitter"), Loop = require("../utils/loop"), Observer = require("../utils/mutation-observer"), Form = (require("visible"), require("../form")), $ = require("jquery"); module.exports = FormFinder, Emitter(FormFinder), Emitter(FormFinder.prototype), Accessible(FormFinder).attr("ctx").attr("filters").attr("detect").attr("execOnStart"), FormFinder.prototype.set = function(opts) { opts = opts || {}; for (var prop in opts) "function" == typeof this[prop] && "undefined" != typeof opts[prop] && this[prop](opts[prop]); return this } , FormFinder.prototype.exec = function(opts) { var self = this; return opts = opts || {}, this.set(opts), opts = { ctx: this.ctx(), filters: this.filters(), detect: this.detect(), isMutation: opts.isMutation }, setImmediate || (setImmediate = require("../utils/set-immediate")), setImmediate(function() { var forms = fdetect.getForms(opts).map(function(form) { return form = Form(form), form.attrs.isMutation = opts.isMutation || !1, form }); self.emit("forms", forms, opts), forms.forEach(function(form) { ~self.found.indexOf(form.el()) || (self.found.push(form.el()), self.emit(form.formType(), form, form.el()), self.emit("form", form, form.el(), form.formType())) }) }), this } , FormFinder.prototype.start = function() { var self = this; return this.running = !0, this.loop = this.loop || new Loop, this.observe(), this.execOnStart() && this.exec(), this.loop.on("render", function() { self.onrender.apply(self, arguments) }), this.loop.start(), this.emit("start"), debug("start"), this } , FormFinder.prototype.observe = function() { if (["function", "object"].indexOf(typeof Observer) == -1) return this; var self = this; return this.observer = this.observer || new Observer(function() { self.onchanges.apply(self, arguments) } ), this.observer.observe(this.ctx(), { childList: !0, subtree: !0 }), this } , FormFinder.prototype.onchanges = function(changes) { for (var i = 0, len = changes.length; i < len; i++) if (changes[i].addedNodes.length) for (var nodes = [].slice.call(changes[i].addedNodes).reduce(function(ret, el) { return ~ret.indexOf(el) ? ret : ret.some(function(parent) { return $.contains(parent, el) }) ? ret : (ret.push(el), ret) }, []), j = 0, l = nodes.length; j < l; j++) { var target = nodes[j] , containsInput = hasInput(target) , alreadyWatched = ~this.watched.indexOf(target) , alreadyIncluded = this.watched.some(function(el) { return within(target, el) }); !containsInput || alreadyWatched || alreadyIncluded || this.watched.push(target) } } , FormFinder.prototype.disconnect = function() { return this.observer && this.observer.disconnect(), this } , FormFinder.prototype.pause = FormFinder.prototype.stop = function() { return this.running = !1, this.disconnect(), this.loop.pause(), this.loop.off("render"), this.emit("pause"), debug("pause"), this } , FormFinder.prototype.onrender = function() { var watched = this.watched.slice(); for (this.watched = []; watched.length; ) { var el = watched.pop(); this.exec({ ctx: el, isMutation: !0 }) } return this } } , { "../../../fdetect": 13, "../form": 103, "../utils/accessible": 106, "../utils/loop": 107, "../utils/mutation-observer": 108, "../utils/set-immediate": 110, "component-emitter": 146, debug: 148, jquery: "jquery", visible: 236 }], 102: [function(require, module, exports) { function Address(obj) { if (obj) return mixin(obj) } function mixin(obj) { return obj.fill = Address.prototype.fill, obj } var Asset = require("../asset"); module.exports = Address, Address.prototype.fill = function(data) { if (!this.el()) return this; var self = this , asset = new Asset(data); return asset.forEach(function(role, val) { if ("address" == role) { var field = self.getFields(role).shift(); field && field.fill(asset.address()) } else if ("phone" == role) { var field = self.getFields(role).shift(); field && field.fill(asset.phone() || asset.cellular()) } else if ("cellular" == role) { var fields = self.getFields("phone"); asset.phone ? fields.length >= 2 && (field = fields && fields[1]) : field = fields && fields.shift(), field && field.fill(asset.cellular() || asset.phone()) } else self.getFields(role).forEach(function(field) { field.fill(val) }) }), this } } , { "../asset": 96 }], 103: [function(require, module, exports) { function Form(attrs) { if (!(this instanceof Form)) return new Form(attrs); attrs = attrs || {}, this.attrs = {}, this.fields = []; for (var key in attrs) "fields" != key && attrs.hasOwnProperty(key) && ("function" == typeof this[key] ? this[key](attrs[key]) : this.attrs[key] = attrs[key]); this.classifyFields(attrs.fields) } var Accessible = require("../utils/accessible") , Emitter = require("component-emitter") , fdetect = require("../../../fdetect") , visible = require("visible") , Field = require("../field") , Asset = require("../asset") , mixins = { address: require("./address"), login: require("./login"), payment: require("./payment") }; module.exports = Form, Emitter(Form.prototype), Accessible(Form), Form.prototype.__iterate__ = function() { var self = this; return { length: function() { return self.length() }, get: function(i) { return self.fields[i] } } } , Form.attr("visible").attr("el").attr("selector").attr("context").attr("formType").attr("formFinder"), Form.prototype.length = function() { return this.fields.length } , Emitter(Form.prototoype), Form.prototype.el = Form.prototype.element = function(el) { if (!arguments.length) { if (this.attrs.el) return this.attrs.el; var el = document.querySelector(this.selector()); return this.attrs.el = el, el } return this.attrs.el = el, this } , Form.prototype.selector = function(val) { return arguments.length ? (this.attrs.selector = val, this) : this.attrs.selector } , Form.prototype.formType = function(val) { if (!arguments.length) return this.attrs.formType; this.attrs.formType = val; var mixin = mixins[val]; return mixin && mixin(this), this } , Form.prototype.fill = function(data) { if (!this.el()) return this; var self = this; return new Asset(data).forEach(function(role, val) { self.getFields(role).forEach(function(field) { field.fill(val) }) }), this } , Form.prototype.classifyFields = function(fields) { var self = this; if (fields) this.emit("classifyFields", fields, this.el()), this.fields = this.fields || [], fields.forEach(function(field) { self.push(Field(field)) }); else { var roles = fdetect.roles(this.el(), this.formType()); this.emit("classifyFields", roles, this.el()), this.fields = this.fields || []; for (var role in roles) if (roles.hasOwnProperty(role)) for (var i = 0, l = roles[role].length; i < l; i++) this.push(Field({ fieldType: role, el: roles[role][i] })) } return this } , Form.prototype.push = function(field) { return field ? (field.form = this, this.fields.push(field), this) : this } , Form.prototype.getFields = function(role) { return this.fields.filter(function(field) { return !role || role == field.fieldType() }) } , Form.prototype.submit = function() { var captcha = this.getFields("captcha").at(0) , submit = this.getFields("submit").at(0); return captcha ? (captcha.focus(), this) : (submit && submit.click(), this) } , Form.prototype.clear = function() { return this.fields.map(function(field) { return field.clear() }), this } , Form.prototype.visible = function() { return "undefined" == typeof this.attrs.visible && this.el() ? visible(this.el()) : this.attrs.visible } , Form.prototype.toJSON = function(shallow) { var self = this , json = {}; if (shallow) ["url", "context", "selector", "formType", "version"].forEach(function(attr) { json[attr] = self.attrs[attr] }); else for (var key in this.attrs) if ("fields" != key && this.attrs.hasOwnProperty(key)) if ("function" == typeof this[key]) { var val = this[key](); ~["string", "number"].indexOf(typeof val) && (json[key] = val) } else { var val = this.attrs[key]; ~["string", "number"].indexOf(typeof val) && (json[key] = val) } return shallow || (json.performance = this.attrs.performance || []), !shallow && this.el() && (json.visible = this.visible()), json.fields = self.fields.map(function(field) { return field.toJSON(shallow) }), json } } , { "../../../fdetect": 13, "../asset": 96, "../field": 97, "../utils/accessible": 106, "./address": 102, "./login": 104, "./payment": 105, "component-emitter": 146, visible: 236 }], 104: [function(require, module, exports) { function Login(obj) { if (obj) return mixin(obj) } function mixin(obj) { return obj } module.exports = Login } , {}], 105: [function(require, module, exports) { function Payment(obj) { if (obj) return mixin(obj) } function mixin(obj) { return obj } module.exports = Payment } , {}], 106: [function(require, module, exports) { function Accessible(ctor) { if (ctor) return mixin(ctor) } function mixin(ctor) { ctor.attrs = ctor.attrs || {}; for (var key in Accessible) ctor[key] = Accessible[key]; return ctor } module.exports = Accessible, Accessible.attr = function(name, options) { return this.attrs[name] = options || {}, this.prototype[name] = function(val) { if (this.dirty = this.dirty || {}, this.attrs = this.attrs || {}, !arguments.length) return this.attrs[name]; var prev = this.attrs[name]; return this.dirty[name] = val, this.attrs[name] = val, this.constructor && "function" == typeof this.constructor.emit && (this.constructor.emit("change", this, name, val, prev), this.constructor.emit("change " + name, this, val, prev)), "function" == typeof this.emit && (this.emit("change", name, val, prev), this.emit("change " + name, val, prev)), this } , this.prototype.toJSON = function() { return this.attrs || {} } , this } } , {}], 107: [function(require, module, exports) { function Loop(fps) { this.now = 0, this.before = 0, this.deltaTime = 0, this.maxDeltaTime = 0, this.timeStep = 0, this.startTime = 0, this.timeElapsed = 0, this.accumulator = 0, this.ticking = !1, this.frame = 0, this._fps = 0, this.fps(fps || 60) } var raf = require("./raf") , Emitter = require("component-emitter"); module.exports = Loop, Emitter(Loop.prototype), Loop.prototype.start = function() { return this.startTime = this.now = this.before = Date.now(), this.emit("start"), this.ticking = !0, this.tick(), this } , Loop.prototype.pause = function() { return this.ticking = !1, this.emit("pause"), this } , Loop.prototype.fps = function(fps) { return fps ? (this._fps = fps, this.timeStep = 1e3 / this._fps | 0, this.maxDeltaTime = 5 * this.timeStep, this) : this._fps } , Loop.prototype.tick = function() { function tick() { if (self.ticking) { if (raf(tick), self.now = Date.now(), self.timeElapsed = self.now - self.startTime, self.deltaTime = self.now - self.before, self.before = self.now, self.deltaTime > self.maxDeltaTime) return void self.emit("discard", self.deltaTime / self.timeStep, self.deltaTime); for (self.accumulator += self.deltaTime; self.accumulator >= self.timeStep; ) self.accumulator -= self.timeStep, self.emit("update", self.timeStep, 1, ++self.frame, self.timeElapsed); alpha = self.accumulator / self.timeStep, self.emit("render", self.deltaTime, alpha, self.frame, self.timeElapsed) } } var alpha, self = this; return raf(tick), this } } , { "./raf": 109, "component-emitter": 146 }], 108: [function(require, module, exports) { module.exports = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver } , {}], 109: [function(require, module, exports) { function fallback(fn) { var curr = (new Date).getTime() , ms = Math.max(0, 16 - (curr - prev)) , req = setTimeout(function() { fn() }, ms); return prev = curr, req } exports = module.exports = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || fallback; var prev = (new Date).getTime() , cancel = window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.clearTimeout; exports.cancel = function(id) { cancel.call(window, id) } } , {}], 110: [function(require, module, exports) { (function(process) { !function(root, undefined) { "use strict"; function addFromSetImmediateArguments(args) { return tasksByHandle[nextHandle] = partiallyApplied.apply(void 0, args), nextHandle++ } function partiallyApplied(handler) { var args = [].slice.call(arguments, 1); return function() { "function" == typeof handler ? handler.apply(void 0, args) : new Function("" + handler)() } } function runIfPresent(handle) { if (currentlyRunningATask) setTimeout(function() { partiallyApplied(runIfPresent, handle) }, 0); else { var task = tasksByHandle[handle]; if (task) { currentlyRunningATask = !0; try { task() } finally { clearImmediate(handle), currentlyRunningATask = !1 } } } } function clearImmediate(handle) { delete tasksByHandle[handle] } function installNextTickImplementation() { setImmediate = function() { var handle = addFromSetImmediateArguments(arguments); return process.nextTick(partiallyApplied(runIfPresent, handle)), handle } } function canUsePostMessage() { if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1) return !1; if (global.postMessage && !global.importScripts) { var postMessageIsAsynchronous = !0 , testCallback = function(event) { "canUsePostMessage" === event.data && (postMessageIsAsynchronous = !1, event.stopImmediatePropagation()), global.removeEventListener("message", testCallback, !1) }; return global.addEventListener("message", testCallback, !1), global.postMessage("canUsePostMessage", "*"), postMessageIsAsynchronous } } function installPostMessageImplementation() { var messagePrefix = "setImmediate$" + Math.random() + "$" , onGlobalMessage = function(event) { event.source !== global && event.origin !== global.location.origin || "string" != typeof event.data || 0 !== event.data.indexOf(messagePrefix) || (event.stopImmediatePropagation(), runIfPresent(+event.data.slice(messagePrefix.length))) }; global.addEventListener ? global.addEventListener("message", onGlobalMessage, !1) : global.attachEvent("onmessage", onGlobalMessage), setImmediate = function() { var handle = addFromSetImmediateArguments(arguments); return global.postMessage(messagePrefix + handle, "*"), handle } } function installMessageChannelImplementation() { var channel = new MessageChannel; channel.port1.onmessage = function(event) { runIfPresent(event.data) } , setImmediate = function() { var handle = addFromSetImmediateArguments(arguments); return channel.port2.postMessage(handle), handle } } function installReadyStateChangeImplementation() { var html = doc.documentElement; setImmediate = function() { var handle = addFromSetImmediateArguments(arguments) , script = doc.createElement("script"); return script.onreadystatechange = function() { runIfPresent(handle), script.onreadystatechange = null, html.removeChild(script), script = null } , html.appendChild(script), handle } } function installSetTimeoutImplementation() { setImmediate = function() { var handle = addFromSetImmediateArguments(arguments); return setTimeout(function() { partiallyApplied(runIfPresent, handle) }, 0), handle } } var global = root && root.self && root.self.window ? root.self : root; if (global.setImmediate) return void (module.exports = global.setImmediate); var setImmediate, nextHandle = 1, tasksByHandle = {}, currentlyRunningATask = !1, doc = global.document; "[object process]" === {}.toString.call(global.process) ? installNextTickImplementation() : canUsePostMessage() ? installPostMessageImplementation() : global.MessageChannel ? installMessageChannelImplementation() : doc && "onreadystatechange"in doc.createElement("script") ? installReadyStateChangeImplementation() : installSetTimeoutImplementation(), exports = module.exports = setImmediate, exports.clearImmediate = clearImmediate }("undefined" == typeof window ? this : window) } ).call(this, require("_process")) } , { _process: 218 }], 111: [function(require, module, exports) { function trigger(el, name, options) { var event, type; options = options || {}; for (var attr in defaults) options.hasOwnProperty(attr) || (options[attr] = defaults[attr]); if (document.createEvent) type = eventTypes[name] || "CustomEvent", event = document.createEvent(type), initializers[type](el, name, event, options), el.dispatchEvent(event); else { event = document.createEventObject(); for (var key in options) event[key] = options[key]; el.fireEvent("on" + name, event) } } module.exports = trigger; var eventTypes = { load: "HTMLEvents", unload: "HTMLEvents", abort: "HTMLEvents", error: "HTMLEvents", select: "HTMLEvents", change: "HTMLEvents", submit: "HTMLEvents", reset: "HTMLEvents", focus: "HTMLEvents", blur: "HTMLEvents", resize: "HTMLEvents", scroll: "HTMLEvents", input: "HTMLEvents", keyup: "KeyboardEvent", keydown: "KeyboardEvent", click: "MouseEvents", dblclick: "MouseEvents", mousedown: "MouseEvents", mouseup: "MouseEvents", mouseover: "MouseEvents", mousemove: "MouseEvents", mouseout: "MouseEvents", contextmenu: "MouseEvents" } , defaults = { clientX: 0, clientY: 0, button: 0, ctrlKey: !1, altKey: !1, shiftKey: !1, metaKey: !1, bubbles: !0, cancelable: !0, view: document.defaultView, key: "", location: 0, modifiers: "", repeat: 0, locale: "" } , initializers = { HTMLEvents: function(el, name, event, o) { return event.initEvent(name, o.bubbles, o.cancelable) }, KeyboardEvent: function(el, name, event, o) { var charCode, modifiers, key = "key"in o ? o.key : "", location = "location"in o ? o.location : 0; return event.initKeyboardEvent ? (!1 in o ? (modifiers = [], o.ctrlKey && modifiers.push("Ctrl"), o.altKey && modifiers.push("Alt"), o.ctrlKey && o.altKey && modifiers.push("AltGraph"), o.shiftKey && modifiers.push("Shift"), o.metaKey && modifiers.push("Meta"), modifiers = modifiers.join(" ")) : modifiers = o.modifiers, event.initKeyboardEvent(name, o.bubbles, o.cancelable, o.view, key, location, modifiers, o.repeat, o.locale)) : (charCode = "charCode"in o ? o.charCode : key.charCodeAt(0) || 0, event.initKeyEvent(name, o.bubbles, o.cancelable, o.view, o.ctrlKey, o.altKey, o.shiftKey, o.metaKey, charCode, key)) }, MouseEvents: function(el, name, event, o) { var clicks, button, screenX = "screenX"in o ? o.screenX : o.clientX, screenY = "screenY"in o ? o.screenY : o.clientY; return clicks = "detail"in o ? o.detail : "dblclick" === name ? 2 : 1, "contextmenu" === name && (button = button = o.button || 2), event.initMouseEvent(name, o.bubbles, o.cancelable, o.view, clicks, screenX, screenY, o.clientX, o.clientY, o.ctrlKey, o.altKey, o.shiftKey, o.metaKey, button, el) }, CustomEvent: function(el, name, event, o) { return event.initCustomEvent(name, o.bubbles, o.cancelable, o.detail) } } } , {}], 112: [function(require, module, exports) { function Banner(config) { Frame.apply(this, arguments), this.$el.css({ display: "inline-block", position: "fixed", width: "100%", height: "43px", top: 0, left: 0 }) } var DomHelpers = require("../dom-helpers") , Frame = (require("jquery"), require("./frame")) , inherit = require("component-inherit"); module.exports = Banner; inherit(Banner, Frame), Banner.prototype.show = function(callback) { this.$el.css({ "margin-top": "-43px" }), DomHelpers.addImportantStyleAttribute(this.$el, "visibility", "visible"), DomHelpers.addImportantStyleAttribute(this.$el, "z-index", "2147483647"), this.$el.show(), this.$el.animate({ marginTop: 0 }, { duration: 300, complete: function() { callback && callback() } }) } , Banner.prototype.resize = function(width, height) { return Frame.prototype.resize.call(this, void 0, height) } , Banner.prototype.hide = function(callback) { var _this = this; this.$el.animate({ marginTop: -this.$el.height() }, { duration: 300, complete: function() { _this.$el.hide(), callback && callback() } }) } } , { "../dom-helpers": 5, "./frame": 116, "component-inherit": 147, jquery: "jquery" }], 113: [function(require, module, exports) { function Custom(config) { Frame.apply(this, arguments) } var DomHelpers = require("../dom-helpers") , Frame = require("./frame") , inherit = require("component-inherit"); module.exports = Custom, inherit(Custom, Frame), Custom.prototype.prepareEl = function() { this.$el.css({ position: "fixed", bottom: "-500px", right: "0px" }) } , Custom.prototype.show = function(callback) { DomHelpers.addImportantStyleAttribute(this.$el, "visibility", "visible"), DomHelpers.addImportantStyleAttribute(this.$el, "z-index", "2147483647"), this.$el.animate({ bottom: 0 }, { duration: 300, complete: function() { callback && callback() } }), callback && callback() } , Custom.prototype.hide = function(callback) { var _this = this; this.$el.animate({ bottom: -this.$el.outerHeight(!0) }, { duration: 300, complete: function() { _this.$el.hide(), callback && callback() } }) } } , { "../dom-helpers": 5, "./frame": 116, "component-inherit": 147 }], 114: [function(require, module, exports) { function appendStyles() { var fetchStyles; if (Target.CHROME) { var req = { type: "link-request", content: { method: "fetchContentScriptStyles", params: {} } }; fetchStyles = new Promise(function(resolve, reject) { chrome.extension.sendMessage(req, function(data) { data && data.success ? resolve(data.content) : reject() }) } ) } else fetchStyles = new Promise(function(resolve, reject) { FA.Framework.sendMessage({ faTrigger: "fetchContentScriptStyles" }, function(data) { "string" == typeof data ? resolve(data) : reject() }) } ); return fetchStyles.then(function(data) { var styleNode = document.createElement("style"); styleNode.type = "text/css"; var styleText = document.createTextNode(data); styleNode.appendChild(styleText), document.getElementsByTagName("head")[0].appendChild(styleNode) }) } function onDocumentLoaded() { var frameId = location.hash.substr(1) , options = {}; try { options = JSON.parse(window.name) } catch (e) { options = {} } var frames = require("frames"); frames.setLocale(options.language), view = new (frames.getView(frameId))(options), view.on("frameMessage", sendMessage), $("body").html(view.$el), view.render() } function sendMessage(message, data, view) { var blob = JSON.stringify({ type: "pb-frame-to-parent", message: message, frameID: view.options.uuid, payload: data || {} }); Target.IE ? window.self.parent.postMessage(blob, "*") : window.parent.postMessage(blob, "*") } var view, $ = require("jquery"), Target = require("../target"), Promise = require("bluebird"); module.exports = function() { if ("/pages/tk-inpages-frame.html" !== location.pathname && "/framefactory/tk-inpages-frame.html" !== location.pathname && "/data/pages/tk-inpages-frame.html" !== location.pathname) return !1; Target.IE ? appendStyles().then(function() { onDocumentLoaded() }) : $(document).ready(function() { onDocumentLoaded() }) } ; var onMessage = function(evt) { var parsedMessage; try { parsedMessage = JSON.parse(evt.data) } catch (e) { return } if (parsedMessage && "pb-parent-to-frame" !== parsedMessage.type) return !1; var payload = parsedMessage.payload; view.onMessage(parsedMessage.message, payload) }; "undefined" != typeof PB && Target.IE ? window.self.addEventListener("message", onMessage, !1, !0) : window.addEventListener("message", onMessage, !1, !0) } , { "../target": 142, bluebird: 145, frames: "frames", jquery: "jquery" }], 115: [function(require, module, exports) { function FrameFactory() { this.children = [] } var Frame = require("./frame") , Tooltip = require("./tooltip") , Banner = require("./banner") , Overlay = require("./overlay") , Custom = require("./custom") , _ = require("underscore") , Target = require("../target") , pbUtils = require("../pb-utils") , metrics = require("../metrics"); module.exports = FrameFactory, FrameFactory.prototype.create = function(params) { if (Target.IOS) return !1; var type = params.id.split("-")[0]; if (IS_ENV_IFRAME && "banner" === type) return !1; if (Target.IE && document && 9 === document.documentMode) return PB.contentscript.IEMonitoringExperimentEnabled && FA.Framework.sendMessage({ faTrigger: "mixpanel_track", mixpanel_event: "ie_legacy_document_mode_encountered", mixpanel_params: { origin_script: "legacy", context: "browser_desktop", website_url: metrics.url, domain: metrics.domain, document_mode: document.documentMode } }), !1; var frame, _this = this, config = _.extend(params, { id: params.id, type: type, options: params.options || {}, attachTo: params.attachTo || "[pb-autologin] [pb-role=password]" }); config.options.originScript = params.options.originScript || "legacy", config.options.formIsInIframe = params.options.formIsInIframe || pbUtils.areWeInAnIframe(); var existing = this.getByFrameID(config.id); switch (existing && "tooltip-creditcardSelector" !== config.id && existing.destroy(), type) { case "tooltip": frame = new Tooltip(config); break; case "banner": frame = new Banner(config); break; case "overlay": frame = new Overlay(config); break; case "custom": frame = new Custom(config); break; default: frame = new Frame(config) } return config.options.focus && frame.$el[0].contentWindow.focus(), this.children.push(frame), frame.once("destroy", function() { _this.children = _.without(_this.children, frame) }), frame } , FrameFactory.prototype.getByFrameID = function(id) { return _.find(this.children, function(frame, index, list) { return frame.config.id === id }) } , FrameFactory.prototype.destroyAll = function() { _.each(this.children, function(frame, index, list) { frame.destroy() }) } } , { "../metrics": 135, "../pb-utils": 136, "../target": 142, "./banner": 112, "./custom": 113, "./frame": 116, "./overlay": 118, "./tooltip": 120, underscore: "underscore" }], 116: [function(require, module, exports) { function Frame(config) { this.config = config || { options: {} }, this.config.options.uuid = uuid(), "undefined" != typeof PB && (this.config.options.language = PB.contentscript.bgdata.language), Target.CHROME ? this.url = "chrome-extension://" + chrome.runtime.id + "/pages/tk-inpages-frame.html" : Target.EDGE ? this.url = "ms-browser-extension://" + browser.runtime.id + "/pages/tk-inpages-frame.html" : Target.FIREFOX ? this.url = browser.extension.getURL("pages/tk-inpages-frame.html") : this.url = "https://a0.tkassets.com/framefactory/tk-inpages-frame.html", this.url += "#" + config.id, this.$el = $('