Advertisement
Guest User

Untitled

a guest
Nov 25th, 2016
1,145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. "use strict";
  3. angular.module("payment.popup", ["config", "google.analytics", "notifier", "popup", "purse.service", "system.data"]).factory("paymentPopup", ["$q", "$translate", "$window", "CONFIG", "SystemData", "googleAnalytics", "notifier", "popup", "purse", function(e, t, o, r, a, n, i, s, l) {
  4.   function c(e) {
  5.    return "/proceed/" + [e.requestPath, e.purchaseParams.countryId, e.purchaseParams.pricePointId, e.purchaseParams.paymentMethodId].join("/")
  6.   }
  7.  
  8.   function u(e) {
  9.    var t = a.getShopCountry();
  10.    t !== e && n.trackEvent("Payment", "Country changed", "Used: " + e + ", Default: " + t)
  11.   }
  12.   var d = {};
  13.   return d.getItemName = function(o) {
  14.    var r = ["CREDITS_AMOUNT"];
  15.    return o.creditAmount ? (o.doubleCredits && r.push("DOUBLE_CREDITS_PREFIX"), t(r, {
  16.     value: o.creditAmount
  17.    }).then(function(e) {
  18.     return _([e.DOUBLE_CREDITS_PREFIX, e.CREDITS_AMOUNT]).compact().join(" ")
  19.    })) : e.when(o.name)
  20.   }, d.sendShopTrackingEvents = function(e, t, r) {
  21.    var a = "Item: " + t + ", Method: " + r;
  22.    switch (e) {
  23.     case "SUCCESS":
  24.      n.trackEvent("Payment", "Succeeded", a), o.piwikTrack && (o._spef.push(["trackGoal", 2, a]), o.piwikTrack());
  25.      break;
  26.     case "PENDING":
  27.      n.trackEvent("Payment", "Pending", a);
  28.      break;
  29.     case "ERROR":
  30.      n.trackEvent("Payment", "Failed", a);
  31.      break;
  32.     default:
  33.      n.trackEvent("Payment", "Aborted", a)
  34.    }
  35.   }, d.open = function(e, t) {
  36.    function a(o) {
  37.     o.originalEvent.data && o.originalEvent.data.status && (p = o.originalEvent.data.status, "SUCCESS" !== p && "PENDING" !== p || (l.update(), u(t.countryCode), d.getItemName(t).then(function(e) {
  38.      var r = o.originalEvent.data.txId,
  39.       a = o.originalEvent.data.currency,
  40.       i = o.originalEvent.data.priceInCents,
  41.       s = _(t.categories).sort().join(", "),
  42.       l = Number(i / 100).toFixed(2);
  43.      n.trackTransaction(r, e, t.id, s, l, a)
  44.     })), d.sendShopTrackingEvents(p, t.id, e.id))
  45.    }
  46.  
  47.    function m() {
  48.     "SUCCESS" === p && d.getItemName(t).then(function(e) {
  49.      i.success("SHOP_PAYMENT_SUCCESS", {
  50.       name: e
  51.      })
  52.     })
  53.    }
  54.    var p, h = c(e);
  55.    return angular.element(o).on("message", a), s.open(r.shopUrl + h).then(function() {
  56.     m(), angular.element(o).off("message", a)
  57.    })
  58.   }, d
  59.  }]), angular.module("sub.product.icons", ["locale", "templates"]).component("habboSubProductIcons", {
  60.   bindings: {
  61.    subProducts: "<"
  62.   },
  63.   controllerAs: "SubProductIconsController",
  64.   templateUrl: "shop/payment-details/product-payment-details/sub-product-icons/sub-product-icons.html"
  65.  }), angular.module("payment.premium.sms", ["config", "locale", "templates", "voucher.redeem"]).component("habboPremiumSms", {
  66.   bindings: {
  67.    method: "<"
  68.   },
  69.   controller: ["CONFIG", function(e) {
  70.    var t = this,
  71.     o = [e.localizationSite, t.method.localizationKey].join("_");
  72.    t.methodSmallPrintKey = ["SHOP_PAYMENTMETHOD_SMALLPRINT", o].join("_").toUpperCase(), t.methodInstructionKey = ["SHOP_PAYMENTMETHOD_INSTRUCTION", o].join("_").toUpperCase()
  73.   }],
  74.   controllerAs: "PremiumSmsController",
  75.   templateUrl: "shop/payment-details/payment-steps/premium-sms/premium-sms.html",
  76.   transclude: !0
  77.  }), angular.module("payment.methods", ["locale", "payment.button", "security", "shop.filters", "templates"]).component("habboPaymentMethods", {
  78.   require: {
  79.    PaymentStepsController: "^habboPaymentSteps"
  80.   },
  81.   bindings: {
  82.    item: "<",
  83.    selectedCategory: "@"
  84.   },
  85.   controllerAs: "PaymentMethodsController",
  86.   templateUrl: "shop/payment-details/payment-steps/payment-methods/payment-methods.html"
  87.  }), angular.module("payment.disclaimer", ["ngSanitize", "config", "locale", "payment.button", "templates"]).component("habboPaymentDisclaimer", {
  88.   bindings: {
  89.    item: "<",
  90.    method: "<"
  91.   },
  92.   controller: ["CONFIG", function(e) {
  93.    var t = this,
  94.     o = [e.localizationSite, t.method.localizationKey].join("_");
  95.    t.methodSmallPrintKey = ["SHOP_PAYMENTMETHOD_SMALLPRINT", o].join("_").toUpperCase(), t.methodInstructionKey = ["SHOP_PAYMENTMETHOD_INSTRUCTION", o].join("_").toUpperCase()
  96.   }],
  97.   controllerAs: "PaymentDisclaimerController",
  98.   templateUrl: "shop/payment-details/payment-steps/payment-disclaimer/payment-disclaimer.html"
  99.  }), angular.module("payment.button", ["events", "locale", "payment.popup", "security", "templates"]).component("habboPaymentButton", {
  100.   bindings: {
  101.    item: "<",
  102.    method: "<"
  103.   },
  104.   controller: ["$scope", "EVENTS", "Session", "loginModal", "paymentPopup", function(e, t, o, r, a) {
  105.    function n() {
  106.     return _.includes(i, s.method.category)
  107.    }
  108.    var i = ["builders", "subscription"],
  109.     s = this;
  110.    s.translationKey = n() ? "SHOP_SUBSCRIPTION_SUBSCRIBE_BUTTON" : "SHOP_PAYMENT_BUTTON", s.paymentInProgress = !1, o.hasSession() ? s.purchase = function() {
  111.     s.paymentInProgress = !0, a.open(s.method, s.item).then(function() {
  112.      e.$emit(t.shopPaymentClose)
  113.     })["finally"](function() {
  114.      s.paymentInProgress = !1
  115.     })
  116.    } : s.purchase = r.open
  117.   }],
  118.   controllerAs: "PaymentButtonController",
  119.   templateUrl: "shop/payment-details/payment-steps/payment-button/payment-button.html"
  120.  }), angular.module("adyen.service", ["adyen-cse-js", "config"]).factory("adyen", ["$http", "CONFIG", "adyenCse", function(e, t, o) {
  121.   return {
  122.    encryptAndSend: function(r, a, n) {
  123.     var i = {
  124.       number: r.number,
  125.       cvc: r.cvc,
  126.       holderName: r.name,
  127.       expiryMonth: r.expMonth.toString(),
  128.       expiryYear: r.expYear.toString(),
  129.       generationtime: a
  130.      },
  131.      s = {
  132.       countryId: n.purchaseParams.countryId,
  133.       pricePointId: n.purchaseParams.pricePointId,
  134.       paymentMethodId: n.id,
  135.       creditCardNonce: o.encrypt(i)
  136.      };
  137.     return e.post(t.shopUrl + "/payment/adyen/", s)
  138.    }
  139.   }
  140.  }]), angular.module("adyen-cse-js", ["config"]).factory("adyenCse", ["$window", "CONFIG", function(e, t) {
  141.   var o = t.adyenPublicKey,
  142.    r = {},
  143.    a = e.adyen.encrypt.createEncryption(o, r);
  144.   return a
  145.  }]), angular.module("payment.adyen", ["adyen.service", "config", "credit.card", "events", "locale", "notifier", "purse.service", "templates"]).component("habboAdyen", {
  146.   bindings: {
  147.    method: "<",
  148.    item: "<"
  149.   },
  150.   controller: ["$window", "$http", "$scope", "$rootScope", "$translate", "CONFIG", "EVENTS", "adyen", "notifier", "paymentPopup", "purse", function(e, t, o, r, a, n, i, s, l, c, u) {
  151.    var d = this;
  152.    d.state = "AWAITING_INPUT", d.transactionId = "", d.close = function() {
  153.     r.$broadcast(i.accordionClose), r.$broadcast(i.accordionUpdate)
  154.    }, d.showInputForm = function() {
  155.     d.transactionId = "", d.state = "AWAITING_INPUT"
  156.    }, d.onSend = function(e) {
  157.     var o = n.apiUrl + "/public/info/time";
  158.     return t.get(o).then(function(t) {
  159.      var o = new Date(t.data.time).toISOString();
  160.      return s.encryptAndSend(e, o, d.method).then(function(e) {
  161.       if (e.data.success === !0) u.update(), d.transactionId = e.data.transactionId, d.state = "SUCCESS", d.card = {}, c.getItemName(d.item).then(function(e) {
  162.        l.success("SHOP_PAYMENT_SUCCESS", {
  163.         name: e
  164.        })
  165.       }), c.sendShopTrackingEvents("SUCCESS", d.item.id, d.method.id);
  166.       else switch (d.state = "FAILURE", e.data.message) {
  167.        case "LIMIT_EXCEEDED":
  168.         d.errorType = "LIMIT_EXCEEDED";
  169.         break;
  170.        case "RISK_CHECK_FAILED":
  171.         d.errorType = "RISK_CHECK_FAILED";
  172.         break;
  173.        case "CONNECTION_FAILED:422":
  174.         d.errorType = "USER_DATA";
  175.         break;
  176.        default:
  177.         Bugsnag.notify("Adyen integration returned unexpected result", {
  178.          groupingHash: "Payments",
  179.          response: e.data.message
  180.         }, "info"), d.errorType = "HTTP_ERROR"
  181.       }
  182.      })["catch"](function(e) {
  183.       d.state = "FAILURE", d.errorType = "HTTP_ERROR", d.errorMsg = e.data.errorDetail.content.instructions
  184.      })
  185.     })["catch"](function() {
  186.      l.error("ERROR_SERVER")
  187.     })
  188.    }
  189.   }],
  190.   controllerAs: "AdyenController",
  191.   templateUrl: "shop/payment-details/payment-steps/adyen/adyen.html",
  192.   transclude: !0
  193.  }), angular.module("remote.data", []).directive("habboRemoteData", function() {
  194.   function e(e) {
  195.    return "remoteData" + t(e)
  196.   }
  197.  
  198.   function t(e) {
  199.    return e.charAt(0).toUpperCase() + e.slice(1)
  200.   }
  201.  
  202.   function o(e) {
  203.    return "$" !== e[0]
  204.   }
  205.   return {
  206.    restrict: "A",
  207.    require: ["^form", "ngModel"],
  208.    link: function(t, r, a, n) {
  209.     var i, s = n[0],
  210.      l = n[1],
  211.      c = t.$eval(a.habboRemoteData);
  212.     t.$on("remote-data-invalid", function(t, o) {
  213.      _(c).includes(o) && (i = e(o), l.$setValidity(i, !1))
  214.     }), t.$watch(function() {
  215.      return l.$viewValue
  216.     }, function() {
  217.      i && _(s).keys().filter(o).forEach(function(e) {
  218.       s[e].$setValidity(i, !0)
  219.      })
  220.     })
  221.    }
  222.   }
  223.  }), angular.module("password.pattern", []).directive("habboPasswordPattern", function() {
  224.   return {
  225.    require: "ngModel",
  226.    restrict: "A",
  227.    link: function(e, t, o, r) {
  228.     function a() {
  229.      var e = r.$viewValue;
  230.      return !e || r.$pristine || i(e)
  231.     }
  232.  
  233.     function n(e) {
  234.      r.$setValidity("passwordPattern", e)
  235.     }
  236.  
  237.     function i(e) {
  238.      return /(?=.*[A-Za-z])(?=.*[0-9-=?!@:.])/.test(e)
  239.     }
  240.     e.$watch(a, n)
  241.    }
  242.   }
  243.  }), angular.module("password.name", []).directive("habboPasswordName", function() {
  244.   return {
  245.    require: "ngModel",
  246.    restrict: "A",
  247.    link: function(e, t, o, r) {
  248.     function a(e) {
  249.      return n && (_(e).includes(n) || _(e).includes(i))
  250.     }
  251.     var n, i;
  252.     o.$observe("habboPasswordName", function(e) {
  253.      n = e, i = n.split("").reverse().join(""), r.$validate()
  254.     }), r.$validators.passwordName = function(e, t) {
  255.      return r.$isEmpty(e) || !a(t)
  256.     }
  257.    }
  258.   }
  259.  }), angular.module("password.email", []).directive("habboPasswordEmail", function() {
  260.   return {
  261.    require: "ngModel",
  262.    restrict: "A",
  263.    link: function(e, t, o, r) {
  264.     function a(e) {
  265.      return n && (_(e).includes(n) || _(e).includes(i))
  266.     }
  267.     var n, i;
  268.     o.$observe("habboPasswordEmail", function(e) {
  269.      n = e, i = n.split("").reverse().join(""), r.$validate()
  270.     }), r.$validators.passwordEmail = function(e, t) {
  271.      return r.$isEmpty(e) || !a(t)
  272.     }
  273.    }
  274.   }
  275.  }), angular.module("matches", []).directive("habboMatches", function() {
  276.   return {
  277.    require: ["^form", "ngModel"],
  278.    restrict: "A",
  279.    scope: {
  280.     habboMatches: "@"
  281.    },
  282.    link: function(e, t, o, r) {
  283.     function a() {
  284.      var t = i[e.habboMatches],
  285.       o = s.$viewValue;
  286.      return !o || s.$pristine || t.$invalid || t.$viewValue === o
  287.     }
  288.  
  289.     function n(e) {
  290.      s.$setValidity("matches", e)
  291.     }
  292.     var i = r[0],
  293.      s = r[1];
  294.     e.$watch(a, n)
  295.    }
  296.   }
  297.  }), angular.module("email", []).directive("habboEmail", function() {
  298.   var e = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i;
  299.   return {
  300.    require: "ngModel",
  301.    restrict: "A",
  302.    link: function(t, o, r, a) {
  303.     a && a.$validators.email && (a.$validators.email = function(t) {
  304.      return a.$isEmpty(t) || e.test(t)
  305.     })
  306.    }
  307.   }
  308.  }), angular.module("password.strength.service", []).factory("passwordStrength", function() {
  309.   var e = "abcdefghijklmnopqrstuvwxyz",
  310.    t = "01234567890",
  311.    o = /\d/g,
  312.    r = "\\!@#$%&/()=?¿",
  313.    a = /[$-\/:-?{-~!^_`\[\]]/g,
  314.    n = /(?=([a-z]{2}))/g,
  315.    i = /(?=([A-Z]{2}))/g,
  316.    s = /(?=(\d{2}))/g,
  317.    l = /^[0-9]*$/g,
  318.    c = /^([a-z]|[A-Z])*$/g;
  319.   return function(u) {
  320.    var d, m, p, h, f = 0,
  321.     b = {
  322.      pos: {},
  323.      neg: {}
  324.     },
  325.     g = {
  326.      pos: {},
  327.      neg: {
  328.       seqLetter: 0,
  329.       seqNumber: 0,
  330.       seqSymbol: 0
  331.      }
  332.     };
  333.    if (u) {
  334.     for (b.pos.lower = u.match(/[a-z]/g), b.pos.upper = u.match(/[A-Z]/g), b.pos.numbers = u.match(o), b.pos.symbols = u.match(a), b.pos.middleNumber = u.slice(1, -1).match(o), b.pos.middleSymbol = u.slice(1, -1).match(a), g.pos.lower = b.pos.lower ? b.pos.lower.length : 0, g.pos.upper = b.pos.upper ? b.pos.upper.length : 0, g.pos.numbers = b.pos.numbers ? b.pos.numbers.length : 0, g.pos.symbols = b.pos.symbols ? b.pos.symbols.length : 0, p = _.reduce(g.pos, function(e, t) {
  335.       return e + Math.min(1, t)
  336.      }, 0), g.pos.numChars = u.length, p += g.pos.numChars >= 8 ? 1 : 0, g.pos.requirements = p >= 3 ? p : 0, g.pos.middleNumber = b.pos.middleNumber ? b.pos.middleNumber.length : 0, g.pos.middleSymbol = b.pos.middleSymbol ? b.pos.middleSymbol.length : 0, b.neg.consecLower = u.match(n), b.neg.consecUpper = u.match(i), b.neg.consecNumbers = u.match(s), b.neg.onlyNumbers = u.match(l), b.neg.onlyLetters = u.match(c), g.neg.consecLower = b.neg.consecLower ? b.neg.consecLower.length : 0, g.neg.consecUpper = b.neg.consecUpper ? b.neg.consecUpper.length : 0, g.neg.consecNumbers = b.neg.consecNumbers ? b.neg.consecNumbers.length : 0, h = 0; h < e.length - 2; h++) {
  337.      var v = u.toLowerCase();
  338.      m = e.substring(h, parseInt(h + 3, 10)), d = m.split("").reverse().join(""), -1 === v.indexOf(m) && -1 === v.indexOf(d) || g.neg.seqLetter++
  339.     }
  340.     for (h = 0; h < t.length - 2; h++) m = t.substring(h, parseInt(h + 3, 10)), d = m.split("").reverse().join(""), -1 === u.indexOf(m) && -1 === u.toLowerCase().indexOf(d) || g.neg.seqNumber++;
  341.     for (h = 0; h < r.length - 2; h++) m = r.substring(h, parseInt(h + 3, 10)), d = m.split("").reverse().join(""), -1 === u.indexOf(m) && -1 === u.toLowerCase().indexOf(d) || g.neg.seqSymbol++;
  342.     return g.neg.repeated = _(u.toLowerCase().split("")).countBy(function(e) {
  343.      return e
  344.     }).reject(function(e) {
  345.      return 1 === e
  346.     }).reduce(function(e, t) {
  347.      return e + t
  348.     }, 0), f += 4 * g.pos.numChars, g.pos.upper && (f += 2 * (g.pos.numChars - g.pos.upper)), g.pos.lower && (f += 2 * (g.pos.numChars - g.pos.lower)), (g.pos.upper || g.pos.lower) && (f += 4 * g.pos.numbers), f += 6 * g.pos.symbols, f += 2 * (g.pos.middleSymbol + g.pos.middleNumber), f += 2 * g.pos.requirements, f -= 2 * g.neg.consecLower, f -= 2 * g.neg.consecUpper, f -= 2 * g.neg.consecNumbers, f -= 3 * g.neg.seqNumber, f -= 3 * g.neg.seqLetter, f -= 3 * g.neg.seqSymbol, b.neg.onlyNumbers && (f -= g.pos.numChars), b.neg.onlyLetters && (f -= g.pos.numChars), g.neg.repeated && (f -= g.neg.repeated / g.pos.numChars * 10), Math.max(0, Math.min(100, Math.round(f)))
  349.    }
  350.   }
  351.  }), angular.module("password.strength.indicator", ["ngAnimate"]).directive("habboPasswordStrengthIndicator", ["$animate", function(e) {
  352.   return {
  353.    restrict: "A",
  354.    link: function(t, o, r) {
  355.     var a = "10%";
  356.     t.$watch(r.habboPasswordStrengthIndicator, function(t) {
  357.      var r = t + "%";
  358.      e.animate(o, {
  359.       width: a
  360.      }, {
  361.       width: r
  362.      }), a = r
  363.     })
  364.    }
  365.   }
  366.  }]), angular.module("password.strength.filters", []).filter("strengthRating", function() {
  367.   return function(e) {
  368.    switch (Math.round(e / 25)) {
  369.     case 1:
  370.      return "poor";
  371.     case 2:
  372.      return "fair";
  373.     case 3:
  374.      return "ok";
  375.     case 4:
  376.      return "good";
  377.     default:
  378.      return "fail"
  379.    }
  380.   }
  381.  }).filter("ratingTranslation", function() {
  382.   return function(e) {
  383.    return "PASSWORD_STRENGTH_RATING_" + e.toUpperCase()
  384.   }
  385.  }), angular.module("password.strength", ["locale", "password.strength.filters", "password.strength.indicator", "password.strength.service", "templates"]).component("habboPasswordStrength", {
  386.   require: {
  387.    FormController: "^form"
  388.   },
  389.   bindings: {
  390.    modelValue: "<",
  391.    modelName: "@"
  392.   },
  393.   controller: ["$scope", "passwordStrength", function(e, t) {
  394.    var o = this;
  395.    e.$watch("PasswordStrengthController.modelValue", function(e) {
  396.     o.FormController[o.modelName].$valid && (o.score = t(e))
  397.    }), e.$watch("PasswordStrengthController.FormController." + o.modelName + ".$invalid", function(e) {
  398.     e && (o.score = 10)
  399.    })
  400.   }],
  401.   controllerAs: "PasswordStrengthController",
  402.   templateUrl: "common/form/password-new/password-strength/password-strength.html",
  403.   transclude: !0
  404.  }), angular.module("voucher.icon", ["templates"]).component("habboVoucherIcon", {
  405.   bindings: {
  406.    credits: "<?",
  407.    product: "<?"
  408.   },
  409.   controllerAs: "VoucherIconController",
  410.   templateUrl: "shop/voucher-redeem/voucher-icon/voucher-icon.html"
  411.  }), angular.module("shop.transactions.history", ["locale", "templates"]).component("habboTransactionsHistory", {
  412.   bindings: {
  413.    transactions: "<",
  414.    limitTo: "@"
  415.   },
  416.   controllerAs: "TransactionsHistoryController",
  417.   templateUrl: "shop/transactions/transactions-history/transactions-history.html"
  418.  }), angular.module("subscription.thumbnail", ["credit.icon", "locale", "templates"]).component("habboSubscriptionThumbnail", {
  419.   bindings: {
  420.    item: "<"
  421.   },
  422.   controllerAs: "SubscriptionThumbnailController",
  423.   templateUrl: "shop/thumbnails/subscription-thumbnail/subscription-thumbnail.html"
  424.  }), angular.module("product.thumbnail", ["product.icon", "templates"]).component("habboProductThumbnail", {
  425.   bindings: {
  426.    item: "<"
  427.   },
  428.   controllerAs: "ProductThumbnailController",
  429.   templateUrl: "shop/thumbnails/product-thumbnail/product-thumbnail.html"
  430.  }), angular.module("offer.thumbnail", ["locale", "product.icon", "templates"]).component("habboOfferThumbnail", {
  431.   bindings: {
  432.    item: "<"
  433.   },
  434.   controllerAs: "OfferThumbnailController",
  435.   templateUrl: "shop/thumbnails/offer-thumbnail/offer-thumbnail.html"
  436.  }), angular.module("credit.thumbnail", ["credit.icon", "credit.title", "templates"]).component("habboCreditThumbnail", {
  437.   bindings: {
  438.    item: "<"
  439.   },
  440.   controllerAs: "CreditThumbnailController",
  441.   templateUrl: "shop/thumbnails/credit-thumbnail/credit-thumbnail.html"
  442.  }), angular.module("shop.targeted.offer", ["accordion", "offer.payment.details", "offer.thumbnail", "templates"]).component("habboTargetedOffer", {
  443.   bindings: {
  444.    offer: "<"
  445.   },
  446.   controller: function() {
  447.    var e = this;
  448.    e.offerPaymentDetails = {
  449.     imageUrl: e.offer.imageUrl,
  450.     smallImageUrl: e.offer.smallImageUrl,
  451.     name: e.offer.header,
  452.     description: e.offer.description,
  453.     price: e.offer.pricePoint.price,
  454.     paymentMethods: e.offer.pricePoint.paymentMethods
  455.    }
  456.   },
  457.   controllerAs: "TargetedOfferController",
  458.   templateUrl: "shop/store/targeted-offer/targeted-offer.html"
  459.  }), angular.module("products", ["accordion", "locale", "product.payment.details", "product.thumbnail", "templates"]).component("habboProducts", {
  460.   bindings: {
  461.    items: "<",
  462.    selectedCategory: "@"
  463.   },
  464.   controllerAs: "ProductsController",
  465.   templateUrl: "shop/store/inventory/products.html"
  466.  }), angular.module("shop.inventory", ["credits", "products", "shop.filters", "templates"]).component("habboInventory", {
  467.   bindings: {
  468.    inventory: "<",
  469.    selectedCategory: "@"
  470.   },
  471.   controller: ["creditFilter", "paymentFilter", "productFilter", function(e, t, o) {
  472.    var r = this,
  473.     a = t(r.inventory.pricePoints, r.selectedCategory);
  474.    r.creditItems = e(a), r.productItems = o(a), r.isDoubleCreditsActive = r.inventory.doubleCredits
  475.   }],
  476.   controllerAs: "InventoryController",
  477.   templateUrl: "shop/store/inventory/inventory.html"
  478.  }), angular.module("credits", ["accordion", "credit.payment.details", "credit.thumbnail", "locale", "templates"]).component("habboCredits", {
  479.   bindings: {
  480.    items: "<",
  481.    selectedCategory: "@"
  482.   },
  483.   controllerAs: "CreditsController",
  484.   templateUrl: "shop/store/inventory/credits.html"
  485.  }), angular.module("category.filter", ["locale", "templates"]).component("habboCategoryFilter", {
  486.   bindings: {
  487.    paymentCategories: "<",
  488.    selectedCategory: "="
  489.   },
  490.   controller: ["$location", function(e) {
  491.    var t = this;
  492.    t.isActive = function(e) {
  493.     return e === t.selectedCategory || "all" === e && !t.selectedCategory
  494.    }, t.update = function(o) {
  495.     var r = t.selectedCategory;
  496.     t.selectedCategory = "all" === o ? null : o, t.selectedCategory !== r && e.search(_.extend(e.search(), {
  497.      category: t.selectedCategory
  498.     }))
  499.    }
  500.   }],
  501.   controllerAs: "CategoryFilterController",
  502.   templateUrl: "shop/store/category-filter/category-filter.html"
  503.  }), angular.module("subscription.payment.details", ["locale", "payment.info", "payment.steps", "product.icon", "templates"]).component("habboSubscriptionPaymentDetails", {
  504.   bindings: {
  505.    item: "<"
  506.   },
  507.   controllerAs: "SubscriptionPaymentDetailsController",
  508.   templateUrl: "shop/payment-details/subscription-payment-details/subscription-payment-details.html"
  509.  }), angular.module("product.payment.details", ["payment.info", "payment.steps", "product.icon", "sub.product.icons", "templates"]).component("habboProductPaymentDetails", {
  510.   bindings: {
  511.    item: "<",
  512.    selectedCategory: "@"
  513.   },
  514.   controllerAs: "ProductPaymentDetailsController",
  515.   templateUrl: "shop/payment-details/product-payment-details/product-payment-details.html"
  516.  }), angular.module("payment.steps", ["config", "locale", "payment.adyen", "payment.disclaimer", "payment.methods", "payment.premium.sms", "security", "templates"]).component("habboPaymentSteps", {
  517.   bindings: {
  518.    item: "<",
  519.    selectedCategory: "@"
  520.   },
  521.   controller: ["$scope", "CONFIG", "EVENTS", "Session", function(e, t, o, r) {
  522.    function a() {
  523.     i.disclaimerMethod = null, i.premiumSmsMethod = null, i.adyenMethod = null
  524.    }
  525.  
  526.    function n() {
  527.     e.$emit(o.accordionUpdate)
  528.    }
  529.    var i = this;
  530.    i.user = r.user, i.disclaimerMethod = null, i.premiumSmsMethod = null, i.adyenMethod = null, i.setDisclaimer = function(e) {
  531.     i.disclaimerMethod = e, n()
  532.    }, i.setPremiumSms = function(e) {
  533.     i.premiumSmsMethod = e, n()
  534.    }, i.setAdyen = function(e) {
  535.     i.adyenMethod = e, n()
  536.    }, i.reset = function() {
  537.     a(), n()
  538.    }, i.getMethodTitleKey = function(e) {
  539.     var o = [t.localizationSite, e.localizationKey].join("_");
  540.     return ["SHOP_PAYMENTMETHOD_TITLE", o].join("_").toUpperCase()
  541.    }, e.$on(o.accordionClose, a)
  542.   }],
  543.   controllerAs: "PaymentStepsController",
  544.   templateUrl: "shop/payment-details/payment-steps/payment-steps.html",
  545.   transclude: !0
  546.  }), angular.module("payment.info", ["locale", "templates"]).directive("habboPaymentInfo", function() {
  547.   return {
  548.    restrict: "E",
  549.    scope: {},
  550.    templateUrl: function(e, t) {
  551.     return ["shop/payment-details/payment-info/payment-info-", t.type, ".html"].join("")
  552.    }
  553.   }
  554.  }), angular.module("offer.payment.details", ["locale", "payment.info", "payment.steps", "templates"]).component("habboOfferPaymentDetails", {
  555.   bindings: {
  556.    offerPaymentDetails: "<"
  557.   },
  558.   controllerAs: "OfferPaymentDetailsController",
  559.   templateUrl: "shop/payment-details/offer-payment-details/offer-payment-details.html"
  560.  }), angular.module("credit.payment.details", ["credit.icon", "credit.title", "locale", "payment.info", "payment.steps", "templates"]).component("habboCreditPaymentDetails", {
  561.   bindings: {
  562.    item: "<",
  563.    selectedCategory: "@"
  564.   },
  565.   controllerAs: "CreditPaymentDetailsController",
  566.   templateUrl: "shop/payment-details/credit-payment-details/credit-payment-details.html"
  567.  }), angular.module("earn.credits.frame", ["locale", "security", "templates"]).component("habboEarnCreditsFrame", {
  568.   bindings: {
  569.    offerWallUrl: "@"
  570.   },
  571.   controllerAs: "EarnCreditsFrameController",
  572.   templateUrl: "shop/earn-credits/earn-credits-frame/earn-credits-frame.html"
  573.  }), angular.module("credit.card.icon", ["templates"]).component("habboCreditCardIcon", {
  574.   bindings: {
  575.    credits: "<?",
  576.    product: "<?"
  577.   },
  578.   controllerAs: "CreditCardIconController",
  579.   templateUrl: "shop/credit-card-form/credit-card-icon/credit-card-icon.html"
  580.  }), angular.module("activation.status", ["locale", "message.container", "notifier", "security", "settings.service", "templates"]).component("habboActivationStatus", {
  581.   controller: ["Session", "notifier", "settings", function(e, t, o) {
  582.    var r = this;
  583.    r.user = e.user, r.resendInProgress = !1, r.isSent = !1, r.resend = function() {
  584.     r.resendInProgress = !0, o.resendActivationEmail().then(function() {
  585.      r.isSent = !0, t.success("ACTIVATION_RESEND_SUCESS")
  586.     })["catch"](function() {
  587.      t.error("ERROR_SERVER")
  588.     })["finally"](function() {
  589.      r.resendInProgress = !1
  590.     })
  591.    }
  592.   }],
  593.   controllerAs: "ActivationStatusController",
  594.   templateUrl: "settings/email-change/activation-status/activation-status.html"
  595.  }), angular.module("avatar.selector", ["avatar.service", "imager", "locale", "notifier", "security", "templates"]).component("habboAvatarSelector", {
  596.   bindings: {
  597.    avatar: "<"
  598.   },
  599.   controller: ["$window", "Session", "avatar", "notifier", function(e, t, o, r) {
  600.    var a = this;
  601.    a.isSelected = a.avatar.uniqueId === t.user.uniqueId, a.selectionInProgress = !1, a.select = function() {
  602.     a.selectionInProgress = !0, o.select(a.avatar).then(function() {
  603.      e.location.href = "/settings/avatars"
  604.     })["catch"](function() {
  605.      r.error("ERROR_SERVER"), a.selectionInProgress = !1
  606.     })
  607.    }
  608.   }],
  609.   controllerAs: "AvatarSelectorController",
  610.   templateUrl: "settings/avatar-selection/avatar-search/avatar-selector.html"
  611.  }), angular.module("avatar.search", ["avatar.selector", "by.name.description.or.motto.filter", "empty.results", "form", "templates"]).component("habboAvatarSearch", {
  612.   bindings: {
  613.    avatars: "<"
  614.   },
  615.   controllerAs: "AvatarSearchController",
  616.   templateUrl: "settings/avatar-selection/avatar-search/avatar-search.html"
  617.  }), angular.module("avatar.name.check", ["avatar.service"]).directive("habboAvatarNameCheck", ["$q", "avatar", function(e, t) {
  618.   return {
  619.    restrict: "A",
  620.    require: "ngModel",
  621.    link: function(o, r, a, n) {
  622.     n.$asyncValidators.name = function(o, r) {
  623.      return r ? t.isNameAvailable(r) : e.when()
  624.     }
  625.    }
  626.   }
  627.  }]), angular.module("avatar.create.modal", ["avatar.create.form", "templates", "ui.bootstrap"]).factory("avatarCreateModal", ["$uibModal", function(e) {
  628.   var t, o = {};
  629.   return o.open = function() {
  630.    return t = e.open({
  631.     size: "sm",
  632.     templateUrl: "settings/avatar-selection/avatar-create/avatar-create-modal.html"
  633.    }), t.result
  634.   }, o
  635.  }]), angular.module("avatar.create.form", ["avatar.name.check", "avatar.service", "locale", "notifier", "templates"]).component("habboAvatarCreateForm", {
  636.   bindings: {
  637.    onCreate: "&",
  638.    onCancel: "&"
  639.   },
  640.   controller: ["$scope", "avatar", "notifier", function(e, t, o) {
  641.    var r = this;
  642.    r.createInProgress = !1, r.create = function() {
  643.     e.avatarCreateForm.$valid && !e.avatarCreateForm.$pending && (r.createInProgress = !0, t.create(r.name).then(r.onCreate)["catch"](function(e) {
  644.      403 !== e.status && o.error("ERROR_SERVER")
  645.     })["finally"](function() {
  646.      r.createInProgress = !1
  647.     }))
  648.    }
  649.   }],
  650.   controllerAs: "AvatarCreateFormController",
  651.   templateUrl: "settings/avatar-selection/avatar-create/avatar-create-form.html"
  652.  }), angular.module("avatar.create", ["avatar.create.modal", "locale", "security", "templates"]).directive("habboAvatarCreate", ["$window", "Session", "avatarCreateModal", "safetyLockModal", function(e, t, o, r) {
  653.   return {
  654.    restrict: "E",
  655.    scope: {
  656.     avatars: "="
  657.    },
  658.    templateUrl: "settings/avatar-selection/avatar-create/avatar-create.html",
  659.    link: function(a) {
  660.     function n() {
  661.      o.open().then(function() {
  662.       e.location.href = "/hotel"
  663.      })
  664.     }
  665.     a.emailVerified = t.user.emailVerified, a.identityVerified = t.user.identityVerified, a.MAX_AVATARS = 50, a.open = function() {
  666.      t.isTrusted() ? n() : r.open().then(n)
  667.     }
  668.    }
  669.   }
  670.  }]), angular.module("safety.questions.modal", ["safety.questions.form", "templates", "ui.bootstrap"]).factory("safetyQuestionsModal", ["$uibModal", function(e) {
  671.   var t, o = {};
  672.   return o.open = function() {
  673.    return t = e.open({
  674.     templateUrl: "settings/account-security/safety-questions/safety-questions-modal.html"
  675.    }), t.result
  676.   }, o
  677.  }]), angular.module("safety.questions.form", ["account.security.service", "form", "locale", "notifier", "safety.question.filters", "templates"]).constant("QUESTIONS", _.range(1, 10).map(function(e) {
  678.   return {
  679.    questionId: e.toString(),
  680.    questionKey: "IDENTITY_SAFETYQUESTION_" + e
  681.   }
  682.  })).component("habboSafetyQuestionsForm", {
  683.   bindings: {
  684.    onSave: "&",
  685.    onCancel: "&"
  686.   },
  687.   controller: ["$scope", "QUESTIONS", "accountSecurity", "notifier", function(e, t, o, r) {
  688.    var a = this;
  689.    a.saveInProgress = !1, a.questions = t, a.selectedQuestion1 = a.questions[0], a.selectedQuestion2 = a.questions[1], a.save = function() {
  690.     e.safetyQuestionsForm.$valid && (a.saveInProgress = !0, o.save(a.selectedQuestion1.questionId, a.answer1, a.selectedQuestion2.questionId, a.answer2, a.password).then(function() {
  691.      a.onSave(), r.success("ACCOUNT_SECURITY_SAVED_OK")
  692.     })["catch"](function(t) {
  693.      var o = t.data && t.data.error;
  694.      "invalid_password" === o ? e.$broadcast("remote-data-invalid", "password") : 403 !== t.status && r.error("ERROR_SERVER")
  695.     })["finally"](function() {
  696.      a.saveInProgress = !1
  697.     }))
  698.    }
  699.   }],
  700.   controllerAs: "SafetyQuestionsFormController",
  701.   templateUrl: "settings/account-security/safety-questions/safety-questions-form.html"
  702.  }), angular.module("safety.question.filters", []).filter("question", function() {
  703.   return function(e, t) {
  704.    return _.without(e, t)
  705.   }
  706.  }), angular.module("security.login.rpx", ["locale", "security.rpx"]).directive("habboRpxLogin", ["$timeout", "rpxSecurity", function(e, t) {
  707.   return {
  708.    restrict: "E",
  709.    scope: {},
  710.    template: '<a class="janrainEngage" translate="LOGIN_RPX"></a>',
  711.    link: function(o, r) {
  712.     var a = e(t.init);
  713.     r.on("$destroy", function() {
  714.      e.cancel(a), t.destroy()
  715.     })
  716.    }
  717.   }
  718.  }]), angular.module("security.facebook.connect", ["locale", "notifier", "security.service", "templates"]).component("habboFacebookConnect", {
  719.   bindings: {
  720.    onLogin: "&",
  721.    translationKey: "@"
  722.   },
  723.   controller: ["notifier", "security", function(e, t) {
  724.    var o = this;
  725.    o.loginInProgress = !1, o.fbLogin = function() {
  726.     o.loginInProgress = !0, t.fbLogin().then(o.onLogin)["catch"](function(t) {
  727.      var o = t.data && t.data.message;
  728.      "fb.sdk_not_loaded" === o ? e.error("ERROR_FB_SDK") : "unknown" !== t.status && "force.pending" !== t.status && e.error("ERROR_SERVER")
  729.     })["finally"](function() {
  730.      o.loginInProgress = !1
  731.     })
  732.    }
  733.   }],
  734.   controllerAs: "FacebookConnectController",
  735.   templateUrl: "security/login/facebook-connect/facebook-connect.html"
  736.  }), angular.module("recover.password.modal", ["claim.password.form", "locale", "templates", "ui.bootstrap"]).controller("RecoverPasswordController", ["email", function(e) {
  737.   var t = this;
  738.   t.email = e
  739.  }]).factory("recoverPasswordModal", ["$uibModal", function(e) {
  740.   var t = {};
  741.   return t.open = function(t) {
  742.    return e.open({
  743.     controller: "RecoverPasswordController",
  744.     controllerAs: "RecoverPasswordController",
  745.     resolve: {
  746.      email: _.constant(t)
  747.     },
  748.     size: "sm",
  749.     templateUrl: "security/login/claim-password/recover-password-modal.html"
  750.    }).result
  751.   }, t
  752.  }]), angular.module("claim.password.form", ["form", "locale", "notifier", "password.reset.service", "templates"]).component("habboClaimPasswordForm", {
  753.   bindings: {
  754.    cancel: "&",
  755.    emailAddress: "<?"
  756.   },
  757.   controller: ["$scope", "notifier", "passwordReset", function(e, t, o) {
  758.    var r = this;
  759.    r.sent = !1, r.sendingInProgress = !1, r.send = function() {
  760.     e.claimPasswordForm.$valid && (r.sendingInProgress = !0, o.send(r.emailAddress).then(function(e) {
  761.      r.emailAddress = e.data.email, r.sent = !0
  762.     })["catch"](function() {
  763.      t.error("ERROR_SERVER")
  764.     })["finally"](function() {
  765.      r.sendingInProgress = !1
  766.     }))
  767.    }
  768.   }],
  769.   controllerAs: "ClaimPasswordFormController",
  770.   templateUrl: "security/login/claim-password/claim-password-form.html",
  771.   transclude: !0
  772.  }), angular.module("claim.password", ["claim.password.form", "form", "locale", "templates", "ui.bootstrap"]).factory("claimPasswordModal", ["$uibModal", function(e) {
  773.   var t = {};
  774.   return t.open = function() {
  775.    return e.open({
  776.     size: "sm",
  777.     templateUrl: "security/login/claim-password/claim-password-modal.html"
  778.    }).result
  779.   }, t
  780.  }]).component("habboClaimPassword", {
  781.   controller: ["claimPasswordModal", function(e) {
  782.    var t = this;
  783.    t.openModal = e.open
  784.   }],
  785.   controllerAs: "ClaimPasswordController",
  786.   template: '<small><a ng-click="ClaimPasswordController.openModal()" translate="LOGIN_FORGOT_LABEL"></a></small>'
  787.  }), angular.module("captcha.modal", ["form", "templates", "ui.bootstrap"]).controller("CaptchaController", ["$scope", "$uibModalInstance", function(e, t) {
  788.   e.$watch("captchaToken", function(e) {
  789.    e && t.close(e)
  790.   })
  791.  }]).factory("captchaModal", ["$uibModal", function(e) {
  792.   var t = {};
  793.   return t.open = function() {
  794.    return e.open({
  795.     controller: "CaptchaController",
  796.     size: "sm",
  797.     templateUrl: "security/login/captcha-modal/captcha-modal.html",
  798.     windowClass: "captcha-modal"
  799.    }).result
  800.   }, t
  801.  }]), angular.module("security.force.tos.modal", ["locale", "security.force.service", "security.force.tos.form", "templates", "ui.bootstrap"]).factory("forceTOSModal", ["$uibModal", "FORCE", function(e, t) {
  802.   var o = {};
  803.   return o.open = function(o) {
  804.    return e.open({
  805.     size: "sm",
  806.     templateUrl: "security/force/force-tos/force-tos-modal.html"
  807.    }).result.then(function() {
  808.     return o.force = _.without(o.force, t.TOS), o
  809.    })
  810.   }, o
  811.  }]), angular.module("security.force.tos.form", ["locale", "notifier", "security.force.service", "templates"]).component("habboForceTosForm", {
  812.   bindings: {
  813.    onDismiss: "&",
  814.    onSuccess: "&"
  815.   },
  816.   controller: ["$scope", "force", "notifier", function(e, t, o) {
  817.    var r = this;
  818.    r.acceptInProgress = !1, r.accept = function() {
  819.     r.acceptInProgress = !0, t.acceptTOS().then(function() {
  820.      r.onSuccess(), o.success("FORCED_TOS_CHANGE_SUCCESS")
  821.     })["catch"](function() {
  822.      o.error("ERROR_SERVER")
  823.     })["finally"](function() {
  824.      r.acceptInProgress = !1
  825.     })
  826.    }
  827.   }],
  828.   controllerAs: "ForceTosFormController",
  829.   templateUrl: "security/force/force-tos/force-tos-form.html"
  830.  }), angular.module("security.force.password.modal", ["locale", "security.force.password.form", "security.force.service", "templates", "ui.bootstrap"]).factory("forcePasswordModal", ["$uibModal", "FORCE", function(e, t) {
  831.   var o = {};
  832.   return o.open = function(o) {
  833.    return e.open({
  834.     size: "sm",
  835.     templateUrl: "security/force/force-password/force-password-modal.html"
  836.    }).result.then(function() {
  837.     return o.force = _.without(o.force, t.password), o
  838.    })
  839.   }, o
  840.  }]), angular.module("security.force.password.form", ["form", "locale", "notifier", "security.force.service", "templates"]).component("habboForcePasswordForm", {
  841.   bindings: {
  842.    onDismiss: "&",
  843.    onSuccess: "&"
  844.   },
  845.   controller: ["$scope", "force", "notifier", function(e, t, o) {
  846.    var r = this;
  847.    r.changeInProgress = !1, r.passwords = {}, r.change = function() {
  848.     e.forcePasswordChangeForm.$valid && (r.changeInProgress = !0, t.changePassword(r.passwords.password).then(function() {
  849.      r.onSuccess(), o.success("PASSWORD_CHANGE_SUCCESS")
  850.     })["catch"](function(t) {
  851.      var r = t.data && t.data.error;
  852.      "password.too_similar_to_username" === r ? e.$broadcast("remote-data-invalid", "passwordName") : "password.too_similar_to_email" === r ? e.$broadcast("remote-data-invalid", "passwordEmail") : "password.used_earlier" === r ? e.$broadcast("remote-data-invalid", "passwordUsed") : o.error("ERROR_SERVER")
  853.     })["finally"](function() {
  854.      r.changeInProgress = !1
  855.     }))
  856.    }
  857.   }],
  858.   controllerAs: "ForcePasswordFormController",
  859.   templateUrl: "security/force/force-password/force-password-form.html"
  860.  }), angular.module("security.force.email.modal", ["locale", "security.force.email.form", "security.force.service", "templates", "ui.bootstrap"]).controller("ForceEmailController", ["emailAddress", function(e) {
  861.   var t = this;
  862.   t.oldEmailAddress = e
  863.  }]).factory("forceEmailModal", ["$uibModal", "FORCE", function(e, t) {
  864.   var o = {};
  865.   return o.open = function(o) {
  866.    return e.open({
  867.     controller: "ForceEmailController",
  868.     controllerAs: "ForceEmailController",
  869.     size: "sm",
  870.     templateUrl: "security/force/force-email/force-email-modal.html",
  871.     resolve: {
  872.      emailAddress: _.constant(o.email)
  873.     }
  874.    }).result.then(function(e) {
  875.     return o.email = e, o.force = _.without(o.force, t.email), o
  876.    })
  877.   }, o
  878.  }]), angular.module("security.force.email.form", ["form", "locale", "notifier", "security.force.service", "templates"]).component("habboForceEmailForm", {
  879.   bindings: {
  880.    oldEmailAddress: "@",
  881.    onDismiss: "&",
  882.    onSuccess: "&"
  883.   },
  884.   controller: ["$scope", "force", "notifier", function(e, t, o) {
  885.    var r = this;
  886.    r.saveInProgress = !1, r.save = function() {
  887.     e.forceEmailChangeForm.$valid && (r.saveInProgress = !0, t.changeEmail(r.emailAddress).then(function(e) {
  888.      r.onSuccess({
  889.       email: e.email
  890.      }), o.success("EMAIL_FORCE_CHANGE_SUCCESS")
  891.     })["catch"](function(t) {
  892.      var r = t.data && t.data.error;
  893.      "changeEmail.invalid_email" === r ? e.$broadcast("remote-data-invalid", "emailInvalid") : "changeEmail.email_already_in_use" === r ? e.$broadcast("remote-data-invalid", "emailUsedInChange") : o.error("ERROR_SERVER")
  894.     })["finally"](function() {
  895.      r.saveInProgress = !1
  896.     }))
  897.    }
  898.   }],
  899.   controllerAs: "ForceEmailFormController",
  900.   templateUrl: "security/force/force-email/force-email-form.html"
  901.  }), angular.module("room.icon", ["remove.on.error", "show.on.load", "templates"]).component("habboRoomIcon", {
  902.   bindings: {
  903.    url: "@"
  904.   },
  905.   controllerAs: "RoomIconController",
  906.   templateUrl: "profile/item-lists/room-icon/room-icon.html"
  907.  }), angular.module("report.service", ["config"]).factory("reporter", ["$http", "CONFIG", function(e, t) {
  908.   function o(e) {
  909.    return t.extraDataUrl + "/private/creation/" + e.id + "/report"
  910.   }
  911.   var r = {};
  912.   return r.sendReport = function(t) {
  913.    return e.post(o(t), {
  914.     reason: t.reportReason
  915.    })
  916.   }, r
  917.  }]), angular.module("report.modal", ["report.form", "templates", "ui.bootstrap"]).controller("ReportController", ["creation", function(e) {
  918.   var t = this;
  919.   t.creation = e
  920.  }]).factory("reportModal", ["$uibModal", function(e) {
  921.   var t, o = {};
  922.   return o.open = function(o) {
  923.    return t = e.open({
  924.     size: "lg",
  925.     controller: "ReportController",
  926.     controllerAs: "ReportController",
  927.     templateUrl: "profile/creation/report/report-modal.html",
  928.     resolve: {
  929.      creation: _.constant(o)
  930.     }
  931.    }), t.result
  932.   }, o
  933.  }]), angular.module("report.form", ["ngMessages", "locale", "notifier", "report.service", "reported.photos", "templates"]).component("habboReportForm", {
  934.   bindings: {
  935.    creation: "<",
  936.    onSuccess: "&",
  937.    onCancel: "&"
  938.   },
  939.   controller: ["$location", "$scope", "notifier", "reportedPhotos", "reporter", function(e, t, o, r, a) {
  940.    var n = this;
  941.    n.sendInProgress = !1, n.reasonCodes = [19, 20, 1, 32, 8], n.send = function() {
  942.     t.reportForm.$valid && (n.sendInProgress = !0, a.sendReport(n.creation).then(function() {
  943.      n.onSuccess(), r.save(n.creation.id), e.path("/community/photos").replace(), o.success("REPORT_SUCCESS")
  944.     })["catch"](function(e) {
  945.      429 === e.status ? o.error("ERROR_TOO_MANY_REPORTS") : 401 !== e.status && o.error("ERROR_SERVER")
  946.     })["finally"](function() {
  947.      n.sendInProgress = !1
  948.     }))
  949.    }
  950.   }],
  951.   controllerAs: "ReportFormController",
  952.   templateUrl: "profile/creation/report/report-form.html"
  953.  }), angular.module("report", ["locale", "report.modal", "templates"]).component("habboReport", {
  954.   bindings: {
  955.    creation: "<"
  956.   },
  957.   controller: ["reportModal", function(e) {
  958.    var t = this;
  959.    t.click = function() {
  960.     e.open(t.creation)
  961.    }
  962.   }],
  963.   controllerAs: "ReportController",
  964.   templateUrl: "profile/creation/report/report.html"
  965.  }), angular.module("photo.delete.service", ["ngResource", "config", "storage"]).factory("photoDelete", ["$http", "CONFIG", "httpCache", function(e, t, o) {
  966.   var r = {};
  967.   return r["delete"] = function(r) {
  968.    return e["delete"](t.extraDataUrl + "/private/photo/" + r).then(function() {
  969.     o.shortCache.removeAll()
  970.    })
  971.   }, r
  972.  }]), angular.module("photo.delete", ["locale", "photo.delete.service", "security", "templates"]).component("habboPhotoDelete", {
  973.   bindings: {
  974.    creation: "<"
  975.   },
  976.   controller: ["$location", "$translate", "$window", "Session", "notifier", "photoDelete", function(e, t, o, r, a, n) {
  977.    function i() {
  978.     n["delete"](s.creation.id).then(function() {
  979.      e.path("/profile/" + r.user.name).replace(), a.success("PHOTO_DELETION_SUCCESS")
  980.     })["catch"](function(e) {
  981.      401 !== e.status && a.error("ERROR_SERVER")
  982.     })
  983.    }
  984.    var s = this;
  985.    s["delete"] = function() {
  986.     t("PHOTO_DELETION_CONFIRMATION").then(function(e) {
  987.      o.confirm(e) && i()
  988.     })
  989.    }
  990.   }],
  991.   controllerAs: "PhotoDeleteController",
  992.   templateUrl: "profile/creation/photo-delete/photo-delete.html"
  993.  }), angular.module("interstitial.service", ["client.messenger", "google.analytics"]).factory("interstitial", ["$rootScope", "$timeout", "$window", "clientMessenger", "googleAnalytics", function(e, t, o, r, a) {
  994.   var n = {},
  995.    i = 15e3;
  996.   return n.started = !1, n.loaded = !1, n.start = function(s) {
  997.    function l(e) {
  998.     var o = e.originalEvent.data && e.originalEvent.data.category;
  999.     if ("interstitial" === o) {
  1000.      var r = e.originalEvent.data && e.originalEvent.data.name;
  1001.      b[r] && t(function() {
  1002.       b[r](e.originalEvent.data)
  1003.      })
  1004.     }
  1005.    }
  1006.  
  1007.    function c() {
  1008.     n.loaded = !0, f = e.$on("$locationChangeStart", function(e) {
  1009.      e.preventDefault()
  1010.     })
  1011.    }
  1012.  
  1013.    function u() {
  1014.     a.trackEvent("Interstitial", "Start"), t.cancel(g)
  1015.    }
  1016.  
  1017.    function d(e) {
  1018.     var t = _.upperFirst(e.name),
  1019.      o = e.remaining || 0,
  1020.      r = e.duration ? 1e3 * (e.duration - o) : null;
  1021.     a.trackEvent("Interstitial", "End", t, r), h("complete")
  1022.    }
  1023.  
  1024.    function m() {
  1025.     a.trackEvent("Interstitial", "Error", "Player"), h("incomplete")
  1026.    }
  1027.  
  1028.    function p() {
  1029.     a.trackEvent("Interstitial", "Error", "Timeout"), h("incomplete")
  1030.    }
  1031.  
  1032.    function h(e) {
  1033.     n.started = !1, n.loaded = !1, t.cancel(g), angular.element(o).off("message", l), f && f(), "midroll" === s && r.handle({
  1034.      interstitial: e
  1035.     })
  1036.    }
  1037.    var f, b = {
  1038.      load: c,
  1039.      start: u,
  1040.      complete: d,
  1041.      skip: d,
  1042.      error: m
  1043.     },
  1044.     g = t(p, i);
  1045.    angular.element(o).on("message", l), n.started = !0, a.trackEvent("Interstitial", "Init")
  1046.   }, n.hasStarted = function() {
  1047.    return n.started
  1048.   }, n.hasLoaded = function() {
  1049.    return n.loaded
  1050.   }, n
  1051.  }]), angular.module("interstitial", ["config", "interstitial.service", "locale", "templates"]).component("habboInterstitial", {
  1052.   controller: ["$scope", "CONFIG", "interstitial", function(e, t, o) {
  1053.    var r = this;
  1054.    r.habboWebAdsUrl = t.habboWebAdsUrl, r.lang = t.lang, e.$watch(o.hasStarted, function(e) {
  1055.     r.started = e
  1056.    }), e.$watch(o.hasLoaded, function(e) {
  1057.     r.loaded = e
  1058.    })
  1059.   }],
  1060.   controllerAs: "InterstitialController",
  1061.   templateUrl: "hotel/client/interstitial/interstitial.html"
  1062.  }), angular.module("client.reload", ["locale", "templates"]).component("habboClientReload", {
  1063.   bindings: {
  1064.    reload: "&"
  1065.   },
  1066.   controllerAs: "ClientReloadController",
  1067.   templateUrl: "hotel/client/client-reload/client-reload.html"
  1068.  }), angular.module("client.error", ["config", "locale", "templates"]).component("habboClientError", {
  1069.   controller: ["CONFIG", function(e) {
  1070.    var t = this;
  1071.    t.appStoreUrl = e.appStoreUrl, t.googlePlayUrl = e.googlePlayUrl
  1072.   }],
  1073.   controllerAs: "ClientErrorController",
  1074.   templateUrl: "hotel/client/client-error/client-error.html"
  1075.  }), angular.module("client.closed", ["hotel.closed", "templates"]).component("habboClientClosed", {
  1076.   templateUrl: "hotel/client/client-closed/client-closed.html"
  1077.  }), angular.module("client.close.expander", ["client.close.expand", "events"]).directive("habboClientCloseExpander", ["$timeout", "EVENTS", function(e, t) {
  1078.   return {
  1079.    restrict: "A",
  1080.    link: function(o, r) {
  1081.     function a() {
  1082.      c(), s = e(n, l)
  1083.     }
  1084.  
  1085.     function n() {
  1086.      e(function() {
  1087.       o.$broadcast("expander-shrink")
  1088.      })
  1089.     }
  1090.  
  1091.     function i() {
  1092.      e.cancel(s), e(function() {
  1093.       o.$broadcast("expander-expand")
  1094.      })
  1095.     }
  1096.     var s, l = 3e4,
  1097.      c = o.$on(t.clientOpen, a);
  1098.     r.mouseenter(i), r.mouseleave(n)
  1099.    }
  1100.   }
  1101.  }]), angular.module("client.close.expand", ["ngAnimate"]).directive("habboClientCloseExpand", ["$animate", function(e) {
  1102.   return {
  1103.    restrict: "A",
  1104.    link: function(t, o) {
  1105.     function r() {
  1106.      n(), i(c, 0)
  1107.     }
  1108.  
  1109.     function a() {
  1110.      n(), i(l, c)
  1111.     }
  1112.  
  1113.     function n() {
  1114.      c || (c = o.width())
  1115.     }
  1116.  
  1117.     function i(t, r) {
  1118.      s && e.cancel(s), l = r, s = e.animate(o, {
  1119.       width: t
  1120.      }, {
  1121.       width: r
  1122.      })
  1123.     }
  1124.     var s, l, c;
  1125.     t.$on("expander-expand", a), t.$on("expander-shrink", r)
  1126.    }
  1127.   }
  1128.  }]), angular.module("local.register.banner", ["config", "language", "locale", "templates"]).component("habboLocalRegisterBanner", {
  1129.   controller: ["CONFIG", "language", function(e, t) {
  1130.    var o = this,
  1131.     r = t.toSite();
  1132.    r && r.hotel !== e.hotel && (o.site = r)
  1133.   }],
  1134.   controllerAs: "LocalRegisterBannerController",
  1135.   templateUrl: "home/register-banner/local-register-banner/local-register-banner.html"
  1136.  }), angular.module("language", []).factory("language", ["$window", function(e) {
  1137.   var t = {};
  1138.   return t.toSite = function() {
  1139.    var t = e.navigator.language ? e.navigator.language.substr(0, 2) : null;
  1140.    switch (t) {
  1141.     case "de":
  1142.      return {
  1143.       hotel: "hhde",
  1144.       href: "https://www.habbo.de",
  1145.       localization: "DE",
  1146.       title: "Habbo.de"
  1147.      };
  1148.     case "en":
  1149.      return {
  1150.       hotel: "hhus",
  1151.       href: "https://www.habbo.com",
  1152.       localization: "EN",
  1153.       title: "Habbo.com"
  1154.      };
  1155.     case "es":
  1156.      return {
  1157.       hotel: "hhes",
  1158.       href: "https://www.habbo.es",
  1159.       localization: "ES",
  1160.       title: "Habbo.es"
  1161.      };
  1162.     case "fr":
  1163.      return {
  1164.       hotel: "hhfr",
  1165.       href: "https://www.habbo.fr",
  1166.       localization: "FR",
  1167.       title: "Habbo.fr"
  1168.      };
  1169.     case "fi":
  1170.      return {
  1171.       hotel: "hhfi",
  1172.       href: "https://www.habbo.fi",
  1173.       localization: "FI",
  1174.       title: "Habbo.fi"
  1175.      };
  1176.     case "it":
  1177.      return {
  1178.       hotel: "hhit",
  1179.       href: "https://www.habbo.it",
  1180.       localization: "IT",
  1181.       title: "Habbo.it"
  1182.      };
  1183.     case "nl":
  1184.      return {
  1185.       hotel: "hhnl",
  1186.       href: "https://www.habbo.nl",
  1187.       localization: "NL",
  1188.       title: "Habbo.nl"
  1189.      };
  1190.     case "pt":
  1191.      return {
  1192.       hotel: "hhbr",
  1193.       href: "https://www.habbo.com.br",
  1194.       localization: "PT",
  1195.       title: "Habbo.com.br"
  1196.      };
  1197.     case "tr":
  1198.      return {
  1199.       hotel: "hhtr",
  1200.       href: "https://www.habbo.com.tr",
  1201.       localization: "TR",
  1202.       title: "Habbo.com.tr"
  1203.      };
  1204.     default:
  1205.      return null
  1206.    }
  1207.   }, t
  1208.  }]), angular.module("moderation.notification", ["google.analytics", "locale", "message.container", "moderation.service", "templates"]).component("habboModerationNotification", {
  1209.   controller: ["PhotoModerations", "googleAnalytics", function(e, t) {
  1210.    var o = this;
  1211.    o.moderations = e.recentModerations(), o.moderations.$promise.then(function(e) {
  1212.     e.length > 0 && t.trackEvent("Moderation", "Notification viewed")
  1213.    })
  1214.   }],
  1215.   controllerAs: "ModerationNotificationController",
  1216.   templateUrl: "home/news/moderation-notification/moderation-notification.html"
  1217.  }), angular.module("moderation.service", ["ngResource", "config", "storage"]).factory("PhotoModerations", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  1218.   return e(t.extraDataUrl + "/private/moderations/recentModerations", null, {
  1219.    recentModerations: {
  1220.     method: "GET",
  1221.     isArray: !0,
  1222.     cache: o.shortCache
  1223.    }
  1224.   })
  1225.  }]), angular.module("discussions", ["avatar", "empty.results", "flash", "locale", "templates"]).component("habboDiscussions", {
  1226.   bindings: {
  1227.    items: "<"
  1228.   },
  1229.   controller: function() {
  1230.    var e = this;
  1231.    e.getParticipant = function(e) {
  1232.     return _.values(e)[0]
  1233.    }
  1234.   },
  1235.   controllerAs: "DiscussionsController",
  1236.   templateUrl: "home/messaging/discussions/discussions.html"
  1237.  }), angular.module("local.storage", []).factory("localStorage", ["$window", function(e) {
  1238.   var t = {};
  1239.   return t.get = function(t) {
  1240.    try {
  1241.     var o = e.localStorage.getItem(t);
  1242.     return o ? angular.fromJson(o) : null
  1243.    } catch (r) {
  1244.     return Bugsnag.notifyException(r, "LocalStorage not supported", {
  1245.      groupingHash: "LocalStorage"
  1246.     }, "info"), null
  1247.    }
  1248.   }, t.set = function(t, o) {
  1249.    try {
  1250.     e.localStorage.setItem(t, angular.toJson(o))
  1251.    } catch (r) {
  1252.     Bugsnag.notifyException(r, "LocalStorage not supported", {
  1253.      groupingHash: "LocalStorage"
  1254.     }, "info")
  1255.    }
  1256.   }, t
  1257.  }]), angular.module("cache", ["angular-cache", "config"]).config(["CacheFactoryProvider", function(e) {
  1258.   angular.extend(e.defaults, {
  1259.    maxAge: 3e5,
  1260.    deleteOnExpire: "aggressive"
  1261.   })
  1262.  }]).factory("httpCache", ["CacheFactory", function(e) {
  1263.   return {
  1264.    shortCache: e.createCache("shortHttpCache"),
  1265.    longCache: e.createCache("longHttpCache", {
  1266.     maxAge: 36e5
  1267.    })
  1268.   }
  1269.  }]), angular.module("user.menu", ["encode.uri.component", "false.on.outside.click", "imager", "locale", "router", "security", "templates", "zendesk.url"]).component("habboUserMenu", {
  1270.   controller: ["$state", "Session", "notifier", "security", function(e, t, o, r) {
  1271.    var a = this;
  1272.    a.user = t.user, a.isMyProfileActive = function() {
  1273.     return e.is("profile", {
  1274.      name: t.user.name
  1275.     })
  1276.    }, a.isSettingsActive = function() {
  1277.     return e.includes("settings")
  1278.    }, a.logout = function() {
  1279.     r.logout()["catch"](function() {
  1280.      o.errorSticky("ERROR_LOGOUT_TITLE", "ERROR_LOGOUT_TEXT")
  1281.     })
  1282.    }
  1283.   }],
  1284.   controllerAs: "UserMenuController",
  1285.   templateUrl: "common/header/user-menu/user-menu.html"
  1286.  }), angular.module("navigation", ["encode.uri.component", "flash", "hotel.button", "locale", "security", "templates"]).component("habboNavigation", {
  1287.   bindings: {
  1288.    active: "@"
  1289.   },
  1290.   controllerAs: "NavigationController",
  1291.   templateUrl: "common/header/navigation/navigation.html"
  1292.  }), angular.module("hotel.button", ["locale", "templates"]).component("habboHotelButton", {
  1293.   templateUrl: "common/header/hotel-button/hotel-button.html"
  1294.  }), angular.module("header.ad", ["ad.unit", "templates"]).component("habboHeaderAd", {
  1295.   controller: ["$scope", "$location", function(e, t) {
  1296.    function o() {
  1297.     n.hasAd = r()
  1298.    }
  1299.  
  1300.    function r() {
  1301.     return !_(a).some(function(e) {
  1302.      return _(t.path()).includes(e)
  1303.     })
  1304.    }
  1305.    var a = ["/playing-habbo/help", "/registration", "/reset-password", "/settings", "/shop"],
  1306.     n = this;
  1307.    o(), e.$on("$stateChangeSuccess", o)
  1308.   }],
  1309.   controllerAs: "HeaderAdController",
  1310.   templateUrl: "common/header/header-ad/header-ad.html"
  1311.  }), angular.module("validators", ["email", "matches", "password.email", "password.name", "password.pattern", "password.strength", "remote.data"]), angular.module("search", ["locale", "templates"]).component("habboSearch", {
  1312.   bindings: {
  1313.    query: "="
  1314.   },
  1315.   controllerAs: "SearchController",
  1316.   templateUrl: "common/form/search/search.html"
  1317.  }), angular.module("password.toggle.mask", []).directive("habboPasswordToggleMask", function() {
  1318.   return {
  1319.    restrict: "A",
  1320.    link: function(e, t, o) {
  1321.     function r(e) {
  1322.      angular.element(e.currentTarget).toggleClass("active"), o.$set("type", "password" === o.type ? "text" : "password"), t.focus()
  1323.     }
  1324.     t.after(angular.element("<i/>", {
  1325.      "class": "password-toggle-mask__icon",
  1326.      click: r,
  1327.      mousedown: function(e) {
  1328.       e.preventDefault()
  1329.      }
  1330.     }))
  1331.    }
  1332.   }
  1333.  }), angular.module("password.new", ["ngMessages", "locale", "password.strength", "password.toggle.mask", "templates", "validators"]).component("habboPasswordNew", {
  1334.   require: {
  1335.    FormController: "^form"
  1336.   },
  1337.   bindings: {
  1338.    isNew: "@",
  1339.    passwordNew: "=",
  1340.    passwordNewRepeated: "=",
  1341.    userName: "@",
  1342.    userEmail: "@"
  1343.   },
  1344.   controllerAs: "PasswordNewController",
  1345.   templateUrl: "common/form/password-new/password-new.html"
  1346.  }), angular.module("password.current", ["ngMessages", "locale", "templates", "validators"]).component("habboPasswordCurrent", {
  1347.   require: {
  1348.    FormController: "^form"
  1349.   },
  1350.   bindings: {
  1351.    passwordCurrent: "="
  1352.   },
  1353.   controllerAs: "PasswordCurrentController",
  1354.   templateUrl: "common/form/password-current/password-current.html"
  1355.  }), angular.module("email.address", ["ngMessages", "locale", "templates", "validators"]).component("habboEmailAddress", {
  1356.   require: {
  1357.    FormController: "^form"
  1358.   },
  1359.   bindings: {
  1360.    emailAddress: "="
  1361.   },
  1362.   controllerAs: "EmailAddressController",
  1363.   templateUrl: "common/form/email-address/email-address.html",
  1364.   transclude: !0
  1365.  }), angular.module("captcha", ["config", "locale", "noCAPTCHA", "templates"]).constant("CAPTCHA_EVENTS", {
  1366.   reset: "captcha-reset"
  1367.  }).component("habboCaptcha", {
  1368.   require: {
  1369.    FormController: "^form"
  1370.   },
  1371.   bindings: {
  1372.    captchaToken: "="
  1373.   },
  1374.   controller: ["$scope", "CAPTCHA_EVENTS", function(e, t) {
  1375.    var o = this;
  1376.    o.noCaptchaController = {}, o.onExpire = function() {
  1377.     o.captchaToken = null
  1378.    }, e.$on(t.reset, function() {
  1379.     o.noCaptchaController.reset(), o.FormController.captchaToken.$setViewValue(null)
  1380.    })
  1381.   }],
  1382.   controllerAs: "CaptchaController",
  1383.   templateUrl: "common/form/captcha/captcha.html"
  1384.  }), angular.module("columns.profile", ["card", "infinite-scroll", "templates"]).component("habboColumnsProfile", {
  1385.   bindings: {
  1386.    items: "<"
  1387.   },
  1388.   controllerAs: "ColumnsProfileController",
  1389.   templateUrl: "common/columns/columns-profile/columns-profile.html"
  1390.  }), angular.module("columns.channel", ["avatar", "card", "infinite-scroll", "templates"]).component("habboColumnsChannel", {
  1391.   bindings: {
  1392.    items: "<"
  1393.   },
  1394.   controllerAs: "ColumnsChannelController",
  1395.   templateUrl: "common/columns/columns-channel/columns-channel.html"
  1396.  }), angular.module("card", ["creation.href", "like", "locale", "templates"]).component("habboCard", {
  1397.   bindings: {
  1398.    item: "<"
  1399.   },
  1400.   controllerAs: "CardController",
  1401.   templateUrl: "common/columns/card/card.html",
  1402.   transclude: !0
  1403.  }), angular.module("ad.double.click", ["config", "locale", "ngDfp", "templates"]).constant("DOUBLE_CLICK_UNITS", {
  1404.   inlineRectangle: {
  1405.    id: "div-gpt-ad-1",
  1406.    size: [300, 250]
  1407.   },
  1408.   leaderboard: {
  1409.    id: "div-gpt-ad-2",
  1410.    size: [728, 90]
  1411.   },
  1412.   mobileLeaderboard: {
  1413.    size: [320, 50]
  1414.   }
  1415.  }).config(["DOUBLE_CLICK_UNITS", "DoubleClickProvider", function(e, t) {
  1416.   var o = "/108596585/Habbo_WEB_IAB";
  1417.   t.defineSlot(o, [e.inlineRectangle.size], e.inlineRectangle.id).defineSlot(o, [e.leaderboard.size, e.mobileLeaderboard.size], e.leaderboard.id), t.defineSizeMapping(e.leaderboard.id).addSize([768, 0], e.leaderboard.size).addSize([0, 0], e.mobileLeaderboard.size)
  1418.  }]).component("habboAdDoubleClick", {
  1419.   bindings: {
  1420.    unit: "@"
  1421.   },
  1422.   controller: ["$scope", "$timeout", "$window", "DOUBLE_CLICK_UNITS", "DoubleClick", function(e, t, o, r, a) {
  1423.    function n() {
  1424.     var e = o.innerWidth;
  1425.     e !== c && (a.refreshAds(l.id), c = e)
  1426.    }
  1427.  
  1428.    function i() {
  1429.     s = t(function() {
  1430.      a.refreshAds(l.id)
  1431.     })
  1432.    }
  1433.    var s, l = this,
  1434.     c = o.innerWidth;
  1435.    l.id = r[l.unit].id, angular.element(o).on("orientationchange resize", n), e.$on("$stateChangeSuccess", i), e.$on("$destroy", function() {
  1436.     t.cancel(s), angular.element(o).off("orientationchange resize", n)
  1437.    })
  1438.   }],
  1439.   controllerAs: "AdDoubleClickController",
  1440.   templateUrl: "common/ad-unit/ad-double-click/ad-double-click.html"
  1441.  }), angular.module("voucher.redeem.service", ["config", "google.analytics"]).factory("voucherRedeem", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  1442.   return function(r) {
  1443.    return e.post(t.shopUrl + "/voucher/redeem", {
  1444.     voucherCode: r
  1445.    }).then(function(e) {
  1446.     return o.trackEvent("Voucher", "Redeemed"), e
  1447.    })
  1448.   }
  1449.  }]), angular.module("voucher.redeem", ["events", "form", "locale", "notifier", "purse.service", "templates", "voucher.icon", "voucher.redeem.service"]).component("habboVoucherRedeem", {
  1450.   controller: ["$compile", "$scope", "$timeout", "$translate", "EVENTS", "notifier", "purse", "voucherRedeem", function(e, t, o, r, a, n, i, s) {
  1451.    function l() {
  1452.     t.voucherRedeemForm.$setPristine(), d.voucherCode = ""
  1453.    }
  1454.  
  1455.    function c(e) {
  1456.     return r("VOUCHER_REDEEM_NOTIFICATION_AWARDED").then(function(r) {
  1457.      var a = t.$new();
  1458.      a.credits = e.data.credits, a.product = e.data.product, a.credits && o(function() {
  1459.       var e = u(a, '<habbo-voucher-icon credits="credits"></habbo-voucher-icon>');
  1460.       n.success(r + " " + e)
  1461.      }), a.product && o(function() {
  1462.       var e = u(a, '<habbo-voucher-icon product="product"></habbo-voucher-icon>');
  1463.       n.success(r + " " + e)
  1464.      })
  1465.     })
  1466.    }
  1467.  
  1468.    function u(t, o) {
  1469.     var r = e(angular.element("<div>" + o + "</div>"))(t);
  1470.     return t.$digest(), r.html()
  1471.    }
  1472.    var d = this;
  1473.    d.redeemInProgress = !1, d.redeem = function() {
  1474.     t.voucherRedeemForm.$valid && (d.redeemInProgress = !0, s(d.voucherCode).then(function(e) {
  1475.      return l(), i.update(), c(e)
  1476.     })["catch"](function(e) {
  1477.      var o = e.data && e.data.error;
  1478.      "purse.redeem.code.dont_exist" === o ? t.$broadcast("remote-data-invalid", "nonexistent") : "purse.redeem.code.already_redeemed" === o ? t.$broadcast("remote-data-invalid", "redeemed") : t.$broadcast("remote-data-invalid", "failed")
  1479.     })["finally"](function() {
  1480.      d.redeemInProgress = !1
  1481.     }))
  1482.    }, t.$on(a.accordionClose, l), t.$watchGroup(["voucherRedeemForm.$invalid", "voucherRedeemForm.$pristine", "voucherRedeemForm.$submitted"], function() {
  1483.     t.$emit(a.accordionUpdate)
  1484.    })
  1485.   }],
  1486.   controllerAs: "VoucherRedeemController",
  1487.   templateUrl: "shop/voucher-redeem/voucher-redeem.html"
  1488.  }), angular.module("transactions", ["locale", "router", "shop.purse", "shop.service", "shop.transactions.list", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  1489.   e.statePrivate("shop.transactions", {
  1490.    url: "/history",
  1491.    data: {
  1492.     title: "HEAD_TITLE_SHOP_HISTORY"
  1493.    },
  1494.    controller: "TransactionsController",
  1495.    controllerAs: "TransactionsController",
  1496.    resolve: {
  1497.     transactions: ["Shop", function(e) {
  1498.      return e.history().$promise
  1499.     }]
  1500.    },
  1501.    parent: "shop",
  1502.    templateUrl: "shop/transactions/transactions.html"
  1503.   })
  1504.  }]).controller("TransactionsController", ["transactions", function(e) {
  1505.   var t = this;
  1506.   t.items = e
  1507.  }]), angular.module("shop.transactions.list", ["empty.results", "locale", "shop.transactions.history", "templates"]).component("habboTransactionsList", {
  1508.   bindings: {
  1509.    transactions: "<"
  1510.   },
  1511.   controller: function() {
  1512.    var e = this;
  1513.    e.transactionLimit = 10, e.showAll = function() {
  1514.     e.transactionLimit = 1 / 0, e.hideShowAll = !0
  1515.    }
  1516.   },
  1517.   controllerAs: "TransactionsListController",
  1518.   templateUrl: "shop/transactions/transactions-list.html"
  1519.  }), angular.module("subscriptions", ["events", "locale", "router", "shop.countries", "shop.purse", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  1520.   e.statePrivate("shop.subscriptions", {
  1521.    url: "/subscriptions",
  1522.    parent: "shop",
  1523.    data: {
  1524.     title: "HEAD_TITLE_SHOP_SUBSCRIPTIONS"
  1525.    },
  1526.    templateUrl: "shop/subscriptions/subscriptions.html"
  1527.   })
  1528.  }]), angular.module("store", ["category.filter", "events", "locale", "router", "shop.countries", "shop.inventory", "shop.purse", "shop.service", "shop.targeted.offer", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  1529.   e.statePublic("shop.store", {
  1530.    url: "?category",
  1531.    controller: "StoreController",
  1532.    controllerAs: "StoreController",
  1533.    data: {
  1534.     title: "HEAD_TITLE_SHOP"
  1535.    },
  1536.    resolve: {
  1537.     countries: ["Shop", function(e) {
  1538.      return e.countries().$promise
  1539.     }],
  1540.     inventory: ["countryCode", "Shop", function(e, t) {
  1541.      return t.inventory({
  1542.       countryCode: e
  1543.      }).$promise
  1544.     }]
  1545.    },
  1546.    parent: "shop",
  1547.    templateUrl: "shop/store/store.html"
  1548.   })
  1549.  }]).controller("StoreController", ["$interval", "$location", "$scope", "$state", "$stateParams", "EVENTS", "countries", "inventory", "scrolltop", function(e, t, o, r, a, n, i, s, l) {
  1550.   var c, u = this;
  1551.   u.countries = i, u.offer = s.offer, u.inventory = s, u.selectedCategory = a.category, u.offer && (c = e(function() {
  1552.    moment(u.offer.expirationDate).isBefore() && (u.offer = null, e.cancel(c))
  1553.   }, 1e3)), o.$on("$stateChangeStart", function(e, t) {
  1554.    l.setEnabled("shop.store" !== t.name)
  1555.   }), o.$on(n.securityLogin, function() {
  1556.    "/shop" === t.path() && r.reload()
  1557.   })
  1558.  }]), angular.module("shop.footer", ["locale", "templates", "zendesk.url"]).component("habboShopFooter", {
  1559.   templateUrl: "shop/shop-footer/shop-footer.html"
  1560.  }), angular.module("shop.countries", ["locale", "templates"]).component("habboShopCountries", {
  1561.   bindings: {
  1562.    country: "<",
  1563.    countries: "<"
  1564.   },
  1565.   controller: ["$scope", "$location", function(e, t) {
  1566.    e.$watch("ShopCountriesController.country", function(e, o) {
  1567.     var r = e && e.countryCode || null,
  1568.      a = o && o.countryCode || null;
  1569.     r && r !== a && t.search({
  1570.      country: r
  1571.     })
  1572.    })
  1573.   }],
  1574.   controllerAs: "ShopCountriesController",
  1575.   templateUrl: "shop/shop-countries/shop-countries.html"
  1576.  }), angular.module("purse.service", ["ngResource", "config"]).factory("purse", ["$resource", "CONFIG", function(e, t) {
  1577.   var o = {},
  1578.    r = {
  1579.     creditBalance: "...",
  1580.     diamondBalance: "...",
  1581.     habboClubDays: "...",
  1582.     buildersClubDays: "..."
  1583.    },
  1584.    a = e(t.shopUrl + "/purse");
  1585.   return o.get = function() {
  1586.    return r
  1587.   }, o.update = function() {
  1588.    a.get().$promise.then(function(e) {
  1589.     r = e
  1590.    })
  1591.   }, o
  1592.  }]), angular.module("shop.purse", ["config", "locale", "purse.service", "templates"]).component("habboPurse", {
  1593.   controller: ["$scope", "purse", function(e, t) {
  1594.    var o = this;
  1595.    t.update(), e.$watch(t.get, function(e) {
  1596.     o.purse = e
  1597.    })
  1598.   }],
  1599.   controllerAs: "PurseController",
  1600.   templateUrl: "shop/purse/purse.html"
  1601.  }), angular.module("product.icon", []).component("habboProductIcon", {
  1602.   bindings: {
  1603.    iconId: "@"
  1604.   },
  1605.   controllerAs: "ProductIconController",
  1606.   template: '<div ng-class="\'product-icon--\' + ProductIconController.iconId" class="product-icon"></div>'
  1607.  }), angular.module("prepaid", ["compile", "locale", "router", "shop.purse", "shop.service", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  1608.   e.statePublic("shop.prepaid", {
  1609.    url: "/prepaid",
  1610.    controller: "PrepaidController",
  1611.    controllerAs: "PrepaidController",
  1612.    data: {
  1613.     title: "HEAD_TITLE_SHOP_PREPAID"
  1614.    },
  1615.    resolve: {
  1616.     countries: ["Shop", function(e) {
  1617.      return e.countries().$promise
  1618.     }],
  1619.     country: ["countries", "countryCode", function(e, t) {
  1620.      return _(e).find({
  1621.       countryCode: t
  1622.      }) || _(e).find({
  1623.       countryCode: "all"
  1624.      }) || e[0]
  1625.     }],
  1626.     page: ["country", "webPages", function(e, t) {
  1627.      return t.get("store/prepaid/prepaid_" + e.countryCode)
  1628.     }]
  1629.    },
  1630.    parent: "shop",
  1631.    templateUrl: "shop/prepaid/prepaid.html"
  1632.   })
  1633.  }]).controller("PrepaidController", ["countries", "country", "page", function(e, t, o) {
  1634.   var r = this;
  1635.   r.countries = e, r.country = t, r.page = o
  1636.  }]), angular.module("earn.credits", ["earn.credits.frame", "earn.credits.service", "locale", "router", "shop.purse", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  1637.   e.statePrivate("shop.earnCredits", {
  1638.    url: "/earn-credits",
  1639.    controller: "EarnCreditsController",
  1640.    controllerAs: "EarnCreditsController",
  1641.    data: {
  1642.     title: "HEAD_TITLE_SHOP_EARN_CREDITS"
  1643.    },
  1644.    parent: "shop",
  1645.    resolve: {
  1646.     offerWallUrl: ["OfferWallUrl", function(e) {
  1647.      return e.get().$promise
  1648.     }]
  1649.    },
  1650.    templateUrl: "shop/earn-credits/earn-credits.html"
  1651.   })
  1652.  }]).controller("EarnCreditsController", ["offerWallUrl", function(e) {
  1653.   var t = this;
  1654.   t.offerWallUrl = e
  1655.  }]), angular.module("earn.credits.service", ["ngResource", "config"]).factory("OfferWallUrl", ["$resource", "CONFIG", function(e, t) {
  1656.   return e(t.shopUrl + "/offerwall/url")
  1657.  }]), angular.module("credit.title", ["locale", "templates"]).component("habboCreditTitle", {
  1658.   bindings: {
  1659.    amount: "@",
  1660.    doubleCredits: "@"
  1661.   },
  1662.   controller: function() {
  1663.    var e = this;
  1664.    e.isDouble = "true" === e.doubleCredits
  1665.   },
  1666.   controllerAs: "CreditTitleController",
  1667.   templateUrl: "shop/credit-title/credit-title.html"
  1668.  }), angular.module("credit.icon", ["templates"]).component("habboCreditIcon", {
  1669.   bindings: {
  1670.    amount: "@",
  1671.    doubleCredits: "@"
  1672.   },
  1673.   controller: function() {
  1674.    var e = [0, 30, 50, 80, 100, 250, 1e3],
  1675.     t = this;
  1676.    t.isDouble = "true" === t.doubleCredits, t.getIndex = function(t) {
  1677.     var o = _.curry(function(e, t) {
  1678.      return t > e
  1679.     });
  1680.     return _.findIndex(e, o(parseInt(t, 10)))
  1681.    }
  1682.   },
  1683.   controllerAs: "CreditIconController",
  1684.   templateUrl: "shop/credit-icon/credit-icon.html"
  1685.  }), angular.module("credit.card", ["credit-cards", "credit.card.icon", "events", "form", "locale", "notifier", "purse.service", "templates"]).component("habboCreditCardForm", {
  1686.   bindings: {
  1687.    onSubmit: "&",
  1688.    card: "="
  1689.   },
  1690.   controller: ["$compile", "$rootScope", "$scope", "$timeout", "$translate", "EVENTS", function(e, t, o, r, a, n) {
  1691.    var i = this;
  1692.    i.paymentInProgress = !1, i.markActiveAndSubmit = function(e) {
  1693.     i.paymentInProgress = !0, i.onSubmit(e).then(function() {
  1694.      i.paymentInProgress = !1
  1695.     })
  1696.    }, o.$watch(function() {
  1697.     return _.size(o.creditCardForm.$error)
  1698.    }, function() {
  1699.     t.$broadcast(n.accordionResize)
  1700.    })
  1701.   }],
  1702.   controllerAs: "CreditCardController",
  1703.   templateUrl: "shop/credit-card-form/credit-card-form.html"
  1704.  }), angular.module("privacy.settings", ["locale", "privacy.settings.form", "privacy.settings.service", "router", "templates"]).config(["$stateProvider", function(e) {
  1705.   e.statePrivate("settings.privacy", {
  1706.    url: "/privacy",
  1707.    controller: "PrivacySettingsController",
  1708.    controllerAs: "PrivacySettingsController",
  1709.    parent: "settings",
  1710.    data: {
  1711.     title: "HEAD_TITLE_PRIVACY_SETTINGS"
  1712.    },
  1713.    resolve: {
  1714.     privacySettings: ["PrivacySettings", function(e) {
  1715.      return e.query().$promise
  1716.     }]
  1717.    },
  1718.    templateUrl: "settings/privacy-settings/privacy-settings.html"
  1719.   })
  1720.  }]).controller("PrivacySettingsController", ["privacySettings", function(e) {
  1721.   var t = this;
  1722.   t.privacySettings = e
  1723.  }]), angular.module("privacy.settings.form", ["google.analytics", "locale", "notifier", "privacy.settings.service", "templates"]).component("habboPrivacySettingsForm", {
  1724.   bindings: {
  1725.    privacySettings: "<"
  1726.   },
  1727.   controller: ["$scope", "googleAnalytics", "notifier", function(e, t, o) {
  1728.    var r = this;
  1729.    r.save = function() {
  1730.     e.privacySettingsForm.$pristine ? o.success("SETTINGS_SAVED_OK") : (r.sendInProgress = !0, r.privacySettings.$save().then(function() {
  1731.      t.trackEvent("Privacy settings", "Saved"), o.success("SETTINGS_SAVED_OK"), e.privacySettingsForm.$setPristine()
  1732.     })["catch"](function() {
  1733.      o.error("ERROR_SERVER")
  1734.     })["finally"](function() {
  1735.      r.sendInProgress = !1
  1736.     }))
  1737.    }
  1738.   }],
  1739.   controllerAs: "PrivacySettingsFormController",
  1740.   templateUrl: "settings/privacy-settings/privacy-settings-form.html"
  1741.  }), angular.module("privacy.settings.service", ["ngResource", "config"]).factory("PrivacySettings", ["$resource", "CONFIG", function(e, t) {
  1742.   return e(t.apiUrl + "/user/preferences", {}, {
  1743.    query: {
  1744.     method: "GET",
  1745.     isArray: !1
  1746.    },
  1747.    save: {
  1748.     method: "POST",
  1749.     url: t.apiUrl + "/user/preferences/save"
  1750.    }
  1751.   })
  1752.  }]), angular.module("password.change", ["locale", "password.change.form", "router", "templates"]).config(["$stateProvider", function(e) {
  1753.   e.stateHabboAccountTrusted("settings.password", {
  1754.    url: "/password",
  1755.    parent: "settings",
  1756.    data: {
  1757.     title: "HEAD_TITLE_PASSWORD_CHANGE"
  1758.    },
  1759.    templateUrl: "settings/password-change/password-change.html"
  1760.   })
  1761.  }]), angular.module("password.change.form", ["form", "locale", "notifier", "security", "settings.service", "templates"]).component("habboPasswordChangeForm", {
  1762.   controller: ["$scope", "Session", "notifier", "settings", function(e, t, o, r) {
  1763.    function a() {
  1764.     e.changePasswordForm.$setPristine(), n.passwords = {}
  1765.    }
  1766.    var n = this;
  1767.    n.user = t.user, n.updateInProgress = !1, n.update = function() {
  1768.     e.changePasswordForm.$valid && (n.updateInProgress = !0, r.changePassword(n.passwords).then(function() {
  1769.      a(), o.success("PASSWORD_CHANGE_SUCCESS")
  1770.     })["catch"](function(t) {
  1771.      if (409 === t.status) {
  1772.       var r = t.data && t.data.error;
  1773.       "password.used_earlier" === r ? e.$broadcast("remote-data-invalid", "passwordUsed") : "password.too_similar_to_username" === r ? e.$broadcast("remote-data-invalid", "passwordName") : "password.too_similar_to_email" === r ? e.$broadcast("remote-data-invalid", "passwordEmail") : e.$broadcast("remote-data-invalid", "password")
  1774.      } else 403 !== t.status && o.error("ERROR_SERVER")
  1775.     })["finally"](function() {
  1776.      n.updateInProgress = !1
  1777.     }))
  1778.    }
  1779.   }],
  1780.   controllerAs: "PasswordChangeFormController",
  1781.   templateUrl: "settings/password-change/password-change-form.html"
  1782.  }), angular.module("email.change", ["activation.status", "email.change.form", "locale", "router", "templates"]).config(["$stateProvider", function(e) {
  1783.   e.stateHabboAccountTrusted("settings.email", {
  1784.    url: "/email",
  1785.    parent: "settings",
  1786.    data: {
  1787.     title: "HEAD_TITLE_EMAIL_CHANGE"
  1788.    },
  1789.    templateUrl: "settings/email-change/email-change.html"
  1790.   })
  1791.  }]), angular.module("email.change.form", ["form", "locale", "notifier", "security", "settings.service", "templates"]).component("habboEmailChangeForm", {
  1792.   controller: ["$scope", "Session", "notifier", "settings", function(e, t, o, r) {
  1793.    function a() {
  1794.     e.emailChangeForm.$setPristine(), n.emailChangeData = {}
  1795.    }
  1796.    var n = this;
  1797.    n.user = t.user, n.updateInProgress = !1, n.update = function() {
  1798.     e.emailChangeForm.$valid && (n.updateInProgress = !0, r.changeEmail(n.emailChangeData).then(function() {
  1799.      a(), o.success("EMAIL_CHANGE_SUCCESS")
  1800.     })["catch"](function(t) {
  1801.      var r = t.data && t.data.error;
  1802.      "registration_email" === r || "changeEmail.invalid_email" === r ? e.$broadcast("remote-data-invalid", "emailInvalid") : "changeEmail.email_already_in_use" === r ? e.$broadcast("remote-data-invalid", "emailUsedInChange") : "changeEmail.invalid_password" === r ? e.$broadcast("remote-data-invalid", "password") : 403 !== t.status && o.error("ERROR_SERVER")
  1803.     })["finally"](function() {
  1804.      n.updateInProgress = !1
  1805.     }))
  1806.    }
  1807.   }],
  1808.   controllerAs: "EmailChangeFormController",
  1809.   templateUrl: "settings/email-change/email-change-form.html"
  1810.  }), angular.module("avatar.service", ["config", "google.analytics", "security"]).factory("avatar", ["$http", "$q", "CONFIG", "Session", "googleAnalytics", function(e, t, o, r, a) {
  1811.   var n = {};
  1812.   return n.query = function() {
  1813.    return e.get(o.apiUrl + "/user/avatars").then(function(e) {
  1814.     return e.data
  1815.    })
  1816.   }, n.create = function(t) {
  1817.    return e.post(o.apiUrl + "/user/avatars", {
  1818.     name: t
  1819.    }).then(function(e) {
  1820.     return a.trackEvent("Avatar", "Created"), r.update(e.data), e.data
  1821.    })
  1822.   }, n.isNameAvailable = function(r) {
  1823.    return e.get(o.apiUrl + "/user/avatars/check-name?name=" + r).then(function(e) {
  1824.     return e.data.isAvailable ? t.when() : t.reject()
  1825.    })
  1826.   }, n.select = function(t) {
  1827.    return e.post(o.apiUrl + "/user/avatars/select", t).then(function(e) {
  1828.     return a.trackEvent("Avatar", "Changed"), r.update(e.data), e.data
  1829.    })
  1830.   }, n
  1831.  }]), angular.module("avatar.selection", ["avatar.create", "avatar.search", "avatar.service", "locale", "router", "security", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  1832.   e.statePrivate("settings.avatar", {
  1833.    url: "/avatars",
  1834.    parent: "settings",
  1835.    controller: "AvatarSelectionController",
  1836.    controllerAs: "AvatarSelectionController",
  1837.    data: {
  1838.     title: "HEAD_TITLE_AVATAR_SELECTION"
  1839.    },
  1840.    resolve: {
  1841.     avatars: ["avatar", function(e) {
  1842.      return e.query()
  1843.     }]
  1844.    },
  1845.    templateUrl: "settings/avatar-selection/avatar-selection.html"
  1846.   }), t.when("/avatars", "/settings/avatars")
  1847.  }]).controller("AvatarSelectionController", ["avatars", function(e) {
  1848.   var t = this;
  1849.   t.avatars = e
  1850.  }]), angular.module("trusted.locations.reset", ["account.security.service", "locale", "notifier", "templates"]).component("habboTrustedLocationsReset", {
  1851.   controller: ["$translate", "$window", "accountSecurity", "notifier", function(e, t, o, r) {
  1852.    function a() {
  1853.     o.reset().then(function() {
  1854.      r.success("ACCOUNT_SECURITY_TRUSTED_LOGINS_RESET_OK")
  1855.     })["catch"](function(e) {
  1856.      403 !== e.status && r.error("ERROR_SERVER")
  1857.     })["finally"](function() {
  1858.      n.inProgress = !1
  1859.     })
  1860.    }
  1861.    var n = this;
  1862.    n.reset = function() {
  1863.     n.inProgress = !0, e("ACCOUNT_SECURITY_RESET_LOCATIONS_CONFIRMATION").then(function(e) {
  1864.      t.confirm(e) ? a() : n.inProgress = !1
  1865.     })
  1866.    }
  1867.   }],
  1868.   controllerAs: "TrustedLocationsResetController",
  1869.   templateUrl: "settings/account-security/trusted-locations-reset.html"
  1870.  }), angular.module("account.security.service", ["config", "google.analytics"]).factory("accountSecurity", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  1871.   var r = {};
  1872.   return r.status = function() {
  1873.    return e.get(t.apiUrl + "/safetylock/featureStatus").then(function(e) {
  1874.     return e.data
  1875.    })
  1876.   }, r.save = function(r, a, n, i, s) {
  1877.    return e.post(t.apiUrl + "/safetylock/save", {
  1878.     questionId1: r,
  1879.     answer1: a,
  1880.     questionId2: n,
  1881.     answer2: i,
  1882.     password: s
  1883.    }).then(function() {
  1884.     o.trackEvent("Safety lock", "Questions saved")
  1885.    })
  1886.   }, r.disable = function() {
  1887.    return e.get(t.apiUrl + "/safetylock/disable").then(function() {
  1888.     o.trackEvent("Safety lock", "Disabled")
  1889.    })
  1890.   }, r.reset = function() {
  1891.    return e.get(t.apiUrl + "/safetylock/resetTrustedLogins").then(function() {
  1892.     o.trackEvent("Safety lock", "Trusted locations reset")
  1893.    })
  1894.   }, r
  1895.  }]), angular.module("account.security", ["account.security.edit", "account.security.service", "locale", "router", "templates", "trusted.locations.reset"]).config(["$stateProvider", function(e) {
  1896.   e.stateHabboAccountTrusted("settings.security", {
  1897.    url: "/security",
  1898.    controller: "AccountSecurityController",
  1899.    controllerAs: "AccountSecurityController",
  1900.    parent: "settings",
  1901.    data: {
  1902.     title: "HEAD_TITLE_ACCOUNT_SECURITY"
  1903.    },
  1904.    resolve: {
  1905.     accountSecurityStatus: ["accountSecurity", function(e) {
  1906.      return e.status()
  1907.     }]
  1908.    },
  1909.    templateUrl: "settings/account-security/account-security.html"
  1910.   })
  1911.  }]).controller("AccountSecurityController", ["accountSecurityStatus", function(e) {
  1912.   var t = this;
  1913.   t.accountSecurityStatus = e
  1914.  }]), angular.module("account.security.edit", ["account.security.service", "locale", "message.container", "notifier", "safety.questions.modal", "templates"]).component("habboAccountSecurityEdit", {
  1915.   bindings: {
  1916.    accountSecurityStatus: "="
  1917.   },
  1918.   controller: ["$translate", "$window", "accountSecurity", "notifier", "safetyQuestionsModal", function(e, t, o, r, a) {
  1919.    function n() {
  1920.     o.disable().then(function() {
  1921.      i.accountSecurityStatus = "disabled", r.success("ACCOUNT_SECURITY_DISABLED_OK")
  1922.     })["catch"](function(e) {
  1923.      403 !== e.status && r.error("ERROR_SERVER")
  1924.     })["finally"](function() {
  1925.      i.disableInProgress = !1
  1926.     })
  1927.    }
  1928.    var i = this;
  1929.    i.modal = a, i.openModal = function() {
  1930.     a.open().then(function() {
  1931.      i.accountSecurityStatus = "enabled"
  1932.     })
  1933.    }, i.disable = function() {
  1934.     i.disableInProgress = !0, e("ACCOUNT_SECURITY_DISABLE_CONFIRMATION").then(function(e) {
  1935.      t.confirm(e) ? n() : i.disableInProgress = !1
  1936.     })
  1937.    }
  1938.   }],
  1939.   controllerAs: "AccountSecurityEditController",
  1940.   templateUrl: "settings/account-security/account-security-edit.html"
  1941.  }), angular.module("security.require.session", ["security.session"]).directive("habboRequireSession", ["Session", "ngIfDirective", function(e, t) {
  1942.   var o = t[0];
  1943.   return {
  1944.    restrict: "A",
  1945.    priority: o.priority,
  1946.    terminal: o.terminal,
  1947.    transclude: o.transclude,
  1948.    link: function(t, r, a) {
  1949.     a.ngIf = function() {
  1950.      return e.hasSession()
  1951.     }, o.link.apply(o, arguments)
  1952.    }
  1953.   }
  1954.  }]).directive("habboRequireNoSession", ["Session", "ngIfDirective", function(e, t) {
  1955.   var o = t[0];
  1956.   return {
  1957.    restrict: "A",
  1958.    priority: o.priority,
  1959.    terminal: o.terminal,
  1960.    transclude: o.transclude,
  1961.    link: function(t, r, a) {
  1962.     a.ngIf = function() {
  1963.      return !e.hasSession()
  1964.     }, o.link.apply(o, arguments)
  1965.    }
  1966.   }
  1967.  }]), angular.module("security.require.non.staff.account.session", ["security.session"]).directive("habboRequireNonStaffAccountSession", ["Session", "ngIfDirective", function(e, t) {
  1968.   var o = t[0];
  1969.   return {
  1970.    restrict: "A",
  1971.    priority: o.priority,
  1972.    terminal: o.terminal,
  1973.    transclude: o.transclude,
  1974.    link: function(t, r, a) {
  1975.     a.ngIf = function() {
  1976.      return !e.isStaff()
  1977.     }, o.link.apply(o, arguments)
  1978.    }
  1979.   }
  1980.  }]), angular.module("security.require.habbo.account.session", ["security.session"]).directive("habboRequireHabboAccountSession", ["Session", "ngIfDirective", function(e, t) {
  1981.   var o = t[0];
  1982.   return {
  1983.    restrict: "A",
  1984.    priority: o.priority,
  1985.    terminal: o.terminal,
  1986.    transclude: o.transclude,
  1987.    link: function(t, r, a) {
  1988.     a.ngIf = function() {
  1989.      return e.isHabboAccountSession()
  1990.     }, o.link.apply(o, arguments)
  1991.    }
  1992.   }
  1993.  }]), angular.module("security.session", ["security.require.habbo.account.session", "security.require.non.staff.account.session", "security.require.session", "security.session.service"]), angular.module("security.session.store", []).factory("SessionStore", ["$window", function(e) {
  1994.   var t = {};
  1995.   return t.create = function(t) {
  1996.    try {
  1997.     e.sessionStorage.setItem("session", angular.toJson(t))
  1998.    } catch (o) {
  1999.     Bugsnag.notifyException(o, "SessionStorage not supported", {
  2000.      groupingHash: "SessionStorage"
  2001.     }, "info")
  2002.    }
  2003.   }, t.get = function() {
  2004.    try {
  2005.     var t = e.sessionStorage.getItem("session");
  2006.     return t ? angular.fromJson(t) : null
  2007.    } catch (o) {
  2008.     return Bugsnag.notifyException(o, "SessionStorage not supported", {
  2009.      groupingHash: "SessionStorage"
  2010.     }, "info"), null
  2011.    }
  2012.   }, t.destroy = function() {
  2013.    try {
  2014.     e.sessionStorage.removeItem("session")
  2015.    } catch (t) {
  2016.     Bugsnag.notifyException(t, "SessionStorage not supported", {
  2017.      groupingHash: "SessionStorage"
  2018.     }, "info")
  2019.    }
  2020.   }, t
  2021.  }]), angular.module("security.session.service", ["config", "events", "security.bugsnag.session", "security.ga.session", "security.session.store"]).factory("Session", ["$rootScope", "BugsnagSession", "CONFIG", "EVENTS", "GaSession", "SessionStore", function(e, t, o, r, a, n) {
  2022.   var i = {};
  2023.   return i.user = null, i.init = function(e) {
  2024.    return e = e || n.get(), e ? i.create(e) : void 0
  2025.   }, i.create = function(o) {
  2026.    return i.user = o, t.create(i.user), a.create(i.user), n.create(i.user), e.$broadcast(r.securityLogin), i.user
  2027.   }, i.update = function(e) {
  2028.    return angular.extend(i.user, e), t.create(i.user), a.create(i.user), n.create(i.user), i.user
  2029.   }, i.hasSession = function() {
  2030.    return Boolean(i.user)
  2031.   }, i.isTrusted = function() {
  2032.    return i.hasSession() && Boolean(i.user.trusted)
  2033.   }, i.isHabboAccountSession = function() {
  2034.    return i.hasSession() && "fblogin" !== i.user.email && "rpxlogin" !== i.user.email
  2035.   }, i.hasAds = function() {
  2036.    return !i.hasSession() || !(i.user.buildersClubMember || i.user.habboClubMember)
  2037.   }, i.hasPreRollAd = function() {
  2038.    return i.hasSession() && !(i.user.buildersClubMember || i.user.habboClubMember) && !_.includes(i.user.traits, "NEW_USER") && !_.includes(i.user.traits, "STAFF") && !i.isTestUser()
  2039.   }, i.isTestUser = function() {
  2040.    return "hhs1" === o.hotel && i.hasSession() && i.user.email && (_(i.user.email).includes("@dev.habbo.fi") || _(i.user.email).includes("@test.habbo.fi"))
  2041.   }, i.isCurrentUser = function(e) {
  2042.    return i.hasSession() && i.user.uniqueId === e
  2043.   }, i.destroy = function() {
  2044.    n.destroy()
  2045.   }, i.isStaff = function() {
  2046.    return i.hasSession() && _.includes(i.user.traits, "STAFF")
  2047.   }, i
  2048.  }]), angular.module("security.ga.session", ["angular-md5"]).factory("GaSession", ["$window", "md5", function(e, t) {
  2049.   var o = {};
  2050.   return o.create = function(o) {
  2051.    try {
  2052.     e.ga("set", "userId", t.createHash(o.identityId.toString()))
  2053.    } catch (r) {
  2054.     Bugsnag.notifyException(r, "GA session not created", {}, "info")
  2055.    }
  2056.   }, o
  2057.  }]), angular.module("security.bugsnag.session", ["angular-md5"]).factory("BugsnagSession", ["$window", "md5", function(e, t) {
  2058.   var o = {};
  2059.   return o.create = function(o) {
  2060.    e.Bugsnag && (e.Bugsnag.user = {
  2061.     id: t.createHash(o.identityId.toString())
  2062.    })
  2063.   }, o
  2064.  }]), angular.module("security.safety.lock.service", ["config", "google.analytics", "security"]).factory("safetyLock", ["$http", "$location", "CONFIG", "Session", "googleAnalytics", function(e, t, o, r, a) {
  2065.   var n = {};
  2066.   return n.getQuestions = function() {
  2067.    return e.get(o.apiUrl + "/safetylock/questions")
  2068.   }, n.unlock = function(n) {
  2069.    return e.post(o.apiUrl + "/safetylock/unlock", n).then(function() {
  2070.     var e = {
  2071.      trusted: !0
  2072.     };
  2073.     return r.hasSession() && r.update(e), a.trackEvent("Safety lock", "Unlocked", t.path()), e
  2074.    })
  2075.   }, n
  2076.  }]), angular.module("security.safety.lock", ["security.safety.lock.form", "security.safety.lock.service", "templates", "ui.bootstrap"]).controller("SafetyLockController", ["questions", function(e) {
  2077.   var t = this;
  2078.   t.questions = e.data
  2079.  }]).factory("safetyLockModal", ["$uibModal", "safetyLock", function(e, t) {
  2080.   var o, r = {};
  2081.   return r.open = function() {
  2082.    return o = e.open({
  2083.     controller: "SafetyLockController",
  2084.     controllerAs: "SafetyLockController",
  2085.     resolve: {
  2086.      questions: t.getQuestions
  2087.     },
  2088.     templateUrl: "security/safety-lock/safety-lock-modal.html"
  2089.    }), o.result
  2090.   }, r.isOpen = function() {
  2091.    return Boolean(o) && o.open
  2092.   }, r
  2093.  }]), angular.module("security.safety.lock.form", ["form", "locale", "notifier", "security.safety.lock.service", "templates"]).directive("habboSafetyLockForm", ["notifier", "safetyLock", function(e, t) {
  2094.   return {
  2095.    restrict: "E",
  2096.    scope: {
  2097.     questions: "=",
  2098.     onUnlock: "&",
  2099.     onCancel: "&"
  2100.    },
  2101.    templateUrl: "security/safety-lock/safety-lock-form.html",
  2102.    link: function(o) {
  2103.     o.answers = {
  2104.      trust: !1
  2105.     }, o.unlockingInProgress = !1, o.isTrustedLocationEnabled = !0, o.unlock = function() {
  2106.      o.safetyLockForm.$valid && (o.unlockingInProgress = !0, t.unlock(o.answers).then(o.onUnlock)["catch"](function(t) {
  2107.       var r = t.status;
  2108.       409 === r ? o.$broadcast("remote-data-invalid", "answer") : 429 === r ? e.error("ERROR_TOO_MANY_ATTEMPTS", {
  2109.        time: moment(t.data.nextValidRequestDate).fromNow(!0)
  2110.       }) : e.error("ERROR_SERVER")
  2111.      })["finally"](function() {
  2112.       o.unlockingInProgress = !1
  2113.      }))
  2114.     }
  2115.    }
  2116.   }
  2117.  }]), angular.module("security.safety.answering.modal", ["locale", "security.safety.answering.form", "templates", "ui.bootstrap"]).controller("SafetyAnsweringController", ["data", "questions", "targetAction", function(e, t, o) {
  2118.   var r = this;
  2119.   r.questions = t, r.data = e, r.targetAction = o
  2120.  }]).factory("safetyAnsweringModal", ["$uibModal", function(e) {
  2121.   var t = {};
  2122.   return t.open = function(t, o, r) {
  2123.    return e.open({
  2124.     controller: "SafetyAnsweringController",
  2125.     controllerAs: "SafetyAnsweringController",
  2126.     resolve: {
  2127.      questions: _.constant(t),
  2128.      data: _.constant(o),
  2129.      targetAction: _.constant(r)
  2130.     },
  2131.     templateUrl: "security/safety-lock/safety-answering-modal.html"
  2132.    }).result
  2133.   }, t
  2134.  }]), angular.module("security.safety.answering.form", ["form", "locale", "notifier", "templates"]).directive("habboSafetyAnsweringForm", ["notifier", function(e) {
  2135.   return {
  2136.    restrict: "E",
  2137.    scope: {
  2138.     data: "=",
  2139.     questions: "=",
  2140.     targetAction: "&",
  2141.     onSuccess: "&",
  2142.     onCancel: "&"
  2143.    },
  2144.    templateUrl: "security/safety-lock/safety-lock-form.html",
  2145.    link: function(t) {
  2146.     t.answers = {}, t.unlockingInProgress = !1, t.isTrustedLocationEnabled = !1, t.unlock = function() {
  2147.      t.safetyLockForm.$valid && (t.unlockingInProgress = !0, _.assign(t.data, t.answers), t.targetAction({
  2148.       data: t.data
  2149.      }).then(t.onSuccess)["catch"](function(o) {
  2150.       var r = o.status;
  2151.       409 === r ? t.$broadcast("remote-data-invalid", "answer") : 429 === r ? e.error("ERROR_TOO_MANY_ATTEMPTS", {
  2152.        time: moment(o.data.nextValidRequestDate).fromNow(!0)
  2153.       }) : e.error("ERROR_SERVER")
  2154.      })["finally"](function() {
  2155.       t.unlockingInProgress = !1
  2156.      }))
  2157.     }
  2158.    }
  2159.   }
  2160.  }]), angular.module("security.rpx.service", ["config"]).factory("rpxSecurity", ["$document", "$window", "CONFIG", function(e, t, o) {
  2161.   var r, a = {};
  2162.   return a.init = function() {
  2163.    t.janrain = {}, t.janrain.settings = {}, t.janrain.settings.language = o.rpxLocale, t.janrain.settings.tokenUrl = o.rpxTokenUrl, t.janrain.ready = !0, r = e[0].createElement("script"), r.id = "janrainAuthWidget", r.src = "https://rpxnow.com/js/lib/login.habbo.com/engage.js", e[0].body.appendChild(r)
  2164.   }, a.destroy = function() {
  2165.    r && (delete t.janrain, angular.element(r).remove(), angular.element('script[src^="https://d29usylhdk1xyu.cloudfront.net"]').remove(), angular.element("#janrainModal, #janrainModalOverlay").remove())
  2166.   }, a
  2167.  }]), angular.module("security.rpx.message", ["notifier"]).factory("rpxMessage", ["notifier", function(e) {
  2168.   var t = {},
  2169.    o = "💩",
  2170.    r = "🐳",
  2171.    a = "🙊";
  2172.   return t.show = function(t) {
  2173.    switch (t) {
  2174.     case o:
  2175.      e.error("LOGIN_RPX_REGISTRATION_DISABLED");
  2176.      break;
  2177.     case r:
  2178.      e.error("ERROR_SERVER_MAINTENANCE");
  2179.      break;
  2180.     case a:
  2181.      e.error("ERROR_SERVER")
  2182.    }
  2183.   }, t
  2184.  }]).run(["$location", "rpxMessage", function(e, t) {
  2185.   t.show(e.search().error)
  2186.  }]), angular.module("security.rpx", ["security.rpx.message", "security.rpx.service"]), angular.module("security.login.shake", []).constant("LOGIN_EVENTS", {
  2187.   invalidCredentials: "login-invalid-credentials"
  2188.  }).directive("habboShake", ["LOGIN_EVENTS", function(e) {
  2189.   return {
  2190.    restrict: "A",
  2191.    link: function(t, o) {
  2192.     t.$on(e.invalidCredentials, function() {
  2193.      var e = angular.element(".modal-dialog"),
  2194.       t = e.is(":visible") ? e : o;
  2195.      t.addClass("animated shake").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function() {
  2196.       t.removeClass("animated shake")
  2197.      })
  2198.     })
  2199.    }
  2200.   }
  2201.  }]), angular.module("security.login", ["security.login.form", "templates", "ui.bootstrap"]).factory("loginModal", ["$uibModal", function(e) {
  2202.   var t, o = {};
  2203.   return o.open = function() {
  2204.    return t = e.open({
  2205.     templateUrl: "security/login/login-modal.html"
  2206.    }), t.result
  2207.   }, o.isOpen = function() {
  2208.    return Boolean(t) && t.open
  2209.   }, o
  2210.  }]), angular.module("security.login.form", ["air.download.link", "captcha.modal", "claim.password", "form", "locale", "notifier", "recover.password.modal", "security.facebook.connect", "security.login.rpx", "security.login.shake", "security.service", "templates"]).component("habboLoginForm", {
  2211.   bindings: {
  2212.    onLogin: "&"
  2213.   },
  2214.   controller: ["$element", "$location", "$scope", "$window", "LOGIN_EVENTS", "captchaModal", "notifier", "recoverPasswordModal", "security", function(e, t, o, r, a, n, i, s, l) {
  2215.    function c() {
  2216.     n.open().then(function(e) {
  2217.      u({
  2218.       email: p.email,
  2219.       password: p.password,
  2220.       captchaToken: e
  2221.      })
  2222.     })
  2223.    }
  2224.  
  2225.    function u(e) {
  2226.     p.loginInProgress = !0, l.login(e).then(p.onLogin)["catch"](d)["finally"](function() {
  2227.      p.loginInProgress = !1
  2228.     })
  2229.    }
  2230.  
  2231.    function d(e) {
  2232.     var t = e.status,
  2233.      o = e.data && e.data.message;
  2234.     h = Boolean(e.data && e.data.captcha), 401 === t ? "login.staff_login_not_allowed" === o ? i.error("ERROR_LOGIN_STAFF_NOT_ALLOWED") : "invalid-captcha" === o ? c() : m() : 429 === t ? i.error("ERROR_TOO_MANY_ATTEMPTS", {
  2235.      time: moment(e.data.nextValidRequestDate).fromNow(!0)
  2236.     }) : "force.pending" !== t && i.error("ERROR_SERVER")
  2237.    }
  2238.  
  2239.    function m() {
  2240.     f++, f === b ? (b *= 2, s.open(p.email)) : (o.$broadcast(a.invalidCredentials), o.$broadcast("remote-data-invalid", "credentials"))
  2241.    }
  2242.    var p = this,
  2243.     h = !1,
  2244.     f = 0,
  2245.     b = 3;
  2246.    p.loginInProgress = !1, p.login = function() {
  2247.     var o = t.search().captchaToken || r.captchaToken;
  2248.     p.email = e.find("[type=email]").val(), p.password = e.find("[type=password]").val(), o ? u({
  2249.      email: p.email,
  2250.      password: p.password,
  2251.      captchaToken: o
  2252.     }) : h ? c() : u({
  2253.      email: p.email,
  2254.      password: p.password
  2255.     })
  2256.    }
  2257.   }],
  2258.   controllerAs: "LoginController",
  2259.   templateUrl: "security/login/login-form.html"
  2260.  }), angular.module("security.use.force.service", ["security.force.email.modal", "security.force.password.modal", "security.force.service", "security.force.tos.modal", "security.safety.lock"]).factory("useForce", ["$q", "FORCE", "forceEmailModal", "forcePasswordModal", "forceTOSModal", "safetyLockModal", function(e, t, o, r, a, n) {
  2261.   function i(e, t) {
  2262.    return function(o) {
  2263.     var r = o && o.force;
  2264.     return _.includes(r, e) ? t(o) : o
  2265.    }
  2266.   }
  2267.  
  2268.   function s(e) {
  2269.    return l(e).then(r.open)
  2270.   }
  2271.  
  2272.   function l(t) {
  2273.    return t.trusted ? e.when(t) : n.open().then(function(e) {
  2274.     return _.assign(t, e)
  2275.    })
  2276.   }
  2277.   var c = {};
  2278.   return c.handleForces = function(r) {
  2279.    return e.when(r).then(i(t.email, o.open)).then(i(t.password, s)).then(i(t.TOS, a.open))
  2280.   }, c
  2281.  }]), angular.module("security.force.service", ["config", "google.analytics"]).constant("FORCE", {
  2282.   email: "EMAIL",
  2283.   password: "PASSWORD",
  2284.   TOS: "TOS"
  2285.  }).factory("force", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  2286.   var r = {};
  2287.   return r.changeEmail = function(r) {
  2288.    return e.post(t.apiUrl + "/force/email-change", {
  2289.     newEmail: r
  2290.    }).then(function(e) {
  2291.     return o.trackEvent("Email", "Forced change"), e.data
  2292.    })
  2293.   }, r.changePassword = function(r) {
  2294.    return e.post(t.apiUrl + "/force/password-change", {
  2295.     newPassword: r
  2296.    }).then(function(e) {
  2297.     return o.trackEvent("Password", "Forced change"), e.data
  2298.    })
  2299.   }, r.acceptTOS = function() {
  2300.    return e.post(t.apiUrl + "/force/tos-accept").then(function(e) {
  2301.     return o.trackEvent("TOS", "Forced accept"), e.data
  2302.    })
  2303.   }, r
  2304.  }]), angular.module("security.fingerprint", ["security.fingerprint.interceptor", "security.fingerprint.service.init"]), angular.module("security.fingerprint.service", []).factory("fingerprint", function() {
  2305.   var e = {};
  2306.   return e.getFingerprint = function() {
  2307.    return e.fingerprint
  2308.   }, e.calculateFingerprint = function() {
  2309.    (new Fingerprint2).get(function(t) {
  2310.     e.fingerprint = t
  2311.    })
  2312.   }, e
  2313.  }), angular.module("security.fingerprint.service.init", ["security.fingerprint.service"]).run(["fingerprint", function(e) {
  2314.   e.calculateFingerprint()
  2315.  }]), angular.module("security.fingerprint.service.mock", []).factory("fingerprint", function() {
  2316.   var e = {};
  2317.   return e.getFingerprint = function() {
  2318.    return e.fingerprint
  2319.   }, e.calculateFingerprint = _.noop, e
  2320.  }), angular.module("security.fingerprint.interceptor", ["config", "security.fingerprint.service"]).factory("fingerprintInterceptor", ["CONFIG", "fingerprint", function(e, t) {
  2321.   var o = {};
  2322.   return o.request = function(o) {
  2323.    return t.getFingerprint() && _(o.url).includes(e.apiUrl) && (o.headers["x-habbo-fingerprint"] = t.getFingerprint()), o
  2324.   }, o
  2325.  }]).config(["$httpProvider", function(e) {
  2326.   e.interceptors.push("fingerprintInterceptor")
  2327.  }]), angular.module("spinner", ["security", "templates", "ui.bootstrap", "ui.router"]).factory("spinner", ["$rootScope", "$timeout", "$uibModal", "loginModal", "safetyLockModal", function(e, t, o, r, a) {
  2328.   function n() {
  2329.    t.cancel(c), l || (c = t(s, 200))
  2330.   }
  2331.  
  2332.   function i() {
  2333.    t.cancel(c), l && (l.close(), l = null, u = !0)
  2334.   }
  2335.  
  2336.   function s() {
  2337.    r.isOpen() || a.isOpen() || (l = o.open({
  2338.     animation: !1,
  2339.     backdrop: "static",
  2340.     backdropClass: u ? "spinner-backdrop--transparent" : "spinner-backdrop--solid",
  2341.     keyboard: !1,
  2342.     templateUrl: "router/spinner/spinner.html",
  2343.     windowClass: u ? "spinner spinner--transparent" : "spinner spinner--solid"
  2344.    }))
  2345.   }
  2346.   var l, c, u = !1,
  2347.    d = {};
  2348.   return d.init = function() {
  2349.    s(), e.$on("$stateChangeStart", n), e.$on("$stateChangeSuccess", i), e.$on("$stateChangeError", i)
  2350.   }, d
  2351.  }]), angular.module("scrolltop", ["ui.router"]).factory("scrolltop", function() {
  2352.   var e = {};
  2353.   return e.enabled = !0, e.setEnabled = function(e) {
  2354.    this.enabled = e
  2355.   }, e.isEnabled = function() {
  2356.    return this.enabled
  2357.   }, e
  2358.  }).run(["$rootScope", "$window", "scrolltop", function(e, t, o) {
  2359.   e.$on("$viewContentLoaded", function() {
  2360.    o.isEnabled() && t.scrollTo(0, 0)
  2361.   })
  2362.  }]), angular.module("prerender.status.code", []).directive("prerenderStatusCode", ["$location", function(e) {
  2363.   return {
  2364.    restrict: "A",
  2365.    link: function(t, o, r) {
  2366.     var a = e.absUrl();
  2367.     t.$on("$stateChangeStart", function(e, t) {
  2368.      t.resolve && t.resolve.auth && r.$set("content", 401)
  2369.     }), t.$on("$stateChangeSuccess", function(t, o) {
  2370.      "notFound" === o.name ? r.$set("content", 404) : r.$set("content", a === e.absUrl() ? 200 : 301)
  2371.     }), t.$on("$stateChangeError", function() {
  2372.      r.$set("content", 404)
  2373.     })
  2374.    }
  2375.   }
  2376.  }]), angular.module("prerender.ready", []).run(["$browser", "$timeout", "$window", function(e, t, o) {
  2377.   e.notifyWhenNoOutstandingRequests(function() {
  2378.    t(function() {
  2379.     o.prerenderReady = !0
  2380.    })
  2381.   })
  2382.  }]), angular.module("prerender.header", []).directive("prerenderHeader", ["$location", function(e) {
  2383.   return {
  2384.    restrict: "A",
  2385.    link: function(t, o, r) {
  2386.     var a = e.absUrl();
  2387.     t.$on("$stateChangeSuccess", function(t, o) {
  2388.      var n = e.absUrl();
  2389.      "notFound" !== o.name && a !== n && r.$set("content", "Location: " + n)
  2390.     })
  2391.    }
  2392.   }
  2393.  }]), angular.module("prerender", ["prerender.header", "prerender.ready", "prerender.status.code"]), angular.module("head.title", ["head.service"]).directive("title", ["Head", function(e) {
  2394.   return {
  2395.    restrict: "E",
  2396.    link: function(t, o) {
  2397.     function r(e) {
  2398.      o.html(e)
  2399.     }
  2400.     t.$watch(e.getFullTitle, r)
  2401.    }
  2402.   }
  2403.  }]), angular.module("head", ["head.content", "head.service", "head.title", "head.url"]), angular.module("head.url", []).directive("habboHeadUrl", ["$location", function(e) {
  2404.   return {
  2405.    restrict: "A",
  2406.    link: function(t, o, r) {
  2407.     function a() {
  2408.      return e.absUrl()
  2409.     }
  2410.  
  2411.     function n(e) {
  2412.      r.$set(r.habboHeadUrl, e)
  2413.     }
  2414.     t.$watch(a, n)
  2415.    }
  2416.   }
  2417.  }]), angular.module("head.content", ["head.service"]).constant("META_ATTRS", {
  2418.   "og:title": "title",
  2419.   "og:description": "description",
  2420.   "og:image": "image",
  2421.   "og:image:height": "imageHeight",
  2422.   "og:image:width": "imageWidth",
  2423.   "twitter:title": "title",
  2424.   "twitter:description": "description",
  2425.   "twitter:card": "twitter:card",
  2426.   "twitter:image": "image",
  2427.   name: "title",
  2428.   description: "description",
  2429.   image: "image"
  2430.  }).directive("content", ["Head", "META_ATTRS", function(e, t) {
  2431.   return {
  2432.    restrict: "A",
  2433.    link: function(o, r, a) {
  2434.     function n() {
  2435.      return e[s]
  2436.     }
  2437.  
  2438.     function i(e) {
  2439.      a.$set("content", e)
  2440.     }
  2441.     var s = t[a.name || a.property || a.itemprop];
  2442.     s && o.$watch(n, i)
  2443.    }
  2444.   }
  2445.  }]), angular.module("head.service", ["locale", "ui.router"]).constant("HEAD_DEFAULTS", {
  2446.   title: "Habbo",
  2447.   description: "Join millions in the planet's most popular virtual world for teens. Create your avatar, meet new friends, role play, and build amazing spaces.",
  2448.   image: "https://habboo-a.akamaihd.net/habbo-web/america/en/assets/images/app_summary_image-1200x628.85a9f5dc.png",
  2449.   imageHeight: 628,
  2450.   imageWidth: 1200,
  2451.   "twitter:card": "summary_large_image"
  2452.  }).factory("Head", ["$translate", "HEAD_DEFAULTS", function(e, t) {
  2453.   var o = {},
  2454.    r = " - Habbo";
  2455.   return o.setDefaults = function() {
  2456.    o.title = t.title, o.title = t.title, o.description = t.description, o.image = t.image, o.imageHeight = t.imageHeight, o.imageWidth = t.imageWidth, o["twitter:card"] = t["twitter:card"]
  2457.   }, o.set = function(e, t) {
  2458.    var r = e || {};
  2459.    r.title && o.setTitle(r.title, t), r.description && (o.description = r.description), r.image && (o.image = r.image), r.imageHeight && (o.imageHeight = r.imageHeight), r.imageWidth && (o.imageWidth = r.imageWidth), r["twitter:card"] && (o["twitter:card"] = r["twitter:card"])
  2460.   }, o.setTitle = function(t, r) {
  2461.    e(t, r).then(function(e) {
  2462.     o.title = e
  2463.    })
  2464.   }, o.getFullTitle = function() {
  2465.    return "Habbo" === o.title ? o.title : o.title + r
  2466.   }, o
  2467.  }]).run(["$rootScope", "Head", function(e, t) {
  2468.   e.$on("$stateChangeStart", function() {
  2469.    t.setDefaults()
  2470.   }), e.$on("$stateChangeSuccess", function(e, o, r) {
  2471.    t.set(o.data, r)
  2472.   })
  2473.  }]), angular.module("ban.error", ["ban.message", "ban.redirect"]), angular.module("ban.redirect", ["locale", "security"]).factory("banRedirect", ["$injector", "$q", function(e, t) {
  2474.   function o(e) {
  2475.    var t = e.status,
  2476.     o = e.data && e.data.message;
  2477.    return (403 === t || 401 === t) && r(o)
  2478.   }
  2479.  
  2480.   function r(e) {
  2481.    return _.includes(i, e)
  2482.   }
  2483.  
  2484.   function a(t) {
  2485.    var o = t.data;
  2486.    return n = n || e.get("security"), n.forceLogout("/?error=banned&" + $.param(o))
  2487.   }
  2488.   var n, i = ["login.user_banned", "login.identity_banned", "login.avatar_banned", "user.identity_banned", "user.avatar_banned"],
  2489.    s = {};
  2490.   return s.responseError = function(e) {
  2491.    return o(e) ? a(e) : t.reject(e)
  2492.   }, s
  2493.  }]).config(["$httpProvider", function(e) {
  2494.   e.interceptors.push("banRedirect")
  2495.  }]), angular.module("ban.message", ["locale", "notifier"]).factory("banMessage", ["$q", "$translate", "dateFilter", "notifier", function(e, t, o, r) {
  2496.   function a(e, t, o) {
  2497.    var r = _(e).includes("avatar_banned") ? "USER_AVATAR" : "USER_IDENTITY";
  2498.    return r += t ? "_PERMANENT_BAN_TEXT" : "_BAN_TEXT", o && (r += "_WITH_GUIDE"), r
  2499.   }
  2500.   var n = {};
  2501.   return n.show = function(n) {
  2502.    if ("banned" === n.error) {
  2503.     var i = n.sanctionReasonId ? "CFH_REASON_" + n.sanctionReasonId.toUpperCase() : "CFH_REASON_AUTO_TRIGGER",
  2504.      s = "true" === n.permanentBan ? "CFH_REASON_RESOLVED_TARGET_BAN_PERMANENT" : "CFH_REASON_RESOLVED_TARGET_BAN",
  2505.      l = "MODERATOR_MSG_POSTFIX";
  2506.     return e.all([t(s), t(i), t(l)]).then(function(e) {
  2507.      var t = e[0],
  2508.       i = e[1],
  2509.       s = e[2],
  2510.       l = -1 === t.indexOf("%") ? t : t.substring(0, t.indexOf("%")),
  2511.       c = n.reason;
  2512.      _.endsWith(n.reason, s) && -1 !== n.reason.indexOf(i) && _.startsWith(n.reason, l) || (c = i);
  2513.      var u = n.expiryTime,
  2514.       d = {
  2515.        message: n.message,
  2516.        avatarName: n.avatarName,
  2517.        reason: c,
  2518.        expiryTime: u ? o(u, "short") : u,
  2519.        permanentBan: "true" === n.permanentBan,
  2520.        provideExtraSupport: "true" === n.provideExtraSupport
  2521.       },
  2522.       m = a(d.message, d.permanentBan, d.provideExtraSupport);
  2523.      r.errorSticky("USER_BAN_TITLE", m, d)
  2524.     })
  2525.    }
  2526.   }, n
  2527.  }]).run(["$location", "banMessage", function(e, t) {
  2528.   t.show(e.search())
  2529.  }]), angular.module("room.restricted", ["locale", "templates"]).component("habboRoomRestricted", {
  2530.   bindings: {
  2531.    room: "<"
  2532.   },
  2533.   controllerAs: "RoomRestrictedController",
  2534.   templateUrl: "room/room-restricted/room-restricted.html"
  2535.  }), angular.module("room.picture", ["templates"]).component("habboRoomPicture", {
  2536.   bindings: {
  2537.    url: "@"
  2538.   },
  2539.   templateUrl: "room/room-picture/room-picture.html",
  2540.   controllerAs: "RoomPictureController"
  2541.  }), angular.module("room.open", ["avatar", "locale", "official.room.avatar", "room.info", "room.picture", "templates"]).component("habboRoomOpen", {
  2542.   bindings: {
  2543.    room: "<"
  2544.   },
  2545.   controllerAs: "RoomOpenController",
  2546.   templateUrl: "room/room-open/room-open.html",
  2547.   controller: ["$window", function(e) {
  2548.    var t = this,
  2549.     o = e.btoa(t.room.name.replace(/[^\x00-\x7F]/g, "").trim());
  2550.    t.room.hotelReportLink = "/hotel?link=navigator/report/" + t.room.uniqueId + "/" + o
  2551.   }]
  2552.  }), angular.module("room.info", ["templates"]).component("habboRoomInfo", {
  2553.   bindings: {
  2554.    description: "@",
  2555.    tags: "<"
  2556.   },
  2557.   templateUrl: "room/room-info/room-info.html",
  2558.   controllerAs: "RoomInfoController"
  2559.  }), angular.module("registration.policies", ["locale", "templates"]).component("habboPolicies", {
  2560.   require: {
  2561.    FormController: "^form"
  2562.   },
  2563.   bindings: {
  2564.    policies: "="
  2565.   },
  2566.   controllerAs: "PoliciesController",
  2567.   templateUrl: "registration/policies/policies.html"
  2568.  }), angular.module("registration.partner", ["locale", "templates"]).component("habboPartnerRegistration", {
  2569.   bindings: {
  2570.    value: "="
  2571.   },
  2572.   controller: function() {
  2573.    var e = this;
  2574.    e.value = !0
  2575.   },
  2576.   controllerAs: "PartnerRegistrationController",
  2577.   templateUrl: "registration/partner-registration/partner-registration.html"
  2578.  }), angular.module("birthdate.filters", []).filter("daysInMonth", function() {
  2579.   var e = [4, 6, 9, 11];
  2580.   return function(t, o, r) {
  2581.    return o = parseInt(o, 10), r = parseInt(r, 10), 2 === o ? moment([r]).isLeapYear() ? _(t).take(29).value() : _(t).take(28).value() : _(e).includes(o) ? _(t).take(30).value() : t
  2582.   }
  2583.  }), angular.module("birthdate", ["ngMessages", "birthdate.filters", "locale", "templates"]).component("habboBirthdate", {
  2584.   require: {
  2585.    FormController: "^form"
  2586.   },
  2587.   bindings: {
  2588.    birthdate: "="
  2589.   },
  2590.   controller: ["$scope", "daysInMonthFilter", function(e, t) {
  2591.    var o = 7,
  2592.     r = 1900,
  2593.     a = (new Date).getFullYear() - o,
  2594.     n = this;
  2595.    n.days = _.range(1, 32), n.months = [{
  2596.     value: 1,
  2597.     translationKey: "MONTH_JANUARY"
  2598.    }, {
  2599.     value: 2,
  2600.     translationKey: "MONTH_FEBRUARY"
  2601.    }, {
  2602.     value: 3,
  2603.     translationKey: "MONTH_MARCH"
  2604.    }, {
  2605.     value: 4,
  2606.     translationKey: "MONTH_APRIL"
  2607.    }, {
  2608.     value: 5,
  2609.     translationKey: "MONTH_MAY"
  2610.    }, {
  2611.     value: 6,
  2612.     translationKey: "MONTH_JUNE"
  2613.    }, {
  2614.     value: 7,
  2615.     translationKey: "MONTH_JULY"
  2616.    }, {
  2617.     value: 8,
  2618.     translationKey: "MONTH_AUGUST"
  2619.    }, {
  2620.     value: 9,
  2621.     translationKey: "MONTH_SEPTEMBER"
  2622.    }, {
  2623.     value: 10,
  2624.     translationKey: "MONTH_OCTOBER"
  2625.    }, {
  2626.     value: 11,
  2627.     translationKey: "MONTH_NOVEMBER"
  2628.    }, {
  2629.     value: 12,
  2630.     translationKey: "MONTH_DECEMBER"
  2631.    }], n.years = _.range(r, a).reverse(), e.$watchGroup(["BirthdateController.month", "BirthdateController.year"], function(e) {
  2632.     var o = parseInt(n.day, 10),
  2633.      r = e[0],
  2634.      a = e[1];
  2635.     _(t(n.days, r, a)).includes(o) || (n.day = "")
  2636.    }), e.$watchGroup(["BirthdateController.day", "BirthdateController.month", "BirthdateController.year"], function(e) {
  2637.     var t = parseInt(e[0], 10),
  2638.      o = parseInt(e[1], 10),
  2639.      r = parseInt(e[2], 10);
  2640.     _.isNaN(t) || _.isNaN(o) || _.isNaN(r) ? n.FormController.birthdate.$pristine || n.FormController.birthdate.$setViewValue(null) : n.FormController.birthdate.$setViewValue({
  2641.      day: t,
  2642.      month: o,
  2643.      year: r
  2644.     })
  2645.    })
  2646.   }],
  2647.   controllerAs: "BirthdateController",
  2648.   templateUrl: "registration/birthdate/birthdate.html"
  2649.  }), angular.module("profile.modal", ["by.name.description.or.motto.filter", "empty.results", "form", "locale", "profile.item.lists", "templates", "ui.bootstrap"]).controller("ProfileModalController", ["items", "type", function(e, t) {
  2650.   var o = this;
  2651.   o.items = e, o.type = t
  2652.  }]).component("habboProfileModal", {
  2653.   bindings: {
  2654.    items: "<",
  2655.    type: "@"
  2656.   },
  2657.   controller: ["$uibModal", function(e) {
  2658.    var t = this;
  2659.    t.openModal = function() {
  2660.     e.open({
  2661.      transclude: !0,
  2662.      templateUrl: "profile/profile-modal/profile-modal.html",
  2663.      controller: "ProfileModalController",
  2664.      controllerAs: "ProfileModalController",
  2665.      resolve: {
  2666.       items: _.constant(t.items),
  2667.       type: _.constant(t.type)
  2668.      }
  2669.     })
  2670.    }
  2671.   }],
  2672.   controllerAs: "ProfileModalComponentController",
  2673.   template: '<a ng-click="ProfileModalComponentController.openModal()" class="profile-modal__link" translate="SEE_ALL"></a>'
  2674.  }), angular.module("profile.header", ["encode.uri.component", "imager", "templates"]).component("habboProfileHeader", {
  2675.   bindings: {
  2676.    figure: "@",
  2677.    user: "@",
  2678.    motto: "@",
  2679.    profile: "@"
  2680.   },
  2681.   controller: function() {
  2682.    var e = this;
  2683.    e.isCroco = function(e) {
  2684.     return Boolean(e) && "crikey" === e.toLowerCase()
  2685.    }
  2686.   },
  2687.   controllerAs: "ProfileHeaderController",
  2688.   templateUrl: "profile/profile-header/profile-header.html",
  2689.   transclude: !0
  2690.  }), angular.module("profile.item.lists", ["badge", "by.name.description.or.motto.filter", "encode.uri.component", "flash", "group.badge", "imager", "infinite-scroll", "room.icon", "templates"]).component("habboBadgeList", {
  2691.   bindings: {
  2692.    badges: "<",
  2693.    query: "<"
  2694.   },
  2695.   controllerAs: "BadgeListController",
  2696.   templateUrl: "profile/item-lists/badges.html"
  2697.  }).component("habboFriendList", {
  2698.   bindings: {
  2699.    friends: "<",
  2700.    query: "<"
  2701.   },
  2702.   controllerAs: "FriendListController",
  2703.   templateUrl: "profile/item-lists/friends.html"
  2704.  }).component("habboRoomList", {
  2705.   bindings: {
  2706.    rooms: "<",
  2707.    query: "<"
  2708.   },
  2709.   controllerAs: "RoomListController",
  2710.   templateUrl: "profile/item-lists/rooms.html"
  2711.  }).component("habboGroupList", {
  2712.   bindings: {
  2713.    groups: "<",
  2714.    query: "<"
  2715.   },
  2716.   controllerAs: "GroupListController",
  2717.   templateUrl: "profile/item-lists/groups.html"
  2718.  }), angular.module("creation", ["creation.content", "creation.service", "header", "locale", "profile.header", "router", "social.share", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  2719.   var o = ["$q", "$stateParams", "creations", function(e, t, o) {
  2720.    var r = _.findIndex(o, {
  2721.     id: t.creationId
  2722.    });
  2723.    return r >= 0 ? r : e.reject()
  2724.   }];
  2725.   e.statePublic("photo", {
  2726.    url: "/profile/:name/photo/:creationId?pool",
  2727.    controller: "CreationController",
  2728.    controllerAs: "CreationController",
  2729.    onEnter: ["creations", "index", "Head", function(e, t, o) {
  2730.     o.setTitle("HEAD_TITLE_PHOTO", {
  2731.      name: e[t].creator_name
  2732.     }), o.image = e[t].url, o.imageHeight = e[t].contentHeight, o.imageWidth = e[t].contentWidth
  2733.    }],
  2734.    resolve: {
  2735.     creations: ["$stateParams", "Creations", function(e, t) {
  2736.      return t.photos({
  2737.       pool: e.pool,
  2738.       name: e.name
  2739.      })
  2740.     }],
  2741.     index: o
  2742.    },
  2743.    templateUrl: "profile/creation/creation.html"
  2744.   }), e.statePublic("story", {
  2745.    url: "/profile/:name/story/:creationId?pool",
  2746.    controller: "CreationController",
  2747.    controllerAs: "CreationController",
  2748.    onEnter: ["creations", "index", "Head", function(e, t, o) {
  2749.     var r = e[t];
  2750.     "SELFIE" === r.type ? o.setTitle("HEAD_TITLE_SELFIE", {
  2751.      name: r.creator_name
  2752.     }) : o.setTitle("HEAD_TITLE_CREATION", {
  2753.      creation: r.title,
  2754.      name: r.creator_name
  2755.     }), o.image = r.url, o.imageHeight = r.contentHeight, o.imageWidth = r.contentWidth
  2756.    }],
  2757.    resolve: {
  2758.     creations: ["$stateParams", "Creations", function(e, t) {
  2759.      return t.stories({
  2760.       pool: e.pool,
  2761.       name: e.name
  2762.      })
  2763.     }],
  2764.     index: o
  2765.    },
  2766.    templateUrl: "profile/creation/creation.html"
  2767.   }), t.when("/profile/:name/creation/:id", "/profile/:name/story/:id")
  2768.  }]).controller("CreationController", ["$scope", "creations", "index", "scrolltop", function(e, t, o, r) {
  2769.   var a = this;
  2770.   a.creation = t[o], a.next = t[o + 1], a.previous = t[o - 1], e.$on("$stateChangeStart", function(e, t) {
  2771.    "photo" === t.name || "story" === t.name ? r.setEnabled(!1) : r.setEnabled(!0)
  2772.   })
  2773.  }]), angular.module("creation.content", ["creation.href", "like", "locale", "navigate.to.on.key", "photo.delete", "report", "security", "templates"]).component("habboCreationContent", {
  2774.   bindings: {
  2775.    creation: "<",
  2776.    previous: "<",
  2777.    next: "<"
  2778.   },
  2779.   controller: ["Session", function(e) {
  2780.    var t = this;
  2781.    t.isDeletable = function() {
  2782.     return e.isCurrentUser(t.creation.creator_uniqueId)
  2783.    }
  2784.   }],
  2785.   controllerAs: "CreationContentController",
  2786.   templateUrl: "profile/creation/creation-content.html"
  2787.  }), angular.module("creation.service", ["photos.service", "profile.creations"]).factory("Creations", ["CreationsProfile", "Photos", function(e, t) {
  2788.   var o = {};
  2789.   return o.photos = function(o) {
  2790.    return "photos" === o.pool ? t.query().$promise : e.photosForUser(o.name)
  2791.   }, o.stories = function(t) {
  2792.    return e.storiesForUser(t.name)
  2793.   }, o
  2794.  }]), angular.module("client.messenger", []).factory("clientMessenger", function() {
  2795.   function e(e) {
  2796.    a.postMessage({
  2797.     call: "open-link",
  2798.     target: e.link
  2799.    }, "*")
  2800.   }
  2801.  
  2802.   function t(e) {
  2803.    a.postMessage({
  2804.     call: "open-room",
  2805.     target: e.room
  2806.    }, "*")
  2807.   }
  2808.  
  2809.   function o(e) {
  2810.    a.postMessage({
  2811.     call: "interstitial-status",
  2812.     target: e.interstitial
  2813.    }, "*")
  2814.   }
  2815.   var r = {},
  2816.    a = null,
  2817.    n = {
  2818.     link: e,
  2819.     room: t,
  2820.     interstitial: o
  2821.    };
  2822.   return r.init = function(e) {
  2823.    a = e
  2824.   }, r.handle = function(e) {
  2825.    var t = _(e).pickBy(_.isString).keys().head(),
  2826.     o = n[t];
  2827.    o && o(e)
  2828.   }, r
  2829.  }), angular.module("client.listener", ["client.heartbeat.ping.service", "interstitial", "notifier", "security"]).factory("clientListener", ["$location", "$rootScope", "EVENTS", "Session", "clientHeartbeatPing", "interstitial", "notifier", "security", function(e, t, o, r, a, n, i, s) {
  2830.   function l() {
  2831.    C = !0
  2832.   }
  2833.  
  2834.   function c() {
  2835.    y = moment(), (null === E || moment().diff(E, "seconds") > _) && (E = moment(), a.ping())
  2836.   }
  2837.  
  2838.   function u() {
  2839.    s.logout()["catch"](function() {
  2840.     t.$emit(o.clientClose), i.errorSticky("ERROR_LOGOUT_TITLE", "ERROR_LOGOUT_TEXT")
  2841.    })
  2842.   }
  2843.  
  2844.   function d(t) {
  2845.    e.url(t)
  2846.   }
  2847.  
  2848.   function m(e) {
  2849.    r.update({
  2850.     figureString: e
  2851.    })
  2852.   }
  2853.  
  2854.   function p(e) {
  2855.    r.update({
  2856.     name: e
  2857.    })
  2858.   }
  2859.  
  2860.   function h() {
  2861.    return moment().diff(y, "seconds") < 60
  2862.   }
  2863.  
  2864.   function f() {
  2865.    n.start("midroll")
  2866.   }
  2867.  
  2868.   function b(e) {
  2869.    r.update({
  2870.     buildersClubMember: e
  2871.    })
  2872.   }
  2873.  
  2874.   function g(e) {
  2875.    r.update({
  2876.     habboClubMember: e
  2877.    })
  2878.   }
  2879.   var _ = 300,
  2880.    v = {},
  2881.    C = !1,
  2882.    y = null,
  2883.    E = null,
  2884.    S = {
  2885.     disconnect: l,
  2886.     heartbeat: c,
  2887.     logout: u,
  2888.     "open-page": d,
  2889.     "update-figure": m,
  2890.     "update-name": p,
  2891.     "show-interstitial": f,
  2892.     "update-builders-club": b,
  2893.     "update-habbo-club": g
  2894.    };
  2895.   return v.init = function() {
  2896.    C = !1, y = null
  2897.   }, v.handle = function(e) {
  2898.    var t = S[e.call];
  2899.    t && t(e.target)
  2900.   }, v.isAlive = function() {
  2901.    return Boolean(y) && h()
  2902.   }, v.hasDied = function() {
  2903.    return Boolean(y) && !h()
  2904.   }, v.hasDisconnected = function() {
  2905.    return C
  2906.   }, v
  2907.  }]), angular.module("client.heartbeat.ping.service", ["config"]).factory("clientHeartbeatPing", ["$http", "CONFIG", function(e, t) {
  2908.   var o = {};
  2909.   return o.ping = function() {
  2910.    return e.get(t.apiUrl + "/user/ping")
  2911.   }, o
  2912.  }]), angular.module("client.communication", ["client.listener", "client.messenger", "events"]).directive("habboClientCommunication", ["$timeout", "$window", "EVENTS", "clientListener", "clientMessenger", function(e, t, o, r, a) {
  2913.   return {
  2914.    restrict: "A",
  2915.    link: function(n, i) {
  2916.     function s(t) {
  2917.      e(function() {
  2918.       r.handle(t.originalEvent.data)
  2919.      })
  2920.     }
  2921.     var l = i.get(0).contentWindow;
  2922.     a.init(l), n.$on(o.clientOpen, function(e, t) {
  2923.      var o = n.$watch(r.isAlive, function(e) {
  2924.       e && (a.handle(t), o())
  2925.      });
  2926.      r.init()
  2927.     }), angular.element(t).on("message", s), i.on("$destroy", function() {
  2928.      angular.element(t).off("message", s)
  2929.     })
  2930.    }
  2931.   }
  2932.  }]), angular.module("client", ["client.component", "client.disable.scrollbars"]), angular.module("client.disable.scrollbars", ["events"]).directive("habboClientDisableScrollbars", ["EVENTS", function(e) {
  2933.   return {
  2934.    restrict: "A",
  2935.    link: function(t, o) {
  2936.     t.$on(e.clientOpen, function() {
  2937.      o.css("overflow", "hidden")
  2938.     }), t.$on(e.clientClose, function() {
  2939.      o.css("overflow", "")
  2940.     })
  2941.    }
  2942.   }
  2943.  }]), angular.module("client.component", ["angularScreenfull", "client.close.expander", "client.close.fullscreen.on.hide", "client.closed", "client.communication", "client.error", "client.reload", "client.service", "events", "flash", "interstitial", "locale", "notifier", "router", "security", "storage", "system.data", "templates"]).component("habboClient", {
  2944.   controller: ["$location", "$rootScope", "$scope", "$state", "Client", "EVENTS", "Session", "SystemData", "clientListener", "flash", "interstitial", "localStorage", "notifier", function(e, t, o, r, a, n, i, s, l, c, u, d, m) {
  2945.    function p() {
  2946.     var e = d.get("hotelLastAccess");
  2947.     return moment().subtract(60, "minutes").isBefore(e)
  2948.    }
  2949.  
  2950.    function h() {
  2951.     return g.client = a.get(), g.running = !0, g.client.$promise["catch"](function() {
  2952.      g.running = !1, m.error("ERROR_SERVER")
  2953.     })
  2954.    }
  2955.  
  2956.    function f(e) {
  2957.     e && (g.running = !1)
  2958.    }
  2959.  
  2960.    function b() {
  2961.     !_ && i.hasPreRollAd() && (u.start("preroll"), _ = !0)
  2962.    }
  2963.    var g = this,
  2964.     _ = !1;
  2965.    g.visible = !1, g.flashEnabled = c.isEnabled(), g.isOpen = s.isHotelOpen(), p() || "/logout" === e.path() || h(), g.close = function() {
  2966.     t.$broadcast(n.clientClose)
  2967.    }, g.reload = function() {
  2968.     t.$broadcast(n.clientOpen)
  2969.    }, o.$on(n.clientOpen, function() {
  2970.     b(), g.running || h(), d.set("hotelLastAccess", Date.now()), g.visible = !0
  2971.    }), o.$on(n.clientClose, function(e, t) {
  2972.     g.visible = !1, t || r.back()
  2973.    }), o.$on("$stateChangeSuccess", function(e, o, r, a) {
  2974.     "hotel" === a.name && t.$broadcast(n.clientClose, !0)
  2975.    }), o.$watch(l.hasDied, f), o.$watch(l.hasDisconnected, f)
  2976.   }],
  2977.   controllerAs: "ClientController",
  2978.   templateUrl: "hotel/client/client.html"
  2979.  }), angular.module("client.close.fullscreen.on.hide", ["angularScreenfull", "events"]).directive("habboClientCloseFullscreenOnHide", ["EVENTS", function(e) {
  2980.   return {
  2981.    restrict: "A",
  2982.    require: "ngsfFullscreen",
  2983.    link: function(t, o, r, a) {
  2984.     t.$on(e.clientClose, function() {
  2985.      a.isFullscreen() && a.toggleFullscreen()
  2986.     })
  2987.    }
  2988.   }
  2989.  }]), angular.module("client.service", ["ngResource", "config"]).factory("Client", ["$resource", "CONFIG", function(e, t) {
  2990.   return e(t.apiUrl + "/client/clienturl")
  2991.  }]), angular.module("register.banner", ["air.download.link", "local.register.banner", "locale", "templates"]).component("habboRegisterBanner", {
  2992.   templateUrl: "home/register-banner/register-banner.html"
  2993.  }), angular.module("promos.service", ["config"]).factory("promos", ["$http", "$q", "CONFIG", function(e, t, o) {
  2994.   return {
  2995.    get: function() {
  2996.     var r = o.habboWebNewsUrl + "front.html";
  2997.     return e.get(r).then(function(e) {
  2998.      return {
  2999.       html: e.data
  3000.      }
  3001.     })["catch"](function() {
  3002.      return t.when({
  3003.       html: ""
  3004.      })
  3005.     })
  3006.    }
  3007.   }
  3008.  }]), angular.module("news", ["ad.unit", "compile", "locale", "moderation.notification", "promos.service", "router", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  3009.   e.statePublic("home.news", {
  3010.    url: "/",
  3011.    controller: "NewsController",
  3012.    controllerAs: "NewsController",
  3013.    data: {
  3014.     title: "HEAD_TITLE_NEWS"
  3015.    },
  3016.    resolve: {
  3017.     promos: ["promos", function(e) {
  3018.      return e.get()
  3019.     }]
  3020.    },
  3021.    parent: "home",
  3022.    templateUrl: "home/news/news.html"
  3023.   })
  3024.  }]).controller("NewsController", ["promos", function(e) {
  3025.   var t = this;
  3026.   t.promos = e.html
  3027.  }]), angular.module("messaging", ["discussions", "locale", "router", "templates", "user.service"]).config(["$stateProvider", function(e) {
  3028.   e.statePrivate("home.messaging", {
  3029.    url: "/messaging",
  3030.    controller: "MessagingController",
  3031.    controllerAs: "MessagingController",
  3032.    data: {
  3033.     title: "HEAD_TITLE_MESSAGING"
  3034.    },
  3035.    resolve: {
  3036.     discussions: ["User", function(e) {
  3037.      return e.discussions().$promise
  3038.     }]
  3039.    },
  3040.    parent: "home",
  3041.    templateUrl: "home/messaging/messaging.html"
  3042.   })
  3043.  }]).controller("MessagingController", ["discussions", function(e) {
  3044.   var t = this;
  3045.   t.discussions = e
  3046.  }]), angular.module("user.service", ["ngResource", "config", "storage"]).factory("User", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  3047.   return e(t.apiUrl + "/user/:resource", null, {
  3048.    discussions: {
  3049.     method: "GET",
  3050.     isArray: !0,
  3051.     params: {
  3052.      resource: "discussions"
  3053.     },
  3054.     cache: o.shortCache
  3055.    }
  3056.   })
  3057.  }]), angular.module("email.report.unauthorized.service", ["config", "google.analytics"]).factory("reportUnauthorized", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  3058.   return function(r, a) {
  3059.    return e.get(t.apiUrl + "/public/email/unauthorized/" + r + "/" + a).then(function() {
  3060.     o.trackEvent("Email", "Unauthorized email reported")
  3061.    })
  3062.   }
  3063.  }]), angular.module("email.report.unauthorized", ["email.report.unauthorized.form", "header", "locale", "message.container", "router"]).config(["$stateProvider", function(e) {
  3064.   e.statePublic("reportUnauthorized", {
  3065.    url: "/identity/report_unauthorized_usage?email&hash",
  3066.    controller: "EmailReportUnauthorizedController",
  3067.    controllerAs: "EmailReportUnauthorizedController",
  3068.    data: {
  3069.     title: "HEAD_TITLE_EMAIL_REPORT_UNAUTHORIZED"
  3070.    },
  3071.    templateUrl: "email/email-report-unauthorized/email-report-unauthorized.html"
  3072.   })
  3073.  }]).controller("EmailReportUnauthorizedController", ["$stateParams", function(e) {
  3074.   var t = this;
  3075.   t.email = e.email, t.hash = e.hash
  3076.  }]), angular.module("email.report.unauthorized.form", ["email.report.unauthorized.service", "locale", "notifier", "router", "templates"]).component("habboEmailReportUnauthorizedForm", {
  3077.   bindings: {
  3078.    emailaddress: "<",
  3079.    hash: "<"
  3080.   },
  3081.   controller: ["$state", "notifier", "reportUnauthorized", function(e, t, o) {
  3082.    var r = this;
  3083.    r.reportInProgress = !1, r.report = function() {
  3084.     r.reportInProgress = !0, o(r.emailaddress, r.hash).then(function() {
  3085.      t.success("EMAIL_REPORT_UNAUTHORIZED_SUCCESS"), e.go("home.news")
  3086.     })["catch"](function() {
  3087.      t.error("ERROR_SERVER")
  3088.     })["finally"](function() {
  3089.      r.reportInProgress = !1
  3090.     })
  3091.    }
  3092.   }],
  3093.   controllerAs: "EmailReportUnauthorizedFormController",
  3094.   templateUrl: "email/email-report-unauthorized/email-report-unauthorized-form.html"
  3095.  }), angular.module("optout.service", ["config", "google.analytics"]).factory("optout", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  3096.   return function(r, a) {
  3097.    return e.get(t.apiUrl + "/public/email/optout/" + r + "/" + a).then(function() {
  3098.     o.trackEvent("Email", "Optout")
  3099.    })
  3100.   }
  3101.  }]), angular.module("email.optout", ["locale", "notifier", "optout.service", "router"]).config(["$stateProvider", function(e) {
  3102.   e.statePublic("optout", {
  3103.    url: "/email/marketing_off?email&hash",
  3104.    controller: "OptOutController",
  3105.    resolve: {
  3106.     optingout: ["$stateParams", "optout", function(e, t) {
  3107.      return t(e.email, e.hash)
  3108.     }]
  3109.    }
  3110.   })
  3111.  }]).controller("OptOutController", ["$state", "notifier", function(e, t) {
  3112.   t.success("OPTOUT_SUCCESS"), e.go("home.news")
  3113.  }]), angular.module("rooms", ["avatar", "config", "leaderboard.service", "locale", "official.room.avatar", "router"]).config(["$stateProvider", function(e) {
  3114.   e.statePublic("community.rooms", {
  3115.    url: "/rooms",
  3116.    parent: "community",
  3117.    controller: "RoomsController",
  3118.    controllerAs: "RoomsController",
  3119.    templateUrl: "community/rooms/rooms.html",
  3120.    data: {
  3121.     title: "HEAD_TITLE_ROOMS"
  3122.    },
  3123.    resolve: {
  3124.     rooms: ["Leaderboard", "CONFIG", function(e, t) {
  3125.      return e.get({
  3126.       site: t.hotel,
  3127.       leaderboard: "visited-rooms",
  3128.       timeframe: "daily",
  3129.       date: "latest"
  3130.      }).$promise
  3131.     }]
  3132.    }
  3133.   })
  3134.  }]).controller("RoomsController", ["rooms", function(e) {
  3135.   var t = this;
  3136.   t.rooms = e
  3137.  }]), angular.module("photos", ["columns", "locale", "photos.service", "router"]).config(["$stateProvider", function(e) {
  3138.   e.statePublic("community.photos", {
  3139.    url: "/photos",
  3140.    parent: "community",
  3141.    controller: "PhotosController",
  3142.    controllerAs: "PhotosController",
  3143.    templateUrl: "community/photos/photos.html",
  3144.    data: {
  3145.     title: "HEAD_TITLE_PHOTOS"
  3146.    },
  3147.    resolve: {
  3148.     photos: ["Photos", function(e) {
  3149.      return e.query().$promise
  3150.     }]
  3151.    }
  3152.   })
  3153.  }]).controller("PhotosController", ["photos", function(e) {
  3154.   var t = this;
  3155.   t.photos = e
  3156.  }]), angular.module("photos.service", ["ngResource", "config", "reported.photos", "safe.transform.response", "storage"]).factory("Photos", ["$resource", "CONFIG", "httpCache", "reportedPhotosFilter", "safeTransformResponse", function(e, t, o, r, a) {
  3157.   return e(t.extraDataUrl + "/public/photos", null, {
  3158.    query: {
  3159.     isArray: !0,
  3160.     cache: o.shortCache,
  3161.     transformResponse: a.fromJson(function(e) {
  3162.      var t = r(e);
  3163.      return _.map(t, function(e) {
  3164.       return _.assign(e, {
  3165.        url: "https:" + e.url,
  3166.        contentWidth: 320,
  3167.        contentHeight: 320,
  3168.        parentTitle: "PHOTOS_TITLE",
  3169.        pool: "photos"
  3170.       })
  3171.      })
  3172.     })
  3173.    }
  3174.   })
  3175.  }]), angular.module("fansites", ["ad.unit", "locale", "router", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  3176.   e.statePublic("community.fansites", {
  3177.    url: "/fansites",
  3178.    controller: "FansitesController",
  3179.    controllerAs: "FansitesController",
  3180.    data: {
  3181.     title: "HEAD_TITLE_FANSITES"
  3182.    },
  3183.    resolve: {
  3184.     fansites: ["webPages", function(e) {
  3185.      return e.get("community/fansites")
  3186.     }]
  3187.    },
  3188.    parent: "community",
  3189.    templateUrl: "community/fansites/fansites.html"
  3190.   })
  3191.  }]).controller("FansitesController", ["fansites", function(e) {
  3192.   var t = this;
  3193.   t.fansites = e
  3194.  }]), angular.module("category.service", ["config"]).factory("category", ["$http", "CONFIG", function(e, t) {
  3195.   return {
  3196.    get: function(o, r) {
  3197.     var a = o.replace(/-/g, "_"),
  3198.      n = t.habboWebNewsUrl + a + "_" + r + ".html";
  3199.     return e.get(n).then(function(e) {
  3200.      return {
  3201.       titleKey: angular.element(e.data).find(".news-category__link--active").attr("translate"),
  3202.       html: e.data
  3203.      }
  3204.     })
  3205.    }
  3206.   }
  3207.  }]), angular.module("category", ["ad.unit", "category.service", "compile", "locale", "router", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  3208.   e.statePublic("community.category", {
  3209.    url: "/category/{category:(?:[^/]+)}{archive:(?:/[^0-9lst/]+)?}/{page}",
  3210.    controller: "CategoryController",
  3211.    controllerAs: "CategoryController",
  3212.    onEnter: ["category", "Head", function(e, t) {
  3213.     t.setTitle(e.titleKey)
  3214.    }],
  3215.    resolve: {
  3216.     category: ["$location", "$q", "$stateParams", "category", function(e, t, o, r) {
  3217.      var a = o.archive.replace("/", "_");
  3218.      return r.get(o.category + a, o.page)["catch"](function(r) {
  3219.       return 0 !== a.length || "1" !== o.page && "last" !== o.page ? a.length > 0 && "1" === o.page ? (e.path("/community/category").replace(), t.when({})) : t.reject(r) : (e.path("/community/category/" + o.category + "/archive/1").replace(), t.when({}))
  3220.      })
  3221.     }]
  3222.    },
  3223.    parent: "community",
  3224.    templateUrl: "community/category/category.html"
  3225.   }), t.when("/community/category", "/community/category/all"), t.when("/community/category/:category", "/community/category/:category/1")
  3226.  }]).controller("CategoryController", ["category", function(e) {
  3227.   var t = this;
  3228.   t.category = e.html
  3229.  }]), angular.module("article.service", ["config"]).factory("article", ["$http", "CONFIG", function(e, t) {
  3230.   return {
  3231.    get: function(o, r) {
  3232.     var a = r.replace(/-/g, "_"),
  3233.      n = t.habboWebNewsUrl + "articles/" + o + "_" + a + ".html";
  3234.     return e.get(n).then(function(e) {
  3235.      var t = angular.element(e.data);
  3236.      return {
  3237.       title: t.find("h1, h2, h3, h4, h5, h6").eq(0).text(),
  3238.       summary: t.find(".news-header__summary").text(),
  3239.       image: t.find("img").eq(0).attr("src"),
  3240.       html: e.data
  3241.      }
  3242.     })
  3243.    }
  3244.   }
  3245.  }]), angular.module("article", ["ad.unit", "article.service", "compile", "lightbox", "locale", "router", "social.share", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  3246.   e.statePublic("community.article", {
  3247.    url: "/article/:id/:title",
  3248.    controller: "ArticleController",
  3249.    controllerAs: "ArticleController",
  3250.    onEnter: ["article", "Head", function(e, t) {
  3251.     t.title = e.title, t.description = e.summary, t.image = e.image, t.imageHeight = 300, t.imageWidth = 759
  3252.    }],
  3253.    resolve: {
  3254.     article: ["$stateParams", "article", function(e, t) {
  3255.      return t.get(e.id, e.title)
  3256.     }]
  3257.    },
  3258.    parent: "community",
  3259.    templateUrl: "community/article/article.html"
  3260.   }), t.when("/article/:id/:slug", "/community/article/:id/:slug"), t.when("/articles/{id:[0-9]*}-{slug:[a-z-]*}", "/article/:id/:slug")
  3261.  }]).controller("ArticleController", ["article", function(e) {
  3262.   var t = this;
  3263.   t.article = e.html
  3264.  }]), angular.module("zendesk.url", ["config", "security"]).filter("zendeskRedirectUrl", ["CONFIG", "Session", function(e, t) {
  3265.   var o = function(o, r) {
  3266.    return r === !0 || t.hasSession() && _(o).includes("help.habbo") ? e.apiUrl + "/public/help?returnTo=" + o : o
  3267.   };
  3268.   return o.$stateful = !0, o
  3269.  }]), angular.module("web.pages.service", ["config"]).factory("webPages", ["$http", "CONFIG", function(e, t) {
  3270.   return {
  3271.    get: function(o) {
  3272.     var r = t.habboWebPagesUrl + o + "." + t.lang + ".html";
  3273.     return e.get(r).then(function(e) {
  3274.      return e.data
  3275.     })
  3276.    }
  3277.   }
  3278.  }]), angular.module("web.pages", ["web.pages.service"]).component("habboWebPages", {
  3279.   bindings: {
  3280.    key: "@"
  3281.   },
  3282.   controller: ["$animate", "$compile", "$element", "$scope", "webPages", function(e, t, o, r, a) {
  3283.    e.addClass(o, "ng-hide"), r.$watch("WebPagesController.key", function(n) {
  3284.     a.get(n).then(function(a) {
  3285.      var n = o.children().first();
  3286.      n.html(a), t(n.contents())(r), e.removeClass(o, "ng-hide")
  3287.     })
  3288.    })
  3289.   }],
  3290.   controllerAs: "WebPagesController",
  3291.   template: '<aside class="static-content"></aside>'
  3292.  }), angular.module("tabs", ["locale", "tab", "templates"]).component("habboTabs", {
  3293.   bindings: {
  3294.    titleKey: "@"
  3295.   },
  3296.   controller: function() {
  3297.    var e = this;
  3298.    e.open = !1, e.tabs = [], e.activeTab = null, e.setTab = function(t) {
  3299.     e.tabs.push(t)
  3300.    }, e.setActive = function(t) {
  3301.     e.open = !1, e.activeTab = _.find(e.tabs, {
  3302.      path: t
  3303.     })
  3304.    }
  3305.   },
  3306.   controllerAs: "TabsController",
  3307.   templateUrl: "common/tabs/tabs.html",
  3308.   transclude: !0
  3309.  }), angular.module("tab", ["locale", "templates"]).component("habboTab", {
  3310.   require: {
  3311.    HabboTabsController: "^habboTabs"
  3312.   },
  3313.   bindings: {
  3314.    path: "@",
  3315.    alternativePath: "@",
  3316.    strictPath: "@",
  3317.    translationKey: "@"
  3318.   },
  3319.   controller: ["$scope", "$location", function(e, t) {
  3320.    function o() {
  3321.     a.active = "true" === a.strictPath ? t.path() === a.path : r(), a.active && a.HabboTabsController.setActive(a.path)
  3322.    }
  3323.  
  3324.    function r() {
  3325.     return 0 === t.path().indexOf(a.path) || 0 === t.path().indexOf(a.alternativePath)
  3326.    }
  3327.    var a = this;
  3328.    a.open = !1, a.$onInit = function() {
  3329.     a.HabboTabsController.setTab({
  3330.      path: a.path,
  3331.      translationKey: a.translationKey
  3332.     }), o()
  3333.    }, e.$on("$stateChangeSuccess", o)
  3334.   }],
  3335.   controllerAs: "TabController",
  3336.   templateUrl: "common/tabs/tab.html"
  3337.  }), angular.module("system.data", []).factory("SystemData", ["$window", function(e) {
  3338.   var t = {};
  3339.   return t.geoLocation = {
  3340.    continent: e.geoLocation ? e.geoLocation.continent : null,
  3341.    country: e.geoLocation ? e.geoLocation.country : null
  3342.   }, t.getShopCountry = function() {
  3343.    return "gb" === t.geoLocation.country ? "uk" : t.geoLocation.country
  3344.   }, t.isHotelOpen = function() {
  3345.    var t = e.systemData && e.systemData.open;
  3346.    return t !== !1
  3347.   }, t.isIDCGamesCountry = function() {
  3348.    var t = e.partnerCodeInfo && e.partnerCodeInfo.partner;
  3349.    return "idcse" === t
  3350.   }, t
  3351.  }]), angular.module("storage", ["cache", "local.storage"]), angular.module("sticky.header", []).directive("habboStickyHeader", ["$window", function(e) {
  3352.   return {
  3353.    restrict: "A",
  3354.    link: function(t, o) {
  3355.     function r() {
  3356.      var t = e.pageYOffset > 0 ? e.pageYOffset : 0,
  3357.       r = i - t;
  3358.      t <= o.height() ? o.addClass("sticky-header--top") : o.removeClass("sticky-header--top"), 0 === t && o.removeClass("sticky-header--fixed"), r > 0 && a(r) && t > o.height() ? o.addClass("sticky-header--fixed") : 0 > r && a(r) && (o.hasClass("sticky-header--fixed") && o.addClass("sticky-header--hidden"), o.removeClass("sticky-header--fixed")), (o.hasClass("sticky-header--fixed") || o.hasClass("sticky-header--top")) && o.removeClass("sticky-header--hidden"), i = t
  3359.     }
  3360.  
  3361.     function a(e) {
  3362.      return Math.abs(e) > n
  3363.     }
  3364.     var n = 5,
  3365.      i = e.pageYOffset;
  3366.     i <= o.height() ? o.addClass("sticky-header sticky-header--top") : o.addClass("sticky-header sticky-header--fixed"), angular.element(e).on("orientationchange resize scroll", r), o.on("$destroy", function() {
  3367.      angular.element(e).off("orientationchange resize scroll", r)
  3368.     })
  3369.    }
  3370.   }
  3371.  }]), angular.module("social.share", ["config", "google.analytics", "locale", "popup", "router", "templates"]).component("habboSocialShare", {
  3372.   controller: ["$location", "CONFIG", "Head", "googleAnalytics", "popup", function(e, t, o, r, a) {
  3373.    var n = this;
  3374.    n.shareOnFacebook = function() {
  3375.     var t = $.param({
  3376.       u: e.absUrl()
  3377.      }),
  3378.      o = "http://www.facebook.com/sharer.php?" + t;
  3379.     r.trackSocial("Facebook", "Share", e.url()), a.open(o, 626, 436)
  3380.    }, n.shareOnTwitter = function() {
  3381.     var n = $.param({
  3382.       url: e.absUrl(),
  3383.       text: o.title,
  3384.       hashtags: "Habbo",
  3385.       related: t.twitterAccount.substring(1)
  3386.      }),
  3387.      i = "https://twitter.com/intent/tweet?" + n;
  3388.     r.trackSocial("Twitter", "Tweet", e.url()), a.open(i, 550, 420)
  3389.    }
  3390.   }],
  3391.   controllerAs: "SocialShareController",
  3392.   templateUrl: "common/social-share/social-share.html"
  3393.  }), angular.module("show.on.load", []).directive("habboShowOnLoad", function() {
  3394.   return {
  3395.    restrict: "A",
  3396.    link: function(e, t) {
  3397.     t.hide(), t.on("load", function() {
  3398.      t.show()
  3399.     })
  3400.    }
  3401.   }
  3402.  }), angular.module("safe.transform.response", []).factory("safeTransformResponse", function() {
  3403.   var e = {};
  3404.   return e.fromJson = function(e) {
  3405.    return function(t) {
  3406.     var o;
  3407.     try {
  3408.      return o = angular.fromJson(t), e(o)
  3409.     } catch (r) {
  3410.      return t
  3411.     }
  3412.    }
  3413.   }, e
  3414.  }), angular.module("reported.photos.service", ["storage"]).factory("reportedPhotos", ["localStorage", function(e) {
  3415.   var t = "reportedPhotos",
  3416.    o = {},
  3417.    r = e.get(t) || [];
  3418.   return o.save = function(o) {
  3419.    r.push(o), e.set(t, r)
  3420.   }, o.get = function() {
  3421.    return r
  3422.   }, o
  3423.  }]), angular.module("reported.photos", ["reported.photos.service"]).filter("reportedPhotos", ["reportedPhotos", function(e) {
  3424.   return function(t) {
  3425.    var o = e.get();
  3426.    return _.filter(t, function(e) {
  3427.     return !_.includes(o, e.id)
  3428.    })
  3429.   }
  3430.  }]), angular.module("remove.on.error", []).directive("habboRemoveOnError", function() {
  3431.   return {
  3432.    restrict: "A",
  3433.    link: function(e, t) {
  3434.     t[0].onerror = function() {
  3435.      t.remove()
  3436.     }
  3437.    }
  3438.   }
  3439.  }), angular.module("popup", []).factory("popup", ["$interval", "$q", "$window", function(e, t, o) {
  3440.   function r(e, t) {
  3441.    var r = o.innerWidth,
  3442.     i = o.innerHeight;
  3443.    return e = e || n, t = t || a, ["width=" + (r >= e ? e : r), "height=" + (i >= t ? t : i)].join(",")
  3444.   }
  3445.   var a = 768,
  3446.    n = 1024,
  3447.    i = {};
  3448.   return i.open = function(a, n, i) {
  3449.    var s = t.defer(),
  3450.     l = o.open(a, "_blank", r(n, i)),
  3451.     c = e(function() {
  3452.      l && !l.closed || (s.resolve(), e.cancel(c))
  3453.     }, 100);
  3454.    return s.promise
  3455.   }, i
  3456.  }]), angular.module("official.room.avatar", ["locale", "templates"]).component("officialRoomAvatar", {
  3457.   templateUrl: "common/official-room-avatar/official-room-avatar.html"
  3458.  }), angular.module("notifier", ["locale"]).factory("notifier", ["$q", "$translate", function(e, t) {
  3459.   var o = {
  3460.     extendedTimeOut: 1e3,
  3461.     hideDuration: 300,
  3462.     positionClass: "toast-top-center",
  3463.     preventDuplicates: !0,
  3464.     progressBar: !0,
  3465.     showDuration: 300,
  3466.     timeOut: 2e4
  3467.    },
  3468.    r = _.extend({}, o, {
  3469.     extendedTimeOut: 0,
  3470.     hideDuration: 0,
  3471.     positionClass: "toast-top-center toast-sticky",
  3472.     timeOut: 0,
  3473.     tapToDismiss: !1
  3474.    }),
  3475.    a = _.partialRight(toastr.success, "", o),
  3476.    n = _.partialRight(toastr.error, "", o),
  3477.    i = _.partialRight(toastr.error, r),
  3478.    s = function(e) {
  3479.     return function(o, r) {
  3480.      t(o, r).then(e)["catch"](e)
  3481.     }
  3482.    },
  3483.    l = function(o) {
  3484.     return function(r, a, n) {
  3485.      e.all([t(a, n), t(r), t("OK_BUTTON")]).then(function(e) {
  3486.       var t = o(e[0] + '<button class="toast-button">' + e[2] + "</button>", e[1]);
  3487.       t.delegate("button", "click", function() {
  3488.        toastr.options.hideDuration = 0, toastr.clear(t, {
  3489.         force: !0
  3490.        })
  3491.       })
  3492.      })
  3493.     }
  3494.    };
  3495.   return {
  3496.    success: s(a),
  3497.    error: s(n),
  3498.    errorSticky: l(i)
  3499.   }
  3500.  }]), angular.module("navigate.to.on.key", []).directive("habboNavigateToOnKey", ["$document", function(e) {
  3501.   function t(e) {
  3502.    var t = {
  3503.     left: 37,
  3504.     right: 39
  3505.    };
  3506.    return t[e]
  3507.   }
  3508.   return {
  3509.    restrict: "A",
  3510.    link: function(o, r, a) {
  3511.     function n(e) {
  3512.      e.which === i && (e.preventDefault(), r.trigger("click"))
  3513.     }
  3514.     var i = t(a.habboNavigateToOnKey);
  3515.     angular.element(e).keydown(n), r.on("$destroy", function() {
  3516.      angular.element(e).unbind("keydown", n)
  3517.     })
  3518.    }
  3519.   }
  3520.  }]), angular.module("message.container", ["angular-multiple-transclusion", "templates"]).component("habboMessageContainer", {
  3521.   templateUrl: "common/message-container/message-container.html",
  3522.   transclude: !0
  3523.  }), angular.module("my.like.cache", []).factory("myLikeCache", function() {
  3524.   var e = {},
  3525.    t = {};
  3526.   return e.like = function(e) {
  3527.    t[e] = "like"
  3528.   }, e.unlike = function(e) {
  3529.    t[e] = "unlike"
  3530.   }, e.hasLike = function(e) {
  3531.    return "like" === t[e]
  3532.   }, e.hasUnlike = function(e) {
  3533.    return "unlike" === t[e]
  3534.   }, e
  3535.  }), angular.module("like.service", ["config", "like.filters", "my.like.cache", "security"]).factory("like", ["$http", "CONFIG", "Session", "myLikeCache", function(e, t, o, r) {
  3536.   function a(e, t) {
  3537.    401 !== t && (r.like(e.id), e.likes = _.uniq(e.likes.concat(o.user.name)))
  3538.   }
  3539.  
  3540.   function n(e, t) {
  3541.    401 !== t && (r.unlike(e.id), _.remove(e.likes, _.matches(o.user.name)))
  3542.   }
  3543.   var i = {};
  3544.   return i.like = function(o) {
  3545.    e.post(t.extraDataUrl + "/private/like/" + o.id).then(function(e) {
  3546.     a(o, e.status)
  3547.    })["catch"](function(e) {
  3548.     a(o, e.status)
  3549.    })
  3550.   }, i.unlike = function(o) {
  3551.    e.post(t.extraDataUrl + "/private/unlike/" + o.id).then(function(e) {
  3552.     n(o, e.status)
  3553.    })["catch"](function(e) {
  3554.     n(o, e.status)
  3555.    })
  3556.   }, i
  3557.  }]), angular.module("like.filters", ["security"]).filter("myLike", ["Session", function(e) {
  3558.   return function(t) {
  3559.    return _.find(t.likes, function(t) {
  3560.     return e.hasSession() ? t === e.user.name : !1
  3561.    })
  3562.   }
  3563.  }]).filter("othersLikes", ["Session", function(e) {
  3564.   return function(t) {
  3565.    return _.filter(t.likes, function(t) {
  3566.     return e.hasSession() ? t !== e.user.name : !0
  3567.    })
  3568.   }
  3569.  }]), angular.module("like", ["avatar", "false.on.outside.click", "like.filters", "like.service", "locale", "my.like.cache", "security", "templates"]).component("habboLike", {
  3570.   bindings: {
  3571.    data: "="
  3572.   },
  3573.   controller: ["$timeout", "Session", "like", "myLikeCache", "myLikeFilter", function(e, t, o, r, a) {
  3574.    var n = this,
  3575.     i = a(n.data);
  3576.    r.hasLike(n.data.id) && !i && n.data.likes.push(t.user.name), r.hasUnlike(n.data.id) && i && _.remove(n.data.likes, _.matches(i)), n.show = !1, n.mouseenter = function() {
  3577.     e(function() {
  3578.      n.show = !0
  3579.     })
  3580.    }, n.like = function() {
  3581.     o.like(n.data)
  3582.    }, n.unlike = function() {
  3583.     o.unlike(n.data)
  3584.    }
  3585.   }],
  3586.   controllerAs: "LikeController",
  3587.   templateUrl: "common/like/like.html"
  3588.  }), angular.module("lightbox.modal", ["templates", "ui.bootstrap"]).controller("LightboxController", ["src", function(e) {
  3589.   var t = this;
  3590.   t.src = e
  3591.  }]).factory("lightbox", ["$uibModal", function(e) {
  3592.   var t = {};
  3593.   return t.open = function(t) {
  3594.    return e.open({
  3595.     animation: !1,
  3596.     backdropClass: "lightbox-backdrop",
  3597.     controller: "LightboxController",
  3598.     controllerAs: "LightboxController",
  3599.     resolve: {
  3600.      src: _.constant(t)
  3601.     },
  3602.     templateUrl: "common/lightbox/lightbox-modal.html",
  3603.     windowClass: "lightbox-modal"
  3604.    }).result
  3605.   }, t
  3606.  }]), angular.module("lightbox", ["lightbox.modal"]).directive("habboLightbox", ["lightbox", function(e) {
  3607.   return {
  3608.    restrict: "A",
  3609.    link: function(t, o, r) {
  3610.     o.click(function(t) {
  3611.      t.preventDefault(), e.open(r.href)
  3612.     })
  3613.    }
  3614.   }
  3615.  }]), angular.module("leaderboard.service", ["ngResource", "config", "storage"]).factory("Leaderboard", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  3616.   return e(t.habboWebLeaderboardsUrl + "/:site/:leaderboard/:timeframe/:date.json", null, {
  3617.    get: {
  3618.     method: "GET",
  3619.     isArray: !0,
  3620.     cache: o.shortCache
  3621.    }
  3622.   })
  3623.  }]), angular.module("imager.service", ["angular-md5", "config"]).factory("imager", ["CONFIG", "md5", function(e, t) {
  3624.   function o(e) {
  3625.    return _(e).transform(function(e, t, o) {
  3626.     return e.push(o + "-" + t), e
  3627.    }, []).join(".")
  3628.   }
  3629.   var r = {},
  3630.    a = "ef2356a4926bf225eb86c75c52309c32";
  3631.   return r.generatePose = function(e) {
  3632.    var t = e.size || "big",
  3633.     o = e.direction || "sw",
  3634.     r = e.headDirection || o,
  3635.     a = e.action || "stand",
  3636.     n = e.gesture || "smile",
  3637.     i = {};
  3638.    return i.s = {
  3639.     big: 0,
  3640.     bighead: 2,
  3641.     smallhead: 3,
  3642.     large: 4,
  3643.     largehead: 5
  3644.    }[t.toLowerCase()], i.g = {
  3645.     none: 0,
  3646.     smile: 1,
  3647.     angry: 2,
  3648.     surprise: 3,
  3649.     sad: 4,
  3650.     speak: 5,
  3651.     eyebrows: 6
  3652.    }[n.toLowerCase()], i.d = {
  3653.     nw: 0,
  3654.     w: 1,
  3655.     sw: 2,
  3656.     s: 3,
  3657.     se: 4,
  3658.     e: 5,
  3659.     ne: 6,
  3660.     n: 7
  3661.    }[o.toLowerCase()], i.h = {
  3662.     nw: 0,
  3663.     w: 1,
  3664.     sw: 2,
  3665.     s: 3,
  3666.     se: 4,
  3667.     e: 5,
  3668.     ne: 6,
  3669.     n: 7
  3670.    }[r.toLowerCase()], i.a = {
  3671.     stand: 0,
  3672.     sit: 1,
  3673.     walk: 2,
  3674.     wave: 3,
  3675.     lay: 4,
  3676.     carry: 5,
  3677.     drink: 6
  3678.    }[a.toLowerCase()], i
  3679.   }, r.get2xSize = function(e) {
  3680.    return {
  3681.     big: "large",
  3682.     bighead: "largehead",
  3683.     smallhead: "bighead"
  3684.    }[e || "big"]
  3685.   }, r.getDimensions = function(e) {
  3686.    return {
  3687.     big: {
  3688.      width: 64,
  3689.      height: 110
  3690.     },
  3691.     bighead: {
  3692.      width: 54,
  3693.      height: 62
  3694.     },
  3695.     smallhead: {
  3696.      width: 27,
  3697.      height: 30
  3698.     },
  3699.     large: {
  3700.      width: 128,
  3701.      height: 220
  3702.     },
  3703.     largehead: {
  3704.      width: 108,
  3705.      height: 124
  3706.     }
  3707.    }[e || "big"]
  3708.   }, r.getImagerUrl = function(r, n) {
  3709.    var i = o(n),
  3710.     s = t.createHash(r + i + a);
  3711.    return e.imagingUrl + "/avatar/" + encodeURIComponent(r + "," + i + "," + s) + ".png"
  3712.   }, r.getLegacyImagerUrl = function(t, o) {
  3713.    return e.imagingUrl + "/avatarimage?" + $.param({
  3714.     user: t,
  3715.     headonly: 2 === o.s || 3 === o.s || 5 === o.s ? 1 : 0,
  3716.     size: {
  3717.      0: "b",
  3718.      1: "s",
  3719.      2: "b",
  3720.      3: "s",
  3721.      4: "l",
  3722.      5: "l"
  3723.     }[o.s],
  3724.     gesture: {
  3725.      0: "",
  3726.      1: "sml",
  3727.      2: "agr",
  3728.      3: "srp",
  3729.      4: "sad",
  3730.      5: "spk",
  3731.      6: "eyb"
  3732.     }[o.g],
  3733.     direction: o.d,
  3734.     head_direction: o.h,
  3735.     action: {
  3736.      0: "std",
  3737.      1: "sit",
  3738.      2: "wlk",
  3739.      3: "wav",
  3740.      4: "lay",
  3741.      5: "crr",
  3742.      6: "drk"
  3743.     }[o.a]
  3744.    })
  3745.   }, r
  3746.  }]), angular.module("imager", ["imager.service", "templates"]).component("habboImager", {
  3747.   bindings: {
  3748.    figure: "@",
  3749.    user: "@",
  3750.    name: "@",
  3751.    size: "@",
  3752.    direction: "@",
  3753.    headDirection: "@",
  3754.    action: "@",
  3755.    gesture: "@"
  3756.   },
  3757.   controller: ["$scope", "imager", function(e, t) {
  3758.    function o(e) {
  3759.     var o = {
  3760.       size: e || r.size,
  3761.       direction: r.direction,
  3762.       headDirection: r.headDirection,
  3763.       action: r.action,
  3764.       gesture: r.gesture
  3765.      },
  3766.      a = t.generatePose(o);
  3767.     return r.figure ? t.getImagerUrl(r.figure, a) : r.user ? t.getLegacyImagerUrl(r.user, a) : void 0
  3768.    }
  3769.    var r = this;
  3770.    r.dimensions = t.getDimensions(r.size), r.src = o();
  3771.    var a = "bighead" === r.size && r.figure ? null : t.get2xSize(r.size);
  3772.    a && (r.src2x = o(a))
  3773.   }],
  3774.   controllerAs: "ImagerController",
  3775.   templateUrl: "common/imager/imager.html"
  3776.  }), angular.module("hotel.closed", ["locale", "templates"]).component("habboHotelClosed", {
  3777.   templateUrl: "common/hotel-closed/hotel-closed.html"
  3778.  }), angular.module("header", ["header.ad", "locale", "navigation", "security", "sticky.header", "templates", "user.menu"]).component("habboHeaderLarge", {
  3779.   bindings: {
  3780.    active: "@"
  3781.   },
  3782.   controllerAs: "HeaderLargeController",
  3783.   templateUrl: "common/header/header-large.html",
  3784.   transclude: !0
  3785.  }).component("habboHeaderSmall", {
  3786.   bindings: {
  3787.    active: "@"
  3788.   },
  3789.   controller: ["loginModal", function(e) {
  3790.    var t = this;
  3791.    t.openLoginModal = e.open
  3792.   }],
  3793.   controllerAs: "HeaderSmallController",
  3794.   templateUrl: "common/header/header-small.html",
  3795.   transclude: !0
  3796.  }), angular.module("group.badge", ["config", "templates"]).component("habboGroupBadge", {
  3797.   bindings: {
  3798.    code: "@",
  3799.    name: "@"
  3800.   },
  3801.   controller: ["CONFIG", function(e) {
  3802.    var t = this;
  3803.    t.imagingUrl = e.imagingUrl
  3804.   }],
  3805.   controllerAs: "GroupBadgeController",
  3806.   templateUrl: "common/group-badge/group-badge.html"
  3807.  }), angular.module("google.analytics", []).factory("googleAnalytics", ["$window", function(e) {
  3808.   function t(t) {
  3809.    e.Bugsnag && e.Bugsnag.notifyException(t, "GA not supported", {
  3810.     groupingHash: "GA"
  3811.    }, "info")
  3812.   }
  3813.   var o = {};
  3814.   return o.trackEvent = function(o, r, a, n) {
  3815.    try {
  3816.     e.ga("send", "event", o, r, a, n)
  3817.    } catch (i) {
  3818.     t(i)
  3819.    }
  3820.   }, o.trackPageView = function(o) {
  3821.    try {
  3822.     e.ga("send", "pageview", o)
  3823.    } catch (r) {
  3824.     t(r)
  3825.    }
  3826.   }, o.trackSocial = function(o, r, a) {
  3827.    try {
  3828.     e.ga("send", "social", o, r, a)
  3829.    } catch (n) {
  3830.     t(n)
  3831.    }
  3832.   }, o.trackTransaction = function(o, r, a, n, i, s) {
  3833.    try {
  3834.     e.ga("ecommerce:addTransaction", {
  3835.      id: o,
  3836.      currency: s,
  3837.      revenue: i
  3838.     }), e.ga("ecommerce:addItem", {
  3839.      id: o,
  3840.      name: r,
  3841.      sku: a,
  3842.      category: n,
  3843.      price: i,
  3844.      quantity: "1"
  3845.     }), e.ga("ecommerce:send")
  3846.    } catch (l) {
  3847.     t(l)
  3848.    }
  3849.   }, o
  3850.  }]).run(["$location", "$rootScope", "$timeout", "googleAnalytics", function(e, t, o, r) {
  3851.   t.$on("$stateChangeSuccess", function() {
  3852.    o(function() {
  3853.     r.trackPageView(e.url())
  3854.    })
  3855.   })
  3856.  }]), angular.module("form", ["captcha", "email.address", "password.current", "password.new", "password.toggle.mask", "search", "validators"]), angular.module("footer", ["locale", "templates", "zendesk.url"]).constant("FOOTER_LINKS", ["FOOTER_SUPPORT", "FOOTER_SAFETY", "FOOTER_PARENTS", "FOOTER_TOS_AND_PRIVACY", "FOOTER_ADVERTISERS"]).component("habboFooter", {
  3857.   controller: ["FOOTER_LINKS", function(e) {
  3858.    var t = this;
  3859.    t.links = e, t.currentYear = (new Date).getFullYear()
  3860.   }],
  3861.   controllerAs: "FooterController",
  3862.   templateUrl: "common/footer/footer.html"
  3863.  }), angular.module("flash.require", ["flash.service"]).directive("habboRequireFlash", ["flash", "ngIfDirective", function(e, t) {
  3864.   var o = t[0];
  3865.   return {
  3866.    restrict: "A",
  3867.    priority: o.priority,
  3868.    terminal: o.terminal,
  3869.    transclude: o.transclude,
  3870.    link: function(t, r, a) {
  3871.     a.ngIf = e.isSupported, o.link.apply(o, arguments)
  3872.    }
  3873.   }
  3874.  }]), angular.module("flash", ["flash.href", "flash.require", "flash.service"]), angular.module("flash.service", []).factory("flash", function() {
  3875.   var e = {};
  3876.   return e.isEnabled = function() {
  3877.    return swfobject.hasFlashPlayerVersion("11")
  3878.   }, e.isSupported = function() {
  3879.    return e.isEnabled() || !bowser.mobile
  3880.   }, e
  3881.  }), angular.module("flash.href", ["flash.service"]).directive("habboFlashHref", ["flash", function(e) {
  3882.   return {
  3883.    restrict: "A",
  3884.    link: function(t, o, r) {
  3885.     e.isSupported() && r.$observe("habboFlashHref", function(e) {
  3886.      e && r.$set("href", e)
  3887.     })
  3888.    }
  3889.   }
  3890.  }]), angular.module("false.on.outside.click", []).directive("habboFalseOnOutsideClick", function() {
  3891.   return {
  3892.    restrict: "A",
  3893.    link: function(e, t, o) {
  3894.     function r(r) {
  3895.      0 === angular.element(r.target).closest(t).length && e.$apply(function() {
  3896.       e.$eval(o.habboFalseOnOutsideClick + " = false;")
  3897.      })
  3898.     }
  3899.     e.$watch(o.habboFalseOnOutsideClick, function(e) {
  3900.      e ? angular.element("body").on("click touchstart", r) : angular.element("body").off("click touchstart", r)
  3901.     }), t.on("$destroy", function() {
  3902.      angular.element("body").off("click touchstart", r)
  3903.     })
  3904.    }
  3905.   }
  3906.  }), angular.module("eu.cookie.banner", ["locale", "storage", "system.data", "templates"]).component("habboEuCookieBanner", {
  3907.   controller: ["SystemData", "localStorage", function(e, t) {
  3908.    var o = this;
  3909.    o.show = !1, t.get("acceptCookies") || ("eu" === e.geoLocation.continent ? o.show = !0 : t.set("acceptCookies", !0)), o.close = function() {
  3910.     o.show = !1, t.set("acceptCookies", !0)
  3911.    }
  3912.   }],
  3913.   controllerAs: "EuCookieBannerController",
  3914.   templateUrl: "common/eu-cookie-banner/eu-cookie-banner.html"
  3915.  }), angular.module("encode.uri.component", []).filter("encodeURIComponent", ["$window", function(e) {
  3916.   return e.encodeURIComponent
  3917.  }]), angular.module("empty.results", ["locale", "templates"]).component("habboEmptyResults", {
  3918.   bindings: {
  3919.    translationKey: "@"
  3920.   },
  3921.   controllerAs: "EmptyResultsController",
  3922.   templateUrl: "common/empty-results/empty-results.html"
  3923.  }), angular.module("creation.href", ["encode.uri.component"]).directive("habboCreationHref", ["encodeURIComponentFilter", function(e) {
  3924.   return {
  3925.    restrict: "A",
  3926.    link: function(t, o, r) {
  3927.     t.$watch(r.habboCreationHref, function(t) {
  3928.      if (t) {
  3929.       var o = "PHOTO" === t.type ? "photo" : "story",
  3930.        a = ["profile", e(t.creator_name), o, t.id].join("/");
  3931.       t.pool && (a += "?pool=" + t.pool), r.$set("href", "/" + a)
  3932.      }
  3933.     })
  3934.    }
  3935.   }
  3936.  }]), angular.module("console.warning", ["locale"]).factory("warning", function() {
  3937.   var e = {};
  3938.   return e.HEADER = ["                                                                        ,,,   ", "  ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,    ,,,,,,,,,,   ,::,,  ", ",,@@@@@@@@@@@@@@:,:@@@@@@@@::@@@@@@@@@@@::@@@@@@@@@@@@:,,,:@@@@@@@@:,,,::: :, ", ",,@@@@@@@@@@@@@@@:@@@@@@@@@@:@@@@@@@@@@@@@@@@@@@@@@@@@@:,:@@@@@@@@@@:,:   : ,,", ",,@@,,,,,@,,,,,,@@,,,,,,,,,,@@,,,,,,,,,,,@@@,,,,,,,,,,@@@@,,,,,,,,,,@@:  :: ,,", ",,@@,,,,,@,,,,,,@@,,,,,,,,,,@@,,,,,,,,,,,,@@,,,,,,,,,,,@@@,,,,,,,,,,@@:::: :,,", ",,@@,,,,,@,,,,,,@,,,,,,,,,,,,@,,,,,,,,,,,,@@,,,,,,,,,,,,@,,,,,,,,,,,,@@@::,,, ", ",,@@,,,,,@,,,,,,@,,,,,,,,,,,,@,,,,,,,,,,,,@@,,,,,,,,,,,,@,,,,,,,,,,,,@@@:,,,  ", ",,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@;;@@,,  ", ",,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@;;@@:,  ", ",,@@,,,,,,,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@;;;;@:, ", ",,@@,,,,,,,,,,,,@,,,,,@@,,,,,@,,,,,,,,,,,,@@,,,,,,,,,,,,@,,,,,@@,,,,,@;;;;@@,,", ",,@@,,,,,,,,,,,,@,,,,,@@,,,,,@,,,,,,,,,,@@@@,,,,,,,,,,@@@,,,,,@@,,,,,@;;;;@@,,", ",,@@::::::::::::@:::::@@:::::@::::::::::@@@@::::::::::@@@:::::@@:::::@;;;;@@,,", ",,@@::::::::::::@::::::::::::@::::::::::::@@::::::::::::@:::::@@:::::@;;;;@@,,", ",,@@::::::::::::@::::::::::::@::::::@:::::@@:::::@::::::@:::::@@:::::@;;;;@@,,", ",,@@:::::@::::::@::::::::::::@::::::@:::::@@:::::@::::::@:::::@@:::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::@:::::@@:::::@::::::@:::::@@:::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::::::::@@::::::::::::@::::::::::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::::::::@@::::::::::::@::::::::::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::::::::@@:::::::::::@@@::::::::::@@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@:::::::::::@@@::::::::::@@@@::::::::::@@;;;;@@,,", ",,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;;;@@@@@@@@@@;;;;;;@@,,", ",,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;;@@@@@@@@@@@;;;;;@@@@@@@@@;;;;;;;@@,,", ",,,:@@;;;;@@;;;;;@@;;;;;@@;;;;@@;;;;;;;;;;;;@@;;;;;;;;;;;;;;@@;;;;;;;;;;;;@@,,", " ,,,@@;;;;;@@;;;;;@@;;;;@@;;;;;@@;;;;;;;;;;;@@;;;;;;;;;;;;;;@@;;;;;;;;;;;;@:,,", "  ,,,:@@;;;;@@;;;;;@@;;;;;@@;;;;@@;;;;;;;;;;@@@@;;;;;;;;;;@@@:@@;;;;;;;;@@:,, ", "   ,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:,@@@@@@@@@@@@,,, ", "    ,,,:::::::::::::::::::::::::::::::::::::::,::::::::::::,,,,,::::::::,,,,  ", "     ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,   ", "      ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,   ,,,,,,,,,,     ", "                                                                              ", "                                                                              "], e.FOOTER = ["                                                                              ", "                                                                   - Habbo Dev"], e.format = function(t) {
  3939.    var o = [],
  3940.     r = "";
  3941.    return t.split(" ").forEach(function(t) {
  3942.     r.length + t.length + 5 > e.HEADER[0].length && (o.push(r), r = ""), r += t + " "
  3943.    }), r && o.push(r), _.map(o, function(e) {
  3944.     return "  " + e.trim()
  3945.    })
  3946.   }, e
  3947.  }).run(["$log", "$translate", "warning", function(e, t, o) {
  3948.   t("CONSOLE_WARNING").then(function(t) {
  3949.    var r = o.format(t);
  3950.    e.info(o.HEADER.join("\n") + "\n" + r.join("\n") + "\n" + o.FOOTER.join("\n"))
  3951.   })
  3952.  }]), angular.module("compile", []).component("habboCompile", {
  3953.   bindings: {
  3954.    data: "<"
  3955.   },
  3956.   controller: ["$compile", "$element", "$scope", function(e, t, o) {
  3957.    var r = this;
  3958.    t.html(r.data), e(t.contents())(o)
  3959.   }]
  3960.  }), angular.module("columns", ["columns.channel", "columns.profile"]), angular.module("by.name.description.or.motto.filter", []).filter("byNameDescriptionOrMotto", function() {
  3961.   return function(e, t) {
  3962.    return _.filter(e, function(e) {
  3963.     return !t || e.name && _(e.name.toLowerCase()).includes(t.toLowerCase()) || e.description && _(e.description.toLowerCase()).includes(t.toLowerCase()) || e.motto && _(e.motto.toLowerCase()).includes(t.toLowerCase())
  3964.    })
  3965.   }
  3966.  }), angular.module("badge", ["config", "templates"]).component("habboBadge", {
  3967.   bindings: {
  3968.    code: "@",
  3969.    name: "@"
  3970.   },
  3971.   controller: ["CONFIG", function(e) {
  3972.    var t = this;
  3973.    t.badgeUrl = e.badgeUrl
  3974.   }],
  3975.   controllerAs: "BadgeController",
  3976.   templateUrl: "common/badge/badge.html"
  3977.  }), angular.module("avatar", ["encode.uri.component", "imager", "templates"]).component("habboAvatar", {
  3978.   bindings: {
  3979.    big: "@",
  3980.    user: "@"
  3981.   },
  3982.   controllerAs: "AvatarController",
  3983.   templateUrl: "common/avatar/avatar.html"
  3984.  }), angular.module("ios.download.link", ["config", "google.analytics"]).directive("habboIosDownloadLink", ["CONFIG", "googleAnalytics", function(e, t) {
  3985.   return {
  3986.    restrict: "A",
  3987.    link: function(o, r, a) {
  3988.     bowser.ios && (a.$set("href", e.appStoreUrl), a.$set("target", "_blank"), a.$set("rel", "noopener noreferrer"), r.click(function() {
  3989.      t.trackEvent("Download", "App Store")
  3990.     }))
  3991.    }
  3992.   }
  3993.  }]), angular.module("air.download.link", ["android.download.link", "ios.download.link"]), angular.module("android.download.link", ["config", "google.analytics"]).directive("habboAndroidDownloadLink", ["CONFIG", "googleAnalytics", function(e, t) {
  3994.   return {
  3995.    restrict: "A",
  3996.    link: function(o, r, a) {
  3997.     bowser.android && (a.$set("href", e.googlePlayUrl), a.$set("target", "_blank"), a.$set("rel", "noopener noreferrer"), r.click(function() {
  3998.      t.trackEvent("Download", "Google Play")
  3999.     }))
  4000.    }
  4001.   }
  4002.  }]), angular.module("ad.unit", ["ad.double.click", "security", "templates"]).component("habboAdUnit", {
  4003.   bindings: {
  4004.    unit: "@"
  4005.   },
  4006.   controller: ["$location", "Session", function(e, t) {
  4007.    var o = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,
  4008.     r = this;
  4009.    r.hasAds = t.hasAds, r.isAdsPrevented = function() {
  4010.     var t = e.search(),
  4011.      r = _(t).values().find(function(e) {
  4012.       return o.test(e)
  4013.      });
  4014.     return Boolean(r)
  4015.    }
  4016.   }],
  4017.   controllerAs: "AdUnitController",
  4018.   templateUrl: "common/ad-unit/ad-unit.html"
  4019.  }), angular.module("accordion", ["accordion.grid", "accordion.item", "accordion.item.content", "accordion.item.preview"]), angular.module("accordion.item.preview", []).component("habboAccordionItemPreview", {
  4020.   require: {
  4021.    AccordionItemController: "^habboAccordionItem"
  4022.   },
  4023.   controllerAs: "AccordionItemPreviewController",
  4024.   template: '<div ng-click="AccordionItemPreviewController.AccordionItemController.toggle()" ng-transclude></div>',
  4025.   transclude: !0
  4026.  }), angular.module("accordion.item.content", ["ngAnimate", "events", "templates"]).component("habboAccordionItemContent", {
  4027.   require: {
  4028.    AccordionItemController: "^habboAccordionItem"
  4029.   },
  4030.   controller: ["$animate", "$element", "$scope", "$timeout", "EVENTS", function(e, t, o, r, a) {
  4031.    function n() {
  4032.     m = u()
  4033.    }
  4034.  
  4035.    function i() {
  4036.     angular.isUndefined(m) && n(), c({
  4037.      height: 0,
  4038.      opacity: 0
  4039.     }, {
  4040.      height: m,
  4041.      opacity: 1
  4042.     }), p.height = m
  4043.    }
  4044.  
  4045.    function s() {
  4046.     c({
  4047.      height: m,
  4048.      opacity: 1
  4049.     }, {
  4050.      height: 0,
  4051.      opacity: 0
  4052.     }), m = void 0, p.height = 0, p.AccordionItemController.expanded = !1
  4053.    }
  4054.  
  4055.    function l() {
  4056.     0 !== p.height && r(function() {
  4057.      var e = u();
  4058.      c({
  4059.       height: p.height
  4060.      }, {
  4061.       height: e
  4062.      }), p.height = e
  4063.     })
  4064.    }
  4065.  
  4066.    function c(t, o) {
  4067.     d && e.cancel(d), d = e.animate(h, t, o)
  4068.    }
  4069.  
  4070.    function u() {
  4071.     var e = h.css("height", "").actual("outerHeight");
  4072.     return h.css("height", p.height), e
  4073.    }
  4074.    var d, m, p = this,
  4075.     h = t.children().first();
  4076.    p.height = 0, o.$on(a.accordionOpen, i), o.$on(a.accordionClose, s), o.$on(a.accordionResize, function() {
  4077.     n(), l()
  4078.    }), o.$on(a.accordionUpdate, l), o.$watch("AccordionItemContentController.height", function(e) {
  4079.     p.AccordionItemController.setContentHeight(e)
  4080.    })
  4081.   }],
  4082.   controllerAs: "AccordionItemContentController",
  4083.   templateUrl: "common/accordion/accordion-item-content.html",
  4084.   transclude: !0
  4085.  }), angular.module("accordion.item", ["events", "templates"]).component("habboAccordionItem", {
  4086.   require: {
  4087.    AccordionGridController: "^habboAccordionGrid"
  4088.   },
  4089.   controller: ["$element", "$scope", "EVENTS", function(e, t, o) {
  4090.    var r = this;
  4091.    r.expanded = !1, r.contentHeight = 0, r.offset = 0, r.$onInit = function() {
  4092.     r.AccordionGridController.registerItem(r)
  4093.    }, r.toggle = function() {
  4094.     r.expanded ? r.AccordionGridController.collapseItem(r) : (r.offset = e.offset().top, r.AccordionGridController.expandItem(r))
  4095.    }, r.setContentHeight = function(e) {
  4096.     r.contentHeight = e
  4097.    }, t.$watch("AccordionItemController.expanded", function(e, r) {
  4098.     e ? t.$broadcast(o.accordionOpen) : r && t.$broadcast(o.accordionClose)
  4099.    })
  4100.   }],
  4101.   controllerAs: "AccordionItemController",
  4102.   templateUrl: "common/accordion/accordion-item.html",
  4103.   transclude: !0
  4104.  }), angular.module("accordion.grid", ["events"]).component("habboAccordionGrid", {
  4105.   controller: ["$scope", "$window", "EVENTS", function(e, t, o) {
  4106.    function r() {
  4107.     angular.forEach(l, s.collapseItem)
  4108.    }
  4109.  
  4110.    function a(e, t) {
  4111.     return t && parseInt(t.offset, 10) < parseInt(e.offset, 10) ? e.offset - t.contentHeight : e.offset
  4112.    }
  4113.  
  4114.    function n() {
  4115.     e.$broadcast(o.accordionResize)
  4116.    }
  4117.    var i = 150,
  4118.     s = this,
  4119.     l = [];
  4120.    s.expandedItem = null, s.registerItem = function(e) {
  4121.     l.push(e)
  4122.    }, s.expandItem = function(e) {
  4123.     r(), e.expanded = !0, s.expandedItem = e
  4124.    }, s.collapseItem = function(e) {
  4125.     e.expanded && (e.expanded = !1, s.expandedItem = null)
  4126.    }, angular.element(t).on("orientationchange resize", n), e.$on("$destroy", function() {
  4127.     angular.element(t).off("orientationchange resize", n)
  4128.    }), e.$watch("HabboAccordionGridController.expandedItem", function(e, t) {
  4129.     if (e) {
  4130.      var o = a(e, t);
  4131.      angular.element("html, body").animate({
  4132.       scrollTop: o
  4133.      }, i)
  4134.     }
  4135.    })
  4136.   }],
  4137.   controllerAs: "HabboAccordionGridController",
  4138.   template: "<ul ng-transclude></ul>",
  4139.   transclude: !0
  4140.  }), angular.module("shop", ["config", "earn.credits", "header", "locale", "prepaid", "router", "shop.footer", "store", "subscriptions", "system.data", "tabs", "templates", "transactions"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4141.   e.statePublic("shop", {
  4142.    url: "/shop?country",
  4143.    "abstract": !0,
  4144.    controller: "ShopController",
  4145.    controllerAs: "ShopController",
  4146.    resolve: {
  4147.     countryCode: ["$stateParams", "SystemData", function(e, t) {
  4148.      return e.country || t.getShopCountry() || "all"
  4149.     }]
  4150.    },
  4151.    templateUrl: "shop/shop.html"
  4152.   }), t.when("/credits", "/shop")
  4153.  }]).controller("ShopController", ["CONFIG", function(e) {
  4154.   var t = this;
  4155.   t.earnCreditsEnabled = "true" === e.offerToroEnabled
  4156.  }]), angular.module("shop.filters", []).filter("credit", function() {
  4157.   return function(e) {
  4158.    return _.filter(e, function(e) {
  4159.     return e.creditAmount > 0
  4160.    })
  4161.   }
  4162.  }).filter("product", function() {
  4163.   return function(e) {
  4164.    return _.filter(e, function(e) {
  4165.     return 0 === e.creditAmount
  4166.    })
  4167.   }
  4168.  }).filter("paymentCategory", function() {
  4169.   return function(e, t) {
  4170.    return t ? _.filter(e, function(e) {
  4171.     return e.category === t
  4172.    }) : e
  4173.   }
  4174.  }).filter("payment", ["paymentCategoryFilter", function(e) {
  4175.   return function(t, o) {
  4176.    return _.filter(t, function(t) {
  4177.     return e(t.paymentMethods, o).length > 0
  4178.    })
  4179.   }
  4180.  }]), angular.module("shop.service", ["ngResource", "config", "safe.transform.response", "security", "storage"]).factory("Shop", ["$resource", "CONFIG", "Session", "httpCache", "safeTransformResponse", function(e, t, o, r, a) {
  4181.   function n(e) {
  4182.    return e = e || [], 1 === e.length ? [] : (e.unshift("all"), _.map(e, function(e) {
  4183.     return {
  4184.      key: e,
  4185.      translateKey: "SHOP_PAYMENT_METHOD_" + e.toUpperCase()
  4186.     }
  4187.    }))
  4188.   }
  4189.   var i = e(t.shopUrl + "/:resource/:subresource", {}, {
  4190.     countries: {
  4191.      url: t.shopUrl + "/:public/:subresource",
  4192.      method: "GET",
  4193.      isArray: !0,
  4194.      params: {
  4195.       subresource: "countries"
  4196.      },
  4197.      cache: r.longCache
  4198.     },
  4199.     inventory: {
  4200.      url: t.shopUrl + "/:public/inventory/:countryCode",
  4201.      method: "GET",
  4202.      cache: r.longCache,
  4203.      transformResponse: a.fromJson(function(e) {
  4204.       return e.paymentCategories = n(e.paymentCategories), e
  4205.      })
  4206.     },
  4207.     history: {
  4208.      url: t.shopUrl + "/history",
  4209.      method: "GET",
  4210.      isArray: !0
  4211.     }
  4212.    }),
  4213.    s = i.inventory,
  4214.    l = i.countries;
  4215.   return i.inventory = function() {
  4216.    return arguments[0] = arguments[0] || {}, _.extend(arguments[0], {
  4217.     "public": o.hasSession() ? null : "public"
  4218.    }), s.apply(this, arguments)
  4219.   }, i.countries = function() {
  4220.    return l.apply(this, [{
  4221.     "public": o.hasSession() ? null : "public"
  4222.    }])
  4223.   }, i
  4224.  }]), angular.module("settings.service", ["config", "google.analytics"]).factory("settings", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  4225.   var r = {};
  4226.   return r.changePassword = function(r) {
  4227.    return e.post(t.apiUrl + "/settings/password/change", r).then(function(e) {
  4228.     return o.trackEvent("Password", "Changed"), e
  4229.    })
  4230.   }, r.changeEmail = function(r) {
  4231.    return e.post(t.apiUrl + "/settings/email/change", r).then(function(e) {
  4232.     return o.trackEvent("Email", "Changed"), e
  4233.    })
  4234.   }, r.resendActivationEmail = function() {
  4235.    return e.post(t.apiUrl + "/settings/email/verification-resend").then(function(e) {
  4236.     return o.trackEvent("Email", "Activation resent"), e
  4237.    })
  4238.   }, r
  4239.  }]), angular.module("settings", ["account.security", "avatar.selection", "email.change", "header", "locale", "password.change", "privacy.settings", "router", "security", "tabs", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4240.   e.statePrivate("settings", {
  4241.    url: "/settings",
  4242.    "abstract": !0,
  4243.    templateUrl: "settings/settings.html"
  4244.   }), t.when("/settings", "/settings/privacy")
  4245.  }]), angular.module("security.service", ["config", "google.analytics", "security.fb", "security.session", "security.use.force.service"]).factory("security", ["$http", "$location", "$q", "$window", "CONFIG", "Session", "fbSecurity", "googleAnalytics", "useForce", function(e, t, o, r, a, n, i, s, l) {
  4246.   function c(e) {
  4247.    return l.handleForces(e)["catch"](function() {
  4248.     return u()["finally"](function() {
  4249.      return o.reject({
  4250.       status: "force.pending"
  4251.      })
  4252.     })
  4253.    })
  4254.   }
  4255.  
  4256.   function u() {
  4257.    return e.post(a.apiUrl + "/public/authentication/logout")
  4258.   }
  4259.  
  4260.   function d(e) {
  4261.    return n.destroy(), r.location.href = e || "/", o.defer().promise
  4262.   }
  4263.   var m = {};
  4264.   return m.init = function(e) {
  4265.    var t = e || r.session;
  4266.    return c(t).then(n.init)
  4267.   }, m.login = function(o) {
  4268.    return e.post(a.apiUrl + "/public/authentication/login", o).then(function(e) {
  4269.     return s.trackEvent("Login", "Credentials", t.path()), e.data
  4270.    }).then(c).then(n.create)
  4271.   }, m.fbLogin = function() {
  4272.    return i.login().then(function(o) {
  4273.     return e.post(a.apiUrl + "/public/authentication/facebook", o).then(function(e) {
  4274.      return s.trackEvent("Login", "Facebook", t.path()), e.data
  4275.     }).then(c).then(n.create)
  4276.    })
  4277.   }, m.logout = function(e) {
  4278.    return u().then(function() {
  4279.     return s.trackEvent("Logout", "Succeeded", t.path()), d(e)
  4280.    })["catch"](function() {
  4281.     return s.trackEvent("Logout", "Failed", t.path()), o.reject()
  4282.    })
  4283.   }, m.forceLogout = function(e) {
  4284.    return u()["finally"](function() {
  4285.     return s.trackEvent("Logout", "Forced", t.path()), d(e)
  4286.    })
  4287.   }, m
  4288.  }]), angular.module("security", ["security.authorization", "security.credentials", "security.fingerprint", "security.login", "security.safety.answering.modal", "security.safety.lock", "security.service", "security.session"]), angular.module("security.fb", ["ezfb"]).factory("fbSecurity", ["$q", "ezfb", function(e, t) {
  4289.   function o() {
  4290.    var o = e.defer();
  4291.    return t.getLoginStatus(function(e) {
  4292.     "connected" === e.status ? o.resolve(e.authResponse) : o.reject(e)
  4293.    }), o.promise
  4294.   }
  4295.  
  4296.   function r() {
  4297.    var o = e.defer();
  4298.    return t.login(function(e) {
  4299.     "connected" === e.status ? o.resolve(e.authResponse) : o.reject(e)
  4300.    }, {
  4301.     scope: "public_profile,email"
  4302.    }), o.promise
  4303.   }
  4304.   var a = {};
  4305.   return a.login = function() {
  4306.    return t.isSdkLoaded() ? o()["catch"](r) : e.reject({
  4307.     data: {
  4308.      message: "fb.sdk_not_loaded"
  4309.     }
  4310.    })
  4311.   }, a
  4312.  }]), angular.module("security.credentials", ["config"]).factory("credentials", ["CONFIG", function(e) {
  4313.   var t = {};
  4314.   return t.request = function(t) {
  4315.    return (_(t.url).includes(e.apiUrl) || _(t.url).includes(e.extraDataUrl) || _(t.url).includes(e.shopUrl)) && (t.withCredentials = !0), t
  4316.   }, t
  4317.  }]).config(["$httpProvider", function(e) {
  4318.   e.interceptors.push("credentials")
  4319.  }]), angular.module("security.authorization", ["security.login", "security.safety.lock", "security.session"]).factory("authorization", ["$q", "Session", "loginModal", "safetyLockModal", function(e, t, o, r) {
  4320.   var a = {};
  4321.   return a.hasAccessToPrivate = function() {
  4322.    return t.hasSession() ? e.when() : o.open()["catch"](function() {
  4323.     return e.reject({
  4324.      access: !1
  4325.     })
  4326.    })
  4327.   }, a.hasAccessToTrusted = function() {
  4328.    return a.hasAccessToPrivate().then(function() {
  4329.     return t.isTrusted() ? e.when() : r.open()["catch"](function() {
  4330.      return e.reject({
  4331.       access: !1
  4332.      })
  4333.     })
  4334.    })
  4335.   }, a.hasAccessToHabboAccountTrusted = function() {
  4336.    return a.hasAccessToTrusted().then(function() {
  4337.     return t.isHabboAccountSession() ? e.when() : e.reject({
  4338.      access: !1
  4339.     })
  4340.    })
  4341.   }, a
  4342.  }]), angular.module("router.service", ["security", "ui.router"]).config(["$locationProvider", "$urlMatcherFactoryProvider", function(e, t) {
  4343.   e.hashPrefix("!"), e.html5Mode({
  4344.    enabled: !0,
  4345.    requireBase: !1
  4346.   }), t.strictMode(!1)
  4347.  }]).config(["$stateProvider", function(e) {
  4348.   function t(e, t, l) {
  4349.    return t["abstract"] !== !0 && (o("auth", t), t.resolve.auth = ["$injector", function(e) {
  4350.     return a = a || e.get("$q"), n = n || e.get("$state"), i = i || e.get("authorization"), i[l]()["catch"](r)
  4351.    }]), s(e, t)
  4352.   }
  4353.  
  4354.   function o(e, t) {
  4355.    t.resolve = t.resolve || {}, _(t.resolve).keys().forEach(function(o) {
  4356.     _(t.resolve[o]).includes(e) || t.resolve[o].splice(t.resolve[o].length - 1, 0, e)
  4357.    })
  4358.   }
  4359.  
  4360.   function r(e) {
  4361.    return n.hasPrevious() || n.go("home.news"), a.reject(e)
  4362.   }
  4363.   var a, n, i, s = e.state;
  4364.   e.statePublic = function(e, t) {
  4365.    return s(e, t)
  4366.   }, e.statePrivate = function(e, o) {
  4367.    return t(e, o, "hasAccessToPrivate")
  4368.   }, e.state = function(e, o) {
  4369.    return t(e, o, "hasAccessToTrusted")
  4370.   }, e.stateHabboAccountTrusted = function(e, o) {
  4371.    return t(e, o, "hasAccessToHabboAccountTrusted")
  4372.   }
  4373.  }]).run(["$rootScope", "$state", "security", function(e, t, o) {
  4374.   var r = e.$on("$stateChangeStart", function(e, a, n) {
  4375.    e.preventDefault(), o.init()["finally"](function() {
  4376.     r(), t.go(a, n)
  4377.    })
  4378.   })
  4379.  }]), angular.module("refresh.dosarrest.cookie", []).factory("refreshDosarrestCookie", ["$q", "$window", function(e, t) {
  4380.   function o(e) {
  4381.    return e.match(/\.html$/)
  4382.   }
  4383.  
  4384.   function r(e) {
  4385.    return _.isString(e) && a.test(e)
  4386.   }
  4387.   var a = /<title>Client Validation<\/title>/gi,
  4388.    n = {};
  4389.   return n.response = function(a) {
  4390.    var n = e.defer();
  4391.    return !o(a.config.url) && r(a.data) ? t.location.reload() : n.resolve(a), n.promise
  4392.   }, n
  4393.  }]).config(["$httpProvider", function(e) {
  4394.   e.interceptors.push("refreshDosarrestCookie")
  4395.  }]), angular.module("prompt.safety.lock", ["http.buffer", "security"]).factory("promptSafetyLock", ["$injector", "$q", "httpBuffer", function(e, t, o) {
  4396.   function r(e) {
  4397.    return e.data && "account.safety_locked" === e.data.error
  4398.   }
  4399.  
  4400.   function a(e) {
  4401.    return _(e).includes("/public/forgotPassword")
  4402.   }
  4403.  
  4404.   function n(e) {
  4405.    var r = t.defer();
  4406.    return o.pushError(e.config, r), i().open().then(o.flush)["catch"](function() {
  4407.     o.reject(403)
  4408.    }), r.promise
  4409.   }
  4410.  
  4411.   function i() {
  4412.    return s || e.get("safetyLockModal")
  4413.   }
  4414.   var s, l = {};
  4415.   return l.responseError = function(e) {
  4416.    return e && r(e) && !a(e.config.url) ? n(e) : t.reject(e)
  4417.   }, l
  4418.  }]).config(["$httpProvider", function(e) {
  4419.   e.interceptors.push("promptSafetyLock")
  4420.  }]), angular.module("prompt.login", ["http.buffer", "security"]).factory("promptLogin", ["$injector", "$location", "$q", "Session", "httpBuffer", function(e, t, o, r, a) {
  4421.   function n(e) {
  4422.    return _(e).includes("/login") || _(e).includes("/facebook") || _(e).includes("/logout")
  4423.   }
  4424.  
  4425.   function i() {
  4426.    return u || e.get("security")
  4427.   }
  4428.  
  4429.   function s(e) {
  4430.    var t = o.defer(),
  4431.     r = l();
  4432.    return a.pushError(e.config, t), r.isOpen() || r.open().then(a.flush)["catch"](function() {
  4433.     a.reject(401)
  4434.    }), t.promise
  4435.   }
  4436.  
  4437.   function l() {
  4438.    return c || e.get("loginModal")
  4439.   }
  4440.   var c, u, d = {};
  4441.   return d.responseError = function(e) {
  4442.    return e && 401 === e.status && !n(e.config.url) ? r.hasSession() ? i().forceLogout(t.url()) : s(e) : o.reject(e)
  4443.   }, d
  4444.  }]).config(["$httpProvider", function(e) {
  4445.   e.interceptors.push("promptLogin")
  4446.  }]), angular.module("error.maintenance", ["notifier"]).factory("maintenanceError", ["$q", "notifier", function(e, t) {
  4447.   var o = {};
  4448.   return o.responseError = function(o) {
  4449.    return 503 === o.status && t.error("ERROR_SERVER_MAINTENANCE"), e.reject(o)
  4450.   }, o
  4451.  }]).config(["$httpProvider", function(e) {
  4452.   e.interceptors.push("maintenanceError")
  4453.  }]), angular.module("router", ["ban.error", "error.maintenance", "head", "prerender", "prompt.login", "prompt.safety.lock", "refresh.dosarrest.cookie", "router.service", "scrolltop", "spinner"]), angular.module("http.buffer", []).factory("httpBuffer", ["$injector", function(e) {
  4454.   function t(t, r) {
  4455.    o = o || e.get("$http"), o(t).then(function(e) {
  4456.     r.resolve(e)
  4457.    })["catch"](function(e) {
  4458.     r.reject(e)
  4459.    })
  4460.   }
  4461.   var o, r = {},
  4462.    a = [];
  4463.   return r.pushError = function(e, t) {
  4464.    a.push({
  4465.     config: e,
  4466.     deferred: t
  4467.    })
  4468.   }, r.flush = function() {
  4469.    angular.forEach(a, function(e) {
  4470.     t(e.config, e.deferred)
  4471.    }), a = []
  4472.   }, r.reject = function(e) {
  4473.    angular.forEach(a, function(t) {
  4474.     t.deferred.reject({
  4475.      status: e,
  4476.      data: {}
  4477.     })
  4478.    }), a = []
  4479.   }, r
  4480.  }]), angular.module("room", ["flash", "locale", "remove.on.error", "room.open", "room.restricted", "room.service", "router", "templates"]).config(["$stateProvider", function(e) {
  4481.   e.statePublic("room", {
  4482.    url: "/room/:id",
  4483.    controller: "RoomController",
  4484.    controllerAs: "RoomController",
  4485.    onEnter: ["room", "Head", function(e, t) {
  4486.     function o(e) {
  4487.      return e.replace(/[|ƒ†‡‘•—¥ª¬±µ¶º»]/g, " ").replace(/[ ]+/g, " ").trim()
  4488.     }
  4489.     t.title = o(e.name)
  4490.    }],
  4491.    resolve: {
  4492.     room: ["$stateParams", "Room", function(e, t) {
  4493.      return t.get({
  4494.       id: e.id
  4495.      }).$promise
  4496.     }]
  4497.    },
  4498.    templateUrl: "room/room.html"
  4499.   })
  4500.  }]).controller("RoomController", ["room", function(e) {
  4501.   var t = this;
  4502.   t.room = e
  4503.  }]), angular.module("room.service", ["ngResource", "config", "storage"]).factory("Room", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  4504.   return e(t.apiUrl + "/public/rooms/:id", null, {
  4505.    get: {
  4506.     method: "GET",
  4507.     cache: o.shortCache
  4508.    }
  4509.   })
  4510.  }]), angular.module("registration.service", ["config", "google.analytics", "registration.age.gate", "security"]).factory("registration", ["$http", "$q", "$window", "CONFIG", "ageGate", "googleAnalytics", "security", function(e, t, o, r, a, n, i) {
  4511.   var s = {};
  4512.   return s.register = function(s) {
  4513.    return a.register(s.birthdate), a.isLocked() ? t.reject({
  4514.     data: {
  4515.      error: "age"
  4516.     }
  4517.    }) : e.post(r.apiUrl + "/public/registration/new", s).then(function(e) {
  4518.     var r = t.defer();
  4519.     return 204 === e.status ? (n.trackEvent("Registration", "Registered", "Staff"), r.resolve(e)) : (n.trackEvent("Registration", "Registered", "User"), o.piwikTrack && (o._spef.push(["trackGoal", 1]), o.piwikTrack()), i.init(e.data).then(function() {
  4520.      r.resolve(e)
  4521.     })), r.promise
  4522.    })
  4523.   }, s
  4524.  }]), angular.module("registration", ["events", "header", "hotel.closed", "locale", "registration.form", "router", "security", "system.data", "templates"]).config(["$stateProvider", function(e) {
  4525.   e.statePublic("registration", {
  4526.    url: "/registration?captchaToken",
  4527.    controller: "RegistrationController",
  4528.    controllerAs: "RegistrationController",
  4529.    data: {
  4530.     title: "HEAD_TITLE_REGISTRATION"
  4531.    },
  4532.    templateUrl: "registration/registration.html"
  4533.   })
  4534.  }]).controller("RegistrationController", ["$scope", "$state", "EVENTS", "SystemData", function(e, t, o, r) {
  4535.   var a = this;
  4536.   a.isOpen = r.isHotelOpen(), e.$on(o.securityLogin, function() {
  4537.    t.go("home.news", null, {
  4538.     location: "replace"
  4539.    })
  4540.   })
  4541.  }]).run(["$rootScope", "$state", "Session", function(e, t, o) {
  4542.   e.$on("$stateChangeStart", function(e, r) {
  4543.    "registration" === r.name && (o.hasSession() || bowser.android || bowser.ios) && (e.preventDefault(), t.go("home.news"))
  4544.   })
  4545.  }]), angular.module("registration.form", ["ngMessages", "birthdate", "config", "form", "google.analytics", "locale", "notifier", "registration.partner", "registration.policies", "registration.service", "router", "security", "system.data", "templates"]).component("habboRegistrationForm", {
  4546.   controller: ["$scope", "$state", "$stateParams", "CAPTCHA_EVENTS", "CONFIG", "SystemData", "googleAnalytics", "notifier", "registration", function(e, t, o, r, a, n, i, s, l) {
  4547.    function c() {
  4548.     return "hhtr" === a.hotel
  4549.    }
  4550.    var u = this;
  4551.    u.hasCaptchaToken = Boolean(o.captchaToken), u.registration = {
  4552.     captchaToken: o.captchaToken
  4553.    }, u.registerInProgress = !1, u.showPartnerRegistration = n.isIDCGamesCountry() || c(), u.register = function() {
  4554.     var o = _(e.registrationForm.$error).values().flatten().map("$name").uniq().sort().join(", ");
  4555.     i.trackEvent("Registration", "Clicked", o), e.registrationForm.$valid && (u.registerInProgress = !0, l.register(u.registration).then(function(e) {
  4556.      204 === e.status ? t.go("home.news") : t.go("hotel")
  4557.     })["catch"](function(t) {
  4558.      var o = t.data && t.data.error;
  4559.      "age" === o ? s.error("ERROR_BIRTHDATE_AGE") : ("registration_email" === o || "registration.error.invalid_email" === o ? e.$broadcast("remote-data-invalid", "emailInvalid") : "registration_email_in_use" === o ? e.$broadcast("remote-data-invalid", "emailUsedInRegistration") : 429 === t.status ? s.error("ERROR_TOO_MANY_ATTEMPTS", {
  4560.       time: moment(t.data.nextValidRequestDate).fromNow(!0)
  4561.      }) : s.error("ERROR_SERVER"), e.$broadcast(r.reset))
  4562.     })["finally"](function() {
  4563.      u.registerInProgress = !1
  4564.     }))
  4565.    }, u.fbRegister = function() {
  4566.     t.go("hotel")
  4567.    }
  4568.   }],
  4569.   controllerAs: "RegistrationFormController",
  4570.   templateUrl: "registration/registration-form.html"
  4571.  }), angular.module("registration.age.gate", ["config", "google.analytics", "local.storage"]).factory("ageGate", ["CONFIG", "googleAnalytics", "localStorage", function(e, t, o) {
  4572.   function r(t) {
  4573.    return moment({
  4574.     day: t.day,
  4575.     month: t.month - 1,
  4576.     year: t.year
  4577.    }).add(e.minAge, "years").isAfter(moment())
  4578.   }
  4579.   var a = {},
  4580.    n = !1;
  4581.   return a.register = function(e) {
  4582.    r(e) && (n = !0, o.set("ageGate", !0), t.trackEvent("Registration", "Age gate", moment(e).format("YYYY-MM-DD")))
  4583.   }, a.isLocked = function() {
  4584.    return n || o.get("ageGate")
  4585.   }, a
  4586.  }]), angular.module("profile", ["header", "locale", "profile.creations", "profile.header", "profile.item.lists", "profile.modal", "profile.service", "router", "security", "social.share", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4587.   e.statePublic("profile", {
  4588.    url: "/profile/:name",
  4589.    controller: "ProfileController",
  4590.    controllerAs: "ProfileController",
  4591.    data: {
  4592.     title: "HEAD_TITLE_PROFILE"
  4593.    },
  4594.    resolve: {
  4595.     profile: ["$stateParams", "Profile", function(e, t) {
  4596.      return t.get({
  4597.       name: e.name
  4598.      }).$promise
  4599.     }]
  4600.    },
  4601.    templateUrl: "profile/profile.html"
  4602.   }), t.when("/home/:name", "/profile/:name"), t.when("/profile", "/")
  4603.  }]).controller("ProfileController", ["CreationsProfile", "Profile", "Session", "profile", function(e, t, o, r) {
  4604.   var a = this;
  4605.   a.profile = r, o.hasSession() && r.uniqueId === o.user.uniqueId ? a.items = t["private"]() : r.profileVisible && (a.items = t.items({
  4606.    uniqueId: r.uniqueId
  4607.   })), a.stories = e.stories({
  4608.    uniqueId: r.uniqueId
  4609.   }), a.photos = e.photos({
  4610.    uniqueId: r.uniqueId
  4611.   }), a.random = function() {
  4612.    return .5 - Math.random()
  4613.   }
  4614.  }]), angular.module("profile.service", ["ngResource", "config", "storage"]).factory("Profile", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  4615.   return e(t.apiUrl + "/public/users/:uniqueId/:resource", null, {
  4616.    get: {
  4617.     method: "GET",
  4618.     cache: o.shortCache
  4619.    },
  4620.    items: {
  4621.     method: "GET",
  4622.     params: {
  4623.      resource: "profile"
  4624.     },
  4625.     cache: o.shortCache
  4626.    },
  4627.    "private": {
  4628.     method: "GET",
  4629.     url: t.apiUrl + "/user/profile",
  4630.     cache: o.shortCache
  4631.    }
  4632.   })
  4633.  }]), angular.module("profile.creations", ["ngResource", "config", "profile.service", "reported.photos", "safe.transform.response", "storage"]).factory("CreationsProfile", ["$resource", "CONFIG", "Profile", "httpCache", "reportedPhotosFilter", "safeTransformResponse", function(e, t, o, r, a, n) {
  4634.   function i(e) {
  4635.    return function(t) {
  4636.     return o.get({
  4637.      name: t
  4638.     }).$promise.then(function(t) {
  4639.      return s[e]({
  4640.       uniqueId: t.uniqueId
  4641.      }).$promise
  4642.     })
  4643.    }
  4644.   }
  4645.   var s = e(t.extraDataUrl + "/public/users/:uniqueId/:resource", null, {
  4646.    photos: {
  4647.     method: "GET",
  4648.     isArray: !0,
  4649.     params: {
  4650.      resource: "photos"
  4651.     },
  4652.     cache: r.shortCache,
  4653.     transformResponse: n.fromJson(function(e) {
  4654.      var t = a(e);
  4655.      return _.map(t, function(e) {
  4656.       return _.assign(e, {
  4657.        url: "https:" + e.url,
  4658.        contentHeight: 320,
  4659.        contentWidth: 320,
  4660.        parentTitle: "PHOTOS_TITLE"
  4661.       })
  4662.      })
  4663.     })
  4664.    },
  4665.    stories: {
  4666.     method: "GET",
  4667.     isArray: !0,
  4668.     params: {
  4669.      resource: "stories"
  4670.     },
  4671.     cache: r.shortCache,
  4672.     transformResponse: n.fromJson(function(e) {
  4673.      return _.map(e, function(e) {
  4674.       return e.url && -1 === e.url.indexOf("https:") && (e.url = "https:" + e.url), e
  4675.      })
  4676.     })
  4677.    }
  4678.   });
  4679.   return s.photosForUser = i("photos"), s.storiesForUser = i("stories"), s
  4680.  }]), angular.module("playing.habbo", ["ad.unit", "header", "locale", "router", "tabs", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4681.   var o = ["what-is-habbo", "how-to-play", "habbo-way", "safety", "help"];
  4682.   e.statePublic("playingHabbo", {
  4683.    url: "/playing-habbo",
  4684.    templateUrl: "playing-habbo/playing-habbo.html",
  4685.    "abstract": !0
  4686.   }), _.forEach(o, function(t) {
  4687.    var o = "HEAD_TITLE_PLAYING_HABBO_" + t.toUpperCase().replace(/-/g, "_");
  4688.    e.statePublic("playingHabbo." + t, {
  4689.     url: "/" + t,
  4690.     controller: "PlayingHabboController",
  4691.     controllerAs: "PlayingHabboController",
  4692.     data: {
  4693.      title: o
  4694.     },
  4695.     resolve: {
  4696.      page: ["webPages", function(e) {
  4697.       return e.get("playing_habbo/" + _.snakeCase(t))
  4698.      }]
  4699.     },
  4700.     templateUrl: "playing-habbo/" + t + ".html"
  4701.    })
  4702.   }), t.when("/playing-habbo", "/playing-habbo/what-is-habbo")
  4703.  }]).controller("PlayingHabboController", ["page", function(e) {
  4704.   var t = this;
  4705.   t.page = e
  4706.  }]), angular.module("password.reset.service", ["config", "google.analytics"]).factory("passwordReset", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  4707.   var r = {};
  4708.   return r.send = function(r) {
  4709.    return e.post(t.apiUrl + "/public/forgotPassword/send", {
  4710.     email: r
  4711.    }).then(function(e) {
  4712.     return o.trackEvent("Password", "Reset requested"), e
  4713.    })
  4714.   }, r.changePassword = function(r) {
  4715.    return e.post(t.apiUrl + "/public/forgotPassword/changePassword", r).then(function(e) {
  4716.     return o.trackEvent("Password", "Password reset"), e
  4717.    })
  4718.   }, r
  4719.  }]), angular.module("password.reset", ["header", "locale", "password.reset.form", "router", "security", "templates"]).config(["$stateProvider", function(e) {
  4720.   e.statePublic("resetPassword", {
  4721.    url: "/reset-password/:token",
  4722.    controller: "PasswordResetController",
  4723.    controllerAs: "PasswordResetController",
  4724.    data: {
  4725.     title: "HEAD_TITLE_PASSWORD_RESET"
  4726.    },
  4727.    onEnter: ["$location", "security", "Session", function(e, t, o) {
  4728.     return o.hasSession() ? t.forceLogout(e.url()) : void 0
  4729.    }],
  4730.    templateUrl: "password-reset/password-reset.html"
  4731.   })
  4732.  }]).controller("PasswordResetController", ["$stateParams", function(e) {
  4733.   var t = this;
  4734.   t.token = e.token
  4735.  }]), angular.module("password.reset.form", ["form", "locale", "notifier", "password.reset.service", "router", "security", "templates"]).component("habboPasswordResetForm", {
  4736.   bindings: {
  4737.    token: "<"
  4738.   },
  4739.   controller: ["$scope", "$state", "notifier", "passwordReset", "safetyAnsweringModal", function(e, t, o, r, a) {
  4740.    function n() {
  4741.     o.success("PASSWORD_RESET_SUCCESS"), t.go("home.news")
  4742.    }
  4743.    var i = this;
  4744.    i.passwords = {}, i.updateInProgress = !1, i.update = function() {
  4745.     if (e.resetPasswordForm.$valid) {
  4746.      i.updateInProgress = !0;
  4747.      var t = {
  4748.       token: i.token,
  4749.       password: i.passwords.password
  4750.      };
  4751.      r.changePassword(t).then(n)["catch"](function(i) {
  4752.       var s = i.data && i.data.error;
  4753.       return 403 === i.status && "account.safety_locked" === s ? a.open(i.data.questions, t, r.changePassword).then(n) : void(404 === i.status ? o.error("ERROR_PASSWORD_RESET_EXPIRED") : "password.too_similar_to_username" === s ? e.$broadcast("remote-data-invalid", "passwordName") : "password.too_similar_to_email" === s ? e.$broadcast("remote-data-invalid", "passwordEmail") : "password.used_earlier" === s ? e.$broadcast("remote-data-invalid", "passwordUsed") : o.error("ERROR_SERVER"))
  4754.      })["finally"](function() {
  4755.       i.updateInProgress = !1
  4756.      })
  4757.     }
  4758.    }
  4759.   }],
  4760.   controllerAs: "PasswordResetFormController",
  4761.   templateUrl: "password-reset/password-reset-form.html"
  4762.  }), angular.module("not.found", ["google.analytics", "header", "locale", "router", "templates"]).config(["$stateProvider", function(e) {
  4763.   e.statePublic("notFound", {
  4764.    templateUrl: "not-found/not-found.html",
  4765.    data: {
  4766.     title: "HEAD_TITLE_NOT_FOUND"
  4767.    }
  4768.   })
  4769.  }]).config(["$urlRouterProvider", function(e) {
  4770.   e.otherwise(function(e, t) {
  4771.    var o = e.get("googleAnalytics"),
  4772.     r = e.get("$state");
  4773.    o.trackEvent("Error", "Not found", t.url()), r.go("notFound")
  4774.   })
  4775.  }]).run(["$location", "$log", "$rootScope", "$state", "googleAnalytics", function(e, t, o, r, a) {
  4776.   o.$on("$stateChangeError", function(o, n, i, s, l, c) {
  4777.    c && c.access === !1 || (o.preventDefault(), t.error(c), a.trackEvent("Error", "Not found", e.url()), r.go("notFound"))
  4778.   })
  4779.  }]), angular.module("logout", ["locale", "notifier", "router", "security"]).config(["$stateProvider", function(e) {
  4780.   e.statePublic("logout", {
  4781.    url: "/logout",
  4782.    resolve: {
  4783.     logout: ["$state", "notifier", "security", function(e, t, o) {
  4784.      return o.logout()["catch"](function() {
  4785.       e.go("home.news"), t.errorSticky("ERROR_LOGOUT_TITLE", "ERROR_LOGOUT_TEXT")
  4786.      })
  4787.     }]
  4788.    }
  4789.   })
  4790.  }]), angular.module("hotel", ["client", "events", "locale", "router", "security", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4791.   e.statePrivate("hotel", {
  4792.    url: "/hotel?link&room",
  4793.    controller: "HotelController",
  4794.    data: {
  4795.     title: "HEAD_TITLE_HOTEL"
  4796.    },
  4797.    template: '<div class="hotel"></div>'
  4798.   }), t.when("/client", "/hotel")
  4799.  }]).controller("HotelController", ["$rootScope", "$stateParams", "$timeout", "EVENTS", "Session", "safetyLockModal", function(e, t, o, r, a, n) {
  4800.   a.isTrusted() || n.open(), o(function() {
  4801.    e.$broadcast(r.clientOpen, t)
  4802.   })
  4803.  }]), angular.module("home", ["header", "locale", "messaging", "news", "register.banner", "router", "tabs", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4804.   e.statePublic("home", {
  4805.    url: "?captchaToken",
  4806.    "abstract": !0,
  4807.    controller: "HomeController",
  4808.    controllerAs: "HomeController",
  4809.    templateUrl: "home/home.html"
  4810.   }), t.when("/login_popup", "/")
  4811.  }]).controller("HomeController", ["$state", "Session", function(e, t) {
  4812.   var o = this;
  4813.   o.hasHeaderLarge = function() {
  4814.    return !t.hasSession() && e.is("home.news")
  4815.   }
  4816.  }]), angular.module("help.login", ["router", "security", "zendesk.url"]).config(["$stateProvider", function(e) {
  4817.   e.statePrivate("helpLogin", {
  4818.    url: "/help-login?return_to",
  4819.    controller: "HelpLoginController",
  4820.    data: {
  4821.     title: "HEAD_TITLE_HELP_LOGIN"
  4822.    },
  4823.    template: '<div class="help-login-backdrop"></div>'
  4824.   })
  4825.  }]).controller("HelpLoginController", ["$stateParams", "$window", "zendeskRedirectUrlFilter", function(e, t, o) {
  4826.   t.location.href = o(e.return_to, !0)
  4827.  }]), angular.module("dev", ["header", "router", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  4828.   e.statePublic("dev", {
  4829.    url: "/dev/:page",
  4830.    templateUrl: "dev/dev.html",
  4831.    controller: "DevController",
  4832.    controllerAs: "DevController"
  4833.   })
  4834.  }]).controller("DevController", ["$stateParams", function(e) {
  4835.   var t = this;
  4836.   t.page = e.page.replace(/-/g, "_")
  4837.  }]), angular.module("ui.router").config(["$provide", function(e) {
  4838.   e.decorator("$state", ["$delegate", "$rootScope", function(e, t) {
  4839.    var o, r;
  4840.    return e.hasPrevious = function() {
  4841.     return Boolean(o) && Boolean(o.name)
  4842.    }, e.back = function() {
  4843.     e.hasPrevious() ? e.go(o.name, r) : e.go("home.news")
  4844.    }, t.$on("$stateChangeSuccess", function(e, t, a, n, i) {
  4845.     o = n, r = i
  4846.    }), e
  4847.   }])
  4848.  }]), angular.module("ui.bootstrap").config(["$provide", function(e) {
  4849.   e.decorator("$uibModal", ["$delegate", "$rootScope", function(e, t) {
  4850.    var o = e.open;
  4851.    return e.open = function(e) {
  4852.     var r, a, n = o(e);
  4853.     return n.open = !0, r = t.$on("$stateChangeSuccess", function() {
  4854.      n.dismiss("cancel")
  4855.     }), a = t.$on("$locationChangeSuccess", function(e, t, o) {
  4856.      t !== o && n.dismiss("cancel")
  4857.     }), n.result["finally"](function() {
  4858.      n.open = !1, r(), a()
  4859.     }), n
  4860.    }, e
  4861.   }])
  4862.  }]), angular.module("ezfb").config(["$provide", "ezfbProvider", function(e, t) {
  4863.   var o = !1;
  4864.   t.setLoadSDKFunction(["$window", "$document", "ezfbAsyncInit", "ezfbLocale", function(e, t, r, a) {
  4865.    var n = t[0].createElement("script");
  4866.    n.id = "facebook-jssdk", n.async = !0, n.src = "//connect.facebook.net/" + a + "/sdk.js", t[0].body.appendChild(n), e.fbAsyncInit = function() {
  4867.     r(), o = !0
  4868.    }
  4869.   }]), e.decorator("ezfb", ["$delegate", function(e) {
  4870.    return e.isSdkLoaded = function() {
  4871.     return o
  4872.    }, e
  4873.   }])
  4874.  }]), angular.module("community", ["article", "category", "fansites", "header", "photos", "rooms", "router", "tabs", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4875.   e.statePublic("community", {
  4876.    url: "/community",
  4877.    "abstract": !0,
  4878.    templateUrl: "community/community.html"
  4879.   }), t.when("/community", "/community/photos")
  4880.  }]), angular.module("activate.service", ["config", "google.analytics", "security"]).factory("activate", ["$http", "CONFIG", "Session", "googleAnalytics", function(e, t, o, r) {
  4881.   return function(a) {
  4882.    return e.post(t.apiUrl + "/public/registration/activate", {
  4883.     token: a
  4884.    }).then(function(e) {
  4885.     r.trackEvent("Email", "Activated"), 200 === e.status && o.hasSession() && o.update(e.data)
  4886.    })
  4887.   }
  4888.  }]), angular.module("activate", ["activate.service", "locale", "notifier", "router"]).config(["$stateProvider", function(e) {
  4889.   e.statePublic("activate", {
  4890.    url: "/activate/:token",
  4891.    controller: "ActivateController",
  4892.    resolve: {
  4893.     activation: ["$stateParams", "activate", function(e, t) {
  4894.      return t(e.token)
  4895.     }]
  4896.    }
  4897.   })
  4898.  }]).controller("ActivateController", ["$state", "notifier", function(e, t) {
  4899.   t.success("ACTIVATE_SUCCESS"), e.go("home.news")
  4900.  }]), angular.module("templates", []).run(["$templateCache", function(e) {
  4901.   e.put("community/community.html", '<habbo-header-small active="community"></habbo-header-small><habbo-tabs><habbo-tab path="/community/photos" translation-key="COMMUNITY_PHOTOS_TAB"></habbo-tab><habbo-tab path="/community/rooms" translation-key="COMMUNITY_ROOMS_TAB"></habbo-tab><habbo-tab path="/community/fansites" translation-key="COMMUNITY_FANSITES_TAB"></habbo-tab><habbo-tab path="/community/category" alternative-path="/community/article" translation-key="COMMUNITY_NEWS_TAB"></habbo-tab></habbo-tabs><main ui-view></main>'), e.put("dev/dev.html", '<habbo-header-small></habbo-header-small><section class="wrapper wrapper--content"><habbo-web-pages key="{{:: \'dev/\' + DevController.page}}" class="main"></habbo-web-pages><habbo-web-pages key="{{:: \'dev/\' + DevController.page + \'_box\'}}" class="aside aside--box aside--push-down"></habbo-web-pages></section>'), e.put("home/home.html", '<habbo-header-small ng-if="!HomeController.hasHeaderLarge()" active="home"></habbo-header-small><habbo-header-large ng-if="HomeController.hasHeaderLarge()" active="home"><habbo-register-banner></habbo-register-banner></habbo-header-large><habbo-tabs><habbo-tab path="/" strict-path="true" translation-key="HOME_NEWS_TAB"></habbo-tab><habbo-tab habbo-require-session path="/messaging" translation-key="HOME_MESSAGING_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content" ui-view></main>'), e.put("not-found/not-found.html", '<habbo-header-small></habbo-header-small><main class="wrapper wrapper--content not-found"><section class="not-found__content"><h3 translate="NOT_FOUND_PAGE_TITLE"></h3><div translate="NOT_FOUND_PAGE_TEXT"></div></section></main>'), e.put("password-reset/password-reset-form.html", '<form ng-submit="PasswordResetFormController.update()" name="resetPasswordForm" novalidate class="form form--left"><habbo-password-new is-new="true" password-new="PasswordResetFormController.passwords.password" password-new-repeated="PasswordResetFormController.passwords.passwordRepeated"></habbo-password-new><div class="form__footer"><button ng-disabled="PasswordResetFormController.updateInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'), e.put("password-reset/password-reset.html", '<habbo-header-small></habbo-header-small><main class="wrapper wrapper--content"><h1 translate="PASSWORD_RESET_TITLE"></h1><habbo-password-reset-form token="PasswordResetController.token" class="password-reset-form"></habbo-password-reset-form></main>'), e.put("playing-habbo/habbo-way.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages>'), e.put("playing-habbo/help.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-web-pages key="playing_habbo/box_helplines" class="aside aside--box aside--fixed aside--push-down"></habbo-web-pages>'), e.put("playing-habbo/how-to-play.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_habbo_way" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_need_help" class="aside aside--box aside--fixed"></habbo-web-pages>'), e.put("playing-habbo/playing-habbo.html", '<habbo-header-small active="playingHabbo"></habbo-header-small><habbo-tabs><habbo-tab path="/playing-habbo/what-is-habbo" translation-key="PLAYING_HABBO_WHAT_IS_HABBO_TAB"></habbo-tab><habbo-tab path="/playing-habbo/how-to-play" translation-key="PLAYING_HABBO_HOW_TO_PLAY_TAB"></habbo-tab><habbo-tab path="/playing-habbo/habbo-way" translation-key="PLAYING_HABBO_HABBO_WAY_TAB"></habbo-tab><habbo-tab path="/playing-habbo/safety" translation-key="PLAYING_HABBO_SAFETY_TAB"></habbo-tab><habbo-tab path="/playing-habbo/help" translation-key="PLAYING_HABBO_HELP_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content" ui-view></main>'),
  4902.    e.put("playing-habbo/safety.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_need_help" class="aside aside--box aside--fixed"></habbo-web-pages>'), e.put("playing-habbo/what-is-habbo.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_how_to_play" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_habbo_way" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages>'), e.put("profile/profile.html", '<habbo-header-small class="profile__header"><habbo-profile-header figure="{{:: ProfileController.profile.figureString}}" user="{{:: ProfileController.profile.name}}" motto="{{:: ProfileController.profile.motto}}" profile="true"><h1>{{:: ProfileController.profile.name}}</h1><div ng-if="ProfileController.profile.motto" class="profile__motto">{{:: ProfileController.profile.motto}}</div></habbo-profile-header></habbo-header-small><habbo-social-share type="profile"></habbo-social-share><main class="wrapper wrapper--content"><div ng-if="ProfileController.items.badges.length > 0\n                || ProfileController.items.friends.length > 0\n                || ProfileController.items.rooms.length > 0\n                || ProfileController.items.groups.length > 0" class="profile__section"><div ng-if="ProfileController.profile.selectedBadges.length > 0" class="profile__card__wrapper--badges"><section class="profile__card__aligner"><div class="profile__card"><h2 translate="PROFILE_BADGES_TITLE" class="profile__card__title"></h2><habbo-badge-list badges="ProfileController.profile.selectedBadges" class="item-list--grid"></habbo-badge-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.badges" type="badges"></habbo-profile-modal></div></div></section></div><div ng-if="ProfileController.items.friends.length > 0" class="profile__card__wrapper--friends"><section class="profile__card__aligner"><div class="profile__card"><h2 class="profile__card__title"><span translate="PROFILE_FRIENDS_TITLE"></span> <span class="profile__friends__count" translate="PROFILE_FRIENDS_COUNT" translate-values="{ current: ProfileController.items.friends.length > 5 ? 5 : ProfileController.items.friends.length, all: ProfileController.items.friends.length }"></span></h2><habbo-friend-list ng-init="fiveFriends = (ProfileController.items.friends | orderBy: random | limitTo: 5)" friends="fiveFriends" class="item-list--grid"></habbo-friend-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.friends" type="friends"></habbo-profile-modal></div></div></section></div><div ng-if="ProfileController.items.rooms.length > 0" class="profile__card__wrapper--rooms"><section class="profile__card__aligner"><div class="profile__card"><h2 translate="PROFILE_ROOMS_TITLE" class="profile__card__title"></h2><habbo-room-list ng-init="fiveRooms = (ProfileController.items.rooms | orderBy: random | limitTo: 5)" rooms="fiveRooms" class="item-list--grid"></habbo-room-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.rooms" type="rooms"></habbo-profile-modal></div></div></section></div><div ng-if="ProfileController.items.groups.length > 0" class="profile__card__wrapper--groups"><section class="profile__card__aligner"><div class="profile__card"><h2 translate="PROFILE_GROUPS_TITLE" class="profile__card__title"></h2><habbo-group-list ng-init="fiveGroups = (ProfileController.items.groups | orderBy: random | limitTo: 5)" groups="fiveGroups" class="item-list--grid"></habbo-group-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.groups" type="groups"></habbo-profile-modal></div></div></section></div></div></main><section ng-if="ProfileController.photos.length > 0" class="wrapper wrapper--content"><div class="profile__creations"><h2 class="profile__creations__title" translate="PROFILE_PHOTOS_TITLE"></h2><habbo-columns-profile items="ProfileController.photos"></habbo-columns-profile><a href="/community/photos" class="profile__photos__link" translate="PHOTOS_TITLE"></a></div></section><section ng-if="ProfileController.stories.length > 0" class="wrapper wrapper--content"><div class="profile__creations"><h2 class="profile__creations__title" translate="PROFILE_CREATIONS_TITLE"></h2><habbo-columns-profile items="ProfileController.stories"></habbo-columns-profile></div></section><footer class="wrapper wrapper--content"><h2 class="profile__joined" translate="PROFILE_JOINED" translate-values="{ date: (ProfileController.profile.memberSince | date: \'longDate\') }"></h2><div class="profile__hearts"><i class="icon icon--heart"></i><i class="icon icon--heart"></i><i class="icon icon--heart"></i></div></footer>'), e.put("registration/registration-form.html", '<h1 translate="REGISTRATION_TITLE"></h1><form ng-submit="RegistrationFormController.register()" name="registrationForm" novalidate class="form form--left registration-form"><div class="registration-form__social__wrapper"><div class="registration-form__social"><h3 class="registration-form__connect" translate="REGISTRATION_SOCIAL"></h3><habbo-facebook-connect on-login="RegistrationFormController.fbRegister()" type="large" translation-key="FACEBOOK_CONNECT"></habbo-facebook-connect></div></div><habbo-email-address email-address="RegistrationFormController.registration.email"><label for="email-address" class="form__label" translate="FORM_EMAIL_LABEL"></label><p translate="EMAIL_NEW_HELP"></p></habbo-email-address><habbo-password-new password-new="RegistrationFormController.registration.password" password-new-repeated="RegistrationFormController.registration.passwordRepeated" user-email="{{RegistrationFormController.registration.email}}"></habbo-password-new><habbo-partner-registration ng-if="RegistrationFormController.showPartnerRegistration" value="RegistrationFormController.registration.partnerRegister"></habbo-partner-registration><habbo-birthdate birthdate="RegistrationFormController.registration.birthdate"></habbo-birthdate><habbo-policies policies="RegistrationFormController.registration"></habbo-policies><habbo-captcha ng-if="!RegistrationFormController.hasCaptchaToken" captcha-token="RegistrationFormController.registration.captchaToken"></habbo-captcha><p class="registration-form__safety" translate="REGISTRATION_SAFETY"></p><div class="form__footer"><button ng-disabled="RegistrationFormController.registerInProgress" type="submit" class="form__submit registration-form__button" translate="REGISTRATION_BUTTON"></button></div><p class="registration-form__purchases" translate="REGISTRATION_PURCHASES"></p></form>'), e.put("registration/registration.html", '<habbo-header-small active="register"></habbo-header-small><main class="wrapper wrapper--content"><habbo-registration-form ng-if="RegistrationController.isOpen"></habbo-registration-form><habbo-hotel-closed ng-if="!RegistrationController.isOpen" class="main"></habbo-hotel-closed></main>'), e.put("room/room.html", '<habbo-header-small></habbo-header-small><habbo-room-restricted ng-if="RoomController.room.doorMode != \'open\'" room="RoomController.room"></habbo-room-restricted><habbo-room-open ng-if="RoomController.room.doorMode == \'open\'" room="RoomController.room"></habbo-room-open>'), e.put("settings/settings.html", '<habbo-header-small active="settings"></habbo-header-small><habbo-tabs title-key="SETTINGS_TITLE"><habbo-tab path="/settings/privacy" translation-key="SETTINGS_PRIVACY_TAB"></habbo-tab><habbo-tab habbo-require-habbo-account-session path="/settings/security" translation-key="SETTINGS_ACCOUNT_SECURITY_TAB"></habbo-tab><habbo-tab habbo-require-habbo-account-session path="/settings/password" translation-key="SETTINGS_PASSWORD_TAB"></habbo-tab><habbo-tab habbo-require-habbo-account-session path="/settings/email" translation-key="SETTINGS_EMAIL_TAB"></habbo-tab><habbo-tab path="/settings/avatars" translation-key="SETTINGS_AVATAR_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content"><section class="main" ui-view></section><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--push-down"></habbo-web-pages><habbo-web-pages key="common/box_need_help" class="aside aside--box"></habbo-web-pages></main>'), e.put("shop/shop.html", '<habbo-header-small active="shop"></habbo-header-small><habbo-tabs><habbo-tab path="/shop" strict-path="true" translation-key="SHOP_BUY_TAB"></habbo-tab><habbo-tab path="/shop/subscriptions" translation-key="SHOP_SUBSCRIPTIONS_TAB"></habbo-tab><habbo-tab path="/shop/prepaid" translation-key="SHOP_PREPAID_TAB"></habbo-tab><habbo-tab ng-if="ShopController.earnCreditsEnabled" path="/shop/earn-credits" translation-key="SHOP_EARN_CREDITS_TAB"></habbo-tab><habbo-tab path="/shop/history" translation-key="SHOP_HISTORY_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content" ui-view></main><habbo-shop-footer class="wrapper wrapper--content"></habbo-shop-footer>'), e.put("common/accordion/accordion-item-content.html", '<div ng-hide="AccordionItemContentController.height === 0" class="accordion-item-content ng-hide" ng-transclude></div>'), e.put("common/accordion/accordion-item.html", '<li ng-class="{ \'accordion-item--expanded\': AccordionItemController.expanded }" class="accordion-item" ng-transclude></li>'), e.put("common/ad-unit/ad-unit.html", '<habbo-ad-double-click ng-if="AdUnitController.hasAds() && !AdUnitController.isAdsPrevented()" unit="{{:: AdUnitController.unit}}"></habbo-ad-double-click>'), e.put("common/avatar/avatar.html", '<a ng-href="/profile/{{:: AvatarController.user | encodeURIComponent}}" class="avatar"><habbo-imager user="{{:: AvatarController.user}}" size="{{:: AvatarController.big ? \'largehead\' : \'bighead\'}}" class="avatar__image"></habbo-imager><h6 class="avatar__title" ng-class="{ \'avatar__title--big\': AvatarController.big }">{{:: AvatarController.user}}</h6></a>'), e.put("common/badge/badge.html", "<img ng-src=\"{{:: BadgeController.badgeUrl + '/' + BadgeController.code + '.gif'}}\" alt=\"{{:: BadgeController.name}}\">"), e.put("common/empty-results/empty-results.html", "<span translate=\"{{:: EmptyResultsController.translationKey || 'EMPTY_RESULTS_TEXT' }}\"></span>"), e.put("common/eu-cookie-banner/eu-cookie-banner.html", '<div ng-show="EuCookieBannerController.show" class="eu-cookie-banner ng-hide"><div class="wrapper"><span translate="EU_COOKIE_BANNER"></span> <a ng-href="{{\'EU_COOKIE_BANNER_READ_MORE_LINK\' | translate}}" translate="EU_COOKIE_BANNER_READ_MORE" target="_blank" rel="noopener noreferrer"></a></div><i ng-click="EuCookieBannerController.close()" class="eu-cookie-banner__close icon icon--close"></i></div>'), e.put("common/footer/footer.html", '<footer class="wrapper"><div class="footer__media"><p class="footer__media__label" translate="FOLLOW_HABBO"></p><ul itemscope itemtype="http://schema.org/Organization"><link itemprop="url" href="https://www.habbo.com"><li class="footer__media__item"><a href="https://www.facebook.com/Habbo" class="footer__media__link" target="_blank" itemprop="sameAs" rel="noopener noreferrer"><i class="icon icon--facebook"></i></a></li><li class="footer__media__item"><a href="https://twitter.com/Habbo" class="footer__media__link" target="_blank" itemprop="sameAs" rel="noopener noreferrer"><i class="icon icon--twitter"></i></a></li><li class="footer__media__item"><a href="https://www.youtube.com/user/Habbo" class="footer__media__link" target="_blank" itemprop="sameAs" rel="noopener noreferrer"><i class="icon icon--youtube"></i></a></li><li class="footer__media__item"><a href="https://www.habbo.com/rss.xml" class="footer__media__link" target="_blank" itemprop="sameAs" rel="noopener noreferrer"><i class="icon icon--rss"></i></a></li></ul></div><div class="footer__content"><ul class="footer__nav"><li ng-repeat="link in FooterController.links" class="footer__nav__item"><a ng-href="{{link + \'_LINK\' | translate | zendeskRedirectUrl}}" class="footer__nav__link" target="_blank" rel="noopener noreferrer" translate="{{:: link}}"></a></li></ul><p class="footer__copyright" translate="FOOTER_COPYRIGHT" translate-values="{ year: FooterController.currentYear }"></p><a href="http://www.sulake.com" target="_blank" rel="noopener noreferrer" class="footer__sulake">Sulake</a></div></footer>'), e.put("common/group-badge/group-badge.html", "<img ng-src=\"{{:: GroupBadgeController.imagingUrl + '/badge/' + GroupBadgeController.code + '.gif'}}\" alt=\"{{:: GroupBadgeController.name}}\">"), e.put("common/header/header-large.html", '<div habbo-sticky-header class="header__top sticky-header sticky-header--top"><div class="wrapper"><div class="header__top__content"><div ng-init="toggle = false;"><button ng-click="toggle = true;" ng-disabled="toggle" ng-hide="toggle" class="header__top__toggle">{{\'LOGIN\' | translate}}</button><div ng-show="toggle" class="header__login-form ng-hide"><habbo-login-form></habbo-login-form></div></div></div></div></div><div class="header__content" ng-transclude></div><header class="header__wrapper wrapper"><a href="/" class="header__habbo__logo"><h1 class="header__habbo__name" id="ga-linkid-habbo-large">Habbo</h1></a></header><habbo-navigation active="{{:: HeaderLargeController.active}}"></habbo-navigation>'), e.put("common/header/header-small.html", '<habbo-header-ad></habbo-header-ad><div class="header__hotel"></div><header class="header__wrapper wrapper"><a href="/" class="header__habbo__logo"><h1 class="header__habbo__name" id="ga-linkid-habbo">Habbo</h1></a><habbo-user-menu habbo-require-session class="header__aside header__aside--user-menu"></habbo-user-menu><div habbo-require-no-session class="header__aside"><button ng-click="HeaderSmallController.openLoginModal()" class="header__login__button"><span class="header__login__icon" translate="LOGIN"></span></button></div></header><habbo-navigation active="{{:: HeaderSmallController.active}}"></habbo-navigation><div class="wrapper" ng-transclude></div>'), e.put("common/hotel-closed/hotel-closed.html", '<div class="hotel-closed"><h1 translate="HOTEL_CLOSED_TITLE"></h1><h3 translate="HOTEL_CLOSED_HOURS"></h3><p translate="HOTEL_CLOSED_DESCRIPTION"></p><ul class="hotel-closed__list"><li><a href="/community/photos" translate="COMMUNITY_PHOTOS_TAB"></a></li><li><a href="/community/category/all" translate="COMMUNITY_NEWS_TAB"></a></li><li><a href="/shop" translate="NAVIGATION_SHOP"></a></li></ul></div>'), e.put("common/imager/imager.html", '<img ng-src="{{:: ImagerController.src}}" ng-srcset="{{:: ImagerController.src + \' 1x\' + (ImagerController.src2x ? (\', \' + ImagerController.src2x + \' 2x\') : \'\')}}" ng-style="{ \'min-width\': ImagerController.dimensions.width }" alt="{{:: ImagerController.name || ImagerController.user }}" width="{{:: ImagerController.dimensions.width }}" height="{{:: ImagerController.dimensions.height }}" class="imager">'), e.put("common/lightbox/lightbox-modal.html", '<button ng-click="$dismiss()" class="lightbox__close modal__close"></button> <img ng-src="{{:: LightboxController.src}}" class="lightbox__image">'), e.put("common/like/like.html", '<div class="like__action"><a ng-click="(LikeController.data | myLike) ? LikeController.unlike() : LikeController.like()"><span translate="{{ (LikeController.data | myLike) ? \'UNLIKE\' : \'LIKE\' }}"></span> <span class="like__count">{{LikeController.data.likes.length}}</span></a></div><div ng-click="LikeController.show = !LikeController.show;" ng-mouseenter="LikeController.mouseenter()" ng-mouseleave="LikeController.show = false;" habbo-false-on-outside-click="LikeController.show" class="like__thumb"><div ng-if="LikeController.data.likes.length > 0" ng-show="LikeController.show" class="like__users ng-hide"><ul><li ng-if="LikeController.data | myLike" class="like__user"><habbo-avatar user="{{:: LikeController.data | myLike}}"></habbo-avatar></li><li ng-repeat="liker in LikeController.data | othersLikes | limitTo: ((LikeController.data | myLike) ? 4 : 5) track by liker" class="like__user"><habbo-avatar user="{{:: liker}}"></habbo-avatar></li></ul><small ng-if="LikeController.data.likes.length > 5" class="like__more">...{{ \'MORE_LIKES\' | translate: { count: LikeController.data.likes.length - 5 } }}</small></div><i class="like__icon icon icon--like"></i></div>'), e.put("common/message-container/message-container.html", '<section class="message-container" ng-transclude></section>'), e.put("common/official-room-avatar/official-room-avatar.html", '<div class="room-official-avatar__wrapper"><div class="room-official-avatar__inner"><div class="room-official-avatar__image"></div><h6 class="room-official-avatar__text" translate="ROOM_OFFICIAL_OWNER"></h6></div></div>'), e.put("common/social-share/social-share.html", '<div class="social-share"><a ng-click="SocialShareController.shareOnTwitter()" class="social-share__link"><i class="icon icon--twitter"></i></a> <a ng-click="SocialShareController.shareOnFacebook()" class="social-share__link"><i class="icon icon--facebook"></i></a> <span class="social-share__text" translate="SOCIAL_SHARE"></span></div>'), e.put("common/tabs/tab.html", '<li class="tab"><a ng-href="{{:: TabController.path}}" ng-class="{ \'tab__link--active\': TabController.active }" class="tab__link" translate="{{:: TabController.translationKey}}"></a></li>'), e.put("common/tabs/tabs.html", '<nav ng-hide="TabsController.tabs.length < 2" class="tabs"><h1 ng-if="TabsController.titleKey" class="tabs__title" translate="{{:: TabsController.titleKey}}"></h1><div ng-click="TabsController.open = !TabsController.open" class="tabs__toggle"><div ng-class="{\'tabs__toggle__title--active\': TabsController.open}" class="tabs__toggle__title" translate="{{TabsController.activeTab.translationKey}}"></div></div><ul class="tabs__menu ng-hide" ng-hide="!TabsController.open" ng-transclude></ul></nav>'), e.put("community/article/article.html", '<section class="wrapper wrapper--content"><habbo-compile data="ArticleController.article" class="main main--fixed"></habbo-compile><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages></section>'), e.put("community/category/category.html", '<section class="wrapper wrapper--content"><habbo-compile data="CategoryController.category" class="main main--fixed"></habbo-compile><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages></section>'), e.put("community/fansites/fansites.html", '<section class="wrapper wrapper--content"><article class="main main--fixed static-content"><habbo-compile data="FansitesController.fansites"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_habbo_way" class="aside aside--box aside--fixed"></habbo-web-pages></section>'), e.put("community/photos/photos.html", '<header class="photos__header"><div class="photos__header__container wrapper"><div class="photos__header__image__wrapper"><div class="photos__header__image"></div></div><div class="photos__header__content"><h1 class="photos__header__title" translate="PHOTOS_TITLE"></h1><p translate="PHOTOS_DESCRIPTION"></p></div></div></header><section class="wrapper wrapper--content"><habbo-columns-channel items="PhotosController.photos"></habbo-columns-channel></section>'), e.put("community/rooms/rooms.html", '<header class="rooms__header"><div class="rooms__header__container wrapper"><div class="rooms__header__image__wrapper"><div class="rooms__header__image"></div></div><div class="rooms__header__content"><h1 class="rooms__header__title" translate="ROOMS_TITLE"></h1><p translate="ROOMS_DESCRIPTION"></p></div></div></header><section class="wrapper wrapper--content rooms-wrapper"><div ng-repeat="room in RoomsController.rooms" class="room-item"><a ng-href="/room/{{:: room.id}}" class="room-item__link"><div class="room-item__thumbnail"><img habbo-remove-on-error class="room-item__thumbnail__image" ng-src="{{room.thumbnailUrl}}"></div></a> <a ng-href="/room/{{:: room.id}}" class="room-item__link"><h2 class="room-item__title">{{:: room.name}}</h2></a><p class="room-item__description">{{:: room.description}}</p><div ng-switch="room.publicRoom"><official-room-avatar ng-switch-when="true" class="room-item__owner--official"></official-room-avatar><habbo-avatar ng-switch-when="false" class="room-item__owner--user" user="{{:: room.ownerName}}"></habbo-avatar></div></div></section>'), e.put("email/email-report-unauthorized/email-report-unauthorized-form.html", '<form ng-submit="EmailReportUnauthorizedFormController.report()" name="emailReportUnauthorizedForm" novalidate><div class="form__footer"><a href="/" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="EmailReportUnauthorizedFormController.reportInProgress" type="submit" class="form__submit" translate="EMAIL_REPORT_UNAUTHORIZED_BUTTON"></button></div></form>'), e.put("email/email-report-unauthorized/email-report-unauthorized.html", '<habbo-header-small></habbo-header-small><main class="wrapper wrapper--content"><section class="main"><habbo-message-container type="exclamation"><h2 translate="EMAIL_REPORT_UNAUTHORIZED_TITLE"></h2><h4 class="email-report-unauthorized-form__email">{{:: EmailReportUnauthorizedController.email}}</h4><p translate="EMAIL_REPORT_UNAUTHORIZED_TEXT"></p><habbo-email-report-unauthorized-form emailaddress="EmailReportUnauthorizedController.email" hash="EmailReportUnauthorizedController.hash"></habbo-email-report-unauthorized-form></habbo-message-container></section></main>'), e.put("home/messaging/messaging.html", '<section><h1 translate="MESSAGING_TITLE"></h1><habbo-discussions items="MessagingController.discussions"></habbo-discussions></section>'), e.put("home/news/news.html", '<habbo-moderation-notification habbo-require-session></habbo-moderation-notification><section><h1 translate="NEWS_TITLE"></h1><div class="main main--fixed"><habbo-compile data="NewsController.promos"></habbo-compile><div class="news__navigation"><a href="/community/category/all" class="news__more" translate="NEWS_MORE"></a></div></div><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages></section>'), e.put("home/register-banner/register-banner.html", '<div class="register-banner__hotel"></div><div class="register-banner__wrapper"><div class="register-banner__register"><h1 class="register-banner__logo">Habbo</h1><h2 class="register-banner__title" translate="HEADER_TITLE"></h2><a href="/registration" habbo-android-download-link habbo-ios-download-link class="register-banner__button" translate="REGISTER_PROMPT"></a><habbo-local-register-banner></habbo-local-register-banner></div></div>'), e.put("hotel/client/client.html", '<div ngsf-fullscreen habbo-client-close-fullscreen-on-hide ng-class="{ \'client--visible\': ClientController.visible }" class="client"><div class="client__buttons"><button ng-click="ClientController.close()" habbo-client-close-expander class="client__close"><i class="client__close__icon icon icon--habbo"></i><div habbo-client-close-expand class="client__close__expand"><div class="client__close__text" translate="CLIENT_TO_WEB_BUTTON"></div></div></button> <button ngsf-toggle-fullscreen class="client__fullscreen"><i show-if-fullscreen="false" class="client__fullscreen__icon icon icon--fullscreen"></i> <i show-if-fullscreen class="client__fullscreen__icon icon icon--fullscreen-back"></i></button></div><iframe id="hotel-client" ng-if="ClientController.isOpen && ClientController.flashEnabled" ng-src="{{ ClientController.client.clienturl }}" habbo-client-communication class="client__frame"></iframe><habbo-client-reload ng-if="ClientController.isOpen && ClientController.flashEnabled && !ClientController.running" reload="ClientController.reload()"></habbo-client-reload><habbo-client-error ng-if="ClientController.isOpen && !ClientController.flashEnabled"></habbo-client-error><habbo-client-closed ng-if="!ClientController.isOpen"></habbo-client-closed><habbo-interstitial></habbo-interstitial></div>'), e.put("profile/creation/creation-content.html", '<section class="creation-content" ng-style="{ \'max-width\': CreationContentController.creation.contentWidth }"><div class="creation-content__expander"><h2 ng-if="CreationContentController.creation.title" class="creation-content__title">{{:: CreationContentController.creation.title}}</h2><div class="creation-content__view"><a habbo-creation-href="CreationContentController.previous" habbo-navigate-to-on-key="left" ng-class="{ \'creation-content__link--disabled\' : !CreationContentController.previous }" class="creation-content__link"><i class="icon icon--arrow-prev"></i></a> <img ng-src="{{:: CreationContentController.creation.url}}" width="{{:: CreationContentController.creation.contentWidth}}" height="{{:: CreationContentController.creation.contentHeight}}" class="creation-content__creation"> <a habbo-creation-href="CreationContentController.next" habbo-navigate-to-on-key="right" ng-class="{ \'creation-content__link--disabled\' : !CreationContentController.next }" class="creation-content__link"><i class="icon icon--arrow-next"></i></a></div><div class="creation-content__meta"><time ng-if="CreationContentController.creation.time">{{:: CreationContentController.creation.time | date: \'longDate\'}}</time><habbo-report ng-if="CreationContentController.creation.type === \'PHOTO\'" creation="CreationContentController.creation"></habbo-report><habbo-like data="CreationContentController.creation" class="creation-content__like"></habbo-like></div><div ng-if="CreationContentController.creation.type === \'PHOTO\'" class="creation-content__actions"><a href="/community/photos" class="creation-content__channel-link" translate="PHOTOS_TITLE"></a><habbo-photo-delete ng-if="CreationContentController.isDeletable()" creation="CreationContentController.creation" class="creation-content__delete"></habbo-photo-delete></div></div></section>'), e.put("profile/creation/creation.html", '<habbo-header-small class="profile__header"><habbo-profile-header user="{{:: CreationController.creation.creator_name}}"><h1><small class="creation__header-by" translate="BY"></small> <span>{{:: CreationController.creation.creator_name}}</span></h1></habbo-profile-header></habbo-header-small><habbo-social-share type="creation"></habbo-social-share><main class="wrapper wrapper--content"><habbo-creation-content creation="CreationController.creation" previous="CreationController.previous" next="CreationController.next"></habbo-creation-content></main>'), e.put("profile/item-lists/badges.html", '<ul ng-init="limit = 20" infinite-scroll="limit = limit + 10" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="badge in BadgeListController.badges | byNameDescriptionOrMotto: BadgeListController.query | limitTo: limit" class="item item--small item--badge"><div class="item__content"><div class="item__icon"><div class="item__icon__aligner"><habbo-badge code="{{:: badge.code}}" name="{{:: badge.name}}"></habbo-badge></div></div><div class="item__text"><h6 class="item__title item__title--multi-line">{{:: badge.name}}</h6><p class="item__description">{{:: badge.description}}</p></div></div></li></ul>'), e.put("profile/item-lists/friends.html", '<ul ng-init="limit = 14" infinite-scroll="limit = limit + 7" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="friend in FriendListController.friends | byNameDescriptionOrMotto: FriendListController.query | limitTo: limit" class="item item--friend"><a ng-href="/profile/{{:: friend.name | encodeURIComponent}}" ng-init="wave = false" ng-mouseenter="wave = true" ng-mouseleave="wave = false" class="item__content"><div class="item__icon" ng-switch="wave"><habbo-imager ng-switch-when="false" figure="{{:: friend.figureString}}" name="{{:: friend.name}}" direction="s" action="stand" class="item__icon__friend"></habbo-imager><habbo-imager ng-switch-when="true" figure="{{:: friend.figureString}}" name="{{:: friend.name}}" direction="s" action="wave" class="item__icon__friend"></habbo-imager></div><div class="item__text"><h6 class="item__title item__title--single-line">{{:: friend.name}}</h6><p ng-if="friend.motto" class="item__description">{{:: friend.motto}}</p></div></a></li></ul>'), e.put("profile/item-lists/groups.html", '<ul ng-init="limit = 20" infinite-scroll="limit = limit + 10" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="group in GroupListController.groups | byNameDescriptionOrMotto: GroupListController.query | limitTo: limit" class="item item--small item--group"><a habbo-flash-href="{{:: group.roomId ? \'/hotel?room=\' + group.roomId : \'\'}}" class="item__content"><div class="item__icon"><div class="item__icon__aligner"><habbo-group-badge code="{{:: group.badgeCode}}" name="{{:: group.name}}"></habbo-group-badge></div></div><div class="item__text"><h6 class="item__title item__title--multi-line">{{:: group.name}}</h6><p ng-if="group.description" class="item__description">{{:: group.description}}</p></div></a></li></ul>'), e.put("profile/item-lists/rooms.html", '<ul ng-init="limit = 16" infinite-scroll="limit = limit + 8" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="room in RoomListController.rooms | byNameDescriptionOrMotto: RoomListController.query | limitTo: limit" class="item item--room"><a ng-href="/room/{{:: room.id}}" class="item__content"><habbo-room-icon class="item__icon" url="{{:: room.thumbnailUrl}}"></habbo-room-icon><div class="item__text"><h6 class="item__title item__title--single-line">{{:: room.name}}</h6><p ng-if="room.description" class="item__description">{{:: room.description}}</p></div></a></li></ul>'), e.put("profile/profile-header/profile-header.html", '<div class="profile-header__avatar"><div ng-if="ProfileHeaderController.profile === \'true\'" class="profile-header__link"><habbo-imager ng-if="!ProfileHeaderController.isCroco(ProfileHeaderController.motto)" figure="{{:: ProfileHeaderController.figure}}" user="{{:: ProfileHeaderController.figure ? \'\' : ProfileHeaderController.user}}" name="{{:: ProfileHeaderController.user}}" class="profile-header__image"></habbo-imager><div ng-if="ProfileHeaderController.isCroco(ProfileHeaderController.motto)" class="profile-header__image profile-header__image--croco"><img src="https://habboo-a.akamaihd.net/habbo-web/america/en/assets/images/croco.dcdb9e74.png"></div></div><a ng-if="ProfileHeaderController.profile !== \'true\'" ng-href="/profile/{{:: ProfileHeaderController.user | encodeURIComponent}}" class="profile-header__link"><habbo-imager figure="{{:: ProfileHeaderController.figure}}" user="{{:: ProfileHeaderController.figure ? \'\' : ProfileHeaderController.user}}" name="{{:: ProfileHeaderController.user}}" size="largehead" class="profile-header__image profile-header__image--largehead"></habbo-imager></a></div><div class="profile-header__details"><div ng-if="ProfileHeaderController.profile === \'true\'" ng-transclude></div><a ng-if="ProfileHeaderController.profile !== \'true\'" ng-href="/profile/{{:: ProfileHeaderController.user | encodeURIComponent}}" class="profile-header__details__link" ng-transclude></a></div>'),
  4903.    e.put("profile/profile-modal/profile-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="{{:: \'PROFILE_\' + ProfileModalController.type.toUpperCase() + \'_TITLE\'}}" class="modal__title"></h3><habbo-search query="query"></habbo-search><div class="item-list--stacked" ng-switch="ProfileModalController.type"><habbo-badge-list ng-switch-when="badges" badges="ProfileModalController.items" query="query"></habbo-badge-list><habbo-friend-list ng-switch-when="friends" friends="ProfileModalController.items" query="query"></habbo-friend-list><habbo-room-list ng-switch-when="rooms" rooms="ProfileModalController.items" query="query"></habbo-room-list><habbo-group-list ng-switch-when="groups" groups="ProfileModalController.items" query="query"></habbo-group-list></div><habbo-empty-results ng-if="(ProfileModalController.items | byNameDescriptionOrMotto: query).length === 0" class="profile-modal__empty"></habbo-empty-results>'), e.put("registration/birthdate/birthdate.html", '<fieldset class="form__fieldset"><label for="birthdate-day" class="form__label" translate="FORM_BIRTHDATE_LABEL"></label><p translate="BIRTHDATE_HELP"></p><div class="form__field"><select id="birthdate-day" ng-model="BirthdateController.day" ng-class="{ \'ng-invalid\': (BirthdateController.FormController.birthdate.$invalid && !day|| BirthdateController.FormController.birthdate.$error.remoteDataAge)\n                && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted) }" class="form__select birthdate__day"><option translate="BIRTHDATE_DAY"></option><option ng-repeat="day in BirthdateController.days | daysInMonth: BirthdateController.month : BirthdateController.year" ng-value="{{day}}">{{day}}</option></select><select ng-model="BirthdateController.month" ng-class="{ \'ng-invalid\': (BirthdateController.FormController.birthdate.$invalid && !month || BirthdateController.FormController.birthdate.$error.remoteDataAge)\n                && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted) }" class="form__select birthdate__month"><option translate="BIRTHDATE_MONTH"></option><option ng-repeat="month in BirthdateController.months" ng-value="{{month.value}}" translate="{{month.translationKey}}"></option></select><select ng-model="BirthdateController.year" ng-class="{ \'ng-invalid\': (BirthdateController.FormController.birthdate.$invalid && !year || BirthdateController.FormController.birthdate.$error.remoteDataAge)\n                && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted) }" class="form__select birthdate__year"><option translate="BIRTHDATE_YEAR"></option><option ng-repeat="year in BirthdateController.years" ng-value="{{year}}">{{year}}</option></select><input name="birthdate" ng-model="BirthdateController.birthdate" required type="hidden"><div ng-if="BirthdateController.FormController.birthdate.$invalid && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted)" ng-messages="BirthdateController.FormController.birthdate.$error" class="form__popover form__popover--error"><div ng-message="required">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></div></fieldset>'), e.put("registration/partner-registration/partner-registration.html", '<fieldset class="form__fieldset form__fieldset--box partner-registration"><label for="partner-register" class="form__label" translate="PARTNER_REGISTRATION_LABEL"></label><p translate="PARTNER_REGISTRATION_HELP"></p><div class="form__field"><label for="partner-register" class="form__label--checkbox partner-registration__checkbox"><input id="partner-register" ng-model="PartnerRegistrationController.value" type="checkbox" class="form__checkbox"> <span translate="PARTNER_REGISTRATION_ACCEPT"></span></label></div></fieldset>'), e.put("registration/policies/policies.html", '<fieldset class="form__fieldset form__fieldset--box"><div class="form__field"><label for="terms-of-service" class="form__label form__label--checkbox"><input id="terms-of-service" name="termsOfServiceAccepted" ng-model="PoliciesController.policies.termsOfServiceAccepted" required type="checkbox" class="form__checkbox"> <span translate="POLICIES_TERMS_OF_SERVICE"></span></label><div ng-if="PoliciesController.FormController.termsOfServiceAccepted.$invalid\n             && (!PoliciesController.FormController.termsOfServiceAccepted.$pristine\n             || PoliciesController.FormController.$submitted)" ng-messages="PoliciesController.FormController.termsOfServiceAccepted.$error" class="form__popover form__popover--error"><div ng-message="required">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></div><div class="form__field"><label for="marketing" class="form__label form__label--checkbox"><input id="marketing" ng-model="PoliciesController.policies.marketingAllowed" type="checkbox" class="form__checkbox"> <span translate="POLICIES_MARKETING"></span></label></div></fieldset>'), e.put("room/room-info/room-info.html", '<ul class="room-info"><li class="room-info__row"><h3 class="room-info__header" translate="ROOM_DESCRIPTION"></h3><span class="room-info__value room-info--description">{{:: RoomInfoController.description}}</span></li><li class="room-info__row"><h3 class="room-info__header" translate="ROOM_TAGS"></h3><span class="room-info__value">{{:: RoomInfoController.tags.join(\', \')}}</span></li></ul>'), e.put("room/room-open/room-open.html", '<main><section class="wrapper wrapper--content"><div class="room__thumbnail"><img habbo-remove-on-error class="room__thumbnail__image" ng-src="{{:: RoomOpenController.room.thumbnailUrl}}"></div><div class="room__content"><h1 class="room__content__title">{{:: RoomOpenController.room.name}}</h1><div class="room__content__left"><div ng-switch="RoomOpenController.room.publicRoom"><official-room-avatar ng-switch-when="true" class="room__owner--official"></official-room-avatar><habbo-avatar ng-switch-when="false" class="room__owner--user" user="{{:: RoomOpenController.room.ownerName}}"></habbo-avatar></div><habbo-room-info description="{{:: RoomOpenController.room.description}}" tags="RoomOpenController.room.tags"></habbo-room-info><a habbo-require-flash ng-href="/hotel?room={{:: RoomOpenController.room.id}}" class="room__enter-button"><span class="room__enter-button__text" translate="ROOM_ENTER_BUTTON"></span></a></div><div class="room__content__right"><div class="room__details"><h3 translate="ROOM_DETAILS"></h3><dl><dt translate="ROOM_RATING"></dt><dd>{{:: RoomOpenController.room.rating}}</dd><dt translate="ROOM_MAX_USERS"></dt><dd>{{:: RoomOpenController.room.maximumVisitors}}</dd></dl></div><div class="room__actions"><a class="room__report" habbo-require-flash ng-href="{{:: RoomOpenController.room.hotelReportLink}}"><span class="room__report__text" translate="ROOM_REPORT_ACTION"></span></a></div></div></div></section><habbo-room-picture url="{{:: RoomOpenController.room.imageUrl}}"></habbo-room-picture></main>'), e.put("room/room-picture/room-picture.html", '<section class="room-picture__wrapper"><img habbo-remove-on-error class="room-picture__image" ng-src="{{:: RoomPictureController.url}}"></section>'), e.put("room/room-restricted/room-restricted.html", '<main class="wrapper wrapper--content room-restricted"><section class="room-restricted__content"><h3 translate="ROOM_RESTRICTED_TITLE"></h3><h4 class="room-restricted__name">{{:: RoomRestrictedController.room.name}}</h4><div class="room-restricted__explanation" translate="ROOM_RESTRICTED_TEXT"></div><a habbo-require-flash ng-href="/hotel?room={{:: RoomRestrictedController.room.id}}" class="room__enter-button"><span class="room__enter-button__text" translate="ROOM_ENTER_BUTTON"></span></a></section></main>'), e.put("router/spinner/spinner.html", '<div class="spinner"><h1 class="spinner__logo">Habbo</h1><div class="spinner__indicator"></div></div>'), e.put("security/login/login-form.html", '<form ng-submit="LoginController.login()" name="loginForm" novalidate habbo-shake class="login-form__form"><fieldset class="form__fieldset login-form__fieldset"><div class="form__field"><input name="email" type="email" ng-model="LoginController.email" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-email habbo-remote-data="\'credentials\'" autofocus placeholder="{{\'FORM_EMAIL_LABEL\' | translate}}" class="form__input login-form__input"></div></fieldset><fieldset class="form__fieldset login-form__fieldset"><div class="form__field"><input name="password" type="password" ng-model="LoginController.password" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-remote-data="\'credentials\'" placeholder="{{\'FORM_PASSWORD_LABEL\' | translate}}" class="form__input login-form__input"></div><habbo-claim-password class="form__helper login-form__helper"></habbo-claim-password></fieldset><button ng-disabled="LoginController.loginInProgress" type="submit" class="login-form__button" translate="LOGIN_BUTTON"></button></form><div class="login-form__social"><habbo-facebook-connect on-login="LoginController.onLogin()" type="large" translation-key="FACEBOOK_LOGIN"></habbo-facebook-connect><habbo-facebook-connect on-login="LoginController.onLogin()" type="small"></habbo-facebook-connect><div class="login-form__rpx"><habbo-rpx-login></habbo-rpx-login></div></div><div class="login-form__register"><a href="/registration" habbo-android-download-link habbo-ios-download-link translate="LOGIN_REGISTER"></a></div>'), e.put("security/login/login-modal.html", '<div class="login"><button ng-click="$dismiss()" class="modal__close"></button><h3 translate="LOGIN" class="modal__title"></h3><div class="modal__content"><habbo-login-form on-login="$close()"></habbo-login-form></div></div>'), e.put("security/safety-lock/safety-answering-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="SAFETY_LOCK_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-safety-answering-form data="SafetyAnsweringController.data" questions="SafetyAnsweringController.questions" target-action="SafetyAnsweringController.targetAction(SafetyAnsweringController.data)" on-success="$close()" on-cancel="$dismiss()"></habbo-safety-answering-form></div>'), e.put("security/safety-lock/safety-lock-form.html", '<form ng-submit="unlock()" name="safetyLockForm" novalidate class="form"><p translate="SAFETY_LOCK_ANSWER"></p><div ng-if="safetyLockForm.$error.remoteDataAnswer" class="form__message form__message--error" translate="ERROR_SAFETY_LOCK_ANSWER"></div><fieldset class="form__fieldset"><label for="safety-lock-answer1" class="form__label" translate="{{questions[0].questionKey}}"></label><div class="form__field"><input id="safety-lock-answer1" name="answer1" type="password" ng-model="answers.answer1" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-remote-data="\'answer\'" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyLockForm.answer1.$error.required && (!safetyLockForm.answer1.$pristine || safetyLockForm.$submitted)" class="form__popover form__popover--error">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></fieldset><fieldset class="form__fieldset"><label for="safety-lock-answer2" class="form__label" translate="{{questions[1].questionKey}}"></label><div class="form__field"><input id="safety-lock-answer2" name="answer2" type="password" ng-model="answers.answer2" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-remote-data="\'answer\'" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyLockForm.answer1.$error.required && (!safetyLockForm.answer2.$pristine || safetyLockForm.$submitted)" class="form__popover form__popover--error">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></fieldset><div ng-if="isTrustedLocationEnabled"><fieldset class="form__fieldset form__fieldset--box"><div class="form__field"><label for="trust-once" class="form__label form__label--radiobutton"><input id="trust-once" ng-model="answers.trust" ng-value="false" type="radio" class="form__radiobutton"> <span translate="SAFETY_LOCK_SET_TRUSTED_ONCE"></span></label></div><div class="form__field"><label for="trust-save" class="form__lable form__label--radiobutton"><input id="trust-save" ng-model="answers.trust" ng-value="true" type="radio" class="form__radiobutton"> <span translate="SAFETY_LOCK_SET_TRUSTED_SAVE"></span></label></div></fieldset></div><div class="form__footer"><a ng-click="onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="unlockingInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_UNLOCK"></button></div></form>'), e.put("security/safety-lock/safety-lock-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="SAFETY_LOCK_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-safety-lock-form questions="SafetyLockController.questions" on-unlock="$close()" on-cancel="$dismiss()"></habbo-safety-lock-form></div>'), e.put("settings/account-security/account-security-edit.html", '<habbo-message-container ng-if="AccountSecurityEditController.accountSecurityStatus === \'enabled\'" type="check"><h3 translate="ACCOUNT_SECURITY_STATUS_ENABLED_TITLE"></h3><div class="account-security__status"><button ng-click="AccountSecurityEditController.openModal()" class="account-security__edit" translate="ACCOUNT_SECURITY_EDIT_BUTTON"></button> <button ng-click="AccountSecurityEditController.disable()" ng-disabled="AccountSecurityEditController.disableInProgress" class="account-security__disable" translate="ACCOUNT_SECURITY_DISABLE"></button></div></habbo-message-container><habbo-message-container ng-if="AccountSecurityEditController.accountSecurityStatus === \'disabled\'" type="exclamation"><h3 translate="ACCOUNT_SECURITY_STATUS_DISABLED_TITLE"></h3><button ng-click="AccountSecurityEditController.openModal()" class="account-security__enable" translate="ACCOUNT_SECURITY_ENABLE_BUTTON"></button></habbo-message-container><habbo-message-container ng-if="AccountSecurityEditController.accountSecurityStatus === \'identity_verification_required\'" type="exclamation"><h3 translate="ACCOUNT_SECURITY_STATUS_VERIFICATION_REQUIRED_TITLE"></h3><a ng-href="/settings/email" translate="ACCOUNT_SECURITY_STATUS_VERIFICATION_REQUIRED_LINK_TEXT"></a></habbo-message-container>'), e.put("settings/account-security/account-security.html", '<h2 translate="ACCOUNT_SECURITY_TITLE"></h2><p translate="ACCOUNT_SECURITY_DESCRIPTION"></p><habbo-account-security-edit account-security-status="AccountSecurityController.accountSecurityStatus"></habbo-account-security-edit><div ng-if="AccountSecurityController.accountSecurityStatus === \'enabled\'" class="account-security__trusted-locations"><h2 translate="ACCOUNT_SECURITY_TRUSTED_LOCATIONS_TITLE"></h2><p translate="ACCOUNT_SECURITY_TRUSTED_LOCATIONS_DESCRIPTION"></p><habbo-trusted-locations-reset></habbo-trusted-locations-reset></div>'), e.put("settings/account-security/trusted-locations-reset.html", '<button ng-click="TrustedLocationsResetController.reset()" ng-disabled="TrustedLocationsResetController.inProgress" class="account-security__reset" translate="ACCOUNT_SECURITY_RESET_TRUSTED_LOGINS_BUTTON"></button>'), e.put("settings/avatar-selection/avatar-selection.html", '<h2 translate="AVATAR_SELECTION_TITLE"></h2><habbo-avatar-create require-non-staff-account-session avatars="AvatarSelectionController.avatars"></habbo-avatar-create><habbo-avatar-search avatars="AvatarSelectionController.avatars"></habbo-avatar-search>'), e.put("settings/email-change/email-change-form.html", '<form ng-submit="EmailChangeFormController.update()" name="emailChangeForm" autocomplete="off" novalidate class="form form--left"><habbo-password-current password-current="EmailChangeFormController.emailChangeData.currentPassword"></habbo-password-current><habbo-email-address email-address="EmailChangeFormController.emailChangeData.newEmail" type="box"><label for="email-address" class="form__label" translate="FORM_NEW_EMAIL_LABEL"></label><p translate="EMAIL_NEW_HELP"></p></habbo-email-address><div class="form__footer"><button ng-disabled="EmailChangeFormController.updateInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'), e.put("settings/email-change/email-change.html", '<habbo-activation-status></habbo-activation-status><h2 translate="EMAIL_CHANGE_TITLE"></h2><habbo-email-change-form></habbo-email-change-form>'), e.put("settings/password-change/password-change-form.html", '<form ng-submit="PasswordChangeFormController.update()" name="changePasswordForm" autocomplete="off" novalidate class="form form--left"><habbo-password-current password-current="PasswordChangeFormController.passwords.currentPassword"></habbo-password-current><habbo-password-new is-new="true" password-new="PasswordChangeFormController.passwords.password" password-new-repeated="PasswordChangeFormController.passwords.passwordRepeated" user-name="{{:: PasswordChangeFormController.user.name}}" user-email="{{:: PasswordChangeFormController.user.email}}"></habbo-password-new><div class="form__footer"><button ng-disabled="PasswordChangeFormController.updateInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'), e.put("settings/password-change/password-change.html", '<h2 translate="PASSWORD_CHANGE_TITLE"></h2><habbo-password-change-form></habbo-password-change-form>'), e.put("settings/privacy-settings/privacy-settings-form.html", '<form ng-submit="PrivacySettingsFormController.save()" name="privacySettingsForm" novalidate class="form form--left"><fieldset class="form__fieldset"><h4 translate="SETTINGS_PROFILE_VISIBILITY_TITLE"></h4><p translate="SETTINGS_PROFILE_VISIBILITY_DESCRIPTION"></p><div class="form__field"><label class="form__label form__label--radiobutton"><input name="profileVisible" ng-model="PrivacySettingsFormController.privacySettings.profileVisible" ng-value="true" type="radio" class="form__radiobutton"> <span translate="SETTINGS_EVERYONE_LABEL"></span></label></div><div class="form__field"><label class="form__label form__label--radiobutton"><input name="profileVisible" ng-model="PrivacySettingsFormController.privacySettings.profileVisible" ng-value="false" type="radio" class="form__radiobutton"> <span translate="SETTINGS_ME_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset form__fieldset--box"><h4 translate="SETTINGS_ONLINE_STATUS_TITLE"></h4><p translate="SETTINGS_ONLINE_STATUS_DESCRIPTION"></p><div class="form__field"><label class="form__label form__label--radiobutton"><input name="onlineStatusVisible" ng-model="PrivacySettingsFormController.privacySettings.onlineStatusVisible" ng-value="true" type="radio" class="form__radiobutton"> <span translate="SETTINGS_EVERYONE_LABEL"></span></label></div><div class="form__field"><label class="form__label form__label--radiobutton"><input name="onlineStatusVisible" ng-model="PrivacySettingsFormController.privacySettings.onlineStatusVisible" ng-value="false" type="radio" class="form__radiobutton"> <span translate="SETTINGS_ME_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset"><h4 translate="SETTINGS_FRIENDS_CAN_FOLLOW_TITLE"></h4><div class="form__field"><label for="friend-can-follow" class="form__label form__label--checkbox"><input id="friend-can-follow" name="friendCanFollow" ng-model="PrivacySettingsFormController.privacySettings.friendCanFollow" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_FRIEND_CAN_FOLLOW_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset form__fieldset--box"><h4 translate="SETTINGS_FRIEND_REQUESTS_ENABLED_TITLE"></h4><div class="form__field"><label for="friend-request-enable" class="form__label form__label--checkbox"><input id="friend-request-enable" name="friendRequestEnabled" ng-model="PrivacySettingsFormController.privacySettings.friendRequestEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_FRIEND_REQUESTS_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset"><h4 translate="SETTINGS_OFFLINE_MESSAGING_ENABLED_TITLE"></h4><div class="form__field"><label for="offline-messaging-enable" class="form__label form__label--checkbox"><input id="offline-messaging-enable" name="offlineMessagingEnabled" ng-model="PrivacySettingsFormController.privacySettings.offlineMessagingEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_OFFLINE_MESSAGING_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset form__fieldset--box"><h4 translate="SETTINGS_EMAIL_NOTIFICATIONS_TITLE"></h4><div class="form__field"><label for="email-newsletter-enable" class="form__label form__label--checkbox"><input id="email-newsletter-enable" name="emailNewsletterEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailNewsletterEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NEWSLETTER_LABEL"></span></label></div><div class="form__field"><span translate="SETTINGS_EMAIL_NOTIFICATIONS_SUBTITLE"></span><label class="form__label form__label--checkbox"><input name="emailMiniMailNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailMiniMailNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_MINIMAIL_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailFriendRequestNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailFriendRequestNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_FRIEND_REQUEST_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailGiftNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailGiftNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_GIFT_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailRoomMessageNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailRoomMessageNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_ROOM_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailGroupNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailGroupNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_GROUP_LABEL"></span></label></div></fieldset><div class="form__footer"><button ng-disabled="PrivacySettingsFormController.sendInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_SAVE"></button></div></form>'), e.put("settings/privacy-settings/privacy-settings.html", '<h2 translate="PRIVACY_SETTINGS_TITLE"></h2><habbo-privacy-settings-form privacy-settings="PrivacySettingsController.privacySettings"></habbo-privacy-settings-form>'), e.put("shop/credit-card-form/credit-card-form.html", '<form ng-submit="CreditCardController.markActiveAndSubmit({ data: CreditCardController.card })" name="creditCardForm" novalidate class="form credit-card-form"><p translate="SHOP_CREDIT_CARD_INSTRUCTION"></p><fieldset class="form__fieldset form__fieldset--inline credit-card-form__input-section"><div class="form__field"><label for="card-number" class="form__label" translate="SHOP_CREDIT_CARD_NUMBER"></label><input id="card-number" name="number" ng-model="CreditCardController.card.number" class="form__input" ng-required="true" cc-number cc-type="cardType" cc-format="true"><div ng-if="creditCardForm.number.$invalid && !creditCardForm.number.$pristine && creditCardForm.number.$touched" class="form__popover form__popover--error form__popover--inline" ng-required="true"><p translate="SHOP_CREDIT_CARD_INVALID_NUMBER"></p></div></div><div class="credit-card-form__expiry-cvc-row form__fieldset"><div class="form__field credit-card-form__expiry-field"><label class="form__label" translate="SHOP_CREDIT_CARD_EXPIRY_DATE"></label><div cc-exp class="credit-card-form__expiry"><input name="month" ng-model="CreditCardController.card.expMonth" cc-exp-month ng-required="true" class="form__input credit-card-form__expiry-input" placeholder="{{\'SHOP_CREDIT_CARD_EXPIRY_HINT_MM\' | translate}}"> <span class="credit-card-form__expiry-slash">/</span> <input name="year" ng-model="CreditCardController.card.expYear" cc-exp-year ng-required="true" class="form__input credit-card-form__expiry-input" placeholder="{{\'SHOP_CREDIT_CARD_EXPIRY_HINT_YY\' | translate}}"></div><div ng-if="(creditCardForm.month.$invalid && !creditCardForm.month.$pristine && creditCardForm.month.$touched)\n                              || (creditCardForm.year.$invalid && !creditCardForm.year.$pristine && creditCardForm.year.$touched)\n                              || (creditCardForm.$error.ccExp && !(creditCardForm.month.$pristine || creditCardForm.year.$pristine) && creditCardForm.month.$touched && creditCardForm.year.$touched)" class="form__popover form__popover--error form__popover--inline"><p translate="SHOP_CREDIT_CARD_INVALID_DATE"></p></div></div><div class="form__field credit-card-form__cvc-field"><label class="form__label" translate="SHOP_CREDIT_CARD_CVC"></label><input name="cvc" ng-required="true" ng-model="CreditCardController.card.cvc" class="form__input credit-card-form__cvc-input" cc-cvc> <img src="https://habboo-a.akamaihd.net/habbo-web/america/en/assets/images/cc_cvc_instruction.345e33e4.png" class="credit-card-form__cvc-icon"><div ng-if="creditCardForm.cvc.$invalid && !creditCardForm.cvc.$pristine && creditCardForm.cvc.$touched" class="form__popover form__popover--error form__popover--inline"><p translate="SHOP_CREDIT_CARD_INVALID_CVC"></p></div></div></div><div class="form__field"><label class="form__label" translate="SHOP_CREDIT_CARD_NAME"></label><input name="name" ng-model="CreditCardController.card.name" class="form__input" ng-required="true"></div><h3 translate="SHOP_SMALLPRINT_TITLE"></h3><p class="payment-steps__legal" translate="SHOP_CREDIT_CARD_SMALLPRINT"></p></fieldset><button ng-disabled="CreditCardController.paymentInProgress || creditCardForm.$invalid" type="submit" translate="SHOP_PAYMENT_BUTTON" class="payment-methods__button payment-button"></button></form>'), e.put("shop/credit-icon/credit-icon.html", "<div ng-class=\"[{ 'credit-icon--double': CreditIconController.isDouble },\n               'credit-icon--' + CreditIconController.getIndex(CreditIconController.amount) ]\" class=\"credit-icon\"></div>"), e.put("shop/credit-title/credit-title.html", '<span ng-if="CreditTitleController.isDouble" translate="DOUBLE_CREDITS_PREFIX" class="credit-title__prefix"></span> <span translate="CREDITS_AMOUNT" translate-values="{ value: CreditTitleController.amount }"></span>'), e.put("shop/earn-credits/earn-credits.html", '<section class="main"><habbo-web-pages key="store/earn-credits/earn-credits"></habbo-web-pages><habbo-earn-credits-frame offer-wall-url="{{:: EarnCreditsController.offerWallUrl.url }}"></habbo-earn-credits-frame></section><habbo-purse habbo-require-session class="aside aside--box aside--push-down"></habbo-purse><habbo-web-pages key="store/earn-credits/box_help" class="aside aside--box"></habbo-web-pages>'), e.put("shop/prepaid/prepaid.html", '<header class="shop__header"><h1 translate="SHOP_PREPAID_TITLE" class="shop__header__title"></h1><habbo-shop-countries ng-if="PrepaidController.countries.length > 1" country="PrepaidController.country" countries="PrepaidController.countries" class="shop__header__country"></habbo-shop-countries></header><section><article class="main static-content"><habbo-compile data="PrepaidController.page"></habbo-compile></article><habbo-purse habbo-require-session class="aside aside--box"></habbo-purse><aside habbo-require-session class="aside aside--box"><h3 translate="SHOP_REDEEM_TITLE"></h3><habbo-voucher-redeem></habbo-voucher-redeem></aside><habbo-web-pages key="common/box_account_issues" class="aside aside--box"></habbo-web-pages></section>'), e.put("shop/purse/purse.html", '<aside><h3 translate="SHOP_PURSE_TITLE"></h3><div class="purse"><div class="purse__columns"><div class="purse__column"><div translate="SHOP_PURSE_CREDITS" translate-values="{ creditBalance: PurseController.purse.creditBalance }" class="purse__item purse__item--credits"></div><div translate="SHOP_PURSE_DIAMONDS" translate-values="{ diamondBalance: PurseController.purse.diamondBalance }" class="purse__item purse__item--diamonds"></div></div><div class="purse__column"><div class="purse__item purse__item--habbo-club"><span ng-if="PurseController.purse.habboClubDays !== 0" translate="SHOP_PURSE_HC_DAYS" translate-values="{ habboClubDays: PurseController.purse.habboClubDays }"></span> <span ng-if="PurseController.purse.habboClubDays === 0" translate="SHOP_PURSE_NO_HC"></span></div><div class="purse__item purse__item--builders-club"><span ng-if="PurseController.purse.buildersClubDays !== 0" translate="SHOP_PURSE_BC_DAYS" translate-values="{ buildersClubDays: PurseController.purse.buildersClubDays }"></span> <span ng-if="PurseController.purse.buildersClubDays === 0" translate="SHOP_PURSE_NO_BC"></span></div></div></div></div><div class="purse__footer"><a href="/hotel?link=habboUI/open/hccenter" class="purse__hc-center" translate="SHOP_PURSE_HC_LINK"></a></div></aside>'), e.put("shop/shop-countries/shop-countries.html", '<label for="shop-country" class="form__label form__label--inline"><small translate="SHOP_COUNTRY_LABEL" translate-values="{ countryName: ShopCountriesController.country.name }"></small></label><select id="shop-country" ng-model="ShopCountriesController.country" ng-options="country.name for country in ShopCountriesController.countries track by country.countryCode" class="form__select form__select--inline"></select>'), e.put("shop/shop-footer/shop-footer.html", '<footer class="shop-footer"><section class="main shop-footer__main"><h3 translate="SHOP_NOTICE_TITLE" class="shop-footer__title"></h3><p translate="SHOP_NOTICE_CONTENTS" class="shop-footer__text"></p></section><aside class="aside shop-footer__aside"><h4 translate="SHOP_NOTICE_PROVIDER_TITLE" class="shop-footer__title--aside"></h4><p translate="SHOP_NOTICE_PROVIDER" class="shop-footer__text"></p><a ng-href="{{\'FOOTER_SUPPORT_LINK\' | translate | zendeskRedirectUrl}}" target="_blank" rel="noopener noreferrer" translate="FOOTER_SUPPORT" class="shop-footer__link"></a></aside></footer>'), e.put("shop/store/store.html", '<header class="shop__header"><h1 translate="SHOP_TITLE" class="shop__header__title"></h1><habbo-shop-countries ng-if="StoreController.countries.length > 1" country="StoreController.inventory.country" countries="StoreController.countries" class="shop__header__country"></habbo-shop-countries></header><section><div class="main"><habbo-targeted-offer offer="StoreController.offer" ng-if="StoreController.offer"></habbo-targeted-offer><habbo-category-filter ng-show="StoreController.inventory.paymentCategories.length > 0" payment-categories="StoreController.inventory.paymentCategories" selected-category="StoreController.selectedCategory"></habbo-category-filter><habbo-inventory inventory="StoreController.inventory" selected-category="{{StoreController.selectedCategory}}"></habbo-inventory></div><habbo-purse habbo-require-session class="aside aside--box"></habbo-purse><aside habbo-require-session class="aside aside--box"><h3 translate="SHOP_REDEEM_TITLE"></h3><habbo-voucher-redeem></habbo-voucher-redeem></aside><habbo-web-pages key="common/box_mall_info" class="aside aside--box"></habbo-web-pages></section>'), e.put("shop/subscriptions/subscriptions.html", '<section><div class="main"><habbo-message-container type="exclamation"><h3 translate="SHOP_RECURRING_SUBSCRIPTION_NOT_SUPPORTED_TITLE"></h3><p translate="SHOP_RECURRING_SUBSCRIPTION_NOT_SUPPORTED_DESCRIPTION"></p></habbo-message-container></div><habbo-purse class="aside aside--box"></habbo-purse><aside class="aside aside--box"><h3 translate="SHOP_REDEEM_TITLE"></h3><habbo-voucher-redeem></habbo-voucher-redeem></aside><habbo-web-pages key="common/box_mall_info" class="aside aside--box"></habbo-web-pages></section>'),
  4904.    e.put("shop/transactions/transactions-list.html", '<div ng-if="TransactionsListController.transactions.length > 0"><habbo-transactions-history transactions="TransactionsListController.transactions" limit-to="{{TransactionsListController.transactionLimit}}"></habbo-transactions-history><div class="transactions__footer"><p class="transactions__notice" translate="TRANSACTIONS_NOTICE"></p><button ng-if="!TransactionsListController.hideShowAll\n                       && TransactionsListController.transactions.length > TransactionsListController.transactionLimit" ng-click="TransactionsListController.showAll()" class="transactions__button" translate="TRANSACTIONS_SHOW_ALL"></button></div></div><habbo-empty-results ng-if="TransactionsListController.transactions.length === 0" translation-key="TRANSACTIONS_EMPTY"></habbo-empty-results>'), e.put("shop/transactions/transactions.html", '<header class="shop__header"><h1 class="shop__header__title shop__header__title--single" translate="SHOP_TRANSACTIONS_TITLE"></h1></header><section><habbo-transactions-list transactions="TransactionsController.items" class="main"></habbo-transactions-list><habbo-purse class="aside aside--box"></habbo-purse><habbo-web-pages key="common/box_account_issues" class="aside aside--box"></habbo-web-pages></section>'), e.put("shop/voucher-redeem/voucher-redeem.html", '<form ng-submit="VoucherRedeemController.redeem()" name="voucherRedeemForm" novalidate class="form"><button ng-disabled="VoucherRedeemController.redeemInProgress" type="submit" translate="SHOP_REDEEM_BUTTON" class="form__submit form__submit--inline"></button><fieldset class="form__fieldset form__fieldset--inline"><div class="form__field"><input placeholder="{{\'SHOP_REDEEM_PLACEHOLDER\' | translate}}" name="voucherCode" ng-model="VoucherRedeemController.voucherCode" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" ng-pattern="/^[a-z0-9]{8}$/i" required autocomplete="off" habbo-remote-data="[\'nonexistent\', \'redeemed\', \'failed\']" class="form__input voucher-redeem__input"><div ng-if="voucherRedeemForm.voucherCode.$invalid && (!voucherRedeemForm.voucherCode.$pristine || voucherRedeemForm.$submitted)" ng-messages="voucherRedeemForm.voucherCode.$error" class="form__popover form__popover--error form__popover--inline"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="pattern">{{\'ERROR_VOUCHER_CODE_PATTERN\' | translate}}</div><div ng-message="remoteDataNonexistent">{{\'ERROR_VOUCHER_CODE_NONEXISTENT\' | translate}}</div><div ng-message="remoteDataRedeemed">{{\'ERROR_VOUCHER_CODE_REDEEMED\' | translate}}</div><div ng-message="remoteDataFailed">{{\'ERROR_VOUCHER_CODE_FAILED\' | translate}}</div></div></div></fieldset><small class="form__helper" translate="PREPAID_ORDER_INSTRUCTION"></small></form>'), e.put("common/ad-unit/ad-double-click/ad-double-click.html", '<div ng-dfp-ad="{{:: AdDoubleClickController.id}}" translation="{{ \'THIRD_PARTY_AD\' | translate }}" class="ad-double-click"></div>'), e.put("common/columns/card/card.html", '<div class="card"><div class="card__content"><a habbo-creation-href="CardController.item" class="card__link"><div class="card__image__aligner"><img ng-src="{{:: CardController.item.url}}" ng-class="{\n                       \'card__image--selfie\': CardController.item.type === \'SELFIE\',\n                       \'card__image--photo\': CardController.item.type === \'PHOTO\',\n                       \'card__image--wide\': CardController.item.type === \'USER_CREATION\' && CardController.item.contentHeight < CardController.item.contentWidth,\n                       \'card__image--tall\': CardController.item.type === \'USER_CREATION\' && CardController.item.contentHeight >= CardController.item.contentWidth\n                     }" class="card__image" alt="{{:: CardController.item.title}}"></div></a><div class="card__meta"><h5 ng-if="CardController.item.title" class="card__title">{{:: CardController.item.title}}</h5><time class="card__date">{{:: CardController.item.time | date: \'shortDate\'}}</time><habbo-like data="CardController.item" class="card__like"></habbo-like></div></div><div ng-transclude></div></div>'), e.put("common/columns/columns-channel/columns-channel.html", '<div><div class="columns" ng-init="limit = 16" infinite-scroll="limit = limit + 8" infinite-scroll-distance="1"><habbo-card ng-repeat="card in ColumnsChannelController.items | limitTo: limit" item="card" class="columns__column"><habbo-avatar class="card__creator" user="{{:: card.creator_name}}"></habbo-avatar></habbo-card></div></div>'), e.put("common/columns/columns-profile/columns-profile.html", '<div><div ng-init="limit = 16" infinite-scroll="limit = limit + 8" infinite-scroll-distance="1" class="columns"><habbo-card ng-repeat="card in ColumnsProfileController.items | limitTo: limit" item="card" class="columns__column"></habbo-card></div></div>'), e.put("common/form/captcha/captcha.html", '<fieldset class="form__fieldset captcha__wrapper"><div class="form__field"><no-captcha g-recaptcha-response="CaptchaController.captchaToken" control="CaptchaController.noCaptchaController" expired-callback="CaptchaController.onExpire" class="captcha"></no-captcha><input name="captchaToken" ng-model="CaptchaController.captchaToken" required type="hidden"><div ng-if="CaptchaController.FormController.captchaToken.$invalid\n                    && (!CaptchaController.FormController.captchaToken.$pristine\n                    || CaptchaController.FormController.$submitted)" class="form__popover form__popover--error form__popover--captcha" translate="ERROR_CAPTCHA_REQUIRED"></div></div></fieldset>'), e.put("common/form/email-address/email-address.html", '<fieldset class="form__fieldset"><div ng-transclude></div><div class="form__field"><input id="email-address" name="emailAddress" type="email" ng-model="EmailAddressController.emailAddress" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-email habbo-remote-data="[\'emailInvalid\', \'emailUsedInRegistration\', \'emailUsedInChange\']" autocomplete="off" class="form__input"><div ng-if="EmailAddressController.FormController.emailAddress.$invalid\n                    && (!EmailAddressController.FormController.emailAddress.$pristine\n                    || EmailAddressController.FormController.$submitted)" ng-messages="EmailAddressController.FormController.emailAddress.$error" class="form__popover form__popover--error"><div ng-message="email, remoteDataEmailInvalid">{{ \'ERROR_EMAIL_INVALID\' | translate }}</div><div ng-message="required">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div><div ng-message="remoteDataEmailUsedInRegistration">{{ \'ERROR_EMAIL_REGISTRATION_USED\' | translate }}</div><div ng-message="remoteDataEmailUsedInChange">{{ \'ERROR_EMAIL_CHANGE_USED\' | translate }}</div></div></div></fieldset>'), e.put("common/form/password-current/password-current.html", '<fieldset class="form__fieldset"><label for="password-current" translate="CURRENT_PASSWORD_LABEL" class="form__label"></label><div class="form__field"><input id="password-current" name="passwordCurrent" type="password" ng-model="PasswordCurrentController.passwordCurrent" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-password-toggle-mask habbo-remote-data="\'password\'" autocomplete="off" class="form__input"><div ng-if="PasswordCurrentController.FormController.passwordCurrent.$invalid\n                    && (!PasswordCurrentController.FormController.passwordCurrent.$pristine\n                    || PasswordCurrentController.FormController.$submitted)" ng-messages="PasswordCurrentController.FormController.passwordCurrent.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="remoteDataPassword">{{\'ERROR_INCORRECT_PASSWORD\' | translate}}</div></div></div></fieldset>'), e.put("common/form/password-new/password-new.html", '<fieldset class="form__fieldset form__fieldset--box form__fieldset--box-top"><label for="password-new" class="form__label" translate="{{:: PasswordNewController.isNew === \'true\' ? \'NEW_PASSWORD_LABEL\' : \'PASSWORD_LABEL\'}}"></label><p translate="PASSWORD_CHANGE_HELP"></p><div class="form__field"><input id="password-new" name="passwordNew" type="password" ng-model="PasswordNewController.passwordNew" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required ng-maxlength="32" ng-minlength="6" habbo-password-email="{{:: PasswordNewController.userEmail}}" habbo-password-name="{{:: PasswordNewController.userName}}" habbo-password-pattern habbo-password-toggle-mask habbo-remote-data="[\'passwordName\', \'passwordEmail\', \'passwordUsed\']" autocomplete="off" class="form__input"><div ng-if="(PasswordNewController.FormController.passwordNew.$invalid\n                    && (!PasswordNewController.FormController.passwordNew.$pristine\n                    || PasswordNewController.FormController.$submitted))\n                    || (!PasswordNewController.FormController.passwordNew.$pristine\n                    && PasswordNewController.FormController.passwordNew.$valid)" ng-messages="PasswordNewController.FormController.passwordNew.$error" ng-class="{ \'form__popover--error\': PasswordNewController.FormController.passwordNew.$invalid }" class="form__popover"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><habbo-password-strength ng-if="!PasswordNewController.FormController.passwordNew.$error.required" model-value="PasswordNewController.passwordNew" model-name="passwordNew"><div ng-message="maxlength">{{\'ERROR_PASSWORD_MAX_LENGTH\' | translate}}</div><div ng-message="minlength">{{\'ERROR_PASSWORD_MIN_LENGTH\' | translate}}</div><div ng-message="passwordPattern">{{\'ERROR_PASSWORD_PATTERN\' | translate}}</div><div ng-message="passwordName, remoteDataPasswordName">{{\'ERROR_PASSWORD_CONTAINS_NAME\' | translate}}</div><div ng-message="passwordEmail, remoteDataPasswordEmail">{{\'ERROR_PASSWORD_CONTAINS_EMAIL\' | translate}}</div><div ng-message="passwordUsed, remoteDataPasswordUsed">{{\'ERROR_PASSWORD_USED_EARLIER\' | translate}}</div></habbo-password-strength></div></div></fieldset><fieldset class="form__fieldset form__fieldset--box form__fieldset--box-bottom"><label for="password-new-repeated" class="form__label" translate="PASSWORD_REPEAT_LABEL"></label><div class="form__field"><input id="password-new-repeated" name="passwordNewRepeated" type="password" ng-model="PasswordNewController.passwordNewRepeated" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-matches="passwordNew" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="PasswordNewController.FormController.passwordNew.$valid\n                    && PasswordNewController.FormController.passwordNewRepeated.$invalid" ng-messages="PasswordNewController.FormController.passwordNewRepeated.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="matches">{{\'ERROR_PASSWORDS_NOT_MATCHING\' | translate}}</div></div></div></fieldset>'), e.put("common/form/search/search.html", '<input ng-model="SearchController.query" class="form__input search__input" placeholder="{{ \'SEARCH_PLACEHOLDER\' | translate }}"> <button class="search__clear" ng-click="SearchController.query = \'\';"></button>'), e.put("common/header/header-ad/header-ad.html", '<div ng-if="HeaderAdController.hasAd" class="header-ad"><habbo-ad-unit unit="leaderboard" class="header-ad__ad"></habbo-ad-unit></div>'), e.put("common/header/hotel-button/hotel-button.html", '<a href="/hotel" class="hotel-button" id="ga-linkid-hotel"><span class="hotel-button__text" translate="NAVIGATION_HOTEL"></span></a>'), e.put("common/header/navigation/navigation.html", '<nav class="navigation"><ul class="navigation__menu"><li class="navigation__item"><a href="/" ng-class="{ \'navigation__link--active\': NavigationController.active === \'home\' }" class="navigation__link navigation__link--home" translate="NAVIGATION_HOME" id="ga-linkid-home"></a></li><li class="navigation__item"><a href="/community" ng-class="{ \'navigation__link--active\': NavigationController.active === \'community\' }" class="navigation__link navigation__link--community" translate="NAVIGATION_COMMUNITY" id="ga-linkid-community"></a></li><li class="navigation__item"><a href="/shop" ng-class="{ \'navigation__link--active\': NavigationController.active === \'shop\' }" class="navigation__link navigation__link--shop" translate="NAVIGATION_SHOP" id="ga-linkid-shop"></a></li><li class="navigation__item"><a href="/playing-habbo" ng-class="{ \'navigation__link--active\': NavigationController.active === \'playingHabbo\' }" class="navigation__link navigation__link--playing-habbo" translate="NAVIGATION_PLAYING_HABBO" id="ga-linkid-playing-habbo"></a></li><li habbo-require-session class="navigation__item navigation__item--aside navigation__item--hotel"><habbo-hotel-button habbo-require-flash></habbo-hotel-button></li></ul></nav>'), e.put("common/header/user-menu/user-menu.html", '<div ng-init="toggle = false;" habbo-false-on-outside-click="toggle" class="user-menu"><div class="user-menu__header"><a ng-click="toggle = !toggle;" class="user-menu__toggle"><div class="user-menu__name__wrapper"><div class="user-menu__name" ng-class="{ \'user-menu__name--open\': toggle }">{{:: UserMenuController.user.name}}</div></div><habbo-imager figure="{{:: UserMenuController.user.figureString}}" name="{{:: UserMenuController.user.name}}" size="bighead" class="user-menu__avatar"></habbo-imager></a></div><ul ng-hide="!toggle" class="user-menu__list ng-hide"><li class="user-menu__item"><a ng-href="/profile/{{:: UserMenuController.user.name | encodeURIComponent}}" ng-class="{ \'user-menu__link--active\': UserMenuController.isMyProfileActive() }" class="user-menu__link user-menu__link--profile" translate="NAVIGATION_PROFILE"></a></li><li class="user-menu__item"><a href="/settings" ng-class="{ \'user-menu__link--active\': UserMenuController.isSettingsActive() }" class="user-menu__link user-menu__link--settings" translate="NAVIGATION_SETTINGS"></a></li><li class="user-menu__item"><a ng-href="{{\'HELP_URL\' | translate | zendeskRedirectUrl}}" class="user-menu__link user-menu__link--help" target="_blank" rel="noopener noreferrer" translate="NAVIGATION_HELP"></a></li><li class="user-menu__item"><a ng-click="UserMenuController.logout()" class="user-menu__link user-menu__link--logout" translate="NAVIGATION_LOGOUT"></a></li></ul></div>'), e.put("home/messaging/discussions/discussions.html", '<ul ng-if="DiscussionsController.items.length > 0"><li ng-repeat="discussion in DiscussionsController.items" class="discussions__item"><div class="discussions__participant"><habbo-avatar user="{{:: DiscussionsController.getParticipant(discussion.participants).name}}" big="true"></habbo-avatar></div><div class="discussions__wrapper"><h6 ng-if="discussion.messages.length > 0" am-time-ago="discussion.latestTime" class="discussions__timeago"></h6><ul><li ng-repeat="message in discussion.messages | limitTo: 3" class="discussions__message"><p class="discussions__text">{{:: message.message}}</p><time class="discussions__date"><small>{{:: message.sendTime | date: \'medium\'}}</small></time></li></ul><a ng-href="/hotel?link=friendlist/openchat/{{discussion.discussionId}}" habbo-require-flash translate="DISCUSSIONS_REPLY" class="discussions__reply"></a></div></li></ul><habbo-empty-results ng-if="DiscussionsController.items.length === 0" translation-key="DISCUSSIONS_EMPTY"></habbo-empty-results>'), e.put("home/news/moderation-notification/moderation-notification.html", '<habbo-message-container ng-if="ModerationNotificationController.moderations.length > 0" type="exclamation" class="moderation-notification static-content"><h3 translate="MODERATION_MESSAGE_TITLE"></h3><p translate="MODERATION_MESSAGE_TEXT" translate-values="{moderationCount: ModerationNotificationController.moderations.length}"></p><ul><li ng-repeat="moderation in ModerationNotificationController.moderations">{{:: moderation.createdAt | date: "fullDate" }}</li></ul><p translate="MODERATION_MESSAGE_INSTRUCTIONS"></p></habbo-message-container>'), e.put("home/register-banner/local-register-banner/local-register-banner.html", '<small ng-if="LocalRegisterBannerController.site" class="local-register-banner">{{ \'LOCAL_REGISTER_BANNER_\' + LocalRegisterBannerController.site.localization | translate }} <a ng-href="{{LocalRegisterBannerController.site.href}}">{{LocalRegisterBannerController.site.title}}</a></small>'), e.put("hotel/client/client-closed/client-closed.html", "<habbo-hotel-closed></habbo-hotel-closed>"), e.put("hotel/client/client-error/client-error.html", '<div class="client-error"><h1 class="client-error__title" translate="CLIENT_ERROR_TITLE"></h1><p translate="CLIENT_ERROR_FLASH"></p><div class="client-error__downloads"><a ng-href="{{\'CLIENT_ERROR_FLASH_LINK\' | translate}}" target="_blank" rel="noopener noreferrer" class="client-error__flash"></a></div><p translate="CLIENT_ERROR_MOBILE"></p><div class="client-error__downloads"><a ng-href="{{:: ClientErrorController.appStoreUrl}}" target="_blank" rel="noopener noreferrer" class="client-error__appstore"></a> <a ng-href="{{:: ClientErrorController.googlePlayUrl}}" target="_blank" rel="noopener noreferrer" class="client-error__googleplay"></a></div></div>'), e.put("hotel/client/client-reload/client-reload.html", '<h1 translate="RELOAD_TITLE"></h1><button ng-click="ClientReloadController.reload()" class="client-reload__button" translate="RELOAD_BUTTON"></button>'), e.put("hotel/client/interstitial/interstitial.html", '<div ng-if="InterstitialController.started" ng-class="{ \'interstitial--visible\': InterstitialController.loaded }" class="interstitial"><div class="interstitial__stage"><iframe ng-src="{{InterstitialController.habboWebAdsUrl + \'interstitial.\' + InterstitialController.lang + \'.html\'}}" class="interstitial__ad"></iframe></div><p class="interstitial__text" translate="INTERS_DESCRIPTION"></p><p class="interstitial__text" translate="INTERS_INSTRUCTION"></p></div>'), e.put("profile/creation/photo-delete/photo-delete.html", '<button type="button" ng-click="PhotoDeleteController.delete()" class="photo-delete">{{\'CREATION_DELETE\' | translate}}</button>'), e.put("profile/creation/report/report-form.html", '<form ng-submit="ReportFormController.send()" name="reportForm" novalidate class="form"><p translate="REPORT_EXPLANATION"></p><img ng-src="{{:: ReportFormController.creation.url}}" class="report-form__creation"><fieldset class="form__fieldset form__fieldset--box"><p class="report-form__description" translate="REPORT_REMOVE_BECAUSE"></p><div ng-repeat="reason in ReportFormController.reasonCodes" class="form__field"><label class="form__label form__label--radiobutton"><input name="reportReason" ng-model="ReportFormController.creation.reportReason" ng-value="reason" required type="radio" class="form__radiobutton"> <span translate="REPORT_REASON_{{reason}}"></span></label></div></fieldset><div ng-if="reportForm.$invalid && reportForm.$submitted" ng-messages="reportForm.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div></div><p translate="REPORT_REPORT_FAIRLY"></p><div class="form__footer"><a ng-click="ReportFormController.onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button type="submit" class="form__submit report-form__submit" ng-disabled="ReportFormController.sendInProgress" translate="REPORT_SUBMIT"></button></div></form>'), e.put("profile/creation/report/report-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h4 class="modal__title" translate="REPORT_TITLE"></h4><div class="modal__content"><habbo-report-form creation="ReportController.creation" on-success="$close()" on-cancel="$dismiss()"></habbo-report-form></div>'), e.put("profile/creation/report/report.html", '<a ng-click="ReportController.click()" class="report"><i class="report__icon icon icon--report"></i></a>'), e.put("profile/item-lists/room-icon/room-icon.html", '<div class="room-icon"><img habbo-show-on-load habbo-remove-on-error ng-src="{{:: RoomIconController.url}}" class="room-icon__thumbnail"></div>'), e.put("security/force/force-email/force-email-form.html", '<form ng-submit="ForceEmailFormController.save()" name="forceEmailChangeForm" autocomplete="off" novalidate class="form"><p translate="FORCED_EMAIL_CHANGE_TEXT"></p><h4 class="force-email__email">{{:: ForceEmailFormController.oldEmailAddress}}</h4><habbo-email-address email-address="ForceEmailFormController.emailAddress" type="box"><label for="email-address" class="form__label" translate="FORM_NEW_EMAIL_LABEL"></label></habbo-email-address><div class="form__footer"><a ng-click="ForceEmailFormController.onDismiss()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ForceEmailFormController.saveInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'), e.put("security/force/force-email/force-email-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="FORCED_EMAIL_CHANGE_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-force-email-form old-email-address="{{:: ForceEmailController.oldEmailAddress}}" on-dismiss="$dismiss()" on-success="$close(email)"></habbo-force-email-form></div>'), e.put("security/force/force-password/force-password-form.html", '<form ng-submit="ForcePasswordFormController.change()" name="forcePasswordChangeForm" autocomplete="off" novalidate class="form"><p translate="FORCED_PASSWORD_CHANGE_TEXT"></p><habbo-password-new is-new="true" password-new="ForcePasswordFormController.passwords.password" password-new-repeated="ForcePasswordFormController.passwords.passwordRepeated"></habbo-password-new><div class="form__footer"><a ng-click="ForcePasswordFormController.onDismiss()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ForcePasswordFormController.changeInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'), e.put("security/force/force-password/force-password-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="FORCED_PASSWORD_CHANGE_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-force-password-form on-dismiss="$dismiss()" on-success="$close()"></habbo-force-password-form></div>'), e.put("security/force/force-tos/force-tos-form.html", '<form ng-submit="ForceTosFormController.accept()" name="forceTOSAcceptForm" novalidate class="form"><p translate="NEW_USER_AGREEMENT_INFO_TEXT"></p><p translate="NEW_USER_AGREEMENT_GUIDE_TEXT"></p><div class="form__footer"><a ng-click="ForceTosFormController.onDismiss()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ForceTosFormController.acceptInProgress" type="submit" class="form__submit" translate="NEW_USER_AGREEMENT_BUTTON"></button></div></form>'), e.put("security/force/force-tos/force-tos-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="NEW_USER_AGREEMENT_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-force-tos-form on-dismiss="$dismiss()" on-success="$close()"></habbo-force-tos-form></div>'), e.put("security/login/captcha-modal/captcha-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="CAPTCHA_TITLE" class="modal__title"></h3><div class="modal__content"><form novalidate><p translate="CAPTCHA_DESCRIPTION"></p><habbo-captcha captcha-token="captchaToken"></habbo-captcha></form></div>'), e.put("security/login/claim-password/claim-password-form.html", '<form ng-submit="ClaimPasswordFormController.send()" name="claimPasswordForm" novalidate class="form"><div ng-hide="ClaimPasswordFormController.sent"><div ng-transclude></div><habbo-email-address email-address="ClaimPasswordFormController.emailAddress"><label for="email-address" class="form__label" translate="FORM_ACCOUNT_EMAIL_LABEL"></label></habbo-email-address><div class="form__footer"><a ng-click="ClaimPasswordFormController.cancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ClaimPasswordFormController.sendingInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_SEND"></button></div></div><div ng-show="ClaimPasswordFormController.sent" class="ng-hide"><p translate="CLAIM_PASSWORD_SUCCESS"></p><h4 class="claim-password__email">{{ClaimPasswordFormController.emailAddress}}</h4><p><b translate="CLAIM_PASSWORD_SUCCESS_NOTE"></b></p></div></form>'), e.put("security/login/claim-password/claim-password-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 class="modal__title" translate="CLAIM_PASSWORD_TITLE"></h3><div class="modal__content"><habbo-claim-password-form cancel="$dismiss()"></habbo-claim-password-form></div>'), e.put("security/login/claim-password/recover-password-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 class="modal__title" translate="RECOVER_PASSWORD_TITLE"></h3><div class="modal__content"><habbo-claim-password-form email-address="RecoverPasswordController.email" cancel="$dismiss()"><div class="form__message form__message--error" translate="RECOVER_PASSWORD_ERROR"></div></habbo-claim-password-form></div>'), e.put("security/login/facebook-connect/facebook-connect.html", '<button ng-click="FacebookConnectController.fbLogin()" ng-disabled="FacebookConnectController.loginInProgress" class="facebook-connect">{{ FacebookConnectController.translationKey | translate }}</button>'), e.put("settings/account-security/safety-questions/safety-questions-form.html", '<form ng-submit="SafetyQuestionsFormController.save()" name="safetyQuestionsForm" novalidate class="form"><p translate="ACCOUNT_SECURITY_FORM_DESCRIPTION"></p><fieldset class="form__fieldset form__fieldset--box form__fieldset--box-top"><label for="safety-questions-question1" class="form__label" translate="ACCOUNT_SECURITY_QUESTION1_LABEL"></label><div class="form__field"><select id="safety-questions-question1" name="question1" ng-options="question.questionKey | translate for question in SafetyQuestionsFormController.questions | question: SafetyQuestionsFormController.selectedQuestion2" ng-model="SafetyQuestionsFormController.selectedQuestion1" class="form__select"></select></div><label for="safety-questions-answer1" class="form__label" translate="ACCOUNT_SECURITY_ANSWER1_LABEL"></label><div class="form__field"><input id="safety-questions-answer1" type="password" name="answer1" ng-model="SafetyQuestionsFormController.answer1" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required maxlength="255" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyQuestionsForm.answer1.$invalid && (!safetyQuestionsForm.answer1.$pristine || safetyQuestionsForm.$submitted)" ng-messages="safetyQuestionsForm.answer1.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div></div></div></fieldset><fieldset class="form__fieldset form__fieldset--box form__fieldset--box-bottom"><label for="safety-questions-question2" class="form__label" translate="ACCOUNT_SECURITY_QUESTION2_LABEL"></label><div class="form__field"><select id="safety-questions-question2" name="question2" ng-options="question.questionKey | translate for question in SafetyQuestionsFormController.questions | question: SafetyQuestionsFormController.selectedQuestion1" ng-model="SafetyQuestionsFormController.selectedQuestion2" class="form__select"></select></div><label for="safety-questions-answer2" class="form__label" translate="ACCOUNT_SECURITY_ANSWER2_LABEL"></label><div class="form__field"><input id="safety-questions-answer2" type="password" name="answer2" ng-model="SafetyQuestionsFormController.answer2" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required maxlength="255" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyQuestionsForm.answer2.$invalid && (!safetyQuestionsForm.answer2.$pristine || safetyQuestionsForm.$submitted)" ng-messages="safetyQuestionsForm.answer2.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div></div></div></fieldset><habbo-password-current password-current="SafetyQuestionsFormController.password"></habbo-password-current><div class="form__footer"><a ng-click="SafetyQuestionsFormController.onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="SafetyQuestionsFormController.saveInProgress" type="submit" translate="FORM_BUTTON_SAVE" class="form__submit"></button></div></form>'), e.put("settings/account-security/safety-questions/safety-questions-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="ACCOUNT_SECURITY_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-safety-questions-form on-save="$close()" on-cancel="$dismiss()"></habbo-safety-questions-form></div>'), e.put("settings/avatar-selection/avatar-create/avatar-create-form.html", '<form ng-submit="AvatarCreateFormController.create()" name="avatarCreateForm" novalidate class="form avatar-create-form"><fieldset class="form__fieldset"><label for="avatar-name" class="form__label" translate="AVATAR_CREATE_LABEL"></label><div class="form__field"><input id="avatar-name" name="name" ng-model="AvatarCreateFormController.name" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required ng-minlength="3" ng-maxlength="15" ng-pattern="/^[a-zA-Z0-9_\\-\\=\\?\\!@\\:\\.,\\$]+$/" ng-trim="true" habbo-avatar-name-check autofocus class="form__input"><div ng-if="avatarCreateForm.name.$invalid && (!avatarCreateForm.name.$pristine || avatarCreateForm.$submitted)" ng-messages="avatarCreateForm.name.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="minlength">{{\'ERROR_FIELD_MINLENGTH\' | translate: \'{ min: 3 }\'}}</div><div ng-message="maxlength">{{\'ERROR_FIELD_MAXLENGTH\' | translate: \'{ max: 15 }\'}}</div><div ng-message="pattern">{{\'ERROR_FIELD_NAME_FORMAT\' | translate}}</div><div ng-message="name">{{\'ERROR_FIELD_NAME_TAKEN\' | translate}}</div></div></div><small class="form__helper" translate="AVATAR_CREATE_HELP"></small></fieldset><div class="form__footer"><a ng-click="AvatarCreateFormController.onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="AvatarCreateFormController.createInProgress" type="submit" translate="FORM_BUTTON_CREATE" class="form__submit"></button></div></form>'), e.put("settings/avatar-selection/avatar-create/avatar-create-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="AVATAR_CREATE_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-avatar-create-form on-create="$close()" on-cancel="$dismiss()"></habbo-avatar-create-form></div>'), e.put("settings/avatar-selection/avatar-create/avatar-create.html", '<div class="avatar-create" ng-class="{ \'avatar-create--disabled\': avatars.length === MAX_AVATARS || (!emailVerified && !identityVerified) }"><div ng-if="avatars.length < MAX_AVATARS && identityVerified" class="avatar-create__text" translate="AVATAR_CREATE_MORE" translate-values="{ count: MAX_AVATARS - avatars.length }"></div><div ng-if="!emailVerified && !identityVerified" class="avatar-create__text" translate="AVATAR_CREATE_EMAIL_UNVERIFIED"></div><div ng-if="avatars.length === MAX_AVATARS" class="avatar-create__text" translate="AVATAR_CREATE_MAX"></div><div class="avatar-create__button__wrapper"><button ng-click="open()" ng-disabled="avatars.length === MAX_AVATARS || (!emailVerified && !identityVerified)" class="avatar-create__button" translate="AVATAR_CREATE_BUTTON"></button></div></div>'),
  4905.    e.put("settings/avatar-selection/avatar-search/avatar-search.html", '<habbo-search query="query"></habbo-search><ul class="avatar-search__avatars"><habbo-avatar-selector ng-repeat="avatar in AvatarSearchController.avatars | byNameDescriptionOrMotto: query | orderBy: [\'-lastWebAccess\', \'name\']" avatar="avatar"></habbo-avatar-selector></ul><habbo-empty-results ng-if="(AvatarSearchController.avatars | byNameDescriptionOrMotto: query).length === 0"></habbo-empty-results>'), e.put("settings/avatar-selection/avatar-search/avatar-selector.html", '<li ng-class="{ \'avatar-selector--selected\': AvatarSelectorController.isSelected }" class="avatar-selector"><habbo-imager figure="{{:: AvatarSelectorController.avatar.figureString}}" name="{{:: AvatarSelectorController.avatar.name}}" direction="s" action="stand" class="avatar-selector__avatar"></habbo-imager><div class="avatar-selector__content"><h4 class="avatar-selector__name">{{:: AvatarSelectorController.avatar.name}}</h4><p ng-if="AvatarSelectorController.avatar.motto" class="avatar-selector__details">{{:: AvatarSelectorController.avatar.motto}}</p><p class="avatar-selector__details avatar-selector__details--last-access">{{\'AVATAR_SELECTION_LAST_LOGIN\' | translate}} <time am-time-ago="AvatarSelectorController.avatar.lastWebAccess"></time></p><p ng-if="AvatarSelectorController.avatar.banned" class="avatar-selector__details--banned" translate="AVATAR_SELECTION_BANNED"></p></div><div ng-if="!AvatarSelectorController.isSelected && !AvatarSelectorController.avatar.banned" class="avatar-selector__select"><button habbo-require-non-staff-account-session ng-click="AvatarSelectorController.select()" ng-disabled="AvatarSelectorController.selectionInProgress" class="avatar-selector__button" translate="AVATAR_SELECTION_SELECT_BUTTON"></button></div></li>'), e.put("settings/email-change/activation-status/activation-status.html", '<habbo-message-container ng-if="ActivationStatusController.user.emailVerified" type="check"><h3 translate="EMAIL_VERIFIED_TITLE" class="activation-status__title"></h3><p translate="EMAIL_VERIFIED_TEXT" translate-values="{{:: ActivationStatusController.user}}" class="activation-status__text"></p></habbo-message-container><habbo-message-container ng-if="!ActivationStatusController.user.emailVerified" type="exclamation"><h3 translate="ACTIVATION_RESEND_TITLE" class="activation-status__title"></h3><p translate="ACTIVATION_RESEND_TEXT" translate-values="{{:: ActivationStatusController.user}}" class="activation-status__text"></p><div class="activation-status__controls"><button ng-click="ActivationStatusController.resend()" ng-disabled="ActivationStatusController.resendInProgress || ActivationStatusController.isSent" class="activation-status__submit" translate="ACTIVATION_RESEND_BUTTON"></button></div></habbo-message-container>'), e.put("shop/credit-card-form/credit-card-icon/credit-card-icon.html", '<span ng-if="VoucherIconController.product.icons[0]">&nbsp;<img ng-src="{{:: VoucherIconController.product.icons[0]}}" class="credit-card-icon__product"> {{:: CreditCardIconController.product.name}}</span> <span ng-if="VoucherIconController.credits">&nbsp;<i class="credit-card-icon__credits"></i> {{:: CreditCardIconController.credits}}</span>'), e.put("shop/earn-credits/earn-credits-frame/earn-credits-frame.html", '<iframe ng-src="{{:: EarnCreditsFrameController.offerWallUrl }}" class="earn-credits-frame"></iframe>'), e.put("shop/payment-details/credit-payment-details/credit-payment-details.html", '<habbo-credit-icon amount="{{:: CreditPaymentDetailsController.item.creditAmount}}" double-credits="{{:: CreditPaymentDetailsController.item.doubleCredits}}" class="payment-details__icon"></habbo-credit-icon><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title"><habbo-credit-title amount="{{:: CreditPaymentDetailsController.item.creditAmount}}" double-credits="{{:: CreditPaymentDetailsController.item.doubleCredits}}"></habbo-credit-title></h3><div class="payment-details__price">{{:: CreditPaymentDetailsController.item.price }}</div></header><p ng-if="CreditPaymentDetailsController.item.doubleCredits" translate="SHOP_DOUBLE_CREDITS_DESCRIPTION" translate-values="{ value: CreditPaymentDetailsController.item.creditAmount }"></p><p ng-if="!CreditPaymentDetailsController.item.doubleCredits" translate="SHOP_CREDITS_DESCRIPTION" translate-values="{ value: CreditPaymentDetailsController.item.creditAmount }"></p><habbo-payment-steps item="CreditPaymentDetailsController.item" selected-category="{{CreditPaymentDetailsController.selectedCategory}}"><habbo-payment-info type="store"></habbo-payment-info></habbo-payment-steps></div>'), e.put("shop/payment-details/offer-payment-details/offer-payment-details.html", '<img ng-src="{{:: OfferPaymentDetailsController.offerPaymentDetails.smallImageUrl}}" class="payment-details__icon"><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title">{{:: OfferPaymentDetailsController.offerPaymentDetails.name }}</h3><span class="payment-details__price">{{:: OfferPaymentDetailsController.offerPaymentDetails.price }}</span></header><p>{{:: OfferPaymentDetailsController.offerPaymentDetails.description }}</p><img ng-src="{{:: OfferPaymentDetailsController.offerPaymentDetails.imageUrl}}" class="payment-details__image"><habbo-payment-steps item="OfferPaymentDetailsController.offerPaymentDetails"><habbo-payment-info type="store"></habbo-payment-info></habbo-payment-steps></div>'), e.put("shop/payment-details/payment-info/payment-info-store.html", '<h3 class="payment-steps__title" translate="SHOP_PAYMENT_METHOD"></h3><p class="payment-steps__legal" translate="SHOP_PAYMENT_METHOD_INFO"></p>'), e.put("shop/payment-details/payment-info/payment-info-subscription.html", '<h3 class="payment-steps__title" translate="SHOP_SUBSCRIPTION_METHOD"></h3><p class="payment-steps__legal" translate="SHOP_SUBSCRIPTION_METHOD_INFO"></p>'), e.put("shop/payment-details/payment-steps/payment-steps.html", '<div ng-if="!PaymentStepsController.disclaimerMethod && !PaymentStepsController.premiumSmsMethod && !PaymentStepsController.adyenMethod" class="payment-steps"><div ng-if="PaymentStepsController.user" class="payment-steps__step"><h3 class="payment-steps__title" translate="SHOP_PAYMENT_DETAILS"></h3><table class="payment-steps__user"><tr><td translate="FORM_NAME_LABEL"></td><td>{{:: PaymentStepsController.user.name}}</td></tr><tr habbo-require-habbo-account-session><td translate="FORM_EMAIL_LABEL"></td><td>{{:: PaymentStepsController.user.email}}</td></tr></table></div><div ng-transclude class="payment-steps__step"></div><habbo-payment-methods item="PaymentStepsController.item" selected-category="{{PaymentStepsController.selectedCategory}}" class="payment-steps__step"></habbo-payment-methods></div><habbo-payment-disclaimer ng-if="PaymentStepsController.disclaimerMethod" item="PaymentStepsController.item" method="PaymentStepsController.disclaimerMethod"></habbo-payment-disclaimer><habbo-premium-sms ng-if="PaymentStepsController.premiumSmsMethod" method="PaymentStepsController.premiumSmsMethod"></habbo-premium-sms><habbo-adyen ng-if="PaymentStepsController.adyenMethod" item="PaymentStepsController.item" method="PaymentStepsController.adyenMethod"></habbo-adyen><div ng-if="PaymentStepsController.disclaimerMethod || PaymentStepsController.premiumSmsMethod || PaymentStepsController.adyenMethod" class="payment-steps__cancel"><a ng-click="PaymentStepsController.reset()" translate="SHOP_DISCLAIMER_CANCEL"></a></div>'), e.put("shop/payment-details/product-payment-details/product-payment-details.html", '<habbo-product-icon icon-id="{{:: ProductPaymentDetailsController.item.iconId}}" class="payment-details__icon"></habbo-product-icon><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title">{{:: ProductPaymentDetailsController.item.name}}</h3><div class="payment-details__price">{{:: ProductPaymentDetailsController.item.price}}</div></header><p>{{:: ProductPaymentDetailsController.item.description}}</p><habbo-sub-product-icons ng-if="ProductPaymentDetailsController.item.subProducts" sub-products="ProductPaymentDetailsController.item.subProducts"></habbo-sub-product-icons><habbo-payment-steps item="ProductPaymentDetailsController.item" selected-category="{{ProductPaymentDetailsController.selectedCategory}}"><habbo-payment-info type="store"></habbo-payment-info></habbo-payment-steps></div>'), e.put("shop/payment-details/subscription-payment-details/subscription-payment-details.html", '<habbo-product-icon icon-id="{{:: SubscriptionPaymentDetailsController.item.iconId}}" class="payment-details__icon"></habbo-product-icon><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title">{{:: SubscriptionPaymentDetailsController.item.name}}</h3><div class="payment-details__price">{{:: SubscriptionPaymentDetailsController.item.price}}<small class="subscription__price-unit" translate="SHOP_SUBSCRIPTION_PER_MONTH"></small></div></header><p>{{:: SubscriptionPaymentDetailsController.item.description}}</p><habbo-payment-steps item="SubscriptionPaymentDetailsController.item" selected-category="{{SubscriptionPaymentDetailsController.selectedCategory}}"><habbo-payment-info type="subscription"></habbo-payment-info></habbo-payment-steps></div>'), e.put("shop/store/category-filter/category-filter.html", '<ul class="category-filter"><li class="category-filter__item" ng-repeat="category in CategoryFilterController.paymentCategories"><a ng-click="CategoryFilterController.update(category.key)" translate="{{:: category.translateKey}}" ng-class="{ \'category-filter__link--active\': CategoryFilterController.isActive(category.key) }" class="category-filter__link"></a></li></ul>'), e.put("shop/store/inventory/credits.html", '<section><h3 class="inventory__section__title" translate="SHOP_CREDITS_TITLE"></h3><habbo-accordion-grid class="inventory__grid"><habbo-accordion-item ng-repeat="item in CreditsController.items track by item.id"><habbo-accordion-item-preview><habbo-credit-thumbnail item="item"></habbo-credit-thumbnail></habbo-accordion-item-preview><habbo-accordion-item-content><habbo-credit-payment-details item="item" selected-category="{{CreditsController.selectedCategory}}"></habbo-credit-payment-details></habbo-accordion-item-content></habbo-accordion-item></habbo-accordion-grid></section>'), e.put("shop/store/inventory/inventory.html", '<div ng-if="InventoryController.isDoubleCreditsActive"><habbo-credits ng-if="InventoryController.creditItems.length > 0" items="InventoryController.creditItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-credits><habbo-products ng-if="InventoryController.productItems.length > 0" items="InventoryController.productItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-products></div><div ng-if="!InventoryController.isDoubleCreditsActive"><habbo-products ng-if="InventoryController.productItems.length > 0" items="InventoryController.productItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-products><habbo-credits ng-if="InventoryController.creditItems.length > 0" items="InventoryController.creditItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-credits></div>'), e.put("shop/store/inventory/products.html", '<section><h3 class="inventory__section__title" translate="SHOP_OFFERINGS_TITLE"></h3><habbo-accordion-grid class="inventory__grid"><habbo-accordion-item ng-repeat="item in ProductsController.items track by item.id"><habbo-accordion-item-preview><habbo-product-thumbnail item="item"></habbo-product-thumbnail></habbo-accordion-item-preview><habbo-accordion-item-content><habbo-product-payment-details item="item" selected-category="{{ProductsController.selectedCategory}}"></habbo-product-payment-details></habbo-accordion-item-content></habbo-accordion-item></habbo-accordion-grid></section>'), e.put("shop/store/targeted-offer/targeted-offer.html", '<habbo-accordion-grid class="offer__grid"><habbo-accordion-item class="accordion__item--single"><habbo-accordion-item-preview><habbo-offer-thumbnail item="TargetedOfferController.offer" class="offer__item__thumbnail"></habbo-offer-thumbnail></habbo-accordion-item-preview><habbo-accordion-item-content><habbo-offer-payment-details offer-payment-details="TargetedOfferController.offerPaymentDetails"></habbo-offer-payment-details></habbo-accordion-item-content></habbo-accordion-item></habbo-accordion-grid>'), e.put("shop/thumbnails/credit-thumbnail/credit-thumbnail.html", '<div class="inventory-thumbnail"><div class="inventory-thumbnail__body"><habbo-credit-icon amount="{{:: CreditThumbnailController.item.creditAmount}}" double-credits="{{:: CreditThumbnailController.item.doubleCredits}}" class="inventory-thumbnail__icon"></habbo-credit-icon><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title"><habbo-credit-title amount="{{:: CreditThumbnailController.item.creditAmount}}" double-credits="{{:: CreditThumbnailController.item.doubleCredits}}"></habbo-credit-title></h3></div><div class="inventory-thumbnail__banner"><span class="inventory-thumbnail__price">{{:: CreditThumbnailController.item.price}}</span></div></div></div>'), e.put("shop/thumbnails/offer-thumbnail/offer-thumbnail.html", '<div class="inventory-thumbnail inventory-thumbnail--offer"><div class="inventory-thumbnail__body"><div class="inventory-thumbnail__highlight__banner"><span class="inventory-thumbnail__highlight-wrapper"><span ng-if="OfferThumbnailController.item.highlight" class="inventory-thumbnail__highlight">{{:: OfferThumbnailController.item.highlight}} |</span> <span translate="SHOP_TARGETED_OFFER_EXPIRY_TITLE"></span> <time am-time-ago="OfferThumbnailController.item.expirationDate"></time></span></div><img ng-src="{{:: OfferThumbnailController.item.imageUrl}}" class="inventory-thumbnail__icon inventory-thumbnail__icon--large"> <img ng-src="{{:: OfferThumbnailController.item.smallImageUrl}}" class="inventory-thumbnail__icon"><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title">{{:: OfferThumbnailController.item.header}}</h3><p class="inventory-thumbnail__description">{{:: OfferThumbnailController.item.description}}</p></div><div class="inventory-thumbnail__banner"><span class="inventory-thumbnail__price">{{:: OfferThumbnailController.item.pricePoint.price}}</span></div></div></div>'), e.put("shop/thumbnails/product-thumbnail/product-thumbnail.html", '<div class="inventory-thumbnail"><div class="inventory-thumbnail__body"><habbo-product-icon icon-id="{{:: ProductThumbnailController.item.iconId}}" class="inventory-thumbnail__icon"></habbo-product-icon><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title">{{:: ProductThumbnailController.item.name}}</h3></div><div class="inventory-thumbnail__banner"><span class="inventory-thumbnail__price">{{:: ProductThumbnailController.item.price}}</span></div></div></div>'), e.put("shop/thumbnails/subscription-thumbnail/subscription-thumbnail.html", '<div class="inventory-thumbnail"><div class="inventory-thumbnail__body"><habbo-product-icon icon-id="{{:: SubscriptionThumbnailController.item.iconId}}" class="inventory-thumbnail__icon"></habbo-product-icon><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title">{{:: SubscriptionThumbnailController.item.name}}</h3></div><div class="inventory-thumbnail__banner"><div class="inventory-thumbnail__price">{{:: SubscriptionThumbnailController.item.price}}<small class="subscription__price-unit" translate="SHOP_SUBSCRIPTION_PER_MONTH"></small></div></div></div></div>'), e.put("shop/transactions/transactions-history/transactions-history.html", '<table class="transactions-history"><thead><tr><th translate="TRANSACTIONS_TABLE_DATE"></th><th translate="TRANSACTIONS_TABLE_PURCHASE"></th><th translate="TRANSACTIONS_TABLE_VALUE"></th></tr></thead><tbody><tr ng-repeat="item in TransactionsHistoryController.transactions | orderBy: \'-creationTime\' | limitTo: TransactionsHistoryController.limitTo track by $index"><td data-th="{{\'TRANSACTIONS_TABLE_DATE\' | translate}}">{{:: item.creationTime | amDateFormat: \'D MMM YYYY\'}}</td><td data-th="{{\'TRANSACTIONS_TABLE_PURCHASE\' | translate}}"><span ng-if="item.product" class="product-name">{{:: item.product.name}}</span> <span ng-if="item.credits > 0" class="credits" translate="CREDITS_AMOUNT" translate-values="{ value: item.credits }"></span></td><td data-th="{{\'TRANSACTIONS_TABLE_VALUE\' | translate}}">{{:: item.price}}</td></tr></tbody></table>'), e.put("shop/voucher-redeem/voucher-icon/voucher-icon.html", '<span ng-if="VoucherIconController.product.icons[0]">&nbsp;<img ng-src="{{:: VoucherIconController.product.icons[0]}}" class="voucher-icon__product"> {{:: VoucherIconController.product.name}}</span> <span ng-if="VoucherIconController.credits">&nbsp;<i class="voucher-icon__credits"></i> {{:: VoucherIconController.credits}}</span>'), e.put("common/form/password-new/password-strength/password-strength.html", '<div class="password-strength__label"><span>{{ \'PASSWORD_STRENGTH_LABEL\' | translate }}</span> <span>{{ PasswordStrengthController.score | strengthRating | ratingTranslation | translate }}</span></div><div class="password-strength__field"><div habbo-password-strength-indicator="PasswordStrengthController.score" ng-class="\'password-strength__indicator--\' + (PasswordStrengthController.score | strengthRating)" class="password-strength__indicator"></div></div><p ng-transclude class="password-strength__error"></p>'), e.put("shop/payment-details/payment-steps/adyen/adyen.html", '<div ng-if="AdyenController.state === \'AWAITING_INPUT\'"><h3 translate="SHOP_PAYMENT_ADYEN_CARD_DETAILS" class="adyen__form-header"></h3><img ng-src="{{:: AdyenController.method.buttonLogoUrl}}" class="adyen__form-header-icon"><div class="adyen__form-wrapper"><habbo-credit-card-form class="adyen__form" card="AdyenController.card" on-submit="AdyenController.onSend(data)"></habbo-credit-card-form></div></div><habbo-message-container ng-if="AdyenController.state === \'SUCCESS\'" type="check" class="adyen__result-box"><h3 translate="SHOP_PAYMENT_COMPLETED" class="adyen__form-header"></h3><p translate="SHOP_PAYMENT_TRANSACTION_DETAILS" translate-values="{ transactionId: AdyenController.transactionId }"></p><button type="submit" translate="OK" class="payment-methods__button payment-button" ng-click="AdyenController.close()"></button></habbo-message-container><habbo-message-container ng-if="AdyenController.state === \'FAILURE\'" type="x" class="adyen__result-box"><h3 translate="SHOP_PAYMENT_FAILED" class="adyen__form-header"></h3><p ng-if="AdyenController.errorType === \'HTTP_ERROR\'">{{:: AdyenController.errorMsg}}</p><p ng-if="AdyenController.errorType === \'USER_DATA\'" translate="SHOP_PLEASE_CHECK_CREDIT_CARD"></p><p ng-if="AdyenController.errorType === \'LIMIT_EXCEEDED\'" translate="SHOP_LIMIT_EXCEEDED"></p><p ng-if="AdyenController.errorType === \'RISK_CHECK_FAILED\'" translate="SHOP_RISK_CHECK_FAILED"></p><button type="submit" translate="OK" class="payment-methods__button payment-button" ng-click="AdyenController.showInputForm()"></button></habbo-message-container>'), e.put("shop/payment-details/payment-steps/payment-button/payment-button.html", '<button ng-click="PaymentButtonController.purchase()" ng-disabled="PaymentButtonController.paymentInProgress" class="payment-button" translate="{{:: PaymentButtonController.translationKey}}"></button>'), e.put("shop/payment-details/payment-steps/payment-disclaimer/payment-disclaimer.html", '<h3 class="payment-steps__title payment-steps__title--single" translate="SHOP_SMALLPRINT_TITLE"></h3><small class="payment-steps__step payment-steps__legal" translate="{{:: PaymentDisclaimerController.methodSmallPrintKey}}"></small><ul class="payment-steps__step"><li class="payment-methods__method"><habbo-payment-button item="PaymentDisclaimerController.item" method="PaymentDisclaimerController.method" class="payment-methods__button"></habbo-payment-button></li></ul>'), e.put("shop/payment-details/payment-steps/payment-methods/payment-methods.html", '<ul><li ng-repeat="paymentMethod in PaymentMethodsController.item.paymentMethods | paymentCategory: PaymentMethodsController.selectedCategory" class="payment-methods__method"><img ng-if="paymentMethod.buttonLogoUrl" ng-src="{{:: paymentMethod.buttonLogoUrl}}" class="payment-methods__icon"> <span ng-if="!paymentMethod.buttonLogoUrl && (paymentMethod.category === \'online\' || paymentMethod.category === \'prepaid\')" class="payment-methods__label">{{:: paymentMethod.name}}</span> <span ng-if="!paymentMethod.buttonLogoUrl && (paymentMethod.category === \'mobile\' || paymentMethod.category === \'landline\')" class="payment-methods__label" translate="{{:: PaymentMethodsController.PaymentStepsController.getMethodTitleKey(paymentMethod)}}"></span><habbo-payment-button ng-if="!paymentMethod.disclaimerRequired && !paymentMethod.premiumSms && paymentMethod.requestPath !== \'direct\'" item="PaymentMethodsController.item" method="paymentMethod" class="payment-methods__button"></habbo-payment-button><button ng-if="paymentMethod.disclaimerRequired && !paymentMethod.premiumSms && paymentMethod.requestPath !== \'direct\'" ng-click="PaymentMethodsController.PaymentStepsController.setDisclaimer(paymentMethod)" class="payment-methods__button payment-button" translate="SHOP_CONTINUE_BUTTON"></button> <button ng-if="paymentMethod.premiumSms" ng-click="PaymentMethodsController.PaymentStepsController.setPremiumSms(paymentMethod)" class="payment-methods__button payment-button" translate="SHOP_CONTINUE_BUTTON"></button> <button ng-if="paymentMethod.requestPath === \'direct\'" ng-click="PaymentMethodsController.PaymentStepsController.setAdyen(paymentMethod)" class="payment-methods__button payment-button" translate="SHOP_CONTINUE_BUTTON"></button></li></ul>'), e.put("shop/payment-details/payment-steps/premium-sms/premium-sms.html", '<h3 translate="SHOP_PAYMENT_PSMS_INSTRUCTIONS"></h3><p translate="{{:: PremiumSmsController.methodInstructionKey}}"></p><div class="premium-sms__voucher-redeem__wrapper"><habbo-voucher-redeem class="premium-sms__voucher-redeem"></habbo-voucher-redeem></div><p translate="SHOP_PAYMENT_PSMS_HELP"></p><h3 translate="SHOP_SMALLPRINT_TITLE"></h3><small class="premium-sms__legal" translate="{{:: PremiumSmsController.methodSmallPrintKey}}"></small>'), e.put("shop/payment-details/product-payment-details/sub-product-icons/sub-product-icons.html", '<p class="sub-product-icons__description" translate="SHOP_PRODUCT_SUBPRODUCTS_DESCRIPTION"></p><ul><li ng-repeat="subProduct in SubProductIconsController.subProducts" class="sub-product-icons__icon" data-count="{{:: subProduct.count }}"><img ng-src="{{:: subProduct.imgUrl}}"></li></ul>')
  4906.  }]), angular.module("events", []).constant("EVENTS", {
  4907.   accordionOpen: "accordion-item-open",
  4908.   accordionClose: "accordion-item-close",
  4909.   accordionResize: "accordion-item-resize",
  4910.   accordionUpdate: "accordion-item-update",
  4911.   clientOpen: "client-open",
  4912.   clientClose: "client-close",
  4913.   securityLogin: "security-login",
  4914.   shopPaymentClose: "payment-close"
  4915.  }), angular.module("app", ["ngAnimate", "activate", "community", "console.warning", "creation", "email.optout", "email.report.unauthorized", "eu.cookie.banner", "footer", "help.login", "home", "hotel", "logout", "not.found", "password.reset", "playing.habbo", "profile", "registration", "room", "security", "settings", "shop"]).config(["$provide", function(e) {
  4916.   e.decorator("$exceptionHandler", ["$delegate", function(e) {
  4917.    return function(t, o) {
  4918.     Bugsnag.notifyException(t, {
  4919.      diagnostics: {
  4920.       cause: o
  4921.      }
  4922.     }), e(t, o)
  4923.    }
  4924.   }])
  4925.  }]).run(["spinner", function(e) {
  4926.   e.init()
  4927.  }]),
  4928.  function() {
  4929.   var e = !0;
  4930.   window.Bugsnag || (window.Bugsnag = {
  4931.    notify: _.noop,
  4932.    notifyException: _.noop
  4933.   }), angular.module("app").config(["$sceDelegateProvider", function(e) {
  4934.    var t = e.resourceUrlWhitelist(),
  4935.     o = "https://*.habbo.com/**,https://habboo-a.akamaihd.net/**,https://www.offertoro.com/**".split(",");
  4936.    t = t.concat(o), e.resourceUrlWhitelist(t)
  4937.   }]).config(["$compileProvider", function(t) {
  4938.    t.debugInfoEnabled(!e)
  4939.   }]), angular.module("config", []).constant("CONFIG", {
  4940.    apiUrl: "/api",
  4941.    extraDataUrl: "/extradata",
  4942.    shopUrl: "/shopapi",
  4943.    appStoreUrl: "https://itunes.apple.com/app/id794866182",
  4944.    badgeUrl: "https://habboo-a.akamaihd.net/c_images/album1584",
  4945.    googlePlayUrl: "https://play.google.com/store/apps/details?id=air.com.sulake.habboair",
  4946.    habboWebAdsUrl: "https://habboo-a.akamaihd.net/habbo-web-ads/",
  4947.    habboWebLeaderboardsUrl: "https://habboo-a.akamaihd.net/habbo-web-leaderboards/",
  4948.    habboWebNewsUrl: "https://habboo-a.akamaihd.net/habbo-web-news/en/production/",
  4949.    habboWebPagesUrl: "https://habboo-a.akamaihd.net/habbo-web-pages/production/",
  4950.    imagingUrl: "/habbo-imaging",
  4951.    lang: "en",
  4952.    hotel: "hhus",
  4953.    localizationSite: "com",
  4954.    minAge: parseInt("13", 10),
  4955.    rpxLocale: "en",
  4956.    rpxTokenUrl: "https://www.habbo.com/api/public/authentication/rpx",
  4957.    offerToroEnabled: "true",
  4958.    twitterAccount: "@Habbo",
  4959.    adyenPublicKey: "10001|DB119F7832E23CBEDA2A330D3C13310D78ABA07136CDFFFA3D798BDFE4A903D5A079EE09710BBEC72573F0CA80D48DD0380D8AC1B0FDBCB978E69E9BE92ABDC27020858A52DC8D7A9C2D77B071FE1E6A3177E4E73E8E7CFC4A13C881BBBEF3C2EFBB24475818AB9E56BC597BABFD306593C3DF2B16F49D38F560212C183492EE7D0750CE84AB3509563CB3C99EC0B815CF5211E793500110B2A53DCAD793E267677BBE89035E5E9662FD2DB94A5EECBD6FB81F5DAF7205F9EBF15963639FC72DF0875CC2249FB31B300CC8183B2C948B3B3843C414677C9EC82C6A2D4CBF937B57FD03A53B0A8A56369AD490CEAB9EED18FE77E7B9032445A57A06CE23DE6115"
  4960.   }), angular.module("locale", ["angularMoment", "pascalprecht.translate"]), angular.module("angularMoment").run(["amMoment", function(e) {
  4961.    e.changeLocale("en")
  4962.   }]), angular.module("ezfb").config(["ezfbProvider", function(e) {
  4963.    e.setInitParams({
  4964.     appId: "1417574575138432"
  4965.    }), e.setLocale("en_US")
  4966.   }]), angular.module("noCAPTCHA").config(["noCAPTCHAProvider", function(e) {
  4967.    e.setLanguage("en"), e.setSiteKey("6LdhyucSAAAAAKNhbY53azV2gZul4DcD8Xo111yp")
  4968.   }]), angular.module("pascalprecht.translate").config(["$translateProvider", function(e) {
  4969.    e.preferredLanguage("com"), e.useStaticFilesLoader({
  4970.     prefix: "https://habboo-a.akamaihd.net/habbo-web-l10n/",
  4971.     suffix: ".json"
  4972.    }), e.useSanitizeValueStrategy("escapeParameters")
  4973.   }])
  4974.  }();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement