403Webshell
Server IP : 46.105.57.169  /  Your IP : 216.73.217.35
Web Server : Apache
System : Linux webm002.cluster120.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User : verseaumee ( 152031)
PHP Version : 8.5.7
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/verseaumee/123click/assets/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/verseaumee/123click/assets/wp-reset.zip
PK!�	index.phpnu�[���<?php
// Silence is golden
PK!�/:�)�)img/wp-reset-logo.pngnu�[����PNG


IHDR@9ēUgAMA���a cHRMz&�����u0�`:�p��Q<	pHYs.#.#x�?vbKGD�C�)QIDATx^�\TW����3���RE���Ǝ%F41J]��5�컄�l4kL֘���K��=��%��H�!�{���>�> 3�������p�s�ܹ���y�S�$.\����2�,D�M�ϛ3a�g��
�V���.\�p�#\b�…��.\8���p��)��ąN�%&.\�p
.1q�…Sp�3qː!�R���Na�-�>d2�m&��f2���7��j�,��D�^�_Irr2��������8N���tϲ2�^Ϣ�:2��4�
4�6n�=�y��zSC� Q�|�������Z����c�Xȟ�9���yy��z��d2�����~&��W%��&LQ!S(f_р��v��Qa^[�v�R�C�Mz�K���d6��!�*TMs��ȴ���X�VO�I!��	�I~`c��< �:���B!ӑ
�dg7���ºu��
ӑi6��|p��مU�6z�������+ժj��]�-j�u�R4z	!�ð`�JYc��(�5�c[Z[t�<m��L�L����6s8�<�wӍ�~ݴ0�1u�S�9���$�Bk���(Ǡ3�I�$�$Y@�P� ���2�-f5���w��_o2�{�?%E�>���R���e�U���XܗB&	�*���d2��@F�D"Q
8�������2�ٳ�.�_�:i�\���6�>��3>2m22*j��d*D�U�ѣ�=��d��m�	H���͸q��e�DrTL�%�B9
�6���?�?���P!@	J;s���B���"���θ9��Ha������>�m68Ex����(�sf2i[Ƚ�|�q�^��Y�,��I�Ed�D$�z��~�KfZ�vm��E��d�Z��%�!z��I��LL6l�,���%n���R)��tz+Bk:�n�r8y^B��}�n���������W^S���榥��/xp�|`��p8"o���w�߿��PpW�]RUV����u��}�=/6�U+��<>0x�W����$�~��鳿���^�L�C�r9���P��4��Y�x1�l��A&&�;t�ld��^��h��i�@p��,jL`bt�	p粁��!���-%˽���c�F�
xv�w�?w����F�煄(@�)�$$���yP���dss�D{�b0h�2YLii�GE�3�,|
�X2;DRR2g���ɹ�����]�Zc��@��U*U���ʿݻ�Y?ga���C$&%č�r�nV�㚺�u ��%$�z�{j��6�N��$nܔ�om���nP�E��h�ZmW����T*U<d�2��K�����F�3L��h.�s����J.��{�L!=J0|�S*��>�LN`Y���c��A�^8 3�'N��MqQ�^�V灒���_]�v�����T�R��{�R��/-)�WY+��aßyF�y�7C��ܭ��{_o0�Qr�ySXRR����۩�CɄ��|������+K�K@���C=�h00%��o]��ɬ��^Aɿ����i\7�a����	���p�%p��>��"dB�"� �UI^2�
�6���e����l���g�N�Lrn�F��+rQ�e�ԙ���k�F�C,Z�u�~a�D*�mo�J��M�˹���7gᒱ(�e+W�?���\�GIN����ƅY�^Y�j%�i�v�i?���}
ĻW�V������i�a菒_(���#�ɰZ)�����t+
��%V��3�E���̹�5��@7�E�2�6�rؿ�U�=�����s�]x
%�.dҚ��iK\yG�6s�uk��s-]X�4]�V�EI���!�4{�©(�&���

�.�5j�։����<��������p�x�9��ΟK�+{Ct;�r}C�{Wnf�ݽ{7%�0�\x�WL����h&!������@�ꍳ�������L���*�#ȴ
�HhZ�I2�<%�>��B��%���J�5t:�OuM�6d:�+��\^V~���!9��h�VT���J�Je]�*����I�%��
��ːi�cǎQ/��xov�=E,��<x��?��
���$fؐT*�ܖ�A���Pe*�L�D��j�&��Q���..��h�F��2�0��}dZE�'4��s@3
��Bs��
�-[��'��&r�\`0�.�֭K����Pk4v�מb��yE�%'Axa��gٲ��uu�ˑI*�j�r9:���7�wz����\�n������D"Y��
�ޙ9o��Cis�222�A����T��t߷־�YZZ����ᙨT��.�
��{�n��ڵk�M�\w�WU*5�����v���ٍ���%�}�$��[H�<��a���?�t�WQ����V]`($������_� ʼ�}���v�҄��233���Š��`�T��N���(j�*�@&��e~���<��P(��Bw�#����E�G��x
\�t��Z,f���d"܊d0<Lf�oeEI��9O��{
�r2m=Up>w��kXH�7|����z{}F�x}14�7�J
�'�����TzIIQa>J� ��W�����C8�e2�-��W��<�Č��<�g��ju���a2�}��jh�$��)sg������i�a�Z�v ����h4‚7�9l1�Fo��緎�4m�TU�
����O�<�o�u�V�?$f̄�-���(�.B����_�i�	�M�-qȶJd䐤өG��]��|�SO7��兒0B���&3��t)�x�D$�K���i�w����㳟y$�!�����
D��/��ʆC�[$�7*j��;�n>Q��3���Lׄ���)0�L�>��t@`��n�z9�܅��dFN��U5��`,J��a��acR��AIm�?�L,�@�M�������K0�Ж��6�g�׋{NO�;ٙi��豓~�65
o������wW���:d���gjUR����l���7UE�0�����K��>�?~��<z��c�:�ysfO�s��i�1Y��k1��yw�I�$���x�}+�j�{n���$�����f8������A�U6l��v#�n�<QR7��nİ�����$:v+(�>@�M�@] ����o��KP2.511^Z�{���B�v�d�[oy?��d��A��<n�=��{"&��f���A���xb����@�w���.��ܩ
p?nܔ�I"������lQIJ�ǿԠ$L�P����#�b	�~F"�׹�[7� ��s�N�׻�)�	>��4o�4_[�֙�7�˾�}����'�F��^4'苔)J"-Y�jln^�-�g	�f��
�u�ȡ;(	����/^QZR�6��d�Pi4��ظ����vl�F�L�hѫr�����5q�{�JS��BQ*����I��jm
	�Ag8p��]x��(a
��l�|�!��gg7�K0[,���T"�z�z�i��%�
PD�<n~DD��	c���/3���+�2o][��~}�څ�w>�^&��x37—'$H��*�Mzi�H(��".MM-3�~���Ij�hDD��F�NDH �~��K�y�6�˿�~�K�@Uu��	�F�8pQ!���f�p���Ak`��mb2Ue%=�@�����j�����v^+�����`0�7xQ��o�l�76�7Y��p9�‹��.p��U�/�|`�y$�O�r���h�|_hn��:�H@hcKHڑH$���ڴi�S:\=�&�~��Λ=}4�}�ݶt�*��^��}��lxxh�7ߴ��<�a�!+�L&�G=���E�F7	����>�����}�F��6
�jzytt����B�Z�L�������'�`V����EB/\��(T�D"��S���;���X&���)9�W"�d4�C�V	
	>
F��JYN>fg4�����Z�����G�� �� ��L����3S���DHJzW��Hl
I;�d����V�J&�9�(>>޻�_>�g��$,�
�b��|�׻w�E���
��� .�2�\�K


��t\AQ(�C^^�@��:|P��Sƅ�mA��cֲ�����3"��i6d�.d:D��O)2n+�\��}kû1��5���Ȩ!YT3���RnV��Z���J�r2�J/C��O)d
��s�Xj��xӦ��&�%&�6���	2�P����qp���9-��[���x����l%B�X2��<�#ݷm�尛�N��2qY�jS�7�v	�R��?���0�~~�?\��h�#`]	܇�����m0��lQQ�Sg�MNH�����~����m۷oW����j%�1l��/��L8��={
��<D&&�>ƭ:�)]�d�֭��7~��6t�T6x6�Kh4�CN��˫%YE.��l	*.��Lf8�M�<^����h�����G&���.BV�� �^��V��xbD�X�������m�.Jd��b�bAI��L��ƫ޿7�=% ��<:���e�zjaIEG�����.&�kf��U|��,�l����׬[7�'
;C	�J��Qz�,���0:C&So�]LLf�(��kt{��Μ�����_ȴ
��͹/s$2�7q��@f7�E޻2o]}����uA��ې0o&Ϛ �_�l����i���CW?v�'dv�$z�.����n�Օ��cC�ng�$���<��̀���E_���C/ڵkW7��hk�?��>���(	��/Mz]*m��6a0���+d�.�w@�R�w������Lk�ݼbŚ�9O�F�]��`E��_�b��rX�cc�o�<'F���RQy�Z�Ta�9T
E��q7*dr������M�-��i���0��K��W������,�
����c6�ЮUBB\���x���F���%�uV�AK����X,��� �Ffw�$̹O��Ht::!��6!��q��Bihl������d��P@(�=bh.2	��pq�w z��%�|�!�p�̎�'����o�ϑI���򾍍�U啕G>~�a�q�M��y�+��r 88X�'$��̔������݈	��du�~��.Txxp!�i�NGS��U�W\$k��|P�,�V�h��D�P(T��Y�e�D�\�Z���Ag�:t�j��:(�f�2P����4¡�5`h���dN���2��f�IG[y�n|����� �`>G�1�]��06�o�'��e[�L&rK�,���~s^��g.\��7��%+Vc��AK�?��b����n��ML��gf�XVÃ��v��+��
5<�k*�z/55���p�֭�P�9
�J��Cϻ�/��
}tZf����b��G����V42v�Ǚ#â����[��	6KO(xws~��ڪ��,7���4ZG'k�1#@�n@P�
���^jT
�	����1Cc!w	i@��Κ6q������k
��S,�n���}0v´����);���hz��u��녜sQl`Յ��p;�kdZx��D��O���D���2���L#�����o�)["����HX�5b�qݬ�m/�D��y�Z�W�%�#C�|�}�7��2�Z���((�iW7�>�dm
���K��wc��S��n�.�ߊ^jdҳ���J�^̀=����k���:~aP����q�D;f��=����܉S�A��V7c0�R��+<kB�|�{�U1�u���]�g�|-��lY�v�v����v
��Z�a���.��R̉r8lv��Sz�n
�Aĭr�σ�2��'��C�R|ѮU�d�:�	��߲�{a6����K�N}5b˜ ��~��p�u�P�1��ꚺ�>)=�|��d�~��1yʮ�^�`UL>�������V�T��v�| �nnj�9+��U�J�|fĠ% ����ia��2��~`m|[G����Z��4��m{��b�q0'�GBC �\�9��B��~��ǽZ���dؽZ��B)Wb�w�lM�������������3B �D2+;��~8x%�8<~��B�c%��5l^ՙsV�G�U|}|7e�]nkF�y�K%��ppS۱���/��͈Gf/M�v����f�>���e��@�w�}Wx���2F�����G��e���a�}�TR�LƝx��Y@��#虐�5���Y�i�ӟb
Jc1Yi���%<�KOf��c���ں���i�����	ͳ�,<�g��v�]	(��յ���t�Z�f>VxnX��_N�m��g/^S�{�v�T
E=2&�$S�����F)��ǽ�فS��A�����p7�^p�l�O�D³Y���u�i�����η�ϟ3n\��O�������f�.��4�+55E?u�ܑ��w��`��A��3�}Ϟ=�nReT���l�
d�
	��|�S!��ߛ~�ndZ�O��o\~���L�5gIyY��a	�qws;�{7s� ������kk�jt�p��i ��.72���aYuCSk�s�����2=l���z�ɯ��j?�v�]���c��j�fh��g��0�K�
j�ɎI�^Jm�XP��<���Ye��<і�@�Z�5!��ݮ3Z(0d*y�B3���yӝ"$pe��֖��i:�ѣ�Mg2tp�"a(tb@��Ld�,�|�MӉ�?]�ʸ���?m44,,���� �F#�n�Z��_ZU�64#55�l4��(��LfVA�S܅�۰)&Ѕc���M�:�6��[�?�P$�6�,�|��۝��Ef�‚��4f���Gm����\̋��a��a@Pf��u(@�̟�N��LzV�S��^\.�a/2�i|���&�
��K�A��ٔ
�h���5��p����fܼ�r��a�p.t�&��G�ѵ{d���j>���J������Y�,X�dأ�Ey�n��x�U.+�����V����v&�N����M��K]}����x�os��H=u�^�����B!�]0{����$0�)5ʟl����duf���z$N��+<,����}�=�o�fݲk���s �_���T*ŝ_��[t��o��0����6�e�S/B@(��Ա��z�3q�^��Y0�3mⴣ;v�*���:*+'7+�C:�x�W�1�Ν����tM\��~�֡�Q𬑧L���Z��
ɸ<����3��م�����qÜ�sfO�r��4dZ�V̠��i���8��0���fc��\6�v�wp#���1
6D�<%"$�ll8ck%ϳ:$$�uߐ�ܣ�Hpꁲ�xB�y㎃y�z1g�oG"mzy��N�M��4�H$?�m@��Z�>p���T*�Wx�'�v-�v��y����^���X����5ȴ��``?)~�%2�f���e��5�]��7yk��iX,���Z���8������=<=�!�*r�"�d�`N3<*Sј|�5�j�q���HZ
J�����Z

�D�\�.%����5żxq2�j����W��&&:�b]Š7�����dr��!@+_K\��2���Ȱ�|��������ҕ+�n5�<��?757w�f
��0g��1^�af�]Ld-
ܙ���D�.t�����r1�5mG,�̟>k�G�$LŠ5*˫	ͅ�+�E"�(��iC*|Z�[ǃ����p~	�M�p�Tj��1pۛ���3̥&&������{��).){�V��Ɲ�	=��u��2mPNF�D����<�e�!�j��׉okhh�/�+B>x�?q��������5y��ޗ��6�w�����#���/`��HHh�V��y��EK	y�����>����%a�
�@���N��qy�.�!m���;5��"8:]&��b���LU1v�=,&������O&L��W��,x,^�jxQ���Z���$��|dT�M��	n!�H�ׯ^�.�V��!���^9
+u:ǖ5�x�{;
wV��g����}�58��>��F�ALش�]s�~���Ǫ_�=��t������ܬOR����K*�646v����Ñ��������Ÿ����7v�z��bD}}�L�\�V�R^LZ$�~��A �]g����G�(U*��!�g�H$:��#���ޑ�x���?��$�������\l6�f��a��:b�]�!��!Ҥ[�|}}v�����_|a5���s,Y\RZ�O�3�4$lp��s��w,	�0)����:��x<n��P�5nt��۞?/�5�<..Z�����@l�b蕄
}��ө6�ݑq��4�lA&&P ��1/�{��dn5?[֥\1���MHonn!��kg��W޸zs��y�?)t��xz���L�l�n�IYFv�Z���K�~�\Ն��rk�mVC���P�T���SA�RU�C゛�7�
�0����ɔDE����	���"�2o��E�*$��B$5���oim}J�Ph�n�
�r�V������6h�_N��9n��i��Ix�)����l&��F�b�閖�f6��6F�T,�z۸��{����ߥ�
��/����
�������aJ��F�n�^ �#�[Z��ȡ�B�%�~'�&�òY/2w�����t[��p��͵Z�����#cM�C%1��Pǡ)y|���;���.uƬ��=p�!�@�B�J�� ���d��+$tM7$lЫ�
ɋ���c����u)�	@V(�\i�t��d\
J���4�~!ik����J�B�_�L�i#��s�Ҧ7�k���H�{[��z���*�P�B�������Bޅv@�~��t�%K p]"�X�V����M �3�����
	��l�o \�Ħ�@|E~���� $&>��������ݽv۶B�
���aNI`
�چ1#�`V��h4�*���BA�Br'�A*!qpM����W?r�P���ĸ�DBa�nٽ�������b׃]����?T�O���|
���f/ ���Y�{�đ�&�hT��#L:���_|�����B��-�6CBb29.���d�=*��h��@ɍw���pww{��qxFt$(Gne�\!��3��iꁁ��.�;��{���!����ֱ���֘����d��R=�H?����)}���!W߾~�=x��ˉ����_��i�ZMz
�AW���->�ӏ�P.�~�g�YMU�Bbk΁�AX �b��,6��v||Dv}���,�u (�V����fWGGFN��%�W�g�u`�	���xD�� �~1cr��]�p]q�z˸1#���K^Jv:��r��YBM��ϟ�),4d�CI��WÇ�z�!����I�X<�͖OHL ��0;�=�B֌�e=X<�l�M�E8��lx	z,&���h�)��5��x1���:�'^Nzi�[!AA��N�/��78`��/��c�R��{1_�t~gDx�T�B�Z�	\hl����z.�J��􉣗G����<kFo����Q?؋۝�gN�2h.��rX��	Ŭ���r	�\<��O?�������O�K�sج���gw[����C�C���^)T쵄�"\�̡��3Ү��w�^���{\��Ǎ�8$0��' #6A��'0E_�>ߍ��|����w�Cvq��O�"'�
��IcO��ڀ��Đ�a�.�9h���s�ڙ�&�<dp�,77�\X�C���aC#gd޺�p��7=�O����W#�"#�u��=�]W8n��T�e��������.��L�L�2�����D ��N��5�$D{ӰL.�9'
dK�~a�.�}�tibh�T���+��T*_����&��a1�-n|�/�"�7�.I�	˦=*(�ЄB���߮ٽvQ�l���d�X*]%W*b�&3�>� l���ܞ
����W�?�e]r2����
�ו*����� ��C���|������w�>z�)�lA`g�OJF466�Q)Us���`�2�p�����#��+��_{��;��SRY3��Q:�F�����F��.�nV�]b��g�񁿉���F���;:dӎl7�w�G����}���sDLPR[g�7�x;���.ڠ��65��r��@�f��1�F��7�x!�,��!CB����+�@�d�8�Z��ҧ���Xg�e�6��w�(d�(�J3X,s����A5r lp�*�*uƈ����SR0ǀ9p�x��?b6��cxC����L�P
:��K ��<�*ezԐ�e_}�w�����V"	+*��e3c�/�Z�a0<�ޠ�p�*�Pج�k���T�*.�k����`�߶m���db����DL\�pa�u&.\�p��KL\�p�\b�…��.\8���p��)��ąN�%&.\�p
.1q�…Sp��.��KL\�p�\b�…��.\8���p��	�H��Zy���IEND�B`�PK!Ρ�
img/index.phpnu�[���<?php
// Silence is golden
PK!�E�]�]img/wp-force-ssl-logo.pngnu�[����PNG


IHDRX�����	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� cHRMz%������u0�`:�o�_�FR�IDATx��w��Շ_�{ݍ�6����^M5�'���I�zMD'|@h���L1��ދ#����w5��.�f%�43�H��ϣ�eF3�{���s�9���<!�B!���Q!�B!D8�)�IV��Z�u~���	`0|,T3-�����B!D|
��n\+��$ʶ���:���t�sQ_�0�%�L<�󐃁�;9�W��fc���;��|^�f�߁���X�Lf��9��T2Q��Q���HO!�BQ��%����
��r�
��@����W_wFP.VNv�U'�w�v�?�o��{Έ:*��6	��\��M�ߵ|R��4�!�B!d`�1�j����O��a^��@W�.�v��J&����(�w�B��v��>���J&���U�uZ1ں�߼8�8�V}�7�>�c��S��S���2B!�BT��匩���Θ���
�4g���1Y��żN'�t�.�P[�#0=���S}�w"0��Ӏk1��w�_��@�����]�SS��"�FB!�BT��U��<3+c��
�Q��a�<p{���"8�ޘ�m�,F�K�
�]��!�o9���;
���o�����L%��B!�2��˘��V�6q�� �yl���#�HĿ"2�Z��	8��E�؋�sǂP��R��>M���
^
x|�y���(�B!d`�̨�l�>cj~�`م-�p�`��lmc*�]��=Q����98��S�ཅ�s�!
!�B!�4U{LyoL�|L��}.��T2єa[���9���k*�4�A���M�d.z;�O30����xx
�*�L��m(�B!d`EcTu�<S;�?7��A�8S�'�l?�o����DS\�s��݁S���,�|̯�M-�ܸ0�]��.�k$0*�L��-)�B!d`3���/�Θ�B�C_�"������8�I�4��aa��ad�\��%H%�
ޓ10��&�/!�~�o�FOo����nO!�B!˟Q���X�/�6˖{����� C��b�r�X�}����j�71�Q"�m�p�v��L�o���I%��VB!�2��4���K>�0L��X���Į>�q��jq���c�m0OWkŀ�S˨�[d�wf�7xOc5��I%�u�
!�B�j5���7x�^��R1˛j�^��F�W*_.�j^��e�1��[�6��L�ږz_�c��W��0�܏���B!D����C�!�<&`pdW3���+����W�w:p_�}z[���W@�/<���
�o�B!��2��`���lt����d��t����]r�Q�ʲmV�����s�k�۱0�	���B!D�X	�[u(�W5���kQ*��2l���S�{*�t̲O]�il�>�g��_�u�!�B�r0��8��`L��]��W����
�6���v
�U�?�����9���l��B!���Ck,����=��_jWE�ծ���d$�ad
p�䮇5#˶�*�C���w�31!�B!ba`�\�\M�����X�UkL��v@�Ͻm��MdA�o��_5�
p�p3V�X!�B��X�I�@�fz����x2K����3��e�w�}&��zc*���wGb�Á�u�!�B�bX���#n2z$���i��b�m�r|?���9�����dV��W�&F�/��5����,B!�"
kg�QL�mM<[5��ʲ�A�X_�c��7;��QLƽ5V��r�����g�BƵj!�B������8���%������4U��P�������">�I��br�n[u[V��
9�F�PL!�B!2Ң�w�I��&��XH�����<T�X
���q�H����qM��omC}��
�I�拍�·*��8x�۱��t����r�vÄUJ�*��P�wO�%삓�?l�'��ǎ�0��;�+���%i`V�}&4||BȥƎ�PO�x<o��rkܻ}
�~^��E��â����-cy�{&~|��vY���l�v����ܪ�rnlv_ll�Ŕ����LLY�{`"�{֎
�y�S-�,5����d�~pX�Zd;��g�uY����aF���!����[({h\�)�6��;a��<Εy� n¸\�c���<
�|P����ث���pF��1~�6Ģ<��8��kϗ&7����}�˞^f�LywUJ�����3�',�|�3ƻ��T�6pcsc`��zxn|N^^�"��)����͑�*���}/v�,KX��W���
�U�d�ٓ��,�����+��v��ꮼXP��^���_W����jC0��&n��y	��X7�1~F�1��g���ʁ܅�Z��ſ�*�w-�������ovװԑ�`j�����n"{;�!��9�q��1��������?�^�s�e���{a�La��I��g5�(gl�܃-p�-�o\��MŸuq�FVA���Oe�#�"\�HwSdb{`kuW^T���{!e+JSd|U�{V(m1�n)؞����60���g��z��:�U:M����\O�7����Q���-�w�>�����M�.s��H�o�jr��Y�s�S��Š{������dQ?Ǜ�^���_���S��l�"\��dXsŅϢ�PX��x$��lL�Q�u/�)�bd�����^\��Q�(��n�����3S�-�<�	\i<�߾�a���;�kP\�j�-nL���,-k�`�#��x`Z�yj������V�G6�S7�j����Hi����p�
܋���+���X�q���<u�#J�07yMb���&��Ԍ�²VS��r�I�P8��QQ���ǼFGi����{
�O
��j��X��J&2ūv�8r���ZېJ&<L�c��+/��^��p�v+�u���R�s	��ͱ$堆�*�/��a���OL]���GɁ�(,�F]:��K�'.,&�be�}�~��	�Fi�d`U)w�����loI���z�ϙ6����0�1!ki��Q\e�a��W�[���*Ke��b5��Q%�L_�&����`�&�*���Π)u��gT=Ip��b��S��,��L�~�$L3�SM��,,\�	ˏ�E~^��fp%&+��G5�bP?�3Sں�uX�O��sz�p�?`!�BX�<r,Dq9�s*�л�3y=ua$,�)��_��qF�^b���)5*d�k���7�N%�,�O���SoY�1XX�}Cl�9����ic*����V��R-�o1��lW��]�"��u�x�^�}�y,K��	S/5��<U�7P�yz�u��=[��E�.�0�b+9�<N�&�f�ȷ�7�X�����=�3�&YB��2�v�d�Ǹc�U��&T��3��]��A�ƚ�����~ف���n��i�[��Aݚ�b#�
5��+�Z,W��Us{�~��-�>�G'L�a�"�ou7���O/,��0=vr�Rhx��p�Q�d�"���?��$pV��G�[�ݔ�+��cq�R�K%M�
�X�"Iofgf��'�p� ����cd�׺W���c�uw嗢���-��%~�!ت��j����\�M�:7c>����n�G��<�!�������.D�\X�/�J��_G����#(35�M*%՞�d/��
��K~�Y_a�	r�!pd���d�u�&u���&�a�ZMpU�I
�L�y]��&�3�W�ɺ53r1�TE���
3�Z����-�6��mh�=�O�5pL��_�YX�2�s0=���E�J�8'�L4gy�Kn��dd�J�	U��e��T�̳�~�6���!cs�M������"n�m^��ݚY�f�:NĤ�+���F��[zm푞^s��*�L�"
�F,��ir��ze��,_ܘJ&�Ͳ����\�y��e&&dqO�����E*�_��+�(~�<��-7^�`a�2��V�W�y��bm��E�`��W�|�R3k����j���΄'����M�c,Vt$�l�]����?���M��`�	]�f�gLs#�ԭ���I���A��sゐ�{!ő����g��lĜ&un|v�D��B>�i�]>��VV~L�<?�X8��q��q�~�p,1?�c��›���uԵ�X3��7�^'�2P{L�/
k����F�`���x"&F���� ��B5��HW,�oe,drhϟ�X��˪��bFm\H�I`șC,��	�|�5�Ê���u�:�|���v�#f06��ޝW�>鿯G����ˀW1a��ӌ�TL��ʵ�8_���C|����|t���1&�6=ý����C���?I酅�2�-5��f`5���%�d"[X��`�0�M����${8Vg���;K�J&��7x���k[5��W��~��ҫ�E4��S~��]0uа׈wt����8�h�O����;�ml��",��/dW?͗��
��r�C,�7���?j����'�S��Y��OMv��P}��Zw�T������o�ٯ�Ÿ�����5X���n��zx���!�u׮����a�b^X���g�!��{F���&�8�8��<�{�ySN��~��ݔoX��XJ�y�){�?"��ml�,�EXb1�%�@F>7٭>���=�[%�L<Fy����Tg��'�i��.���5K���l�I,�:c��c2F!�g#���°ay��P��0���{aL?aV\:���w=��{$�%*�T�\��T˖n���xط�F��[�{��>^KX�U�"���-P�Zc2�>O�����\枩;�~
빶cH�:S�
�1�o�y�4����{�=��w_��d�`l�M���
,���{^*��4�j���\���so��VK`9[����
L/M�r���5��B|Q���[Ĉ����<V`8/Q�9���^��B��M��Mފ~�鏕#	�����?�ThO|�yq�^�����ye>X,,�Zล�����%�}�x|ֽkn�x��D��X>W�����"0l�����r��?P}���R�[�G��*�8��P`n�0sS�����=N%�`� ��B��:nK���-	V�+��|후p�ëd콄��7���u�J�$,�)��rR����y�.�2�'47�oݪ�;��M����k��,���X��ݪx,�ÔC�±V$XC-��VٖZ��}y�{�{���'`%]Dk���gf秒�L1�=��|�{���XRs.NĒ3q�n�%��{`T�3�͍ث��}��VX��_c!���p‰�_�`��"��B8�EX��_)<0_�gc�YK�OJ7�_�*ޛ��^F%���yݵ��Dh�Ă�[�.��	O�i!6}9��fc��:�%�8�1��?2����T2�Y����x迉�+2Ң����d�G
��U�T�w2�&�~�P	�X�E��%O�AO��6���J\�&�AX�hjۈ�r,&9t�z,pM�~�]X�UKh�͍�qU�Z`���uwǬfO�,���%�;u���f�������X��!��Ͽa�"k�����ljh+�O��}�.KT<�?���Ȟl��(r�"W:ax��Zv
aB�/{�t�ͱ�
����+�E�ۘ�[�~��(-�c�RA9SS+%�	���P���r�_<W�"��nXN��U<>F�AP�̆X�i\�(.%w�a�[�X3�����ũd"�Tws��ʭh�ܭ�"����-�_�kU�#�L,t+����=$��*��x[\V���a�)Vs%([lE3��lV#a��z�U�#x>�Ք�s��^�ϟۚ�u�r�+�&.q`!t�J�Փ5�2�1
_N=���cҞO��E�h`��j�T3/c�A����ţ�SW!�`���*�u�@����)H%�G��	 x��@,��t
a��9��qLv��"�ct׫�b舭��M�\��k��FH7B�|hS�@��ж;t�M�w�D�f����0�ÞU:N��~��ӛp�gaa��u�W��5��l�N%��~�a���9�3��W����'TqЫ�
�d�s�<�������д K�:�>[byL�`�y��,a��UR�F~P:!*���5|��%�6�ă�B3����
��P�^�x���c���c�G�xT��{{-��E!-��.�S�sa�l@8��#xh�������C�nO%�$[�������x�b
�\�+a��d0��<Y���$0of��Pl�P��L��&�0�U��m�	����]h��-���]���y6��4zl�1��4��N�k�^[y,��G��K�Oxi�����`Q8{j��E!)a���6W_����잂��D,�*��W�*ln�_e�Ⱦ�~
��#߅4�+w�\9h]LV�L��v��]��$�(L6�\�w$2R�t	�tW	`�ߟ
\�J�<h�����/�K�{[3�j��t��
z��	8�}���e.JM���7<�-��ޏRs��G�B��ĕ�d�,�O�ߪ�E�^l�b2����fژJ&f�O�����<�5�>X���z�z,�s�P�`��3y!�}���L������>J�ܜ%�N�	���.kx��3M�
<:���<ҋ~�Ne�l,$?ꅊ۩O�J�����jS�m��ݮ�<���r�Х+O��VO�UQg��X+���׀;K�;^�VCα��ت`&1��1Iܝ���h�]�����1����Щ	8�Fc��X]� һ+��l�f�PF�g�;U>�6	�?��6�Dc
]�Uf��]/蹙G���q���Ms�:�o����<X��d�3x��oX���-s�/t��Mg��҆��`���1�RUf`��S�D��s�����K�[<��Fv�Z�ߋ�
�T2��o��ń�%Y|�����
b`���	�#�۟`
|��׽�c�!��܏��ޮ�!��\B���xT_�{�`�4qe�����Ck�E�s��۸���y���T�/�]��m&X�t��+r_(M�Wy~gp�P8s!��DnS�kh���\���5�M�V���z��+;����~��YJ���9���pmkS���
ޭ���d�FE���Q�yn3��8Ok{
_LcE<[���ݒ�ĵ?�*�Fg V3�<�b
է��)��
�q��[$��”���n����U'c�R���:x���~oL�<3����?A��G���5�(���S�2(��XaK3KR�t�禒�L����*�*�O>�br5V�1��t7!�T�g\.Wca�3��/��!��.�c$)�,䢅71�d�9=C����A��~��fV+���vP>��B�`ޞ8�7��t���t��W�o�D�RJ�����p��$x���W���i��a%�)��i�\%���T2��!|�OC�*�sf�4���\���J&&`ްj�=+Z]�Z�ik�׳H0���X2Dw
���]�������7\�3p������z~��t��[��0�<&��W��C�:,�i�
g���Q�p��
0��<��+Z�T��5�G�ɞ��ꟻ�<n܏?��?b႙���XUW��̓� �>�v>�ݜ����k]��	6�ף����T�z`wle}���xE�m�݅z�gUؿ`�8Q��P�cc��?6�c����;�� ��-^��wX>@%�T219����p�\-mƤ`s��w�#C�`*�ht�+�>��|Z�M�O�]�� E?�rP��E���l��	�bM�ɋ�I|V܋�fX�~!/��۶"��B�ME�����aX�}#&���3[$*t1�y����Ow���žC��UÁ�0�0x��#X��-�{U�6���%��V����M����#}���η�$��r�3�k�)�u*V�E��9�ڙ�	/�p�3�BD_�{�Z��/�������@	:Qy������&����p��C(����&�
��(����a�}��t�ZW9x[x�8�ayDR��χ���<��"���]���`yM5���-r�'�R`&�/��mO��Y�ū����
�sS�ļ,7�>��0�Nܥq�匧l޸�{>G+:�mJ�U�82��$Zg8�R(��b���0�
�h"{xݓ����N��vm�/Wki��zxc������9�h猪��^D���v������������Ȫ픳��wy����ш�ǥ�C̃w�.���<�"���i`�1i�]*��O�����,��;�W���o
L����6���O��k1�J����h���5
��`a��dپs��{��R���^�������O0�ŏi=�1n���|Wnk��{Qs7��YE�tv�u���i�y�{b�#�c��{WN�:�;��5�����-��
5(=l�G�v����(
IÛ�V]P��{�[�aE�3��{�8�d,��\�8�ܫƧb!
�d�~9��b��������
�b�9���<�)���^7[T)�{bŻo�b�up��"�\C�^����y�E�Hc
�g�i`�������c`�>�c�$�
,�n���[-\D�^��	�ߢ��4@>��.��J&>Ͳ�/X8S.�Ey����\�^؊N������
}�x��6#XR=_V%s���)\�v�B<�LMp������G�
V��\�
���s)p��T��� X8z-�N��\?bj���p�\�	{�\���	V�f����������2cV�7���>���W��̓�"�'�:��T��<T���c��sCd��}�{���f�
�����&��Jc��(��&�K8��y���(�z
����^��!��1�� RWT����n])�#�Ld��<�e��s���r|��C�U�6��*�l�|w�J)��^$���&�A؎_���!�ܮ_�+�܏��\
��Ug0�V��7YjVS���gL�'�)��%D|H��N���m\��q�Hpa�>�r��4����+�Q�9&~~��=<U擑�}�9phƷR2�pO���wPb�_��V���B�I��L�<��`a���A�9��hX̷��]�dʋ3��P��;��ڧyY�iH/�O�t��r
Eᱹ���a</�<M�&�"ʗ�����&?�V�e���S�D�ΖB���KgbyL�2�v��@/�'ɬ��L��O����zF��S,$o�����u���1��eT����"C�!}�c�b-+��u��k(<�P�„{>QS�?B
Ǽ�g���a����;=hn�6u�m3��kzx�.˵��(t�?Z�.#�1A��	���a��Ah�ޥ#�Eys%�l�#�#���%V�u�2S�D������)�>����"T�9���FY�T2�m����by�`V9��8�n�X}��U(O��LcŴ5��b�o�Fd�/���4�
6L��q���p�4�]M�a��?���7�\�6�<H;Y����c#���{���k`�G�W3��t��S��˿�6?�v�b�uU^�].�i6k<&vQ���@_��o��*hp�+�i����D-2Ũ_�Iۮ^���Z�˗G09�B���/�V��<^�����:x���Þ�{�������B�߱Ui��8���h�`��j1���dP��ټj�A��s�4m�}?�E���Ǩ��⤁W��Q�����l
"��1V>�]u[^t,�Ͷj�Q�B����l.�1OM..%xBc������Z��ɶ��"�J&Z�&˕/�R��}��.�l�O��,�ڽ|eG�7�����;��8^�U�x���I��?&�����3����Y+�t�>;x���c�C�tZ��t#x�H�H�ڒ#5�f8�+�x� �����A�W�U��9�*�pc��k�8�k�m��#�'T�/���ϕi���?o<��M`!����By���-"XhAol�q�y�%X]�ja���o�A��[��YX�TL�8(��[-�Tz��TytYݣ��}�y:6�
��鱙G�!��򢛦��B�e���c2�P���4�E�i�c�;؊a�2�]祒�Y�_H�B�1N��(_���璧?�7��[*�������}����t��snBT�3a[,�m@����c�<��z�{`��Nhg�&]�҄-�݊��MT�TgbQg�x��Ӎ�W7�{��:,)L�A�t^��9�f~��H7�7���Q��aq�{�?\��=��R�/pQ%����Yۖ�oz�쫝ðd�\���$Fc:�ɱ�X�ֵ�mL%o�7x7�Ps\��։��Խ�7/�C�ĢP���}��]���X�By��%��ǘW�	g�7�I��s�s��5%=��V��~{xԴ��>c�����l�;�L|(n,n~��;kc�WA�W�S��
�ɠ��9�wW.V�X-.�r1��秒�L/�Y�\���(�"�\���c��;�5���_���O�70�%Q���V{`���ox ���L�s?E��{2v�b��S1O��nb1�=wEus�3��x�~ln�.�y����A�6�F�ń��@lq�s�c4b�Uq��A~��n��n�s���R��9�=Ϗx�N��12��C��X`��M>�-5����l���Ŕ�rq���Ӱpɻr�,����$�L��o�)��o�� <� ����WA�^�Ů�#��\��D��7i,�����`��n����|>���NM7r`�ռ��q���?�|��(}i�.��^���Lj�
n����+V�(�J��<�;��[���	�o��m4Ġ��sF�%�r���z�MF���o�\�e�@����*�b�����0,/��o�V�֏����jR"_RX��vE>����3��Y�������(q���(纉z>����E��n��B�=~έ:8y�w�ޔN��3pVO/Md�*W^�
�"z1��:�
,�dh��{7��9�W,"�=��J�G���v?L��X\�J&��6������4��<:���X*����.��Oc�\�K�c�ա
:�x*��=P�v��������(2�`!�~�F��x����6�9�%�`C�sk���>�r�~!�Y���Ǒ�:���X+��f�ѿ�H�b�[��_�:��]�(����WM~K���F��>\W�8x�@�bG,g+���>g^@	�a�ŭ#6�`ꁭ]1��~�����'�žc����&��;̣�2�^�Y��U����"����'�'���&���\��=��Q�n�"��2x�aTgQ����yL��vL�EDd`���ZǑf�T2�I��{Hw�qc�K�ʲ��"��$���Y���x{��m
�cs��S�[d�G�녓z��q.�=Y3�4���S�v�辮���9��>��X���^wg�$,�,��;����w��t����F|��\���w�xwSx9?tNw�3���]��H�o�o��C�d"��m_��Rݹ9����oY�eS��'����7ND�a�`���V��V�P�o�ȚM�C�&�k�n�z47r��T�Z����	^�<&�B��}���ˀ�!s�	�#�N��X.QԂL���Ɓ�g�­3Z�	�����_q_
��5#�sȾR���i"�Z�ק!�g`��q1�}����X���R�:>&��QGt�G�i
!Y-�S�yi�y��n�օ������7+v�V���Ġ^ń6
�{��o�x�:�7Q��1񆨹S�
�AXn����ke���:�� ���G�^5?�/�A����3nb]��2�Ld�]��k<����Ll����u��[ۘJ&��7xb	�q3�E��3Rv��<O�"8�O���E�~ɒ��F/ͷ^3���ͣ�:��9�X	�?�[o���n��KG���-�v�*�1����F��|;XM|������X١�������:Xd�D�-gĿ��$h��b㳛��`�.뻹[���w�t�Շk��i��>[|ޛ��5�u��or�x+�O����V
s֞9�;�=�_ʰ�Ng�m��5�����M�x��Z<���/�������ॹ�f�;̣�W�Ià��}Z�??a����3�#��G���0�����R<�*�uv�������g:.��/�����sܼ|������D3�f=�;��4��wr�8���VM_�K�.J%S3lK`���s#���E����\ݹ�ڸ�Z�
N%�\��E��M���Q�<N��&�`+vQ����[	B��vJ�B�a&h��OC��Uk�u���X�ߖ����H��Dl�rZ���B�D�\PP6��DͩGF?���
v�m7F�r�X�Ͻ�s��8K�����xF��
�
p���<
<�1�+>n�y�e��M%/b���b��x%��?@���Ӊv��`����I/�N���h�L�~�/T(,fa9]Uy���Dže�l���"|���~���k`�M�,祒�����m��	����e��K;sGg�b`j��܈��j'*5���W�<Ft��5<��_��ӱ⨕�<g\�T�&��H�i��
���z'`���Up��ܦ���5�ҫ	ޙJ&^ʲ�P�E�Ivg�{��z.�S2mL%c�+J�[>V_G��D#��^��mф	N$�a!DFs����Ja6��au���@8�
k�e�|��)�*�J��S)S1��L����b\�=���V��1��L&n�
Ӗ���o��J`,���(R�-�h2�8��!2���έ��2������y�i�#�q4��3��&HQI�O�N^���x�n��+R���,�O����B$��w�y6�s`�bᖭ��T21͵y�~�V�瑐�����=�1�F��B�0A�ez�oa�hϪ+3r7�Ƞ��BK��?��+��-n`��b4֏�G��|\�e��nU"���T�7������Y��_�	�kD�'���y��Q,>$�b�cQx���6L��2��[�aX�-��4&TFn��K��	�'�2m��X����v�V�d*�����[7A>;�L�β�9�de6����Fu}^\H�U�6X�F�ҵ�d"��S��?�H7j؞	�:?�
ݣD��4aj�@4ő��y�\�y���x�������$L�=�9衘G�X��1e���;�J
��X#�$9Lfbޒs���
Vsb`�T2�-&yw`����h��ـ,^�T2��b}����ݱ���#x��p�(a�<������Q7\�A��1Kؑ��$ʗ&�&�.�Uݕ7�XA�$�$0������\E��gc��ۡh��h`�:�s�����001�Lxy~����"�@���
�ﱢv�8�M.'d0���K(Y����
^o`7g,�D�&o_���������u	��3� �f����$D%2
�f
�.5O`�b/�{q6�5���1ѳ)^��d�o���@˞������C�!���i`(�c*��&�LL(����c����d���R`��T215�LܚJ&��I�=X%�B�����|�ɷ�]��<����M��c[,�m�6>�\l�-"ʸ
��H	��ᾘ@J�y[P���ͳJŏX����d\��z��Vi�����S���T2��XKx��hg`�`܏��?9Q*�x+�L�ν�
g1��(�	:y���,�r��1����&�w;��|?[n6�B�ot�(y�M�˽)êc����V�4��t�׀����MٓL��c^���C05�(i[�Ϙa=�绉D>黁SS�DX���~>��%���"���|遴�]��bh=[�ཁ	d�5��JWN��y]���?G���"�)�r�U�C�p�xaӮ��������ˇA��U��E�<
��ǒ����S��B����&>����.��Icu�>'��LX����t���fu�%\5�|���{+;`��Va1�G7F�r�(7^�)����ž+m���|iޏ�����T2f-��1w.��t!G�:��
+.������ЩG�X��}�<r|��m��g$n�D�'��S���(�K\��di6��u�+��[��ᡕ��V�v�/q
�i)=�����(��@77��uF�<`���wna�[,Bgr��LV9m�	8����˅����
n\�=1��v�`�"7>�8#w�=�}�sc����OR%�cA
���dj�,�4'�����y�Zl����A��M�O'���|L#��:�O��.�
?w/�N�wk���M�g#�L�\��M�℻�X!yI�T2�qFn>	�5�~�C�=�����юx.�,�r��B��ZJ� ��p,�K�
�M�?~�D��P��	����Ƶ�cwL0��68>�L\��X��$�a�Z�2�w��3����w����t(~�I���Ք�nڌ���	����)|�o�p�v���*��H�+�B!
"�����8��[�v�3rr18K�[>��=�i�p=&��G�������oM�:�M���8ޣXU����T«�$�B!D^���2�֥��Ŋg��0����-�oK���(��%c6�t�X^��XXg������?�%m
!�BQ����=K:\�cB}p-�H&3��3-/`��a�K�}K���)�:^�fu�B!�(wk�����dO�)u�.��5SQ�2w)�:L��B�0��\�߯c�$�B!�(k̋��c��갊��F����$-E���𽏋�[,/+[��CXX`�\�nB!��``�>nff��X�(i��Uq�h9��%kb�V����A?��s�B!�(Kk!p*���I�d�w&w1\Q8�b�u������dLAP!�B�����,ۺa�	�ǚ��(��Ixw��C�@?�<HUV/�0��Z���v}�.VY���X5r?����9��B!�e`ec7`m�5��d�S�l_��Հ��r���ա��>�K7W_c���/�e<��ţ�G���B!D\�)�y��>���I��2�3	8�!a'[��Ccu��B�Hg@}Պq�p>�7V:�b�/!�B!bI�<XC��|Cw�<��n?h�e��X��U��l��)
�:b^���||�T~Q���H�pL��C��[O�K�B!D5X��;�),40Ê�1�~=1O�|�?��Jg��>\���Ɗ�e�`3XB!���
��}�s]�Ǿ8�잏:����k���|�	����W!�Bĕb�`-�c���G�K�suel�|X�w�>˱ϲjb!�BQ�V7��<�l`��26L
З�ǒB!�o`�:O��J��26,�#��5�B!��vkn��=���[]zcʍ��Ǟ9���&B!��n`��c{���
�oՕ�a`�}���X!�BT���u����
<��@/uelh��:�0�_�}�Q!�B��R,����@�,���x+��h���s�LTh8_<��%0�G�
�
���9����]u�B!��v�-L�}�,�t��
��q�e�ۀ�|�{6�O��/�8���u�:��_�8n/חs�7��B!�BĒb�����n=,ǵm<l��ɸ
�[����VF`!��Y��x���1�D��B!�"ƴ)�n�#���J��nr�$�0�p�����b�ous�\�y�r�K��8#��U�r�3��8�w^!�B!d`aa���g�i�j#��<�]�{��Й\	\�s��'H_����B!�2�~�r`'`�<�ӡ�s}��.����]0የ�r�G'���ൃ|�#����y�=,Z�',�b60
��ϛZ׶=��ܞ��k�(�鮝g����&�7cG�F2���\L-�E���9�<��ő��D�P� ���r���aslQp=`M`&䳴�j�M��c�I>q����ԌY��yC`-L!������5H��?�y.w&���7|���!*���0�=@�f�b�V�o��NuO� �C��%�L�̰ϗ���"[
�Tw!��2�~�a�gP��nu�
����3��s�2-�<ܣ��]��y/up�o��<[c�ǜ��Y��e[�o��>�\��g`<�Ix߁	!��7!$�qU����Ő�o�T21#��0i�;��C<�O�1�xB�bq8V�o�������EU��T�F��l�l��z��Y�����UҞ�=��\��BDKM	��{�<��^�r�ɱ�Q2��b
�������3�d\	!�E?����������=�UY��r��	ѸZ���>nn�(V
D!��s�����.��0��ɡX��m���P���c���v�8N��>�R�!�����E:_gh��E]$���;`���_i���v�"f� �0v!����V�n,� L�{\��L„,6n��g3�a�����zQ]��l���M�D�n,9�1��Q����(|AQ<�Ǽ�k����r�S�m��C��ghm��.�(��9.,t�սX��r����0պ܄}y$
�7x�lUuy�,�]���J&�ї�Oׇ�ܟ��EX�\
��������Z��cL��P�V`�q�RJ�r}�)RBT��Uߐw��$�y'��󤬡�� ����4.�d�Q�g!D�8�>�1�ĨD�j��1��d\	!�AM���=��d\��
��Qj
!D3����V`'0��N1���0a!���6��zgb��m�͡�����VM"�(3�–�	������a2ᝀ��Y��
m�1E�B�	�p�um\�>��=&*�P�^!+:b�
�`�!E��%
'�ۀij!DP��|�܎�򼃅���H���J�F�f��c��&�*؈�W!�)��E,W7����X׵�X^�N�Tj�BV�����+�ay�r�(�X�o0uH!��#k�_a��ŋ�lkƄ{�w��!�
&���ө��
m㎘��_'�;�ji���,_abX=��\�t�p�{ܻI!�Fs���
>f�z�W7��J�UIY�#�[�=[���{=1�H!�(��}��M�_�� ����je����ƕ�@�>��o��t�}�?	�	�����N��B
q�`��bۿu�EXx@w,�?VϪ��0vt��O#C�V�l
�[m\��*B�bM���
�d�s=<�Հ:ӝ{<�U�,���MX�y����V�|`s��ߐj�B�`q�`a�|�y#��ٻx+�JQDz��4r��A#p�3��¼a�.�%�}N=��ױ�[��G5ԅ2�~�R�忥����^���B�|�e�0�/���r�4����=	��Ԉy���dĵ�,�}���bIc��?�)�EfQ�������O���j2!���y�D]T�܌,B�b33�}�0%�����<�ovR�	!d`E��sꦊ�3,A!J��<�_x	8
����Oy��0��K�U�|BXѱ8+6(*�y�O(�(��q������X��Njʌ�'��)�����'H"�2�|�%p���b�����!Dؼ���(���R�,|p`5��>.𻽁�Áϱb�6 ?�!������w��ʞW���%f.�%�k�Q����kX�۶X��j���8�?�y�]�(�XM�5�"n�)���0Ź�Qlv��p,��Ɉ�8x�]�"�i��("	7�F���G1��[1�H]H���>�ban�9��Y`��#U
�o�t�.X}�5�#\���տz�[���o��u�~%��8v����8ƽ�:�/ˊ4R󙚢��L85}��9p��Z��?8�}�b�nwQx�\9�4�y�¦&�'p�3���l�-Wul����(	lA�,
,0�P�Y�qp��!��Q3��-f�s!�04���
��ˀO��ϟs�|^��Y8�}^„H��-WUt�M��ދ��c����'���
�ȟEjQ"�@s̮ip����N�|�a��j�Ƹ���bk,d�� �zUC��@���r7���U��՗�g*�9CM!��)���0	�b�ntż:+TA{��/7�X���B�bR��;��Fua�9xG� ��93�Š���x�]0Oˀ*1����d���"�����BVnFg�c�՘J��m����ژ_�Xx�јx1X������{��p'g\�*�9��6�@���BDDm%M����ZU�ƊP�U\��%+K{�ӄ�k�;3��K�bޖa�J�r�sKL��*iL�����>���%=1��ݒ�L`
�^)D1i����L��<��q�r�Q��Cz]�o,�l�)������@V�v�_�l�y]��&|��9�F��U�=�1o�0`c��Q(�	���ڮ�{���^�b\����#��J��y���U�����a�l\	!D+��$��:�8c`��p��:�H�*m�XQ�ݿWۺ�@‘�?\�a-���J�W�[���.-)'c5O��R��K�8XP�x+�wv�0��ǁg�n��<�~],�@!d`��)���(
W�Q3!��F�E����+�>��c-��!�_�1��2�Φ�h��3քB�O�nP���ij!D�3x8�_���CLV\d��n]l���뗭�fB�ʏ1o�(by�I&���	VW��<�����7S0��S�4����2���M��W�F�x�`��BQƴzE�>:��j=u��v��q����AC^!+�ǒ�'��#cp�J+���%X���#8�ǘڭ_j+���^�@�f!��>BX���]QA��iƤnG�)�e�1��0e���_���aQ�	+�en��X~�MX�tء���g�.�����d�fuu��ܥfB�9�`�H-P7�*,oj��1��S+���n[̠J8��%̫��O�b���BV0��hx��P��T� �(s~�yUZ�;�+0
S�[9�yN���0WAm��X�&=�:� 0+��������*�i�BDK�*���݁�偸���AQ��nǼ+��
����?�+0�W��'p���_&�_.Qܹ
�)��/�;�yVS̯��=�o����W���H�j��X���4��
�B�R=^�^���B�2�p����a��Ga�/8C�g�`y[=�������y^��8gN��s�vX��.�8�s�;X!�	�O�|gDu`9s{��y]�w���ٍ�D��h\��BV�s"��:X]�/�b�+BQ��ba�
����{��ܱ;:#��w��Y!�V��s�E���/�{��{�S�ǿyU:��p��z�X�",��3�%�V:oa��3�B�2�PL%0:����X�W��:p+�
J[�>YX5ʦca��8(�KT-�Xb.�26Bݟ����)j
!D�&�̿i�
/��6���ők��t!d`E�,�wX�h���=��j
!D��9�xc̮�LܡRޯ��3ct]/�vBX2�Y�k��1���;5����Ǹ�\�]�S�q0x5�28�!d`��\�Q
?�&��0
!D%s�9p0�D�p����B�`GL`jB	�a/ �!/���U<���U��W_�)�U�D�t�P̓��H�����d�I�����E<��b�h
u!���Y�Pݞ�Ѯ
�h8!������!:o�"�~`k��*k��XM�u�3��#<�����T�HSB�$D|h�&X���l[e��cB!���b��6�1����/jT}<��%�Y�m<�p�	B�V<�.�q�cB!w�`��4�+-�z�X`��u'V���\�U�!��F�}�S�l���~@o�V\�ˣj~���b�o`bJsԬK0�>�C��5X����nX��6���L�d*&R�
�g5
�\�m��H��\s���UI��<��q-�Ētƒ����9
+"<Y]����A!�B�r�Z�����GbR�2��B!���9����������jNB!�B��r����T�o��0S�+�B!��Rp!p�J��;�K�B!���UJZ<?����b�4�Q7
!�B!+.<�FyI�O�
h^��B!�BV�xFy�wHa���ۄB!���W>�*�?�k|��B!�BX�f*V�8�2�Á=�
�B!�BXe�"L�o�C���˹���B!�BV9r�1W�k��S
B!�B�*[���^)�����
�T7!�B!�R��:7������B!���Ui����h�7���B!�B��d���e}��'�8CK!�B!��y�Ef�ߗ��ռB!�B��6&',dp�/`g,�K!�B!�*i�v�-��`�V��jN!�B!d`	x��)��<��>��B!�B�X�i�Q��	Y�����Oi!�B!d`Ş��`��y�Z]��^	!�B!d`���r���c�U�Rx��B!����Q��f�:�5�+�B!�B�!�?�@��x�IEND�B`�PK!F[��ttimg/wp-reset-icon.pngnu�[����PNG


IHDR���>a�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�C�	pHYs.#.#x�?v�IDATx��{�E�?��ނX(-��ER���ں Y趠ؖW��(�hEA��(���
�����
���Hky�ѵ�ְ�,��J�Z���E9�1{���{;���2���&��;����73`0��`0��`0��`0��`V��v�(��� �x���#��v���,�a)���8<��˾�
Tj�^�Xl����a���dX ���
L,`����/e�˾�n��N�i�E�
 ��T�<�tD��f���;v�΋<�ϟ�
����r�w�";��Λn�$��9`0W�/
X��d����� �s�o'�
�"Z��a�ngڡ�H<�x��}邷���a�E�3CQ:dS�k�+t�"�����v��@�3���cu�"�_��a�M�#��F��_	|_�
Y
\l��_u;R�v$���K�ݾ�;�%v�Z�#U�
 [�Y��k�[q�W�v4
 �K��tg�&n��{%Q�ϟ�X8�3�% f�a�U�E`����A]�.;*�}�:(�ó>	��U�����Ӊº���VG�LpIXd��gu;Ŷwb
JT�P�Ͽ��^��
�r�-�L�)��?���D
�6�b�F�u``""rh�c���08��/-ǝ�X-|?0;����!J�x�( ��h�F<��{<����	lɾFc�}"���v�
����hU��O�~��[�T`!p��DԱx�x�ۅ��������O;5�)��N�t�"P&���OBQ�3�π��0x]rZ��_E���iͯgp�J�@|D���!Gn��`��J<�..m���~�-�$�1�+��X\!�Ʒ��S������I;��$�1��@�����9�6�F�B���*��#����~%��(��u��Q[�끙:��-v\\]��Em������H�ϖ�Β��-@��)�+�n
p�k��6����a�t��A��
�-�l�<$�f
k��+����~3��dw��7ѐ��.�n��fKdt�Z���'"aFJLh��v,Q`W)
j~=�[�-�L�����2H΁�L\� ���0���J)��T�����$�?����}I�M�(��[1�.��Z��ђu�OJ������w��
��@�N����w%�T��GP\�ߌ��Y�*9!��a�B�Me�緢#�@��HNDi�N����'����C-����'�E#���s��A`q+�����$:�J���j��2�z�"h���l�߯4K$�i��-C�	d@v��2�Y�����;���l-���O)��¯2@����\N^���/=��b�1���2�2�%��,"���X���}`�{ܘ�|hw��}Tv��v��#ѹщ���Э8+�����9��{�qE\a3x��������7�^C�E'���?�������G����]��_��k9���:�K�0c�E^6#�"ތ��V��S��RrV!�k+B�6��z"js�����FT*K���,R��2^�j9���%��#��yy��bY�X�[�5w�
8���?�ϲx+��w�{;�!F�\|�H�z�NY�g=�,r�����׈`M��"�U�l;�^�҂q�3���^>;^��DP-���*3%�ۘ�@�����O�H�ْ��@�)_&�(�VR�>�],�=�,��8��!�5�A�gWR�>���Ƚ3M�(�k��O���8�[V!j~�>ȿ�5F�Z�����d$�;%P���^X��)࣒��n����;�F�z�ٯru~{PA�!܎v��0X�>����S�=��,��l�@��o�f"�C�"+�͚�W�S,��q��lV�q$�����0�S(F++�͞.멚�qjN	�^����9�1�ꖠg�r�y��ވ�n_
��y��@�z����$�6E��q$-Or�s)��5�r�Ҿ7`9����ZZq�LcR�$� lQ��+,ǽUfF�r�c��>��)�TX�:%��Z�6q���"�*.������q��F
ߐ�Q�a_m����t��ݪ�B,~�ϩ��q�NvZ��r�o#��UɊ4���mT�E��˘s��v��6
)�T��-ǝ/;-��w��KP_��QaT�e�>�0���nk~#��K�h��te>M.A,�1 }8��STV�^�t�����_��?�w�q$��J�qmĮ�)�x��iE*�dL���:�oxp�Úߌ�c�{���8z�S��N@ti��������8�R��B��k �vj�C�tI.lE\5��X�jD|�6DX�n�A�ш&}2"�XD��"�Ϧq���e��wg"�k+�M+��b�F������ʏ6��8R��|�o'�?�B��)Ჴ��.���4�nV�!Z���ER�?\�-�������nDV�cj>�;.*�ô���<��� ��9N�n_+�
�rܱ���:�(	o^Gk��P�o�#F߹cۇ�N*��Aݞu[lzsÎMon���qf��E#ˁ��8�r*[��lzs�ұ�&lC����#��4�r���Z�=�;��u�R?N��r�N��AG��@�����e(|(YP������dE���ۑ*���3���#a
fpMK��RjT��2Dk0^�/]p"H��w/��,ǝ|�8���Up�4�ݎE���帇�"��S�Hu7l�nM�'��9Tɮ\9�5�3�灅��4��՝7�г��r�i�w�껈��)>�D]��Qϝ_�a"�Z,�=q�͉���6b�)O��Ğ�z�ɜ��B߭;�yv��r��Q�(�I���IA���g_�p7"b	_I���iQ��@#��D0h-�@_G�u�h0��`0��`0��`0��`0t���(hN�IEND�B`�PK!�q��I-I-wp-reset-cli.phpnu�[���<?php

/**
 * WP Reset
 * https://wpreset.com/
 * (c) WebFactory Ltd, 2017-2023
 */


// include only file
if (!defined('ABSPATH')) {
  die('Do not open this file directly.');
}


/**
 * Resets the site to the default values without modifying any files.
 */
class WP_Reset_CLI extends WP_CLI_Command
{

  /**
   * Reset the site database to default values. No files are modified.
   *
   * ## OPTIONS
   *
   * [--reactivate-theme]
   * : Reactivate currently active theme after reset.
   *
   * [--reactivate-plugins]
   * : Reactivate all currently active plugins after reset.
   *
   * [--deactivate-wp-reset]
   * : Deactivate WP Reset plugin after reset. By default it will stay active after reset.
   *
   * [--yes]
   * : Answer yes to the confirmation message.
   *
   * ## EXAMPLES
   *
   * $ wp reset reset --yes
   * Success: Database has been reset.
   *
   * @when after_wp_load
   */
  function reset($args, $assoc_args)
  {
    WP_CLI::confirm('Are you sure you want to reset the site? There is NO UNDO!', $assoc_args);

    global $wp_reset;
    $params = array();

    if (!empty($assoc_args['reactivate-theme'])) {
      $params['reactivate_theme'] = true;
    }
    if (!empty($assoc_args['disable-wp-reset'])) {
      $params['reactivate_wpreset'] = false;
    } else {
      $params['reactivate_wpreset'] = true;
    }
    if (!empty($assoc_args['reactivate-plugins'])) {
      $params['reactivate_plugins'] = true;
    }

    $result = $wp_reset->do_reinstall($params);
    if (is_wp_error($result)) {
      WP_CLI::error($result->get_error_message);
    } else {
      WP_CLI::success('Database has been reset.');
    }
  } // reset


  /**
   * Display WP Reset version.
   *
   * @when after_wp_load
   */
  function version($args, $assoc_args)
  {
    global $wp_reset;

    WP_CLI::line('WP Reset v' . $wp_reset->version);
  } // version


  /**
   * Delete selected WordPress objects.
   *
   * ## OPTIONS
   *
   * <plugins|themes|transients|uploads|custom-tables|htaccess|theme-options>
   * : WP objects to delete.
   *
   * [--yes]
   * : Answer yes to the confirmation message.
   *
   * [--empty]
   * : Empty (truncate) custom tables instead of deleting (dropping) them.
   *
   * ## EXAMPLES
   *
   * $ wp reset delete themes --yes
   * Success: 3 themes have been deleted.
   *
   * $ wp reset delete custom-tables --truncate --yes
   * Success: 3 custom tables have been emptied.
   *
   * $ wp reset delete htaccess --yes
   * Success: Htaccess file has been deleted.
   *
   * @when after_wp_load
   */
  function delete($args, $assoc_args)
  {
    global $wp_reset, $wpdb;

    if (empty($args[0])) {
      WP_CLI::error('Please choose a subcommand: plugins, themes, transients, uploads, htaccess or custom-tables.');
      return;
    } elseif (false == in_array($args[0], array('themes', 'plugins', 'transients', 'uploads', 'htaccess', 'custom-tables', 'theme-options'))) {
      WP_CLI::error('Unknown subcommand. Please choose from: plugins, themes, transients, uploads, htaccess, custom tables or theme-options.');
    } else {
      $subcommand = $args[0];
    }

    switch ($subcommand) {
      case 'themes':
        WP_CLI::confirm('Are you sure you want to delete all themes?', $assoc_args);
        $cnt = $wp_reset->do_delete_themes(false);
        WP_CLI::success($cnt . ' themes have been deleted.');
        break;
      case 'plugins':
        WP_CLI::confirm('Are you sure you want to delete all plugins?', $assoc_args);
        $cnt = $wp_reset->do_delete_plugins(true, false);
        WP_CLI::success($cnt . ' plugins have been deleted.');
        break;
      case 'transients':
        WP_CLI::confirm('Are you sure you want to delete all transients?', $assoc_args);
        $cnt = $wp_reset->do_delete_transients();
        WP_CLI::success($cnt . ' transient database entries have been deleted.');
        break;
      case 'uploads':
        WP_CLI::confirm('Are you sure you want to delete all files & folders in /uploads/ folder?', $assoc_args);
        $cnt = $wp_reset->do_delete_uploads();
        WP_CLI::success($cnt . ' files & folders have been deleted.');
        break;
      case 'custom-tables':
        if (!empty($assoc_args['empty'])) {
          WP_CLI::confirm('Are you sure you want to empty (truncate) all custom tables (prefix: ' . $wpdb->prefix . ')?', $assoc_args);
          $cnt = $wp_reset->do_truncate_custom_tables();
          WP_CLI::success($cnt . ' custom tables have been emptied.');
        } else {
          WP_CLI::confirm('Are you sure you want to delete (drop) all custom tables (prefix: ' . $wpdb->prefix . ')?', $assoc_args);
          $cnt = $wp_reset->do_drop_custom_tables();
          WP_CLI::success($cnt . ' custom tables have been deleted.');
        }
        break;
      case 'htaccess':
        WP_CLI::confirm('Are you sure you want to delete the .htaccess file?', $assoc_args);
        $tmp = $wp_reset->do_delete_htaccess();
        if (!is_wp_error($tmp)) {
          WP_CLI::success('Htaccess file has been deleted.');
        } else {
          WP_CLI::error('Htaccess file has not been deleted. ' . $tmp->get_error_message());
        }
        break;
      case 'theme-options':
        WP_CLI::confirm('Are you sure you want to reset all options (mods) for all themes?', $assoc_args);
        $cnt = $wp_reset->do_reset_theme_options();
        WP_CLI::success('Options for ' . $cnt . ' themes have been reset.');
        break;
      default:
        // should never come to this but can't hurt
        WP_CLI::error('Unknown subcommand. Please choose from: plugins, themes, transients, uploads, htaccess, custom-tables or theme-options.');
        return;
    }
  } // delete


  /**
   * List and manipulate DB snapshots.
   *
   * ## OPTIONS
   *
   * <list|create|restore|export|delete>
   * : Action to perform with snapshot.
   *
   * [--yes]
   * : Answer yes to the confirmation message.
   *
   * [--id=<snapshot-id>]
   * : Specify snapshot ID when doing restore, export and delete.
   *
   * [--name=<snapshot-name>]
   * : When creating a new snapshot specify an optional name.
   *
   * ## EXAMPLES
   *
   * wp reset snapshots create --yes
   * Success: New snapshot with ID 089bea has been created.
   *
   * $ wp reset snapshots delete --id=123456
   * Success: Snapshot has been deleted.
   *
   * $ wp reset snapshots export --id=123456
   * Success: Snapshot has been exported and saved to: https://test.site/wp-content/wp-reset-snapshots-export/wp-reset-snapshot-123456.sql.gz
   *
   * @when after_wp_load
   */
  function snapshots($args, $assoc_args)
  {
    global $wp_reset;

    if (empty($args[0])) {
      WP_CLI::error('Please choose a subcommand: list, create, restore, export or delete.');
      return;
    } elseif (false == in_array($args[0], array('list', 'create', 'restore', 'export', 'delete'))) {
      WP_CLI::error('Unknown subcommand. Please choose from: list, create, restore, export or delete.');
    } else {
      $subcommand = $args[0];
    }

    switch ($subcommand) {
      case 'list':
        if ($snapshots = $wp_reset->get_snapshots()) {
          $table = array();
          foreach ($snapshots as $ss) {
            $tmp = array();
            $tmp['id'] = $ss['uid'];
            if (!empty($ss['name'])) {
              $tmp['name'] = $ss['name'];
            } else {
              $tmp['name'] = 'n/a';
            }
            $tmp['created'] = date(get_option('date_format'), strtotime($ss['timestamp'])) . ' @ ' . date(get_option('time_format'), strtotime($ss['timestamp']));
            $tmp['info'] = $ss['tbl_core'] . ' standard & ';
            if ($ss['tbl_custom']) {
              $tmp['info'] .= $ss['tbl_custom'] . ' custom table' . ($ss['tbl_custom'] == 1 ? '' : 's');
            } else {
              $tmp['info'] .= 'no custom tables';
            }
            $tmp['info'] .= ' totaling ' . WP_Reset_Utility::format_size($ss['tbl_size']) . ' in ' . number_format($ss['tbl_rows']) . ' rows';

            $table[] = $tmp;
          } // foreach
          WP_CLI\Utils\format_items('table', $table, array('id', 'name', 'created', 'info'));
        } else {
          WP_CLI::line('There are no saved snapshots.');
        }
        break;
      case 'create':
        if (!empty($assoc_args['name'])) {
          $name = trim($assoc_args['name']);
        } else {
          $name = '';
        }

        WP_CLI::confirm('Are you sure you want to create a new snapshot?', $assoc_args);
        $new = $wp_reset->do_create_snapshot($name);
        if (is_wp_error($new)) {
          WP_CLI::error($new->get_error_message());
        } else {
          WP_CLI::success('New snapshot with ID ' . $new['uid'] . ' has been created.');
        }
        break;
      case 'restore':
        if (empty($assoc_args['id'])) {
          WP_CLI::error('Please specify the snapshot ID with the "--id=123456" param. Use "wp reset snapshots list" to get a list of all snapshots.');
          break;
        } else {
          WP_CLI::confirm('Are you sure you want to restore the site to the snapshot with ID ' . $assoc_args['id'] . '?', $assoc_args);
          $restore = $wp_reset->do_restore_snapshot($assoc_args['id']);
          if (is_wp_error($restore)) {
            WP_CLI::error($restore->get_error_message());
          } else {
            WP_CLI::success('Site has been restored to the selected snapshot.');
          }
        }
        break;
      case 'export':
        if (empty($assoc_args['id'])) {
          WP_CLI::error('Please specify the snapshot ID with the "--id=123456" param. Use "wp reset snapshots list" to get a list of all snapshots.');
          break;
        } else {
          $export = $wp_reset->do_export_snapshot($assoc_args['id']);
          if (is_wp_error($export)) {
            WP_CLI::error($export->get_error_message());
          } else {
            $url = content_url() . '/' . $wp_reset->snapshots_folder . '/' . $export;
            WP_CLI::success('Snapshot has been exported and saved to: ' .  $url);
          }
        }
        break;
      case 'delete':
        if (empty($assoc_args['id'])) {
          WP_CLI::error('Please specify the snapshot ID with the "--id=123456" param. Use "wp reset snapshots list" to get a list of all snapshots.');
          break;
        } else {
          WP_CLI::confirm('Are you sure you want to delete the snapshot with ID ' . $assoc_args['id'] . '?', $assoc_args);
          $del = $wp_reset->do_delete_snapshot($assoc_args['id']);
          if (is_wp_error($del)) {
            WP_CLI::error($del->get_error_message());
          } else {
            WP_CLI::success('Snapshot has been deleted.');
          }
        }
        break;
      default:
        // it should never come to this but can't hurt
        WP_CLI::error('Unknown subcommand. Please choose from: list, create, restore, export or delete.');
        return;
    }
  } // snapshots


  /**
   * This command is no longer available. Please use "wp reset snapshots create" instead.
   */
  function backups($args, $assoc_args)
  {
    WP_CLI::error('This command is no longer available. Please use: wp reset snapshots create');
  } // backups
} // WP_Reset_CLI

WP_CLI::add_command('reset', 'WP_Reset_CLI');
PK!�`�,a,acss/sweetalert2.min.cssnu�[���/*
  SweetAlert2
  https://github.com/sweetalert2/sweetalert2
  MIT License
*/
.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;overflow-y:hidden;background:#fff;box-shadow:0 0 .625em #d9d9d9}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:static;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:700}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{font-size:.25em}}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{flex-basis:auto!important;width:auto;height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .3125em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(50,100,150,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.8em;left:-.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-toast-animate-success-line-tip .75s;animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-toast-animate-success-line-long .75s;animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:swal2-toast-show .5s;animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:swal2-toast-hide .1s forwards;animation:swal2-toast-hide .1s forwards}.swal2-container{display:flex;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}.swal2-container.swal2-backdrop-show{background:rgba(0,0,0,.4)}.swal2-container.swal2-backdrop-hide{background:0 0!important}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-bottom-end>:first-child,.swal2-container.swal2-bottom-left>:first-child,.swal2-container.swal2-bottom-right>:first-child,.swal2-container.swal2-bottom-start>:first-child,.swal2-container.swal2-bottom>:first-child{margin-top:auto}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-no-transition{transition:none!important}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-popup{display:none;position:relative;box-sizing:border-box;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border:none;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-title{position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-actions{display:flex;z-index:1;flex-wrap:wrap;align-items:center;justify-content:center;width:100%;margin:1.25em auto 0}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-actions.swal2-loading .swal2-styled.swal2-confirm{box-sizing:border-box;width:2.5em;height:2.5em;margin:.46875em;padding:0;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{content:"";display:inline-block;width:15px;height:15px;margin-left:5px;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff}.swal2-styled{margin:.3125em;padding:.625em 2em;box-shadow:none;font-weight:500}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-styled:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(50,100,150,.4)}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-timer-progress-bar{position:absolute;bottom:0;left:0;width:100%;height:.25em;background:rgba(0,0,0,.2)}.swal2-image{max-width:100%;margin:1.25em auto}.swal2-close{position:absolute;z-index:2;top:0;right:0;align-items:center;justify-content:center;width:1.2em;height:1.2em;padding:0;overflow:hidden;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer}.swal2-close:hover{transform:none;background:0 0;color:#f27474}.swal2-close::-moz-focus-inner{border:0}.swal2-content{z-index:1;justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:400;line-height:normal;text-align:center;word-wrap:break-word}.swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:1em auto}.swal2-file,.swal2-input,.swal2-textarea{box-sizing:border-box;width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;background:inherit;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);color:inherit;font-size:1.125em}.swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-file::-webkit-input-placeholder,.swal2-input::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#ccc}.swal2-file:-ms-input-placeholder,.swal2-input:-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-file::-ms-input-placeholder,.swal2-input::-ms-input-placeholder,.swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder{color:#ccc}.swal2-range{margin:1em auto;background:#fff}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}.swal2-input{height:2.625em;padding:0 .75em}.swal2-input[type=number]{max-width:10em}.swal2-file{background:inherit;font-size:1.125em}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:inherit;color:inherit;font-size:1.125em}.swal2-checkbox,.swal2-radio{align-items:center;justify-content:center;background:#fff;color:inherit}.swal2-checkbox label,.swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-checkbox input,.swal2-radio input{margin:0 .4em}.swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}.swal2-validation-message::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;border:.25em solid transparent;border-radius:50%;font-family:inherit;line-height:5em;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474;color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-error.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-success{border-color:#a5dc86;color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-.25em;left:-.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-progress-steps{align-items:center;margin:0 0 1.25em;padding:0;background:inherit;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#3085d6}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;width:2.5em;height:.4em;margin:0 -1px;background:#3085d6}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}@-webkit-keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@-webkit-keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@-webkit-keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@-webkit-keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-container{top:auto;right:auto;bottom:auto;left:auto;max-width:calc(100% - .625em * 2);background-color:transparent!important}body.swal2-no-backdrop .swal2-container>.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-container.swal2-top{top:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-top-left,body.swal2-no-backdrop .swal2-container.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-top-end,body.swal2-no-backdrop .swal2-container.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-container.swal2-center{top:50%;left:50%;transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-container.swal2-center-left,body.swal2-no-backdrop .swal2-container.swal2-center-start{top:50%;left:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-center-end,body.swal2-no-backdrop .swal2-container.swal2-center-right{top:50%;right:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom{bottom:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom-left,body.swal2-no-backdrop .swal2-container.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-bottom-end,body.swal2-no-backdrop .swal2-container.swal2-bottom-right{right:0;bottom:0}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static!important}}body.swal2-toast-shown .swal2-container{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}body.swal2-toast-column .swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-column .swal2-toast .swal2-actions{flex:1;align-self:stretch;height:2.2em;margin-top:.3125em}body.swal2-toast-column .swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-column .swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-column .swal2-toast .swal2-validation-message{font-size:1em}
PK!t���e�ecss/wp-reset.cssnu�[���/**
 * WP Reset
 * https://wpreset.com/
 * (c) WebFactory Ltd, 2017-2023
 */

body.tools_page_wp-reset {
  overflow-y: scroll;
}

.tools_page_wp-reset #wpcontent,
.tools_page_wp-reset .auto-fold #wpcontent {
  padding-left: 0;
}

.tools_page_wp-reset .wrap {
  margin: 0;
  background: #f9fbfd;
  min-height: calc(100vh - 100px);
  font-size: 14px;
  padding: 0;
}

.tools_page_wp-reset button.loading,
.tools_page_wp-reset a.loading {
  pointer-events: none;
  cursor: wait !important;
  opacity: 0.6;
}

.tools_page_wp-reset #loading-tabs {
  padding: 80px 0 0 450px;
}

.tools_page_wp-reset #loading-tabs img {
  width: 100px;
  height: auto;
  opacity: 0.4;
}

.tools_page_wp-reset .mb0 {
  margin-bottom: 0;
}

#wpbody-content {
  background: #f9fbfd;
}

.wpr-container {
  margin: 0 20px;
  max-width: 100%;
  width: 910px;
}

.tools_page_wp-reset header {
  padding: 20px 10px;
  background: #f9fbfd;
}

.tools_page_wp-reset nav {
  background: #ffffff;
  padding: 0 20px;
  margin: 0 20px;
  border: none;
  max-width: 100%;
  width: 910px;
  box-sizing: border-box;
}

#wpr-content {
  padding: 20px;
  background: white;
}

#wpfooter {
  padding: 20px;
  border-top: 1px solid #e5e5e5;
  background-color: #ffffff;
}

#wpfooter a {
  text-decoration: none;
}

#wpfooter span {
  color: #ffb900;
}

.tooltipster-sidetip.tooltipster-punk.tooltipster-wpr .tooltipster-box {
  border-radius: 5px;
  border: none;
  border-bottom: 3px solid #5d5d5d;
  background: #5d5d5d;
}

.tooltipster-sidetip.tooltipster-punk.tooltipster-wpr.tooltipster-top .tooltipster-arrow-border {
  border-top-color: #5d5d5d;
}

.tools_page_wp-reset .dropdown {
  position: relative;
  display: inline-block;
  margin-right: 10px;
}

.tools_page_wp-reset .button.dropdown-toggle::after {
  content: '\f140';
  font-family: dashicons;
  display: inline-block;
  line-height: 1;
  font-weight: 400;
  font-style: normal;
  text-decoration: inherit;
  text-transform: none;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  width: 20px;
  height: 20px;
  font-size: 20px;
  vertical-align: text-top;
  text-align: center;
}

.tools_page_wp-reset .dropdown.dropdown-right .dropdown-menu {
  left: 0;
  right: auto;
}

.tools_page_wp-reset .dropdown .dropdown-menu {
  position: absolute;
  top: 100%;
  right: 0;
  z-index: 1000;
  display: none;
  float: left;
  min-width: 10rem;
  padding: 0.5rem 0;
  margin: 0;
  color: #212529;
  text-align: left;
  list-style: none;
  background-color: #fff;
  background-clip: padding-box;
  border: 1px solid rgba(0, 0, 0, 0.15);
}

.tools_page_wp-reset .dropdown .dropdown-menu.show {
  display: block;
}

.tools_page_wp-reset .dropdown-menu .dropdown-item {
  display: block;
  width: 100%;
  padding: 0.25rem 1.5rem;
  clear: both;
  color: #212529;
  text-align: inherit;
  white-space: nowrap;
  background-color: transparent;
  border: 0;
  text-decoration: none;
  box-sizing: border-box;
}

.tools_page_wp-reset .dropdown-menu .dropdown-item:focus,
.tools_page_wp-reset .dropdown-item:hover {
  color: #16181b;
  text-decoration: none;
  background-color: #f8f9fa;
}

.tools_page_wp-reset #wp_reset_confirm,
.tools_page_wp-reset #nuclear_reset_confirm {
  vertical-align: top;
}

.tools_page_wp-reset h1 span {
  font-size: 13px;
  vertical-align: super;
  font-style: italic;
}

.tools_page_wp-reset .textcenter {
  text-align: center;
}

.tools_page_wp-reset .half {
  width: 50%;
  display: inline-block;
  vertical-align: top;
}

.tools_page_wp-reset .third {
  width: 32.9%;
  display: inline-block;
  vertical-align: top;
}

.tools_page_wp-reset .thirdx2 {
  width: 65.8%;
  display: inline-block;
  vertical-align: top;
}

.tools_page_wp-reset .button.disabled {
  pointer-events: none;
  cursor: not-allowed;
}

.tools_page_wp-reset.wp-core-ui .button,
.tools_page_wp-reset.wp-core-ui .button-primary,
.tools_page_wp-reset.wp-core-ui .button-secondary {
  border-radius: 0;
}

.tools_page_wp-reset .button-secondary:focus,
.tools_page_wp-reset .button-secondary:hover,
.tools_page_wp-reset .button.focus,
.tools_page_wp-reset .button.hover,
.tools_page_wp-reset .button:focus,
.tools_page_wp-reset .button:hover {
  background: #fafafa;
  border-color: #999;
  color: #23282d;
}

.tools_page_wp-reset .button:not(.button-primary):hover {
  background: #f1f1f1;
}
.tools_page_wp-reset .button:not(.button-primary) {
  background: #ffffff;
}

.tools_page_wp-reset input {
  border-radius: 0;
}

.tools_page_wp-reset .plain-list {
  margin-top: 10px;
  list-style-type: circle;
  list-style-position: inside;
}

.tools_page_wp-reset .plain-list li {
  text-indent: -20px;
  padding-left: 23px;
  line-height: 23px;
  margin: 0;
}

.tools_page_wp-reset .red {
  color: #dd3036;
}

.tools_page_wp-reset .green {
  color: #1daf1d;
}

.tools_page_wp-reset #logo-icon {
  max-height: 30px;
  width: auto;
  padding: 0;
  margin: 0;
}

.tools_page_wp-reset .dismiss-notice-rate {
  vertical-align: bottom;
  margin-left: 10px;
}

.tools_page_wp-reset .button {
  box-shadow: none;
  text-shadow: none;
}

.tools_page_wp-reset .swal2-container {
  z-index: 99999;
}

.tools_page_wp-reset .swal2-timer-progress-bar {
  height: 0.2em;
  background: #dd3036;
}

.tools_page_wp-reset .swal2-container .swal2-popup .swal2-actions {
  margin: 2em auto 0;
}

.tools_page_wp-reset .swal2-container.swal2-shown {
  background-color: rgba(0, 0, 0, 0.6);
}

.tools_page_wp-reset .swal2-popup .swal2-title {
  line-height: 1.1;
  font-weight: 700;
  display: block !important;
}

.tools_page_wp-reset code {
  white-space: nowrap;
}

.tools_page_wp-reset p {
  line-height: 1.7;
  font-size: 14px;
}

.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #999;
  box-shadow: none;
}

.tools_page_wp-reset p > .button-delete {
  margin-right: 10px;
}

.tools_page_wp-reset .button-delete {
  color: #cc2f2f;
  border-color: #cc2f2f;
  background-color: #ffffff;
}

.tools_page_wp-reset .button-delete:hover,
.tools_page_wp-reset .button-delete:focus {
  color: #cc2f2f;
  border-color: #cc2f2f;
}

.tools_page_wp-reset .rotating {
  -webkit-animation: spin 1.5s linear infinite;
  -moz-animation: spin 1.5s linear infinite;
  animation: spin 1.5s linear infinite;
}

.notice-wrapper {
  margin-top: 35px;
}

.tools_page_wp-reset .notice-error {
  border-top-color: #dd3036;
  border-top-width: 3px;
}

.tools_page_wp-reset .notice-info {
  border-top-color: #0085ba;
  border-top-width: 3px;
}

.tools_page_wp-reset .card-header-right {
  height: 100%;
  float: right;
}

.tools_page_wp-reset .card-header-right .button {
  margin: -5px 0 0 0;
}

.tools_page_wp-reset .card-header-right a:not(.button) {
  text-decoration: none;
  color: #444;
  margin-left: 5px;
}

.tools_page_wp-reset .card-header-right a:hover:not(.button) {
  color: #00a0d2;
}

.tools_page_wp-reset .card {
  padding: 0 25px 20px 25px;
  max-width: 100%;
  width: 100%;
  margin: 0 0 35px 0;
}

.tools_page_wp-reset .card.pro {
  border-left: 1px solid #dd3036;
}

.card h4 {
  border-bottom: 1px solid #e5e5e5;
  margin: 0 -25px;
  padding: 15px 25px;
  background-color: #fcfcfc;
}

.tools_page_wp-reset .card.collapsed {
  padding-bottom: 0;
}

.tools_page_wp-reset .card.collapsed h4 {
  border: none;
}

.tools_page_wp-reset .swal2-popup {
  border-radius: 0;
}

.tools_page_wp-reset table {
  width: 100%;
  border-spacing: 0;
  border-collapse: separate;
  margin: 1em 0;
}

.tools_page_wp-reset #reset-details td,
.tools_page_wp-reset #reset-details th {
  padding: 10px 10px;
  text-align: center;
}

.tools_page_wp-reset #reset-details td:first-child {
  text-align: left;
}

.tools_page_wp-reset table td {
  text-align: left;
  padding: 20px 10px;
  border-bottom: thin solid #999;
}

.tools_page_wp-reset table tr:hover td {
  background-color: #f9f9f9;
}

.tools_page_wp-reset table .ss-actions,
.tools_page_wp-reset table .ss-size {
  text-align: center;
  white-space: nowrap;
  width: 70px;
}

.tools_page_wp-reset table th {
  text-align: left;
  border-bottom: thin solid #444444;
  padding: 5px;
}

.tools_page_wp-reset #reset-details tfoot th {
  border-top: thin solid #444444;
  border-bottom: none;
}

.tools_page_wp-reset #reset-details tbody tr:last-child td {
  border-bottom: none;
}

.tools_page_wp-reset #reset-details th {
  vertical-align: top;
}

.tools_page_wp-reset table .ss-action {
  text-decoration: none;
  margin: 5px 10px 5px 0;
  display: inline-block;
}

.tools_page_wp-reset table .delete-snapshot {
  margin: 0;
}

.tools_page_wp-reset table .delete-snapshot:hover {
  color: rgb(221, 48, 54);
}

.tools_page_wp-reset .no-padding-bottom {
  padding-bottom: 0;
}

.wpr-table-container {
  min-width: 960px;
  max-width: 1200px;
  margin: 0 auto 15px auto;
}

.swal2-popup.compare-snapshots {
  min-height: 90%;
  flex-direction: column;
  justify-content: flex-start;
}

.wpr-table-container pre {
  font-size: 14px;
  overflow: auto;
  max-width: 580px;
}

.wpr-table-container p {
  font-size: 14px;
  color: #545454;
}

.wpr-table-container table {
  border-spacing: 0;
  border-collapse: separate;
  margin: 0;
  padding: 0;
  width: 100%;
  position: relative;
}

.wpr-table-container table span.dashicons {
  position: absolute;
  right: 10px;
  top: 13px;
}

.wpr-table-container table td {
  width: 50%;
  padding: 10px;
}

.wpr-table-container > table > tbody > tr:first-child {
  cursor: pointer;
}

.wpr-table-container table tr td:nth-child(2) {
  border-left: thin solid #00000080;
}

.wpr-table-container table td {
  background-color: #f9f9f9;
}

.wpr-table-container .no-padding {
  padding: 0;
}

.wpr-table-container .wpr-table-missing td {
  background-color: #ff000830;
}

.wpr-table-container .wpr-table-difference td {
  background-color: rgba(255, 166, 0, 0.3);
}

.wpr-table-container .wpr-table-match td {
  background-color: rgba(9, 255, 0, 0.3);
}

.wpr-table-container table.table_diff tr td {
  width: 45%;
  border-left: none;
  word-break: break-all;
  font-size: 14px;
  font-family: monospace;
  vertical-align: top;
}

.wpr-table-container .table_diff {
  width: 100%;
}

@-moz-keyframes spin {
  100% {
    -moz-transform: rotate(-360deg);
  }
}
@-webkit-keyframes spin {
  100% {
    -webkit-transform: rotate(-360deg);
  }
}
@keyframes spin {
  100% {
    -webkit-transform: rotate(-360deg);
    transform: rotate(-360deg);
  }
}

/* tabs */
.tools_page_wp-reset .ui-tabs {
  max-width: 100%;
  position: relative;
  padding: 0px;
  zoom: 1;
  margin: 0;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-nav {
  margin: 0;
  padding: 0;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-nav li {
  list-style: none;
  position: relative;
  top: 1px;
  margin: 0 0.2em 1px 0;
  padding: 0;
  white-space: nowrap;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-nav li a {
  text-decoration: none;
}

.tools_page_wp-reset ul.ui-tabs-nav.wpr-main-tab li.ui-state-active {
  border-bottom: 2px solid #dd3036;
  background: transparent;
  _transition: all 0.4s ease-out;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-nav li.ui-tabs-selected a,
.tools_page_wp-reset .ui-tabs .ui-tabs-nav li.ui-state-disabled a,
.tools_page_wp-reset .ui-tabs .ui-tabs-nav li.ui-state-processing a {
  cursor: text;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-nav li a,
.tools_page_wp-reset .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a {
  cursor: pointer;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-panel {
  display: block;
  border: none;
  overflow: visible;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-hide {
  display: none !important;
}

.tools_page_wp-reset .ui-tabs .ui-tabs-nav li a {
  font-size: 14px;
  font-weight: 600;
  line-height: 32px;
  color: #616161;
  padding: 5px 0;
  display: block;
  letter-spacing: 1px;
}

.tools_page_wp-reset .ui-tabs ul.ui-tabs-nav li.ui-state-active .icon {
  color: #666666;
}

.tools_page_wp-reset .ui-tabs-nav:after {
  content: '';
  clear: both;
  display: block;
}

.tools_page_wp-reset .ui-tabs-anchor,
.nav-tab {
  outline: none !important;
}

.tools_page_wp-reset .ui-tabs ul.ui-tabs-nav li {
  color: #aaaaaa;
  display: inline-block;
  font-size: 12px;
  line-height: 16px;
  margin: 0px 20px 0px 5px;
  text-decoration: none;
  text-shadow: none;
  padding: 0;
  text-align: center;
  border-bottom: 2px solid transparent;
}

@media screen and (max-width: 880px) {
  .tools_page_wp-reset .ui-tabs .ui-tabs-nav {
    padding: 0 25px;
  }
  .tools_page_wp-reset .ui-tabs ul.ui-tabs-nav li {
    margin: 0px 10px 0px 5px;
  }
}

.tools_page_wp-reset .ui-tabs ul.ui-tabs-nav li .label {
  display: block;
  margin-top: -10px;
}

.tools_page_wp-reset .ui-tabs ul.ui-tabs-nav li:first-child {
  margin-left: 0;
}

.tools_page_wp-reset ul.ui-tabs-nav.wpr-main-tab {
  padding-bottom: 0;
  width: 100%;
  box-sizing: border-box;
  margin-left: -20px;
}

.tools_page_wp-reset .ui-state-hover a,
.tools_page_wp-reset .ui-state-active a,
.tools_page_wp-reset li.ui-state-hover,
.tools_page_wp-reset li.ui-state-hover a {
  color: #000000 !important;
}

.tools_page_wp-reset .ui-tabs ul.ui-tabs-nav li.ui-state-hover {
  background-color: #ffffff !important;
  border-bottom: 2px solid #dd3036;
}

.tools_page_wp-reset .ui-tabs-nav a:focus {
  box-shadow: none;
  -webkit-box-shadow: none;
}
/* tabs */

/* diff */

.Differences {
  width: 100%;
  border-collapse: collapse;
  border-spacing: 0;
  empty-cells: show;
}

.Differences thead th {
  text-align: left;
  border-bottom: 1px solid #000;
  background: #aaa;
  color: #000;
  padding: 4px;
}
.Differences tbody th {
  text-align: right;
  background: #ccc;
  width: 4em;
  padding: 1px 2px;
  border-right: 1px solid #00000080;
  border-bottom: none;
  vertical-align: middle;
  font-size: 13px;
  font-weight: 400;
}

.Differences td {
  padding: 5px !important;
  font-family: Consolas, monospace;
  font-size: 13px;
}

.DifferencesSideBySide .ChangeInsert td.Left {
  background: #dfd;
}

.DifferencesSideBySide .ChangeInsert td.Right {
  background: #cfc;
}

.DifferencesSideBySide .ChangeDelete td.Left {
  background: #f88;
}

.DifferencesSideBySide .ChangeDelete td.Right {
  background: #faa;
}

.DifferencesSideBySide .ChangeReplace .Left {
  background: #fe9;
}

.DifferencesSideBySide .ChangeReplace .Right {
  background: #fd8;
}

.Differences ins,
.Differences del {
  text-decoration: none;
}

.DifferencesSideBySide .ChangeReplace ins,
.DifferencesSideBySide .ChangeReplace del {
  background: #fc0;
}

.Differences .Skipped {
  background: #f7f7f7;
}

.DifferencesInline .ChangeReplace .Left,
.DifferencesInline .ChangeDelete .Left {
  background: #fdd;
}

.DifferencesInline .ChangeReplace .Right,
.DifferencesInline .ChangeInsert .Right {
  background: #dfd;
}

.DifferencesInline .ChangeReplace ins {
  background: #9e9;
}

.DifferencesInline .ChangeReplace del {
  background: #e99;
}

/* diff */

.pro-feature {
  font-weight: normal;
  font-variant: small-caps;
  font-style: italic;
  color: inherit;
  text-decoration: none;
}

.pro-feature.pro-feature-text {
  font-weight: 700;
  font-style: normal;
}

.pro-feature:hover {
  text-decoration: underline;
  cursor: pointer;
  color: inherit;
}

.dropdown-item .pro-feature:hover {
  text-decoration: none;
}

a.button .pro-feature:hover {
  text-decoration: inherit;
  cursor: inherit;
  color: inherit;
}

th .pro-feature {
  display: inline-block;
}

li .pro-feature {
  white-space: nowrap;
}

.pro-feature .pro,
.pro-feature.pro-feature-text span {
  font-weight: 700;
  color: #dd3036;
}

#pricing-table tr.pricing td {
  padding: 20px 10px;
  line-height: 1.5;
}

#pricing-table tr td:nth-child(3),
#pricing-table tr th:nth-child(3) {
  background-color: #f9f9f9;
}

#pricing-table tr.pricing td del {
  text-decoration-color: #dd3036;
}

#pricing-table tr.pricing td b {
  font-weight: 900;
}

#tab-pro label {
  vertical-align: inherit;
  font-weight: 500;
  min-width: 95px;
  display: inline-block;
  padding: 2px 0;
}

#wpr-license-key {
  margin-left: 0;
}

.tools_page_wp-reset #pricing-table td,
.tools_page_wp-reset #pricing-table th {
  padding: 10px 10px;
  text-align: center;
}

.tools_page_wp-reset #pricing-table td:first-child {
  text-align: left;
}

.tools_page_wp-reset #pricing-table tfoot th {
  border-top: thin solid #444444;
  border-bottom: none;
}

.tools_page_wp-reset #pricing-table tbody tr:last-child td {
  border-bottom: none;
}

.tools_page_wp-reset #pricing-table th {
  vertical-align: top;
  font-weight: normal;
}

.tools_page_wp-reset #pricing-table th span {
  color: #dd3036;
  font-weight: 700;
}

/* collections */
.tools_page_wp-reset .collection-table tr td:first-child .dashicons {
  margin-right: 8px;
}

.tools_page_wp-reset .collection-table tr td:first-child {
  width: 85px;
}

.tools_page_wp-reset table tr td:first-child {
  padding-left: 5px;
}

.tools_page_wp-reset .collection-table td {
  padding: 10px 10px;
}

.tools_page_wp-reset table tr td:last-child {
  padding-right: 5px;
}

.tools_page_wp-reset .collection-table .actions {
  text-align: center;
  white-space: nowrap;
  width: 100px;
}

.collection-item-details span {
  display: block;
  font-weight: 500;
}
/* collections */

/* Fontello */
@font-face {
  font-family: 'fontello';
  src: url('./font/fontello.eot?91671913');
  src: url('./font/fontello.eot?91671913#iefix') format('embedded-opentype'),
    url('./font/fontello.woff2?91671913') format('woff2'), url('./font/fontello.woff?91671913') format('woff'),
    url('./font/fontello.ttf?91671913') format('truetype'), url('./font/fontello.svg?91671913#fontello') format('svg');
  font-weight: normal;
  font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
  @font-face {
    font-family: 'fontello';
    src: url('./font/fontello.svg?91671913#fontello') format('svg');
  }
}
*/

[class^='icon-']:before,
[class*=' icon-']:before {
  font-family: 'fontello';
  font-style: normal;
  font-weight: normal;
  display: inline-block;
  text-decoration: inherit;
  width: 1em;
  margin-right: 0.2em;
  text-align: center;
  /* opacity: .8; */

  /* For safety - reset parent styles, that can break glyph codes*/
  font-variant: normal;
  text-transform: none;

  /* fix buttons height, for twitter bootstrap */
  line-height: 1em;

  /* Animation center compensation - margins should be symmetric */
  /* remove if not needed */
  margin-left: 0.2em;

  /* you can be more comfortable with increased icons size */
  /* font-size: 120%; */

  /* Font smoothing. That was taken from TWBS */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;

  /* Uncomment for 3D effect */
  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}

.icon-doc-text-inv:before {
  content: '\f15c';
} /* '' */
.icon-database:before {
  content: '\f1c0';
} /* '' */

.wpr-collections-installer {
  height: 100px;
  display: block;
  overflow-y: hidden;
  overflow-x: hidden;
  position: relative;
  padding: 68px 40px;
  -webkit-mask-image: -webkit-linear-gradient(
    top,
    rgba(255, 255, 255, 0) 0%,
    rgba(255, 255, 255, 1) 38%,
    rgba(255, 255, 255, 1) 63%,
    rgba(255, 255, 255, 0) 100%
  );
}

.wpr-collections-installer-errors {
  overflow-y: auto;
  overflow-x: hidden;
  position: relative;
  padding: 0px 40px;
  max-height: 200px;
}

.wpr-collections-installer::-webkit-scrollbar,
.wpr-collections-installer-errors::-webkit-scrollbar {
  height: 12px;
  width: 6px;
  background: #ccc;
}

.wpr-collections-installer::-webkit-scrollbar-thumb,
.wpr-collections-installer-errors::-webkit-scrollbar-thumb {
  background: #dd3036;
  -webkit-border-radius: 1ex;
  -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.75);
}

.wpr-collections-installer::-webkit-scrollbar-corner,
.wpr-collections-installer-errors::-webkit-scrollbar-corner {
  background: #ccc;
}

.wpr-collections-installer-message {
  text-align: left;
  position: relative;
  margin: 20px 0;
}

.wpr-collections-error {
  position: absolute;
  color: #f00;
  font-size: 12px;
  left: 24px;
  bottom: -14px;
}

.wpr-collections-installer-message .dashicons {
  vertical-align: text-top;
  line-height: 24px;
  height: 24px;
}

.wpr-collections-installer-loading .dashicons:before {
  content: '\f463';
}

.wpr-collections-installer-loading .dashicons {
  -webkit-animation: wpr_rspin 1.5s linear infinite;
  -moz-animation: wpr_rspin 1.5s linear infinite;
  animation: wpr_rspin 1.5s linear infinite;
}

.wpr-collections-installer-done {
  opacity: 1;
}

.wpr-collections-installer-success .dashicons:before {
  content: '\f12a';
  color: #1e232a;
}

.wpr-collections-installer-error .dashicons:before {
  content: '\f153';
  color: #dd3036;
}

@-moz-keyframes wpr_rspin {
  100% {
    -moz-transform: rotate(360deg);
  }
}
@-webkit-keyframes wpr_rspin {
  100% {
    -webkit-transform: rotate(360deg);
  }
}
@keyframes wpr_rspin {
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

#wpfssl-ad {
  border: 3px solid #42982e;
  min-width: 280px;
  max-width: 400px;
  padding: 10px 20px;
  background: white;
}

@media screen and (max-width: 1520px) {
    .wpr-container,
    .tools_page_wp-reset nav{
        width:700px;
    }

}

@media screen and (max-width: 1300px) {
    #wpr-sidebar-ads {
        display: none !important;
    }

    .wpr-container,
    .tools_page_wp-reset nav{
        width:910px;
    }
}

#wpr-sidebar-ads {
  position: fixed;
}

#wpfssl-ad a.button {
  padding: 11px 20px;
  color: white;
  background: #42982e;
  font-weight: 600;
  border: none;
  line-height: 1.5;
  height: auto;
  margin-bottom: 10px;
  white-space: normal;
  max-width: 90%;
}

#wpfssl-ad a.button:hover,
#wpfssl-ad a.button:active,
#wpfssl-ad a.button:focus {
  box-shadow: 0px 0px 10px 0px rgb(50 138 210 / 52%);
  background: #42982e;
  color: white;
  border: none;
}

#wpr-ad {
  border: 3px solid #dd3036;
  min-width: 280px;
  max-width: 400px;
  padding: 10px 20px;
  background: white;
  margin-bottom: 30px;
}

#wpr-ad a.button {
  padding: 11px 20px;
  color: white;
  background: #dd3036;
  font-weight: 600;
  border: none;
  line-height: 1.5;
  height: auto;
  margin-bottom: 10px;
  white-space: normal;
  max-width: 90%;
}

#wpr-ad a.button:hover,
#wpr-ad a.button:active,
#wpr-ad a.button:focus {
  box-shadow: 0px 0px 10px 0px rgb(50 138 210 / 52%);
  background: #dd3036;
  color: white;
  border: none;
}

.wpr-main-tab li.tab-pro a {
  color: #dd3036 !important;
}

.wpreset-pro-dialog .ui-dialog-titlebar {
  display: none;
}

.wpreset-pro-dialog .logo img {
  max-height: 55px;
}

.wpreset-pro-dialog .logo {
  text-align: center;
  background: #f8f8f8;
  margin: -16px -16px 0 -16px;
  padding: 15px;
}

.wpreset-pro-dialog .footer {
  text-align: center;
  background: #f8f8f8;
  margin: 0 -16px -16px -16px;
  padding: 20px;
}

.wpreset-pro-dialog .logo span {
  display: block;
  font-size: 18px;
  margin: 10px;
}

.wpreset-pro-dialog .logo span b {
  border-bottom: 3px solid #dd3036;
}

#wpreset-pro-table {
  width: 100%;
  margin: 10px auto 0 auto;
  border-collapse: collapse;
}

#wpreset-pro-table td {
  padding: 4px 10px 4px 34px;
  border: none;
  font-size: 14px;
}

#wpreset-pro-table tr:last-child td {
  text-align: center;
}

#wpreset-pro-table .dashicons-yes {
  color: #dd3036;
}

#wpreset-pro-table .dashicons {
  padding-right: 8px;
  margin-left: -27px;
}

#wpreset-pro-table .center {
  text-align: center;
}

.prices del {
  color: #00000099;
}

.prices span {
  font-weight: 600;
  font-size: 40px;
  color: #dd3036;
  line-height: 1;
  display: inline-block;
  padding-bottom: 15px;
}

#wpreset-pro-table tr:first-child td {
  color: #000;
  font-size: 18px;
  font-weight: 800 !important;
  padding: 10px 0;
  text-align: center;
}

#wpreset-pro-table tr:last-child td {
  padding: 20px 0 20px 0;
  vertical-align: top;
}

#wpreset-pro-table tr:last-child td {
  text-align: center;
}


#wpreset-pro-table a.button.button-buy {
  padding: 11px 40px;
  color: white;
  background: #dd3036;
  font-weight: 600;
  border: none;
  line-height: 1.5;
  height: auto;
  margin-bottom: 10px;
}

#wpreset-pro-table a.button.button-buy:hover,
#wpreset-pro-table a.button.button-buy:active,
#wpreset-pro-table a.button.button-buy:focus {
  box-shadow: 0px 0px 10px 0px rgb(50 138 210 / 52%);
  background: #dd3036;
  color: white;
  border: none;
}

.wp-dialog.ui-widget-content {
  background: #fff !important;
}

#wpreset-pro-dialog {
  overflow: hidden;
}

div.ui-dialog {
  position: fixed;
}

PK!tx!7__css/tooltipster.bundle.min.cssnu�[���.tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,1);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-moz-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-ms-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-o-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);transition-timing-function:cubic-bezier(.23,.635,.495,2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-fall.tooltipster-initial{top:0!important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0!important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-slide.tooltipster-initial{left:-40px!important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0!important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading .4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating .6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling .6s}.tooltipster-sidetip .tooltipster-box{background:#565656;border:2px solid #000;border-radius:4px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{color:#fff;line-height:18px;padding:6px 14px}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#565656;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#565656;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#565656;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#565656;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#000}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#000}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#000}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#000}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px}PK!���&css/font/fontello.eotnu�[���X�LPN:�fontelloRegularVersion 1.0fontello�pGSUB �%z�TOS/2G|R�PVcmap����cvt �	@ fpgm���Y	`pgasp	8glyf�o�i0dheads�1�6hhea=T�$hmtx
��loca�2�maxp� name̝!$�post�	�Aprep�A+���
0>DFLTlatnliga��z��z��1PfEd@�\�R�jZR�,^X,
^,�\��\�(�\�\���jYR(8Hc@`B:	2*"Gm
	`		``HX
IFD><64.,&$+!!!"&'467!54&#!"3!26=4&#!"3!26=4&#!"3!263��
&/� � o
�w

�

�w

�

�w

�
H
���� |���d$

$

�$

$

�$

$

�j[R,=o@l9*!G)Fm`
`H	X
I.-65-=.=&%,,+267".'5267".'57267.'52".'54>���Br���nB慄�Br���nB慄�Br���nB�t�vr���nt��0/_&B&&B&_/0�T0/_'B&&B'_/0�0/_&B&*>(_/0�&B'G'B&&B'G'B&�:N_<��ٶ7�ٶ7��j�RR�j�����YY�2I(s�p�55=DLT_
+g�	j�			-	=	M	c	
Vs	&�Copyright (C) 2019 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2019 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.com
doc-text-invdatabase��R�jR�j�, �UXEY  K�QK�SZX�4�(Y`f �UX�%a�cc#b!!�Y�C#D�C`B-�,� `f-�, d ��P�&Z�(
CEcER[X!#!�X �PPX!�@Y �8PX!�8YY �
CEcEad�(PX!�
CEcE �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�
CEc�
C�`Ec�*! �C � ��+�0%�&QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba�bf�c�`�*-�,  E �Cc�b �PX�@`Yf�c`D�`-�,�CEB*!�C`B-�	,�C#D�C`B-�
,  E �+#�C�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,  E �+#�C�%` E�#a d�$PX��@Y#�PXeY�%#aDD�`-�, �#B�
EX!#!Y*!-�
,�E�daD-�,�`  �CJ�PX �#BY�
CJ�RX �
#BY-�, �bf�c �c�#a�C` �` �#B#-�,KTX�dDY$�
e#x-�,KQXKSX�dDY!Y$�e#x-�,�CUX�C�aB�+Y�C�%B�%B�
%B�# �%PX�C`�%B�� �#a�*!#�a �#a�*!�C`�%B�%a�*!Y�CG�
CG`�b �PX�@`Yf�c �Cc�b �PX�@`Yf�c`�#D�C�>�C`B-�,�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�
+�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-� ,�+-�!,�+-�",�+-�#,�+-�$,�+-�%,�+-�&,�+-�',�+-�(,�	+-�), <�`-�*, `�` C#�`C�%a�`�)*!-�+,�*+�**-�,,  G  �Cc�b �PX�@`Yf�c`#a8# �UX G  �Cc�b �PX�@`Yf�c`#a8!Y-�-,�ETX��,*�0"Y-�.,�
+�ETX��,*�0"Y-�/, 5�`-�0,�Ec�b �PX�@`Yf�c�+�Cc�b �PX�@`Yf�c�+��D>#8�/*-�1, < G �Cc�b �PX�@`Yf�c`�Ca8-�2,.<-�3, < G �Cc�b �PX�@`Yf�c`�Ca�Cc8-�4,�% . G�#B�%I��G#G#a Xb!Y�#B�3*-�5,��%�%G#G#a�	C+e�.#  <�8-�6,��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca#  �&#Fa8#�CF�%�CG#G#a` �C�b �PX�@`Yf�c`# �+#�C`�+�%a�%�b �PX�@`Yf�c�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�7,�   �& .G#G#a#<8-�8,� �#B   F#G�+#a8-�9,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�cc# Xb!Yc�b �PX�@`Yf�c`#.#  <�8#!Y-�:,� �C .G#G#a `� `f�b �PX�@`Yf�c#  <�8-�;,# .F�%FRX <Y.�++-�<,# .F�%FPX <Y.�++-�=,# .F�%FRX <Y# .F�%FPX <Y.�++-�>,�5+# .F�%FRX <Y.�++-�?,�6+�  <�#B�8# .F�%FRX <Y.�++�C.�++-�@,��%�& .G#G#a�	C+# < .#8�++-�A,�%B��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# G�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca�%Fa8# <#8!  F#G�+#a8!Y�++-�B,�5+.�++-�C,�6+!#  <�#B#8�++�C.�++-�D,� G�#B�.�1*-�E,� G�#B�.�1*-�F,��2*-�G,�4*-�H,�E# . F�#a8�++-�I,�#B�H+-�J,�A+-�K,�A+-�L,�A+-�M,�A+-�N,�B+-�O,�B+-�P,�B+-�Q,�B+-�R,�>+-�S,�>+-�T,�>+-�U,�>+-�V,�@+-�W,�@+-�X,�@+-�Y,�@+-�Z,�C+-�[,�C+-�\,�C+-�],�C+-�^,�?+-�_,�?+-�`,�?+-�a,�?+-�b,�7+.�++-�c,�7+�;+-�d,�7+�<+-�e,��7+�=+-�f,�8+.�++-�g,�8+�;+-�h,�8+�<+-�i,�8+�=+-�j,�9+.�++-�k,�9+�;+-�l,�9+�<+-�m,�9+�=+-�n,�:+.�++-�o,�:+�;+-�p,�:+�<+-�q,�:+�=+-�r,�	EX!#!YB+�e�$Px�0-K��RX��Y��cp�B�*�B�
*�B�*�B��	*�B�@	*�D�$�QX�@�X�dD�&�QX��@�cTX�DYYYY�*������DPK!H��y�	�	css/font/fontello.woff2nu�[���wOF2	�X	^TV� 	�p
�d�B6$ �MA�#QT�zd?lwhk�E�ȦC�,�s�m�<�_ֹo*G��\I��J�Ұ��J�``-gb�Ԏ�-����B@ُ��.�����3���x�h�fE	�憷b���h���z�f֊����:�����}οoL��Q#1��,7	i���Y��&��"����)�p����\�D?-�Ʀ�^Lx����c�L[پe�.c02�q6rO}�\��z�����[ZE���o9��\��z��V�gS�ջ,�ppD
0����+��nې%(��&'���4���)	��Q��Hȟ�.�Rcr�r\I�-M��`Ibʸ��z��Y){��I&:��ʵ�%	���5"]ع��!n��%x�:��K��>�}�j�~/����7�ڄ���<��DO���U
�Kj��/�[�Kx����^ٴ�ˀ�Ꮏ�]��%����`~��9���0�\
��	K"�D�}F|���y]V+Feu�e-�Bt��B��?5i��_�q���0'�^Ďb.FF��
X��r�����H4AylP�I��*����iE��D�drr��f.:g��0.yN�7��1~�/f�hѰ-�R��ǻM�Z3p&��T8`����yM]`ҭ�w���PU�b}3��x� ߨ�f��L��R�y ��K�?�Jmy ̢6)�-���TM=�3��H(9Ho�R�Χ<�����X�ڝ��X�8Jc
j�r0�u?U�%`��J�٦�N��A�*Z�a&�1!y��M#yw��a�0�I������)lj�D
	H�/��*H�]M���dMԳw�=ȁLT2�Y��@6+�F.䱅|�Q�
�E�2�1!ϵ��J��<����X��
*�B%ۨb�좆}ŵ�洄�&��W��/�"��NP?M=�3��@��x]dͪ-�FNm�|4���h(�����M~xq3�<�v}�\�1M��C�/ƶm�6����Ц�Q̀8|B�6��l��
^���T�:̪�1�G��n����s�3"�ko��R���Q��/���Wm�H�m鸮d��J��X$������5��M��M�T[nq�6*�#5E�-�/�X.
��|]��Ӝ�p�c5&a���Ug�����l��l�������B�ktWC�E_|
�(���$,�a���<=��J�4�>�1��bZ�
aތũ�M�5d����hkϤ׫U}$
;�cőI��+HA���<�6GcU?L=�e��@�ܫ����a�'������Ns��0��S儲\ۣ6°G=[|l�bgL~�MA�[#+�M�u����'�.�)goڪ��:���9��0���To��_�ɚ1�:�A��Z�Δ��+�J�M+��BG�oD���Ө-"J��2)&2��h�Jg0`� �FB&�H`�l8A�,�"�!�Y!� �b� 	B(eA	�)gA�Pɂ*��MB-Kyאx��]�)���bL�l�4L�E�B�"D�1���_�.$B�)$\�2n!�2^!��4<��U�Gf�>�mH��S��҈ ��D�؀�x0����qң�h$I;vKVPߒ���W��|0�9�PuH�~`\���^y3��%��6�.���d�?��ʏ?.��>הe�Ä5W�I���'���M?x�u�9T9�<'��o�o��9���%���wU�w�WT��Է�z�y�u�}��摦5U{F��߫�1R�F�R�0�jQ%�\��y�v�`�~��7�H�4��N¾�!�cvĒFУ}���)�.�W�1�@�Fv�Ep}�&�a;>;����D��t,K%P*�f��Ա���������¬�p��us�VV}l{oPkǮ+UBA����j���Sqll���$������m��D)�@됞��XR�]���M�U��
%
9ّ�h���p�ʬG>������T�
�����6&�f��]��}�|��B��h�/h�n��{(r�ap:���t�F�턎*�t�
�AU�2FF��ZX�ڸ�Q�Գ�2����{:����K��1��6�2�Zd�ۖ�u�����U���Vg�k��5�=W�8��U��SyXɔ��I�)�a�I�kmj�tiP�}7��߿�|P�T����(���^qv��#�e���~<j�S�G-�ҋ�Z9�c���oa'l�c��g3Z���lo{'�7���좉u�b�[��8[N��2t��T�޻[��{��D�����N �룝����ݦD�gc�F�Fh+��������0�I ��lFͥ�%-E�>?�E�Cp��u�U�e�A�����gywa�ȵ�)٪+�}	k��D]��	�W��}^���8!�.M2v�B._�H�.O�sU���ӈ��Z�8A�Njw~"�$X�,N^�\sI1PK!|�eߵ�css/font/fontello.svgnu�[���<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2021-2023 by original authors @ fontello.com</metadata>
<defs>
<font id="fontello" horiz-adv-x="1000" >
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="doc-text-inv" unicode="&#xf15c;" d="M819 584q8-7 16-20h-264v264q13-8 21-16z m-265-91h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304q0-22 16-37t38-16z m89-411v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 7-5 12t-13 5h-393q-8 0-13-5t-5-12v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z" horiz-adv-x="857.1" />

<glyph glyph-name="database" unicode="&#xf1c0;" d="M429 421q132 0 247 24t181 71v-95q0-38-57-71t-157-52-214-19-215 19-156 52-58 71v95q66-47 181-71t248-24z m0-428q132 0 247 24t181 71v-95q0-39-57-72t-157-52-214-19-215 19-156 52-58 72v95q66-47 181-71t248-24z m0 214q132 0 247 24t181 71v-95q0-38-57-71t-157-52-214-20-215 20-156 52-58 71v95q66-47 181-71t248-24z m0 643q116 0 214-19t157-52 57-72v-71q0-39-57-72t-157-52-214-19-215 19-156 52-58 72v71q0 39 58 72t156 52 215 19z" horiz-adv-x="857.1" />
</font>
</defs>
</svg>
PK!M��@@css/font/fontello.woffnu�[���wOFF@XGSUBX;T �%zOS/2�CVG|R�cmap�V���cvt 0 �fpgmD�p���Ygasp�glyf��d�o�ihead	�06s�1hhea	�$=Thmtx	�
�loca	��2maxp	�  �name
w�̝!post�0A�	prep�z��A+�x�c`d``�b0`�c`rq�	a��I,�c�b`a��<2�1'3=���ʱ�i f��&;Hx�c`d�d�����TŴ����B3>`0dd�2�23`i�)c>`�����0
(����x��
�0/i�1⁘�+u�⦰�.V��,@��`7�Щ�"O���)r���j��d��p�(��b��棭�h��	���x�c`@��?�l�x��Viw�FyI��,%-ja��i�F&l��	A�c ]�����;����_�d�s�7~Z�/$���p���w�����eZ��둔�/���&��<	�M�Q|(;{!e���Q��ڷ�DD"P���D�Y�d|�QF˶�WM�-=�.[�A�U�~:ʱ;��f3th=�%UU�H�=RҦe��+I+����W�PˆN"i���H�g��h5��(�l��(R$��Ay����	�͐�ʧ����أ�V�K���/y�w9?�_oQ��@Ȏ���t%_�[[aܴ��(Tv�wBl��T�f��F�+2�Ќ`�|�+?��!Y-�O��G�Z��A�eN�K>���)q�Y���	��3��>���)�x�zG%�)as4I�0r`%e�*����8�uZ�[�~��ї�h�Pwb<[[9Q��hR��L��Iͣ)
��t&x̯(?�I^mc5��G�8fƄD"-�KSA,;��)ͣ����v-Z���ܣ���V���S��FV�b:���i�/�i��"E��~L�A�2�-6Ô�o���ז������+�}�D���O�)	L��U�V@b�kY��լ���wC�V����rǾ�q�_33���߉ӳ#.=s�K�|�u=�ש�rqfyN�Y���4����Y���K[��,?�i��G:cyA�t���0��0��CX^�!,a�CXa�%��c�r����e��SI�ڙXlB`b���E�j*�TB�hTjC�n�TϪe�^<�9�H�Ț_1Ε�F��-o;W���o��9�R֋�?���T%�b�Ó����l'�6�xtM��U=��_TTX�H�X(ʲlpg"��:��j��C�l�<��u˚��71BP��7܃NYIY����۲�;�r8,I17�V�"#��~�Yʞ�|p�Je�j���'1��$�q[Q6H����
�y�&a�
�N�
�an�y'\�z�,��E��(��[��D��h����a��B�oq$4��~T��5�4Rn�_�ٺmB��#*vò�������m�|��գ���^�N��~f�� 51{�tq�ʻZ�2GmS��SךC�U���Q����9k�n�'z_Ӫ��\,��m�R&�a�
��ťP�e4I���P������|�+U��q$�NԷ��`��G��c�r
.���n��l�����70k��Y���t�!G����
|�qz���!�c���&���ݵ��S���9>���a�d�-�0�f��s�2��s|��u�/�� d��9�0'x�_1����a�
s�|�1s$�a����0�-^�]��AU�SOX���PSe�����A�� �����/�g����AL�Uӝ!�7^��1����L��e��|�
�]l>����@���x�}�OkQ��}oޟ�$���L�fډ�iR�d�bB	Ҥ[qQq��kA�nܩ?����+��Ѕ�r�'�~7}Ӡ(��8��޹ws ���]~5��f���X>��l�k1%KLX���AG�M:�
�l�@��J�y~!�>+�=�vo�o�N;Z
.W�nN�t���
��<,V�
Q�؏���]	�No;��#�?�m��oQ7��K~@+�_9vt�T;��W��ݳ�*�6���]�gf��� =\͖2y��S��2X��3������w^�s�d+d�K%S��W�Z"�w��iG��@�cT0K$9�2?��1�o*,���r��@����(Z��m�[�/ֵ�Kn^T6���j*���9��a@�W��}q6y���G|r��_���	���)���D�ȼ��Vz�P3���/����s�;���86g�x�c`d``b��O��m�2p3��0��f~A��b~��r00�D\�Vx�c`d``��$_00��$�"(�����YY�2I(s�px�u��N�@����
�M�:+1�K�ltC[SJiKJ�L^�w�a|	�şv0b��|�3gN�5�!�?O9�1���Y.�?[.�_,�Pś�2���
X��� ����,p%.-��B�Y.�?Z.�{�K������
&"�\Ž���VGAhdmP��f�#�[���č��6�ҩ�˹J�����r�c?XǮއ�y��4R�l9ͽ���]��v��M�6f.�Z-��fȕV�3Nh̪�h�=(���Fī
a Q��sn��:�)3$3�	\�4.��f+)�>ǜQB�3#&;�]�1)�U���a<!�Έ2/ٗ���F�$�t3;��=ņ��i
w��YWÃ���[[�x�Nv+�������x�Ux�c`b�.쀙�������'%?Y�$��D73��#%�$1)�8��krx�c��p"(b##c_�Ɲ�X�6102h����9 ,>0��i��4'����ffp٨�����#b#s��F5oG#�CGrHHI$l�ab�����uK�F&v#�PK!ź�XXcss/font/fontello.ttfnu�[����pGSUB �%z�TOS/2G|R�PVcmap����cvt �	@ fpgm���Y	`pgasp	8glyf�o�i0dheads�1�6hhea=T�$hmtx
��loca�2�maxp� name̝!$�post�	�Aprep�A+���
0>DFLTlatnliga��z��z��1PfEd@�\�R�jZR�,^X,
^,�\��\�(�\�\���jYR(8Hc@`B:	2*"Gm
	`		``HX
IFD><64.,&$+!!!"&'467!54&#!"3!26=4&#!"3!26=4&#!"3!263��
&/� � o
�w

�

�w

�

�w

�
H
���� |���d$

$

�$

$

�$

$

�j[R,=o@l9*!G)Fm`
`H	X
I.-65-=.=&%,,+267".'5267".'57267.'52".'54>���Br���nB慄�Br���nB慄�Br���nB�t�vr���nt��0/_&B&&B&_/0�T0/_'B&&B'_/0�0/_&B&*>(_/0�&B'G'B&&B'G'B&�:N_<��ٶ7�ٶ7��j�RR�j�����YY�2I(s�p�55=DLT_
+g�	j�			-	=	M	c	
Vs	&�Copyright (C) 2019 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2019 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.com
doc-text-invdatabase��R�jR�j�, �UXEY  K�QK�SZX�4�(Y`f �UX�%a�cc#b!!�Y�C#D�C`B-�,� `f-�, d ��P�&Z�(
CEcER[X!#!�X �PPX!�@Y �8PX!�8YY �
CEcEad�(PX!�
CEcE �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�
CEc�
C�`Ec�*! �C � ��+�0%�&QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba�bf�c�`�*-�,  E �Cc�b �PX�@`Yf�c`D�`-�,�CEB*!�C`B-�	,�C#D�C`B-�
,  E �+#�C�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,  E �+#�C�%` E�#a d�$PX��@Y#�PXeY�%#aDD�`-�, �#B�
EX!#!Y*!-�
,�E�daD-�,�`  �CJ�PX �#BY�
CJ�RX �
#BY-�, �bf�c �c�#a�C` �` �#B#-�,KTX�dDY$�
e#x-�,KQXKSX�dDY!Y$�e#x-�,�CUX�C�aB�+Y�C�%B�%B�
%B�# �%PX�C`�%B�� �#a�*!#�a �#a�*!�C`�%B�%a�*!Y�CG�
CG`�b �PX�@`Yf�c �Cc�b �PX�@`Yf�c`�#D�C�>�C`B-�,�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�
+�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-� ,�+-�!,�+-�",�+-�#,�+-�$,�+-�%,�+-�&,�+-�',�+-�(,�	+-�), <�`-�*, `�` C#�`C�%a�`�)*!-�+,�*+�**-�,,  G  �Cc�b �PX�@`Yf�c`#a8# �UX G  �Cc�b �PX�@`Yf�c`#a8!Y-�-,�ETX��,*�0"Y-�.,�
+�ETX��,*�0"Y-�/, 5�`-�0,�Ec�b �PX�@`Yf�c�+�Cc�b �PX�@`Yf�c�+��D>#8�/*-�1, < G �Cc�b �PX�@`Yf�c`�Ca8-�2,.<-�3, < G �Cc�b �PX�@`Yf�c`�Ca�Cc8-�4,�% . G�#B�%I��G#G#a Xb!Y�#B�3*-�5,��%�%G#G#a�	C+e�.#  <�8-�6,��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca#  �&#Fa8#�CF�%�CG#G#a` �C�b �PX�@`Yf�c`# �+#�C`�+�%a�%�b �PX�@`Yf�c�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�7,�   �& .G#G#a#<8-�8,� �#B   F#G�+#a8-�9,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�cc# Xb!Yc�b �PX�@`Yf�c`#.#  <�8#!Y-�:,� �C .G#G#a `� `f�b �PX�@`Yf�c#  <�8-�;,# .F�%FRX <Y.�++-�<,# .F�%FPX <Y.�++-�=,# .F�%FRX <Y# .F�%FPX <Y.�++-�>,�5+# .F�%FRX <Y.�++-�?,�6+�  <�#B�8# .F�%FRX <Y.�++�C.�++-�@,��%�& .G#G#a�	C+# < .#8�++-�A,�%B��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# G�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca�%Fa8# <#8!  F#G�+#a8!Y�++-�B,�5+.�++-�C,�6+!#  <�#B#8�++�C.�++-�D,� G�#B�.�1*-�E,� G�#B�.�1*-�F,��2*-�G,�4*-�H,�E# . F�#a8�++-�I,�#B�H+-�J,�A+-�K,�A+-�L,�A+-�M,�A+-�N,�B+-�O,�B+-�P,�B+-�Q,�B+-�R,�>+-�S,�>+-�T,�>+-�U,�>+-�V,�@+-�W,�@+-�X,�@+-�Y,�@+-�Z,�C+-�[,�C+-�\,�C+-�],�C+-�^,�?+-�_,�?+-�`,�?+-�a,�?+-�b,�7+.�++-�c,�7+�;+-�d,�7+�<+-�e,��7+�=+-�f,�8+.�++-�g,�8+�;+-�h,�8+�<+-�i,�8+�=+-�j,�9+.�++-�k,�9+�;+-�l,�9+�<+-�m,�9+�=+-�n,�:+.�++-�o,�:+�;+-�p,�:+�<+-�q,�:+�=+-�r,�	EX!#!YB+�e�$Px�0-K��RX��Y��cp�B�*�B�
*�B�*�B��	*�B�@	*�D�$�QX�@�X�dD�&�QX��@�cTX�DYYYY�*������DPK!�
css/index.phpnu�[���<?php
// Silence is golden
PK!�F(�v5v5
readme.txtnu�[���=== WP Reset - Most Advanced WordPress Reset Tool ===
Tags: wordpress reset, reset database, reset wordpress, reset, advanced wordpress reset
Contributors: WebFactory
Requires at least: 4.0
Requires PHP: 5.2
Tested up to: 6.6
Stable tag: 2.03
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

WP Reset resets the entire site or selected parts using advanced reset options to default values. 100% safe to use with built-in restore function.

== Description ==

<a href="https://wpreset.com/">WP Reset</a> quickly resets the site's database to the default installation values without modifying any files. It deletes all customizations and content, or just chosen parts like theme settings. WordPress Reset is fast and safe to use thanks to the built-in snapshots which provide 1-click restore functionality. It has multiple fail-safe mechanisms so you can never accidentally lose data. WP Reset is extremely helpful for plugin and theme developers. It **speeds up testing & debugging** by providing a quick way to reset settings and re-test code. It's the only WP development tool for non-developers that enables advanced reset.

https://youtu.be/qMnkCW2PFoI?rel=0

For support please use the <a href="https://wordpress.org/support/plugin/wp-reset">official forum</a>, and if you need more information visit <a href="https://wpreset.com/">wpreset.com</a> and be sure to check out the <a href="https://wpreset.com/">roadmap</a> for the list of upcoming features.

Access WP Reset admin page via the "Tools" menu.

**Please read carefully before proceeding to understand what WP Reset does, and remember to always create a snapshot**

#### Resetting will delete:

* all posts, pages, custom post types, comments, media entries, users
* all default WP database tables
* all custom database tables that have the same prefix table prefix as the one defined in _wp-config.php_ and used by default tables

#### Resetting will not delete or modify:

* media files - they remain in the _wp-uploads_ folder untouched but will no longer be listed under Media in admin
* no files are touched; plugins, themes, uploads - everything stays
* site title, WordPress address, site address, site language and search engine visibility settings
* currently logged in user will be restored with the current username and password

#### What happens when I click the Reset button?

* remember to always create a snapshot first or a full backup
* you will have to confirm the action one more time because there is NO UNDO
* everything will be reset; see bullets above for details
* site title, WordPress address, site address, site language, search engine visibility settings as well as the current user will be restored
* you will be logged out, automatically logged in and taken to the admin dashboard
* WP Reset plugin will be reactivated if that option is chosen in the post-reset options

#### Undoing a reset

Before doing a reset, create a snapshot. The button is located right next to the reset button and it takes less than 10 seconds to create a snapshot. After reset is done, if you need to undo it simply restore the snapshot and that's it.

#### WP-CLI support

WP Reset comes with full WP-CLI support. Help on our WP-CLI commands is available via _wp help reset_. By default the commands have to be confirmed but you can use the `--yes` option to skip confirmation. Instead of the active user, the first user with admin privileges found in the database will be restored after reset. Please be careful when using WP Reset with WP-CLI - as with using the GUI always make a snapshot or backup first.

Currently supported WP-CLI commands:

* `wp reset reset`
* `wp reset version`
* `wp reset delete`
* `wp reset snapshots`


#### Database Snapshots

Database snapshot is a copy of all WP database tables, standard and custom ones, saved in the currently used database (as set by _wp-config.php_). Files are not saved or included in snapshots in any way.
Snapshots are primarily a development tool. Although they can be used for backups (and downloaded as gzipped SQL dumps), we suggest finding a more suitable tool for doing backups of live sites. Use snapshots to find out what changes a plugin made to your database - what custom tables were created, modified, deleted or what changes were made to site's settings. Or use it to quickly restore the development environment after testing database related changes.
Restoring a snapshot does not affect other snapshots, or WP Reset settings. Snapshots can be compared to current database tables, restored (by overwriting current tables), exported ad gzipped SQL dumps, or deleted. Creating a snapshot on an average WordPress installation takes 1-2 seconds.

https://youtu.be/xBfMmS12vMY?rel=0

#### Multisite (WP-MU) Support

WP Reset has yet to be completely tested with multisite! Please be careful when using it with multisite enabled. We don't recommend to resetting the main site. Sub-sites should be OK. We're working on making WP Reset fully compatible with WP-MU. Till then please be careful. Thank you for understanding.

#### Partial Reset Tools

* Delete transients - deletes all transient related database entries. Including expired and non-expired transients, and orphaned timeout entries.
* Delete uploads - delete all files and folder in the /uploads/ folder.
* Delete plugins - deletes all plugins except WP Reset which remains active.
* Reset theme options - resets all options for all themes that use the WP theme mods API.
* Delete themes - deletes all themes.
* Empty or delete custom tables - empties (truncates) or deletes (drops) all custom database tables.
* Delete .htaccess file - deletes the .htaccess file. If you need to edit .htaccess without FTP use our free <a href="https://wordpress.org/plugins/wp-htaccess-editor/">WP Htaccess Editor</a> plugin.

#### GDPR compatibility
We are not lawyers. Please do not take any of the following as legal advice.
WP Reset does not track, collect or process any user data on the front end. Nothing is logged or pushed to any 3rd parties. We also don't use any 3rd party services or CDNs. All actions are performed in the admin and started exclusively on users' request. If you opt to activate your PRO license in the plugin, some data will be shared with WebFactory Ltd; that's clearly noted below the license activation form. Based on that, we feel it's GDPR compatible, but again, please, don't take this as legal advice.

#### Friends who helped us translate WP Reset

* French - <a href="https://www.infrenchtranslation.com/">Jeff Inho</a>

If you're having problems with SSL or HTTPS try our free <a href="https://wordpress.org/plugins/wp-force-ssl/">WP Force SSL</a> plugin. It's a great plugin to enable SSL or install SSL.

== Installation ==

Follow the usual routine;

1. Open WordPress admin, go to Plugins, click Add New
2. Enter "wp reset" in search and hit Enter
3. Plugin will show up as the first on the list (look for our black&red round logo), click "Install Now"
4. Activate & open plugin's settings page located under the Tools menu

Or if needed, upload manually;

1. Download the latest stable version from from <a href="https://downloads.wordpress.org/plugin/wp-reset.latest-stable.zip">downloads.wordpress.org/plugin/wp-reset.latest-stable.zip</a>
2. Unzip it and upload to _/wp-content/plugins/_
3. Open WordPress admin - Plugins and click "Activate" next to "WP Reset"
4. Open plugin's admin page located under the Tools menu


== Screenshots ==

1. WP Reset - main reset page
2. All reset actions have to be confirmed
3. Additional tools for resetting and deleting various WordPress objects
4. Database Snapshots enable 1-click restoring and testing
5. Use our 1-click backup feature before running any reset tools

== Changelog ==

= v2.03 =
* 2024/06/04
* Adjusted HTML escaping on translatable strings
* Fixed some unescaped HTML output

= v2.02 =
* 2024/05/13
* Fixed license ajax security issue

= v2.01 =
* 2024/04/16
* Completely unnecessary update we were forced to do

= v2.00 =
* 2024/03/25
* More secure snapshot export filename

= v1.99 =
* 2024/03/13
* PHP 8.2 compatibility fix

= v1.98 =
* 2023/09/24
* RTL GUI fix

= v1.97 =
* 2023/01/10
* minor GUI changes
* new prices

= v1.96 =
* 2022/11/18
* security fixes

= v1.95 =
* 2022/01/06
* security fixes
* fixed a CLI bug
* added ad for our WP Force SSL plugin

= v1.93 =
* 2021/08/01
* reactivate plugins fix

= v1.92 =
* 2021/07/28
* more fixes for the password issue when resetting on WP 5.8

= v1.91 =
* 2021/07/24
* fixed password issue when resetting on WP 5.8

= v1.90 =
* 2021/06/01
* security fixes
* cleaned up unused code

= v1.86 =
* 2021/02/20
* fixed a small but nasty translation bug that prevented some users from resetting

= v1.85 =
* 2021/01/30
* code clean-up

= v1.84 =
* 2021/01/21
* added quick links button
* fixed some tooltips
* removed support for WP Webhooks

= v1.82 =
* 2020/10/27
* removed auto activation for PRO version

= v1.81 =
* 2020/10/07
* started adding better tooltips to all objects
* added promo campaign for WP 301 Redirects

= v1.80 =
* 2020/04/17
* new tool: Purge Cache
* new tool: Delete Local Data
* fixed "Delete all plugins" tool
* other minor bug fixes
* started selling WP Reset PRO
* 200,000 installs hit on 2020-03-07 with 1,560,000 downloads


= v1.77 =
* 2019/12/25
* minor bug fixes

= v1.75 =
* 2019/11/12
* bug fixes
* more GUI improvements
* updates for WP v5.3
* removed the 1-click backup tool in favor of snapshots - less confusing & same end result
* two huge bug fixes thanks to @markwill
* 1,241,470 downloads

= v1.70 =
* 2019/09/27
* bug fixes
* completely new GUI
* added .htaccess file to protect snapshots and backups folder
* added 1-click backup feature

= v1.65 =
* 2019/07/15
* bug fixes

= v1.60 =
* 2019/04/15
* bug fixes
* new tool: Reset theme options
* added Product Hunt banner
* added actions (hooks) to all tools and snapshot actions; all action names start with "wp-reset-"
* removed features survey
* announced plugin & theme collections

= v1.55 =
* 2019/03/25
* 100k users hit on 2019/01/15 with 560,300 downloads; 34 days for +10k & 71k downloads
* bug fixes
* support for WP Webhooks
* added features survey

= v1.50 =
* 2019/01/08
* new tool: delete .htaccess file
* new WP-CLI command: wp reset delete htaccess
* 90k users hit on 2018/12/12 with 489,100 downloads; 27 days for +10k & 58k downloads

= v1.45 =
* 2018/11/27
* new tool: truncate or drop custom DB tables
* truncate / drop tables tool added to WP-CLI
* all snapshot tools added to WP-CLI
* 80k users hit on 2018/11/15 with 430,800 downloads; 30 days for +10k & 57k downloads

= v1.40 =
* 2018/10/24
* new tool: DB Snapshots
* rewrote code documentation for most functions
* some parts of Snapshots need refactoring
* 70k users hit on 2018/10/16 with 373,300 downloads; 30 days for +10k & 50k downloads

= v1.35 =
* 2018/09/18
* sponsorship by IP Geolocation
* 60k users hit on 2018/09/16 with 323,300 downloads; 35 days for +10k
* added all tools to WP-CLI
* new tool: delete all files in uploads folder

= v1.30 =
* 2018/08/27
* more code clean-up
* added new reset params to WP-CLI
* big GUI changes
* started adding various tools; delete transients, delete all plugins, delete all themes
* we hit 50,000 installations on 2018/08/11 with 274,000 downloads

= v1.25 =
* 2018/07/30
* code clean-up
* post-reset options - reactivate plugin, themes & WP Reset
* added WP-MU warning till we make WP Reset fully compatible with it
* Tidy Repo notice
* added option to collapse boxes
* modified rating notice

= v1.20 =
* 2018/07/09
* we hit 40k installations on 2018/06/26
* WP-CLI support via "wp reset" command
* new logo
* ask for rating notice
* GUI improvements
* code clean up
* preparations for further development and new features

= v1.10 =
* 2018/05/09
* WebFactory took over development
* numerous bug fixes and improvements
* 30,000 installations; 199,000 downloads

= v1.0 =
* 2016/05/16
* Initial release

== Frequently Asked Questions ==

= Does WP Reset make backups? =

Automatically no, it does not. But we have "download backup" links besides every tool in the plugin so make sure you download a backup before running them. Backups only contain the database, no files!

= How can I log in after resetting? =

Use the same username and password you used while doing the reset. Only one user will be restored after resetting. The one you used at that time.

= Will any files be deleted or modified when I reset the site? =

No. All files are left untouched if you do a full reset. However, there are tool like "delete themes" that do delete files.

= Will I have to reconfigure wp-config.php? =

Absolutely not. No reconfiguration is needed. No files are modified.

= Do you support WP-CLI? =

We sure do! Just type "wp reset" in your shell to see the list of available commands and options.

= How long does it take for the reset operation to complete? =

On most installations a second or two. If you have a huge amounts of data in tables then up to ten seconds.

= How can I report security bugs? =

You can report security bugs through the Patchstack Vulnerability Disclosure Program. The Patchstack team help validate, triage and handle any security vulnerabilities. [Report a security vulnerability.](https://patchstack.com/database/vdp/wp-reset)
PK!j�c�R�Rwp-reset.phpnu�[���<?php
/*
  Plugin Name: WP Reset
  Plugin URI: https://wpreset.com/
  Description: Reset the entire site or just selected parts while reserving the option to undo by using snapshots.
  Version: 2.03
  Requires at least: 4.0
  Requires PHP: 5.2
  Tested up to: 6.6
  Author: WebFactory Ltd
  Author URI: https://www.webfactoryltd.com/
  Text Domain: wp-reset

  Copyright 2015 - 2024  WebFactory Ltd  (email: wpreset@webfactoryltd.com)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License, version 2, as
  published by the Free Software Foundation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

// include only file
if (!defined('ABSPATH')) {
  die('Do not open this file directly.');
}


define('WP_RESET_FILE', __FILE__);

require_once dirname(__FILE__) . '/wp-reset-utility.php';
require_once dirname(__FILE__) . '/wp-reset-licensing.php';

require_once dirname(__FILE__) . '/wf-flyout/wf-flyout.php';
new wf_flyout(__FILE__);

// load WP-CLI commands, if needed
if (defined('WP_CLI') && WP_CLI) {
  require_once dirname(__FILE__) . '/wp-reset-cli.php';
}


class WP_Reset
{
  protected static $instance = null;
  public $version = 0;
  public $plugin_url = '';
  public $plugin_dir = '';
  public $snapshots_folder = 'wp-reset-snapshots-export';
  protected $options = array();
  private $delete_count = 0;
  private $licensing_servers = array('https://dashboard.wpreset.com/api/');
  public $core_tables = array('commentmeta', 'comments', 'links', 'options', 'postmeta', 'posts', 'term_relationships', 'term_taxonomy', 'termmeta', 'terms', 'usermeta', 'users');
  private $license = null;


  /**
   * Creates a new WP_Reset object and implements singleton
   *
   * @return WP_Reset
   */
  static function getInstance()
  {
    if (!is_a(self::$instance, 'WP_Reset')) {
      self::$instance = new WP_Reset();
    }

    return self::$instance;
  } // getInstance


  /**
   * Initialize properties, hook to filters and actions
   *
   * @return null
   */
  private function __construct()
  {
    $this->version = $this->get_plugin_version();
    $this->plugin_dir = plugin_dir_path(__FILE__);
    $this->plugin_url = plugin_dir_url(__FILE__);
    $this->load_options();

    $this->license = new WF_Licensing(array(
      'prefix' => 'wpr',
      'licensing_servers' => $this->licensing_servers,
      'version' => $this->version,
      'plugin_file' => __FILE__,
      'plugin_page' => 'tools_page_wp-reset',
      'skip_hooks' => false,
      'debug' => false,
      'js_folder' => plugin_dir_url(__FILE__) . '/js/'
    ));

    add_action('admin_menu', array($this, 'admin_menu'));
    add_action('admin_init', array($this, 'do_all_actions'));
    add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
    add_action('admin_action_wpr_dismiss_notice', array($this, 'action_dismiss_notice'));
    add_action('wp_ajax_wp_reset_dismiss_notice', array($this, 'ajax_dismiss_notice'));
    add_action('wp_ajax_wp_reset_run_tool', array($this, 'ajax_run_tool'));
    add_action('admin_print_scripts', array($this, 'remove_admin_notices'));
    add_action('admin_action_wpr_install_wpfssl', array($this, 'install_wpfssl'));

    add_filter('plugin_action_links_' . plugin_basename(__FILE__), array($this, 'plugin_action_links'));
    add_filter('plugin_row_meta', array($this, 'plugin_meta_links'), 10, 2);
    add_filter('admin_footer_text', array($this, 'admin_footer_text'));

    $this->core_tables = array_map(function ($tbl) {
      global $wpdb;
      return $wpdb->prefix . $tbl;
    }, $this->core_tables);
  } // __construct


  /**
   * Get plugin version from file header
   *
   * @return string
   */
  function get_plugin_version()
  {
    $plugin_data = get_file_data(__FILE__, array('version' => 'Version'), 'plugin');

    return $plugin_data['version'];
  } // get_plugin_version


  /**
   * Load and prepare the options array
   * If needed create a new DB entry
   *
   * @return array
   */
  private function load_options()
  {
    $options = get_option('wp-reset', array());
    $change = false;

    if (!isset($options['meta'])) {
      $options['meta'] = array('first_version' => $this->version, 'first_install' => current_time('timestamp', true), 'reset_count' => 0);
      $change = true;
    }
    if (!isset($options['dismissed_notices'])) {
      $options['dismissed_notices'] = array();
      $change = true;
    }
    if (!isset($options['last_run'])) {
      $options['last_run'] = array();
      $change = true;
    }
    if (!isset($options['options'])) {
      $options['options'] = array();
      $change = true;
    }
    if ($change) {
      update_option('wp-reset', $options, true);
    }

    $this->options = $options;
    return $options;
  } // load_options


  /**
   * Get meta part of plugin options
   *
   * @return array
   */
  function get_meta()
  {
    return $this->options['meta'];
  } // get_meta


  /**
   * Get all dismissed notices, or check for one specific notice
   *
   * @param string  $notice_name  Optional. Check if specified notice is dismissed.
   *
   * @return bool|array
   */
  function get_dismissed_notices($notice_name = '')
  {
    $notices = $this->options['dismissed_notices'];

    if (empty($notice_name)) {
      return $notices;
    } else {
      if (empty($notices[$notice_name])) {
        return false;
      } else {
        return true;
      }
    }
  } // get_dismissed_notices


  /**
   * Get options part of plugin options
   *
   * @param string  $key  Optional.
   *
   * @return array
   */
  function get_options()
  {
    return $this->options['options'];
  } // get_options


  /**
   * Update specified plugin options key
   *
   * @param string  $key   Data to save.
   * @param string  $data  Option key.
   *
   * @return bool
   */
  function update_options($key, $data)
  {
    if (false === in_array($key, array('meta', 'license', 'dismissed_notices', 'options'))) {
      user_error('Unknown options key.', E_USER_ERROR);
      return false;
    }

    $this->options[$key] = $data;
    $tmp = update_option('wp-reset', $this->options);

    return $tmp;
  } // update_options


  /**
   * Add plugin menu entry under Tools menu
   *
   * @return null
   */
  function admin_menu()
  {
    add_management_page(__('WP Reset', 'wp-reset'), __('WP Reset', 'wp-reset'), 'administrator', 'wp-reset', array($this, 'plugin_page'));
  } // admin_menu


  /**
   * Dismiss notice via AJAX call
   *
   * @return null
   */
  function ajax_dismiss_notice()
  {
    check_ajax_referer('wp-reset_dismiss_notice');

    if (!current_user_can('manage_options')) {
      wp_send_json_error(__('You are not allowed to run this action.', 'wp-reset'));
    }

    $notice_name = trim(sanitize_text_field(@$_GET['notice_name']));
    if (!$this->dismiss_notice($notice_name)) {
      wp_send_json_error(__('Notice is already dismissed.', 'wp-reset'));
    } else {
      wp_send_json_success();
    }
  } // ajax_dismiss_notice


  /**
   * Dismiss notice via admin action
   *
   * @return null
   */
  function action_dismiss_notice()
  {
    if (false == wp_verify_nonce(sanitize_text_field(@$_GET['_wpnonce']), 'wpr_dismiss_notice')) {
      wp_die('Please reload the page and try again.');
    }

    if (empty($_GET['notice'])) {
      wp_safe_redirect(admin_url());
      exit;
    }

    $notice_name = trim(sanitize_text_field(@$_GET['notice']));
    $this->dismiss_notice($notice_name);

    if (!empty($_GET['redirect'])) {
      wp_safe_redirect($_GET['redirect']);
    } else {
      wp_safe_redirect(admin_url());
    }

    exit;
  } // action_dismiss_notice


  /**
   * Dismiss notice by adding it to dismissed_notices options array
   *
   * @param string  $notice_name  Notice to dismiss.
   *
   * @return bool
   */
  function dismiss_notice($notice_name)
  {
    if ($this->get_dismissed_notices($notice_name)) {
      return false;
    } else {
      $notices = $this->get_dismissed_notices();
      $notices[$notice_name] = true;
      $this->update_options('dismissed_notices', $notices);
      return true;
    }
  } // dismiss_notice


  /**
   * Returns all WP pointers
   *
   * @return array
   */
  function get_pointers()
  {
    $pointers = array();

    $pointers['welcome'] = array('target' => '#menu-tools', 'edge' => 'left', 'align' => 'right', 'content' => 'Thank you for installing the <b style="font-weight: 800;">WP Reset</b> plugin!<br>Open <a href="' . esc_url(admin_url('tools.php?page=wp-reset')) . '">Tools - WP Reset</a> to access resetting tools and start developing &amp; debugging faster.');

    return $pointers;
  } // get_pointers


  /**
   * Enqueue CSS and JS files
   *
   * @return null
   */
  function admin_enqueue_scripts($hook)
  {
    // welcome pointer is shown on all pages except WPR to admins, until dismissed
    $pointers = $this->get_pointers();
    $dismissed_notices = $this->get_dismissed_notices();

    foreach ($dismissed_notices as $notice_name => $tmp) {
      if ($tmp) {
        unset($pointers[$notice_name]);
      }
    } // foreach

    if (!empty($pointers) && !$this->is_plugin_page() && current_user_can('manage_options')) {
      $pointers['_nonce_dismiss_pointer'] = wp_create_nonce('wp-reset_dismiss_notice');

      wp_enqueue_style('wp-pointer');

      wp_enqueue_script('wp-reset-pointers', $this->plugin_url . 'js/wp-reset-pointers.js', array('jquery'), $this->version, true);
      wp_enqueue_script('wp-pointer');
      wp_localize_script('wp-pointer', 'wp_reset_pointers', $pointers);
    }

    // exit early if not on WP Reset page
    if (!$this->is_plugin_page()) {
      return;
    }

    $js_localize = array(
      'undocumented_error' => __('An undocumented error has occurred. Please refresh the page and try again.', 'wp-reset'),
      'documented_error' => __('An error has occurred.', 'wp-reset'),
      'plugin_name' => __('WP Reset', 'wp-reset'),
      'settings_url' => admin_url('tools.php?page=wp-reset'),
      'wpfssl_install_url' => add_query_arg(array('action' => 'wpr_install_wpfssl', '_wpnonce' => wp_create_nonce('install_wpfssl'), 'rnd' => rand()), admin_url('admin.php')),
      'icon_url' => $this->plugin_url . 'img/wp-reset-icon.png',
      'invalid_confirmation' => __('Please type "reset" in the confirmation field.', 'wp-reset'),
      'invalid_confirmation_title' => __('Invalid confirmation', 'wp-reset'),
      'cancel_button' => __('Cancel', 'wp-reset'),
      'ok_button' => __('OK', 'wp-reset'),
      'confirm_button' => __('Reset WordPress', 'wp-reset'),
      'confirm_title' => __('Are you sure you want to proceed?', 'wp-reset'),
      'confirm_title_reset' => __('Are you sure you want to reset the site?', 'wp-reset'),
      'confirm1' => __('Clicking "Reset WordPress" will reset your site to default values. All content will be lost. Always <a href="#" class="create-new-snapshot" data-description="Before resetting the site">create a snapshot</a> if you want to be able to undo.</b>', 'wp-reset'),
      'confirm2' => __('Click "Cancel" to abort.', 'wp-reset'),
      'doing_reset' => __('Resetting in progress. Please wait.', 'wp-reset'),
      'snapshot_success' => __('Snapshot created', 'wp-reset'),
      'snapshot_wait' => __('Creating snapshot. Please wait.', 'wp-reset'),
      'snapshot_confirm' => __('Create snapshot', 'wp-reset'),
      'snapshot_placeholder' => __('Snapshot name or brief description, ie: before plugin install', 'wp-reset'),
      'snapshot_text' => __('Enter snapshot name or brief description', 'wp-reset'),
      'snapshot_title' => __('Create a new snapshot', 'wp-reset'),
      'nonce_dismiss_notice' => wp_create_nonce('wp-reset_dismiss_notice'),
      'activating' => __('Activating', 'wp-reset'),
      'deactivating' => __('Deactivating', 'wp-reset'),
      'deleting' => __('Deleting', 'wp-reset'),
      'installing' => __('Installing', 'wp-reset'),
      'activate_failed' => __('Could not activate', 'wp-reset'),
      'deactivate_failed' => __('Could not deactivate', 'wp-reset'),
      'delete_failed' => __('Could not delete', 'wp-reset'),
      'install_failed' => __('Could not install', 'wp-reset'),
      'install_failed_existing' => __('is already installed', 'wp-reset'),
      'nonce_run_tool' => wp_create_nonce('wp-reset_run_tool'),
      'nonce_do_reset' => wp_create_nonce('wp-reset_do_reset'),
    );

    wp_enqueue_style('plugin-install');
    wp_enqueue_style('wp-jquery-ui-dialog');
    wp_enqueue_style('wp-reset', $this->plugin_url . 'css/wp-reset.css', array(), $this->version);
    wp_enqueue_style('wp-reset-sweetalert2', $this->plugin_url . 'css/sweetalert2.min.css', array(), $this->version);
    wp_enqueue_style('wp-reset-tooltipster', $this->plugin_url . 'css/tooltipster.bundle.min.css', array(), $this->version);

    wp_enqueue_script('plugin-install');
    wp_enqueue_script('jquery-ui-tabs');
    wp_enqueue_script('jquery-ui-dialog');
    wp_enqueue_script('wp-reset-sweetalert2', $this->plugin_url . 'js/wp-reset-libs.min.js', array('jquery'), $this->version, true);
    wp_enqueue_script('wp-reset', $this->plugin_url . 'js/wp-reset.js', array('jquery'), $this->version, true);
    wp_localize_script('wp-reset', 'wp_reset', $js_localize);

    add_thickbox();

    // fix for aggressive plugins that include their CSS on all pages
    wp_dequeue_style('uiStyleSheet');
    wp_dequeue_style('wpcufpnAdmin');
    wp_dequeue_style('unifStyleSheet');
    wp_dequeue_style('wpcufpn_codemirror');
    wp_dequeue_style('wpcufpn_codemirrorTheme');
    wp_dequeue_style('collapse-admin-css');
    wp_dequeue_style('jquery-ui-css');
    wp_dequeue_style('tribe-common-admin');
    wp_dequeue_style('file-manager__jquery-ui-css');
    wp_dequeue_style('file-manager__jquery-ui-css-theme');
    wp_dequeue_style('wpmegmaps-jqueryui');
    wp_dequeue_style('wp-botwatch-css');
    wp_dequeue_style('uap_main_admin_style');
    wp_dequeue_style('uap_font_awesome');
    wp_dequeue_style('uap_jquery-ui.min.css');
  } // admin_enqueue_scripts


  /**
   * Remove all WP notices on WPR page
   *
   * @return null
   */
  function remove_admin_notices()
  {
    if (!$this->is_plugin_page()) {
      return false;
    }

    global $wp_filter;
    unset($wp_filter['user_admin_notices'], $wp_filter['admin_notices']);
  } // remove_admin_notices


  /**
   * Check if WP-CLI is available and running
   *
   * @return bool
   */
  static function is_cli_running()
  {
    if (!is_null($value = apply_filters('wp-reset-override-is-cli-running', null))) {
      return (bool) $value;
    }

    if (defined('WP_CLI') && WP_CLI) {
      return true;
    } else {
      return false;
    }
  } // is_cli_running


  /**
   * Check if given plugin is installed
   *
   * @param [string] $slug Plugin slug
   * @return boolean
   */
  function is_plugin_installed($slug)
  {
    if (!function_exists('get_plugins')) {
      require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    $all_plugins = get_plugins();

    if (!empty($all_plugins[$slug])) {
      return true;
    } else {
      return false;
    }
  } // is_plugin_installed


  /**
   * Deletes all transients.
   *
   * @return int  Number of deleted transient DB entries
   */
  function do_delete_transients()
  {
    global $wpdb;

    $count = $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '\_transient\_%' OR option_name LIKE '\_site\_transient\_%'");

    wp_cache_flush();

    do_action('wp_reset_delete_transients', $count);

    return $count;
  } // do_delete_transients


  /**
   * Purge all cache for popular caching plugins
   *
   * @return bool true
   */
  function do_purge_cache()
  {
    global $wp_reset;

    wp_cache_flush();
    $wp_reset->do_delete_transients();

    if (function_exists('w3tc_flush_all')) {
      w3tc_flush_all();
    }
    if (function_exists('wp_cache_clear_cache')) {
      wp_cache_clear_cache();
    }
    if (method_exists('LiteSpeed_Cache_API', 'purge_all')) {
      LiteSpeed_Cache_API::purge_all();
    }
    if (class_exists('Endurance_Page_Cache')) {
      $epc = new Endurance_Page_Cache;
      $epc->purge_all();
    }
    if (class_exists('SG_CachePress_Supercacher') && method_exists('SG_CachePress_Supercacher', 'purge_cache')) {
      SG_CachePress_Supercacher::purge_cache(true);
    }
    if (class_exists('SiteGround_Optimizer\Supercacher\Supercacher')) {
      SiteGround_Optimizer\Supercacher\Supercacher::purge_cache();
    }
    if (isset($GLOBALS['wp_fastest_cache']) && method_exists($GLOBALS['wp_fastest_cache'], 'deleteCache')) {
      $GLOBALS['wp_fastest_cache']->deleteCache(true);
    }
    if (is_callable(array('Swift_Performance_Cache', 'clear_all_cache'))) {
      Swift_Performance_Cache::clear_all_cache();
    }
    if (is_callable(array('Hummingbird\WP_Hummingbird', 'flush_cache'))) {
      Hummingbird\WP_Hummingbird::flush_cache(true, false);
    }

    do_action('wp_reset_purge_cache');

    return true;
  } // do_purge_cache


  /**
   * Resets all theme options (mods).
   *
   * @param bool $all_themes Delete mods for all themes or just the current one
   *
   * @return int  Number of deleted mod DB entries
   */
  function do_reset_theme_options($all_themes = true)
  {
    global $wpdb;

    $query = $wpdb->prepare("DELETE FROM $wpdb->options WHERE option_name LIKE %s OR option_name LIKE %s", array('mods\_%', 'theme_mods\_%'));
    $count = $wpdb->query($query);

    do_action('wp_reset_reset_theme_options', $count);

    return $count;
  } // do_reset_theme_options


  /**
   * Deletes all files in uploads folder.
   *
   * @return int  Number of deleted files and folders.
   */
  function do_delete_uploads()
  {
    $upload_dir = wp_get_upload_dir();
    $this->delete_count = 0;

    $this->delete_folder($upload_dir['basedir'], $upload_dir['basedir']);

    do_action('wp_reset_delete_uploads', $this->delete_count);

    return $this->delete_count;
  } // do_delete_uploads


  /**
   * Recursively deletes a folder
   *
   * @param string $folder  Recursive param.
   * @param string $base_folder  Base folder.
   *
   * @return bool
   */
  private function delete_folder($folder, $base_folder)
  {
    $files = array_diff(scandir($folder), array('.', '..'));

    foreach ($files as $file) {
      if (is_dir($folder . DIRECTORY_SEPARATOR . $file)) {
        $this->delete_folder($folder . DIRECTORY_SEPARATOR . $file, $base_folder);
      } else {
        $tmp = @unlink($folder . DIRECTORY_SEPARATOR . $file);
        $this->delete_count = $this->delete_count + (int) $tmp;
      }
    } // foreach

    if ($folder != $base_folder) {
      $tmp = @rmdir($folder);
      $this->delete_count = $this->delete_count + (int) $tmp;
      return $tmp;
    } else {
      return true;
    }
  } // delete_folder


  /**
   * Deactivate all plugins
   *
   * @param array  keep_wp_reset - Keep WP Reset active and installed, silent_deactivate - Skip individual plugin deactivation functions when deactivating
   *
   * @return int  Number of deactivated plugins.
   */
  function do_deactivate_plugins($params = array())
  {
    if (!function_exists('get_plugins')) {
      require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    if (!function_exists('request_filesystem_credentials')) {
      require_once ABSPATH . 'wp-admin/includes/file.php';
    }

    $wp_reset_basename = plugin_basename(WP_RESET_FILE);
    $params = shortcode_atts(array('keep_wp_reset' => true, 'silent_deactivate' => false), (array) $params);

    $active_plugins = (array) get_option('active_plugins', array());
    if ($params['keep_wp_reset']) {
      if (($key = array_search($wp_reset_basename, $active_plugins)) !== false) {
        unset($active_plugins[$key]);
      }
    }

    if (!empty($active_plugins)) {
      deactivate_plugins($active_plugins, $params['silent_deactivate'], false);
    }

    do_action('wp_reset_deactivate_plugins', $active_plugins, $params);

    return sizeof($active_plugins);
  } // do_deactivate_plugins


  /**
   * Delete all plugins
   *
   * @param array  keep_wp_reset - Keep WP Reset active and installed
   *
   * @return int  Number of deleted plugins.
   */
  function do_delete_plugins($params = array())
  {
    if (!function_exists('get_plugins')) {
      require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    if (!function_exists('request_filesystem_credentials')) {
      require_once ABSPATH . 'wp-admin/includes/file.php';
    }

    $wp_reset_basename = plugin_basename(WP_RESET_FILE);
    $params = shortcode_atts(array('keep_wp_reset' => true), (array) $params);

    $all_plugins = get_plugins();
    if ($params['keep_wp_reset']) {
      unset($all_plugins[$wp_reset_basename]);
    }

    if (!empty($all_plugins)) {
      delete_plugins(array_keys($all_plugins));
    }

    do_action('wp_reset_delete_plugins', $all_plugins, $params);

    return sizeof($all_plugins);
  } // do_delete_plugins


  /**
   * Delete all themes
   *
   * @param bool  $keep_default_theme  Keep default theme
   *
   * @return int  Number of deleted themes.
   */
  function do_delete_themes($keep_default_theme = true)
  {
    global $wp_version;

    if (!function_exists('delete_theme')) {
      require_once ABSPATH . 'wp-admin/includes/theme.php';
    }

    if (!function_exists('request_filesystem_credentials')) {
      require_once ABSPATH . 'wp-admin/includes/file.php';
    }

    if (version_compare($wp_version, '5.0', '<') === true) {
      $default_theme = 'twentyseventeen';
    } else {
      $default_theme = 'twentytwentyone';
    }

    $all_themes = wp_get_themes(array('errors' => null));

    if (true == $keep_default_theme) {
      unset($all_themes[$default_theme]);
    }

    foreach ($all_themes as $theme_slug => $theme_details) {
      $res = delete_theme($theme_slug);
    }

    if (false == $keep_default_theme) {
      update_option('template', '');
      update_option('stylesheet', '');
      update_option('current_theme', '');
    }

    do_action('wp_reset_delete_themes', $all_themes);

    return sizeof($all_themes);
  } // do_delete_themes


  /**
   * Truncate custom tables
   *
   * @return int  Number of truncated tables.
   */
  function do_truncate_custom_tables()
  {
    global $wpdb;
    $custom_tables = $this->get_custom_tables();

    foreach ($custom_tables as $tbl) {
      $wpdb->wpreset_custom_table = $tbl['name'];
      $wpdb->query('SET foreign_key_checks = 0');
      $wpdb->query("TRUNCATE TABLE " . $wpdb->wpreset_custom_table);
    } // foreach

    do_action('wp_reset_truncate_custom_tables', $custom_tables);

    return sizeof($custom_tables);
  } // do_truncate_custom_tables


  /**
   * Drop custom tables
   *
   * @return int  Number of dropped tables.
   */
  function do_drop_custom_tables()
  {
    global $wpdb;
    $custom_tables = $this->get_custom_tables();

    foreach ($custom_tables as $tbl) {
      $wpdb->wpreset_custom_table = $tbl['name'];
      $wpdb->query('SET foreign_key_checks = 0');
      $wpdb->query("DROP TABLE IF EXISTS " . $wpdb->wpreset_custom_table);
    } // foreach

    do_action('wp_reset_drop_custom_tables', $custom_tables);

    return sizeof($custom_tables);
  } // do_drop_custom_tables


  /**
   * Delete .htaccess file
   *
   * @return bool|WP_Error Action status.
   */
  function do_delete_htaccess()
  {
    global $wp_filesystem;

    if (empty($wp_filesystem)) {
      require_once ABSPATH . '/wp-admin/includes/file.php';
      WP_Filesystem();
    }

    $htaccess_path = $this->get_htaccess_path();
    clearstatcache();

    do_action('wp_reset_delete_htaccess', $htaccess_path);

    if (!$wp_filesystem->is_readable($htaccess_path)) {
      return new WP_Error(1, 'Htaccess file does not exist; there\'s nothing to delete.');
    }

    if (!$wp_filesystem->is_writable($htaccess_path)) {
      return new WP_Error(1, 'Htaccess file is not writable.');
    }

    if ($wp_filesystem->delete($htaccess_path, false, 'f')) {
      return true;
    } else {
      return new WP_Error(1, 'Unknown error. Unable to delete htaccess file.');
    }
  } // do_delete_htaccess


  /**
   * Get .htaccess file path.
   *
   * @return string
   */
  function get_htaccess_path()
  {
    if (!function_exists('get_home_path')) {
      require_once ABSPATH . 'wp-admin/includes/file.php';
    }

    if ($this->is_cli_running()) {
      $_SERVER['SCRIPT_FILENAME'] = ABSPATH;
    }

    $filepath = get_home_path() . '.htaccess';

    return $filepath;
  } // get_htaccess_path


  /**
   * Run one tool via AJAX call
   *
   * @return null
   */
  function ajax_run_tool()
  {
    check_ajax_referer('wp-reset_run_tool');

    if (!current_user_can('manage_options')) {
      wp_send_json_error(__('You are not allowed to run this action.', 'wp-reset'));
    }

    $tool = trim(sanitize_text_field(@$_GET['tool']));
    $extra_data = trim(sanitize_text_field(@$_GET['extra_data']));

    if ($tool == 'delete_transients') {
      $cnt = $this->do_delete_transients();
      wp_send_json_success($cnt);
    } elseif ($tool == 'reset_theme_options') {
      $cnt = $this->do_reset_theme_options(true);
      wp_send_json_success($cnt);
    } elseif ($tool == 'purge_cache') {
      $this->do_purge_cache();
      wp_send_json_success();
    } elseif ($tool == 'delete_wp_cookies') {
      wp_clear_auth_cookie();
      wp_send_json_success();
    } elseif ($tool == 'delete_themes') {
      $cnt = $this->do_delete_themes(false);
      wp_send_json_success($cnt);
    } elseif ($tool == 'deactivate_plugins') {
      $cnt = $this->do_deactivate_plugins($extra_data);
      wp_send_json_success($cnt);
    } elseif ($tool == 'delete_plugins') {
      $cnt = $this->do_delete_plugins($extra_data);
      wp_send_json_success($cnt);
    } elseif ($tool == 'delete_uploads') {
      $cnt = $this->do_delete_uploads();
      wp_send_json_success($cnt);
    } elseif ($tool == 'delete_htaccess') {
      $tmp = $this->do_delete_htaccess();
      if (is_wp_error($tmp)) {
        wp_send_json_error($tmp->get_error_message());
      } else {
        wp_send_json_success($tmp);
      }
    } elseif ($tool == 'drop_custom_tables') {
      $cnt = $this->do_drop_custom_tables();
      wp_send_json_success($cnt);
    } elseif ($tool == 'truncate_custom_tables') {
      $cnt = $this->do_truncate_custom_tables();
      wp_send_json_success($cnt);
    } elseif ($tool == 'delete_snapshot') {
      $res = $this->do_delete_snapshot($extra_data);
      if (is_wp_error($res)) {
        wp_send_json_error($res->get_error_message());
      } else {
        wp_send_json_success();
      }
    } elseif ($tool == 'download_snapshot') {
      $res = $this->do_export_snapshot($extra_data);
      if (is_wp_error($res)) {
        wp_send_json_error($res->get_error_message());
      } else {
        $url = content_url() . '/' . $this->snapshots_folder . '/' . $res;
        wp_send_json_success($url);
      }
    } elseif ($tool == 'restore_snapshot') {
      $res = $this->do_restore_snapshot($extra_data);
      if (is_wp_error($res)) {
        wp_send_json_error($res->get_error_message());
      } else {
        wp_send_json_success();
      }
    } elseif ($tool == 'compare_snapshots') {
      $res = $this->do_compare_snapshots($extra_data);
      if (is_wp_error($res)) {
        wp_send_json_error($res->get_error_message());
      } else {
        wp_send_json_success($res);
      }
    } elseif ($tool == 'create_snapshot') {
      $res = $this->do_create_snapshot($extra_data);
      if (is_wp_error($res)) {
        wp_send_json_error($res->get_error_message());
      } else {
        wp_send_json_success();
      }
    } elseif ($tool == 'get_table_details') {
      $res = WP_Reset_Utility::get_table_details();
      wp_send_json_success($res);
    } elseif (
      $tool == 'check_deactivate_plugin' ||
      $tool == 'check_delete_plugin' ||
      $tool == 'check_install_plugin' ||
      $tool == 'check_activate_plugin'
    ) {
      $path = $this->get_plugin_path(sanitize_text_field($_GET['slug']));

      if (false !== ($error = get_transient('wf_install_error_' . sanitize_text_field($_GET['slug'])))) {
        delete_transient('wf_install_error_' . sanitize_text_field($_GET['slug']));
        wp_send_json_success($error);
      }

      if (false !== $path) {
        $active_plugins = (array) get_option('active_plugins', array());
        if (false !== array_search($path, $active_plugins)) {
          wp_send_json_success('active');
        } else {
          wp_send_json_success('inactive');
        }
      } else {
        wp_send_json_success('deleted');
      }
    } elseif ($tool == 'install_plugin') {
      $slug = sanitize_text_field($_GET['slug']);

      @include_once ABSPATH . 'wp-admin/includes/plugin.php';
      @include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
      @include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
      @include_once ABSPATH . 'wp-admin/includes/file.php';
      @include_once ABSPATH . 'wp-admin/includes/misc.php';

      wp_cache_flush();

      $path = $this->get_plugin_path($slug);

      if (false !== $path) {
        // Plugin is already installed
        wp_send_json_success();
      } else {
        // Install Plugin
        $skin      = new WP_Ajax_Upgrader_Skin();
        $upgrader = new Plugin_Upgrader($skin);
        $upgrader->install('https://downloads.wordpress.org/plugin/' . $slug . '.latest-stable.zip');
        wp_send_json_success();
      }
    } elseif ($tool == 'activate_plugin') {
      $path = $this->get_plugin_path(sanitize_text_field($_GET['slug']));
      activate_plugin($path);
      wp_send_json_success();
    } elseif ($tool == 'before_reset') {
      $active_plugins = get_option('active_plugins');
      set_transient('wpr_active_plugins', $active_plugins, 100);
      remove_all_actions('update_option_active_plugins');
      update_option('active_plugins', array(plugin_basename(__FILE__)));
      wp_send_json_success();
    } else {
      wp_send_json_error(__('Unknown tool.', 'wp-reset'));
    }
  } // ajax_run_tool


  /**
   * Get plugin path from slug
   *
   * @return string path
   */
  function get_plugin_path($slug)
  {
    $all_plugins = get_plugins();
    foreach ($all_plugins as $plugin_path => $plugin) {
      if (strpos($plugin_path, $slug . '/') === 0) {
        return $plugin_path;
      }
    }
    return false;
  } // get_plugin_path


  /**
   * Reinstall / reset the WP site
   * There are no failsafes in the function - it reinstalls when called
   * Redirects when done
   *
   * @param array  $params  Optional.
   *
   * @return null
   */
  function do_reinstall($params = array())
  {
    global $current_user, $wpdb;

    // only admins can reset; double-check
    if (!$this->is_cli_running() && !current_user_can('manage_options')) {
      return false;
    }

    // make sure the function is available to us
    if (!function_exists('wp_install')) {
      require ABSPATH . '/wp-admin/includes/upgrade.php';
    }

    // save values that need to be restored after reset
    $blogname = get_option('blogname');
    $blog_public = get_option('blog_public');
    $wplang = get_option('wplang');
    $siteurl = get_option('siteurl');
    $home = get_option('home');
    $snapshots = $this->get_snapshots();

    $active_plugins = get_transient('wpr_active_plugins');
    $active_theme = wp_get_theme();

    // for WP-CLI
    if (!$current_user->ID) {
      $tmp = get_users(array('role' => 'administrator', 'order' => 'ASC', 'order_by' => 'ID'));
      if (empty($tmp[0]->user_login)) {
        return new WP_Error(1, 'Reset failed. Unable to find any admin users in database.');
      }
      $current_user = $tmp[0];
    }

    // delete custom tables with WP's prefix
    $prefix = str_replace('_', '\_', $wpdb->prefix);
    $tables = $wpdb->get_col($wpdb->prepare("SHOW TABLES LIKE %s", array($prefix . '%')));

    foreach ($tables as $table) {
      $wpdb->wpreset_table = $table;
      $wpdb->query("DROP TABLE " . $wpdb->wpreset_table);
    }

    $old_user_pass = $current_user->user_pass;

    // suppress errors for WP_CLI
    $result = @wp_install($blogname, $current_user->user_login, $current_user->user_email, $blog_public, '', md5(rand()), $wplang);
    $user_id = $result['user_id'];

    // restore user pass
    $query = $wpdb->prepare("UPDATE {$wpdb->users} SET user_pass = %s, user_activation_key = %s WHERE ID = %d LIMIT 1", array($old_user_pass, '', $user_id));
    $wpdb->query($query);
    $current_user->user_pass = $old_user_pass;

    // restore rest of the settings including WP Reset's
    update_option('siteurl', $siteurl);
    update_option('home', $home);
    update_option('wp-reset', $this->options);
    update_option('wp-reset-snapshots', $snapshots);

    // remove password nag
    if (get_user_meta($user_id, 'default_password_nag')) {
      update_user_meta($user_id, 'default_password_nag', false);
    }
    if (get_user_meta($user_id, $wpdb->prefix . 'default_password_nag')) {
      update_user_meta($user_id, $wpdb->prefix . 'default_password_nag', false);
    }

    $meta = $this->get_meta();
    $meta['reset_count']++;
    $this->update_options('meta', $meta);

    // reactivate theme
    if (!empty($params['reactivate_theme'])) {
      switch_theme($active_theme->get_stylesheet());
    }

    // reactivate WP Reset
    if (!empty($params['reactivate_wpreset'])) {
      activate_plugin(plugin_basename(__FILE__));
    }

    // reactivate all plugins
    if (!empty($params['reactivate_plugins'])) {
      foreach ($active_plugins as $plugin_file) {
        activate_plugin($plugin_file);
      }
    }

    if (!$this->is_cli_running()) {
      // log out and log in the old/new user
      // since the password doesn't change this is potentially unnecessary
      wp_clear_auth_cookie();
      wp_set_auth_cookie($user_id);

      wp_safe_redirect(admin_url() . '?wp-reset=success');
      exit;
    }
  } // do_reinstall


  /**
   * Checks wp_reset post value and performs all actions
   *
   * @return null|bool
   */
  function do_all_actions()
  {
    // only admins can perform actions
    if (!current_user_can('manage_options')) {
      return;
    }

    if (!empty($_GET['wp-reset']) && sanitize_text_field($_GET['wp-reset']) == 'success') {
      add_action('admin_notices', array($this, 'notice_successful_reset'));
    }

    // check nonce
    if (true === isset($_POST['wp_reset_confirm']) && false === wp_verify_nonce(sanitize_text_field(@$_POST['_wpnonce']), 'wp-reset')) {
      add_settings_error('wp-reset', 'bad-nonce', __('Something went wrong. Please refresh the page and try again.', 'wp-reset'), 'error');
      return false;
    }

    // check confirmation code
    if (true === isset($_POST['wp_reset_confirm']) && 'reset' !== sanitize_text_field($_POST['wp_reset_confirm'])) {
      add_settings_error('wp-reset', 'bad-confirm', __('<b>Invalid confirmation code.</b> Please type "reset" in the confirmation field.', 'wp-reset'), 'error');
      return false;
    }

    // only one action at the moment
    if (true === isset($_POST['wp_reset_confirm']) && 'reset' === sanitize_text_field($_POST['wp_reset_confirm'])) {
      $params = array(
        'reactivate_theme' => '0',
        'reactivate_plugins' => '0',
        'reactivate_wpreset' => '0',
      );
      if (isset($_POST['wpr-post-reset']['reactivate_theme'])) {
        $params['reactivate_theme'] = true;
      }
      if (isset($_POST['wpr-post-reset']['reactivate_plugins'])) {
        $params['reactivate_plugins'] = true;
      }
      if (isset($_POST['wpr-post-reset']['reactivate_wpreset'])) {
        $params['reactivate_wpreset'] = true;
      }

      $this->do_reinstall($params);
    }
  } // do_all_actions


  /**
   * Add "Open WP Reset Tools" action link to plugins table, left part
   *
   * @param array  $links  Initial list of links.
   *
   * @return array
   */
  function plugin_action_links($links)
  {
    $settings_link = '<a href="' . esc_url(admin_url('tools.php?page=wp-reset')) . '" title="' . esc_attr(__('Open WP Reset Tools', 'wp-reset')) . '">' . esc_html(__('Open WP Reset Tools', 'wp-reset')) . '</a>';

    array_unshift($links, $settings_link);

    return $links;
  } // plugin_action_links


  /**
   * Add links to plugin's description in plugins table
   *
   * @param array  $links  Initial list of links.
   * @param string $file   Basename of current plugin.
   *
   * @return array
   */
  function plugin_meta_links($links, $file)
  {
    if ($file !== plugin_basename(__FILE__)) {
      return $links;
    }

    $support_link = '<a target="_blank" href="https://wordpress.org/support/plugin/wp-reset" title="' . __('Get help', 'wp-reset') . '">' . __('Support', 'wp-reset') . '</a>';
    $home_link = '<a target="_blank" href="' . esc_url($this->generate_web_link('plugins-table-right')) . '" title="' . __('Plugin Homepage', 'wp-reset') . '">' . __('Plugin Homepage', 'wp-reset') . '</a>';
    $rate_link = '<a target="_blank" href="https://wordpress.org/support/plugin/wp-reset/reviews/#new-post" title="' . __('Rate the plugin', 'wp-reset') . '">' . __('Rate the plugin ★★★★★', 'wp-reset') . '</a>';

    $links[] = $support_link;
    $links[] = $home_link;
    $links[] = $rate_link;

    return $links;
  } // plugin_meta_links


  /**
   * Test if we're on WPR's admin page
   *
   * @return bool
   */
  function is_plugin_page()
  {
    $current_screen = get_current_screen();

    if (!empty($current_screen->id) && $current_screen->id == 'tools_page_wp-reset') {
      return true;
    } else {
      return false;
    }
  } // is_plugin_page


  /**
   * Add powered by text in admin footer
   *
   * @param string  $text  Default footer text.
   *
   * @return string
   */
  function admin_footer_text($text)
  {
    if (!$this->is_plugin_page()) {
      return $text;
    }

    $text = '<i><a href="' . esc_url($this->generate_web_link('admin_footer')) . '" title="' . esc_attr(__('Visit WP Reset page for more info', 'wp-reset')) . '" target="_blank">WP Reset</a> v' . $this->version . '. Please <a target="_blank" href="https://wordpress.org/support/plugin/wp-reset/reviews/#new-post" title="Rate the plugin">rate the plugin <span>★★★★★</span></a> to help us spread the word. Thank you from the WP Reset team!</i>';

    return $text;
  } // admin_footer_text


  /**
   * Loads plugin's translated strings
   *
   * @return null
   */
  function load_textdomain()
  {
    load_plugin_textdomain('wp-reset');
  } // load_textdomain


  /**
   * Inform the user that WordPress has been successfully reset
   *
   * @return null
   */
  function notice_successful_reset()
  {
    global $current_user;

    WP_Reset_Utility::wp_kses_wf('<div style="padding: 15px; display: inline-block; font-size: 14px;" id="message" class="updated"><p style="font-size: 14px;">' . sprintf(__('<b>Site has been successfully reset to default settings.</b><br>User "%s" was restored with the password unchanged. Open <a href="%s">WP Reset</a> to do another reset.', 'wp-reset'), esc_html($current_user->user_login), esc_url(admin_url('tools.php?page=wp-reset'))) . '</p>');

    if (false == $this->get_dismissed_notices('rate')) {
      $dismiss_url = add_query_arg(array('action' => 'wpr_dismiss_notice', 'notice' => 'rate', 'redirect' => urlencode($_SERVER['REQUEST_URI'])), admin_url('admin.php'));
      $dismiss_url = wp_nonce_url($dismiss_url, 'wpr_dismiss_notice');

      echo '<p style="font-size: 14px;">';
      echo 'If WP Reset helped you please rate it so we can continue supporting it and helping others. Thank you!<br>';
      echo '<a style="margin-top: 5px;" class="button button-secondary" href="https://wordpress.org/support/plugin/wp-reset/reviews/#new-post" target="_blank">You deserve it, I\'ll rate it!</a> &nbsp; &nbsp; <a href="' . esc_url($dismiss_url) . '">I already rated it</a>';
      echo '</p>';
    }

    echo '</div>';
  } // notice_successful_reset


  /**
   * Generate a button that initiates snapshot creation
   *
   * @param string  $tool_id  Tool ID.
   * @param string  $description  Snapshot description.
   *
   * @return string
   */
  function get_snapshot_button($tool_id = '', $description = '')
  {
    $out = '';
    $out .= '<a data-tool-id="' . esc_attr($tool_id) . '" data-description="' . esc_attr($description) . '" class="button create-new-snapshot" href="#">Create snapshot</a>';

    return $out;
  } // get_snapshot_button


  /**
   * Generate card header including title and action buttons
   *
   * @param string  $title  Card title.
   * @param string  $card_id  Card element #ID.
   * @param array  $params  Individual icons arguments
   *
   * @return string
   */
  function get_card_header($title, $card_id, $params = array())
  {
    $params = shortcode_atts(array(
      'documentation_link' => false,
      'iot_button' => false,
      'collapse_button' => false,
      'create_snapshot' => false,
      'pro' => false
    ), (array) $params);

    if ($params['documentation_link'] === true) {
      $params['documentation_link'] = $card_id;
    }

    $out = '';
    $out .= '<h4 id="' . esc_attr($card_id) . '"><span class="card-name">' . esc_html($title);
    if ($params['pro']) {
      $out .= ' - <a data-feature="' . esc_attr($card_id) . '" class="pro-feature tooltip" title="WP Reset PRO tool" href="#"><span class="pro">PRO</span> tool</a>';
    }
    $out .= '</span>';
    $out .= '<div class="card-header-right">';
    if ($params['documentation_link']) {
      $out .= '<a class="documentation-link tooltip" href="' . esc_url($this->generate_web_link('documentation_link', '/documentation/')) . '" title="' . __('Open documentation for this tool', 'wp-reset') . '" target="blank"><span class="dashicons dashicons-editor-help"></span></a>';
    }
    if ($params['iot_button']) {
      $out .= '<a class="scrollto tooltip" href="#iot" title="Jump to Index of Tools"><span class="dashicons dashicons-screenoptions"></span></a>';
    }
    if ($params['create_snapshot']) {
      $out .= '<a id="create-new-snapshot-primary" title="Create a new snapshot" href="#" class="button button-primary create-new-snapshot tooltip">' . __('Create Snapshot', 'wp-reset') . '</a>';
    }
    if ($params['collapse_button']) {
      $out .= '<a class="toggle-card tooltip" href="#" title="' . __('Collapse / expand box', 'wp-reset') . '"><span class="dashicons dashicons-arrow-up-alt2"></span></a>';
    }
    $out .= '</div></h4>';

    return $out;
  } // get_card_header


  /**
   * Generate tool icons and description detailing what it modifies
   *
   * @param bool  $modify_files  Does the tool modify files?
   * @param bool  $modify_db  Does the tool modify the database?
   * @param bool  $plural  Is there more than one tool in the set?
   *
   * @return string
   */
  function get_tool_icons($modify_files = false, $modify_db = false, $plural = false)
  {
    $out = '';
    $modify_files = (bool) $modify_files;
    $modify_db = (bool) $modify_db;
    $plural = (bool) $plural;

    $out .= '<p class="tool-icons">';
    $out .= '<i class="icon-doc-text-inv' . ($modify_files ? ' red' : '') . '"></i> ';
    $out .= '<i class="icon-database' . ($modify_db ? ' red' : '') . '"></i> ';

    if ($plural) {
      if ($modify_files && $modify_db) {
        $out .= 'these tools <b>modify files &amp; the database</b>';
      } elseif (!$modify_files && $modify_db) {
        $out .= 'these tools <b>modify the database</b> but they don\'t modify any files</b>';
      } elseif ($modify_files && !$modify_db) {
        $out .= 'these tools <b>modify files</b> but they don\'t modify the database</b>';
      }
    } else {
      if ($modify_files && $modify_db) {
        $out .= 'this tool <b>modifies files &amp; the database</b>';
      } elseif (!$modify_files && $modify_db) {
        $out .= 'this tool <b>modifies the database</b> but it doesn\'t modify any files</b>';
      } elseif ($modify_files && !$modify_db) {
        $out .= 'this tool <b>modifies files</b> but it doesn\'t modify the database</b>';
      } else {
        $out .= 'this tool doesn\'t modify files or the database';
      }
    }
    $out .= '</p>';

    return $out;
  } // get_tool_icons


  /**
   * Outputs complete plugin's admin page
   *
   * @return null
   */
  function plugin_page()
  {
    // double check for admin privileges
    if (!current_user_can('manage_options')) {
      wp_die(esc_html__('Sorry, you are not allowed to access this page.', 'wp-reset'));
    }

    echo '<div class="wrap">';
    echo '<form id="wp_reset_form" action="' . esc_url(admin_url('tools.php?page=wp-reset')) . '" method="post" autocomplete="off">';

    echo '<header>';
    echo '<div class="wpr-container">';
    echo '<img id="logo-icon" src="' . esc_url($this->plugin_url) . 'img/wp-reset-logo.png" title="' . esc_html__('WP Reset', 'wp-reset') . '" alt="' . esc_html__('WP Reset', 'wp-reset') . '">';
    echo '</div>';
    echo '</header>';

    echo '<div id="loading-tabs"><img class="rotating" src="' . esc_url($this->plugin_url) . 'img/wp-reset-icon.png' . '" alt="Loading. Please wait." title="Loading. Please wait."></div>';

    echo '<div id="wp-reset-tabs" class="ui-tabs" style="display: none;">';

    echo '<nav>';
    echo '<div class="wpr-container">';
    echo '<ul class="wpr-main-tab">';
    echo '<li><a href="#tab-reset">' . esc_html(__('Reset', 'wp-reset')) . '</a></li>';
    echo '<li><a href="#tab-tools">' . esc_html(__('Tools', 'wp-reset')) . '</a></li>';
    echo '<li><a href="#tab-snapshots">' . esc_html(__('Snapshots', 'wp-reset')) . '</a></li>';
    echo '<li><a href="#tab-collections">' . esc_html(__('Collections', 'wp-reset')) . '</a></li>';
    echo '<li><a href="#tab-support">' . esc_html(__('Support', 'wp-reset')) . '</a></li>';
    echo '<li class="tab-pro"><a href="#tab-pro">' . esc_html(__('PRO', 'wp-reset')) . '</a></li>';
    echo '</ul>';
    echo '</div>'; // container
    echo '</nav>';

    echo '<div id="wpr-notifications">';
    echo '<div class="wpr-container">';
    $this->custom_notifications();
    echo '</div>';
    echo '</div>'; // wpr-notifications

    // tabs
    echo '<div class="wpr-container">';
    echo '<div id="wpr-content">';

    echo '<div style="display: none;" id="tab-reset">';
    $this->tab_reset();
    echo '</div>';

    echo '<div style="display: none;" id="tab-tools">';
    $this->tab_tools();
    echo '</div>';

    echo '<div style="display: none;" id="tab-snapshots">';
    $this->tab_snapshots();
    echo '</div>';

    echo '<div style="display: none;" id="tab-collections">';
    $this->tab_collections();
    echo '</div>';

    echo '<div style="display: none;" id="tab-support">';
    $this->tab_support();
    echo '</div>';

    echo '<div style="display: none;" id="tab-pro">';
    $this->tab_pro();
    echo '</div>';

    echo '</div>'; // content
    echo '</div>'; // container
    echo '</div>'; // wp-reset-tabs

    echo '</form>';

    echo '<div id="wpr-sidebar-ads">';
    echo '<div id="wpr-ad">';
    echo '<h3 class="textcenter"><b>Save time &amp; money with WP Reset PRO! First WP dev tool for non-devs.</b></h3>';
    echo '<p class="textcenter"><a href="#" data-feature="sidebar-logo" class="button-pro-feature textcenter"><img style="max-width: 90%;" src="' . esc_url($this->plugin_url) . '/img/wp-reset-logo.png" alt="WP Reset PRO" title="WP Reset PRO"></a></p>';
    echo '<ul class="plain-list">
    <li>25+ Reset Tools</li>
    <li>Plugins &amp; Themes Collections</li>
    <li>Automatic Snapshots</li>
    <li>WP Reset Cloud, Dropbox &amp; Google Drive support</li>
    <li>Emergency Recovery Script</li>
    <li>White-label Mode + Complete Plugin Rebranding</li>
    <li>Licenses &amp; Sites Manager (remote SaaS dashboard)</li>
    <li>Friendly email support from plugin developers</li>
  </ul>';
    echo '<p class="textcenter"><a href="#" data-feature="sidebar-button" class="button-pro-feature button button-primary">Get PRO now</a></p>';
    echo '</div>';

    if (!defined('WPFSSL_OPTIONS_KEY')) {
      echo '<div id="wpfssl-ad">';
      echo '<h3 class="textcenter"><b>Problems with SSL certificate?<br>Moving a site from HTTP to HTTPS?<br>Mixed content giving you troubles?<br><br><u>Fix all SSL problems with one plugin!</u></b></h3>';
      echo '<p class="textcenter"><a href="#" class="textcenter install-wpfssl"><img style="max-width: 90%;" src="' . esc_url($this->plugin_url) . '/img/wp-force-ssl-logo.png" alt="WP Force SSL" title="WP Force SSL"></a></p>';
      echo '<p class="textcenter"><br><a href="#" class="install-wpfssl button button-primary">Install &amp; activate the free WP Force SSL plugin</a></p><p><a href="https://wordpress.org/plugins/wp-force-ssl/" target="_blank">WP Force SSL</a> is a free WP plugin maintained by the same team as this Maintenance plugin. It has <b>+150,000 users, 5-star rating</b>, and is hosted on the official WP repository.</p>';
      echo '</div>';
    }
    echo '</div>';

    echo '</div>'; // wrap
  } // plugin_page


  /**
   * Echoes all custom plugin notitications
   *
   * @return null
   */
  private function custom_notifications()
  {
    $notice_shown = false;
    $meta = $this->get_meta();
    $snapshots = $this->get_snapshots();

    // update to PRO after activating the license
    if ($this->license->is_active()) {
      echo '<div class="card notice-wrapper notice-info">';
      echo '<h2>' . esc_html(__('Thank you for purchasing WP Reset PRO!', 'wp-reset')) . '</h2>';
      echo '<p>Your license has been verified &amp; activated.</b><br>To start using the PRO version, please follow these steps:';
      echo '<ol>';
      echo '<li><a href="https://dashboard.wpreset.com/pro-download/" target="_blank">Download</a> the latest version of the PRO plugin.</li>';
      echo '<li>Go to <a href="' . esc_url(admin_url('plugin-install.php')) . '">Plugins - Add New - Upload Plugin</a> and upload the ZIP you just downloaded.</li>';
      echo '<li>If asked to replace (overwrite) the free version - confirm it.</li>';
      echo '<li>Activate the plugin.</li>';
      echo '<li>That\'s it, no more steps.</li>';
      echo '</ol>';
      echo '</div>';
      $notice_shown = true;
    }

    // warn that WPR is not WPMU compatible
    if (false === $notice_shown && is_multisite()) {
      echo '<div class="card notice-wrapper notice-error">';
      echo '<h2>' . esc_html__('WP Reset is not compatible with multisite!', 'wp-reset') . '</h2>';
      WP_Reset_Utility::wp_kses_wf('<p>' . __('Please be careful when using WP Reset with multisite enabled. It\'s not recommended to reset the main site. Sub-sites should be OK. We\'re working on making it fully compatible with WP-MU. <b>Till then please be careful.</b> Thank you for understanding.', 'wp-reset') . '</p>');
      echo '</div>';
      $notice_shown = true;
    }

    // ask for review
    if ((!empty($meta['reset_count']) || !empty($snapshots) || current_time('timestamp', true) - $meta['first_install'] > DAY_IN_SECONDS)
      && false === $notice_shown
      && false == $this->get_dismissed_notices('rate')
    ) {
      echo '<div class="card notice-wrapper notice-info">';
      echo '<h2>' . esc_html__('Please help us spread the word &amp; keep the plugin up-to-date', 'wp-reset') . '</h2>';
      WP_Reset_Utility::wp_kses_wf('<p>' . __('If you use &amp; enjoy WP Reset, <b>please rate it on WordPress.org</b>. It only takes a second and helps us keep the plugin maintained. Thank you!', 'wp-reset') . '</p>');
      echo '<p><a class="button-primary button" title="' . esc_html__('Rate WP Reset', 'wp-reset') . '" target="_blank" href="https://wordpress.org/support/plugin/wp-reset/reviews/#new-post">' . esc_html__('Rate the plugin ★★★★★', 'wp-reset') . '</a>  <a href="#" class="wpr-dismiss-notice dismiss-notice-rate" data-notice="rate">' . esc_html__('I\'ve already rated it', 'wp-reset') . '</a></p>';
      echo '</div>';
      $notice_shown = true;
    }
  } // custom_notifications


  /**
   * Echoes content for reset tab
   *
   * @return null
   */
  private function tab_reset()
  {
    global $current_user, $wpdb;

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Please read carefully before proceeding', 'wp-reset'), 'reset-description', array('collapse_button' => true)));
    echo '<div class="card-body">';
    echo '<p>The following table details what data will be deleted (reset or destroyed) when a selected reset tool is run. Please read it! ';
    echo 'If something is not clear <a href="#" class="change-tab" data-tab="4">contact support</a> before running any tools. It\'s better to ask than to be sorry!';
    echo '</p>';
    echo '<p><i class="dashicons dashicons-trash red tooltip" title="Tool WILL delete, reset or destroy the noted data" style="vertical-align: bottom;"></i> - tool WILL delete, reset or destroy the noted data<br>';
    echo '<i class="dashicons dashicons-yes tooltip" title="Tool will NOT touch the noted data in any way" style="vertical-align: bottom;"></i> - tool will NOT touch the noted data in any way</p>';

    echo '<table id="reset-details" class="">';
    echo '<tr>';
    echo '<th>&nbsp;</th>';
    echo '<th>Options Reset<br><a data-feature="tool-options-reset" class="pro-feature" href="#"><span class="pro">PRO</span> tool</a></th>';
    echo '<th nowrap>Site Reset</th>';
    echo '<th>Nuclear Reset<br><a data-feature="tool-nuclear-reset" class="pro-feature" href="#"><span class="pro">PRO</span> tool</a></th>';
    echo '</tr>';

    $rows = array();
    $rows['Posts, pages & custom post types'] = array(0, 1, 1);
    $rows['Comments'] = array(0, 1, 1);
    $rows['Media'] = array(0, 1, 1);
    $rows['Media files'] = array(0, 0, 1);
    $rows['Users'] = array(0, 1, 1);
    $rows['User roles'] = array(1, 1, 1);
    $rows['Current user - ' . $current_user->user_login] = array(0, 0, 0);
    $rows['Widgets'] = array(1, 1, 1);
    $rows['Transients'] = array(1, 1, 1);
    $rows['Settings &amp; options (from WP, plugins & themes)'] = array(1, 1, 1);
    $rows['Site title, WP address, site address,' . PHP_EOL . 'search engine visibility, timezone'] = array(0, 0, 0);
    $rows['Site language'] = array(0, 0, 1);
    $rows['Data in all default WP tables'] = array(0, 1, 1);
    $rows['Custom database tables with prefix ' . $wpdb->prefix] = array(0, 1, 1);
    $rows['Other database tables'] = array(0, 0, 0);
    $rows['Plugin files'] = array(0, 0, 1);
    $rows['MU plugin files'] = array(0, 0, 1);
    $rows['Drop-in files'] = array(0, 0, 1);
    $rows['Theme files'] = array(0, 0, 1);
    $rows['All files in uploads'] = array(0, 0, 1);
    $rows['Custom folders in wp-content'] = array(0, 0, 1);

    foreach ($rows as $tool => $opt) {
      echo '<tr>';
      echo '<td>';
      WP_Reset_Utility::wp_kses_wf(nl2br(esc_html($tool)));
      echo '</td>';
      if (empty($opt[0])) {
        echo '<td><i class="dashicons dashicons-yes tooltip" title="Data will NOT be deleted, reset or modified"></i></td>';
      } else {
        echo '<td><i class="dashicons dashicons-trash red tooltip" title="Data WILL BE deleted, reset or modified"></i></td>';
      }
      if (empty($opt[1])) {
        echo '<td><i class="dashicons dashicons-yes tooltip" title="Data will NOT be deleted, reset or modified"></i></td>';
      } else {
        echo '<td><i class="dashicons dashicons-trash red tooltip" title="Data WILL BE deleted, reset or modified"></i></td>';
      }
      if (empty($opt[2])) {
        echo '<td><i class="dashicons dashicons-yes tooltip" title="Data will NOT be deleted, reset or modified"></i></td>';
      } else {
        echo '<td><i class="dashicons dashicons-trash red tooltip" title="Data WILL BE deleted, reset or modified"></i></td>';
      }
      echo '</tr>';
    } // foreach $rows
    echo '<tfoot>';
    echo '<tr>';
    echo '<th>&nbsp;</th>';
    echo '<th>Options Reset<br><a data-feature="tool-options-reset" class="pro-feature" href="#"><span class="pro">PRO</span> tool</a></th>';
    echo '<th nowrap>Site Reset</th>';
    echo '<th>Nuclear Reset<br><a data-feature="tool-nuclear-reset" class="pro-feature" href="#"><span class="pro">PRO</span> tool</a></th>';
    echo '</tr>';
    echo '</tfoot>';
    echo '</table>';

    echo '<p><b>' . esc_html__('What happens when I run any Reset tool?', 'wp-reset') . '</b></p>';
    echo '<ul class="plain-list">';
    WP_Reset_Utility::wp_kses_wf('<li>' . __('remember, always <b>make a backup first</b> or use <a href="#" class="change-tab" data-tab="2">snapshots</a>', 'wp-reset') . '</li>');
    echo '<li>' . esc_html__('you will have to confirm the action one more time', 'wp-reset') . '</li>';
    echo '<li>' . esc_html__('see the table above to find out what exactly will be reset or deleted', 'wp-reset') . '</li>';
    echo '<li>' . esc_html__('site title, WordPress URL, site URL, site language, search engine visibility and current user will always be restored', 'wp-reset') . '</li>';
    echo '<li>' . esc_html__('you will be logged out, automatically logged back in and taken to the admin dashboard', 'wp-reset') . '</li>';
    echo '<li>' . esc_html__('WP Reset plugin will be reactivated if that option is chosen', 'wp-reset') . '</li>';
    echo '</ul>';

    echo '<p><b>' . esc_html__('WP-CLI Support', 'wp-reset') . '</b><br>';
    echo '' . sprintf(esc_html__('All tools available via GUI are available in WP-CLI as well. To get the list of commands run %s. Instead of the active user, the first user with admin privileges found in the database will be restored. ', 'wp-reset'), '<code>wp help reset</code>');
    echo sprintf(esc_html__('All actions have to be confirmed. If you want to skip confirmation use the standard %s option. Please be careful and backup first.', 'wp-reset'), '<code>--yes</code>') . '</p>';

    echo '</div></div>'; // card description

    $theme =  wp_get_theme();
    $theme_name = $theme->get('Name');
    if (empty($theme_name)) {
      $theme_name = '<i>no active theme</i>';
    }
    $active_plugins = get_option('active_plugins');

    // options reset
    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Options Reset', 'wp-reset'), 'tool-options-reset', array('collapse_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>Options table will be reset to default values meaning all WP core settings, widgets, theme settings and customizations, and plugin settings will be gone. Other content and files will not be touched including posts, pages, custom post types, comments and other data stored in separate tables. Site URL and name will be kept as well. Please see the <a href="#reset-details" class="scrollto">table above</a> for details.</p>';

    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, true));

    echo '<p><br><label for="reset-options-reactivate-theme"><input type="checkbox" id="reset-options-reactivate-theme" value="1"> ' . esc_html__('Reactivate current theme', 'wp-reset') . ' - ' . esc_html($theme_name) . '</label></p>';
    echo '<p><label for="reset-options-reactivate-plugins"><input type="checkbox" id="reset-options-reactivate-plugins" value="1"> Reactivate ' . esc_attr(sizeof($active_plugins)) . ' currently active plugin' . (sizeof($active_plugins) != 1 ? 's' : '') . ' (WP Reset will reactivate by default)</label></p>';

    echo '<p class="mb0"><a class="button button-delete button-pro-feature" href="#">Reset all options - <span data-feature="tool-options-reset" class="pro-feature"><span class="pro">PRO</span> tool</span></a></p>';
    echo '</div>';
    echo '</div>'; // options reset

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Site Reset', 'wp-reset'), 'tool-site-reset', array('collapse_button' => true)));
    echo '<div class="card-body">';
    echo '<p><label for="reactivate-theme"><input name="wpr-post-reset[reactivate_theme]" type="checkbox" id="reactivate-theme" value="1"> ' . esc_html__('Reactivate current theme', 'wp-reset') . ' - ' . esc_html($theme->get('Name')) . '</label></p>';
    echo '<p><label for="reactivate-wpreset"><input name="wpr-post-reset[reactivate_wpreset]" type="checkbox" id="reactivate-wpreset" value="1" checked> ' . esc_html__('Reactivate WP Reset plugin', 'wp-reset') . '</label></p>';

    echo '<p><label for="reactivate-plugins"><input name="wpr-post-reset[reactivate_plugins]" type="checkbox" id="reactivate-plugins" value="1"> ' . esc_html__('Reactivate all currently active plugins', 'wp-reset') . '</label></p>';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('Type <b>reset</b> in the confirmation field to confirm the reset and then click the "Reset WordPress" button.<br>Always <a href="#" class="create-new-snapshot" data-description="Before resetting the site">create a snapshot</a> before resetting if you want to be able to undo.', 'wp-reset') . '</p>');

    wp_nonce_field('wp-reset');
    echo '<p class="mb0"><input id="wp_reset_confirm" type="text" name="wp_reset_confirm" placeholder="' . esc_attr(sprintf(__('Type in: %s', 'wp-reset'), '"reset"')) . '" value="" autocomplete="off"> &nbsp;';
    echo '<a id="wp_reset_submit" class="button button-delete">' . esc_html__('Reset Site', 'wp-reset') . '</a>';
    WP_Reset_Utility::wp_kses_wf($this->get_snapshot_button('reset-wordpress', 'Before resetting the site'));
    echo '</p>';
    echo '</div>';
    echo '</div>'; // card reset

    // nuclear reset
    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Nuclear Site Reset', 'wp-reset'), 'tool-nuclear-reset', array('collapse_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>All data will be deleted or reset (see the <a href="#reset-details" class="scrollto">explanation table</a> for details). All data stored in the database including custom tables with <code>' . esc_html($wpdb->prefix) . '</code> prefix, as well as all files in wp-content, themes and plugins folders. The only thing restored after reset will be your user account so you can log in again, and the basic WP settings like site URL. Please see the <a href="#reset-details" class="scrollto">table above</a> for details.</p>';

    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, true));

    if (is_multisite()) {
      echo '<p class="mb0 wpmu-error">This tool is <b>not compatible</b> with WP multisite (WPMU). Using it would delete files shared by multiple sites in the WP network.</p>';
    } else {
      echo '<p><br><label for="nuclear-reset-reactivate-wpreset"><input type="checkbox" id="nuclear-reset-reactivate-wpreset" value="1" checked> ' . esc_html__('Reactivate WP Reset plugin', 'wp-reset') . '</label></p>';

      WP_Reset_Utility::wp_kses_wf('<p>' . __('Type <b>reset</b> in the confirmation field to confirm the reset and then click the "Reset WordPress &amp; Delete All Custom Files &amp; Data" button. <b>There is NO UNDO.', 'wp-reset') . '</b></p>');

      echo '<p class="mb0"><input id="nuclear_reset_confirm" type="text" placeholder="' . esc_html__('Type in "reset"', 'wp-reset') . '" value="" autocomplete="off"> &nbsp;';
      echo '<a class="button button-delete button-pro-feature" href="#">' . esc_html__('Reset WordPress &amp; Delete All Custom Files &amp; Data', 'wp-reset') . ' - <span data-feature="tool-nuclear-reset" class="pro-feature"><span class="pro">PRO</span> tool</span></a></p>';
    }
    echo '</div>';
    echo '</div>'; // nuclear reset
  } // tab_reset


  /**
   * Echoes content for tools tab
   *
   * @return null
   */
  private function tab_tools()
  {
    global $wpdb, $wp_version;

    $tools = array(
      'tool-reset-theme-options' => 'Reset Theme Options',
      '_tool-reset-user-roles' => 'Reset User Roles',
      'tool-delete-transients' => 'Delete Transients',
      'tool-purge-cache' => 'Purge Cache',
      'tool-delete-local-data' => 'Delete Local Data',
      '_tool-delete-content' => 'Delete Content',
      '_tool-delete-widgets' => 'Delete Widgets',
      'tool-delete-themes' => 'Delete Themes',
      'tool-delete-plugins' => 'Delete Plugins',
      '_tool-delete-mu-plugins-dropins' => 'Delete MU Plugins & Drop-ins',
      'tool-delete-uploads' => 'Clean uploads Folder',
      '_tool-delete-wp-content' => 'Clean wp-content Folder',
      'tool-empty-delete-custom-tables' => 'Empty or Delete Custom Tables',
      '_tool-switch-wp-version' => 'Switch WP Version',
      'tool-delete-htaccess' => 'Delete .htaccess File'
    );

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Index of Tools', 'wp-reset'), 'iot', array('collapse_button' => true)));
    echo '<div class="card-body">';
    $i = 0;
    $tools_nb = sizeof($tools);
    foreach ($tools as $tool_id => $tool_name) {
      if ($i == 0) {
        echo '<div class="third">';
        echo '<ul class="mb0 plain-list">';
      }
      if ($i == 5 || $i == 10) {
        echo '</div>';
        echo '<div class="third">';
        echo '<ul class="mb0 plain-list">';
      }

      if ($tool_id[0] == '_') {
        $tool_id = ltrim($tool_id, '_');
        echo '<li><a title="Jump to ' . esc_attr($tool_name) . ' tool" class="scrollto" href="#' . esc_attr($tool_id) . '">' . esc_html($tool_name) . '</a> <a class="pro-feature" href="#" data-feature="' . esc_attr($tool_id) . '"><span class="pro">PRO</span> tool</a></li>';
      } else {
        echo '<li><a title="Jump to ' . esc_attr($tool_name) . ' tool" class="scrollto" href="#' . esc_attr($tool_id) . '">' . esc_html($tool_name) . '</a></li>';
      }

      if ($i == $tools_nb - 1) {
        echo '</ul>';
        echo '</div>'; // third
      }
      $i++;
    } // foreach tools
    echo '</div>';
    echo '</div>';

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Reset Theme Options', 'wp-reset'), 'tool-reset-theme-options', array('iot_button' => true, 'collapse_button' => true)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('All options (mods) for all themes will be reset; not just for the active theme. The tool works only for themes that use the <a href="https://codex.wordpress.org/Theme_Modification_API" target="_blank">WordPress theme modification API</a>. If options are saved in some other, custom way they won\'t be reset.<br> Always <a href="#" class="create-new-snapshot" data-description="Before resetting theme options">create a snapshot</a> before using this tool if you want to be able to undo its actions.', 'wp-reset') . '</p>');
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, true));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to reset all theme options?" data-btn-confirm="Reset theme options" data-text-wait="Resetting theme options. Please wait." data-text-confirm="All options (mods) for all themes will be reset. Always ' . esc_attr('<a data-description="Before resetting theme options" href="#" class="create-new-snapshot">create a snapshot</a> if you want to be able to undo') . '." data-text-done="Options for %n themes have been reset." data-text-done-singular="Options for one theme have been reset." class="button button-delete" href="#" id="reset-theme-options">Reset theme options</a>';
    WP_Reset_Utility::wp_kses_wf($this->get_snapshot_button('reset-theme-options', 'Before resetting theme options') . '</p>');
    echo '</div>';
    echo '</div>'; // reset theme options

    echo '<div class="card default-collapsed">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Reset User Roles', 'wp-reset'), 'tool-reset-user-roles', array('collapse_button' => true, 'iot_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>Default user roles\' capatibilities will be reset to their default values. All custom roles will be deleted.<br>Users that had custom roles will not be assigned any default ones and might not be able to log in. Roles have to be (re)assigned to them manually.</p>';
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, true));
    echo '<p class="mb0"><a class="button button-delete button-pro-feature" href="#">Reset user roles - <span data-feature="tool-reset-user-roles" class="pro-feature"><span class="pro">PRO</span> tool</span></a>';
    WP_Reset_Utility::wp_kses_wf($this->get_snapshot_button('reset-user-roles', 'Before resetting user roles') . '</p>');
    echo '</div>';
    echo '</div>'; // reset user roles

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete Transients', 'wp-reset'), 'tool-delete-transients', array('iot_button' => true, 'collapse_button' => true)));
    echo '<div class="card-body">';
    echo '<p>All transient related database entries will be deleted. Including expired and non-expired transients, and orphaned transient timeout entries.<br>Always <a href="#" data-description="Before deleting transients" class="create-new-snapshot">create a snapshot</a> before using this tool if you want to be able to undo its actions.</p>';
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, true));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to delete all transients?" data-btn-confirm="Delete all transients" data-text-wait="Deleting transients. Please wait." data-text-confirm="All database entries related to transients will be deleted. Always ' . esc_attr('<a data-description="Before deleting transients" href="#" class="create-new-snapshot">create a snapshot</a> if you want to be able to undo') . '." data-text-done="%n transient database entries have been deleted." data-text-done-singular="One transient database entry has been deleted." class="button button-delete" href="#" id="delete-transients">Delete all transients</a>';
    WP_Reset_Utility::wp_kses_wf($this->get_snapshot_button('delete-transients', 'Before deleting transients') . '</p>');
    echo '</div>';
    echo '</div>'; // delete transients

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Purge Cache', 'wp-reset'), 'tool-purge-cache', array('collapse_button' => true, 'iot_button' => true)));
    echo '<div class="card-body">';
    echo '<p>All cache objects stored in both files and the database will be deleted. Along with WP object cache and transients, cache from the following plugins will be purged: W3 Total Cache, WP Cache, LiteSpeed Cache, Endurance Page Cache, SiteGround Optimizer, WP Fastest Cache and Swift Performance.</p>';
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, true));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to purge all cache?" data-btn-confirm="Purge cache" data-text-wait="Purging cache. Please wait." data-text-confirm="All cache objects will be deleted. There is NO UNDO. WP Reset does not make any file backups." data-text-done="Cache has been purged." data-text-done-singular="Cache has been purged." class="button button-delete" href="#" id="purge-cache">Purge cache</a></p>';
    echo '</div>';
    echo '</div>'; // purge cache

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete Local Data', 'wp-reset'), 'tool-delete-local-data', array('collapse_button' => true, 'iot_button' => true)));
    echo '<div class="card-body">';
    echo '<p>All local storage and session storage data will be deleted. Cookies without a custom set path will be deleted as well. WP cookies are not touched, with Delete Local Data button.<br>Deleting all WordPress cookies (including authentication cookies) will delete all WP related cookies and user (you) will be logged out on the next page reload.
    </p>';
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, false));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to delete all local data?" data-btn-confirm="Delete local data" data-text-wait="Deleting local data. Please wait." data-text-confirm="All local data; cookies, local storage and local session will be deleted. There is NO UNDO. WP Reset does not make backups of local data." data-text-done="%n local data objects have been deleted." data-text-done-singular="One local data object has been deleted." class="button button-delete" href="#" id="delete-local-data">Delete local data</a><a data-confirm-title="Are you sure you want to delete all WP related cookies?" data-btn-confirm="Delete all WordPress cookies" data-text-wait="Deleting WP cookies. Please wait." data-text-confirm="All WP cookies including authentication ones will be deleted. You will have to log in again. There is NO UNDO. WP Reset does not make backups of cookies." data-text-done="All WP cookies have been deleted.  Reload the page to login again." data-text-done-singular="All WP cookies have been deleted. Reload the page to login again." class="button button-delete" href="#" id="delete-wp-cookies">Delete all WordPress cookies</a></p>';
    echo '</div>';
    echo '</div>'; // delete local data

    echo '<div class="card default-collapsed">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete Content', 'wp-reset'), 'tool-delete-content', array('collapse_button' => true, 'iot_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>Besides content, all linked or child records (for selected content) will be deleted to prevent creating orphaned rows in the database. For instance, for posts that\'s posts, post meta, and comments related to posts. Delete process does not call any WP hooks such as <i>before_delete_post</i>. Choosing a post type or taxonomy does not delete that parent object it deletes the child objects. Parent objects are defined in code. If you want to remove them, remove their code definition. When media is deleted, files are left in the uploads folder. To delete files use the <a class="scrollto" href="#tool-delete-uploads">Clean uploads Folder</a> tool. Deleting users does not affect the current, logged in user account. All orphaned objects will be reassigned to him.</p>';

    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, true));

    $post_types = get_post_types('', false, 'and');
    $taxonomies = get_taxonomies('', false, 'and');

    echo '<p><select size="6" multiple id="delete-content-types">';
    echo '<option value="_comments">Comments (' . ((int) $wpdb->get_var("SELECT COUNT(comment_id) FROM $wpdb->comments")) . ')</option>';
    echo '<option value="_users">Users (' . ((int) $wpdb->get_var("SELECT COUNT(id) FROM $wpdb->users")) . ')</option>';
    foreach ($post_types as $type) {
      $count = wp_count_posts($type->name, 'readable');
      $tmp = 0;
      foreach ($count as $cnt) {
        $tmp += (int) $cnt;
      }
      echo '<option value="' . esc_attr($type->name) . '">Post type - ' . esc_html($type->label . ' (' . $tmp) . ')</option>';
    } // foreach post types
    foreach ($taxonomies as $tax) {
      echo '<option value="_tax_' . esc_attr($tax->name) . '">Taxonomy - ' . esc_html($tax->label . ' (' . wp_count_terms($tax->name)) . ')</option>';
    } // foreach post types

    echo '</select><br>';
    echo 'Select content object(s) you want to delete. Use ctrl + click to select multiple objects.</p>';

    echo '<p class="mb0"><a class="button button-delete button-pro-feature" href="#">Delete content - <span data-feature="tool-delete-content" class="pro-feature"><span class="pro">PRO</span> tool</span></a></p>';
    echo '</div>';
    echo '</div>'; // delete content

    echo '<div class="card default-collapsed">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete Widgets', 'wp-reset'), 'tool-delete-widgets', array('collapse_button' => true, 'iot_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>All widgets, orphaned, active and inactive ones, as well as widgets in active and inactive sidebars will be deleted including their settings. After deleting, WordPress will automatically recreate default, empty database entries related to widgets. So, no matter how many times users run the tool it will never return "no data deleted". That\'s expected and normal.</p>';

    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, true));

    echo '<p class="mb0"><a class="button button-delete button-pro-feature" href="#">Delete widgets - <span data-feature="tool-delete-widgets" class="pro-feature"><span class="pro">PRO</span> tool</span></a></p>';
    echo '</div>';
    echo '</div>'; // delete widgets

    $theme =  wp_get_theme();

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete Themes', 'wp-reset'), 'tool-delete-themes', array('iot_button' => true, 'collapse_button' => true)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('All themes will be deleted. Including the currently active theme - ' . esc_html($theme->get('Name')) . '.<br><b>There is NO UNDO. WP Reset does not make any file backups.</b>', 'wp-reset') . '</p>');
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, true));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to delete all themes?" data-btn-confirm="Delete all themes" data-text-wait="Deleting all themes. Please wait." data-text-confirm="All themes will be deleted. There is NO UNDO. WP Reset does not make any file backups." data-text-done="%n themes have been deleted." data-text-done-singular="One theme has been deleted." class="button button-delete" href="#" id="delete-themes">Delete all themes</a></p>';
    echo '</div>';
    echo '</div>'; // delete themes

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete Plugins', 'wp-reset'), 'tool-delete-plugins', array('iot_button' => true, 'collapse_button' => true)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('All plugins will be deleted except for WP Reset which will remain active.<br><b>There is NO UNDO. WP Reset does not make any file backups.</b>', 'wp-reset') . '</p>');
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, true));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to delete all plugins?" data-btn-confirm="Delete plugins" data-text-wait="Deleting plugins. Please wait." data-text-confirm="All plugins except WP Reset will be deleted. There is NO UNDO. WP Reset does not make any file backups." data-text-done="%n plugins have been deleted." data-text-done-singular="One plugin has been deleted." class="button button-delete" href="#" id="delete-plugins">Delete plugins</a></p>';
    echo '</div>';
    echo '</div>'; // delete plugins

    echo '<div class="card default-collapsed">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete MU Plugins & Drop-ins', 'wp-reset'), 'tool-delete-mu-plugins-dropins', array('collapse_button' => true, 'iot_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>MU Plugins are located in <code>/wp-content/mu-plugins/</code> and are, as the name suggests, must-use plugins that are automatically activated by WP and can\'t be deactiavated via the <a href="' . esc_url(admin_url('plugins.php?plugin_status=mustuse')) . '" target="_blank">plugins interface</a>, although if any are used, they are listed in the "Must Use" tab.<br>';
    echo 'Drop-ins are pieces of code found in <code>/wp-content/</code> that replace default, built-in WordPress functionality. Most often used are <code>db.php</code> and <code>advanced-cache.php</code> that implement custom DB and cache functionality. They can\'t be deactivated via the <a href="' . esc_url(admin_url('plugins.php?plugin_status=dropins')) . '" target="_blank">plugins interface</a> but if any are present are listed in the "Drop-in" tab.</p>';

    if (is_multisite()) {
      echo '<p class="mb0 wpmu-error">This tool is <b>not compatible</b> with WP multisite (WPMU). Using it would delete plugins for all sites in the network since they all share the same plugin files.</p>';
    } else {
      WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, false, true));
      echo '<p class="mb0"><a class="button button-delete button-pro-feature" href="#">Delete must use plugins - <span data-feature="tool-delete-mu-plugins" class="pro-feature"><span class="pro">PRO</span> tool</span></a><a class="button button-delete button-pro-feature" href="#">Delete drop-ins - <span data-feature="tool-delete-dropins" class="pro-feature"><span class="pro">PRO</span> tool</span></a></p>';
    }
    echo '</div>';
    echo '</div>'; // delete MU plugins and dropins

    $upload_dir = wp_upload_dir(date('Y/m'), true);
    $upload_dir['basedir'] = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $upload_dir['basedir']);

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Clean uploads Folder', 'wp-reset'), 'tool-delete-uploads', array('iot_button' => true, 'collapse_button' => true)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('All files in <code>' . esc_html($upload_dir['basedir']) . '</code> folder will be deleted. Including folders and subfolders, and files in subfolders. Files associated with <a href="' . esc_url(admin_url('upload.php')) . '">media</a> entries will be deleted too.<br><b>There is NO UNDO. WP Reset does not make any file backups.</b>', 'wp-reset') . '</p>');
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, false));
    if (false != $upload_dir['error']) {
      echo '<p class="mb0"><span style="color:#dd3036;"><b>Tool is not available.</b></span> Folder is not writeable by WordPress. Please check file and folder access rights.</p>';
    } else {
      echo '<p class="mb0"><a data-confirm-title="Are you sure you want to delete all files &amp; folders in uploads folder?" data-btn-confirm="Delete everything in uploads folder" data-text-wait="Deleting uploads. Please wait." data-text-confirm="All files and folders in uploads will be deleted. There is NO UNDO. WP Reset does not make any file backups." data-text-done="%n files &amp; folders have been deleted." data-text-done-singular="One file or folder has been deleted." class="button button-delete" href="#" id="delete-uploads">Delete all files &amp; folders in uploads folder</a></p>';
    }
    echo '</div>';
    echo '</div>'; // clean uploads folder

    echo '<div class="card default-collapsed">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Clean wp-content Folder', 'wp-reset'), 'tool-delete-wp-content', array('collapse_button' => true, 'iot_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>All folders and their content in <code>wp-content</code> folder except the following ones will be deleted: <code>mu-plugins</code>, <code>plugins</code>, <code>themes</code>, <code>uploads</code>, <code>wp-reset-autosnapshots</code>, <code>wp-reset-snapshots-export</code>.</p>';
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, false));
    if (false === is_writable(trailingslashit(WP_CONTENT_DIR))) {
      echo '<p class="mb0"><span style="color:#dd3036;"><b>Tool is not available.</b></span> Folder is not writeable by WordPress. Please check file and folder access rights.</p>';
    } else {
      echo '<p class="mb0"><a class="button button-delete button-pro-feature" href="#">Clean wp-content folder - <span data-feature="tool-delete-wp-content" class="pro-feature"><span class="pro">PRO</span> tool</span></a></p>';
    }
    echo '</div>';
    echo '</div>'; // clean wp-content

    $custom_tables = $this->get_custom_tables();

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Empty or Delete Custom Tables', 'wp-reset'), 'tool-empty-delete-custom-tables', array('iot_button' => true, 'collapse_button' => true)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('This action affects only custom tables with <code>' . esc_html($wpdb->prefix) . '</code> prefix. Core WP tables and other tables in the database that do not have that prefix will not be deleted/emptied. Deleting (dropping) tables completely removes them from the database. Emptying (truncating) removes all content from them, but keeps the structure intact.<br>Always <a href="#" class="create-new-snapshot" data-description="Before deleting custom tables">create a snapshot</a> before using this tool if you want to be able to undo its actions.</p>', 'wp-reset'));
    if ($custom_tables) {
        WP_Reset_Utility::wp_kses_wf('<p>' . __('The following ' . sizeof($custom_tables) . ' custom tables are affected by this tool: ', 'wp-reset'));
      foreach ($custom_tables as $tbl) {
        echo '<code>' . esc_html($tbl['name']) . '</code>';
        if (next($custom_tables)) {
          echo ', ';
        }
      } // foreach
      echo '.</p>';
      $custom_tables_btns = '';
    } else {
      echo '<p>' . esc_html__('There are no custom tables. There\'s nothing for this tool to empty or delete.', 'wp-reset') . '</p>';
      $custom_tables_btns = ' disabled';
    }
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(false, true, true));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to empty all custom tables?" data-btn-confirm="Empty custom tables" data-text-wait="Emptying custom tables. Please wait." data-text-confirm="All custom tables with prefix <code>' . esc_attr($wpdb->prefix) . '</code> will be emptied. Always ' . esc_attr('<a href="#" class="create-new-snapshot" data-description="Before emptying custom tables">create a snapshot</a> if you want to be able to undo') . '." data-text-done="%n custom tables have been emptied." data-text-done-singular="One custom table has been emptied." class="button button-delete' . esc_attr($custom_tables_btns) . '" href="#" id="truncate-custom-tables">Empty (truncate) custom tables</a>';
    echo '<a data-confirm-title="Are you sure you want to delete all custom tables?" data-btn-confirm="Delete custom tables" data-text-wait="Deleting custom tables. Please wait." data-text-confirm="All custom tables with prefix <code>' . esc_attr($wpdb->prefix) . '</code> will be deleted. Always ' . esc_attr('<a href="#" class="create-new-snapshot" data-description="Before deleting custom tables">create a snapshot</a> if you want to be able to undo') . '." data-text-done="%n custom tables have been deleted." data-text-done-singular="One custom table has been deleted." class="button button-delete' . esc_attr($custom_tables_btns) . '" href="#" id="drop-custom-tables">Delete (drop) custom tables</a>';
    WP_Reset_Utility::wp_kses_wf($this->get_snapshot_button('drop-custom-tables', 'Before deleting custom tables'));
    echo '</p>';
    echo '</div>';
    echo '</div>'; // empty custom tables

    echo '<div class="card default-collapsed">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Switch WP Version', 'wp-reset'), 'tool-switch-wp-version', array('collapse_button' => true, 'iot_button' => true, 'pro' => true)));
    echo '<div class="card-body">';
    if (is_multisite()) {
      echo '<p class="mb0 wpmu-error">This tool is <b>not compatible</b> with WP multisite (WPMU). Using it would change the WP version for all sites in the network since they all share the same core files.</p>';
    } else {
      echo '<p>Replace current WordPress version with the selected new version. Switching from a previous version, to a newer version is mostly supported and properly handled by the WP installer. Reverting WordPress, rolling back WordPress to a previous version is not supported. Results may vary!</p>';
      WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, true));

      $wp_versions = WP_Reset_Utility::get_wordpress_versions();
      echo '<p><label for="select-wp-version">Select the WordPress version to switch to:</label> ';
      echo '<select id="select-wp-version">';
      echo '<option value="">select WordPress version</option>';
      foreach ($wp_versions as $version => $release_date) {
        if ($release_date == 'bleeding') {
          echo '<option value="bleeding">WordPress v' . esc_html($version) . ' (Bleeding edge nightly)' . ($wp_version == $version ? ' - installed' : '') . '</option>';
        } elseif ($release_date == 'point') {
          echo '<option value="point-' . esc_attr(substr($version, 0, 3)) . '">WordPress v' . esc_html($version) . ' (Point release nightly)' . ($wp_version == $version ? ' - installed' : '') . '</option>';
        } else {
          echo '<option value="' . esc_attr($version) . '">WordPress v' . esc_html($version) . ' (' . esc_attr(date('Y-m-d', $release_date)) . ')' . ($wp_version == $version ? ' - installed' : '') . '</option>';
        }
      }
      echo '</select></p>';

      echo '<p class="mb0">';
      echo '<a class="button button-delete button-pro-feature" href="#">Switch WordPress version - <span data-feature="tool-switch-wp-version" class="pro-feature"><span class="pro">PRO</span> tool</span></a>';
      echo '</p>';
    }
    echo '</div>';
    echo '</div>'; // switch WP version

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Delete .htaccess File', 'wp-reset'), 'tool-delete-htaccess', array('iot_button' => true, 'collapse_button' => true)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('This action deletes the .htaccess file located in <code>' . esc_html($this->get_htaccess_path()) . '</code><br><b>There is NO UNDO. WP Reset does not make any file backups.</b></p>', 'wp-reset'));

    echo '<p>If you need to edit .htaccess, install our free <a href="' . esc_url(admin_url('plugin-install.php?tab=plugin-information&plugin=wp-htaccess-editor&TB_iframe=true&width=600&height=550')) . '" class="thickbox open-plugin-details-modal">WP Htaccess Editor</a> plugin. It automatically creates backups when you edit .htaccess as well as checks for syntax errors. To create the default .htaccess file open <a href="' . esc_url(admin_url('options-permalink.php')) . '">Settings - Permalinks</a> and re-save settings. WordPress will recreate the file.</p>';
    WP_Reset_Utility::wp_kses_wf($this->get_tool_icons(true, false));
    echo '<p class="mb0"><a data-confirm-title="Are you sure you want to delete the .htaccess file?" data-btn-confirm="Delete .htaccess file" data-text-wait="Deleting .htaccess file. Please wait." data-text-confirm="Htaccess file will be deleted. There is NO UNDO. WP Reset does not make any file backups." data-text-done="Htaccess file has been deleted." data-text-done-singular="Htaccess file has been deleted." class="button button-delete" href="#" id="delete-htaccess">Delete .htaccess file</a></p>';

    echo '</div>';
    echo '</div>'; // delete htaccess
  } // tab_tools


  /**
   * Echoes content for collections tab
   *
   * @return null
   */
  private function tab_collections()
  {
    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header('What are Plugin & Theme Collections?', 'collections-info', array('collapse_button' => false)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('Have a set of plugins (and themes) that you install and activate after every reset? Or on every fresh WordPress installation? Well, no more clicking install &amp; active for ten minutes! Build the collection once and install it with one click as many times as needed.</p><p>WP Reset stores collections in the cloud so they\'re accessible on every site you build. You can use free plugins and themes from the official repo, and PRO ones by uploading a ZIP file. We\'ll safely store your license keys too, so you have everything in one place.', 'wp-reset') . '</p>');
    echo '<p><a class="button button-secondary button-pro-feature" href="#">Add a new collection - <span data-feature="collections" class="pro-feature"><span class="pro">PRO</span> feature</span></a> &nbsp; <a class="button button-secondary button-pro-feature" href="#">Reload my saved collections from the cloud - <span data-feature="collections" class="pro-feature"><span class="pro">PRO</span> feature</span></a></p>';
    echo '</div>';
    echo '</div>'; // collections-info

    $plugins = array();
    $plugins['eps-301-redirects'] = array('name' => '301 Redirects', 'desc' => 'Easiest way to manage redirects');
    $plugins['classic-editor'] = array('name' => 'Classic Editor', 'desc' => 'Any easy fix for all your Gutenberg caused troubles');
    $plugins['simple-author-box'] = array('name' => 'Simple Author Box', 'desc' => 'Simplest way to add responsive, great looking author boxes');
    $plugins['sticky-menu-or-anything-on-scroll'] = array('name' => 'Sticky Menu (or Anything!) on Scroll', 'desc' => 'Make any element on the page sticky.');
    $plugins['under-construction-page'] = array('name' => 'UnderConstructionPage', 'desc' => 'Working on your site? Put it in the under construction mode.');
    $plugins['wp-external-links'] = array('name' => 'WP External Links', 'desc' => 'Manage all external & internal links. Control icons, nofollow, noopener, UGC, sponsored and if links open in new window or new tab.');

    echo '<div class="card" data-collection-id="1">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header('Must Have WordPress Plugins', 'collection-id-1', array('collapse_button' => false)));
    echo '<div class="card-body"><div class="thirdx2"><p class="_mb0"></p><div class="dropdown  dropdown-right">
    <a class="button dropdown-toggle" href="#">Install collection</a>
    <div class="dropdown-menu">
      <a class="dropdown-item install-collection" data-activate="true" href="#">Install &amp; activate collection</a>
      <a class="dropdown-item install-collection" href="#">Install collection</a>
      <a data-feature="collections" class="dropdown-item button-pro-feature" href="#">Delete installed plugins &amp; themes then install &amp; activate collection - <span class="pro-feature" data-feature="cloud-wpr"><span class="pro">PRO</span> Feature</span></a>
      <a data-feature="collections" class="dropdown-item button-pro-feature" href="#">Delete installed plugins &amp; themes then install collection - <span class="pro-feature" data-feature="cloud-wpr"><span class="pro">PRO</span> Feature</span></a>
    </div>
    </div><a class="button add-collection-item button-pro-feature" href="#">Add new plugin or theme - <span data-feature="collections" class="pro-feature"><span class="pro">PRO</span> feature</span></a></div><div class="third textright"><p class="_mb0"></p><div class="dropdown">
    <a class="button dropdown-toggle" href="#">Actions</a>
    <div class="dropdown-menu">
      <a class="dropdown-item button-pro-feature" href="#">Add new collection - <span class="pro-feature" data-feature="collections"><span class="pro">PRO</span> Feature</span></a>
      <a class="dropdown-item button-pro-feature" href="#">Rename collection - <span class="pro-feature" data-feature="collections"><span class="pro">PRO</span> Feature</span></a>
      <a class="dropdown-item button-delete button-pro-feature" href="#">Delete collection - <span class="pro-feature" data-feature="collections"><span class="pro">PRO</span> Feature</span></a>
    </div>
    </div><p></p></div><table class="collection-table"><tbody><tr><th>Type</th><th>Name &amp; Note</th><th class="actions">Actions</th></tr>';
    foreach ($plugins as $slug => $plugin) {
      echo '<tr data-slug="' . esc_attr($slug) . '"><td><span class="dashicons dashicons-admin-plugins tooltip" title="Plugin"></span><span class="dashicons dashicons-wordpress tooltip" title="Comes from the WordPress repository"></span></td><td class="collection-item-details"><span>' . esc_html($plugin['name']) . '</span><i>' . esc_html($plugin['desc']) . '</i></td><td class="textcenter"><div class="dropdown">
            <a class="button dropdown-toggle" href="#">Actions</a>
            <div class="dropdown-menu">
                <a href="#" class="dropdown-item install-collection-item button-pro-feature">Install - <span class="pro-feature" data-feature="collections"><span class="pro">PRO</span> Feature</span></a>
                <a href="#" class="dropdown-item install-collection-item button-pro-feature">Install &amp; Activate - <span class="pro-feature" data-feature="collections"><span class="pro">PRO</span> Feature</span></a>
                <a href="#" class="dropdown-item edit-collection-item button-pro-feature">Edit - <span class="pro-feature" data-feature="collections"><span class="pro">PRO</span> Feature</span></a>
                <a href="#" class="dropdown-item button-delete button-link-delete delete-collection-item button-pro-feature">Delete - <span class="pro-feature" data-feature="collections"><span class="pro">PRO</span> Feature</span></a>
            </div>
        </div></td></tr>';
    } // foreach plugin
    echo '</tbody></table></div></div>';
  } // tab_collections


  /**
   * Echoes content for support tab
   *
   * @return null
   */
  private function tab_support()
  {
    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Documentation', 'wp-reset'), 'support-documentation', array('collapse_button' => false)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p class="mb0">' . __('All tools and features are explained in detail in <a href="' . esc_url($this->generate_web_link('support-tab', '/documentation/')) . '" target="_blank">the documentation</a>. We did our best to describe how things work on both the code level and an "average user" level.', 'wp-reset') . '</p>');
    echo '</div>';
    echo '</div>'; // documentation

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header('Emergency Recovery Script', 'support-ers', array('collapse_button' => false, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p>Emergency Recovery Script is a standalone, single-file, WordPress independent PHP script created to <b>recover WordPress sites from the most difficult situations</b>. When access to the admin is not possible when core files are compromised (accidental delete or malware related situations), when you get the white screen of death, can\'t log in for whatever reason or a plugin has killed your site - emergency recovery script can fix the problem! Some of the things ERS can do;</p>';
    echo '<ul class="plain-list">';
    echo '<li>Test the integrity of all WP core files and reinstall them if needed</li>';
    echo '<li>Detect and remove all files in core folders that are not a part of WP</li>';
    echo '<li>Deactivate and activate plugins without logging in to WP admin</li>';
    echo '<li>Deactivate and activate themes without logging in to WP admin</li>';
    echo '<li>Reset user privileges and roles</li>';
    echo '<li>Create new WP admin accounts without logging in to WP admin or knowing the admin username/password</li>';
    echo '<li>Modify WordPress address and site address</li>';
    echo '</ul>';
    echo '<p class="mb0">You can install the script as a preventive measure, so it\'s always available in case of an emergency (don\'t worry, it\'s password protected), or upload it only when needed. On production sites, when big and potentially dangerous changes rarely happen, we suggest uploading it only when needed. On test sites, have it ready in advance because there\'s a higher probability that you\'ll need it. Emergency Recovery Script is a <span class="pro-feature pro-feature-text" data-feature="support-ers">WP Reset <span>PRO</span></span> tool.</p>';
    echo '</div>';
    echo '</div>'; // emergency recovery script

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Public Support Forum', 'wp-reset'), 'support-forum', array('collapse_button' => false)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p>' . __('We are very active on the <a href="https://wordpress.org/support/plugin/wp-reset" target="_blank">official WP Reset support forum</a>. If you found a bug, have a feature idea or just want to say hi - please drop by. We love to hear back from our users.', 'wp-reset') . '</p>');
    echo '</div>';
    echo '</div>'; // forum

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Premium Email Support', 'wp-reset'), 'support-email', array('collapse_button' => false, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p class="mb0">Need urgent support? Have one of our devs personally help you with your issue. All PRO license holders have access to premium email support. Get <span class="pro-feature pro-feature-text" data-feature="support-email">WP Reset <span>PRO</span></span> now.</p>';
    echo '</div>';
    echo '</div>'; // email support

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Care to Help Out?', 'wp-reset'), 'support-help-out', array('collapse_button' => false)));
    echo '<div class="card-body">';
    WP_Reset_Utility::wp_kses_wf('<p class="mb0">' . __('No need for donations :) If you can give us a <a href="https://wordpress.org/support/plugin/wp-reset/reviews/#new-post" target="_blank">five star rating</a> you\'ll help out more than you can imagine. A public mention <a href="https://twitter.com/webfactoryltd" target="_blank">@webfactoryltd</a> also does wonders. Thank you!', 'wp-reset') . '</p>');
    echo '</div>';
    echo '</div>'; // help out
  } // tab_support


  /**
   * Echoes content for pro tab
   *
   * @return null
   */
  private function tab_pro()
  {
    $agency_lifetime = $this->generate_web_link('pricing-table', '/buy/', array('p' => 'wp-reset-pro-agency-ltd-launch'));
    $team_lifetime = $this->generate_web_link('pricing-table', '/', array(), 'pricing');
    $personal_lifetime = $this->generate_web_link('pricing-table', '/buy/', array('p' => 'wp-reset-pro-personal-ltd-launch'));

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('WP Reset PRO', 'wp-reset'), 'pro-features', array('collapse_button' => false)));
    echo '<div class="card-body">';
    echo '<p>More ways to reset your site, more tools, automatic snapshots, collections, email support and the emergency recover script - that\'s WP Reset PRO in a nutshell. The same <b>quality and easy-of-use</b> you experienced in the free version is very much a part of the PRO one, but extended and upgraded with more tools that will save you even more time.</p>';
    echo '<p>WP Reset PRO is aimed towards <b>webmasters, agencies, and everyone who buildsa a lot of WordPress sites</b>. It\'s much, much more than a "reset" tool. It\'s an easy way to start a new site, to test changes and to get out of the thickest jams. And thanks to its cloud features and the Dashboard it\'ll give you access to collections and snapshots on all the sites you\'re working on - instantly, without dragging any files along.</p>';
    echo '<p>Give WP Reset PRO a go. <b>It\'ll pay itself out in hours saved within the first few days!</b></p>';
    echo '<p>If you already have a PRO license, activate it below.</p>';
    echo '<p class="textcenter"><a href="#" data-feature="purchase-pro" class="button-pro-feature button button-delete">Get PRO now</a></p>';
    echo '</div>';
    echo '</div>';

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header(__('Activate PRO License', 'wp-reset'), 'pro-activate', array('collapse_button' => false)));
    echo '<div class="card-body">';

    echo '<p>License key is visible on the confirmation screen, right after purchasing. You can also find it in the confirmation email sent to the email address provided on purchase. Or use keys created with the <a href="https://dashboard.wpreset.com/licenses/" target="_blank">license manager</a>.</p>
    <p>If you don\'t have a license - <a class="button-pro-feature" href="#" data-feature="purchase-pro2">purchase one now</a>. In case of problems with the license please <a href="' . esc_url($this->generate_web_link('pro-tab-license', '/contact/')) . '" target="_blank">contact support</a>.</p>';

    echo '<hr>';
    echo '<p><label for="wpr-license-key">License Key: </label><input class="regular-text" type="text" id="wpr-license-key" value="' . ($this->license->get_license('license_key') != 'keyless' ? esc_attr($this->license->get_license('license_key')) : '') . '" placeholder="12345678-12345678-12345678-12345678">';

    echo '<br><label>Status: </label>';
    if ($this->license->is_active()) {
      $license_formatted = $this->license->get_license_formatted();
      echo '<b style="color: #66b317;">Active</b><br>
      <label>Type: </label>' . esc_html($license_formatted['name_long']);
      echo '<br><label>Valid: </label>' . esc_html($license_formatted['valid_until']);

      echo '<p>Thank you for purchasing WP Reset PRO! <b>Your license has been verified and activated.</b>';
      echo '<br>To start using the PRO version, please follow these steps:</p>';
      echo '<ol>';
      echo '<li><a href="https://dashboard.wpreset.com/pro-download/" target="_blank">Download</a> the latest version of the PRO plugin.</li>';
      echo '<li>Go to <a href="' . esc_url(admin_url('plugin-install.php')) . '">Plugins - Add New - Upload Plugin</a> and upload the ZIP you just downloaded.</li>';
      echo '<li>If asked to replace (overwrite) the free version - confirm it.</li>';
      echo '<li>Activate the plugin.</li>';
      echo '<li>That\'s it, no more steps.</li>';
      echo '</ol>';
    } else { // not active
      echo '<strong style="color: #ea1919;">Inactive</strong>';
      if (!empty($this->license->get_license('error'))) {
        echo '<br><label>Error: </label>' . esc_html($this->license->get_license('error'));
      }
    }
    echo '</p>';

    echo '<p>';
    if ($this->license->is_active()) {
      echo '<a href="#" id="wpr-save-license" data-text-wait="Validating. Please wait." class="button button-secondary">Save &amp; Revalidate License</a>';
      echo '&nbsp; &nbsp;<a href="#" id="wpr-deactivate-license" data-text-wait="Deactivating. Please wait." class="button button-delete">Deactivate License</a>';
    } else {
      echo '<a href="#" id="wpr-save-license" data-text-wait="Activating. Please wait." class="button button-primary">Save &amp; Activate License</a>';
      echo '&nbsp; &nbsp;<a href="#" data-text-wait="Activating. Please wait." class="button button-secondary" id="wpr-keyless-activation">Keyless Activation</a>';
    }
    echo '</p>';
    echo '<p class="mb0"><i>By attempting to activate a license you agree to share the following data with <a target="_blank" href="https://www.webfactoryltd.com/">WebFactory Ltd</a>: license key, site URL, site title, site WP version, site IP, and WP Reset plugin (free) version.</i>';
    echo '</p>';

    echo '</div>';
    echo '</div>'; // activate PRO

    WP_Reset_Utility::wp_kses_wf($this->pro_dialog());
  } // tab_pro


  function pro_dialog()
  {
    $out = '';

    $out .= '<div id="wpreset-pro-dialog" style="display: none;" title="WP Reset PRO"><span class="ui-helper-hidden-accessible"><input type="text"/></span>';

    $out .= '<div class="center logo"><a href="https://wpreset.com/?ref=wpreset-free-pricing-table" target="_blank"><img src="' . $this->plugin_url . 'img/wp-reset-logo.png' . '" alt="WP Reset PRO" title="WP Reset PRO"></a><br>';

    $out .= '<span>Limited PRO Offer - <b>all prices are LIFETIME</b>! Pay once &amp; use forever!</span>';
    $out .= '</div>';

    $out .= '<table id="wpreset-pro-table">';
    $out .= '<tr>';
    $out .= '<td class="center">Lifetime Personal License</td>';
    $out .= '<td class="center">Lifetime Team License</td>';
    $out .= '<td class="center">Lifetime Agency License</td>';
    $out .= '</tr>';

    $out .= '<tr class="prices">';
    $out .= '<td class="center"><del>$39 /year</del><br><span>$59</span> <b>/lifetime</b></td>';
    $out .= '<td class="center"><del>$79 /year</del><br><span>$69</span> <b>/lifetime</b></td>';
    $out .= '<td class="center"><del>$119 /year</del><br><span>$149</span> <b>/lifetime</b></td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span><b>1 Site License</b></td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span><b>5 Sites License</b></td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span><b>100 Sites License</b></td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>All Plugin Features &amp; Tools</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>All Plugin Features &amp; Tools</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>All Plugin Features &amp; Tools</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Lifetime Updates &amp; Support</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Lifetime Updates &amp; Support</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Lifetime Updates &amp; Support</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>2 GB WP Reset Cloud Storage</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>10 GB WP Reset Cloud Storage</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>100 GB WP Reset Cloud Storage</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Dropbox &amp; Google Drive support</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Dropbox &amp; Google Drive support</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Dropbox &amp; Google Drive support</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Plugins & Themes Collections</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Plugins & Themes Collections</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Plugins & Themes Collections</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Automatic Snapshots</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Automatic Snapshots</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Automatic Snapshots</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Emergency Recovery Script</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Emergency Recovery Script</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Emergency Recovery Script</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-no"></span>Licenses &amp; Sites Manager</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Licenses &amp; Sites Manager</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Licenses &amp; Sites Manager</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-no"></span>White-label Mode</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>White-label Mode</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>White-label Mode</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><span class="dashicons dashicons-no"></span>Full Plugin Rebranding</td>';
    $out .= '<td><span class="dashicons dashicons-no"></span>Full Plugin Rebranding</td>';
    $out .= '<td><span class="dashicons dashicons-yes"></span>Full Plugin Rebranding</td>';
    $out .= '</tr>';

    $out .= '<tr>';
    $out .= '<td><a class="button button-buy" data-href-org="https://wpreset.com/buy2/?product=personal-free&ref=pricing-table" href="https://wpreset.com/buy2/?product=personal-free&ref=pricing-table" target="_blank">Lifetime License<br>$59 -&gt; BUY NOW</a>
    <br>or <a class="button-buy" data-href-org="https://wpreset.com/buy2/?product=personal-monthly&ref=pricing-table" href="https://wpreset.com/buy2/?product=personal-monthly&ref=pricing-table" target="_blank">only $6.99 <small>/month</small></a></td>';
    $out .= '<td><a class="button button-buy" data-href-org="https://wpreset.com/buy2/?product=team-free&ref=pricing-table" href="https://wpreset.com/buy2/?product=team-free&ref=pricing-table" target="_blank">Lifetime License<br>$69 -&gt; BUY NOW</a></td>';
    $out .= '<td><a class="button button-buy" data-href-org="https://wpreset.com/buy2/?product=agency-free&ref=pricing-table" href="https://wpreset.com/buy2/?product=agency-free&ref=pricing-table" target="_blank">Lifetime License<br>$149 -&gt; BUY NOW</a></td>';
    $out .= '</tr>';

    $out .= '</table>';

    $out .= '<div class="center footer"><b>100% No-Risk Money Back Guarantee!</b> If you don\'t like the plugin over the next 7 days, we will happily refund 100% of your money. No questions asked! Payments are processed by our merchant of records - <a href="https://paddle.com/" target="_blank">Paddle</a>.</div></div>';

    return $out;
  } // pro_dialog


  /**
   * Echoes content for snapshots tab
   *
   * @return null
   */
  private function tab_snapshots()
  {
    global $wpdb;
    $tbl_core = $tbl_custom = $tbl_size = $tbl_rows = 0;

    echo '<div class="card" id="card-snapshots">';
    echo '<h4>';
    echo esc_html__('Snapshots', 'wp-reset');
    echo '<div class="card-header-right"><a class="toggle-card tooltip" href="#" title="' . esc_html__('Collapse / expand box', 'wp-reset') . '"><span class="dashicons dashicons-arrow-up-alt2"></span></a></div>';
    echo '</h4>';
    echo '<div class="card-body">';
    echo '<p>A snapshot is a copy of all WP database tables, standard and custom ones, saved in the site\'s database. <a href="https://www.youtube.com/watch?v=xBfMmS12vMY" target="_blank">Watch a short video</a> overview and tutorial about Snapshots.</p>';

    echo '<p>Snapshots are primarily a development tool. When using various reset tools we advise using our 1-click snapshot tool available in every tool\'s confirmation dialog. If a full backup that includes files is needed, use one of the <a href="' . esc_url(admin_url('plugin-install.php?s=backup&tab=search&type=term')) . '" target="_blank">backup plugins</a> from the repo.</p>';

    echo '<p>Use snapshots to find out what changes a plugin made to your database or to quickly restore the dev environment after testing database related changes. Restoring a snapshot does not affect other snapshots, or WP Reset settings.</p>';

    echo '<p>To automatically generate snapshots on plugin, theme, and core update, activate, deactivate and similar events enable automatic snapshots available in <span class="pro-feature pro-feature-text" data-feature="snapshots-auto">WP Reset <span>PRO</span></span>.</p>';

    $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
    if (is_array($tables)) {
      foreach ($tables as $table) {
        if (0 !== stripos($table[0], $wpdb->prefix)) {
          continue;
        }

        if (in_array($table[0], $this->core_tables)) {
          $tbl_core++;
        } else {
          $tbl_custom++;
        }
      } // foreach

      echo '<p class="mb0"><b>Currently used WordPress tables</b>, prefixed with <i>' . esc_html($wpdb->prefix) . '</i>, consist of ' . esc_html($tbl_core) . ' standard and ';
      if ($tbl_custom) {
        echo esc_attr($tbl_custom) . ' custom table' . ($tbl_custom == 1 ? '' : 's');
      } else {
        echo 'no custom tables';
      }
      echo ' <span id="wpr-table-details"><a href="#" id="show-table-details">(show details)</a></span>';
    } else {
      echo '<b>Tables information is not available.</b> Something is not working properly on your site. Snapshots won\'t work.';
    }

    echo '</div>';
    echo '</div>';

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header('User Created Snapshots', 'snapshots-user', array('collapse_button' => 1, 'create_snapshot' => true, 'snapshot_actions' => true)));
    echo '<div class="card-body">';
    if ($snapshots = $this->get_snapshots()) {
      $snapshots = array_reverse($snapshots);
      echo '<table id="wpr-snapshots">';
      echo '<tr><th>Date</th><th>Description</th><th class="ss-size">Size</th><th class="ss-actions">&nbsp;</th></tr>';
      foreach ($snapshots as $ss) {
        echo '<tr id="wpr-ss-' . esc_attr($ss['uid']) . '">';
        if (!empty($ss['name'])) {
          $name = $ss['name'];
        } else {
          $name = 'created on ' . date(get_option('date_format'), strtotime($ss['timestamp'])) . ' @ ' . date(get_option('time_format'), strtotime($ss['timestamp']));
        }

        echo '<td>';
        if (current_time('timestamp') - strtotime($ss['timestamp']) > 12 * HOUR_IN_SECONDS) {
          echo esc_attr(date(get_option('date_format'), strtotime($ss['timestamp']))) . '<br>@ ' . esc_attr(date(get_option('time_format'), strtotime($ss['timestamp'])));
        } else {
          echo esc_attr(human_time_diff(strtotime($ss['timestamp']), current_time('timestamp'))) . ' ago';
        }
        echo '</td>';

        echo '<td>';
        if (!empty($ss['name'])) {
          echo '<b>' . esc_html($ss['name']) . '</b><br>';
        }
        echo esc_attr($ss['tbl_core']) . ' standard &amp; ';
        if ($ss['tbl_custom']) {
          echo esc_attr($ss['tbl_custom']) . ' custom table' . ($ss['tbl_custom'] == 1 ? '' : 's');
        } else {
          echo 'no custom tables';
        }
        echo ' totaling ' . esc_attr(number_format($ss['tbl_rows'])) . ' rows</td>';
        echo '<td class="ss-size">' . esc_attr(WP_Reset_Utility::format_size($ss['tbl_size'])) . '</td>';
        echo '<td>';
        echo '<div class="dropdown">
        <a class="button dropdown-toggle" href="#">Actions</a>
        <div class="dropdown-menu">';
        echo '<a data-title="Current DB tables compared to snapshot %s" data-wait-msg="Comparing. Please wait." data-name="' . esc_attr($name) . '" title="Compare snapshot to current database tables" href="#" class="ss-action compare-snapshot dropdown-item tooltip" data-ss-uid="' . esc_attr($ss['uid']) . '">Compare snapshot to current data</a>';
        echo '<a data-btn-confirm="Restore snapshot" data-text-wait="Restoring snapshot. Please wait." data-text-confirm="Are you sure you want to restore the selected snapshot? There is NO UNDO.<br>Restoring the snapshot will delete all current standard and custom tables and replace them with tables from the snapshot." data-text-done="Snapshot has been restored. Click OK to reload the page with new data." title="Restore snapshot by overwriting current database tables" href="#" class="ss-action restore-snapshot dropdown-item tooltip" data-ss-uid="' . esc_attr($ss['uid']) . '">Restore snapshot</a>';
        echo '<a data-success-msg="Snapshot export created!<br><a href=\'%s\'>Download it</a>" data-wait-msg="Exporting snapshot. Please wait." title="Download snapshot as gzipped SQL dump" href="#" class="ss-action download-snapshot dropdown-item tooltip" data-ss-uid="' . esc_attr($ss['uid']) . '">Download snapshot</a>';
        echo '<a data-btn-confirm="Delete snapshot" data-text-wait="Deleting snapshot. Please wait." data-text-confirm="Are you sure you want to delete the selected snapshot and all its data? There is NO UNDO.<br>Deleting the snapshot will not affect the active database tables in any way." data-text-done="Snapshot has been deleted." title="Permanently delete snapshot" href="#" class="ss-action delete-snapshot dropdown-item tooltip" data-ss-uid="' . esc_attr($ss['uid']) . '">Delete snapshot</a>';
        echo '<a href="#" title="WP Reset PRO feature" data-feature="cloud-wpr" class="ss-action dropdown-item button-pro-feature tooltip">Upload to WP Reset Cloud - <span class="pro-feature" data-feature="cloud-wpr"><span class="pro">PRO</span> Feature</span></a>';
        echo '<a href="#" title="WP Reset PRO feature" class="ss-action dropdown-item button-pro-feature tooltip" data-feature="cloud-general">Upload to Dropbox, Google Drive, or pCloud - <span class="pro-feature" data-feature="cloud-general"><span class="pro">PRO</span> Feature</span></a>';
        echo '</div></div></td>';
        echo '</tr>';
      } // foreach
      echo '</table>';
      echo '<p id="ss-no-snapshots" class="mb0 textcenter hidden">There are no user created snapshots. <a href="#" class="create-new-snapshot">Create a new snapshot.</a></p>';
    } else {
      echo '<p id="ss-no-snapshots" class="mb0 textcenter">There are no user created snapshots. <a href="#" class="create-new-snapshot">Create a new snapshot.</a></p>';
    }
    echo '</div>';
    echo '</div>';

    echo '<div class="card">';
    WP_Reset_Utility::wp_kses_wf($this->get_card_header('Automatic Snapshots', 'snapshots-auto', array('collapse_button' => false, 'pro' => true)));
    echo '<div class="card-body">';
    echo '<p><span class="pro-feature pro-feature-text" data-feature="snapshots-auto">WP Reset <span>PRO</span></span> creates automatic snapshots before significant events occur on your site that can cause it to stop working correctly. Plugin, theme and core updates, plugin and theme activations and deactivations all of those can happen in the background without your knowledge. With automatic snapshots, you can roll back any update with a single click. Snapshots can be uploaded to the WP Reset Cloud, Dropbox, Google Drive or pCloud, giving you an extra layer of security.<br>
    Upgrade to <span class="pro-feature pro-feature-text" data-feature="snapshots-auto">WP Reset <span>PRO</span></span> to enable automatic snapshots and give your site an extra layer of safety.</p>';
    echo '</div>';
    echo '</div>';
  } // tab_snapshots


  /**
   * Helper function for generating links
   *
   * @param string  $placement  Optional. UTM content param.
   * @param string  $page       Optional. Page to link to.
   * @param array   $params     Optional. Extra URL params.
   * @param string  $anchor     Optional. URL anchor part.
   *
   * @return string
   */
  function generate_web_link($placement = '', $page = '/', $params = array(), $anchor = '')
  {
    $base_url = 'https://wpreset.com';

    if ('/' != $page) {
      $page = '/' . trim($page, '/') . '/';
    }
    if ($page == '//') {
      $page = '/';
    }

    if ($placement) {
      $placement = trim($placement);
      $placement = '-' . $placement;
    }

    $parts = array_merge(array('ref' => 'wp-reset-free'. $placement), $params);

    if (!empty($anchor)) {
      $anchor = '#' . trim($anchor, '#');
    }

    $out = $base_url . $page . '?' . http_build_query($parts, '', '&amp;') . $anchor;

    return $out;
  } // generate_web_link


  /**
   * Returns all saved snapshots from DB
   *
   * @return array
   */
  function get_snapshots()
  {
    $snapshots = get_option('wp-reset-snapshots', array());

    return $snapshots;
  } // get_snapshots


  /**
   * Returns all custom table names, with prefix
   *
   * @return array
   */
  function get_custom_tables()
  {
    global $wpdb;
    $custom_tables = array();

    $table_status = $wpdb->get_results('SHOW TABLE STATUS');
    if (is_array($table_status)) {
      foreach ($table_status as $index => $table) {
        if (0 !== stripos($table->Name, $wpdb->prefix)) {
          continue;
        }
        if (empty($table->Engine)) {
          continue;
        }

        if (false === in_array($table->Name, $this->core_tables)) {
          $custom_tables[] = array('name' => $table->Name, 'rows' => $table->Rows, 'data_length' => $table->Data_length, 'index_length' => $table->Index_length);
        }
      } // foreach
    }

    return $custom_tables;
  } // get_custom tables


  /**
   * Creates snapshot of current tables by copying them in the DB and saving metadata.
   *
   * @param int  $name  Optional. Name for the new snapshot.
   *
   * @return array|WP_Error Snapshot details in array on success, or error object on fail.
   */
  function do_create_snapshot($name = '')
  {
    global $wpdb;
    $snapshots = $this->get_snapshots();
    $snapshot = array();
    $uid = $this->generate_snapshot_uid();
    $tbl_core = $tbl_custom = $tbl_size = $tbl_rows = 0;

    if (!$uid) {
      return new WP_Error(1, 'Unable to generate a valid snapshot UID.');
    }

    if ($name) {
      $snapshot['name'] = substr(trim($name), 0, 64);
    } else {
      $snapshot['name'] = '';
    }
    $snapshot['uid'] = $uid;
    $snapshot['timestamp'] = current_time('mysql');

    $table_status = $wpdb->get_results('SHOW TABLE STATUS');
    if (is_array($table_status)) {
      foreach ($table_status as $index => $table) {
        if (0 !== stripos($table->Name, $wpdb->prefix)) {
          continue;
        }
        if (empty($table->Engine)) {
          continue;
        }

        $tbl_rows += $table->Rows;
        $tbl_size += $table->Data_length + $table->Index_length;
        if (in_array($table->Name, $this->core_tables)) {
          $tbl_core++;
        } else {
          $tbl_custom++;
        }

        $wpdb->wpreset_snapshot_table_name = $table->Name;
        $wpdb->wpreset_snapshot_table_copy_name = $uid . '_' . $table->Name;

        $wpdb->query("OPTIMIZE TABLE " . $wpdb->wpreset_snapshot_table_name);
        $wpdb->query("CREATE TABLE " . $wpdb->wpreset_snapshot_table_copy_name . " LIKE " . $wpdb->wpreset_snapshot_table_name);
        $wpdb->query("INSERT " . $wpdb->wpreset_snapshot_table_copy_name . " SELECT * FROM " . $wpdb->wpreset_snapshot_table_name);
      } // foreach
    } else {
      return new WP_Error(1, 'Can\'t get table status data.');
    }

    $snapshot['tbl_core']   = $tbl_core;
    $snapshot['tbl_custom'] = $tbl_custom;
    $snapshot['tbl_rows']   = $tbl_rows;
    $snapshot['tbl_size']   = $tbl_size;


    $snapshots[$uid] = $snapshot;
    update_option('wp-reset-snapshots', $snapshots);

    do_action('wp_reset_create_snapshot', $uid, $snapshot);

    return $snapshot;
  } // create_snapshot


  /**
   * Delete snapshot metadata and tables from DB
   *
   * @param string  $uid  Snapshot unique 6-char ID.
   *
   * @return bool|WP_Error True on success, or error object on fail.
   */
  function do_delete_snapshot($uid = '')
  {
    global $wpdb;
    $snapshots = $this->get_snapshots();

    if (strlen($uid) != 6) {
      return new WP_Error(1, 'Invalid UID format.');
    }

    if (!isset($snapshots[$uid])) {
      return new WP_Error(1, 'Unknown snapshot ID.');
    }

    $tables = $wpdb->get_col($wpdb->prepare('SHOW TABLES LIKE %s', array($uid . '\_%')));
    foreach ($tables as $table) {
      $wpdb->wpreset_snapshot_table = $table;
      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->wpreset_snapshot_table);
    }

    $snapshot_copy = $snapshots[$uid];
    unset($snapshots[$uid]);
    update_option('wp-reset-snapshots', $snapshots);

    do_action('wp_reset_delete_snapshot', $uid, $snapshot_copy);

    return true;
  } // delete_snapshot


  /**
   * Exports snapshot as SQL dump; saved in gzipped file in WP_CONTENT folder.
   *
   * @param string  $uid  Snapshot unique 6-char ID.
   *
   * @return string|WP_Error Export base filename, or error object on fail.
   */
  function do_export_snapshot($uid = '')
  {
    $snapshots = $this->get_snapshots();

    if (strlen($uid) != 6) {
      return new WP_Error(1, 'Invalid snapshot ID format.');
    }

    if (!isset($snapshots[$uid])) {
      return new WP_Error(1, 'Unknown snapshot ID.');
    }

    require_once $this->plugin_dir . 'libs/dumper.php';

    $snapshot_file_uid = md5($this->generate_snapshot_uid(10));
    try {
      $world_dumper = WPR_Shuttle_Dumper::create(array(
        'host' =>     DB_HOST,
        'username' => DB_USER,
        'password' => DB_PASSWORD,
        'db_name' =>  DB_NAME,
      ));

      $folder = wp_mkdir_p(trailingslashit(WP_CONTENT_DIR) . $this->snapshots_folder);
      if (!$folder) {
        return new WP_Error(1, 'Unable to create wp-content/' . $this->snapshots_folder . '/ folder.');
      }

      $htaccess_content = 'AddType application/octet-stream .gz' . PHP_EOL;
      $htaccess_content .= 'Options -Indexes' . PHP_EOL;
      $htaccess_file = @fopen(trailingslashit(WP_CONTENT_DIR) . $this->snapshots_folder . '/.htaccess', 'w');
      if ($htaccess_file) {
        fputs($htaccess_file, $htaccess_content);
        fclose($htaccess_file);
      }

      $world_dumper->dump(trailingslashit(WP_CONTENT_DIR) . $this->snapshots_folder . '/wp-reset-snapshot-' . $snapshot_file_uid . '.sql.gz', $uid . '_');
    } catch (Shuttle_Exception $e) {
      return new WP_Error(1, 'Couldn\'t create snapshot: ' . $e->getMessage());
    }

    do_action('wp_reset_export_snapshot', 'wp-reset-snapshot-' . $snapshot_file_uid . '.sql.gz');

    return 'wp-reset-snapshot-' . $snapshot_file_uid . '.sql.gz';
  } // export_snapshot


  /**
   * Replace current tables with ones in snapshot.
   *
   * @param string  $uid  Snapshot unique 6-char ID.
   *
   * @return bool|WP_Error True on success, or error object on fail.
   */
  function do_restore_snapshot($uid = '')
  {
    global $wpdb;
    $new_tables = array();
    $snapshots = $this->get_snapshots();

    if (($res = $this->verify_snapshot_integrity($uid)) !== true) {
      return $res;
    }

    $table_status = $wpdb->get_results('SHOW TABLE STATUS');
    if (is_array($table_status)) {
      foreach ($table_status as $index => $table) {
        if (0 !== stripos($table->Name, $uid . '_')) {
          continue;
        }
        if (empty($table->Engine)) {
          continue;
        }

        $new_tables[] = $table->Name;
      } // foreach
    } else {
      return new WP_Error(1, 'Can\'t get table status data.');
    }

    foreach ($table_status as $index => $table) {
      if (0 !== stripos($table->Name, $wpdb->prefix)) {
        continue;
      }
      if (empty($table->Engine)) {
        continue;
      }

      $wpdb->wpreset_snapshot_table = $table->Name;
      $wpdb->query('DROP TABLE ' . $wpdb->wpreset_snapshot_table);
    } // foreach

    // copy snapshot tables to original name
    foreach ($new_tables as $table) {
      $wpdb->wpreset_snapshot_table = $table;
      $wpdb->wpreset_snapshot_table_new = str_replace($uid . '_', '', $table);

      $wpdb->query("CREATE TABLE " . $wpdb->wpreset_snapshot_table_new . " LIKE " . $wpdb->wpreset_snapshot_table);
      $wpdb->query("INSERT " . $wpdb->wpreset_snapshot_table_new . " SELECT * FROM " . $wpdb->wpreset_snapshot_table);
    }

    wp_cache_flush();
    update_option('wp-reset', $this->options);
    update_option('wp-reset-snapshots', $snapshots);

    do_action('wp_reset_restore_snapshot', $uid);

    return true;
  } // restore_snapshot


  /**
   * Verifies snapshot integrity by comparing metadata and data in DB
   *
   * @param string  $uid  Snapshot unique 6-char ID.
   *
   * @return bool|WP_Error True on success, or error object on fail.
   */
  function verify_snapshot_integrity($uid)
  {
    global $wpdb;
    $tbl_core = $tbl_custom = 0;
    $snapshots = $this->get_snapshots();

    if (strlen($uid) != 6) {
      return new WP_Error(1, 'Invalid snapshot ID format.');
    }

    if (!isset($snapshots[$uid])) {
      return new WP_Error(1, 'Unknown snapshot ID.');
    }

    $snapshot = $snapshots[$uid];

    $table_status = $wpdb->get_results('SHOW TABLE STATUS');
    if (is_array($table_status)) {
      foreach ($table_status as $index => $table) {
        if (0 !== stripos($table->Name, $uid . '_')) {
          continue;
        }
        if (empty($table->Engine)) {
          continue;
        }

        if (in_array(str_replace($uid . '_', '', $table->Name), $this->core_tables)) {
          $tbl_core++;
        } else {
          $tbl_custom++;
        }
      } // foreach

      if ($tbl_core != $snapshot['tbl_core'] || $tbl_custom != $snapshot['tbl_custom']) {
        return new WP_Error(1, 'Snapshot data has been compromised. Saved metadata does not match data in the DB. Contact WP Reset support if data is critical, or restore it via a MySQL GUI.');
      }
    } else {
      return new WP_Error(1, 'Can\'t get table status data.');
    }

    return true;
  } // verify_snapshot_integrity


  /**
   * Compares a selected snapshot with the current table set in DB
   *
   * @param string  $uid  Snapshot unique 6-char ID.
   *
   * @return string|WP_Error Formatted table with details on success, or error object on fail.
   */
  function do_compare_snapshots($uid)
  {
    global $wpdb;
    $current = $snapshot = array();
    $out = $out2 = $out3 = '';

    if (($res = $this->verify_snapshot_integrity($uid)) !== true) {
      return $res;
    }

    $table_status = $wpdb->get_results('SHOW TABLE STATUS');
    foreach ($table_status as $index => $table) {
      if (empty($table->Engine)) {
        continue;
      }

      if (0 !== stripos($table->Name, $uid . '_') && 0 !== stripos($table->Name, $wpdb->prefix)) {
        continue;
      }

      $info = array();
      $info['rows'] = $table->Rows;
      $info['size_data'] = $table->Data_length;
      $info['size_index'] = $table->Index_length;
      $wpdb->wpreset_table_name = $table->Name;
      $schema = $wpdb->get_row('SHOW CREATE TABLE ' . $wpdb->wpreset_table_name, ARRAY_N);
      $info['schema'] = $schema[1];
      $info['engine'] = $table->Engine;
      $info['fullname'] = $table->Name;
      $basename = str_replace(array($uid . '_'), array(''), $table->Name);
      $info['basename'] = $basename;
      $info['corename'] = str_replace(array($wpdb->prefix), array(''), $basename);
      $info['uid'] = $uid;

      if (0 === stripos($table->Name, $uid . '_')) {
        $snapshot[$basename] = $info;
      }

      if (0 === stripos($table->Name, $wpdb->prefix)) {
        $info['uid'] = '';
        $current[$basename] = $info;
      }
    } // foreach

    $in_both = array_keys(array_intersect_key($current, $snapshot));
    $in_current_only = array_diff_key($current, $snapshot);
    $in_snapshot_only = array_diff_key($snapshot, $current);

    $out .= '<br><br>';
    foreach ($in_current_only as $table) {
      $out .= '<div class="wpr-table-container in-current-only" data-table="' . esc_attr($table['basename']) . '">';
      $out .= '<table>';
      $out .= '<tr title="Click to show/hide more info" class="wpr-table-missing header-row">';
      $out .= '<td><b>' . $table['fullname'] . '</b></td>';
      $out .= '<td>table is not present in snapshot<span class="dashicons dashicons-arrow-down-alt2"></span></td>';
      $out .= '</tr>';
      $out .= '<tr class="hidden">';
      $out .= '<td>';
      $out .= '<p>' . number_format($table['rows']) . ' row' . ($table['rows'] == 1 ? '' : 's') . ' totaling ' . WP_Reset_Utility::format_size($table['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($table['size_index']) . ' in index.</p>';
      $out .= '<pre>' . $table['schema'] . '</pre>';
      $out .= '</td>';
      $out .= '<td>&nbsp;</td>';
      $out .= '</tr>';
      $out .= '</table>';
      $out .= '</div>';
    } // foreach in current only

    foreach ($in_snapshot_only as $table) {
      $out .= '<div class="wpr-table-container in-snapshot-only" data-table="' . esc_attr($table['basename']) . '">';
      $out .= '<table>';
      $out .= '<tr title="Click to show/hide more info" class="wpr-table-missing header-row">';
      $out .= '<td>table is not present in current tables</td>';
      $out .= '<td><b>' . esc_html($table['fullname']) . '</b><span class="dashicons dashicons-arrow-down-alt2"></span></td>';
      $out .= '</tr>';
      $out .= '<tr class="hidden">';
      $out .= '<td>&nbsp;</td>';
      $out .= '<td>';
      $out .= '<p>' . number_format($table['rows']) . ' row' . ($table['rows'] == 1 ? '' : 's') . ' totaling ' . WP_Reset_Utility::format_size($table['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($table['size_index']) . ' in index.</p>';
      $out .= '<pre>' . $table['schema'] . '</pre>';
      $out .= '</td>';
      $out .= '</tr>';
      $out .= '</table>';
      $out .= '</div>';
    } // foreach in snapshot only

    foreach ($in_both as $tablename) {
      $tbl_current = $current[$tablename];
      $tbl_snapshot = $snapshot[$tablename];

      $schema1 = preg_replace('/(auto_increment=)([0-9]*) /i', '${1}1 ', $tbl_current['schema'], 1);
      $schema2 = preg_replace('/(auto_increment=)([0-9]*) /i', '${1}1 ', $tbl_snapshot['schema'], 1);
      $tbl_snapshot['tmp_schema'] = str_replace($tbl_snapshot['uid'] . '_' . $tablename, $tablename, $tbl_snapshot['schema']);
      $schema2 = str_replace($tbl_snapshot['uid'] . '_' . $tablename, $tablename, $schema2);

      if ($tbl_current['rows'] == $tbl_snapshot['rows'] && $tbl_current['schema'] == $tbl_snapshot['tmp_schema']) {
        $out3 .= '<div class="wpr-table-container identical" data-table="' . esc_attr($tablename) . '">';
        $out3 .= '<table>';
        $out3 .= '<tr title="Click to show/hide more info" class="wpr-table-match header-row">';
        $out3 .= '<td><b>' . $tbl_current['fullname'] . '</b></td>';
        $out3 .= '<td><b>' . $tbl_snapshot['fullname'] . '</b><span class="dashicons dashicons-arrow-down-alt2"></span></td>';
        $out3 .= '</tr>';
        $out3 .= '<tr class="hidden">';
        $out3 .= '<td>';
        $out3 .= '<p>' . number_format($tbl_current['rows']) . ' rows totaling ' . WP_Reset_Utility::format_size($tbl_current['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($tbl_current['size_index']) . ' in index.</p>';
        $out3 .= '<pre>' . $tbl_current['schema'] . '</pre>';
        $out3 .= '</td>';
        $out3 .= '<td>';
        $out3 .= '<p>' . number_format($tbl_snapshot['rows']) . ' rows totaling ' . WP_Reset_Utility::format_size($tbl_snapshot['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($tbl_snapshot['size_index']) . ' in index.</p>';
        $out3 .= '<pre>' . $tbl_snapshot['schema'] . '</pre>';
        $out3 .= '</td>';
        $out3 .= '</tr>';
        $out3 .= '</table>';
        $out3 .= '</div>';
      } elseif ($schema1 != $schema2) {
        require_once $this->plugin_dir . 'libs/diff.php';
        require_once $this->plugin_dir . 'libs/diff/Renderer/Html/SideBySide.php';
        $diff = new WPR_Diff(explode("\n", $tbl_current['schema']), explode("\n", $tbl_snapshot['schema']), array('ignoreWhitespace' => false));
        $renderer = new WPR_Diff_Renderer_Html_SideBySide;

        $out2 .= '<div class="wpr-table-container" data-table="' . $tbl_current['basename'] . '">';
        $out2 .= '<table>';
        $out2 .= '<tr title="Click to show/hide more info" class="wpr-table-difference header-row">';
        $out2 .= '<td><b>' . $tbl_current['fullname'] . '</b> table schemas do not match</td>';
        $out2 .= '<td><b>' . $tbl_snapshot['fullname'] . '</b> table schemas do not match<span class="dashicons dashicons-arrow-down-alt2"></span></td>';
        $out2 .= '</tr>';
        $out2 .= '<tr class="hidden">';
        $out2 .= '<td>';
        $out2 .= '<p>' . number_format($tbl_current['rows']) . ' rows totaling ' . WP_Reset_Utility::format_size($tbl_current['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($tbl_current['size_index']) . ' in index.</p>';
        $out2 .= '</td>';
        $out2 .= '<td>';
        $out2 .= '<p>' . number_format($tbl_snapshot['rows']) . ' rows totaling ' . WP_Reset_Utility::format_size($tbl_snapshot['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($tbl_snapshot['size_index']) . ' in index.</p>';
        $out2 .= '</td>';
        $out2 .= '</tr>';
        $out2 .= '<tr class="hidden">';
        $out2 .= '<td colspan="2" class="no-padding">';
        $out2 .= $diff->Render($renderer);
        $out2 .= '</td>';
        $out2 .= '</tr>';
        $out2 .= '</table>';
        $out2 .= '</div>';
      } else {
        $out2 .= '<div class="wpr-table-container" data-table="' . $tbl_current['basename'] . '">';
        $out2 .= '<table>';
        $out2 .= '<tr title="Click to show/hide more info" class="wpr-table-difference header-row">';
        $out2 .= '<td><b>' . $tbl_current['fullname'] . '</b> data in tables does not match</td>';
        $out2 .= '<td><b>' . $tbl_snapshot['fullname'] . '</b> data in tables does not match<span class="dashicons dashicons-arrow-down-alt2"></span></td>';
        $out2 .= '</tr>';
        $out2 .= '<tr class="hidden">';
        $out2 .= '<td>';
        $out2 .= '<p>' . number_format($tbl_current['rows']) . ' rows totaling ' . WP_Reset_Utility::format_size($tbl_current['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($tbl_current['size_index']) . ' in index.</p>';
        $out2 .= '</td>';
        $out2 .= '<td>';
        $out2 .= '<p>' . number_format($tbl_snapshot['rows']) . ' rows totaling ' . WP_Reset_Utility::format_size($tbl_snapshot['size_data']) . ' in data and ' . WP_Reset_Utility::format_size($tbl_snapshot['size_index']) . ' in index.</p>';
        $out2 .= '</td>';
        $out2 .= '</tr>';

        $out2 .= '<tr class="hidden">';
        $out2 .= '<td colspan="2">';
        if ($tbl_current['corename'] == 'options') {
          $ss_prefix = $tbl_snapshot['uid'] . '_' . $wpdb->prefix;
          $diff_rows = $wpdb->get_results("SELECT {$wpdb->prefix}options.option_name, {$wpdb->prefix}options.option_value AS current_value, {$ss_prefix}options.option_value AS snapshot_value FROM {$wpdb->prefix}options LEFT JOIN {$ss_prefix}options ON {$ss_prefix}options.option_name = {$wpdb->prefix}options.option_name WHERE {$wpdb->prefix}options.option_value != {$ss_prefix}options.option_value LIMIT 100;");
          $only_current = $wpdb->get_results("SELECT {$wpdb->prefix}options.option_name, {$wpdb->prefix}options.option_value AS current_value, {$ss_prefix}options.option_value AS snapshot_value FROM {$wpdb->prefix}options LEFT JOIN {$ss_prefix}options ON {$ss_prefix}options.option_name = {$wpdb->prefix}options.option_name WHERE {$ss_prefix}options.option_value IS NULL LIMIT 100;");
          $only_snapshot = $wpdb->get_results("SELECT {$wpdb->prefix}options.option_name, {$wpdb->prefix}options.option_value AS current_value, {$ss_prefix}options.option_value AS snapshot_value FROM {$wpdb->prefix}options LEFT JOIN {$ss_prefix}options ON {$ss_prefix}options.option_name = {$wpdb->prefix}options.option_name WHERE {$wpdb->prefix}options.option_value IS NULL LIMIT 100;");
          $out2 .= '<table class="table_diff">';
          $out2 .= '<tr><td style="width: 100px;"><b>Option Name</b></td><td><b>Current Value</b></td><td><b>Snapshot Value</b></td></tr>';
          foreach ($diff_rows as $row) {
            $out2 .= '<tr>';
            $out2 .= '<td style="width: 100px;">' . $row->option_name . '</td>';
            $out2 .= '<td>' . (empty($row->current_value) ? '<i>empty</i>' : $row->current_value) . '</td>';
            $out2 .= '<td>' . (empty($row->snapshot_value) ? '<i>empty</i>' : $row->snapshot_value) . '</td>';
            $out2 .= '</tr>';
          } // foreach
          foreach ($only_current as $row) {
            $out2 .= '<tr>';
            $out2 .= '<td style="width: 100px;">' . $row->option_name . '</td>';
            $out2 .= '<td>' . (empty($row->current_value) ? '<i>empty</i>' : $row->current_value) . '</td>';
            $out2 .= '<td><i>not found in snapshot</i></td>';
            $out2 .= '</tr>';
          } // foreach
          foreach ($only_current as $row) {
            $out2 .= '<tr>';
            $out2 .= '<td style="width: 100px;">' . $row->option_name . '</td>';
            $out2 .= '<td><i>not found in current tables</i></td>';
            $out2 .= '<td>' . (empty($row->snapshot_value) ? '<i>empty</i>' : $row->snapshot_value) . '</td>';
            $out2 .= '</tr>';
          } // foreach
          $out2 .= '</table>';
        } else {
          $out2 .= '<p class="textcenter">Detailed data diff is not available for this table.</p>';
        }
        $out2 .= '</td>';
        $out2 .= '</tr>';

        $out2 .= '</table>';
        $out2 .= '</div>';
      }
    } // foreach in both

    return $out . $out2 . $out3;
  } // do_compare_snapshots


  /**
   * Generates a unique snapshot ID; verified non-existing
   *
   * @return string
   */
  function generate_snapshot_uid($length = 6)
  {
    global $wpdb;
    $snapshots = $this->get_snapshots();
    $cnt = 0;
    $uid = false;

    do {
      $cnt++;
      $uid = substr(str_shuffle(str_repeat('abcdefghijklmnopqrstuvwxyz', $length)), 0, $length);

      $verify_db = $wpdb->get_col($wpdb->prepare('SHOW TABLES LIKE %s', array('%' . $uid . '%')));
    } while (!empty($verify_db) && isset($snapshots[$uid]) && $cnt < 30);

    if ($cnt == 30) {
      $uid = false;
    }

    return $uid;
  } // generate_snapshot_uid


  // auto download / install / activate WP Force SSL plugin
  function install_wpfssl() {
    check_ajax_referer('install_wpfssl');

    if (false === current_user_can('manage_options')) {
      wp_die('Sorry, you have to be an admin to run this action.');
    }

    $plugin_slug = 'wp-force-ssl/wp-force-ssl.php';
    $plugin_zip = 'https://downloads.wordpress.org/plugin/wp-force-ssl.latest-stable.zip';

    @include_once ABSPATH . 'wp-admin/includes/plugin.php';
    @include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
    @include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
    @include_once ABSPATH . 'wp-admin/includes/file.php';
    @include_once ABSPATH . 'wp-admin/includes/misc.php';
		echo '<style>
		body{
			font-family: sans-serif;
			font-size: 14px;
			line-height: 1.5;
			color: #444;
		}
		</style>';

    echo '<div style="margin: 20px; color:#444;">';
    echo 'If things are not done in a minute <a target="_parent" href="' . esc_url(admin_url('plugin-install.php?s=force%20ssl%20webfactory&tab=search&type=term')) .'">install the plugin manually via Plugins page</a><br><br>';
    echo 'Starting ...<br><br>';

		wp_cache_flush();
    $upgrader = new Plugin_Upgrader();
    echo 'Check if WP Force SSL is already installed ... <br />';
    if ($this->is_plugin_installed($plugin_slug)) {
      echo 'WP Force SSL is already installed! <br /><br />Making sure it\'s the latest version.<br />';
      $upgrader->upgrade($plugin_slug);
      $installed = true;
    } else {
      echo 'Installing WP Force SSL.<br />';
      $installed = $upgrader->install($plugin_zip);
    }
    wp_cache_flush();

    if (!is_wp_error($installed) && $installed) {
      echo 'Activating WP Force SSL.<br />';
      $activate = activate_plugin($plugin_slug);

      if (is_null($activate)) {
        echo 'WP Force SSL Activated.<br />';

        echo '<script>setTimeout(function() { top.location = "tools.php?page=wp-reset"; }, 1000);</script>';
        echo '<br>If you are not redirected in a few seconds - <a href="tools.php?page=wp-reset" target="_parent">click here</a>.';
      }
    } else {
      echo 'Could not install WP Force SSL. You\'ll have to <a target="_parent" href="' . esc_url(admin_url('plugin-install.php?s=force%20ssl%20webfactory&tab=search&type=term')) .'">download and install manually</a>.';
    }

    echo '</div>';
  } // install_wpfssl


  /**
   * Clean up on uninstall; no action on deactive at the moment
   *
   * @return null
   */
  static function uninstall()
  {
    delete_option('wp-reset');
    delete_option('wp-reset-snapshots');
  } // uninstall


  /**
   * Disabled; we use singleton pattern so magic functions need to be disabled
   *
   * @return null
   */
  function __clone()
  {
  }


  /**
   * Disabled; we use singleton pattern so magic functions need to be disabled
   *
   * @return null
   */
  function __sleep()
  {
  }


  /**
   * Disabled; we use singleton pattern so magic functions need to be disabled
   *
   * @return null
   */
  function __wakeup()
  {
  }
} // WP_Reset class


// Create plugin instance and hook things up
// Only if in admin - plugin has no frontend functionality
if (is_admin() || WP_Reset::is_cli_running()) {
  global $wp_reset;
  $wp_reset = WP_Reset::getInstance();
  add_action('plugins_loaded', array($wp_reset, 'load_textdomain'));
  register_uninstall_hook(__FILE__, array('WP_Reset', 'uninstall'));
}
PK!.�S;<;<wp-reset-licensing.phpnu�[���<?php
/**
 * WebFactory Licensing Manager
 * (c) WebFactory Ltd
 * www.webfactoryltd.com
 */


if (false === class_exists('WF_Licensing')) {
  class WF_Licensing
  {
    public $prefix = '';
    private $licensing_servers = array();
    private $version = '';
    private $slug = '';
    private $basename = '';
    private $plugin_page = '';
    private $plugin_file = '';
    private $js_folder = '';
    protected $api_ver = 'v1/';
    protected $valid_forever = '2035-01-01';
    protected $unlimited_installs = 99999;
    public $debug = false;


    /**
     * Init licensing by setting up various params and hooking into actions.
     *
     * @param array $params Prefix, licensing_servers, version, plugin_file, skip_hooks
     *
     * @return void
     */
    function __construct($params)
    {
      $this->prefix = trim($params['prefix']);
      $this->licensing_servers = $params['licensing_servers'];
      $this->version = trim($params['version']);
      $this->slug = dirname(plugin_basename(trim($params['plugin_file'])));
      $this->basename = plugin_basename(trim($params['plugin_file']));
      $this->plugin_file = $params['plugin_file'];
      $this->plugin_page = trim($params['plugin_page']);
      $this->debug = !empty($params['debug']);

      if ($params['js_folder']) {
        $this->js_folder = trim($params['js_folder']);
      } else {
        $this->js_folder = plugin_dir_url($this->plugin_file) . 'js/';
      }

      if (empty($params['skip_hooks'])) {
        add_action('init', array($this, 'init'));

        add_action('wp_ajax_wf_licensing_' . $this->prefix . '_validate', array($this, 'validate_ajax'));
        add_action('wp_ajax_wf_licensing_' . $this->prefix . '_save', array($this, 'save_ajax'));
        add_action('wp_ajax_wf_licensing_' . $this->prefix . '_deactivate', array($this, 'deactivate_ajax'));
      }

      $this->log('__construct', $params, get_object_vars($this));
    } // __construct


    /**
     * Actions performed on WP init action.
     *
     * @return void
     */
    function init()
    {
      if (is_admin()) {
        add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
      }
    } // init


    function admin_enqueue_scripts() {
      $current_screen = get_current_screen();

      if (empty($current_screen->id) || $current_screen->id != $this->plugin_page) {
        return false;
      }

      $vars = array(
        'prefix' => $this->prefix,
        'debug' => $this->debug,
        'nonce' => wp_create_nonce('wf_licensing_' . $this->prefix),
        'licensing_endpoint' => $this->licensing_servers[0] . $this->api_ver,
        'request_data' => array(
          'action' => 'validate_license',
          'license_key' => '',
          'rand' => rand(1000, 9999),
          'version' => $this->version,
          'wp_version' => get_bloginfo('version'),
          'site_url' => get_home_url(),
          'site_title' => get_bloginfo('name'),
          'meta' => array()
        )
      );

      wp_enqueue_script('wf_licensing', $this->js_folder . 'wf-licensing.js', array(), 1.0, true);
      wp_localize_script('wf_licensing', 'wf_licensing_' . $this->prefix, $vars);
    } // admin_enqueue_scripts


    /**
     * Log message if debugging is enabled.
     * Log file: /wp-content/wf-licensing.log
     *
     * @param string $message Message to write to log.
     * @param mixed $data Optional, extra data to write to debug log.
     *
     * @return void
     */
    function log($message, ...$data)
    {
      if (!$this->debug) {
        return;
      }

      $log_file = trailingslashit(WP_CONTENT_DIR) . 'wf-licensing.log';
      $fp = fopen($log_file, 'a+');

      fputs($fp, '[' . date('r') . '] ' . $this->prefix . ': ');
      fputs($fp, (string) $message . PHP_EOL);
      foreach ($data as $tmp) {
        fputs($fp, var_export($tmp, true) . PHP_EOL);
      }

      fputs($fp, PHP_EOL);
      fclose($fp);
    } // log


    /**
     * Fetches license details from the database.
     *
     * @param string $key If set returns only requested options key.
     *
     * @return string
     */
    function get_license($key = '')
    {
      $default = array(
        'license_key' => '',
        'error' => '',
        'valid_until' => '',
        'last_check' => 0,
        'name' => '',
        'meta' => array()
      );

      $options = get_option('wf_licensing_' . $this->prefix, array());
      $options = array_merge($default, $options);

      if (!empty($key)) {
        return $options[$key];
      } else {
        return $options;
      }
    } // get_license


    function get_license_formatted($key = '')
    {
      $license = $this->get_license();
      $out = array(
        'name' => '',
        'name_long' => '',
        'valid_until' => '',
        'expires' => '',
        'license_key' => '',
        'license_key_hidden' => '',
        'recurring' => false,
        'keyless' => false,
      );

      if (!$this->is_active()) {
        return $out;
      }
      $license['valid_until'] = $license['valid_until'];

      $out['name'] = $license['name'];
      $out['name_long'] = $license['name'];
      if ($license['meta']) {
        $tmp = '';
        foreach ($license['meta'] as $meta => $meta_value) {

          if ($meta[0] == '_' || filter_var($meta_value, FILTER_VALIDATE_BOOLEAN) != true) {
            continue;
          }
          $meta = str_replace('_', ' ', $meta);
          $meta = ucwords($meta);
          $meta = str_ireplace('wpr ', 'WPR ', $meta);
          $tmp .= $meta . ', ';
        }
        $tmp = trim($tmp, ', ');
        if ($tmp) {
          $out['name_long'] .= ' with ' . $tmp;
        }
      }

      if ($license['valid_until'] == $this->valid_forever) {
        $out['valid_until'] = 'forever';
        $out['recurring'] = false;
      } else {
        $out['valid_until'] = 'until ' . date(get_option('date_format'), strtotime($license['valid_until']));
        $out['recurring'] = true;
      }

      if (date('Y-m-d') == $license['valid_until']) {
        $out['expires'] = 'today';
      } elseif (date('Y-m-d', time() + 30 * DAY_IN_SECONDS) > $license['valid_until']) {
        $tmp = (strtotime($license['valid_until'] . date(' G:i:s')) - time()) / DAY_IN_SECONDS;
        $out['expires'] = 'in ' . round($tmp) . ' days';
      } else {
        $out['expires'] = 'in more than 30 days';
      }

      if (empty($license['license_key']) || $license['license_key'] == 'keyless') {
        $out['keyless'] = true;
      } else {
        $out['keyless'] = false;
        $out['license_key'] = $license['license_key'];
        $tmp = strlen($license['license_key']);
        $dash = false;
        $new = '';
        for ($i = $tmp - 1; $i >= 0; $i--) {
          if ($dash == false || $out['license_key'][$i] == '-') {
            $new = $out['license_key'][$i] . $new;
          } else {
            $new = '*' . $new;
          }
          if ($out['license_key'][$i] == '-') {
            $dash = true;
          }
        }
        $out['license_key_hidden'] = $new;
      }

      $out = apply_filters('wf_licensing_license_formatted_' . $this->prefix, $out);

      if (!empty($key)) {
        return $out[$key];
      } else {
        return $out;
      }
    } // get_license_formatted


    /**
     * Updates license details in the database.
     *
     * @param string $data License data to save; or empty to delete license
     *
     * @return bool
     */
    function update_license($data = false)
    {
      if (false === $data) {
        $tmp = delete_option('wf_licensing_' . $this->prefix);
      } else {
        $tmp = update_option('wf_licensing_' . $this->prefix, $data);
      }

      return $tmp;
    } // update_license


    /**
     * Check if license is valid
     *
     * @param string $feature If set it checks for a specific feature.
     * @param bool $force_check Forces license recheck on server instead of just cached values.
     *
     * @return boolean
     */
    function is_active($feature = '', $force_check = false)
    {
      $last_check = $this->get_license('last_check');
      if ($force_check || ($last_check && ($last_check + HOUR_IN_SECONDS * 8) < time())) {
        $this->log('auto recheck license');
        $this->validate();
      }

      $license = $this->get_license();

      if (
        !empty($license['license_key']) && !empty($license['name']) &&
        !empty($license['valid_until']) && $license['valid_until'] >= date('Y-m-d')
      ) {
        if (!empty($feature)) {
          if (!empty($license['meta'][$feature]) && filter_var($license['meta'][$feature], FILTER_VALIDATE_BOOLEAN) == true) {
            return true;
          } else {
            return false;
          }
        } else {
          return true;
        }
      } else {
        return false;
      }
    } // is_active


    /**
     * Use when uninstalling (deleting) the plugin to clean up.
     *
     * @param string $prefix Same prefix as used when initialising the class.
     * @return bool
     */
    static function uninstall_plugin($prefix)
    {
      $tmp = delete_option('wf_licensing_' . $prefix);

      return $tmp;
    } // uninstall_plugin


    /**
     * Deletes license locally and send deactivate ping to licensing server
     *
     * @return void
     */
    function deactivate() {
      $result = $this->query_licensing_server('deactivate_license', array());
      $this->update_license(false);

      return $result;
    } // deactivate


    /**
     * Validate license key on server and save response.
     *
     * @param string $license_key License key, or leave empty to pull from saved.
     *
     * @return void
     */
    function validate($license_key = '')
    {
      $license = $this->get_license();
      if (empty($license_key)) {
        $license_key = $license['license_key'];
      }

      $out = array(
        'license_key' => $license_key,
        'error' => '',
        'name' => '',
        'last_check' => 0,
        'valid_until' => '',
        'meta' => array()
      );

      $result = $this->query_licensing_server('validate_license', array('license_key' => $license_key));

      if (is_wp_error($result)) {
        $out['error'] = 'Error querying licensing server. ' .  $result->get_error_message() . ' Please try again in a few moments.';
        $this->update_license($out);

        return false;
      } elseif (!is_array($result) || !isset($result['success'])) {
        $out['error'] = 'Invalid response from licensing server. Please try again in a few moments.';
        $this->update_license($out);

        return false;
      } elseif ($result['success'] == false) {
        $out['error'] = $result['data'];
        $this->update_license($out);

        return true;
      } else {
        $out['error'] = $result['data']['error'];
        $out['name'] = $result['data']['name'];
        $out['valid_until'] = $result['data']['valid_until'];
        $out['meta'] = $result['data']['meta'];
        $out['last_check'] = time();
        $this->update_license($out);

        return true;
      }
    } // validate


    function validate_ajax()
    {
      check_ajax_referer('wf_licensing_' . $this->prefix);
      
      if (false === current_user_can('manage_options')) {
        wp_die('Sorry, you have to be an admin to run this action.');
      }

      $license_key = sanitize_text_field($_REQUEST['license_key']);
      $license_key = trim(substr($license_key, 0, 64));
      if (empty($license_key)) {
        $this->update_license(false);
        do_action('wf_licensing_' . $this->prefix . '_validate_ajax', $license_key, false);

        wp_send_json_success();
      } else {
        $result = $this->validate($license_key);
        $license = $this->get_license();
        do_action('wf_licensing_' . $this->prefix . '_validate_ajax', $license_key, $result);

        if ($result == true) {
          wp_send_json_success($result);
        } else {
          wp_send_json_error($license);
        }
      }
    } // validate_ajax


    function deactivate_ajax()
    {
      check_ajax_referer('wf_licensing_' . $this->prefix);

      if (false === current_user_can('manage_options')) {
        wp_die('Sorry, you have to be an admin to run this action.');
      }
      
      $old_license = $this->get_license();
      $result = $this->deactivate();
      do_action('wf_licensing_' . $this->prefix . '_deactivate_ajax', $old_license, $result);
      wp_send_json_success($result);
    } // deactivate_ajax


    function save_ajax()
    {
      check_ajax_referer('wf_licensing_' . $this->prefix);

      if (false === current_user_can('manage_options')) {
        wp_die('Sorry, you have to be an admin to run this action.');
      }

      $license_key = sanitize_text_field($_POST['license_key']);
      $license_key = trim(substr($license_key, 0, 64));
      $out['license_key'] = $license_key;

      if (sanitize_text_field($_POST['success']) == 'true') {
        $out['error'] = sanitize_text_field($_POST['data']['error']);
        $out['name'] = sanitize_text_field($_POST['data']['name']);
        $out['valid_until'] = sanitize_text_field($_POST['data']['valid_until']);
        $out['meta'] = sanitize_text_field($_POST['data']['meta']);
      } else {
        $out['error'] = sanitize_text_field($_POST['data']);
        $out['name'] = '';
        $out['valid_until'] = '';
        $out['meta'] = array();
      }
      $out['last_check'] = time();

      $this->update_license($out);
      do_action('wf_licensing_' . $this->prefix . '_save_ajax', $out);

      wp_send_json_success();
    } // save_ajax


    /**
     * Run license server query.
     *
     * @param string $action
     * @param array $data
     *
     * @return string response|bool
     */
    function query_licensing_server($action, $data = array())
    {
      $license = $this->get_license();

      $request_params = array('sslverify' => false, 'timeout' => 25, 'redirection' => 2);
      $default_data = array(
        'action' => '',
        'license_key' => $license['license_key'],
        'rand' => rand(1000, 9999),
        'version' => $this->version,
        'wp_version' => get_bloginfo('version'),
        'site_url' => get_home_url(),
        'site_title' => get_bloginfo('name'),
        'meta' => array()
      );

      $request_data = array_merge($default_data, $data, array('action' => $action));
      $request_data = apply_filters('wf_licensing_query_server_data', $request_data);
      array_walk_recursive($request_data, function (&$val, $ind) {
        $val = rawurlencode($val);
      });

      $this->log('query licensing server', $request_data);

      $url = rtrim(add_query_arg($request_data, trailingslashit($this->licensing_servers[0] . $this->api_ver)), '&');
      $response = wp_remote_get($url, $request_params);
      $body = wp_remote_retrieve_body($response);
      $result = @json_decode($body, true);

      $this->log('licensing server response', $response);

      if (is_wp_error($response) || empty($body) || !is_array($result) || !isset($result['success'])) {
        if (is_wp_error($response)) {
          return $response;
        } else {
          return new WP_Error(1, 'Invalid server response format.');
        }
      } else {
        return $result;
      }
    } // query_licensing_server
  } // WF_Licensing
} // if WF_Licensing
PK!8ĸ��
libs/diff.phpnu�[���<?php
/**
 * Diff
 *
 * A comprehensive library for generating differences between two strings
 * in multiple formats (unified, side by side HTML etc)
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package Diff
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

class WPR_Diff
{
	/**
	 * @var array The "old" sequence to use as the basis for the comparison.
	 */
	private $a = null;

	/**
	 * @var array The "new" sequence to generate the changes for.
	 */
	private $b = null;

	/**
	 * @var array Array containing the generated opcodes for the differences between the two items.
	 */
	private $groupedCodes = null;

	/**
	 * @var array Associative array of the default options available for the diff class and their default value.
	 */
	private $defaultOptions = array(
		'context' => 3,
		'ignoreNewLines' => false,
		'ignoreWhitespace' => false,
		'ignoreCase' => false
	);

	/**
	 * @var array Array of the options that have been applied for generating the diff.
	 */
	private $options = array();

	/**
	 * The constructor.
	 *
	 * @param array $a Array containing the lines of the first string to compare.
	 * @param array $b Array containing the lines for the second string to compare.
	 */
	public function __construct($a, $b, $options=array())
	{
		$this->a = $a;
		$this->b = $b;

		if (is_array($options))
			$this->options = array_merge($this->defaultOptions, $options);
		else
			$this->options = $this->defaultOptions;
	}

	/**
	 * Render a diff using the supplied rendering class and return it.
	 *
	 * @param object $renderer An instance of the rendering object to use for generating the diff.
	 * @return mixed The generated diff. Exact return value depends on the rendered.
	 */
	public function render(WPR_Diff_Renderer_Html_SideBySide $renderer)
	{
		$renderer->diff = $this;
		return $renderer->render();
	}

	/**
	 * Get a range of lines from $start to $end from the first comparison string
	 * and return them as an array. If no values are supplied, the entire string
	 * is returned. It's also possible to specify just one line to return only
	 * that line.
	 *
	 * @param int $start The starting number.
	 * @param int $end The ending number. If not supplied, only the item in $start will be returned.
	 * @return array Array of all of the lines between the specified range.
	 */
	public function getA($start=0, $end=null)
	{
		if($start == 0 && $end === null) {
			return $this->a;
		}

		if($end === null) {
			$length = 1;
		}
		else {
			$length = $end - $start;
		}

		return array_slice($this->a, $start, $length);

	}

	/**
	 * Get a range of lines from $start to $end from the second comparison string
	 * and return them as an array. If no values are supplied, the entire string
	 * is returned. It's also possible to specify just one line to return only
	 * that line.
	 *
	 * @param int $start The starting number.
	 * @param int $end The ending number. If not supplied, only the item in $start will be returned.
	 * @return array Array of all of the lines between the specified range.
	 */
	public function getB($start=0, $end=null)
	{
		if($start == 0 && $end === null) {
			return $this->b;
		}

		if($end === null) {
			$length = 1;
		}
		else {
			$length = $end - $start;
		}

		return array_slice($this->b, $start, $length);
	}

	/**
	 * Generate a list of the compiled and grouped opcodes for the differences between the
	 * two strings. Generally called by the renderer, this class instantiates the sequence
	 * matcher and performs the actual diff generation and return an array of the opcodes
	 * for it. Once generated, the results are cached in the diff class instance.
	 *
	 * @return array Array of the grouped opcodes for the generated diff.
	 */
	public function getGroupedOpcodes()
	{
		if(!is_null($this->groupedCodes)) {
			return $this->groupedCodes;
		}

		require_once dirname(__FILE__).'/diff/SequenceMatcher.php';
		$sequenceMatcher = new WPR_Diff_SequenceMatcher($this->a, $this->b, null, $this->options);
		$this->groupedCodes = $sequenceMatcher->getGroupedOpcodes($this->options['context']);
		return $this->groupedCodes;
	}
}
PK!�libs/index.phpnu�[���<?php
// Silence is golden
PK!V<�;??libs/diff/Renderer/Abstract.phpnu�[���<?php
/**
 * Abstract class for diff renderers in PHP DiffLib.
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software 
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package DiffLib
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

abstract class WPR_Diff_Renderer_Abstract
{
	/**
	 * @var object Instance of the diff class that this renderer is generating the rendered diff for.
	 */
	public $diff;

	/**
	 * @var array Array of the default options that apply to this renderer.
	 */
	protected $defaultOptions = array();

	/**
	 * @var array Array containing the user applied and merged default options for the renderer.
	 */
	protected $options = array();

	/**
	 * The constructor. Instantiates the rendering engine and if options are passed,
	 * sets the options for the renderer.
	 *
	 * @param array $options Optionally, an array of the options for the renderer.
	 */
	public function __construct(array $options = array())
	{
		$this->setOptions($options);
	}

	/**
	 * Set the options of the renderer to those supplied in the passed in array.
	 * Options are merged with the default to ensure that there aren't any missing
	 * options.
	 *
	 * @param array $options Array of options to set.
	 */
	public function setOptions(array $options)
	{
		$this->options = array_merge($this->defaultOptions, $options);
	}
}PK!a��}��"libs/diff/Renderer/Html/Inline.phpnu�[���<?php
/**
 * Inline HTML diff generator for PHP DiffLib.
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software 
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package DiffLib
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

require_once dirname(__FILE__).'/Array.php';

class WPR_Diff_Renderer_Html_Inline extends WPR_Diff_Renderer_Html_Array
{
	/**
	 * Render a and return diff with changes between the two sequences
	 * displayed inline (under each other)
	 *
	 * @return string The generated inline diff.
	 */
	public function render()
	{
		$changes = parent::render();
		$html = '';
		if(empty($changes)) {
			return $html;
		}

		$html .= '<table class="Differences DifferencesInline">';
		$html .= '<thead>';
		$html .= '<tr>';
		$html .= '<th>Old</th>';
		$html .= '<th>New</th>';
		$html .= '<th>Differences</th>';
		$html .= '</tr>';
		$html .= '</thead>';
		foreach($changes as $i => $blocks) {
			// If this is a separate block, we're condensing code so output ...,
			// indicating a significant portion of the code has been collapsed as
			// it is the same
			if($i > 0) {
				$html .= '<tbody class="Skipped">';
				$html .= '<th>&hellip;</th>';
				$html .= '<th>&hellip;</th>';
				$html .= '<td>&nbsp;</td>';
				$html .= '</tbody>';
			}

			foreach($blocks as $change) {
				$html .= '<tbody class="Change'.ucfirst($change['tag']).'">';
				// Equal changes should be shown on both sides of the diff
				if($change['tag'] == 'equal') {
					foreach($change['base']['lines'] as $no => $line) {
						$fromLine = $change['base']['offset'] + $no + 1;
						$toLine = $change['changed']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>'.$fromLine.'</th>';
						$html .= '<th>'.$toLine.'</th>';
						$html .= '<td class="Left">'.$line.'</td>';
						$html .= '</tr>';
					}
				}
				// Added lines only on the right side
				else if($change['tag'] == 'insert') {
					foreach($change['changed']['lines'] as $no => $line) {
						$toLine = $change['changed']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>&nbsp;</th>';
						$html .= '<th>'.$toLine.'</th>';
						$html .= '<td class="Right"><ins>'.$line.'</ins>&nbsp;</td>';
						$html .= '</tr>';
					}
				}
				// Show deleted lines only on the left side
				else if($change['tag'] == 'delete') {
					foreach($change['base']['lines'] as $no => $line) {
						$fromLine = $change['base']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>'.$fromLine.'</th>';
						$html .= '<th>&nbsp;</th>';
						$html .= '<td class="Left"><del>'.$line.'</del>&nbsp;</td>';
						$html .= '</tr>';
					}
				}
				// Show modified lines on both sides
				else if($change['tag'] == 'replace') {
					foreach($change['base']['lines'] as $no => $line) {
						$fromLine = $change['base']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>'.$fromLine.'</th>';
						$html .= '<th>&nbsp;</th>';
						$html .= '<td class="Left"><span>'.$line.'</span></td>';
						$html .= '</tr>';
					}

					foreach($change['changed']['lines'] as $no => $line) {
						$toLine = $change['changed']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>&nbsp;</th>';
						$html .= '<th>'.$toLine.'</th>';
						$html .= '<td class="Right"><span>'.$line.'</span></td>';
						$html .= '</tr>';
					}
				}
				$html .= '</tbody>';
			}
		}
		$html .= '</table>';
		return $html;
	}
}
PK!�<�!libs/diff/Renderer/Html/Array.phpnu�[���<?php
/**
 * Base renderer for rendering HTML based diffs for PHP DiffLib.
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software 
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package DiffLib
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

require_once dirname(__FILE__).'/../Abstract.php';

class WPR_Diff_Renderer_Html_Array extends WPR_Diff_Renderer_Abstract
{
	/**
	 * @var array Array of the default options that apply to this renderer.
	 */
	protected $defaultOptions = array(
		'tabSize' => 4
	);

	/**
	 * Render and return an array structure suitable for generating HTML
	 * based differences. Generally called by subclasses that generate a
	 * HTML based diff and return an array of the changes to show in the diff.
	 *
	 * @return array An array of the generated chances, suitable for presentation in HTML.
	 */
	public function render()
	{
		// As we'll be modifying a & b to include our change markers,
		// we need to get the contents and store them here. That way
		// we're not going to destroy the original data
		$a = $this->diff->getA();
		$b = $this->diff->getB();

		$changes = array();
		$opCodes = $this->diff->getGroupedOpcodes();
		foreach($opCodes as $group) {
			$blocks = array();
			$lastTag = null;
			$lastBlock = 0;
			foreach($group as $code) {
				list($tag, $i1, $i2, $j1, $j2) = $code;

				if($tag == 'replace' && $i2 - $i1 == $j2 - $j1) {
					for($i = 0; $i < ($i2 - $i1); ++$i) {
						$fromLine = $a[$i1 + $i];
						$toLine = $b[$j1 + $i];

						list($start, $end) = $this->getChangeExtent($fromLine, $toLine);
						if($start != 0 || $end != 0) {
							$last = $end + strlen($fromLine);
							$fromLine = substr_replace($fromLine, "\0", $start, 0);
							$fromLine = substr_replace($fromLine, "\1", $last + 1, 0);
							$last = $end + strlen($toLine);
							$toLine = substr_replace($toLine, "\0", $start, 0);
							$toLine = substr_replace($toLine, "\1", $last + 1, 0);
							$a[$i1 + $i] = $fromLine;
							$b[$j1 + $i] = $toLine;
						}
					}
				}

				if($tag != $lastTag) {
					$blocks[] = array(
						'tag' => $tag,
						'base' => array(
							'offset' => $i1,
							'lines' => array()
						),
						'changed' => array(
							'offset' => $j1,
							'lines' => array()
						)
					);
					$lastBlock = count($blocks)-1;
				}

				$lastTag = $tag;

				if($tag == 'equal') {
					$lines = array_slice($a, $i1, ($i2 - $i1));
					$blocks[$lastBlock]['base']['lines'] += $this->formatLines($lines);
					$lines = array_slice($b, $j1, ($j2 - $j1));
					$blocks[$lastBlock]['changed']['lines'] +=  $this->formatLines($lines);
				}
				else {
					if($tag == 'replace' || $tag == 'delete') {
						$lines = array_slice($a, $i1, ($i2 - $i1));
						$lines = $this->formatLines($lines);
						$lines = str_replace(array("\0", "\1"), array('<del>', '</del>'), $lines);
						$blocks[$lastBlock]['base']['lines'] += $lines;
					}

					if($tag == 'replace' || $tag == 'insert') {
						$lines = array_slice($b, $j1, ($j2 - $j1));
						$lines =  $this->formatLines($lines);
						$lines = str_replace(array("\0", "\1"), array('<ins>', '</ins>'), $lines);
						$blocks[$lastBlock]['changed']['lines'] += $lines;
					}
				}
			}
			$changes[] = $blocks;
		}
		return $changes;
	}

	/**
	 * Given two strings, determine where the changes in the two strings
	 * begin, and where the changes in the two strings end.
	 *
	 * @param string $fromLine The first string.
	 * @param string $toLine The second string.
	 * @return array Array containing the starting position (0 by default) and the ending position (-1 by default)
	 */
	private function getChangeExtent($fromLine, $toLine)
	{
		$start = 0;
		$limit = min(strlen($fromLine), strlen($toLine));
		while($start < $limit && $fromLine{$start} == $toLine{$start}) {
			++$start;
		}
		$end = -1;
		$limit = $limit - $start;
		while(-$end <= $limit && substr($fromLine, $end, 1) == substr($toLine, $end, 1)) {
			--$end;
		}
		return array(
			$start,
			$end + 1
		);
	}

	/**
	 * Format a series of lines suitable for output in a HTML rendered diff.
	 * This involves replacing tab characters with spaces, making the HTML safe
	 * for output, ensuring that double spaces are replaced with &nbsp; etc.
	 *
	 * @param array $lines Array of lines to format.
	 * @return array Array of the formatted lines.
	 */
	protected function formatLines($lines)
	{
		$lines = array_map(array($this, 'ExpandTabs'), $lines);
		$lines = array_map(array($this, 'HtmlSafe'), $lines);
		foreach($lines as &$line) {
			$line = preg_replace_callback('# ( +)|^ #', array($this, 'fixSpaces'), $line);
		}
		return $lines;
	}

	/**
	 * Replace a string containing spaces with a HTML representation using &nbsp;.
	 *
	 * @param string[] $matches Array with preg matches.
	 * @return string The HTML representation of the string.
	 */
	private function fixSpaces(array $matches)
	{
		$spaces = $matches[1];
		$count = strlen($spaces);
		if($count == 0) {
			return '';
		}

		$div = floor($count / 2);
		$mod = $count % 2;
		return str_repeat('&nbsp; ', $div).str_repeat('&nbsp;', $mod);
	}

	/**
	 * Replace tabs in a single line with a number of spaces as defined by the tabSize option.
	 *
	 * @param string $line The containing tabs to convert.
	 * @return string The line with the tabs converted to spaces.
	 */
	private function expandTabs($line)
	{
		return str_replace("\t", str_repeat(' ', $this->options['tabSize']), $line);
	}

	/**
	 * Make a string containing HTML safe for output on a page.
	 *
	 * @param string $string The string.
	 * @return string The string with the HTML characters replaced by entities.
	 */
	private function htmlSafe($string)
	{
		return htmlspecialchars($string, ENT_NOQUOTES, 'UTF-8');
	}
}
PK!�M��&libs/diff/Renderer/Html/SideBySide.phpnu�[���<?php
/**
 * Side by Side HTML diff generator for PHP DiffLib.
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software 
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package DiffLib
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

require_once dirname(__FILE__).'/Array.php';

class WPR_Diff_Renderer_Html_SideBySide extends WPR_Diff_Renderer_Html_Array
{
	/**
	 * Render a and return diff with changes between the two sequences
	 * displayed side by side.
	 *
	 * @return string The generated side by side diff.
	 */
	public function render()
	{
		$changes = parent::render();

		$html = '';
		if(empty($changes)) {
			return $html;
		}

		$html .= '<table class="Differences DifferencesSideBySide">';
		//$html .= '<thead>';
		//$html .= '<tr>';
		//$html .= '<th colspan="2">Old Version</th>';
		//$html .= '<th colspan="2">New Version</th>';
		//$html .= '</tr>';
		//$html .= '</thead>';
		foreach($changes as $i => $blocks) {
			if($i > 0) {
				$html .= '<tbody class="Skipped">';
				$html .= '<th>&hellip;</th><td>&nbsp;</td>';
				$html .= '<th>&hellip;</th><td>&nbsp;</td>';
				$html .= '</tbody>';
			}

			foreach($blocks as $change) {
				$html .= '<tbody class="Change'.ucfirst($change['tag']).'">';
				// Equal changes should be shown on both sides of the diff
				if($change['tag'] == 'equal') {
					foreach($change['base']['lines'] as $no => $line) {
						$fromLine = $change['base']['offset'] + $no + 1;
						$toLine = $change['changed']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>'.$fromLine.'</th>';
						$html .= '<td class="Left"><span>'.$line.'</span>&nbsp;</span></td>';
						$html .= '<th>'.$toLine.'</th>';
						$html .= '<td class="Right"><span>'.$line.'</span>&nbsp;</span></td>';
						$html .= '</tr>';
					}
				}
				// Added lines only on the right side
				else if($change['tag'] == 'insert') {
					foreach($change['changed']['lines'] as $no => $line) {
						$toLine = $change['changed']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>&nbsp;</th>';
						$html .= '<td class="Left">&nbsp;</td>';
						$html .= '<th>'.$toLine.'</th>';
						$html .= '<td class="Right"><ins>'.$line.'</ins>&nbsp;</td>';
						$html .= '</tr>';
					}
				}
				// Show deleted lines only on the left side
				else if($change['tag'] == 'delete') {
					foreach($change['base']['lines'] as $no => $line) {
						$fromLine = $change['base']['offset'] + $no + 1;
						$html .= '<tr>';
						$html .= '<th>'.$fromLine.'</th>';
						$html .= '<td class="Left"><del>'.$line.'</del>&nbsp;</td>';
						$html .= '<th>&nbsp;</th>';
						$html .= '<td class="Right">&nbsp;</td>';
						$html .= '</tr>';
					}
				}
				// Show modified lines on both sides
				else if($change['tag'] == 'replace') {
					if(count($change['base']['lines']) >= count($change['changed']['lines'])) {
						foreach($change['base']['lines'] as $no => $line) {
							$fromLine = $change['base']['offset'] + $no + 1;
							$html .= '<tr>';
							$html .= '<th>'.$fromLine.'</th>';
							$html .= '<td class="Left"><span>'.$line.'</span>&nbsp;</td>';
							if(!isset($change['changed']['lines'][$no])) {
								$toLine = '&nbsp;';
								$changedLine = '&nbsp;';
							}
							else {
								$toLine = $change['base']['offset'] + $no + 1;
								$changedLine = '<span>'.$change['changed']['lines'][$no].'</span>';
							}
							$html .= '<th>'.$toLine.'</th>';
							$html .= '<td class="Right">'.$changedLine.'</td>';
							$html .= '</tr>';
						}
					}
					else {
						foreach($change['changed']['lines'] as $no => $changedLine) {
							if(!isset($change['base']['lines'][$no])) {
								$fromLine = '&nbsp;';
								$line = '&nbsp;';
							}
							else {
								$fromLine = $change['base']['offset'] + $no + 1;
								$line = '<span>'.$change['base']['lines'][$no].'</span>';
							}
							$html .= '<tr>';
							$html .= '<th>'.$fromLine.'</th>';
							$html .= '<td class="Left"><span>'.$line.'</span>&nbsp;</td>';
							$toLine = $change['changed']['offset'] + $no + 1;
							$html .= '<th>'.$toLine.'</th>';
							$html .= '<td class="Right">'.$changedLine.'</td>';
							$html .= '</tr>';
						}
					}
				}
				$html .= '</tbody>';
			}
		}
		$html .= '</table>';
		return $html;
	}
}PK!�"����#libs/diff/Renderer/Text/Context.phpnu�[���<?php
/**
 * Context diff generator for PHP DiffLib.
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software 
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package DiffLib
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

require_once dirname(__FILE__).'/../Abstract.php';

class WPR_Diff_Renderer_Text_Context extends WPR_Diff_Renderer_Abstract
{
	/**
	 * @var array Array of the different opcode tags and how they map to the context diff equivalent.
	 */
	private $tagMap = array(
		'insert' => '+',
		'delete' => '-',
		'replace' => '!',
		'equal' => ' '
	);

	/**
	 * Render and return a context formatted (old school!) diff file.
	 *
	 * @return string The generated context diff.
	 */
	public function render()
	{
		$diff = '';
		$opCodes = $this->diff->getGroupedOpcodes();
		foreach($opCodes as $group) {
			$diff .= "***************\n";
			$lastItem = count($group)-1;
			$i1 = $group[0][1];
			$i2 = $group[$lastItem][2];
			$j1 = $group[0][3];
			$j2 = $group[$lastItem][4];

			if($i2 - $i1 >= 2) {
				$diff .= '*** '.($group[0][1] + 1).','.$i2." ****\n";
			}
			else {
				$diff .= '*** '.$i2." ****\n";
			}

			if($j2 - $j1 >= 2) {
				$separator = '--- '.($j1 + 1).','.$j2." ----\n";
			}
			else {
				$separator = '--- '.$j2." ----\n";
			}

			$hasVisible = false;
			foreach($group as $code) {
				if($code[0] == 'replace' || $code[0] == 'delete') {
					$hasVisible = true;
					break;
				}
			}

			if($hasVisible) {
				foreach($group as $code) {
					list($tag, $i1, $i2, $j1, $j2) = $code;
					if($tag == 'insert') {
						continue;
					}
					$diff .= $this->tagMap[$tag].' '.implode("\n".$this->tagMap[$tag].' ', $this->diff->GetA($i1, $i2))."\n";
				}
			}

			$hasVisible = false;
			foreach($group as $code) {
				if($code[0] == 'replace' || $code[0] == 'insert') {
					$hasVisible = true;
					break;
				}
			}

			$diff .= $separator;

			if($hasVisible) {
				foreach($group as $code) {
					list($tag, $i1, $i2, $j1, $j2) = $code;
					if($tag == 'delete') {
						continue;
					}
					$diff .= $this->tagMap[$tag].' '.implode("\n".$this->tagMap[$tag].' ', $this->diff->GetB($j1, $j2))."\n";
				}
			}
		}
		return $diff;
	}
}PK!�ߤ�EE#libs/diff/Renderer/Text/Unified.phpnu�[���<?php
/**
 * Unified diff generator for PHP DiffLib.
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software 
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package DiffLib
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

require_once dirname(__FILE__).'/../Abstract.php';

class WPR_Diff_Renderer_Text_Unified extends WPR_Diff_Renderer_Abstract
{
	/**
	 * Render and return a unified diff.
	 *
	 * @return string The unified diff.
	 */
	public function render()
	{
		$diff = '';
		$opCodes = $this->diff->getGroupedOpcodes();
		foreach($opCodes as $group) {
			$lastItem = count($group)-1;
			$i1 = $group[0][1];
			$i2 = $group[$lastItem][2];
			$j1 = $group[0][3];
			$j2 = $group[$lastItem][4];

			if($i1 == 0 && $i2 == 0) {
				$i1 = -1;
				$i2 = -1;
			}

			$diff .= '@@ -'.($i1 + 1).','.($i2 - $i1).' +'.($j1 + 1).','.($j2 - $j1)." @@\n";
			foreach($group as $code) {
				list($tag, $i1, $i2, $j1, $j2) = $code;
				if($tag == 'equal') {
					$diff .= ' '.implode("\n ", $this->diff->GetA($i1, $i2))."\n";
				}
				else {
					if($tag == 'replace' || $tag == 'delete') {
						$diff .= '-'.implode("\n-", $this->diff->GetA($i1, $i2))."\n";
					}

					if($tag == 'replace' || $tag == 'insert') {
						$diff .= '+'.implode("\n+", $this->diff->GetB($j1, $j2))."\n";
					}
				}
			}
		}
		return $diff;
	}
}PK!��%�HMHMlibs/diff/SequenceMatcher.phpnu�[���<?php
/**
 * Sequence matcher for Diff
 *
 * PHP version 5
 *
 * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com>
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the Chris Boulton nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package Diff
 * @author Chris Boulton <chris.boulton@interspire.com>
 * @copyright (c) 2009 Chris Boulton
 * @license New BSD License http://www.opensource.org/licenses/bsd-license.php
 * @version 1.1
 * @link http://github.com/chrisboulton/php-diff
 */

class WPR_Diff_SequenceMatcher
{
	/**
	 * @var string|array Either a string or an array containing a callback function to determine if a line is "junk" or not.
	 */
	private $junkCallback = null;

	/**
	 * @var array The first sequence to compare against.
	 */
	private $a = null;

	/**
	 * @var array The second sequence.
	 */
	private $b = null;

	/**
	 * @var array Array of characters that are considered junk from the second sequence. Characters are the array key.
	 */
	private $junkDict = array();

	/**
	 * @var array Array of indices that do not contain junk elements.
	 */
	private $b2j = array();

	private $options = array();

	private $defaultOptions = array(
		'ignoreNewLines' => false,
		'ignoreWhitespace' => false,
		'ignoreCase' => false
	);

	/**
	 * The constructor. With the sequences being passed, they'll be set for the
	 * sequence matcher and it will perform a basic cleanup & calculate junk
	 * elements.
	 *
	 * @param string|array $a A string or array containing the lines to compare against.
	 * @param string|array $b A string or array containing the lines to compare.
	 * @param string|array $junkCallback Either an array or string that references a callback function (if there is one) to determine 'junk' characters.
	 */
	public function __construct($a, $b, $junkCallback=null, $options)
	{
		$this->a = null;
		$this->b = null;
		$this->junkCallback = $junkCallback;
		$this->setOptions($options);
		$this->setSequences($a, $b);
	}

	public function setOptions($options)
	{
		$this->options = array_merge($this->defaultOptions, $options);
	}

	/**
	 * Set the first and second sequences to use with the sequence matcher.
	 *
	 * @param string|array $a A string or array containing the lines to compare against.
	 * @param string|array $b A string or array containing the lines to compare.
	 */
	public function setSequences($a, $b)
	{
		$this->setSeq1($a);
		$this->setSeq2($b);
	}

	/**
	 * Set the first sequence ($a) and reset any internal caches to indicate that
	 * when calling the calculation methods, we need to recalculate them.
	 *
	 * @param string|array $a The sequence to set as the first sequence.
	 */
	public function setSeq1($a)
	{
		if(!is_array($a)) {
			$a = str_split($a);
		}
		if($a == $this->a) {
			return;
		}

		$this->a= $a;
		$this->matchingBlocks = null;
		$this->opCodes = null;
	}

	/**
	 * Set the second sequence ($b) and reset any internal caches to indicate that
	 * when calling the calculation methods, we need to recalculate them.
	 *
	 * @param string|array $b The sequence to set as the second sequence.
	 */
	public function setSeq2($b)
	{
		if(!is_array($b)) {
			$b = str_split($b);
		}
		if($b == $this->b) {
			return;
		}

		$this->b = $b;
		$this->matchingBlocks = null;
		$this->opCodes = null;
		$this->fullBCount = null;
		$this->chainB();
	}

	/**
	 * Generate the internal arrays containing the list of junk and non-junk
	 * characters for the second ($b) sequence.
	 */
	private function chainB()
	{
		$length = count ($this->b);
		$this->b2j = array();
		$popularDict = array();

		for($i = 0; $i < $length; ++$i) {
			$char = $this->b[$i];
			if(isset($this->b2j[$char])) {
				if($length >= 200 && count($this->b2j[$char]) * 100 > $length) {
					$popularDict[$char] = 1;
					unset($this->b2j[$char]);
				}
				else {
					$this->b2j[$char][] = $i;
				}
			}
			else {
				$this->b2j[$char] = array(
					$i
				);
			}
		}

		// Remove leftovers
		foreach(array_keys($popularDict) as $char) {
			unset($this->b2j[$char]);
		}

		$this->junkDict = array();
		if(is_callable($this->junkCallback)) {
			foreach(array_keys($popularDict) as $char) {
				if(call_user_func($this->junkCallback, $char)) {
					$this->junkDict[$char] = 1;
					unset($popularDict[$char]);
				}
			}

			foreach(array_keys($this->b2j) as $char) {
				if(call_user_func($this->junkCallback, $char)) {
					$this->junkDict[$char] = 1;
					unset($this->b2j[$char]);
				}
			}
		}
	}

	/**
	 * Checks if a particular character is in the junk dictionary
	 * for the list of junk characters.
	 *
	 * @return boolean $b True if the character is considered junk. False if not.
	 */
	private function isBJunk($b)
	{
		if(isset($this->juncDict[$b])) {
			return true;
		}

		return false;
	}

	/**
	 * Find the longest matching block in the two sequences, as defined by the
	 * lower and upper constraints for each sequence. (for the first sequence,
	 * $alo - $ahi and for the second sequence, $blo - $bhi)
	 *
	 * Essentially, of all of the maximal matching blocks, return the one that
	 * startest earliest in $a, and all of those maximal matching blocks that
	 * start earliest in $a, return the one that starts earliest in $b.
	 *
	 * If the junk callback is defined, do the above but with the restriction
	 * that the junk element appears in the block. Extend it as far as possible
	 * by matching only junk elements in both $a and $b.
	 *
	 * @param int $alo The lower constraint for the first sequence.
	 * @param int $ahi The upper constraint for the first sequence.
	 * @param int $blo The lower constraint for the second sequence.
	 * @param int $bhi The upper constraint for the second sequence.
	 * @return array Array containing the longest match that includes the starting position in $a, start in $b and the length/size.
	 */
	public function findLongestMatch($alo, $ahi, $blo, $bhi)
	{
		$a = $this->a;
		$b = $this->b;

		$bestI = $alo;
		$bestJ = $blo;
		$bestSize = 0;

		$j2Len = array();
		$nothing = array();

		for($i = $alo; $i < $ahi; ++$i) {
			$newJ2Len = array();
			$jDict = $this->arrayGetDefault($this->b2j, $a[$i], $nothing);
			foreach($jDict as $jKey => $j) {
				if($j < $blo) {
					continue;
				}
				else if($j >= $bhi) {
					break;
				}

				$k = $this->arrayGetDefault($j2Len, $j -1, 0) + 1;
				$newJ2Len[$j] = $k;
				if($k > $bestSize) {
					$bestI = $i - $k + 1;
					$bestJ = $j - $k + 1;
					$bestSize = $k;
				}
			}

			$j2Len = $newJ2Len;
		}

		while($bestI > $alo && $bestJ > $blo && !$this->isBJunk($b[$bestJ - 1]) &&
			!$this->linesAreDifferent($bestI - 1, $bestJ - 1)) {
				--$bestI;
				--$bestJ;
				++$bestSize;
		}

		while($bestI + $bestSize < $ahi && ($bestJ + $bestSize) < $bhi &&
			!$this->isBJunk($b[$bestJ + $bestSize]) && !$this->linesAreDifferent($bestI + $bestSize, $bestJ + $bestSize)) {
				++$bestSize;
		}

		while($bestI > $alo && $bestJ > $blo && $this->isBJunk($b[$bestJ - 1]) &&
			!$this->isLineDifferent($bestI - 1, $bestJ - 1)) {
				--$bestI;
				--$bestJ;
				++$bestSize;
		}

		while($bestI + $bestSize < $ahi && $bestJ + $bestSize < $bhi &&
			$this->isBJunk($b[$bestJ + $bestSize]) && !$this->linesAreDifferent($bestI + $bestSize, $bestJ + $bestSize)) {
					++$bestSize;
		}

		return array(
			$bestI,
			$bestJ,
			$bestSize
		);
	}

	/**
	 * Check if the two lines at the given indexes are different or not.
	 *
	 * @param int $aIndex Line number to check against in a.
	 * @param int $bIndex Line number to check against in b.
	 * @return boolean True if the lines are different and false if not.
	 */
	public function linesAreDifferent($aIndex, $bIndex)
	{
		$lineA = $this->a[$aIndex];
		$lineB = $this->b[$bIndex];

		if($this->options['ignoreWhitespace']) {
			$replace = array("\t", ' ');
			$lineA = str_replace($replace, '', $lineA);
			$lineB = str_replace($replace, '', $lineB);
		}

		if($this->options['ignoreCase']) {
			$lineA = strtolower($lineA);
			$lineB = strtolower($lineB);
		}

		if($lineA != $lineB) {
			return true;
		}

		return false;
	}

	/**
	 * Return a nested set of arrays for all of the matching sub-sequences
	 * in the strings $a and $b.
	 *
	 * Each block contains the lower constraint of the block in $a, the lower
	 * constraint of the block in $b and finally the number of lines that the
	 * block continues for.
	 *
	 * @return array Nested array of the matching blocks, as described by the function.
	 */
	public function getMatchingBlocks()
	{
		if(!empty($this->matchingBlocks)) {
			return $this->matchingBlocks;
		}

		$aLength = count($this->a);
		$bLength = count($this->b);

		$queue = array(
			array(
				0,
				$aLength,
				0,
				$bLength
			)
		);

		$matchingBlocks = array();
		while(!empty($queue)) {
			list($alo, $ahi, $blo, $bhi) = array_pop($queue);
			$x = $this->findLongestMatch($alo, $ahi, $blo, $bhi);
			list($i, $j, $k) = $x;
			if($k) {
				$matchingBlocks[] = $x;
				if($alo < $i && $blo < $j) {
					$queue[] = array(
						$alo,
						$i,
						$blo,
						$j
					);
				}

				if($i + $k < $ahi && $j + $k < $bhi) {
					$queue[] = array(
						$i + $k,
						$ahi,
						$j + $k,
						$bhi
					);
				}
			}
		}

		usort($matchingBlocks, array($this, 'tupleSort'));

		$i1 = 0;
		$j1 = 0;
		$k1 = 0;
		$nonAdjacent = array();
		foreach($matchingBlocks as $block) {
			list($i2, $j2, $k2) = $block;
			if($i1 + $k1 == $i2 && $j1 + $k1 == $j2) {
				$k1 += $k2;
			}
			else {
				if($k1) {
					$nonAdjacent[] = array(
						$i1,
						$j1,
						$k1
					);
				}

				$i1 = $i2;
				$j1 = $j2;
				$k1 = $k2;
			}
		}

		if($k1) {
			$nonAdjacent[] = array(
				$i1,
				$j1,
				$k1
			);
		}

		$nonAdjacent[] = array(
			$aLength,
			$bLength,
			0
		);

		$this->matchingBlocks = $nonAdjacent;
		return $this->matchingBlocks;
	}

	/**
	 * Return a list of all of the opcodes for the differences between the
	 * two strings.
	 *
	 * The nested array returned contains an array describing the opcode
	 * which includes:
	 * 0 - The type of tag (as described below) for the opcode.
	 * 1 - The beginning line in the first sequence.
	 * 2 - The end line in the first sequence.
	 * 3 - The beginning line in the second sequence.
	 * 4 - The end line in the second sequence.
	 *
	 * The different types of tags include:
	 * replace - The string from $i1 to $i2 in $a should be replaced by
	 *           the string in $b from $j1 to $j2.
	 * delete -  The string in $a from $i1 to $j2 should be deleted.
	 * insert -  The string in $b from $j1 to $j2 should be inserted at
	 *           $i1 in $a.
	 * equal  -  The two strings with the specified ranges are equal.
	 *
	 * @return array Array of the opcodes describing the differences between the strings.
	 */
	public function getOpCodes()
	{
		if(!empty($this->opCodes)) {
			return $this->opCodes;
		}

		$i = 0;
		$j = 0;
		$this->opCodes = array();

		$blocks = $this->getMatchingBlocks();
		foreach($blocks as $block) {
			list($ai, $bj, $size) = $block;
			$tag = '';
			if($i < $ai && $j < $bj) {
				$tag = 'replace';
			}
			else if($i < $ai) {
				$tag = 'delete';
			}
			else if($j < $bj) {
				$tag = 'insert';
			}

			if($tag) {
				$this->opCodes[] = array(
					$tag,
					$i,
					$ai,
					$j,
					$bj
				);
			}

			$i = $ai + $size;
			$j = $bj + $size;

			if($size) {
				$this->opCodes[] = array(
					'equal',
					$ai,
					$i,
					$bj,
					$j
				);
			}
		}
		return $this->opCodes;
	}

	/**
	 * Return a series of nested arrays containing different groups of generated
	 * opcodes for the differences between the strings with up to $context lines
	 * of surrounding content.
	 *
	 * Essentially what happens here is any big equal blocks of strings are stripped
	 * out, the smaller subsets of changes are then arranged in to their groups.
	 * This means that the sequence matcher and diffs do not need to include the full
	 * content of the different files but can still provide context as to where the
	 * changes are.
	 *
	 * @param int $context The number of lines of context to provide around the groups.
	 * @return array Nested array of all of the grouped opcodes.
	 */
	public function getGroupedOpcodes($context=3)
	{
		$opCodes = $this->getOpCodes();
		if(empty($opCodes)) {
			$opCodes = array(
				array(
					'equal',
					0,
					1,
					0,
					1
				)
			);
		}

		if($opCodes[0][0] == 'equal') {
			$opCodes[0] = array(
				$opCodes[0][0],
				max($opCodes[0][1], $opCodes[0][2] - $context),
				$opCodes[0][2],
				max($opCodes[0][3], $opCodes[0][4] - $context),
				$opCodes[0][4]
			);
		}

		$lastItem = count($opCodes) - 1;
		if($opCodes[$lastItem][0] == 'equal') {
			list($tag, $i1, $i2, $j1, $j2) = $opCodes[$lastItem];
			$opCodes[$lastItem] = array(
				$tag,
				$i1,
				min($i2, $i1 + $context),
				$j1,
				min($j2, $j1 + $context)
			);
		}

		$maxRange = $context * 2;
		$groups = array();
		$group = array();
		foreach($opCodes as $code) {
			list($tag, $i1, $i2, $j1, $j2) = $code;
			if($tag == 'equal' && $i2 - $i1 > $maxRange) {
				$group[] = array(
					$tag,
					$i1,
					min($i2, $i1 + $context),
					$j1,
					min($j2, $j1 + $context)
				);
				$groups[] = $group;
				$group = array();
				$i1 = max($i1, $i2 - $context);
				$j1 = max($j1, $j2 - $context);
			}
			$group[] = array(
				$tag,
				$i1,
				$i2,
				$j1,
				$j2
			);
		}

		if(!empty($group) && !(count($group) == 1 && $group[0][0] == 'equal')) {
			$groups[] = $group;
		}

		return $groups;
	}

	/**
	 * Return a measure of the similarity between the two sequences.
	 * This will be a float value between 0 and 1.
	 *
	 * Out of all of the ratio calculation functions, this is the most
	 * expensive to call if getMatchingBlocks or getOpCodes is yet to be
	 * called. The other calculation methods (quickRatio and realquickRatio)
	 * can be used to perform quicker calculations but may be less accurate.
	 *
	 * The ratio is calculated as (2 * number of matches) / total number of
	 * elements in both sequences.
	 *
	 * @return float The calculated ratio.
	 */
	public function Ratio()
	{
		$matches = array_reduce($this->getMatchingBlocks(), array($this, 'ratioReduce'), 0);
		return $this->calculateRatio($matches, count ($this->a) + count ($this->b));
	}

	/**
	 * Helper function to calculate the number of matches for Ratio().
	 *
	 * @param int $sum The running total for the number of matches.
	 * @param array $triple Array containing the matching block triple to add to the running total.
	 * @return int The new running total for the number of matches.
	 */
	private function ratioReduce($sum, $triple)
	{
		return $sum + ($triple[count($triple) - 1]);
	}

	/**
	 * Quickly return an upper bound ratio for the similarity of the strings.
	 * This is quicker to compute than Ratio().
	 *
	 * @return float The calculated ratio.
	 */
	private function quickRatio()
	{
		if($this->fullBCount === null) {
			$this->fullBCount = array();
			$bLength = count ($b);
			for($i = 0; $i < $bLength; ++$i) {
				$char = $this->b[$i];
				$this->fullBCount[$char] = $this->arrayGetDefault($this->fullBCount, $char, 0) + 1;
			}
		}

		$avail = array();
		$matches = 0;
		$aLength = count ($this->a);
		for($i = 0; $i < $aLength; ++$i) {
			$char = $this->a[$i];
			if(isset($avail[$char])) {
				$numb = $avail[$char];
			}
			else {
				$numb = $this->arrayGetDefault($this->fullBCount, $char, 0);
			}
			$avail[$char] = $numb - 1;
			if($numb > 0) {
				++$matches;
			}
		}

		$this->calculateRatio($matches, count ($this->a) + count ($this->b));
	}

	/**
	 * Return an upper bound ratio really quickly for the similarity of the strings.
	 * This is quicker to compute than Ratio() and quickRatio().
	 *
	 * @return float The calculated ratio.
	 */
	private function realquickRatio()
	{
		$aLength = count ($this->a);
		$bLength = count ($this->b);

		return $this->calculateRatio(min($aLength, $bLength), $aLength + $bLength);
	}

	/**
	 * Helper function for calculating the ratio to measure similarity for the strings.
	 * The ratio is defined as being 2 * (number of matches / total length)
	 *
	 * @param int $matches The number of matches in the two strings.
	 * @param int $length The length of the two strings.
	 * @return float The calculated ratio.
	 */
	private function calculateRatio($matches, $length=0)
	{
		if($length) {
			return 2 * ($matches / $length);
		}
		else {
			return 1;
		}
	}

	/**
	 * Helper function that provides the ability to return the value for a key
	 * in an array of it exists, or if it doesn't then return a default value.
	 * Essentially cleaner than doing a series of if(isset()) {} else {} calls.
	 *
	 * @param array $array The array to search.
	 * @param string $key The key to check that exists.
	 * @param mixed $default The value to return as the default value if the key doesn't exist.
	 * @return mixed The value from the array if the key exists or otherwise the default.
	 */
	private function arrayGetDefault($array, $key, $default)
	{
		if(isset($array[$key])) {
			return $array[$key];
		}
		else {
			return $default;
		}
	}

	/**
	 * Sort an array by the nested arrays it contains. Helper function for getMatchingBlocks
	 *
	 * @param array $a First array to compare.
	 * @param array $b Second array to compare.
	 * @return int -1, 0 or 1, as expected by the usort function.
	 */
	private function tupleSort($a, $b)
	{
		$max = max(count($a), count($b));
		for($i = 0; $i < $max; ++$i) {
			if($a[$i] < $b[$i]) {
				return -1;
			}
			else if($a[$i] > $b[$i]) {
				return 1;
			}
		}

		if(count($a) == $count($b)) {
			return 0;
		}
		else if(count($a) < count($b)) {
			return -1;
		}
		else {
			return 1;
		}
	}
}PK!n�]�4747libs/dumper.phpnu�[���<?php
/**
 * Abstract dump file: provides common interface for writing
 * data to dump files.
 * (c) 2create Studio, Bulgaria
 * http://2create.bg/
 */
abstract class WPR_Shuttle_Dump_File {
	/**
	 * File Handle
	 */
	protected $fh;

	/**
	 * Location of the dump file on the disk
	 */
	protected $file_location;

	abstract function write($string);
	abstract function end();

	static function create($filename) {
		if (self::is_gzip($filename)) {
			return new WPR_Shuttle_Dump_File_Gzip($filename);
		}
		return new WPR_Shuttle_Dump_File_Plaintext($filename);
	}
	function __construct($file) {
		$this->file_location = $file;
		$this->fh = $this->open();

		if (!$this->fh) {
			throw new WPR_Shuttle_Exception("Couldn't write SQL export file");
		}
	}

	public static function is_gzip($filename) {
		return preg_match('~gz$~i', $filename);
	}
}

/**
 * Plain text implementation. Uses standard file functions in PHP.
 */
class WPR_Shuttle_Dump_File_Plaintext extends WPR_Shuttle_Dump_File {
	function open() {
		return fopen($this->file_location, 'w');
	}
	function write($string) {
		return fwrite($this->fh, $string);
	}
	function end() {
		return fclose($this->fh);
	}
}

/**
 * Gzip implementation. Uses gz* functions.
 */
class WPR_Shuttle_Dump_File_Gzip extends WPR_Shuttle_Dump_File {
	function open() {
		return gzopen($this->file_location, 'wb9');
	}
	function write($string) {
		return gzwrite($this->fh, $string);
	}
	function end() {
		return gzclose($this->fh);
	}
}

/**
 * MySQL insert statement builder.
 */
class WPR_Shuttle_Insert_Statement {
	private $rows = array();
	private $length = 0;
	private $table;

	function __construct($table) {
		$this->table = $table;
	}

	function reset() {
		$this->rows = array();
		$this->length = 0;
	}

	function add_row($row) {
		$row = '(' . implode(",", $row) . ')';
		$this->rows[] = $row;
		$this->length += strlen($row);
	}

	function get_sql() {
		if (empty($this->rows)) {
			return false;
		}

		return 'INSERT INTO `' . $this->table . '` VALUES ' .
			implode(",\n", $this->rows) . ';';
	}

	function get_length() {
		return $this->length;
	}
}

/**
 * Main facade
 */
abstract class WPR_Shuttle_Dumper {
	/**
	 * Maximum length of single insert statement
	 */
	const INSERT_THRESHOLD = 838860;

	/**
	 * @var WPR_Shuttle_DBConn
	 */
	public $db;

	/**
	 * @var WPR_Shuttle_Dump_File
	 */
	public $dump_file;

	/**
	 * End of line style used in the dump
	 */
	public $eol = "\r\n";

	/**
	 * Specificed tables to include
	 */
	public $include_tables;

	/**
	 * Specified tables to exclude
	 */
	public $exclude_tables = array();

	/**
	 * Factory method for dumper on current hosts's configuration.
	 */
	static function create($db_options) {
		$db = WPR_Shuttle_DBConn::create($db_options);

		$db->connect();

		if (self::has_shell_access()
				&& self::is_shell_command_available('mysqldump')
				&& self::is_shell_command_available('gzip')
			) {
			$dumper = new WPR_Shuttle_Dumper_ShellCommand($db);
		} else {
			$dumper = new WPR_Shuttle_Dumper_Native($db);
		}

		if (isset($db_options['include_tables'])) {
			$dumper->include_tables = $db_options['include_tables'];
		}
		if (isset($db_options['exclude_tables'])) {
			$dumper->exclude_tables = $db_options['exclude_tables'];
		}

		return $dumper;
	}

	function __construct(WPR_Shuttle_DBConn $db) {
		$this->db = $db;
	}

	public static function has_shell_access() {
		if (!is_callable('shell_exec')) {
			return false;
		}
		$disabled_functions = ini_get('disable_functions');
		return stripos($disabled_functions, 'shell_exec') === false;
	}

	public static function is_shell_command_available($command) {
		if (preg_match('~win~i', PHP_OS)) {
			/*
			On Windows, the `where` command checks for availabilty in PATH. According
			to the manual(`where /?`), there is quiet mode:
			....
			    /Q       Returns only the exit code, without displaying the list
			             of matched files. (Quiet mode)
			....
			*/
			$output = array();
			exec('where /Q ' . $command, $output, $return_val);

			if (intval($return_val) === 1) {
				return false;
			} else {
				return true;
			}

		} else {
			$last_line = exec('which ' . $command);
			$last_line = trim($last_line);

			// Whenever there is at least one line in the output,
			// it should be the path to the executable
			if (empty($last_line)) {
				return false;
			} else {
				return true;
			}
		}

	}

	/**
	 * Create an export file from the tables with that prefix.
	 * @param string $export_file_location the file to put the dump to.
	 *		Note that whenever the file has .gz extension the dump will be comporessed with gzip
	 * @param string $table_prefix Allow to export only tables with particular prefix
	 * @return void
	 */
	abstract public function dump($export_file_location, $table_prefix='');

	protected function get_tables($table_prefix) {
		if (!empty($this->include_tables)) {
			return $this->include_tables;
		}

		// $tables will only include the tables and not views.
		// TODO - Handle views also, edits to be made in function 'get_create_table_sql' line 336
		$tables = $this->db->fetch_numeric('
			SHOW FULL TABLES WHERE Table_Type = "BASE TABLE" AND Tables_in_'.$this->db->name.' LIKE "' . $this->db->escape_like($table_prefix) . '%"
		');

		$tables_list = array();
		foreach ($tables as $table_row) {
			$table_name = $table_row[0];
			if (!in_array($table_name, $this->exclude_tables)) {
				$tables_list[] = $table_name;
			}
		}
		return $tables_list;
	}
}

class WPR_Shuttle_Dumper_ShellCommand extends WPR_Shuttle_Dumper {
	function dump($export_file_location, $table_prefix='') {
		$command = 'mysqldump -h ' . escapeshellarg($this->db->host) .
			' -u ' . escapeshellarg($this->db->username) .
			' --password=' . escapeshellarg($this->db->password) .
			' ' . escapeshellarg($this->db->name);

		$include_all_tables = empty($table_prefix) &&
			empty($this->include_tables) &&
			empty($this->exclude_tables);

		if (!$include_all_tables) {
			$tables = $this->get_tables($table_prefix);
			$command .= ' ' . implode(' ', array_map('escapeshellarg', $tables));
		}

		$error_file = tempnam(sys_get_temp_dir(), 'err');

		$command .= ' 2> ' . escapeshellarg($error_file);

		if (WPR_Shuttle_Dump_File::is_gzip($export_file_location)) {
			$command .= ' | gzip';
		}

		$command .= ' > ' . escapeshellarg($export_file_location);

		exec($command, $output, $return_val);

		if ($return_val !== 0) {
			$error_text = file_get_contents($error_file);
			unlink($error_file);
			throw new WPR_Shuttle_Exception('Couldn\'t export database: ' . esc_html($error_text));
		}

		unlink($error_file);
	}
}

class WPR_Shuttle_Dumper_Native extends WPR_Shuttle_Dumper {
	public function dump($export_file_location, $table_prefix='') {
		global $wp_reset;
		$eol = $this->eol;

		$this->dump_file = WPR_Shuttle_Dump_File::create($export_file_location);

		$this->dump_file->write("-- Generation time: " . date('r') . $eol);
		$this->dump_file->write("-- Host: " . $this->db->host . $eol);
		$this->dump_file->write("-- DB name: " . $this->db->name . $eol);
		$this->dump_file->write("-- WP Reset ver: " . $wp_reset->get_plugin_version() . $eol);
		$this->dump_file->write("-- Table Prefix: " . $table_prefix . $eol);
		$this->dump_file->write("/*!40030 SET NAMES UTF8 */;$eol");

		$this->dump_file->write("/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;$eol");
		$this->dump_file->write("/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;$eol");
		$this->dump_file->write("/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;$eol");
		$this->dump_file->write("/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;$eol");
		$this->dump_file->write("/*!40103 SET TIME_ZONE='+00:00' */;$eol");
		$this->dump_file->write("/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;$eol");
		$this->dump_file->write("/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;$eol");
		$this->dump_file->write("/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;$eol");
		$this->dump_file->write("/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;$eol$eol");


		$tables = $this->get_tables($table_prefix);
		foreach ($tables as $table) {
			$this->dump_table($table);
		}

		$this->dump_file->write("$eol$eol");
		$this->dump_file->write("/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;$eol");
		$this->dump_file->write("/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;$eol");
		$this->dump_file->write("/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;$eol");
		$this->dump_file->write("/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;$eol");
		$this->dump_file->write("/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;$eol");
		$this->dump_file->write("/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;$eol");
		$this->dump_file->write("/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;$eol$eol");

		unset($this->dump_file);
	}

	protected function dump_table($table) {
		$eol = $this->eol;

		$this->dump_file->write("DROP TABLE IF EXISTS `$table`;$eol");

		$create_table_sql = $this->get_create_table_sql($table);
		$this->dump_file->write($create_table_sql . $eol . $eol);

		$data = $this->db->query("SELECT * FROM `$table`");

		$insert = new WPR_Shuttle_Insert_Statement($table);

		while ($row = $this->db->fetch_row($data)) {
			$row_values = array();
			foreach ($row as $value) {
				$row_values[] = $this->db->escape($value);
			}
			$insert->add_row( $row_values );

			if ($insert->get_length() > self::INSERT_THRESHOLD) {
				// The insert got too big: write the SQL and create
				// new insert statement
				$this->dump_file->write($insert->get_sql() . $eol);
				$insert->reset();
			}
		}

		$sql = $insert->get_sql();
		if ($sql) {
			$this->dump_file->write($insert->get_sql() . $eol);
		}
		$this->dump_file->write($eol . $eol);
	}

	public function get_create_table_sql($table) {
		$create_table_sql = $this->db->fetch('SHOW CREATE TABLE `' . $table . '`');
		return $create_table_sql[0]['Create Table'] . ';';
	}
}

class WPR_Shuttle_DBConn {
	public $host;
	public $username;
	public $password;
	public $name;

	protected $connection;

	function __construct($options) {
		$this->host = $options['host'];
		if (empty($this->host)) {
			$this->host = '127.0.0.1';
		}
		$this->username = $options['username'];
		$this->password = $options['password'];
		$this->name = $options['db_name'];
	}

	static function create($options) {
		if (class_exists('mysqli')) {
			$class_name = "WPR_Shuttle_DBConn_Mysqli";
		} else {
			$class_name = "WPR_Shuttle_DBConn_Mysql";
		}

		return new $class_name($options);
	}
}

class WPR_Shuttle_DBConn_Mysql extends WPR_Shuttle_DBConn {
	function connect() {
		$this->connection = @mysql_connect($this->host, $this->username, $this->password);
		if (!$this->connection) {
			throw new WPR_Shuttle_Exception("Couldn't connect to the database: " . esc_html(mysql_error()));
		}

		$select_db_res = mysql_select_db($this->name, $this->connection);
		if (!$select_db_res) {
			throw new WPR_Shuttle_Exception("Couldn't select database: " . esc_html(mysql_error($this->connection)));
		}

		return true;
	}

	function query($q) {
		if (!$this->connection) {
			$this->connect();
		}
		$res = mysql_query($q);
		if (!$res) {
			throw new WPR_Shuttle_Exception("SQL error: " . esc_html(mysql_error($this->connection)));
		}
		return $res;
	}

	function fetch_numeric($query) {
		return $this->fetch($query, MYSQL_NUM);
	}

	function fetch($query, $result_type=MYSQL_ASSOC) {
		$result = $this->query($query, $this->connection);
		$return = array();
		while ( $row = mysql_fetch_array($result, $result_type) ) {
			$return[] = $row;
		}
		return $return;
	}

	function escape($value) {
		if (is_null($value)) {
			return "NULL";
		}
		return "'" . mysql_real_escape_string($value) . "'";
	}

	function escape_like($search) {
		return str_replace(array('_', '%'), array('\_', '\%'), $search);
	}

	function get_var($sql) {
		$result = $this->query($sql);
		$row = mysql_fetch_array($result);
		return $row[0];
	}

	function fetch_row($data) {
		return mysql_fetch_assoc($data);
	}
}


class WPR_Shuttle_DBConn_Mysqli extends WPR_Shuttle_DBConn {
	function connect() {
		$this->connection = @new MySQLi($this->host, $this->username, $this->password, $this->name);

		if ($this->connection->connect_error) {
			throw new WPR_Shuttle_Exception("Couldn't connect to the database: " . esc_html($this->connection->connect_error));
		}

		return true;
	}

	function query($q) {
		if (!$this->connection) {
			$this->connect();
		}
		$res = $this->connection->query($q);

		if (!$res) {
			throw new WPR_Shuttle_Exception("SQL error: " . esc_html($this->connection->error));
		}

		return $res;
	}

	function fetch_numeric($query) {
		return $this->fetch($query, MYSQLI_NUM);
	}

	function fetch($query, $result_type=MYSQLI_ASSOC) {
		$result = $this->query($query, $this->connection);
		$return = array();
		while ( $row = $result->fetch_array($result_type) ) {
			$return[] = $row;
		}
		return $return;
	}

	function escape($value) {
		if (is_null($value)) {
			return "NULL";
		}
		return "'" . $this->connection->real_escape_string($value) . "'";
	}

	function escape_like($search) {
		return str_replace(array('_', '%'), array('\_', '\%'), $search);
	}

	function get_var($sql) {
		$result = $this->query($sql);
		$row = $result->fetch_array($result, MYSQLI_NUM);
		return $row[0];
	}

	function fetch_row($data) {
		return $data->fetch_array(MYSQLI_ASSOC);
	}
}

class WPR_Shuttle_Exception extends Exception {};
PK!]M�s;s;license.txtnu�[���                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONSPK!��Z��wf-flyout/config.phpnu�[���<?php
$config = array();

$config['plugin_screen'] = 'tools_page_wp-reset';
$config['icon_border'] = '1px solid #00000099';
$config['icon_right'] = '35px';
$config['icon_bottom'] = '45px';
$config['icon_image'] = 'wp-reset.png';
$config['icon_padding'] = '4px';
$config['icon_size'] = '55px';
$config['menu_accent_color'] = '#dd3036';
$config['custom_css'] = '#wf-flyout .ucp-icon .wff-icon img { max-width: 70%; } #wf-flyout .ucp-icon .wff-icon { line-height: 57px; } #wf-flyout .wp301-icon .wff-icon img { max-width: 70%; } #wf-flyout .wp301-icon .wff-icon { line-height: 57px; } #wf-flyout .wff-custom-icon.wff-menu-item-6 span.wff-icon { line-height: 63px; }';

$config['menu_items'] = array(
  array('href' => '#', 'label' => 'Get WP Reset PRO Lifetime deal for the price of a 1-year license', 'icon' => 'wp-reset.png', 'class' => 'button-pro-feature', 'data' => 'data-feature="flyout"'),
  array('href' => 'https://wpforcessl.com/?ref=wff-wp-reset', 'label' => 'Fix all SSL problems &amp; monitor site in real-time', 'icon' => 'wp-ssl.png', 'class' => 'wpfssl-icon'),
  array('href' => 'https://wp301redirects.com/?ref=wff-wp-reset&coupon=50off', 'label' => 'Get WP 301 Redirects PRO with 50% off', 'icon' => '301-logo.png', 'class' => 'wp301-icon'),
  array('href' => 'https://underconstructionpage.com/?ref=wff-wp-reset&coupon=welcome', 'target' => '_blank', 'label' => 'Create the perfect Under Construction Page', 'icon' => 'ucp.png', 'class' => 'ucp-icon'),
  array('href' => 'https://wpsticky.com/?ref=wff-wp-reset', 'target' => '_blank', 'label' => 'Make any element sticky with WP Sticky', 'icon' => 'dashicons-admin-post'),
  array('href' => 'https://wordpress.org/support/plugin/wp-reset/reviews/#new-post', 'target' => '_blank', 'label' => 'Rate the Plugin', 'icon' => 'dashicons-thumbs-up'),
  array('href' => 'https://wordpress.org/support/plugin/wp-reset/#new-post', 'target' => '_blank', 'label' => 'Get Support', 'icon' => 'dashicons-sos'),
);
PK!��cT''wf-flyout/wf-flyout.jsnu�[���/**
 * Universal fly-out menu for WebFactory plugins
 * (c) WebFactory Ltd, 2023
 */

jQuery(document).ready(function ($) {
  $('#wff-button').on('click', function (e) {
    e.preventDefault();

    $('#wf-flyout').toggleClass('opened');
    $('#wff-overlay').toggle();

    return false;
  }); // open/close menu

  $('#wff-overlay').on('click', function (e) {
    e.preventDefault();

    $(this).hide();
    $('#wf-flyout').removeClass('opened');

    return false;
  }); // click on overlay - hide menu
}); // jQuery ready
PK!���QQwf-flyout/wf-flyout.cssnu�[���/**
 * Universal fly-out menu for WebFactory plugins
 * (c) WebFactory Ltd, 2023
 */

#wf-flyout {
  position: fixed;
  z-index: 100049;
  transition: all 0.3s ease-in-out;
  right: 40px;
  bottom: 40px;
  opacity: 1;
}

#wff-overlay {
  background: #000;
  opacity: 0.4;
  filter: alpha(opacity=40);
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  display: none;
  z-index: 100049;
}

#wf-flyout a:focus {
  outline: none;
  box-shadow: none;
}

#wf-flyout #wff-button {
  display: block;
}

#wf-flyout #wff-image-wrapper {
  border: 3px solid #000000;
  border-radius: 50%;
  padding: 0;
  display: block;
  overflow: hidden;
  background: #ffffff;
  box-shadow: 0 3px 20px rgba(0, 0, 0, 0.2);
}

#wf-flyout #wff-button img {
  width: 55px;
  height: 55px;
  display: block;
  overflow: hidden;
  padding: 2px;
  background: #ffffff;
  box-sizing: border-box;
}

#wf-flyout #wff-button:hover #wff-image-wrapper {
  box-shadow: 0 3px 30px rgba(0, 0, 0, 0.25);
}

#wf-flyout:not(.opened) #wff-button:hover .wff-label {
  opacity: 1;
  margin-right: 0;
}

#wf-flyout .wff-label {
  position: absolute;
  display: block;
  top: 50%;
  right: calc(100% + 25px);
  transform: translateY(-50%) scale(1);
  -moz-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
  color: #fff;
  background: #444 0 0 no-repeat padding-box;
  font-size: 14px;
  white-space: nowrap;
  padding: 5px 10px;
  height: auto !important;
  line-height: initial;
  transition: all 0.2s ease-out;
  border-radius: 3px;
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  opacity: 0;
  margin-right: -50px;
}

#wf-flyout .wff-icon {
  width: 40px;
  height: 40px;
  vertical-align: middle;
  line-height: 60px;
  text-align: center;
}

#wf-flyout .wff-icon img {
  max-width: 80%;
  filter: brightness(100);
}

#wf-flyout .wff-label.visible {
  opacity: 1;
}

#wf-flyout .wff-menu-item {
  position: absolute;
  left: 10px;
  width: 40px;
  height: 40px;
  opacity: 0;
  visibility: hidden;
  transform: scale(0);
  border-radius: 50%;
  box-shadow: 0 3px 20px rgba(0, 0, 0, 0.2);
  background: #0071a1;
  text-align: center;
  vertical-align: middle;
  text-decoration: none;
  transition-timing-function: ease-in-out;
}

#wf-flyout .wff-menu-item.accent {
  background: #ca4a1f;
}

#wf-flyout.opened .wff-menu-item {
  opacity: 1;
  visibility: visible;
  transform: scale(1);
}

#wf-flyout .wff-menu-item:hover {
  box-shadow: 0 3px 30px rgba(0, 0, 0, 0.25);
}

#wf-flyout .wff-menu-item:hover .wff-label {
  right: calc(100% + 55px);
}

#wf-flyout .wff-menu-item .wff-label {
  right: calc(100% + 70px);
}

#wf-flyout .wff-menu-item .dashicons {
  line-height: 41px;
  font-size: 23px;
  color: #fff;
  padding: 0px 3px 0px 0;
}

.wff-menu-item-1 {
  bottom: 75px;
  transition: transform 0.2s 30ms, background-color 0.2s;
}

.wff-menu-item-2 {
  bottom: 130px;
  transition: transform 0.2s 70ms, background-color 0.2s;
}

.wff-menu-item-3 {
  bottom: 185px;
  transition: transform 0.2s 110ms, background-color 0.2s;
}

.wff-menu-item-4 {
  bottom: 240px;
  transition: transform 0.2s 150ms, background-color 0.2s;
}

.wff-menu-item-5 {
  bottom: 295px;
  transition: transform 0.2s 190ms, background-color 0.2s;
}

.wff-menu-item-6 {
  bottom: 350px;
  transition: transform 0.2s 230ms, background-color 0.2s;
}

.wff-menu-item-7 {
  bottom: 405px;
  transition: transform 0.2s 270ms, background-color 0.2s;
}

.wff-menu-item-8 {
  bottom: 460px;
  transition: transform 0.2s 310ms, background-color 0.2s;
}

.wff-menu-item-9 {
  bottom: 515px;
  transition: transform 0.2s 350ms, background-color 0.2s;
}

.wff-menu-item-10 {
  bottom: 570px;
  transition: transform 0.2s 390ms, background-color 0.2s;
}
PK!F[��ttwf-flyout/icons/wp-reset.pngnu�[����PNG


IHDR���>a�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�C�	pHYs.#.#x�?v�IDATx��{�E�?��ނX(-��ER���ں Y趠ؖW��(�hEA��(���
�����
���Hky�ѵ�ְ�,��J�Z���E9�1{���{;���2���&��;����73`0��`0��`0��`0��`V��v�(��� �x���#��v���,�a)���8<��˾�
Tj�^�Xl����a���dX ���
L,`����/e�˾�n��N�i�E�
 ��T�<�tD��f���;v�΋<�ϟ�
����r�w�";��Λn�$��9`0W�/
X��d����� �s�o'�
�"Z��a�ngڡ�H<�x��}邷���a�E�3CQ:dS�k�+t�"�����v��@�3���cu�"�_��a�M�#��F��_	|_�
Y
\l��_u;R�v$���K�ݾ�;�%v�Z�#U�
 [�Y��k�[q�W�v4
 �K��tg�&n��{%Q�ϟ�X8�3�% f�a�U�E`����A]�.;*�}�:(�ó>	��U�����Ӊº���VG�LpIXd��gu;Ŷwb
JT�P�Ͽ��^��
�r�-�L�)��?���D
�6�b�F�u``""rh�c���08��/-ǝ�X-|?0;����!J�x�( ��h�F<��{<����	lɾFc�}"���v�
����hU��O�~��[�T`!p��DԱx�x�ۅ��������O;5�)��N�t�"P&���OBQ�3�π��0x]rZ��_E���iͯgp�J�@|D���!Gn��`��J<�..m���~�-�$�1�+��X\!�Ʒ��S������I;��$�1��@�����9�6�F�B���*��#����~%��(��u��Q[�끙:��-v\\]��Em������H�ϖ�Β��-@��)�+�n
p�k��6����a�t��A��
�-�l�<$�f
k��+����~3��dw��7ѐ��.�n��fKdt�Z���'"aFJLh��v,Q`W)
j~=�[�-�L�����2H΁�L\� ���0���J)��T�����$�?����}I�M�(��[1�.��Z��ђu�OJ������w��
��@�N����w%�T��GP\�ߌ��Y�*9!��a�B�Me�緢#�@��HNDi�N����'����C-����'�E#���s��A`q+�����$:�J���j��2�z�"h���l�߯4K$�i��-C�	d@v��2�Y�����;���l-���O)��¯2@����\N^���/=��b�1���2�2�%��,"���X���}`�{ܘ�|hw��}Tv��v��#ѹщ���Э8+�����9��{�qE\a3x��������7�^C�E'���?�������G����]��_��k9���:�K�0c�E^6#�"ތ��V��S��RrV!�k+B�6��z"js�����FT*K���,R��2^�j9���%��#��yy��bY�X�[�5w�
8���?�ϲx+��w�{;�!F�\|�H�z�NY�g=�,r�����׈`M��"�U�l;�^�҂q�3���^>;^��DP-���*3%�ۘ�@�����O�H�ْ��@�)_&�(�VR�>�],�=�,��8��!�5�A�gWR�>���Ƚ3M�(�k��O���8�[V!j~�>ȿ�5F�Z�����d$�;%P���^X��)࣒��n����;�F�z�ٯru~{PA�!܎v��0X�>����S�=��,��l�@��o�f"�C�"+�͚�W�S,��q��lV�q$�����0�S(F++�͞.멚�qjN	�^����9�1�ꖠg�r�y��ވ�n_
��y��@�z����$�6E��q$-Or�s)��5�r�Ҿ7`9����ZZq�LcR�$� lQ��+,ǽUfF�r�c��>��)�TX�:%��Z�6q���"�*.������q��F
ߐ�Q�a_m����t��ݪ�B,~�ϩ��q�NvZ��r�o#��UɊ4���mT�E��˘s��v��6
)�T��-ǝ/;-��w��KP_��QaT�e�>�0���nk~#��K�h��te>M.A,�1 }8��STV�^�t�����_��?�w�q$��J�qmĮ�)�x��iE*�dL���:�oxp�Úߌ�c�{���8z�S��N@ti��������8�R��B��k �vj�C�tI.lE\5��X�jD|�6DX�n�A�ш&}2"�XD��"�Ϧq���e��wg"�k+�M+��b�F������ʏ6��8R��|�o'�?�B��)Ჴ��.���4�nV�!Z���ER�?\�-�������nDV�cj>�;.*�ô���<��� ��9N�n_+�
�rܱ���:�(	o^Gk��P�o�#F߹cۇ�N*��Aݞu[lzsÎMon���qf��E#ˁ��8�r*[��lzs�ұ�&lC����#��4�r���Z�=�;��u�R?N��r�N��AG��@�����e(|(YP������dE���ۑ*���3���#a
fpMK��RjT��2Dk0^�/]p"H��w/��,ǝ|�8���Up�4�ݎE���帇�"��S�Hu7l�nM�'��9Tɮ\9�5�3�灅��4��՝7�г��r�i�w�껈��)>�D]��Qϝ_�a"�Z,�=q�͉���6b�)O��Ğ�z�ɜ��B߭;�yv��r��Q�(�I���IA���g_�p7"b	_I���iQ��@#��D0h-�@_G�u�h0��`0��`0��`0��`0t���(hN�IEND�B`�PK!&�3A3Awf-flyout/icons/ucp.pngnu�[����PNG


IHDR@@�iq�	pHYsg��R8&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c067 79.157747, 2015/03/30-23:40:42        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
            xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
            xmlns:exif="http://ns.adobe.com/exif/1.0/">
         <xmp:CreatorTool>Adobe Photoshop CC 2015 (Windows)</xmp:CreatorTool>
         <xmp:CreateDate>2021-01-19T18:04:54+01:00</xmp:CreateDate>
         <xmp:ModifyDate>2021-01-21T12:28:07+01:00</xmp:ModifyDate>
         <xmp:MetadataDate>2021-01-21T12:28:07+01:00</xmp:MetadataDate>
         <dc:format>image/png</dc:format>
         <photoshop:ColorMode>3</photoshop:ColorMode>
         <xmpMM:InstanceID>xmp.iid:b91f9921-44dd-9c46-b002-af77ef1f0be0</xmpMM:InstanceID>
         <xmpMM:DocumentID>xmp.did:b91f9921-44dd-9c46-b002-af77ef1f0be0</xmpMM:DocumentID>
         <xmpMM:OriginalDocumentID>xmp.did:b91f9921-44dd-9c46-b002-af77ef1f0be0</xmpMM:OriginalDocumentID>
         <xmpMM:History>
            <rdf:Seq>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>created</stEvt:action>
                  <stEvt:instanceID>xmp.iid:b91f9921-44dd-9c46-b002-af77ef1f0be0</stEvt:instanceID>
                  <stEvt:when>2021-01-19T18:04:54+01:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CC 2015 (Windows)</stEvt:softwareAgent>
               </rdf:li>
            </rdf:Seq>
         </xmpMM:History>
         <tiff:Orientation>1</tiff:Orientation>
         <tiff:XResolution>1500000/10000</tiff:XResolution>
         <tiff:YResolution>1500000/10000</tiff:YResolution>
         <tiff:ResolutionUnit>2</tiff:ResolutionUnit>
         <exif:ColorSpace>65535</exif:ColorSpace>
         <exif:PixelXDimension>64</exif:PixelXDimension>
         <exif:PixelYDimension>64</exif:PixelYDimension>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                            
<?xpacket end="w"?>�"�> cHRMz%������u0�`:�o�_�F�IDATx�ܛ}��e�?�����K�&��L��#
&�Id⌡�d5̐�C�X�H&j
���)�"��%Z9�b�d%�\��U^ty��op��o~�^��w_���3{����<�w���=痓D�(<��+�_O�y`<���L�(���.}����T�E�;n�8�ZjY-��P��'x����*�f�K@'���Fw`��>&�z�D�o;M�:L-��8��[��>��O��o�4�g?��?]Ҷ�;$�&鄈�}$�$iF�4_R����$�"iWh�{��VB#%mO`�=I�H�.�{�m*}$�1I�I�%iV���J�/W?�<�!�1�_�88�w�s��V�"��R��ˁ���Q0�gV4+�edJ�&�����F���eq��L_4�+�X&F^��J�	���;2��qf��7�)W���c�g3xy.�]�څT�iq�$�%i��=e�e\+�x��JzDҰ~FT"���ϳ����E�H�T����(Ioy��a҃pY�^��$��B�/�OKzу�y�:B}$�tX�Is��Bk��Oo�=����sUx���M�	<uH�Z.W����(*���v��7�~��9\��fsR�h:�5�m��'�3�K���1��2��p�^Җ)ߙᩝc�k�l3�Zk�݈s���P9������$����$������$��E�Œ�QR�R�6���Ί�]�6�g-|n�i5O�u�;c���W��N�t����L��b~�nH��3%��4ھ�1���^[
Tg�3R$]*�Ikl�I�Sc�t����}���h�0����w��Z]�K�M�RÎ
Hz�`-����k�1�"6n9I���ف�:j��=�K��Fgy�:�H߯�ж#+�c��9!Pf�c��J
�y��|���.��`�u�=6f�� �o9���{��}�T��I�ST�V���;%z{�m��$�ҷ��u{y%��T����$`*��Q�3"9_>e��:d����8SM���c��2H;�+=��
,0w��k�*��s��h@'�.����g����w�!�Y$�!?x�����bౌ�v�	��u�O��>�&���)}
Gw�t�^�X��`�Y�$:�3�܁af�4��94f�K|n��@�"�4�a��|-Z�G�<ۡ�}�wy��]�{��f�D������q�<KZ�t8ơ����Kq�%:F&���n@���&�I��g:8q���D`R\l�uI���o��Q��	`t�Ǐ��X���%��Ҙ�T+�"I�Jz؂���<oGrb؉Kc��ME�8
�SD��JI_��-)np<��[���ng�Y蟔�r���в�Q9I32D�I�$�ϐt�iT�rW�g�D����/����q���f|/d�@�a�-�o5H�?�L�>�?�����v!�5C�@�漴�[4's���	�v��^�8D�k8\}��?��O�3)�����E�?��^j��j�c��[�2s{��wT0�Q�56��� ��IO{���\��n��gWHg��`��m�
�ߴ~�=�p��{L<��i����hJk���n�B�2l�t(�υ���]h���rn�o@�K:ۊ7���9H��g�%VV��Nұ.X��F�](,���j��;�~(ir෇�HZ���4L+���ژk(a�5fi��]�=�"�U��Uҟ#�OM�g�ֆi�XoA�x��jA>�5�]�"��}�1�l`����)�X;��9�ri��L�'e���iNO��{�\?@p07 ��	s>\��~Xxa+0�E�����P�N!�_��Թ����c]���G@��+F�Q5k=��b��f���8�ѣv��P�_M�i��PL:�`R�����F�6��^�;�\�JЂ�@$wnB���~Y���
�i)`�Є�4Z_tXB�E�����y������2
��x-����&�γ���y.�}]J���.��KSY�I��V�GU�,s�	�zo��)�}����e�W��h)�(M������>�-?0ي,/n�
���Dz<+��vL^
��C��o��,�l�5�L;�����xޞ��')g��]~�,EVQ���s��~�!�IEND�B`�PK!/��44wf-flyout/icons/wp-ssl.pngnu�[����PNG


IHDR\r�f	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� cHRMz%������u0�`:�o�_�F)3IDATx��y��Շ߾\vA\PE�4�&�_ԨD�F\�MLb�(�FM"J\0q��(wQ�E�E@P�Fd�.�r�|���
�骙����>�<FS�����tթs~��f�(�R�TG�fv�k���5��hx�r`!P,�ծ*�&�V���m��?��6�v10>��.L.����ٯ,7�g��wx*�m
��v4�llo��[�7sK�ϭ�'��~�[��U�'�y�〷���7��X,3���R�����g60���x+*�(��{�]�`p�M���أ�gw�Fnn>M�&�\�0��W��s�1�_����$2�kR��?�p6�&G�u�j`
�2��.2�fJ��Tc4�k����+��}�76K�fR�����?w5��BX\�g�E��d�B���7'��Z�u�t���^9�66�V��;��٘�����T:;����`���V�S���~g3�w7������-���~�ܲ��@so���k@x��|�Jgo����;�O�z�mņ�B*��l��T��3��O��|'{#���;d�w;`;�'/�Z�=
x�D��-��]�Y�88������l���Jg��Q�Ss�����ӭ`���ܼ�w�8�,A�Z��p[u@?㭴h{<�x�%t)hn����ɵ
�K��7�mI��[k�ϬY),K���Ӎ��vbi%8�|�75�]���C�#��"t���
�v���K<�7P�a����/R�l_�2ܧla>;Ǚ���,��>�S���\
@�&}{�;�����[�Ӣ�6f	޾���%��90#�m��l�za.0ά���7U
@<'|�Y�w�Fc;R�#��2�� �����v��h7��~og>�"G��S��t`0�60��x��Ds�71˻N�/�~sg��أ�K~�[�f'�oy^r�6
��˚�@`Oӏ�\�+}�c�6���P��h�i�k�DQ^�8oc�9I0�1���C{p�y����X����g�lޅ3I�F6�f/$��BǾ�6���v���B���Kcct/4�%��t�#ӗ�-�jB���!��C�2�m�Vd_��K�����\��np=�p/�E��$$�`|�6��o��qjcV2]�a�<��7[����W� �	�ܼ��4�.�L�������y�yP�8���f���Y��8�.�6`}*���'$�����'`f*�}x��AuD'��9�πs�R�g���[��q�o`!p����o�4��u9ڌEb��&p�Z#~�Nf�U*�}L�3�b5�'�A�s4r<Ӕ�a�y[�bk$�ߖ�����4�H��
�j틀IM¶n
��n>�����@$5��S�N ���|YL�x��Y^o&�l����t6f�5��4�6���?�����QUƥ�Hp�x$��
�� )������b���a���/��s50G��*x��A�7�2��$^�,~�R�:�%���<�;�"�A��}���x$?��a���L��Ī���K�1��BH����$����Yj�* -�7/�{�g��6�o�f��&tBr+�ET� �0��j�C�U�D����6�J7.o�0Ϣk�
�U�)|Up.�B}
�
�(���H�׳dc����������5�sO�����c3�@�"ڊ�����žKa�Z"I���D�//��*`-q؋�����,�h�J�ۉ6|��
�<�������Y���TMͶ)�&�,����ER�gx_�̵l�
9�/�ζ :)�q���^Er;f�z��|����/���!L��y�r(r~m�B��;�0nE��n�xvB1�����fi�����;�<$e������7�l?���@�&�u�CcD�����
�������l���C�3o� ���Ӿ'�՗�o�H���[���%�	{�$� �/�}�\I�q+�N�t6��Y���OG��\b�IW��Y�D���sѷ�!��g�g��4�!�yl��Z:���H��k��=�0;�l5�9�0�q�(�6���a.	[�q	(:`s�:��`u%|�3ۭ���AN^\�%�5o�O�1	=����8.�{��bkrnٌJ�B�vBbr��J�qr*�}2@Hb$7��<�����d)<�z`Ъ��v�<u���
m��Z�8���E-mYh�_�&�<D3 (��Y�*�a��X��U6[��}��.��\��=̢�lF%`��WY9'���	>���X��A@i0����D�U
�bG�f#}�������D7�[�Hi`N� �t�.���o�[�;@���q1*�P~<SEp�@1i�]Xoc���.�F���|�dyљ��b�+pFP#?�
�.JP)5.`��WY�j����l�D�3��)R�F̵eV��p��
 <�g�!�NA�r����-V��ux���v�/(Eg��$�I�u��;�|��C+�X,6��)�*~%��Z�#�@��PG�l���JF��g��,�^�_��w�0�y�����H�����٩t�$x��yt}��|�R3I�	boc\�	Q��Y�e͛�R܎�At!�x
�2U"�X����7�/HL�ʼi�t���Hހ+/��ol�q�*`�N����K�\���o%�53�8	���k�Q�ۂ[�E�G�>`�!�5J��N`�������xA�7��"����<Fa�h�_�-���ͱ`7QJ��
 �<��hw&�:o�o��B+�<N�@I}~�E⏟�=u�Kf֪�S��%���c)�Rp�P����!I#
C6�e�>�[Ԫ(	���7Ţ��p�}��4]�C*���9vZ,BN'j�Q(�pJ7���p�a?��p�,�/­���d�v1� #��"�J	���oE�[��HPN7�)N��g���F���Y^�Ɲ��
m�tP��Y�;8��+�j��������b0qX*�3�cT�8�q�E�ߖH}x�����E����v�h�R�P	�����h4`1x��x�-��o�T3���P{�-`ˮȩ@�*`&�
J0k���2�.��� vF�r�Л�֬@Ԉ]By/�4.C�1	����EjB�.?��졻#)���D2�Jŋ���M���<�5���ܸRfP����`$�%���s��E��p���;���ܜ���B��J8,��P��'j��,͑����~��m�q��7�������Ƣ|
�i�+�<��m�T�d����u�x����<�U�$��`��R�ot?V0�E�������	�-���q���
�n��Q���R�r��6@��FO?������Q�쇈�����&�,���>�;u��B�4����'��w�`N~�2�6���7��,�u4.�Ym�p�`������xA�UHym��O��#�;/9�o�u6X�GN8t���*>o�=
̗7�4� NNv��z���Z��q���]�������i���|Xtw��j�p�'��aQc2n��w�h{g�^V�,(�cc&h?:��l�nNGl����RxĖ��-V��l�|<��1����x�v��=|��>qN��	t�N>�)T>̕��0_j?ZS��|�l��R�Ki����]��[b'6�l�!hτ0�4�R6a�A���[g�y1�UH%"�ӣ.H��2H���U��}i�
2_�p��z9�C�K|��'��a�����4Vphk��6��瑣� N:;\w�y���m�'`�!X���o,p�>nVo�5a��hLv�[-���A��\����rƍ��s��E���%!U"_ج�lk�����#�2_�1o:[��B\e����r*�
��f�����7D/�,*L��;��c�>�ĕ%H܂KF�%����e�>~
bu\lk�������x6Qjݑ_��BRb�����=��M?�-G��Ŵ)+�L�5b�&*[Nҟ��-Y$�>	�6x�W8����ɇ
�.ߢҘl�lh`9";�|�^�g����F�¯���e���.����zm-��H@�{2��^Uդ����E��q;�[��$�{��X�&!AR�wL�2x��L��ʳQep���pl�T���}�*s��B.����$����rY���I�U}��g�e�w��I��S�ˇ]c�
��TR��8�'�L'T�f<v�~�#	?.�G���W!�.�����h���,��.�Ȣ�W���F��F���u?%�~A��Ym��&O��"'��8(3U9^|$�->xڢ��Hio[j�d�JIr醛�����\!F4Na��`�+��f���,��:\�/��W)L��s_
\�]���ep%���Ѣ��$#8%��ϦsO�N�z;��p-��R2=h�5R��Y�c☫XOe�2�N�.����L��|��.��\Q���>����*�/\a���3�M$d��õ�a� �T�>th�5��Z�G��*M��$PiXc�c��d���<��\w�/D�ĖS��{7m�$�q)�t*�����xA��j�fr���7٬���C�
�j-Vu��T��z}>۞|@
0�B:�%?�ٜY��[��j,
dV��&xzv�a�*h��E>��|��
�,�B�)�}%n�}Fap��*�+��E���D���D����I~@PK������PZ�fS��v��p��*`�!":4�9���J���&c/�u��u�<M�ޔ�^��E�g�j]L���5��xY�k��qv�-믜��mü�[��|��
X�D&���h��*`�$�|<d��,�[ף��^��A�"�).ǂ'gYl^G����X`i)
ȑCҤ�갓�jl�.��7��t�2���µ�e^v'y�6ufeI�
�(�'�$r>ę���^j>Ŏ;��k[�Ǣ֢��&w$���P@�B��mfwZd�m�{�_/�OS�Ǣ���\��|X�
�L%O`��a�MHG>�g���.�s���Q�;j��-�u;���y�|XRLG���q�{�*�,���a�QW�,�6]�3��r�E��BD<$��H���z�
���*��=���l�oD2�l���/������ͦ����]���f"NӲp+�E�5o� :cq�T�:��u.5�p;m:
��Y?�}�Dƙ�)0�*�	Wj��,�!��M��� �0&�V	�.G�4���
:��B/�������N��܎�#y�J8��M��E>��ɢB��a���v�t$�7ȃ�=�2_�`Y�Y�b������d���0&R�Ȫ���!�5q���g�)����׃:gC�nrtmA��U�BDD4ny�q�U!��h�8�r�vB��]��u���j$�ǥv™H�� #Џx�k���I�Ԃo�3^�E�܄���:W��ۈ֟���he�6N�a���Ŭ
�>$窯��E�v�`'>��u�WP������H}��U��m�>!�*Ra��c��]���"���*�U
����QJYn������[a],L�m�2_G8\w"񭔆'��{"�ڃV3�8F9�eR�/���o��w�T��?��p��ќ���d�7ok�(�����/��U��y��
� �Y����3�MR�5�.��f���q�Bm�ȏ�"zQt�7*�`	�Z;nM�HF��a����JiYm&��|ؙF�e`@�}UE��(�^]�g��(���
@���:��P�1�����ڢ�
��i�����`4y*��@
��29���g<�����^�V����8����V_"*C��G��H�{9X
��E��p�s�6�t�b$��c�4�<c�#��~ƳI����o3���M2����
�e�~C��8n���+��>i^���ֈ,�>�!���)6���ZPgn���gmY`�~}�E��3^�H�E���2�����bt�#�X�y�H��{�����(
��h�P�ߗER��lpV�A���b*����̴���������.2,F����������ё�A|A�R���溧?
�M�H�
UE���B�#�2'�敖'?Hd`[���qs<)��5�N�#�
����7��x݁�PX���{��m@��t�3��F�=l���Xh����$� J��]��(༰o��[�r�Ո�RĊF�4���E��
q�t�3^����+��{�h�+�x�+/_�t1��s��Ӌ��Uy@�Y*�.�3�������������m��-,{o�ź?�e��w/r̜O��(�YN�9tqv��g��|_]���F�֗:�"�<���@�"����q;:^K�e�lv�ħc���w܅��
p����U:������9��C�(j�����>.��DYf�ίX��,��v��	H��7��ic��Ոz���]��9�JgwC�e��h���B����E�j�V�`0^F�s������o���wF<��;��m��������q�E��|��
��1�3�.��g�i�t�Lc��j>E�f�J0c�]q���v=����yp`&?��Q_�S�cn�a.tDbG�Aÿ�͙<	>���R�N*�XF��A��@t����H��W�{_O4�B;������8DZ�m�rI�"1(
%�����,����\���𦕿¬�6��%��q�P�D��/G�S7�mG6/����ܫ*�@���[������7C�ĭ8g�� 9��+��J�]͑��Ǒ�!�E��n�:�$��U)}vG"-�6��2<<U:bO9��c�Y��mV
����&�sF�3p
������Lϡjb�ae���q--ھ�H}��~�O�ذ
�XǙ����bR�'�#��rqv�15�^��V1V`��n,��v=$'a�K�c��lY���E�7��˒�-�X�}aq_�#�X��#�ċ�p�,�̳�U@�yHH��R�\u�;c���l�|Օ�H����1&;��|`w�c�C�Q��yv3 ����9�^�d�;������	�Q(yU��^s�Oy�ݧ@6~:q�t.@��vw��VH���xp:n%�A��=��%����B���@�:;^�7�wn�:*��cq��
����5H�Eg$�ȅ��\�(�eD�ӅQH�޿��������{!gQ��cp�������Ef�rzq�α�rR9gg���渺�E�ww�ϼ@�E�â�����C䘥.��Zl������� \a�n)'Pn��q�yv\^��X��x�I-���;�=9E
@�l˶k̞�}�)�.�}���<\�^��G�LUz�U�6m�!������vsX"� �3Ӿ��ުću��n���Iv�>��q�̿C8S���T��H«���6tw5
c[b���C��^e��*��^�g{5
c�%��T�T�	/�{��h� z���|�8�tE��m�V��㔰h���h���{=�ej�V�Cb��ꃃu>T.�D�8�#u
΁��!�v&YcJiٗ��8l#'�h���H{#��r)��·����qn%��F��	8��>¢mcD-�=`F��w�rcKQ���P�(P?��t�6p2���<��RW�Vt�kJ��7�)�q�e�������vC$��8Z�	/A	��
�>Hh�
�����i܁[��GD��T�^o��:������/��Rq.R�E't�j��+���`�G��i<�(�ز��Z� 7#�v.���\���I��-�X����mf���B��=�����Y�eV�.���j�q�l������?�!!�D҄7'	v�9�f �cJ<x
	�=��oZ�7>�f��5�u�֬�2+�|�&b1Q5 
�/"ڀ�l��g�����*6�G2��c��8�|�b����e�?�:�Qؒܯs*v�xՁ]X���[���if9_[�{��8z��|��c�/�|�â�I��M�;���+�OP
R�lD�l�λ��X�g�o��EԜ_7��Rsw�W��1�;��J��5������5R3�p�_�T)M�)�t�,?��}����Q�
O��p���fR�4-�wͶ����_�,9m���_-�~��|�X�{���6��0�{�`�b&SƮ������%^�(ߧk*����f�%�S��a�y!�#�?n$��H�@�*>S͠u�YN�ָ�+�`{���-��@"G/!\�`��b	<��c"�\�2����b�Ǚ7�	fٶ�r�W���Ou��=���#֖>H:�ո��g	R����D,�7I>��1�|z#��#ID���ԚA��9I~�W�_�B�8��Jg���$f�`���1?C�A��3�>A�?%����	�	��_�5r�;��ma&}�Y)L1V{)y����+�b�#-.V��ٿ��el癭� $L�5V��{c�tg>RRnܳ*	��e��
��g?}�6��lt�vE�y�Y�]�}޽hL"|堍y�t�G�K�̾���f$��"��p�Y��]� _�Br��^�H��7M;�5�4A�u^A�%�h�Ė�H|� $�_�R
@��F��"i�zƟ�E�~"���i��	������YH0Юj����.�<K�w��|�95E���D�-BRyW#g����̀-�m��������<vB4�."�_�"�$s�AXe�B9n����F#b1j"�$�{_`��eHBF���F2Ȫ��W�
V��{X���B��ɿ�y��#ѧ��K�}���\+y�AC~��y֦'��&i�;Q`Q�b�x5)?&i�^Iؗ)�e"RI5�d1��B�U%d�#���D��Hn����c�H-j�O�W�0tK�K�X�����gW)��
•�SP�!ʬ�կ�H� j����+y2�%�?0�`��
L�gYqd	p9	/�R	�/3�@��gZq�����J�|{Q�UC"�P�nE�%#�����d���uV�ͱ��0�R~p��_�E��u��+��zD5��9�(��Y$�5ɧ����V���}�	*��*�b1p1��d�/�b�:\��G��?���t܁Hyp�2郄���r�xF����E
�.�B@����VV`��OB�^��,D|?��+��g<p�4�t�'���j
�5$\I&������^D^\I�"��59�C���ЮH���[V!�FiWĞo�H���j\�
�)<�ēej������B�ر�0H�B
@!�k|�!/�Oj7��ǁ�b�hy85!�9GV��s�� t�Ac�h2q�i�����	~Q�"r.�jW�(&+�B#��+"�D$�G������m3F����~��U���)�9�튲18�]��|��-K
݊�(+#��X�ұ�-*� "�2KR���Dr4�kW����[i�vE�X�x�_ЮPE��@�vE���ծPe^GNiW��j$��q�
5q`r6�F �7��h����&�k�������"}��+�X�]��*���v����~�Q�X�T�Q���D�p�vE K���~�j��'���$��9AyU�B
@�Dj�ڦ�1�M�
5If4p:0L��t�׮PP	L2F@�YD��R�GQP1�Brٟ��>x8
�̬��8#��=+�?�8���c���Y�hVR݁��Kt��(�n.Ebߓ�;o����j�M���K�o[n\w�V�Z
����T`l�~�t���ë@	f(�K����Ơ��ê@q{k��x'ļ����é@q��)L�6f���;S�Q
��?u@7$=6��ˁ�"E:���P¡�YNG��$��..5J�N ����ρ�t��(�c���蜧�NFJ�)j�"��
��+g�Њz��P�E
�RZ���<���S�Jd���<�6~���X�R�8I�U�(efCZ����Z$i�L��v5J��8㊱%��(�@�3�(�fp"�	"
��̒_���(1`!RF�O��X�,�E�U�G
�3N"���a�^��!�$5J�m��79��{!a�j��P�O
��s�1
1
��x$)j>�AN6^
��F���Uj�d��8�h��@ʘ���¨�.�X^A�ZC�T �7��6��ԺIEND�B`�PK!���)RRwf-flyout/icons/301-logo.pngnu�[����PNG


IHDR\r�fgAMA���a cHRMz&�����u0�`:�p��Q<	pHYs��~�bKGD�C��IDATx^��	xT���f�@�[�Rŭ֫��+.@�QL��5��"q��U�T)�ҧ�j]��R�E����[�N6��[�Ŋ�Zp��We1$���̼�&�-�$9�����Q�$��9���#�1cfl���;Nl_�4��ى�
ܯY˛
�
1��
�Ն��w�� BTL��2���&H����+�/���4�KfY��<ٰ*�

`L���];�;ϗ���gbt ؑ^�l̥��F����Aȡ��B�N��3�L���R�7�:�̯����h���@$	;��W�,��&F�dsack�J�34���8m?v:!C���r
����e5Ю�YC�Hٔ���|��.12<��2愫Z[��e��#�Qyi��Rx�dsX��%��qa�\UVVu�e
����'��˦wj�hb-+;��:��H���Ȟ�n�^��ӱ����М@��xkh����Wϼ����|��Ot )d���job��������RB���ٳ-9f��A�<��,Mk�ƤB�ipl�
����b�}��v�+�t��2;�j'y�)���]�81�Ec/h���RJn�'v�=�jMݠ�1qb���pQ"��bD�j�
 ��63MJh���7Pl���~֗4vAH��놯�M�(j;Cc4��ʦ~]J���պ�
 ��q���@`6���.h)�qsD7�=XXh�4ơ���G�f`p�t{N�0�\E��(���g����Vv��4~����D�h�[G�;}�X��o2�F�x����o�6 �:Cw������M7�� g"eS&ʒ���E��>͈9����a��W����qh�%#>�D&��'�`�"�j��rv"��m��840��Odq���6�VHEE�8�Ugk�c⵺��@����{f�+����H�
-ɸ��o����@��Æ�ml��X�_EY�Ly�e"����ҁ��r8T�V7K��j6�6���j�!�2fNy��n�<��w�r�Y7�#nҭ84�°�����1%6�Â��h�˼T7���?���84���)�bv��D�%���>��/�
�
�_�ď�V4�+�����;ʒqoYm:��x�o��h�<�G5��cx�nvA�>�(�:��)ט3ǬC3��!_�1�~y�#�c��ܼ�/���@�"��m�[5fro���E�����_��'ɿ���t�4Ț����Sc�^IG�,M�';7ȃoW2�|�SS�¤M
��^!W��Wh̀���G>��{�h݋l�����q�t�;4�
�N��Pc���R�g���е����k[u{�� ���)�%{�okL��)T�=w#��#}t��|�F`~sd{���O	���"�iņ;���,n�I�66-\�!p���okF�q�vD4N�<�ٴY��X��MJ
+H�c����})��E#��{k����������-��h�?iN	
R*/������1-K����ެ1��7�(��]l�y���溬�à@J����ad"��fɳMk
<��ur��e%�y��d.nl��ڌh�T���	2�{�L�7��-_�!o��>��d����xX���f&���Tw���$ �����	��%1����������_=���W~���?b�����܆3��B�R���+���\��u���ؼV��o1�'��{l����s:4$��[�*�-mm�56ֿ��}�+A7�Ɲ�K؆_��Y�{�1Onl�_�)﹗H{v��iR�7Hi����^� f�i\տ�tSQZ]+�b�Ɣ��c��� �މؖ�c.�˼��^��bK��g��d��]��N=��^�+Ӽ���Vտ�R8J~��T6t������>�v�w[��D�0�����9�q��a��Ud�X6#�����
��H��Ml�X���6_��%?��GȒ*�d6�����k;޶m��K^X�E�9�q��U��<�)1��6|С��NC�3���
��f�����TD[�w��<����΢9�g��e�?�,hy����`��E��2�h��@�od�;�w��C�57���@+/��"G%R��O�t�\M 8	��&M:��m��We���c���t+�<ն�퇙��e�C�@���r߄�^�'���z�nC��!��e��d��ht��!�p ϔ�WGLK4�����R� ��Vy�����8�N��t��
@�@ټy�+�H��3`���e�jM`hy"9yw�_�15�(L7j��C���M��%Sbk��F�6i���I�<PVV��2^0���6��gq0
�.����=S��o�1s�F�h��|�,�֘�4���u
�'�L��;[6�g�3�7lx�O4@A09�!�QcJd����6��Gp0�"�O=�-='��LM~Qcs]�nC��
 �f[���L��̛��!�Py�+g���DJ�Z3��i�[!��ĉ��s6'�VoڲS6��C���4[���jL�1��^�ۡ�NHi�Yc_�t�O9�_��R�&@��
 @B�ޕ������5B�C����*����\��\no0	��Ǐ9~��"oט���2��6@|:����h�)�������t'����}��j"*֡T~��\w�n�a�s�Cwd,~��;������X���R�p'jL��\�jU�G������.\�#�,�uJ��������J�V>�~'�<S�3�N�pyoH

��Ə��(��,n��w77/���^�|(lc��ö��
��4$��3���2y8=��`����ɍ��B�����W�M{�
/ol�{L#@Jh>��=>_j��I1��lBkH
�'�9�/��M������y�k�B�m�Hy�19�7�;�ǚ2B���)�Ju��1%�Х�V�� #4�#r�/�8ڼp�nd
��*J��2d�kLeK(Vp�nd

�Î8��ؘ�jL��o~f�o�j���v�"��4&%
��]>�l��>
�QS0N�%��PRL|LSS}�F�>�
��؉ݕ���E��@�xPEi��dh���SccWi�4�;�j��Cc4���w�i�4�)�kdᅲƤ����/4�NzH$2u/��^�_�J��å���+5�V^���?m���rePW<�&�q���8��|��2�e�R�L�|�-�?���|�u{لB�켥o�y���j�!Z�1)6��¢�W�X���83*w�&?V�������^~�#e̽a�f��k��5d�M��y��D�dp�8�N��8���y�L�R����dO&���a�a^h\�\b4�ƌ�Y0���^"2�PRD|^��~�F�g��#�����R�%F�'��.u�"�Oh��}s��~_��'�DN��u_0�����n�m]@�m:(�S�2�?Ә^��|P�1s��i�b�%��K����&��!��X6~����s�1ko%C�:4(���?n����Ӝ�A$R�����.1�3�,�a�ֺu<�g϶�n�4����2ܫq`d���8�5��+^֡~�wp�ﹳ�Fi�K���АF ��g����!_��Uϗ�t�Ƥ����R�O�y�S3I��4O
�Ht�b��;)\�'�׫�^�;�D����w%~��G�f�%:�[�姎��?Kcrl�+�(��	<(1�CY�.���tk1��>��ɞ*��_,I�)��M��a�Y�U�|ý��w�yCt�%�|FcK�o4��8�T�͎��?S�����fy�fk�-J�d�O+g����wz����79K��2�$�{��gd,~�
R��j��9�{^(~W�&�6�5�Y7w�CD�M�7���(�mpΜ䉦���c�v���-S�v
��Li��%�&s.>�<ĭM�F�	\�CeU�����]��=��KM!���HX�<��$۽�wt{4���#�sL�Z|�yѝZ�elN����Z���?ܷy]Q��g
���Cd��1��E#�2�`8�s̝k=)^�R���� mp.��ΰu���u�Ӥ+_�s�����=�LK�ʉ%{����'u�Cܹ��1���Y��x
��~�ٹC��ޚ��:��ǻ�7�HY��qo��%�6-\�	<">�dni�x�J
kL*e���D�I$�������C����wdc2\��?�B�'p`�sʝ[��FV.��K��,KU��|%�C��3&����P#n��<�H����MM�oj���%�S}%q>��pkZ��I��;�����;���4;�rܟ��^l^+�v�m��Cܹ��)��#��ܚ��M�'�u����6�?4�����~�̰�⋗.��;�.1�(i�J�����s+�)û�qf�]��5h6%�w���ҾO�
?��R�\#x����2��ܚvk[c�$+�X����i�� �2u~�1����xi)������wm�nL���I��ż]��e�A��b����DJ�ohXU����;�9Ij�[pΙ���u���3�*I����J���ј�j
t�n����,nm�5�1��
�ڔ��gz�� �<������]����3sg���>��Cdq/դiHl)h�Y��(�I��z����g4������Aҭƻ��t�Oj ��5F�?�Y�F���Ja��$�L�t��i9���=j�B��v�M^�\I�ȼ{�>�|��
�f��; .{�ļ����8dd��k��}�����]���{)f?��9�C����A�3=j�[���.����!=A0"�s�g��Ei�݅@�˜�����v� ��Ι�5�c@�F�l�ʹ���;g��x����nʇ�yq�9�9ӣƻ�8}�b"�>�p��%g����؃�P�9�=7=�10�͓��e]�o��n��C�� �<����_��5�f�{dh7���^uJ�u{�^�L��@�q���
���J��gu���5w�-5�1�[�,�H��J��@���@߄�6whe�����N�:��=�x/�yxM#@��s��yQ��%���
��y���qqJ6���?�ꖯ�kZj[c�^
�.X�!����S*��ŝC�\��_R����
 �4'As��D��E��/ɟ�l��-+i��O����۽�,w>2D���̥����5�D��<�΂���~6�G=�v�W|.����W��XA�7��n��}�8��C�i���������ݹ��?��㵜B��<:5���d��_�X>��[�lB�93&�m�_��t�Ӥ~gk����G���(�L�㟤�^"�ّg|�K|n���5�sk֭]�)en�Y�X�8y��uț�\n\�D����1�k=)^�R�ټ
����CK�0�N����6<K�:�hT�\s�FO�ר�j�f����9�+4[J��Сa�K���+ߙ:����J�v��v��M��[�C������PF}j.�f�(ö^��8r����Φ�eO�����'�\|h���-;Õ��*[��:��>w.�Ц폒ox��Gy�cP�0��sP�b|N��Ztk������
��ce��'��ҡA%Ot�!���h�9͉⦚�<;�
�0L�du<$�Y�$��m�S��������C��'��os�<�u8�d����3!���t�s����u2ig�aA���ߔʽ�6n?����7��qD:�>ŧ��L�G��Ĉ<ѵ�_�5��o�	�ιv5N�|٬�Z�31��R_����K�h{���Y�|�s�q_5'���d��r���=eI�.�`�6H�==��*�����?I��{�X�<ΰ3A�a��Ca��I=| �K�LG����߿�_ʙAi=93*w7N��h�q|�ؔ��l�C�O�k�
f��u��g�,��7�7��+�a��DĿFf���������;o���8�f�4�gNy�IEND�B`�PK!���6��wf-flyout/wf-flyout.phpnu�[���<?php
/**
 * Universal fly-out menu for WebFactory plugins
 * (c) WebFactory Ltd, 2023
 */


if (false == class_exists('wf_flyout')) {
  class wf_flyout
  {
    var $ver = 1.0;
    var $plugin_file = '';
    var $plugin_slug = '';
    var $config = array();


    function __construct($plugin_file)
    {
      $this->plugin_file = $plugin_file;
      $this->plugin_slug = basename(dirname($plugin_file));
      $this->load_config();

      if (!is_admin()) {
        return;
      } else {
        add_action('admin_init', array($this, 'init'));
      }
    } // __construct


    function load_config()
    {
      $config = array();
      require_once plugin_dir_path($this->plugin_file) . 'wf-flyout/config.php';

      $defaults = array(
        'plugin_screen' => '',
        'icon_border' => '#0000ff',
        'icon_right' => '40px',
        'icon_bottom' => '40px',
        'icon_image' => '',
        'icon_padding' => '2px',
        'icon_size' => '55px',
        'menu_accent_color' => '#ca4a1f',
        'custom_css' => '',
        'menu_items' => array(),
      );

      $config = array_merge($defaults, $config);
      if (!is_array($config['plugin_screen'])) {
        $config['plugin_screen'] = array($config['plugin_screen']);
      }

      $this->config = $config;
    } // load_config


    function is_plugin_screen()
    {
      $screen = get_current_screen();

      if (in_array($screen->id, $this->config['plugin_screen'])) {
        return true;
      } else {
        return false;
      }
    } // is_plugin_screen


    function init()
    {
      add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
      add_action('admin_head', array($this, 'admin_head'));
      add_action('admin_footer', array($this, 'admin_footer'));
    } // init


    function admin_enqueue_scripts()
    {
      if (false === $this->is_plugin_screen()) {
        return;
      }

      wp_enqueue_style('wf_flyout', plugin_dir_url($this->plugin_file) . 'wf-flyout/wf-flyout.css', array(), $this->ver);
      wp_enqueue_script('wf_flyout', plugin_dir_url($this->plugin_file) . 'wf-flyout/wf-flyout.js', array(), $this->ver, true);
    } // admin_enqueue_scripts


    function admin_head()
    {
      if (false === $this->is_plugin_screen()) {
        return;
      }

      $out = '<style type="text/css">';
      $out .= '#wf-flyout {
        right: ' .  sanitize_text_field($this->config['icon_right']) . ';
        bottom: ' .  sanitize_text_field($this->config['icon_bottom']) . ';
      }';
      $out .= '#wf-flyout #wff-image-wrapper {
        border: ' .  sanitize_text_field($this->config['icon_border']) . ';
      }';
      $out .= '#wf-flyout #wff-button img {
        padding: ' .  sanitize_text_field($this->config['icon_padding']) . ';
        width: ' .  sanitize_text_field($this->config['icon_size']) . ';
        height: ' .  sanitize_text_field($this->config['icon_size']) . ';
      }';
      $out .= '#wf-flyout .wff-menu-item.accent {
        background: ' .  sanitize_text_field($this->config['menu_accent_color']) . ';
      }';
      $out .=  sanitize_text_field($this->config['custom_css']);
      $out .= '</style>';

      WP_Reset_Utility::wp_kses_wf($out);
    } // admin_head


    function admin_footer()
    {
      if (false === $this->is_plugin_screen()) {
        return;
      }

      $out = '';
      $icons_url = plugin_dir_url($this->plugin_file) . 'wf-flyout/icons/';
      $default_link_item = array('class' => '', 'href' => '#', 'target' => '_blank', 'label' => '', 'icon' => '', 'data' => '');

      $out .= '<div id="wff-overlay"></div>';

      $out .= '<div id="wf-flyout">';

      $out .= '<a href="#" id="wff-button">';
      $out .= '<span class="wff-label">Open Quick Links</span>';
      $out .= '<span id="wff-image-wrapper">';
      $out .= '<img src="' . esc_url($icons_url . $this->config['icon_image']) . '" alt="Open Quick Links" title="Open Quick Links">';
      $out .= '</span>';
      $out .= '</a>';

      $out .= '<div id="wff-menu">';
      $i = 0;
      foreach (array_reverse($this->config['menu_items']) as $item) {
        $i++;
        $item = array_merge($default_link_item, $item);

        if (!empty($item['icon']) && substr($item['icon'], 0, 9) != 'dashicons') {
          $item['class'] .= ' wff-custom-icon';
          $item['class'] = trim($item['class']);
        }

        $out .= '<a href="' . esc_url($item['href']) . '" class="wff-menu-item wff-menu-item-' . $i . ' ' . esc_attr($item['class']) . '" target="_blank">';
        $out .= '<span class="wff-label visible">' . esc_html($item['label']) . '</span>';
        if (substr($item['icon'], 0, 9) == 'dashicons') {
          $out .= '<span class="dashicons ' . sanitize_text_field($item['icon']) . '"></span>';
        } elseif (!empty($item['icon'])) {
          $out .= '<span class="wff-icon"><img src="' . esc_url($icons_url . $item['icon']) . '"></span>';
        }
        $out .= '</a>';
      } // foreach
      $out .= '</div>'; // #wff-menu

      $out .= '</div>'; // #wf-flyout

      WP_Reset_Utility::wp_kses_wf($out);
    } // admin_footer
  } // wf_flyout
} // if class exists
PK!`���D�Dwp-reset-utility.phpnu�[���<?php
/*
 * WP Reset
 * Utility & Helper functions
 * (c) WebFactory Ltd, 2015 - 2023
 */

// include only file
if (!defined('ABSPATH')) {
  die('Do not open this file directly.');
}

class WP_Reset_Utility
{
  /**
   * Get a list of WordPress versions available for installation
   *
   * @return array
   */
  static function get_wordpress_versions()
  {
    $versions = '{"5.8-alpha-51049":"bleeding","5.7.3-alpha-51036":"point","5.7.2":1620870664,"5.7.1":1618466956,"5.7":1615323910,"5.6.2":1614009199,"5.6.1":1612403115,"5.6":1607510561,"5.5.3":1604135302,"5.5.2":1604048028,"5.5.1":1599016376,"5.5":1597196480,"5.4.2":1591904327,"5.4.1":1588268252,"5.4":1586433381,"5.3.2":1578431355,"5.3.1":1576222826,"5.3":1573985840,"5.2.4":1572476910,"5.2.3":1567634400,"5.2.2":1560816000,"5.2.1":1558396800,"5.2":1557187200,"5.1.2":1567641600,"5.1.1":1552435200,"5.1":1550707200,"5.0.6":1567641600,"5.0.4":1552435200,"5.0.3":1546992000,"5.0.2":1545177600,"5.0.1":1544659200,"0":1544054400,"4.9.11":1567641600,"4.9.10":1552435200,"4.9.9":1544659200,"4.9.8":1533168000,"4.9.7":1530748800,"4.9.6":1526515200,"4.9.5":1522713600,"4.9.4":1517875200,"4.9.3":1517788800,"4.9.2":1516060800,"4.9.1":1511913600,"4.9":1510790400,"4.8.10":1567641600,"4.8.9":1552435200,"4.8.8":1544659200,"4.8.7":1530748800,"4.8.6":1522713600,"4.8.5":1516060800,"4.8.4":1511913600,"4.8.3":1509408000,"4.8.2":1505779200,"4.8.1":1501632000,"4.8":1496880000,"4.7.14":1567641600,"4.7.13":1552435200,"4.7.12":1544659200,"4.7.11":1530748800,"4.7.10":1522713600,"4.7.9":1516060800,"4.7.8":1511913600,"4.7.7":1509408000,"4.7.6":1505779200,"4.7.5":1494892800,"4.7.4":1492646400,"4.7.3":1488758400,"4.7.2":1485388800,"4.7.1":1484092800,"4.7":1480982400,"4.6.15":1567641600,"4.6.14":1552435200,"4.6.13":1544659200,"4.6.12":1530748800,"4.6.11":1522713600,"4.6.10":1516060800,"4.6.9":1511913600,"4.6.8":1509408000,"4.6.7":1505779200,"4.6.6":1494892800,"4.6.5":1492646400,"4.6.4":1488758400,"4.6.3":1485388800,"4.6.2":1484092800,"4.6.1":1473206400,"4.6":1471305600,"4.5.18":1567641600,"4.5.17":1552435200,"4.5.16":1544659200,"4.5.15":1530748800,"4.5.14":1522713600,"4.5.13":1516060800,"4.5.12":1511913600,"4.5.11":1509408000,"4.5.10":1505779200,"4.5.9":1494892800,"4.5.8":1492646400,"4.5.7":1488758400,"4.5.6":1485388800,"4.5.5":1484092800,"4.5.4":1473206400,"4.5.3":1466467200,"4.5.2":1462492800,"4.5.1":1461628800,"4.5":1460419200,"4.4.19":1567641600,"4.4.18":1552435200,"4.4.17":1544659200,"4.4.16":1530748800,"4.4.15":1522713600,"4.4.14":1516060800,"4.4.13":1511913600,"4.4.12":1509408000,"4.4.11":1505779200,"4.4.10":1494892800,"4.4.9":1492646400,"4.4.8":1488758400,"4.4.7":1485388800,"4.4.6":1484092800,"4.4.5":1473206400,"4.4.4":1466467200,"4.4.3":1462492800,"4.4.2":1454371200,"4.4.1":1452038400,"4.4":1449532800,"4.3.20":1567641600,"4.3.19":1552435200,"4.3.18":1544659200,"4.3.17":1530748800,"4.3.16":1522713600,"4.3.15":1516060800,"4.3.14":1511913600,"4.3.13":1509408000,"4.3.12":1505779200,"4.3.11":1494892800,"4.3.10":1492646400,"4.3.9":1488758400,"4.3.8":1485388800,"4.3.7":1484092800,"4.3.6":1473206400,"4.3.5":1466467200,"4.3.4":1462492800,"4.3.3":1454371200,"4.3.2":1452038400,"4.3.1":1442275200,"4.3":1439856000,"4.2.24":1567641600,"4.2.23":1552435200,"4.2.22":1544659200,"4.2.21":1530748800,"4.2.20":1522713600,"4.2.19":1516060800,"4.2.18":1511913600,"4.2.17":1509408000,"4.2.16":1505779200,"4.2.15":1494892800,"4.2.14":1492646400,"4.2.13":1488758400,"4.2.12":1485388800,"4.2.11":1484092800,"4.2.10":1473206400,"4.2.9":1466467200,"4.2.8":1462492800,"4.2.7":1454371200,"4.2.6":1452038400,"4.2.5":1442275200,"4.2.4":1438646400,"4.2.3":1437609600,"4.2.2":1430956800,"4.2.1":1430092800,"4.2":1429747200,"4.1.27":1567641600,"4.1.26":1552435200,"4.1.25":1544659200,"4.1.24":1530748800,"4.1.23":1522713600,"4.1.22":1516060800,"4.1.21":1511913600,"4.1.20":1509408000,"4.1.19":1505779200,"4.1.18":1494892800,"4.1.17":1492646400,"4.1.16":1488758400,"4.1.15":1485388800,"4.1.14":1484092800,"4.1.13":1473206400,"4.1.12":1466467200,"4.1.11":1462492800,"4.1.10":1454371200,"4.1.9":1452038400,"4.1.8":1442275200,"4.1.7":1438646400,"4.1.6":1437609600,"4.1.5":1430956800,"4.1.4":1430092800,"4.1.3":1429747200,"4.1.2":1429574400,"4.1.1":1424217600,"4.1":1418860800,"4.0.27":1567641600,"4.0.26":1552435200,"4.0.25":1544659200,"4.0.24":1530748800,"4.0.23":1522713600,"4.0.22":1516060800,"4.0.21":1511913600,"4.0.20":1509408000,"4.0.19":1505779200,"4.0.18":1494892800,"4.0.17":1492646400,"4.0.16":1488758400,"4.0.15":1485388800,"4.0.14":1484092800,"4.0.13":1473206400,"4.0.12":1466467200,"4.0.11":1462492800,"4.0.10":1454371200,"4.0.9":1452038400,"4.0.8":1442275200,"4.0.7":1438646400,"4.0.6":1437609600,"4.0.5":1430870400,"4.0.4":1430092800,"4.0.3":1429747200,"4.0.2":1429574400,"4.0.1":1416441600,"1":1409788800,"3.9.28":1567641600,"3.9.27":1552435200,"3.9.26":1544659200,"3.9.25":1530748800,"3.9.24":1522713600,"3.9.23":1516060800,"3.9.22":1511913600,"3.9.21":1509408000,"3.9.20":1505779200,"3.9.19":1494892800,"3.9.18":1492646400,"3.9.17":1488758400,"3.9.16":1485388800,"3.9.15":1484092800,"3.9.14":1473206400,"3.9.13":1466467200,"3.9.12":1462492800,"3.9.11":1454371200,"3.9.10":1452038400,"3.9.9":1442275200,"3.9.8":1438646400,"3.9.7":1437609600,"3.9.6":1430956800,"3.9.5":1429747200,"3.9.4":1429574400,"3.9.3":1416441600,"3.9.2":1407283200,"3.9.1":1399507200,"3.9":1397606400,"3.8.30":1567641600,"3.8.29":1553126400,"3.8.28":1544659200,"3.8.27":1530748800,"3.8.26":1522713600,"3.8.25":1516060800,"3.8.24":1511913600,"3.8.23":1509408000,"3.8.22":1505779200,"3.8.21":1494892800,"3.8.20":1492646400,"3.8.19":1488758400,"3.8.18":1485388800,"3.8.17":1484092800,"3.8.16":1473206400,"3.8.15":1466467200,"3.8.14":1462492800,"3.8.13":1454371200,"3.8.12":1452038400,"3.8.11":1442275200,"3.8.10":1438646400,"3.8.9":1437609600,"3.8.8":1430956800,"3.8.7":1429747200,"3.8.6":1429574400,"3.8.5":1416441600,"3.8.4":1407283200,"3.8.3":1397433600,"3.8.2":1396915200,"3.8.1":1390435200,"3.8":1386806400,"3.7.30":1567641600,"3.7.29":1553126400,"3.7.28":1544659200,"3.7.27":1530748800,"3.7.26":1522713600,"3.7.25":1516060800,"3.7.24":1511913600,"3.7.23":1509408000,"3.7.22":1505779200,"3.7.21":1494892800,"3.7.20":1492646400,"3.7.19":1488758400,"3.7.18":1485388800,"3.7.17":1484092800,"3.7.16":1473206400,"3.7.15":1466467200,"3.7.14":1462492800,"3.7.13":1454371200,"3.7.12":1452038400,"3.7.11":1442275200,"3.7.10":1438646400,"3.7.9":1437609600,"3.7.8":1430956800,"3.7.7":1429747200,"3.7.6":1429574400,"3.7.5":1416441600,"3.7.4":1407283200,"3.7.3":1397433600,"3.7.2":1396915200,"3.7.1":1383004800,"3.7":1382572800,"3.6.1":1378857600,"3.6":1375315200,"3.5.2":1371772800,"3.5.1":1358985600,"3.5":1355184000,"3.4.2":1346889600,"3.4.1":1340755200,"3.4":1339545600,"3.3.3":1340755200,"3.3.2":1334880000,"3.3.1":1325548800,"3.3":1323648000,"3.2.1":1310428800,"3.2":1309737600,"3.1.4":1309305600,"3.1.3":1306281600,"3.1.2":1303776000,"3.1.1":1301875200,"3.1":1298419200,"3.0.6":1303776000,"3.0.5":1297036800,"3.0.4":1293580800,"3.0.3":1291766400,"3.0.2":1291075200,"3.0.1":1280361600,"2":1276732800,"2.9.2":1266192000,"2.9.1":1262563200,"2.9":1261094400,"2.8.6":1257984000,"2.8.5":1255996800,"2.8.4":1250035200,"2.8.3":1249257600,"2.8.2":1248048000,"2.8.1":1247097600,"2.8":1244678400,"2.7.1":1234224000,"2.7":1228867200,"2.6.5":1227571200,"2.6.3":1224720000,"2.6.2":1220832000,"2.6.1":1218758400,"2.6":1216080000,"2.5.1":1209081600,"2.5":1206748800,"2.3.3":1202169600,"2.3.2":1198886400,"2.3.1":1193356800,"2.3":1190678400,"2.2.3":1190592000,"2.2.2":1190592000,"2.2.1":1190592000,"2.2":1190592000,"2.1.3":1190592000,"2.1.2":1190592000,"2.1.1":1190592000,"2.1":1190592000,"2.0.11":1190592000,"2.0.10":1190592000,"2.0.9":1190592000,"2.0.8":1190592000,"2.0.7":1190592000,"2.0.6":1190592000,"2.0.5":1190592000,"2.0.4":1190592000,"2.0.1":1190592000,"3":1190592000,"1.5.2":1190592000,"1.5.1.3":1190592000,"1.5.1.2":1190592000,"1.5.1.1":1190592000,"1.5.1":1190592000,"1.5-strayhorn":1190592000,"1.2.2":1190592000,"1.2.1":1190592000,"1.2-mingus":1190592000,"1.2-delta":1190592000,"1.0-platinum":1190592000,"1.0.2":1190592000,"1.0.2-blakey":1190592000,"1.0.1-miles":1190592000}';

    $versions = json_decode($versions);

    return $versions;
  } // get_wordpress_versions


  /**
   * Format file size to human readable string
   *
   * @param int  $bytes  Size in bytes to format.
   *
   * @return string
   */
  static function format_size($bytes)
  {
    if ($bytes > 1073741824) {
      return number_format_i18n($bytes / 1073741824, 2) . ' GB';
    } elseif ($bytes > 1048576) {
      return number_format_i18n($bytes / 1048576, 1) . ' MB';
    } elseif ($bytes > 1024) {
      return number_format_i18n($bytes / 1024, 1) . ' KB';
    } else {
      return number_format_i18n($bytes, 0) . ' bytes';
    }
  } // format_size


  /**
   * Create select options for select
   *
   * @param array $options options
   * @param string $selected selected value
   * @param bool $output echo, if false return html as string
   * @return string html with options
   */
  static function create_select_options($options, $selected = null, $output = true)
  {
    $out = "\n";

    if (is_array($options) && !empty($options) && !isset($options[0]['val'])) {
      $tmp = array();
      foreach ($options as $val => $label) {
        $tmp[] = array('val' => $val, 'label' => $label);
      } // foreach
      $options = $tmp;
    }

    foreach ($options as $tmp) {
      if ($selected == $tmp['val']) {
        $out .= '<option selected="selected" value="' . esc_attr($tmp['val']) . '">' . esc_html($tmp['label']) . '&nbsp;</option>' . PHP_EOL;
      } else {
        $out .= '<option value="' . esc_attr($tmp['val']) . '">' . esc_html($tmp['label']) . '&nbsp;</option>' . PHP_EOL;
      }
    }

    if ($output) {
      WP_Reset_Utility::wp_kses_wf($out);
    } else {
      return $out;
    }
  } //  create_select_options


  /**
   * Get table size and row count as html
   *
   * @return string html with table details
   */
  static function get_table_details()
  {
    global $wpdb, $wp_reset;

    $tbl_core = $tbl_custom = $tbl_size = $tbl_rows = 0;
    $table_status = $wpdb->get_results('SHOW TABLE STATUS');
    if (is_array($table_status)) {
      foreach ($table_status as $index => $table) {
        if (0 !== stripos($table->Name, $wpdb->prefix)) {
          continue;
        }
        if (empty($table->Engine)) {
          continue;
        }

        $tbl_rows += $table->Rows;
        $tbl_size += $table->Data_length + $table->Index_length;
        if (in_array($table->Name, $wp_reset->core_tables)) {
          $tbl_core++;
        } else {
          $tbl_custom++;
        }
      } // foreach
    } else {
      return ' no tables found.';
    }
    return ' totaling ' . self::format_size($tbl_size) . ' in ' . number_format($tbl_rows) . ' rows.';
  } // get_table_details

  static function wp_kses_wf($html)
  {
    add_filter('safe_style_css', function ($styles) {
      $styles_wf = array(
        'text-align',
        'margin',
        'color',
        'float',
        'border',
        'background',
        'background-color',
        'border-bottom',
        'border-bottom-color',
        'border-bottom-style',
        'border-bottom-width',
        'border-collapse',
        'border-color',
        'border-left',
        'border-left-color',
        'border-left-style',
        'border-left-width',
        'border-right',
        'border-right-color',
        'border-right-style',
        'border-right-width',
        'border-spacing',
        'border-style',
        'border-top',
        'border-top-color',
        'border-top-style',
        'border-top-width',
        'border-width',
        'caption-side',
        'clear',
        'cursor',
        'direction',
        'font',
        'font-family',
        'font-size',
        'font-style',
        'font-variant',
        'font-weight',
        'height',
        'letter-spacing',
        'line-height',
        'margin-bottom',
        'margin-left',
        'margin-right',
        'margin-top',
        'overflow',
        'padding',
        'padding-bottom',
        'padding-left',
        'padding-right',
        'padding-top',
        'text-decoration',
        'text-indent',
        'vertical-align',
        'width',
        'display',
      );

      foreach ($styles_wf as $style_wf) {
        $styles[] = $style_wf;
      }
      return $styles;
    });

    $allowed_tags = wp_kses_allowed_html('post');
    $allowed_tags['input'] = array(
      'type' => true,
      'style' => true,
      'class' => true,
      'id' => true,
      'checked' => true,
      'disabled' => true,
      'name' => true,
      'size' => true,
      'placeholder' => true,
      'value' => true,
      'data-*' => true,
      'size' => true,
      'disabled' => true
    );

    $allowed_tags['textarea'] = array(
      'type' => true,
      'style' => true,
      'class' => true,
      'id' => true,
      'checked' => true,
      'disabled' => true,
      'name' => true,
      'size' => true,
      'placeholder' => true,
      'value' => true,
      'data-*' => true,
      'cols' => true,
      'rows' => true,
      'disabled' => true
    );

    $allowed_tags['select'] = array(
      'type' => true,
      'style' => true,
      'class' => true,
      'id' => true,
      'checked' => true,
      'disabled' => true,
      'name' => true,
      'size' => true,
      'placeholder' => true,
      'value' => true,
      'data-*' => true,
      'multiple' => true,
      'disabled' => true
    );

    $allowed_tags['option'] = array(
      'type' => true,
      'style' => true,
      'class' => true,
      'id' => true,
      'checked' => true,
      'disabled' => true,
      'name' => true,
      'size' => true,
      'placeholder' => true,
      'value' => true,
      'selected' => true,
      'data-*' => true
    );
    $allowed_tags['optgroup'] = array(
      'type' => true,
      'style' => true,
      'class' => true,
      'id' => true,
      'checked' => true,
      'disabled' => true,
      'name' => true,
      'size' => true,
      'placeholder' => true,
      'value' => true,
      'selected' => true,
      'data-*' => true,
      'label' => true
    );

    $allowed_tags['a'] = array(
      'href' => true,
      'data-*' => true,
      'class' => true,
      'style' => true,
      'id' => true,
      'target' => true,
      'data-*' => true,
      'role' => true,
      'aria-controls' => true,
      'aria-selected' => true,
      'disabled' => true
    );

    $allowed_tags['div'] = array(
      'style' => true,
      'class' => true,
      'id' => true,
      'data-*' => true,
      'role' => true,
      'aria-labelledby' => true,
      'value' => true,
      'aria-modal' => true,
      'tabindex' => true
    );

    $allowed_tags['li'] = array(
      'style' => true,
      'class' => true,
      'id' => true,
      'data-*' => true,
      'role' => true,
      'aria-labelledby' => true,
      'value' => true,
      'aria-modal' => true,
      'tabindex' => true
    );

    $allowed_tags['span'] = array(
      'style' => true,
      'class' => true,
      'id' => true,
      'data-*' => true,
      'aria-hidden' => true
    );

    $allowed_tags['style'] = array(
      'class' => true,
      'id' => true,
      'type' => true
    );

    $allowed_tags['form'] = array(
      'style' => true,
      'class' => true,
      'id' => true,
      'method' => true,
      'action' => true,
      'data-*' => true
    );

    echo wp_kses($html, $allowed_tags);

    add_filter('safe_style_css', function ($styles) {
      $styles_wf = array(
        'text-align',
        'margin',
        'color',
        'float',
        'border',
        'background',
        'background-color',
        'border-bottom',
        'border-bottom-color',
        'border-bottom-style',
        'border-bottom-width',
        'border-collapse',
        'border-color',
        'border-left',
        'border-left-color',
        'border-left-style',
        'border-left-width',
        'border-right',
        'border-right-color',
        'border-right-style',
        'border-right-width',
        'border-spacing',
        'border-style',
        'border-top',
        'border-top-color',
        'border-top-style',
        'border-top-width',
        'border-width',
        'caption-side',
        'clear',
        'cursor',
        'direction',
        'font',
        'font-family',
        'font-size',
        'font-style',
        'font-variant',
        'font-weight',
        'height',
        'letter-spacing',
        'line-height',
        'margin-bottom',
        'margin-left',
        'margin-right',
        'margin-top',
        'overflow',
        'padding',
        'padding-bottom',
        'padding-left',
        'padding-right',
        'padding-top',
        'text-decoration',
        'text-indent',
        'vertical-align',
        'width'
      );

      foreach ($styles_wf as $style_wf) {
        if (($key = array_search($style_wf, $styles)) !== false) {
          unset($styles[$key]);
        }
      }
      return $styles;
    });
  }

} // WP_Reset_Utility
PK!)��DPPjs/wp-reset-pointers.jsnu�[���/*
 * WP Reset
 * Backend GUI pointers
 * (c) Web factory Ltd, 2017 - 2023
 */

jQuery(document).ready(function($){
  if (typeof wp_reset_pointers  == 'undefined') {
    return;
  }

  $.each(wp_reset_pointers, function(index, pointer) {
    if (index.charAt(0) == '_') {
      return true;
    }
    $(pointer.target).pointer({
        content: '<h3>WP Reset</h3><p>' + pointer.content + '</p>',
        pointerWidth: 380,
        position: {
            edge: pointer.edge,
            align: pointer.align
        },
        close: function() {
                $.get(ajaxurl, {
                    notice_name: index,
                    _ajax_nonce: wp_reset_pointers._nonce_dismiss_pointer,
                    action: 'wp_reset_dismiss_notice'
                });
        }
      }).pointer('open');
  });
});
PK!ٓ[YZ�Z�js/wp-reset.jsnu�[���/**
 * WP Reset
 * https://wpreset.com/
 * (c) WebFactory Ltd, 2017-2023
 */

jQuery(document).ready(function ($) {
  // init tabs
  $('#wp-reset-tabs')
    .tabs({
      create: function () {
       $('#loading-tabs').remove();
      },
      activate: function (event, ui) {
        localStorage.setItem('wp-reset-tabs', $('#wp-reset-tabs').tabs('option', 'active'));
      },
      active: localStorage.getItem('wp-reset-tabs') || 0,
    })
    .show();

  // helper for swithcing tabs & linking anchors in different tabs
  $('.tools_page_wp-reset').on('click', '.change-tab', function (e) {
    e.preventDefault();

    $('#wp-reset-tabs').tabs('option', 'active', $(this).data('tab'));

    // get the link anchor and scroll to it
    target = this.href.split('#')[1];
    if (target) {
      $.scrollTo('#' + target, 500, { offset: { top: -50, left: 0 } });
    }

    $(this).blur();
    return false;
  }); // jump to tab/anchor helper

  // init tooltips
  $('.tooltip').tooltipster({
    theme: ['tooltipster-punk', 'tooltipster-wpr'],
    delay: 0,
  });

  // helper for scrolling to anchor
  $('.tools_page_wp-reset').on('click', '.scrollto', function (e) {
    e.preventDefault();

    // get the link anchor and scroll to it
    target = this.href.split('#')[1];
    if (target) {
      $.scrollTo('#' + target, 500, { offset: { top: -50, left: 0 } });
    }

    $(this).blur();
    return false;
  }); // scroll to anchor helper

  // toggle button dropdown menu
  $('.tools_page_wp-reset').on('click', '.button.dropdown-toggle', function (e) {
    e.preventDefault();

    parent_dropdown = $(this).parent('.dropdown');
    sibling_menu = $(this).siblings('.dropdown-menu');

    $('.dropdown').not(parent_dropdown).removeClass('show');
    $('.dropdown-menu').not(sibling_menu).removeClass('show');

    $(parent_dropdown).toggleClass('show');
    $(sibling_menu).toggleClass('show');

    return false;
  }); // toggle button dropdown menu

  $(document).on('click', ':not(.dropdown-toggle), .dropdown-item', function () {
    wpr_close_dropdowns();
  });

  // delete transients
  $('.tools_page_wp-reset').on('click', '#delete-transients', function (e) {
    e.preventDefault();

    run_tool(this, 'delete_transients');

    return false;
  }); // delete transients

  // purge cache
  $('.tools_page_wp-reset').on('click', '#purge-cache', function (e) {
    e.preventDefault();

    run_tool(this, 'purge_cache');

    return false;
  }); // purge cache

  // delete uploads
  $('.tools_page_wp-reset').on('click', '#delete-uploads', function (e) {
    e.preventDefault();

    run_tool(this, 'delete_uploads');

    return false;
  }); // delete uploads

  // reset theme options (mods)
  $('.tools_page_wp-reset').on('click', '#reset-theme-options', function (e) {
    e.preventDefault();

    run_tool(this, 'reset_theme_options');

    return false;
  }); // reset theme options

  // delete themes
  $('.tools_page_wp-reset').on('click', '#delete-themes', function (e) {
    e.preventDefault();

    run_tool(this, 'delete_themes');

    return false;
  }); // delete themes

  // delete plugins
  $('.tools_page_wp-reset').on('click', '#delete-plugins', function (e) {
    e.preventDefault();

    var button = this;
    var confirm_title = $(button).data('confirm-title') || wp_reset.confirm_title;

    var tools = [
      {
        tool: 'deactivate_plugins',
        description: 'Deactivating plugins.',
        extra_data: { keep_default_theme: 0, keep_current_theme: 0 },
      },
      {
        tool: 'delete_plugins',
        description: 'Deleting plugins.',
        extra_data: {
          keep_wp_reset: 1,
          silent_deactivate: 0,
        },
      },
    ];
    var looper = $.Deferred().resolve();

    confirm_action(
      confirm_title,
      $(button).data('text-confirm'),
      $(button).data('btn-confirm') || $(button).text(),
      wp_reset.cancel_button
    ).then((result) => {
      if (!result.value) {
        return false;
      }

      wpr_swal.fire({
        title: $(button).data('text-wait'),
        text: ' ',
        type: false,
        allowOutsideClick: false,
        allowEscapeKey: false,
        allowEnterKey: false,
        showConfirmButton: false,
        imageUrl: wp_reset.icon_url,
        onOpen: () => {
          $(wpr_swal.getImage()).addClass('wpr_rotating');
        },
        imageWidth: 100,
        imageHeight: 100,
        imageAlt: $(button).data('text-wait'),
      });

      var failed = false;
      $.each(tools, function (i, data) {
        looper = looper.then(function () {
          if (failed) {
            return false;
          }
          wpr_swal.getContent().querySelector('#swal2-content').textContent =
            i + 1 + '/' + tools.length + ' - ' + data.description;
          return $.ajax({
            data: {
              action: 'wp_reset_run_tool',
              _ajax_nonce: wp_reset.nonce_run_tool,
              tool: data.tool,
              extra_data: data.extra_data,
            },
            url: ajaxurl,
          })
            .done(function (response) {
              if (response.success) {
                failed = false;
                if (i == tools.length - 1) {
                  if (response.data == 1) {
                    msg = $(button).data('text-done-singular');
                  } else {
                    msg = $(button).data('text-done').replace('%n', response.data);
                  }
                  wpr_swal_params = { icon: 'success', title: msg };

                  wpr_swal.fire(wpr_swal_params);
                }
              } else {
                wpr_swal.close();
                wpr_swal.fire({
                  icon: 'error',
                  title: wp_reset.documented_error,
                  text: response.data,
                });
                failed = true;
                return false;
              }
            })
            .error(function (response) {
              wpr_swal.close();
              wpr_swal.fire({
                icon: 'error',
                title: wp_reset.undocumented_error,
              });
              failed = true;
              return false;
            });
        });
      });
    }); // confirm ok

    return false;
  }); // delete plugins

  // drop custom tables
  $('.tools_page_wp-reset').on('click', '#drop-custom-tables', function (e) {
    e.preventDefault();

    run_tool(this, 'drop_custom_tables');

    return false;
  }); // drop custom tables

  // truncate custom tables
  $('.tools_page_wp-reset').on('click', '#truncate-custom-tables', function (e) {
    e.preventDefault();

    run_tool(this, 'truncate_custom_tables');

    return false;
  }); // truncate custom tables

  // delete htaccess file
  $('.tools_page_wp-reset').on('click', '#delete-htaccess', function (e) {
    e.preventDefault();

    run_tool(this, 'delete_htaccess');

    return false;
  }); // delete htaccess file

  // delete auth cookies
  $('.tools_page_wp-reset').on('click', '#delete-wp-cookies', function (e) {
    e.preventDefault();

    run_tool(this, 'delete_wp_cookies');

    return false;
  }); // delete auth cookies

  // delete local data
  $('.tools_page_wp-reset').on('click', '#delete-local-data', function (e) {
    e.preventDefault();
    var button = this;
    var confirm_title = $(button).data('confirm-title') || wp_reset.confirm_title;

    confirm_action(
      confirm_title,
      $(button).data('text-confirm'),
      $(button).data('btn-confirm'),
      wp_reset.cancel_button
    ).then((result) => {
      if (!result.value) {
        return false;
      }

      cnt = wpr_clear_local(true, true);
      if (cnt == 1) {
        msg = $(button).data('text-done-singular');
      } else {
        msg = $(button).data('text-done').replace('%n', cnt);
      }
      wpr_swal.fire({
        icon: 'success',
        title: msg,
        timer: 2000,
        timerProgressBar: true,
        showConfirmButton: true,
      });
    });

    return false;
  }); // delete local data

  // compare snapshot
  $('#wpr-snapshots').on('click', '.compare-snapshot', 'click', function (e) {
    e.preventDefault();
    uid = $(this).data('ss-uid');
    button = $(this);

    block_ui($(button).data('wait-msg'));
    $.get({
      url: ajaxurl,
      data: {
        action: 'wp_reset_run_tool',
        _ajax_nonce: wp_reset.nonce_run_tool,
        tool: 'compare_snapshots',
        extra_data: uid,
      },
    })
      .always(function (data) {
        wpr_swal.close();
      })
      .done(function (data) {
        if (data.success) {
          msg = $(button).data('title').replace('%s', $(button).data('name'));
          wpr_swal.fire({
            width: '90%',
            title: msg,
            html: data.data,
            showConfirmButton: false,
            allowEnterKey: false,
            focusConfirm: false,
            showCloseButton: true,
            customClass: 'compare-snapshots',
          });
        } else {
          wpr_swal.fire({
            icon: 'error',
            title: wp_reset.documented_error + ' ' + data.data,
          });
        }
      })
      .fail(function (data) {
        wpr_swal.fire({ icon: 'error', title: wp_reset.undocumented_error });
      });

    return false;
  }); // compare snapshot

  // restore snapshot
  $('#wpr-snapshots').on('click', '.restore-snapshot', 'click', function (e) {
    e.preventDefault();
    uid = $(this).data('ss-uid');

    run_tool(this, 'restore_snapshot', uid);

    return false;
  }); // restore snapshot

  // download snapshot
  $('#wpr-snapshots').on('click', '.download-snapshot', 'click', function (e) {
    e.preventDefault();
    uid = $(this).data('ss-uid');
    button = this;

    block_ui($(this).data('wait-msg'));
    $.get({
      url: ajaxurl,
      data: {
        action: 'wp_reset_run_tool',
        _ajax_nonce: wp_reset.nonce_run_tool,
        tool: 'download_snapshot',
        extra_data: uid,
      },
    })
      .always(function (data) {
        wpr_swal.close();
      })
      .done(function (data) {
        if (data.success) {
          msg = $(button).data('success-msg').replace('%s', data.data);
          wpr_swal.fire({ icon: 'success', title: msg });
        } else {
          wpr_swal.fire({
            icon: 'error',
            title: wp_reset.documented_error + ' ' + data.data,
          });
        }
      })
      .fail(function (data) {
        wpr_swal.fire({ icon: 'error', title: wp_reset.undocumented_error });
      });

    return false;
  }); // download snapshot

  // delete snapshot
  $('#wpr-snapshots').on('click', '.delete-snapshot', 'click', function (e) {
    e.preventDefault();
    uid = $(this).data('ss-uid');

    run_tool(this, 'delete_snapshot', uid);

    return false;
  }); // delete snapshot

  // create snapshot
  $('.tools_page_wp-reset').on('click', '.create-new-snapshot', function (e) {
    e.preventDefault();

    description = $(this).data('description') || '';

    wpr_swal
      .fire({
        title: wp_reset.snapshot_title,
        icon: 'question',
        text: wp_reset.snapshot_text,
        input: 'text',
        inputValue: description,
        inputPlaceholder: wp_reset.snapshot_placeholder,
        showCancelButton: true,
        focusConfirm: false,
        confirmButtonText: wp_reset.snapshot_confirm,
        cancelButtonText: wp_reset.cancel_button,
        width: 600,
      })
      .then((result) => {
        if (typeof result.value != 'undefined') {
          block = block_ui(wp_reset.snapshot_wait);
          $.get({
            url: ajaxurl,
            data: {
              action: 'wp_reset_run_tool',
              _ajax_nonce: wp_reset.nonce_run_tool,
              tool: 'create_snapshot',
              extra_data: result.value,
            },
          })
            .always(function (data) {
              wpr_swal.close();
            })
            .done(function (data) {
              if (data.success) {
                wpr_swal
                  .fire({
                    icon: 'success',
                    title: wp_reset.snapshot_success,
                    timer: 2000,
                    timerProgressBar: true,
                    showConfirmButton: true,
                  })
                  .then((result) => {
                    location.reload();
                  });
              } else {
                wpr_swal.fire({
                  icon: 'error',
                  title: wp_reset.documented_error + ' ' + data.data,
                });
              }
            })
            .fail(function (data) {
              wpr_swal.fire({
                icon: 'error',
                title: wp_reset.undocumented_error,
              });
            });
        } // if confirmed
      });

    return false;
  }); // create snapshot

  // show/hide extra table info in snapshot diff
  $('body.tools_page_wp-reset').on('click', '.header-row', function (e) {
    e.preventDefault();

    parent = $(this).parents('div.wpr-table-container > table > tbody');
    $(' > tr:not(.header-row)', parent).toggleClass('hidden');

    $('span.dashicons', parent).toggleClass('dashicons-arrow-down-alt2').toggleClass('dashicons-arrow-up-alt2');

    return false;
  }); // show hide extra info in diff

  // standard way of running a tool, with confirmation, loading and success message
  function run_tool(button, tool_name, extra_data) {
    var confirm_title = $(button).data('confirm-title') || wp_reset.confirm_title;

    wpr_close_dropdowns();

    confirm_action(
      confirm_title,
      $(button).data('text-confirm'),
      $(button).data('btn-confirm'),
      wp_reset.cancel_button
    ).then((result) => {
      if (result.value) {
        block = block_ui($(button).data('text-wait'));
        $.get({
          url: ajaxurl,
          data: {
            action: 'wp_reset_run_tool',
            _ajax_nonce: wp_reset.nonce_run_tool,
            tool: tool_name,
            extra_data: extra_data,
          },
        })
          .always(function (data) {
            wpr_swal.close();
          })
          .done(function (data) {
            if (data.success) {
              if (data.data == 1) {
                msg = $(button).data('text-done-singular');
              } else {
                msg = $(button).data('text-done').replace('%n', data.data);
              }
              wpr_swal
                .fire({
                  icon: 'success',
                  title: msg,
                  timer: 2000,
                  timerProgressBar: true,
                })
                .then(() => {
                  if (tool_name == 'restore_snapshot') {
                    location.reload();
                  }
                });
              if (tool_name == 'delete_snapshot') {
                $('#wpr-ss-' + extra_data).remove();
                if ($('#wpr-snapshots tr').length <= 1) {
                  $('#wpr-snapshots').hide();
                  $('#ss-no-snapshots').show();
                }
              }
            } else {
              wpr_swal.fire({
                icon: 'error',
                title: wp_reset.documented_error + ' ' + data.data,
              });
            }
          })
          .fail(function (data) {
            wpr_swal.fire({
              icon: 'error',
              title: wp_reset.undocumented_error,
            });
          });
      } // if confirmed
    });
  } // run_tool

  // display a message while an action is performed
  function block_ui(message) {
    tmp = wpr_swal.fire({
      text: message,
      type: false,
      imageUrl: wp_reset.icon_url,
      onOpen: () => {
        $(wpr_swal.getImage()).addClass('rotating');
      },
      imageWidth: 100,
      imageHeight: 100,
      imageAlt: message,
      allowOutsideClick: false,
      allowEscapeKey: false,
      allowEnterKey: false,
      showConfirmButton: false,
    });

    return tmp;
  } // block_ui

  // display dialog to confirm action
  function confirm_action(title, question, btn_confirm, btn_cancel) {
    tmp = wpr_swal.fire({
      title: title,
      icon: 'question',
      html: question,
      showCancelButton: true,
      focusConfirm: false,
      focusCancel: true,
      confirmButtonText: btn_confirm,
      cancelButtonText: btn_cancel,
      confirmButtonColor: '#dd3036',
      width: 650,
    });

    return tmp;
  } // confirm_action

  $('#wp_reset_form').on('submit', function (e, confirmed) {
    if (!confirmed) {
      $('#wp_reset_submit').trigger('click');
      e.preventDefault();
      return false;
    }

    $reset_form = $(this);

    $.get({
        url: ajaxurl,
        data: {
            action: 'wp_reset_run_tool',
            _ajax_nonce: wp_reset.nonce_run_tool,
            tool: 'before_reset'
        },
    }).done(function (data) {
        if (data.success) {
            $reset_form.off('submit').submit();
        } else {
            wpr_swal.fire({
                icon: 'error',
                title: wp_reset.undocumented_error,
            });
        }
    }).fail(function (data) {
        wpr_swal.fire({
            icon: 'error',
            title: wp_reset.undocumented_error,
        });
    });

    return false;
  }); // bypass default submit behaviour

  $('#wp_reset_submit').click(function (e) {
    if ($('#wp_reset_confirm').val() !== 'reset') {
      wpr_swal.fire({
        title: wp_reset.invalid_confirmation_title,
        text: wp_reset.invalid_confirmation,
        icon: 'error',
        confirmButtonText: wp_reset.ok_button,
      });

      e.preventDefault();
      return false;
    } // wrong confirmation code

    message = wp_reset.confirm1 + '<br>' + wp_reset.confirm2;
    wpr_swal
      .fire({
        title: wp_reset.confirm_title_reset,
        icon: 'question',
        html: message,
        showCancelButton: true,
        focusConfirm: false,
        focusCancel: true,
        confirmButtonText: wp_reset.confirm_button,
        cancelButtonText: wp_reset.cancel_button,
        confirmButtonColor: '#dd3036',
        width: 600,
      })
      .then((result) => {
        if (result.value === true) {
          block_ui(wp_reset.doing_reset);
          $('#wp_reset_form').trigger('submit', true);
        }
      });

    e.preventDefault();
    return false;
  }); // reset submit

  // collapse / expand card
  $('.tools_page_wp-reset').on('click', '.toggle-card', function (e, skip_anim) {
    e.preventDefault();

    card = $(this).parents('.card').toggleClass('collapsed');
    $('.dashicons', this).toggleClass('dashicons-arrow-up-alt2').toggleClass('dashicons-arrow-down-alt2');
    $(this).blur();

    if (typeof skip_anim != 'undefined' && skip_anim) {
      $(card).find('.card-body').toggle();
    } else {
      $(card).find('.card-body').slideToggle(500);
    }

    cards = localStorage.getItem('wp-reset-cards');
    if (cards == null) {
      cards = new Object();
    } else {
      cards = JSON.parse(cards);
    }

    card_id = card.attr('id') || $('h4', card).attr('id') || '';

    if (card.hasClass('collapsed')) {
      cards[card_id] = 'collapsed';
    } else {
      cards[card_id] = 'expanded';
    }
    localStorage.setItem('wp-reset-cards', JSON.stringify(cards));

    return false;
  }); // toggle-card

  // handle saved and preset cards' state
  cards_state = localStorage.getItem('wp-reset-cards');
  if (cards_state != null) {
    cards_state = JSON.parse(cards_state);
  } else {
    cards_state = new Object();
  }

  cards = $('.card');
  $.each(cards, function (index, card) {
    card_name = $('h4', card).attr('id');
    if (!card_name) {
      return;
    }

    if (typeof cards_state == 'object' && cards_state.hasOwnProperty(card_name)) {
      if (cards_state[card_name] == 'collapsed') {
        $('a.toggle-card', card).trigger('click', true);
      }
    } else {
      if ($(card).hasClass('default-collapsed')) {
        $('a.toggle-card', card).trigger('click', true);
      }
    }
  });

  // dismiss notice / pointer
  $('.wpr-dismiss-notice').on('click', function (e) {
    notice_name = $(this).data('notice');
    if (!notice_name) {
      return true;
    }

    $.get(ajaxurl, {
      notice_name: notice_name,
      _ajax_nonce: wp_reset.nonce_dismiss_notice,
      action: 'wp_reset_dismiss_notice',
    });

    $(this).parents('.notice-wrapper').fadeOut();

    e.preventDefault();
    return false;
  }); // dismiss notice

  // open upsell
  $('.tools_page_wp-reset').on('click', '.button-pro-feature, .pro-feature', function (e) {
    e.preventDefault();
    this.blur();

    tool_id = $(this).data('feature') || $('.pro-feature', this).data('feature');

    open_upsell(tool_id);

    return false;
  });

  function clean_feature(feature) {
    feature = feature || 'free-plugin-unknown';
    feature = feature.toLowerCase().trim();
    feature = feature.replace(' ', '-');

    return feature;
  }

  function open_upsell(feature) {
    feature = clean_feature(feature);

    $('#wpreset-pro-dialog').dialog('open');

    $('#wpreset-pro-table .button-buy').each(function(ind, el) {
      tmp = $(el).data('href-org');
      tmp = tmp.replace('pricing-table', feature);
      $(el).attr('href', tmp);
    });
  } // open_upsell

  $('#wpreset-pro-dialog').dialog({
    dialogClass: 'wp-dialog wpreset-pro-dialog',
    modal: true,
    resizable: false,
    width: 800,
    height: 'auto',
    show: 'fade',
    hide: 'fade',
    close: function (event, ui) {
    },
    open: function (event, ui) {
      $(this).siblings().find('span.ui-dialog-title').html('WP Reset PRO');
      wpr_fix_dialog_close(event, ui);
    },
    autoOpen: false,
    closeOnEscape: true,
  });

  if (window.localStorage.getItem('wpreset_upsell_shown') != 'true') {
    open_upsell('welcome');
    window.localStorage.setItem('wpreset_upsell_shown', 'true');
    window.localStorage.setItem('wpreset_upsell_shown_timestamp', new Date().getTime());
  }

  if (window.location.hash == '#open-pro-dialog') {
    open_upsell('url-hash');
    window.location.hash = '';
  }

  $('#show-table-details').on('click', function (e) {
    e.preventDefault();

    $.get({
      url: ajaxurl,
      data: {
        action: 'wp_reset_run_tool',
        _ajax_nonce: wp_reset.nonce_run_tool,
        tool: 'get_table_details',
      },
    })
      .done(function (data) {
        if (data.success) {
          $('#wpr-table-details').html(data.data);
        } else {
          wpr_swal.fire({
            type: 'error',
            title: wp_reset.documented_error + ' ' + data.data,
          });
        }
      })
      .fail(function (data) {
        wpr_swal.fire({ type: 'error', title: wp_reset.undocumented_error });
      });

    return false;
  }); // show table details

  $('#wpr-save-license').on('click', function (e) {
    e.preventDefault();

    button = this;
    safe_refresh = true;

    block = block_ui($(button).data('text-wait'));
    wf_licensing_verify_licence_ajax('wpr', $('#wpr-license-key').val(), button);

    return;
  }); // license activation button

  $('#wpr-keyless-activation').on('click', function (e) {
    e.preventDefault();

    button = this;
    safe_refresh = true;

    block = block_ui($(button).data('text-wait'));
    wf_licensing_verify_licence_ajax('wpr', 'keyless', button);

    return;
  }); // keyless license activation button

  $('#wpr-deactivate-license').on('click', function (e) {
    e.preventDefault();

    button = this;
    safe_refresh = true;

    block = block_ui($(button).data('text-wait'));
    wf_licensing_deactivate_licence_ajax('wpr', $('#wpr-license-key').val(), button);

    return;
  }); // deactivate license button

  $('#wpr-license-key').on('keypress', function (e) {
    if (e.keyCode == 13) {
      e.preventDefault();
      $('#wpr-save-license').trigger('click');
    }
  }); // trigger license save on enter

  // Collections
  // for demo purposes only
  var collections_ajax_queue = [];
  var collections_ajax_queue_count = 0;
  var collections_ajax_queue_index = 0;
  var collections_errors = [];
  var collections_retried = false;
  wp_reset.collections = [];
  wp_reset.collections[1] = {
    id: 1,
    name: 'Must Have WordPress Plugins',
    created: '2020-04-01',
    items: [],
  };
  wp_reset.collections[1].items[10] = {
    id: '10',
    type: 'plugin',
    source: 'repo',
    note: '',
    slug: 'eps-301-redirects',
    name: '301 Redirects',
    version: '0.4',
  };

  wp_reset.collections[1].items[11] = {
    id: '11',
    type: 'plugin',
    source: 'repo',
    note: '',
    slug: 'classic-editor',
    name: 'Classic Editor',
    version: '0.4',
  };

  wp_reset.collections[1].items[12] = {
    id: '12',
    type: 'plugin',
    source: 'repo',
    note: '',
    slug: 'simple-author-box',
    name: 'Simple Author Box',
    version: '0.4',
  };

  wp_reset.collections[1].items[13] = {
    id: '13',
    type: 'plugin',
    source: 'repo',
    note: '',
    slug: 'sticky-menu-or-anything-on-scroll',
    name: 'Sticky Menu (or Anything!) on Scroll',
    version: '0.4',
  };

  wp_reset.collections[1].items[14] = {
    id: '14',
    type: 'plugin',
    source: 'repo',
    note: '',
    slug: 'under-construction-page',
    name: 'UnderConstructionPage',
    version: '0.4',
  };

  wp_reset.collections[1].items[15] = {
    id: '15',
    type: 'plugin',
    source: 'repo',
    note: '',
    slug: 'wp-external-links',
    name: 'WP External Links',
    version: '0.4',
  };

  $(document).on('click', '.install-collection', function (e) {
    do_delete = $(this).data('delete');
    do_activate = $(this).data('activate');
    collection_id = $(this).parents('.card').data('collection-id');
    show_install_collection(collection_id, do_delete, do_activate);
  });

  // install collection item
  $('.tools_page_wp-reset').on('click', '.install-collection-item', function (e) {
    e.preventDefault();

    wpr_close_dropdowns();

    collection_id = $(this).parents('.card').data('collection-id');
    collection_item_id = $(this).parents('tr').data('collection-item-id');
    do_activate = $(this).data('activate');

    item_data = wp_reset.collections[collection_id]['items'][collection_item_id];

    wpr_swal
      .fire({
        title: 'Installing <br />' + item_data['name'],
        html: '<div class="wpr-collections-installer"></div>',
        width: 600,
        onRender: function () {
          collections_ajax_queue.push({
            slug: item_data.slug,
            name: item_data.name,
            extra_data: {
              source: item_data.source,
              collection_id: collection_id,
              collection_item_id: collection_item_id,
            },
            action: 'install_' + item_data.type,
          });
          collections_ajax_queue.push({
            slug: item_data.slug,
            name: item_data.name,
            action: 'check_install_' + item_data.type,
          });

          $('.wpr-collections-installer').append(
            '<div class="wpr-collections-installer-message" data-action="' +
              item_data.slug +
              '_install_' +
              item_data.type +
              '"><span class="dashicons"></span>' +
              wp_reset.installing +
              ' ' +
              item_data.name +
              '</div>'
          );

          if (do_activate) {
            collections_ajax_queue.push({
              slug: item_data.slug,
              name: item_data.name,
              action: 'activate_' + item_data.type,
              extra_data: {
                source: item_data.source,
                collection_id: collection_id,
                collection_item_id: collection_item_id,
              },
            });
            collections_ajax_queue.push({
              slug: item_data.slug,
              name: item_data.name,
              action: 'check_activate_' + item_data.type,
            });

            $('.wpr-collections-installer').append(
              '<div class="wpr-collections-installer-message" data-action="' +
                item_data.slug +
                '_activate_' +
                item_data.type +
                '"><span class="dashicons"></span>' +
                wp_reset.activating +
                ' ' +
                item_data.name +
                '</div>'
            );
          }
          collections_do_ajax();
        },
        allowOutsideClick: false,
        allowEscapeKey: false,
        allowEnterKey: false,
        showCancelButton: true,
        confirmButtonText: 'OK',
      })
      .then((result) => {
        collections_ajax_queue = [];
      });

    return false;
  }); // install collection item

  // show install collection popup
  function show_install_collection(collection_id, do_delete, do_activate) {
    wpr_swal
      .fire({
        title: 'Installing collection<br />' + wp_reset.collections[collection_id]['name'],
        html: '<div class="wpr-collections-installer"></div>',
        width: 600,
        onRender: function () {
          install_collection(collection_id, do_activate, do_delete);
        },
        allowOutsideClick: false,
        allowEscapeKey: false,
        allowEnterKey: false,
        showCancelButton: true,
        showConfirmButton: false,
        confirmButtonText: 'OK',
      })
      .then((result) => {
        collections_ajax_queue = [];
      });
  } // show install collection popup

  // create install collection queue and add popup content
  function install_collection(collection_id, do_activate, do_delete) {
    collections_ajax_queue = [];
    collections_ajax_queue_count = 0;
    collections_ajax_queue_index = 0;
    collections_errors = [];

    for (item in wp_reset.collections[collection_id]['items']) {
      item_data = wp_reset.collections[collection_id]['items'][item];
      collections_ajax_queue.push({
        slug: item_data.slug,
        name: item_data.name,
        extra_data: {
          source: item_data.source,
          collection_id: collection_id,
          collection_item_id: item_data.id,
        },
        action: 'install_' + item_data.type,
      });
      collections_ajax_queue.push({
        slug: item_data.slug,
        name: item_data.name,
        action: 'check_install_' + item_data.type,
      });

      if (do_activate) {
        collections_ajax_queue.push({
          slug: item_data.slug,
          name: item_data.name,
          action: 'activate_' + item_data.type,
          extra_data: {
            source: item_data.source,
            collection_id: collection_id,
            collection_item_id: item_data.id,
          },
        });
        collections_ajax_queue.push({
          slug: item_data.slug,
          name: item_data.name,
          action: 'check_activate_' + item_data.type,
        });
      }
    }

    for (ci in collections_ajax_queue) {
      var message = false;
      collections_ajax_queue_count++;

      switch (collections_ajax_queue[ci].action) {
        case 'deactivate_plugin':
          message = wp_reset.deactivating;
          break;
        case 'delete_plugin':
        case 'delete_theme':
          message = wp_reset.deleting;
          break;
        case 'install_plugin':
        case 'install_theme':
          message = wp_reset.installing;
          break;
        case 'activate_plugin':
        case 'activate_theme':
          message = wp_reset.activating;
          break;
        case 'activate_license_plugin':
        case 'activate_license_theme':
          message = wp_reset.activating_license;
          break;
      }

      if (message !== false) {
        $('.wpr-collections-installer').append(
          '<div class="wpr-collections-installer-message" data-action="' +
            collections_ajax_queue[ci].slug +
            '_' +
            collections_ajax_queue[ci].action +
            '"><span class="dashicons"></span> ' +
            message +
            ' ' +
            collections_ajax_queue[ci].name +
            '</div>'
        );
      }
    }

    collections_ajax_queue_count = collections_ajax_queue.length;
    collections_do_ajax();
  } // create install collection queue

  // run collection ajax
  function collections_do_ajax() {
    collection_item = collections_ajax_queue[collections_ajax_queue_index];
    message_id = collection_item.slug + '_' + collection_item.action.replace('check_', '');

    $('[data-action="' + message_id + '"]').addClass('wpr-collections-installer-loading');

    var query_data_type = 'text';
    if (
      collection_item.action == 'check_deactivate_plugin' ||
      collection_item.action == 'check_delete_plugin' ||
      collection_item.action == 'check_install_plugin' ||
      collection_item.action == 'check_activate_plugin' ||
      collection_item.action == 'check_install_theme' ||
      collection_item.action == 'check_activate_theme' ||
      collection_item.action == 'check_delete_theme' ||
      collection_item.action == 'check_activate_license_plugin' ||
      collection_item.action == 'check_activate_license_theme'
    ) {
      query_data_type = 'json';
    }

    if (!('extra_data' in collection_item)) {
      collection_item.extra_data = {};
    }

    $.ajax({
      url: ajaxurl,
      type: 'get',
      dataType: query_data_type,
      data: {
        action: 'wp_reset_run_tool',
        _ajax_nonce: wp_reset.nonce_run_tool,
        tool: collection_item.action,
        slug: collection_item.slug,
        extra_data: collection_item.extra_data,
      },
      complete: function (data) {
        if (typeof data.responseJSON == 'undefined') {
          data = false;
        } else {
          data = data.responseJSON;
        }
        var do_next_called = false;
        if (
          collection_item.action == 'check_deactivate_plugin' ||
          collection_item.action == 'check_delete_plugin' ||
          collection_item.action == 'check_install_plugin' ||
          collection_item.action == 'check_activate_plugin' ||
          collection_item.action == 'check_install_theme' ||
          collection_item.action == 'check_activate_theme' ||
          collection_item.action == 'check_delete_theme' ||
          collection_item.action == 'check_activate_license_plugin' ||
          collection_item.action == 'check_activate_license_theme'
        ) {
          if (data == false && collections_retried == false) {
            collections_retried = true;
            collections_do_ajax();
            return false;
          }
          if (
            (collection_item.action == 'check_deactivate_plugin' && data.data == 'inactive') ||
            (collection_item.action == 'check_delete_plugin' && data.data == 'deleted') ||
            (collection_item.action == 'check_install_plugin' && (data.data == 'inactive' || data.data == 'active')) ||
            (collection_item.action == 'check_activate_plugin' && data.data == 'active') ||
            (collection_item.action == 'check_install_theme' && (data.data == 'inactive' || data.data == 'active')) ||
            (collection_item.action == 'check_activate_theme' && data.data == 'active') ||
            (collection_item.action == 'check_delete_theme' && data.data == 'deleted') ||
            (collection_item.action == 'check_activate_license_plugin' && data.data == 'license_active') ||
            (collection_item.action == 'check_activate_license_theme' && data.data == 'license_active')
          ) {
            $('[data-action="' + message_id + '"]').addClass('wpr-collections-installer-success');
          } else {
            var error = false;
            switch (collection_item.action) {
              case 'check_deactivate_plugin':
                error = wp_reset.deactivate_failed + ' ' + collection_item.name;
                break;
              case 'check_delete_plugin':
              case 'check_delete_theme':
                error = wp_reset.delete_failed + ' ' + collection_item.name;
                break;
              case 'check_install_plugin':
              case 'check_install_theme':
                if (data.data == 'active') {
                  error = collection_item.name + ' ' + wp_reset.install_failed_existing;
                } else if (data.data == 'deleted') {
                  error = wp_reset.install_failed + ' ' + collection_item.name;
                } else {
                  error = data.data;
                }
                break;
              case 'check_activate_plugin':
              case 'check_activate_theme':
                error = wp_reset.activate_failed + ' ' + collection_item.name;
                break;
              case 'check_activate_license_plugin':
              case 'check_activate_license_theme':
                if (data.data == 'unknown') {
                  error = wp_reset.activating_license_unknown + ' ' + collection_item.name;
                } else {
                  error = wp_reset.activating_license_failed + ' ' + collection_item.name;
                }
                break;
              default:
                error = false;
            }

            if (error != false) {
              $('[data-action="' + message_id + '"]').append('<div class="wpr-collections-error">' + error + '</div>');
              collections_errors.push(error);
            }

            $('[data-action="' + message_id + '"]').addClass('wpr-collections-installer-error');
          }

          $('[data-action="' + message_id + '"]').removeClass('wpr-collections-installer-loading');
          $('[data-action="' + message_id + '"]').addClass('wpr-collections-installer-done');
        }

        collections_retried = false;
        collections_ajax_queue_index++;

        if (collections_ajax_queue.length == 0) {
          wpr_swal.close();
          return false;
        }

        if (do_next_called == false && typeof collections_ajax_queue[collections_ajax_queue_index] !== 'undefined') {
          if (typeof $('.wpr-collections-installer div.wpr-collections-installer-done:last').offset() !== 'undefined') {
            var scroll_top =
              $('.wpr-collections-installer div.wpr-collections-installer-done:last').offset().top -
              $('.wpr-collections-installer').offset().top +
              $('.wpr-collections-installer').scrollTop() -
              60;
            $('.wpr-collections-installer').animate({ scrollTop: scroll_top }, 600, function () {
              collections_do_ajax();
            });
          } else {
            collections_do_ajax();
          }
        } else {
          wpr_swal.close();

          $('.wpr-collections-installer').css('padding', '0px 40px');
          $('.wpr-collections-installer').css('height', '236px');

          if (collections_errors.length > 0) {
            var errors_html = '';
            for (e in collections_errors) {
              errors_html +=
                '<div class="wpr-collections-installer-message wpr-collections-installer-error"><span class="dashicons"></span> ' +
                collections_errors[e] +
                '</div>';
            }
            wpr_swal
              .fire({
                icon: 'error',
                title: 'Collection was installed, but the following errors occured!',
                html: '<div class="wpr-collections-installer-errors">' + errors_html + '</div>',
                showConfirmButton: true,
              })
              .then((result) => {
                location.reload();
              });
          } else {
            wpr_swal
              .fire({
                icon: 'success',
                title: 'Collection was installed successfully!',
                showConfirmButton: true,
                timer: 2000,
                timerProgressBar: true,
              })
              .then((result) => {
                location.reload();
              });
          }
        }
      },
    });
  } //run collection ajax

  function wpr_position_sidebar_ads() {
    pos_left = Math.round($('#wp_reset_form nav').width()) + 260;
    pos_top = Math.round($('#wp_reset_form #logo-icon').offset().top);
    if($('body').hasClass('rtl')){
        $('#wpr-sidebar-ads').css('top', pos_top + 'px').css('right', pos_left + 'px');
    } else {
        $('#wpr-sidebar-ads').css('top', pos_top + 'px').css('left', pos_left + 'px');
    }
    $('#wpr-sidebar-ads').show();
  } // wpr_position_sidebar_ads

  wpr_position_sidebar_ads();
  $(window).on('resize', function() {
    wpr_position_sidebar_ads();
  })

  $('.install-wpfssl').on('click',function(e){
    if (!confirm('The free WP Force SSL plugin will be installed & activated from the official WordPress repository.')) {
      return;
    }

    jQuery('body').append('<div style="width:550px;height:450px; position:fixed;top:10%;left:50%;margin-left:-275px; color:#444; background-color: #fbfbfb;border:1px solid #DDD; border-radius:4px;box-shadow: 0px 0px 0px 4000px rgba(0, 0, 0, 0.85);z-index: 9999999;"><iframe src="' + wp_reset.wpfssl_install_url + '" style="width:100%;height:100%;border:none;" /></div>');
    jQuery('#wpwrap').css('pointer-events', 'none');

    e.preventDefault();
    return false;
  });
}); // onload

function wpr_clear_local(clear_cookies, clear_storage) {
  var cnt = 0;

  if (clear_cookies) {
    var cookies = Cookies.get();
    cnt += Object.keys(cookies).length;
    for (cookie in cookies) {
      Cookies.remove(cookie);
    }
  }

  if (clear_storage) {
    cnt += localStorage.length + sessionStorage.length;
    localStorage.clear();
    sessionStorage.clear();
  }

  return cnt;
} // wpr_clear_local

function wpr_close_dropdowns() {
  jQuery('.dropdown').removeClass('show');
  jQuery('.dropdown-menu').removeClass('show');
} // wpr_close_dropdowns

function wpr_fix_dialog_close(event, ui) {
  jQuery('.ui-widget-overlay').bind('click', function () {
    jQuery('#' + event.target.id).dialog('close');
  });
} // wpr_fix_dialog_close
PK!�js/index.phpnu�[���<?php
// Silence is golden
PK!���J�Jjs/wp-reset-libs.min.jsnu�[���/**
 * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
 * Licensed under MIT
 * @author Ariel Flesler
 * @version 2.1.2
 */
;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case "number":case "string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case "object":if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(""),function(a,c){var d="x"===c?"Left":"Top",m=d.toLowerCase(),g="scroll"+d,h=r[g](),n=p.max(q,c);t?(f[g]=t[m]+(l?0:h-r.offset()[m]),b.margin&&(f[g]-=parseInt(e.css("margin"+d),10)||0,f[g]-=parseInt(e.css("border"+d+"Width"),10)||0),f[g]+=v[m]||0,b.over[m]&&(f[g]+=e["x"===c?"width":"height"]()*b.over[m])):(d=e[m],f[g]=d.slice&& "%"===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f[g])&&(f[g]=0>=f[g]?0:Math.min(f[g],n));!a&&1<b.axis.length&&(h===f[g]?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b="x"===d?"Width":"Height",h="scroll"+b;if(!n(a))return a[h]-$(a)[b.toLowerCase()]();var b="client"+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l[h],k[h])-Math.min(l[b],k[b])};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});


/*
  WPR_Sweetalert2
  https://github.com/Sweetalert2/Sweetalert2
  MIT License
*/

!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).wpr_Sweetalert2=e()}(this,function(){"use strict";function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function a(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function c(){return(c=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t}).apply(this,arguments)}function s(t){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function u(t,e){return(u=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function l(t,e,n){return(l=function(){if("undefined"!=typeof Reflect&&Reflect.construct&&!Reflect.construct.sham){if("function"==typeof Proxy)return 1;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),1}catch(t){return}}}()?Reflect.construct:function(t,e,n){var o=[null];o.push.apply(o,e);var i=new(Function.bind.apply(t,o));return n&&u(i,n.prototype),i}).apply(null,arguments)}function d(t,e){return!e||"object"!=typeof e&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function p(t,e,n){return(p="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var o=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=s(t)););return t}(t,e);if(o){var i=Object.getOwnPropertyDescriptor(o,e);return i.get?i.get.call(n):i.value}})(t,e,n||t)}function f(e){return Object.keys(e).map(function(t){return e[t]})}function m(t){return Array.prototype.slice.call(t)}function v(t){console.error("".concat(V," ").concat(t))}function h(t,e){var n;n='"'.concat(t,'" is deprecated and will be removed in the next major release. Please use "').concat(e,'" instead.'),-1===D.indexOf(n)&&(D.push(n),R(n))}function g(t){return t&&Promise.resolve(t)===t}function b(t){return t instanceof Element||"object"===r(e=t)&&e.jquery;var e}function t(t){var e={};for(var n in t)e[t[n]]="swal2-"+t[n];return e}function y(t){var e=z();return e?e.querySelector(t):null}function e(t){return y(".".concat(t))}function n(){var t=W();return m(t.querySelectorAll(".".concat(_.icon)))}function w(){var t=n().filter(function(t){return dt(t)});return t.length?t[0]:null}function C(){return e(_.title)}function k(){return e(_.content)}function x(){return e(_.image)}function P(){return e(_["progress-steps"])}function A(){return e(_["validation-message"])}function B(){return y(".".concat(_.actions," .").concat(_.confirm))}function T(){return y(".".concat(_.actions," .").concat(_.cancel))}function E(){return e(_.actions)}function S(){return e(_.header)}function L(){return e(_.footer)}function O(){return e(_["timer-progress-bar"])}function M(){return e(_.close)}function H(){var t=m(W().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])')).sort(function(t,e){return t=parseInt(t.getAttribute("tabindex")),(e=parseInt(e.getAttribute("tabindex")))<t?1:t<e?-1:0}),e=m(W().querySelectorAll('\n  a[href],\n  area[href],\n  input:not([disabled]),\n  select:not([disabled]),\n  textarea:not([disabled]),\n  button:not([disabled]),\n  iframe,\n  object,\n  embed,\n  [tabindex="0"],\n  [contenteditable],\n  audio[controls],\n  video[controls],\n  summary\n')).filter(function(t){return"-1"!==t.getAttribute("tabindex")});return function(t){for(var e=[],n=0;n<t.length;n++)-1===e.indexOf(t[n])&&e.push(t[n]);return e}(t.concat(e)).filter(function(t){return dt(t)})}function I(){return!K()&&!document.body.classList.contains(_["no-backdrop"])}function j(t,e){if(e){for(var n=e.split(/\s+/),o=0;o<n.length;o++)if(!t.classList.contains(n[o]))return;return 1}}function q(t,e,n){var o,i;if(i=e,m((o=t).classList).forEach(function(t){-1===f(_).indexOf(t)&&-1===f(F).indexOf(t)&&-1===f(i.showClass).indexOf(t)&&o.classList.remove(t)}),e.customClass&&e.customClass[n]){if("string"!=typeof e.customClass[n]&&!e.customClass[n].forEach)return R("Invalid type of customClass.".concat(n,'! Expected string or iterable object, got "').concat(r(e.customClass[n]),'"'));st(t,e.customClass[n])}}var V="SweetAlert2:",R=function(t){console.warn("".concat(V," ").concat(t))},D=[],N=function(t){return"function"==typeof t?t():t},U=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),_=t(["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","toast-column","show","hide","close","title","header","content","html-container","actions","confirm","cancel","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error"]),F=t(["success","warning","info","question","error"]),z=function(){return document.body.querySelector(".".concat(_.container))},W=function(){return e(_.popup)},K=function(){return document.body.classList.contains(_["toast-shown"])},Y={previousBodyPadding:null};function Z(t,e){if(!e)return null;switch(e){case"select":case"textarea":case"file":return lt(t,_[e]);case"checkbox":return t.querySelector(".".concat(_.checkbox," input"));case"radio":return t.querySelector(".".concat(_.radio," input:checked"))||t.querySelector(".".concat(_.radio," input:first-child"));case"range":return t.querySelector(".".concat(_.range," input"));default:return lt(t,_.input)}}function Q(t){if(t.focus(),"file"!==t.type){var e=t.value;t.value="",t.value=e}}function $(t,e,n){t&&e&&("string"==typeof e&&(e=e.split(/\s+/).filter(Boolean)),e.forEach(function(e){t.forEach?t.forEach(function(t){n?t.classList.add(e):t.classList.remove(e)}):n?t.classList.add(e):t.classList.remove(e)}))}function J(t,e,n){n||0===parseInt(n)?t.style[e]="number"==typeof n?"".concat(n,"px"):n:t.style.removeProperty(e)}function X(t,e){var n=1<arguments.length&&void 0!==e?e:"flex";t.style.opacity="",t.style.display=n}function G(t){t.style.opacity="",t.style.display="none"}function tt(t,e,n){e?X(t,n):G(t)}function et(t){var e=window.getComputedStyle(t),n=parseFloat(e.getPropertyValue("animation-duration")||"0"),o=parseFloat(e.getPropertyValue("transition-duration")||"0");return 0<n||0<o}function nt(t,e){var n=1<arguments.length&&void 0!==e&&e,o=O();dt(o)&&(n&&(o.style.transition="none",o.style.width="100%"),setTimeout(function(){o.style.transition="width ".concat(t/1e3,"s linear"),o.style.width="0%"},10))}function ot(){return"undefined"==typeof window||"undefined"==typeof document}function it(t){Xe.isVisible()&&ct!==t.target.value&&Xe.resetValidationMessage(),ct=t.target.value}function rt(t,e){t instanceof HTMLElement?e.appendChild(t):"object"===r(t)?mt(t,e):t&&(e.innerHTML=t)}function at(t,e){var n=E(),o=B(),i=T();e.showConfirmButton||e.showCancelButton||G(n),q(n,e,"actions"),vt(o,"confirm",e),vt(i,"cancel",e),e.buttonsStyling?function(t,e,n){st([t,e],_.styled),n.confirmButtonColor&&(t.style.backgroundColor=n.confirmButtonColor);n.cancelButtonColor&&(e.style.backgroundColor=n.cancelButtonColor);var o=window.getComputedStyle(t).getPropertyValue("background-color");t.style.borderLeftColor=o,t.style.borderRightColor=o}(o,i,e):(ut([o,i],_.styled),o.style.backgroundColor=o.style.borderLeftColor=o.style.borderRightColor="",i.style.backgroundColor=i.style.borderLeftColor=i.style.borderRightColor=""),e.reverseButtons&&o.parentNode.insertBefore(i,o)}var ct,st=function(t,e){$(t,e,!0)},ut=function(t,e){$(t,e,!1)},lt=function(t,e){for(var n=0;n<t.childNodes.length;n++)if(j(t.childNodes[n],e))return t.childNodes[n]},dt=function(t){return!(!t||!(t.offsetWidth||t.offsetHeight||t.getClientRects().length))},pt='\n <div aria-labelledby="'.concat(_.title,'" aria-describedby="').concat(_.content,'" class="').concat(_.popup,'" tabindex="-1">\n   <div class="').concat(_.header,'">\n     <ul class="').concat(_["progress-steps"],'"></ul>\n     <div class="').concat(_.icon," ").concat(F.error,'"></div>\n     <div class="').concat(_.icon," ").concat(F.question,'"></div>\n     <div class="').concat(_.icon," ").concat(F.warning,'"></div>\n     <div class="').concat(_.icon," ").concat(F.info,'"></div>\n     <div class="').concat(_.icon," ").concat(F.success,'"></div>\n     <img class="').concat(_.image,'" />\n     <h2 class="').concat(_.title,'" id="').concat(_.title,'"></h2>\n     <button type="button" class="').concat(_.close,'"></button>\n   </div>\n   <div class="').concat(_.content,'">\n     <div id="').concat(_.content,'" class="').concat(_["html-container"],'"></div>\n     <input class="').concat(_.input,'" />\n     <input type="file" class="').concat(_.file,'" />\n     <div class="').concat(_.range,'">\n       <input type="range" />\n       <output></output>\n     </div>\n     <select class="').concat(_.select,'"></select>\n     <div class="').concat(_.radio,'"></div>\n     <label for="').concat(_.checkbox,'" class="').concat(_.checkbox,'">\n       <input type="checkbox" />\n       <span class="').concat(_.label,'"></span>\n     </label>\n     <textarea class="').concat(_.textarea,'"></textarea>\n     <div class="').concat(_["validation-message"],'" id="').concat(_["validation-message"],'"></div>\n   </div>\n   <div class="').concat(_.actions,'">\n     <button type="button" class="').concat(_.confirm,'">OK</button>\n     <button type="button" class="').concat(_.cancel,'">Cancel</button>\n   </div>\n   <div class="').concat(_.footer,'"></div>\n   <div class="').concat(_["timer-progress-bar"],'"></div>\n </div>\n').replace(/(^|\n)\s*/g,""),ft=function(t){var e,n=!!(e=z())&&(e.parentNode.removeChild(e),ut([document.documentElement,document.body],[_["no-backdrop"],_["toast-shown"],_["has-column"]]),!0);if(ot())v("SweetAlert2 requires document to initialize");else{var o=document.createElement("div");o.className=_.container,n&&st(o,_["no-transition"]),o.innerHTML=pt;var i,r,a,c,s,u,l,d,p,f,m,h,g="string"==typeof(i=t.target)?document.querySelector(i):i;g.appendChild(o),r=t,(a=W()).setAttribute("role",r.toast?"alert":"dialog"),a.setAttribute("aria-live",r.toast?"polite":"assertive"),r.toast||a.setAttribute("aria-modal","true"),c=g,"rtl"===window.getComputedStyle(c).direction&&st(z(),_.rtl),s=k(),u=lt(s,_.input),l=lt(s,_.file),d=s.querySelector(".".concat(_.range," input")),p=s.querySelector(".".concat(_.range," output")),f=lt(s,_.select),m=s.querySelector(".".concat(_.checkbox," input")),h=lt(s,_.textarea),u.oninput=it,l.onchange=it,f.onchange=it,m.onchange=it,h.oninput=it,d.oninput=function(t){it(t),p.value=d.value},d.onchange=function(t){it(t),d.nextSibling.value=d.value}}},mt=function(t,e){t.jquery?ht(e,t):e.innerHTML=t.toString()},ht=function(t,e){if(t.innerHTML="",0 in e)for(var n=0;n in e;n++)t.appendChild(e[n].cloneNode(!0));else t.appendChild(e.cloneNode(!0))},gt=function(){if(ot())return!1;var t=document.createElement("div"),e={WebkitAnimation:"webkitAnimationEnd",OAnimation:"oAnimationEnd oanimationend",animation:"animationend"};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&void 0!==t.style[n])return e[n];return!1}();function vt(t,e,n){var o;tt(t,n["show".concat((o=e).charAt(0).toUpperCase()+o.slice(1),"Button")],"inline-block"),t.innerHTML=n["".concat(e,"ButtonText")],t.setAttribute("aria-label",n["".concat(e,"ButtonAriaLabel")]),t.className=_[e],q(t,n,"".concat(e,"Button")),st(t,n["".concat(e,"ButtonClass")])}function bt(t,e){var n=z();if(n){var o,i,r,a;o=n,"string"==typeof(i=e.backdrop)?o.style.background=i:i||st([document.documentElement,document.body],_["no-backdrop"]),!e.backdrop&&e.allowOutsideClick&&R('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),r=n,(a=e.position)in _?st(r,_[a]):(R('The "position" parameter is not valid, defaulting to "center"'),st(r,_.center)),function(t,e){if(e&&"string"==typeof e){var n="grow-".concat(e);n in _&&st(t,_[n])}}(n,e.grow),q(n,e,"container");var c=document.body.getAttribute("data-swal2-queue-step");c&&(n.setAttribute("data-queue-step",c),document.body.removeAttribute("data-swal2-queue-step"))}}function yt(t,e){t.placeholder&&!e.inputPlaceholder||(t.placeholder=e.inputPlaceholder)}var wt={promise:new WeakMap,innerParams:new WeakMap,domCache:new WeakMap},Ct=["input","file","range","select","radio","checkbox","textarea"],kt=function(t){if(!Bt[t.input])return v('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "'.concat(t.input,'"'));var e=At(t.input),n=Bt[t.input](e,t);X(n),setTimeout(function(){Q(n)})},xt=function(t,e){var n=Z(k(),t);if(n)for(var o in!function(t){for(var e=0;e<t.attributes.length;e++){var n=t.attributes[e].name;-1===["type","value","style"].indexOf(n)&&t.removeAttribute(n)}}(n),e)"range"===t&&"placeholder"===o||n.setAttribute(o,e[o])},Pt=function(t){var e=At(t.input);t.customClass&&st(e,t.customClass.input)},At=function(t){var e=_[t]?_[t]:_.input;return lt(k(),e)},Bt={};Bt.text=Bt.email=Bt.password=Bt.number=Bt.tel=Bt.url=function(t,e){return"string"==typeof e.inputValue||"number"==typeof e.inputValue?t.value=e.inputValue:g(e.inputValue)||R('Unexpected type of inputValue! Expected "string", "number" or "Promise", got "'.concat(r(e.inputValue),'"')),yt(t,e),t.type=e.input,t},Bt.file=function(t,e){return yt(t,e),t},Bt.range=function(t,e){var n=t.querySelector("input"),o=t.querySelector("output");return n.value=e.inputValue,n.type=e.input,o.value=e.inputValue,t},Bt.select=function(t,e){if(t.innerHTML="",e.inputPlaceholder){var n=document.createElement("option");n.innerHTML=e.inputPlaceholder,n.value="",n.disabled=!0,n.selected=!0,t.appendChild(n)}return t},Bt.radio=function(t){return t.innerHTML="",t},Bt.checkbox=function(t,e){var n=Z(k(),"checkbox");return n.value=1,n.id=_.checkbox,n.checked=Boolean(e.inputValue),t.querySelector("span").innerHTML=e.inputPlaceholder,t},Bt.textarea=function(e,t){if(e.value=t.inputValue,yt(e,t),"MutationObserver"in window){var n=parseInt(window.getComputedStyle(W()).width),o=parseInt(window.getComputedStyle(W()).paddingLeft)+parseInt(window.getComputedStyle(W()).paddingRight);new MutationObserver(function(){var t=e.offsetWidth+o;W().style.width=n<t?"".concat(t,"px"):null}).observe(e,{attributes:!0,attributeFilter:["style"]})}return e};function Tt(t,e){var n,o,i,r,a,c=k().querySelector("#".concat(_.content));e.html?(rt(e.html,c),X(c,"block")):e.text?(c.textContent=e.text,X(c,"block")):G(c),n=t,o=e,i=k(),r=wt.innerParams.get(n),a=!r||o.input!==r.input,Ct.forEach(function(t){var e=_[t],n=lt(i,e);xt(t,o.inputAttributes),n.className=e,a&&G(n)}),o.input&&(a&&kt(o),Pt(o)),q(k(),e,"content")}function Et(){return z().getAttribute("data-queue-step")}function St(t,s){var u=P();if(!s.progressSteps||0===s.progressSteps.length)return G(u);X(u),u.innerHTML="";var l=parseInt(void 0===s.currentProgressStep?Et():s.currentProgressStep);l>=s.progressSteps.length&&R("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),s.progressSteps.forEach(function(t,e){var n,o,i,r,a=(n=t,o=document.createElement("li"),st(o,_["progress-step"]),o.innerHTML=n,o);if(u.appendChild(a),e===l&&st(a,_["active-progress-step"]),e!==s.progressSteps.length-1){var c=(i=t,r=document.createElement("li"),st(r,_["progress-step-line"]),i.progressStepsDistance&&(r.style.width=i.progressStepsDistance),r);u.appendChild(c)}})}function Lt(t,e){var n,o,i,r,a=S();q(a,e,"header"),St(0,e),function(t,e){var n=wt.innerParams.get(t);if(n&&e.icon===n.icon&&w())q(w(),e,"icon");else if(Ht(),e.icon)if(-1!==Object.keys(F).indexOf(e.icon)){var o=y(".".concat(_.icon,".").concat(F[e.icon]));X(o),jt(o,e),It(),q(o,e,"icon"),st(o,e.showClass.icon)}else v('Unknown icon! Expected "success", "error", "warning", "info" or "question", got "'.concat(e.icon,'"'))}(t,e),function(t){var e=x();if(!t.imageUrl)return G(e);X(e),e.setAttribute("src",t.imageUrl),e.setAttribute("alt",t.imageAlt),J(e,"width",t.imageWidth),J(e,"height",t.imageHeight),e.className=_.image,q(e,t,"image")}(e),n=e,o=C(),tt(o,n.title||n.titleText),n.title&&rt(n.title,o),n.titleText&&(o.innerText=n.titleText),q(o,n,"title"),i=e,(r=M()).innerHTML=i.closeButtonHtml,q(r,i,"closeButton"),tt(r,i.showCloseButton),r.setAttribute("aria-label",i.closeButtonAriaLabel)}function Ot(t,e){var n,o,i,r;n=e,o=W(),J(o,"width",n.width),J(o,"padding",n.padding),n.background&&(o.style.background=n.background),Rt(o,n),bt(0,e),Lt(t,e),Tt(t,e),at(0,e),i=e,r=L(),tt(r,i.footer),i.footer&&rt(i.footer,r),q(r,i,"footer"),"function"==typeof e.onRender&&e.onRender(W())}function Mt(){return B()&&B().click()}var Ht=function(){for(var t=n(),e=0;e<t.length;e++)G(t[e])},It=function(){for(var t=W(),e=window.getComputedStyle(t).getPropertyValue("background-color"),n=t.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix"),o=0;o<n.length;o++)n[o].style.backgroundColor=e},jt=function(t,e){if(t.innerHTML="",e.iconHtml)t.innerHTML=qt(e.iconHtml);else if("success"===e.icon)t.innerHTML='\n      <div class="swal2-success-circular-line-left"></div>\n      <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n      <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n      <div class="swal2-success-circular-line-right"></div>\n    ';else if("error"===e.icon)t.innerHTML='\n      <span class="swal2-x-mark">\n        <span class="swal2-x-mark-line-left"></span>\n        <span class="swal2-x-mark-line-right"></span>\n      </span>\n    ';else{t.innerHTML=qt({question:"?",warning:"!",info:"i"}[e.icon])}},qt=function(t){return'<div class="'.concat(_["icon-content"],'">').concat(t,"</div>")},Vt=[],Rt=function(t,e){t.className="".concat(_.popup," ").concat(dt(t)?e.showClass.popup:""),e.toast?(st([document.documentElement,document.body],_["toast-shown"]),st(t,_.toast)):st(t,_.modal),q(t,e,"popup"),"string"==typeof e.customClass&&st(t,e.customClass),e.icon&&st(t,_["icon-".concat(e.icon)])};function Dt(){var t=W();t||Xe.fire(),t=W();var e=E(),n=B();X(e),X(n,"inline-block"),st([t,e],_.loading),n.disabled=!0,t.setAttribute("data-loading",!0),t.setAttribute("aria-busy",!0),t.focus()}function Nt(){return new Promise(function(t){var e=window.scrollX,n=window.scrollY;Wt.restoreFocusTimeout=setTimeout(function(){Wt.previousActiveElement&&Wt.previousActiveElement.focus?(Wt.previousActiveElement.focus(),Wt.previousActiveElement=null):document.body&&document.body.focus(),t()},100),void 0!==e&&void 0!==n&&window.scrollTo(e,n)})}function Ut(){if(Wt.timeout)return function(){var t=O(),e=parseInt(window.getComputedStyle(t).width);t.style.removeProperty("transition"),t.style.width="100%";var n=parseInt(window.getComputedStyle(t).width),o=parseInt(e/n*100);t.style.removeProperty("transition"),t.style.width="".concat(o,"%")}(),Wt.timeout.stop()}function _t(){if(Wt.timeout){var t=Wt.timeout.start();return nt(t),t}}function Ft(t){return Object.prototype.hasOwnProperty.call(Kt,t)}function zt(t){return Zt[t]}var Wt={},Kt={title:"",titleText:"",text:"",html:"",footer:"",icon:void 0,iconHtml:void 0,toast:!1,animation:!0,showClass:{popup:"swal2-show",backdrop:"swal2-backdrop-show",icon:"swal2-icon-show"},hideClass:{popup:"swal2-hide",backdrop:"swal2-backdrop-hide",icon:"swal2-icon-hide"},customClass:void 0,target:"body",backdrop:!0,heightAuto:!0,allowOutsideClick:!0,allowEscapeKey:!0,allowEnterKey:!0,stopKeydownPropagation:!0,keydownListenerCapture:!1,showConfirmButton:!0,showCancelButton:!1,preConfirm:void 0,confirmButtonText:"OK",confirmButtonAriaLabel:"",confirmButtonColor:void 0,cancelButtonText:"Cancel",cancelButtonAriaLabel:"",cancelButtonColor:void 0,buttonsStyling:!0,reverseButtons:!1,focusConfirm:!0,focusCancel:!1,showCloseButton:!1,closeButtonHtml:"&times;",closeButtonAriaLabel:"Close this dialog",showLoaderOnConfirm:!1,imageUrl:void 0,imageWidth:void 0,imageHeight:void 0,imageAlt:"",timer:void 0,timerProgressBar:!1,width:void 0,padding:void 0,background:void 0,input:void 0,inputPlaceholder:"",inputValue:"",inputOptions:{},inputAutoTrim:!0,inputAttributes:{},inputValidator:void 0,validationMessage:void 0,grow:!1,position:"center",progressSteps:[],currentProgressStep:void 0,progressStepsDistance:void 0,onBeforeOpen:void 0,onOpen:void 0,onRender:void 0,onClose:void 0,onAfterClose:void 0,onDestroy:void 0,scrollbarPadding:!0},Yt=["title","titleText","text","html","icon","hideClass","customClass","allowOutsideClick","allowEscapeKey","showConfirmButton","showCancelButton","confirmButtonText","confirmButtonAriaLabel","confirmButtonColor","cancelButtonText","cancelButtonAriaLabel","cancelButtonColor","buttonsStyling","reverseButtons","imageUrl","imageWidth","imageHeight","imageAlt","progressSteps","currentProgressStep"],Zt={animation:'showClass" and "hideClass'},Qt=["allowOutsideClick","allowEnterKey","backdrop","focusConfirm","focusCancel","heightAuto","keydownListenerCapture"],$t=Object.freeze({isValidParameter:Ft,isUpdatableParameter:function(t){return-1!==Yt.indexOf(t)},isDeprecatedParameter:zt,argsToParams:function(o){var i={};return"object"!==r(o[0])||b(o[0])?["title","html","icon"].forEach(function(t,e){var n=o[e];"string"==typeof n||b(n)?i[t]=n:void 0!==n&&v("Unexpected type of ".concat(t,'! Expected "string" or "Element", got ').concat(r(n)))}):c(i,o[0]),i},isVisible:function(){return dt(W())},clickConfirm:Mt,clickCancel:function(){return T()&&T().click()},getContainer:z,getPopup:W,getTitle:C,getContent:k,getHtmlContainer:function(){return e(_["html-container"])},getImage:x,getIcon:w,getIcons:n,getCloseButton:M,getActions:E,getConfirmButton:B,getCancelButton:T,getHeader:S,getFooter:L,getTimerProgressBar:O,getFocusableElements:H,getValidationMessage:A,isLoading:function(){return W().hasAttribute("data-loading")},fire:function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return l(this,e)},mixin:function(n){return function(t){function e(){return o(this,e),d(this,s(e).apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&u(t,e)}(e,t),a(e,[{key:"_main",value:function(t){return p(s(e.prototype),"_main",this).call(this,c({},n,t))}}]),e}(this)},queue:function(t){var r=this;Vt=t;function a(t,e){Vt=[],t(e)}var c=[];return new Promise(function(i){!function e(n,o){n<Vt.length?(document.body.setAttribute("data-swal2-queue-step",n),r.fire(Vt[n]).then(function(t){void 0!==t.value?(c.push(t.value),e(n+1,o)):a(i,{dismiss:t.dismiss})})):a(i,{value:c})}(0)})},getQueueStep:Et,insertQueueStep:function(t,e){return e&&e<Vt.length?Vt.splice(e,0,t):Vt.push(t)},deleteQueueStep:function(t){void 0!==Vt[t]&&Vt.splice(t,1)},showLoading:Dt,enableLoading:Dt,getTimerLeft:function(){return Wt.timeout&&Wt.timeout.getTimerLeft()},stopTimer:Ut,resumeTimer:_t,toggleTimer:function(){var t=Wt.timeout;return t&&(t.running?Ut:_t)()},increaseTimer:function(t){if(Wt.timeout){var e=Wt.timeout.increase(t);return nt(e,!0),e}},isTimerRunning:function(){return Wt.timeout&&Wt.timeout.isRunning()}});function Jt(){var t=wt.innerParams.get(this);if(t){var e=wt.domCache.get(this);t.showConfirmButton||(G(e.confirmButton),t.showCancelButton||G(e.actions)),ut([e.popup,e.actions],_.loading),e.popup.removeAttribute("aria-busy"),e.popup.removeAttribute("data-loading"),e.confirmButton.disabled=!1,e.cancelButton.disabled=!1}}function Xt(){null===Y.previousBodyPadding&&document.body.scrollHeight>window.innerHeight&&(Y.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight="".concat(Y.previousBodyPadding+function(){var t=document.createElement("div");t.className=_["scrollbar-measure"],document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e}(),"px"))}function Gt(){return!!window.MSInputMethodContext&&!!document.documentMode}function te(){var t=z(),e=W();t.style.removeProperty("align-items"),e.offsetTop<0&&(t.style.alignItems="flex-start")}var ee=function(){var n,o=z();o.ontouchstart=function(t){var e;n=t.target===o||!((e=o).scrollHeight>e.clientHeight)&&"INPUT"!==t.target.tagName},o.ontouchmove=function(t){n&&(t.preventDefault(),t.stopPropagation())}},ne={swalPromiseResolve:new WeakMap};function oe(t,e,n,o){n?ae(t,o):(Nt().then(function(){return ae(t,o)}),Wt.keydownTarget.removeEventListener("keydown",Wt.keydownHandler,{capture:Wt.keydownListenerCapture}),Wt.keydownHandlerAdded=!1),e.parentNode&&!document.body.getAttribute("data-swal2-queue-step")&&e.parentNode.removeChild(e),I()&&(null!==Y.previousBodyPadding&&(document.body.style.paddingRight="".concat(Y.previousBodyPadding,"px"),Y.previousBodyPadding=null),function(){if(j(document.body,_.iosfix)){var t=parseInt(document.body.style.top,10);ut(document.body,_.iosfix),document.body.style.top="",document.body.scrollTop=-1*t}}(),"undefined"!=typeof window&&Gt()&&window.removeEventListener("resize",te),m(document.body.children).forEach(function(t){t.hasAttribute("data-previous-aria-hidden")?(t.setAttribute("aria-hidden",t.getAttribute("data-previous-aria-hidden")),t.removeAttribute("data-previous-aria-hidden")):t.removeAttribute("aria-hidden")})),ut([document.documentElement,document.body],[_.shown,_["height-auto"],_["no-backdrop"],_["toast-shown"],_["toast-column"]])}function ie(t){var e=W();if(e){var n=wt.innerParams.get(this);if(n&&!j(e,n.hideClass.popup)){var o=ne.swalPromiseResolve.get(this);ut(e,n.showClass.popup),st(e,n.hideClass.popup);var i=z();ut(i,n.showClass.backdrop),st(i,n.hideClass.backdrop),function(t,e,n){var o=z(),i=gt&&et(e),r=n.onClose,a=n.onAfterClose;if(r!==null&&typeof r==="function"){r(e)}if(i){re(t,e,o,a)}else{oe(t,o,K(),a)}}(this,e,n),o(t||{})}}}var re=function(t,e,n,o){Wt.swalCloseEventFinishedCallback=oe.bind(null,t,n,K(),o),e.addEventListener(gt,function(t){t.target===e&&(Wt.swalCloseEventFinishedCallback(),delete Wt.swalCloseEventFinishedCallback)})},ae=function(t,e){setTimeout(function(){"function"==typeof e&&e(),t._destroy()})};function ce(t,e,n){var o=wt.domCache.get(t);e.forEach(function(t){o[t].disabled=n})}function se(t,e){if(!t)return!1;if("radio"===t.type)for(var n=t.parentNode.parentNode.querySelectorAll("input"),o=0;o<n.length;o++)n[o].disabled=e;else t.disabled=e}var ue=function(){function n(t,e){o(this,n),this.callback=t,this.remaining=e,this.running=!1,this.start()}return a(n,[{key:"start",value:function(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}},{key:"stop",value:function(){return this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=new Date-this.started),this.remaining}},{key:"increase",value:function(t){var e=this.running;return e&&this.stop(),this.remaining+=t,e&&this.start(),this.remaining}},{key:"getTimerLeft",value:function(){return this.running&&(this.stop(),this.start()),this.remaining}},{key:"isRunning",value:function(){return this.running}}]),n}(),le={email:function(t,e){return/^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(t)?Promise.resolve():Promise.resolve(e||"Invalid email address")},url:function(t,e){return/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(t)?Promise.resolve():Promise.resolve(e||"Invalid URL")}};function de(t){var e,n;(e=t).inputValidator||Object.keys(le).forEach(function(t){e.input===t&&(e.inputValidator=le[t])}),t.showLoaderOnConfirm&&!t.preConfirm&&R("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),t.animation=N(t.animation),(n=t).target&&("string"!=typeof n.target||document.querySelector(n.target))&&("string"==typeof n.target||n.target.appendChild)||(R('Target parameter is not valid, defaulting to "body"'),n.target="body"),"string"==typeof t.title&&(t.title=t.title.split("\n").join("<br />")),ft(t)}function pe(t){var e=z(),n=W();"function"==typeof t.onBeforeOpen&&t.onBeforeOpen(n),xe(e,n,t),Ce(e,n),I()&&ke(e,t.scrollbarPadding),K()||Wt.previousActiveElement||(Wt.previousActiveElement=document.activeElement),"function"==typeof t.onOpen&&setTimeout(function(){return t.onOpen(n)}),ut(e,_["no-transition"])}function fe(t){var e=W();if(t.target===e){var n=z();e.removeEventListener(gt,fe),n.style.overflowY="auto"}}function me(t,e){"select"===e.input||"radio"===e.input?Te(t,e):-1!==["text","email","number","tel","textarea"].indexOf(e.input)&&g(e.inputValue)&&Ee(t,e)}function he(t,e){t.disableButtons(),e.input?Oe(t,e):Me(t,e,!0)}function ge(t,e){t.disableButtons(),e(U.cancel)}function ve(t,e){t.closePopup({value:e})}function be(e,t,n,o){t.keydownTarget&&t.keydownHandlerAdded&&(t.keydownTarget.removeEventListener("keydown",t.keydownHandler,{capture:t.keydownListenerCapture}),t.keydownHandlerAdded=!1),n.toast||(t.keydownHandler=function(t){return je(e,t,o)},t.keydownTarget=n.keydownListenerCapture?window:W(),t.keydownListenerCapture=n.keydownListenerCapture,t.keydownTarget.addEventListener("keydown",t.keydownHandler,{capture:t.keydownListenerCapture}),t.keydownHandlerAdded=!0)}function ye(t,e,n){var o=H(),i=0;if(i<o.length)return(e+=n)===o.length?e=0:-1===e&&(e=o.length-1),o[e].focus();W().focus()}function we(t,e,n){wt.innerParams.get(t).toast?Ne(t,e,n):(_e(e),Fe(e),ze(t,e,n))}var Ce=function(t,e){gt&&et(e)?(t.style.overflowY="hidden",e.addEventListener(gt,fe)):t.style.overflowY="auto"},ke=function(t,e){!function(){if((/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream||"MacIntel"===navigator.platform&&1<navigator.maxTouchPoints)&&!j(document.body,_.iosfix)){var t=document.body.scrollTop;document.body.style.top="".concat(-1*t,"px"),st(document.body,_.iosfix),ee()}}(),"undefined"!=typeof window&&Gt()&&(te(),window.addEventListener("resize",te)),m(document.body.children).forEach(function(t){t===z()||function(t,e){if("function"==typeof t.contains)return t.contains(e)}(t,z())||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")),t.setAttribute("aria-hidden","true"))}),e&&Xt(),setTimeout(function(){t.scrollTop=0})},xe=function(t,e,n){st(t,n.showClass.backdrop),X(e),st(e,n.showClass.popup),st([document.documentElement,document.body],_.shown),n.heightAuto&&n.backdrop&&!n.toast&&st([document.documentElement,document.body],_["height-auto"])},Pe=function(t){return t.checked?1:0},Ae=function(t){return t.checked?t.value:null},Be=function(t){return t.files.length?null!==t.getAttribute("multiple")?t.files:t.files[0]:null},Te=function(e,n){function o(t){return Se[n.input](i,Le(t),n)}var i=k();g(n.inputOptions)?(Dt(),n.inputOptions.then(function(t){e.hideLoading(),o(t)})):"object"===r(n.inputOptions)?o(n.inputOptions):v("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(r(n.inputOptions)))},Ee=function(e,n){var o=e.getInput();G(o),n.inputValue.then(function(t){o.value="number"===n.input?parseFloat(t)||0:"".concat(t),X(o),o.focus(),e.hideLoading()}).catch(function(t){v("Error in inputValue promise: ".concat(t)),o.value="",X(o),o.focus(),e.hideLoading()})},Se={select:function(t,e,i){var r=lt(t,_.select);e.forEach(function(t){var e=t[0],n=t[1],o=document.createElement("option");o.value=e,o.innerHTML=n,i.inputValue.toString()===e.toString()&&(o.selected=!0),r.appendChild(o)}),r.focus()},radio:function(t,e,a){var c=lt(t,_.radio);e.forEach(function(t){var e=t[0],n=t[1],o=document.createElement("input"),i=document.createElement("label");o.type="radio",o.name=_.radio,o.value=e,a.inputValue.toString()===e.toString()&&(o.checked=!0);var r=document.createElement("span");r.innerHTML=n,r.className=_.label,i.appendChild(o),i.appendChild(r),c.appendChild(i)});var n=c.querySelectorAll("input");n.length&&n[0].focus()}},Le=function(e){var n=[];return"undefined"!=typeof Map&&e instanceof Map?e.forEach(function(t,e){n.push([e,t])}):Object.keys(e).forEach(function(t){n.push([t,e[t]])}),n},Oe=function(e,n){var o=function(t,e){var n=t.getInput();if(!n)return null;switch(e.input){case"checkbox":return Pe(n);case"radio":return Ae(n);case"file":return Be(n);default:return e.inputAutoTrim?n.value.trim():n.value}}(e,n);n.inputValidator?(e.disableInput(),Promise.resolve().then(function(){return n.inputValidator(o,n.validationMessage)}).then(function(t){e.enableButtons(),e.enableInput(),t?e.showValidationMessage(t):Me(e,n,o)})):e.getInput().checkValidity()?Me(e,n,o):(e.enableButtons(),e.showValidationMessage(n.validationMessage))},Me=function(e,t,n){(t.showLoaderOnConfirm&&Dt(),t.preConfirm)?(e.resetValidationMessage(),Promise.resolve().then(function(){return t.preConfirm(n,t.validationMessage)}).then(function(t){dt(A())||!1===t?e.hideLoading():ve(e,void 0===t?n:t)})):ve(e,n)},He=["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Left","Right","Up","Down"],Ie=["Escape","Esc"],je=function(t,e,n){var o=wt.innerParams.get(t);o.stopKeydownPropagation&&e.stopPropagation(),"Enter"===e.key?qe(t,e,o):"Tab"===e.key?Ve(e,o):-1!==He.indexOf(e.key)?Re():-1!==Ie.indexOf(e.key)&&De(e,o,n)},qe=function(t,e,n){if(!e.isComposing&&e.target&&t.getInput()&&e.target.outerHTML===t.getInput().outerHTML){if(-1!==["textarea","file"].indexOf(n.input))return;Mt(),e.preventDefault()}},Ve=function(t){for(var e=t.target,n=H(),o=-1,i=0;i<n.length;i++)if(e===n[i]){o=i;break}t.shiftKey?ye(0,o,-1):ye(0,o,1),t.stopPropagation(),t.preventDefault()},Re=function(){var t=B(),e=T();document.activeElement===t&&dt(e)?e.focus():document.activeElement===e&&dt(t)&&t.focus()},De=function(t,e,n){N(e.allowEscapeKey)&&(t.preventDefault(),n(U.esc))},Ne=function(e,t,n){t.popup.onclick=function(){var t=wt.innerParams.get(e);t.showConfirmButton||t.showCancelButton||t.showCloseButton||t.input||n(U.close)}},Ue=!1,_e=function(e){e.popup.onmousedown=function(){e.container.onmouseup=function(t){e.container.onmouseup=void 0,t.target===e.container&&(Ue=!0)}}},Fe=function(e){e.container.onmousedown=function(){e.popup.onmouseup=function(t){e.popup.onmouseup=void 0,t.target!==e.popup&&!e.popup.contains(t.target)||(Ue=!0)}}},ze=function(n,o,i){o.container.onclick=function(t){var e=wt.innerParams.get(n);Ue?Ue=!1:t.target===o.container&&N(e.allowOutsideClick)&&i(U.backdrop)}};var We=function(t,e,n){var o=O();G(o),e.timer&&(t.timeout=new ue(function(){n("timer"),delete t.timeout},e.timer),e.timerProgressBar&&(X(o),setTimeout(function(){t.timeout.running&&nt(e.timer)})))},Ke=function(t,e){if(!e.toast)return N(e.allowEnterKey)?e.focusCancel&&dt(t.cancelButton)?t.cancelButton.focus():e.focusConfirm&&dt(t.confirmButton)?t.confirmButton.focus():void ye(0,-1,1):Ye()},Ye=function(){document.activeElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};var Ze,Qe=function(t){for(var e in t)t[e]=new WeakMap},$e=Object.freeze({hideLoading:Jt,disableLoading:Jt,getInput:function(t){var e=wt.innerParams.get(t||this),n=wt.domCache.get(t||this);return n?Z(n.content,e.input):null},close:ie,closePopup:ie,closeModal:ie,closeToast:ie,enableButtons:function(){ce(this,["confirmButton","cancelButton"],!1)},disableButtons:function(){ce(this,["confirmButton","cancelButton"],!0)},enableInput:function(){return se(this.getInput(),!1)},disableInput:function(){return se(this.getInput(),!0)},showValidationMessage:function(t){var e=wt.domCache.get(this);e.validationMessage.innerHTML=t;var n=window.getComputedStyle(e.popup);e.validationMessage.style.marginLeft="-".concat(n.getPropertyValue("padding-left")),e.validationMessage.style.marginRight="-".concat(n.getPropertyValue("padding-right")),X(e.validationMessage);var o=this.getInput();o&&(o.setAttribute("aria-invalid",!0),o.setAttribute("aria-describedBy",_["validation-message"]),Q(o),st(o,_.inputerror))},resetValidationMessage:function(){var t=wt.domCache.get(this);t.validationMessage&&G(t.validationMessage);var e=this.getInput();e&&(e.removeAttribute("aria-invalid"),e.removeAttribute("aria-describedBy"),ut(e,_.inputerror))},getProgressSteps:function(){return wt.domCache.get(this).progressSteps},_main:function(t){!function(t){for(var e in t)Ft(i=e)||R('Unknown parameter "'.concat(i,'"')),t.toast&&(o=e,-1!==Qt.indexOf(o)&&R('The parameter "'.concat(o,'" is incompatible with toasts'))),zt(n=e)&&h(n,zt(n));var n,o,i}(t),Wt.currentInstance&&Wt.currentInstance._destroy(),Wt.currentInstance=this;var e=function(t){var e=c({},Kt.showClass,t.showClass),n=c({},Kt.hideClass,t.hideClass),o=c({},Kt,t);if(o.showClass=e,o.hideClass=n,t.animation===false){o.showClass={popup:"",backdrop:"swal2-backdrop-show swal2-noanimation"};o.hideClass={}}return o}(t);de(e),Object.freeze(e),Wt.timeout&&(Wt.timeout.stop(),delete Wt.timeout),clearTimeout(Wt.restoreFocusTimeout);var n=function(t){var e={popup:W(),container:z(),content:k(),actions:E(),confirmButton:B(),cancelButton:T(),closeButton:M(),validationMessage:A(),progressSteps:P()};return wt.domCache.set(t,e),e}(this);return Ot(this,e),wt.innerParams.set(this,e),function(n,o,i){return new Promise(function(t){var e=function t(e){n.closePopup({dismiss:e})};ne.swalPromiseResolve.set(n,t);We(Wt,i,e);o.confirmButton.onclick=function(){return he(n,i)};o.cancelButton.onclick=function(){return ge(n,e)};o.closeButton.onclick=function(){return e(U.close)};we(n,o,e);be(n,Wt,i,e);if(i.toast&&(i.input||i.footer||i.showCloseButton)){st(document.body,_["toast-column"])}else{ut(document.body,_["toast-column"])}me(n,i);pe(i);Ke(o,i);o.container.scrollTop=0})}(this,n,e)},update:function(e){var t=W(),n=wt.innerParams.get(this);if(!t||j(t,n.hideClass.popup))return R("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");var o={};Object.keys(e).forEach(function(t){Xe.isUpdatableParameter(t)?o[t]=e[t]:R('Invalid parameter to update: "'.concat(t,'". Updatable params are listed here: https://github.com/sweetalert2/sweetalert2/blob/master/src/utils/params.js'))});var i=c({},n,o);Ot(this,i),wt.innerParams.set(this,i),Object.defineProperties(this,{params:{value:c({},this.params,e),writable:!1,enumerable:!0}})},_destroy:function(){var t=wt.domCache.get(this),e=wt.innerParams.get(this);e&&(t.popup&&Wt.swalCloseEventFinishedCallback&&(Wt.swalCloseEventFinishedCallback(),delete Wt.swalCloseEventFinishedCallback),Wt.deferDisposalTimer&&(clearTimeout(Wt.deferDisposalTimer),delete Wt.deferDisposalTimer),"function"==typeof e.onDestroy&&e.onDestroy(),delete this.params,delete Wt.keydownHandler,delete Wt.keydownTarget,Qe(wt),Qe(ne))}});function Je(){if("undefined"!=typeof window){"undefined"==typeof Promise&&v("This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)"),Ze=this;for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var o=Object.freeze(this.constructor.argsToParams(e));Object.defineProperties(this,{params:{value:o,writable:!1,enumerable:!0,configurable:!0}});var i=this._main(this.params);wt.promise.set(this,i)}}Je.prototype.then=function(t){return wt.promise.get(this).then(t)},Je.prototype.finally=function(t){return wt.promise.get(this).finally(t)},c(Je.prototype,$e),c(Je,$t),Object.keys($e).forEach(function(t){Je[t]=function(){if(Ze)return Ze[t].apply(Ze,arguments)}}),Je.DismissReason=U,Je.version="9.10.0";var Xe=Je;return Xe.default=Xe}),void 0!==this&&this.wpr_Sweetalert2&&(this.wpr_swal=this.wpr_sweetAlert=this.wpr_Swal=this.wpr_SweetAlert=this.wpr_Sweetalert2);

/*! js-cookie v2.2.1 | MIT */
!function(a){var b;if("function"==typeof define&&define.amd&&(define(a),b=!0),"object"==typeof exports&&(module.exports=a(),b=!0),!b){var c=window.Cookies,d=window.Cookies=a();d.noConflict=function(){return window.Cookies=c,d}}}(function(){function a(){for(var a=0,b={};a<arguments.length;a++){var c=arguments[a];for(var d in c)b[d]=c[d]}return b}function b(a){return a.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}function c(d){function e(){}function f(b,c,f){if("undefined"!=typeof document){f=a({path:"/"},e.defaults,f),"number"==typeof f.expires&&(f.expires=new Date(1*new Date+864e5*f.expires)),f.expires=f.expires?f.expires.toUTCString():"";try{var g=JSON.stringify(c);/^[\{\[]/.test(g)&&(c=g)}catch(j){}c=d.write?d.write(c,b):encodeURIComponent(c+"").replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),b=encodeURIComponent(b+"").replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var h="";for(var i in f)f[i]&&(h+="; "+i,!0!==f[i]&&(h+="="+f[i].split(";")[0]));return document.cookie=b+"="+c+h}}function g(a,c){if("undefined"!=typeof document){for(var e={},f=document.cookie?document.cookie.split("; "):[],g=0;g<f.length;g++){var h=f[g].split("="),i=h.slice(1).join("=");c||'"'!==i.charAt(0)||(i=i.slice(1,-1));try{var j=b(h[0]);if(i=(d.read||d)(i,j)||b(i),c)try{i=JSON.parse(i)}catch(k){}if(e[j]=i,a===j)break}catch(k){}}return a?e[a]:e}}return e.set=f,e.get=function(a){return g(a,!1)},e.getJSON=function(a){return g(a,!0)},e.remove=function(b,c){f(b,"",a(c,{expires:-1}))},e.defaults={},e.withConverter=c,e}return c(function(){})});

/*! tooltipster v4.2.8 */!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){function b(a){this.$container,this.constraints=null,this.__$tooltip,this.__init(a)}function c(b,c){var d=!0;return a.each(b,function(a,e){return void 0===c[a]||b[a]!==c[a]?(d=!1,!1):void 0}),d}function d(b){var c=b.attr("id"),d=c?h.window.document.getElementById(c):null;return d?d===b[0]:a.contains(h.window.document.body,b[0])}function e(){if(!g)return!1;var a=g.document.body||g.document.documentElement,b=a.style,c="transition",d=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof b[c])return!0;c=c.charAt(0).toUpperCase()+c.substr(1);for(var e=0;e<d.length;e++)if("string"==typeof b[d[e]+c])return!0;return!1}var f={animation:"fade",animationDuration:350,content:null,contentAsHTML:!1,contentCloning:!1,debug:!0,delay:300,delayTouch:[300,500],functionInit:null,functionBefore:null,functionReady:null,functionAfter:null,functionFormat:null,IEmin:6,interactive:!1,multiple:!1,parent:null,plugins:["sideTip"],repositionOnScroll:!1,restoration:"none",selfDestruction:!0,theme:[],timer:0,trackerInterval:500,trackOrigin:!1,trackTooltip:!1,trigger:"hover",triggerClose:{click:!1,mouseleave:!1,originClick:!1,scroll:!1,tap:!1,touchleave:!1},triggerOpen:{click:!1,mouseenter:!1,tap:!1,touchstart:!1},updateAnimation:"rotate",zIndex:9999999},g="undefined"!=typeof window?window:null,h={hasTouchCapability:!(!g||!("ontouchstart"in g||g.DocumentTouch&&g.document instanceof g.DocumentTouch||g.navigator.maxTouchPoints)),hasTransitions:e(),IE:!1,semVer:"4.2.8",window:g},i=function(){this.__$emitterPrivate=a({}),this.__$emitterPublic=a({}),this.__instancesLatestArr=[],this.__plugins={},this._env=h};i.prototype={__bridge:function(b,c,d){if(!c[d]){var e=function(){};e.prototype=b;var g=new e;g.__init&&g.__init(c),a.each(b,function(a,b){0!=a.indexOf("__")&&(c[a]?f.debug&&console.log("The "+a+" method of the "+d+" plugin conflicts with another plugin or native methods"):(c[a]=function(){return g[a].apply(g,Array.prototype.slice.apply(arguments))},c[a].bridged=g))}),c[d]=g}return this},__setWindow:function(a){return h.window=a,this},_getRuler:function(a){return new b(a)},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_plugin:function(b){var c=this;if("string"==typeof b){var d=b,e=null;return d.indexOf(".")>0?e=c.__plugins[d]:a.each(c.__plugins,function(a,b){return b.name.substring(b.name.length-d.length-1)=="."+d?(e=b,!1):void 0}),e}if(b.name.indexOf(".")<0)throw new Error("Plugins must be namespaced");return c.__plugins[b.name]=b,b.core&&c.__bridge(b.core,c,b.name),this},_trigger:function(){var a=Array.prototype.slice.apply(arguments);return"string"==typeof a[0]&&(a[0]={type:a[0]}),this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,a),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,a),this},instances:function(b){var c=[],d=b||".tooltipstered";return a(d).each(function(){var b=a(this),d=b.data("tooltipster-ns");d&&a.each(d,function(a,d){c.push(b.data(d))})}),c},instancesLatest:function(){return this.__instancesLatestArr},off:function(){return this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},origins:function(b){var c=b?b+" ":"";return a(c+".tooltipstered").toArray()},setDefaults:function(b){return a.extend(f,b),this},triggerHandler:function(){return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.tooltipster=new i,a.Tooltipster=function(b,c){this.__callbacks={close:[],open:[]},this.__closingTime,this.__Content,this.__contentBcr,this.__destroyed=!1,this.__$emitterPrivate=a({}),this.__$emitterPublic=a({}),this.__enabled=!0,this.__garbageCollector,this.__Geometry,this.__lastPosition,this.__namespace="tooltipster-"+Math.round(1e6*Math.random()),this.__options,this.__$originParents,this.__pointerIsOverOrigin=!1,this.__previousThemes=[],this.__state="closed",this.__timeouts={close:[],open:null},this.__touchEvents=[],this.__tracker=null,this._$origin,this._$tooltip,this.__init(b,c)},a.Tooltipster.prototype={__init:function(b,c){var d=this;if(d._$origin=a(b),d.__options=a.extend(!0,{},f,c),d.__optionsFormat(),!h.IE||h.IE>=d.__options.IEmin){var e=null;if(void 0===d._$origin.data("tooltipster-initialTitle")&&(e=d._$origin.attr("title"),void 0===e&&(e=null),d._$origin.data("tooltipster-initialTitle",e)),null!==d.__options.content)d.__contentSet(d.__options.content);else{var g,i=d._$origin.attr("data-tooltip-content");i&&(g=a(i)),g&&g[0]?d.__contentSet(g.first()):d.__contentSet(e)}d._$origin.removeAttr("title").addClass("tooltipstered"),d.__prepareOrigin(),d.__prepareGC(),a.each(d.__options.plugins,function(a,b){d._plug(b)}),h.hasTouchCapability&&a(h.window.document.body).on("touchmove."+d.__namespace+"-triggerOpen",function(a){d._touchRecordEvent(a)}),d._on("created",function(){d.__prepareTooltip()})._on("repositioned",function(a){d.__lastPosition=a.position})}else d.__options.disabled=!0},__contentInsert:function(){var a=this,b=a._$tooltip.find(".tooltipster-content"),c=a.__Content,d=function(a){c=a};return a._trigger({type:"format",content:a.__Content,format:d}),a.__options.functionFormat&&(c=a.__options.functionFormat.call(a,a,{origin:a._$origin[0]},a.__Content)),"string"!=typeof c||a.__options.contentAsHTML?b.empty().append(c):b.text(c),a},__contentSet:function(b){return b instanceof a&&this.__options.contentCloning&&(b=b.clone(!0)),this.__Content=b,this._trigger({type:"updated",content:b}),this},__destroyError:function(){throw new Error("This tooltip has been destroyed and cannot execute your method call.")},__geometry:function(){var b=this,c=b._$origin,d=b._$origin.is("area");if(d){var e=b._$origin.parent().attr("name");c=a('img[usemap="#'+e+'"]')}var f=c[0].getBoundingClientRect(),g=a(h.window.document),i=a(h.window),j=c,k={available:{document:null,window:null},document:{size:{height:g.height(),width:g.width()}},window:{scroll:{left:h.window.scrollX||h.window.document.documentElement.scrollLeft,top:h.window.scrollY||h.window.document.documentElement.scrollTop},size:{height:i.height(),width:i.width()}},origin:{fixedLineage:!1,offset:{},size:{height:f.bottom-f.top,width:f.right-f.left},usemapImage:d?c[0]:null,windowOffset:{bottom:f.bottom,left:f.left,right:f.right,top:f.top}}};if(d){var l=b._$origin.attr("shape"),m=b._$origin.attr("coords");if(m&&(m=m.split(","),a.map(m,function(a,b){m[b]=parseInt(a)})),"default"!=l)switch(l){case"circle":var n=m[0],o=m[1],p=m[2],q=o-p,r=n-p;k.origin.size.height=2*p,k.origin.size.width=k.origin.size.height,k.origin.windowOffset.left+=r,k.origin.windowOffset.top+=q;break;case"rect":var s=m[0],t=m[1],u=m[2],v=m[3];k.origin.size.height=v-t,k.origin.size.width=u-s,k.origin.windowOffset.left+=s,k.origin.windowOffset.top+=t;break;case"poly":for(var w=0,x=0,y=0,z=0,A="even",B=0;B<m.length;B++){var C=m[B];"even"==A?(C>y&&(y=C,0===B&&(w=y)),w>C&&(w=C),A="odd"):(C>z&&(z=C,1==B&&(x=z)),x>C&&(x=C),A="even")}k.origin.size.height=z-x,k.origin.size.width=y-w,k.origin.windowOffset.left+=w,k.origin.windowOffset.top+=x}}var D=function(a){k.origin.size.height=a.height,k.origin.windowOffset.left=a.left,k.origin.windowOffset.top=a.top,k.origin.size.width=a.width};for(b._trigger({type:"geometry",edit:D,geometry:{height:k.origin.size.height,left:k.origin.windowOffset.left,top:k.origin.windowOffset.top,width:k.origin.size.width}}),k.origin.windowOffset.right=k.origin.windowOffset.left+k.origin.size.width,k.origin.windowOffset.bottom=k.origin.windowOffset.top+k.origin.size.height,k.origin.offset.left=k.origin.windowOffset.left+k.window.scroll.left,k.origin.offset.top=k.origin.windowOffset.top+k.window.scroll.top,k.origin.offset.bottom=k.origin.offset.top+k.origin.size.height,k.origin.offset.right=k.origin.offset.left+k.origin.size.width,k.available.document={bottom:{height:k.document.size.height-k.origin.offset.bottom,width:k.document.size.width},left:{height:k.document.size.height,width:k.origin.offset.left},right:{height:k.document.size.height,width:k.document.size.width-k.origin.offset.right},top:{height:k.origin.offset.top,width:k.document.size.width}},k.available.window={bottom:{height:Math.max(k.window.size.height-Math.max(k.origin.windowOffset.bottom,0),0),width:k.window.size.width},left:{height:k.window.size.height,width:Math.max(k.origin.windowOffset.left,0)},right:{height:k.window.size.height,width:Math.max(k.window.size.width-Math.max(k.origin.windowOffset.right,0),0)},top:{height:Math.max(k.origin.windowOffset.top,0),width:k.window.size.width}};"html"!=j[0].tagName.toLowerCase();){if("fixed"==j.css("position")){k.origin.fixedLineage=!0;break}j=j.parent()}return k},__optionsFormat:function(){return"number"==typeof this.__options.animationDuration&&(this.__options.animationDuration=[this.__options.animationDuration,this.__options.animationDuration]),"number"==typeof this.__options.delay&&(this.__options.delay=[this.__options.delay,this.__options.delay]),"number"==typeof this.__options.delayTouch&&(this.__options.delayTouch=[this.__options.delayTouch,this.__options.delayTouch]),"string"==typeof this.__options.theme&&(this.__options.theme=[this.__options.theme]),null===this.__options.parent?this.__options.parent=a(h.window.document.body):"string"==typeof this.__options.parent&&(this.__options.parent=a(this.__options.parent)),"hover"==this.__options.trigger?(this.__options.triggerOpen={mouseenter:!0,touchstart:!0},this.__options.triggerClose={mouseleave:!0,originClick:!0,touchleave:!0}):"click"==this.__options.trigger&&(this.__options.triggerOpen={click:!0,tap:!0},this.__options.triggerClose={click:!0,tap:!0}),this._trigger("options"),this},__prepareGC:function(){var b=this;return b.__options.selfDestruction?b.__garbageCollector=setInterval(function(){var c=(new Date).getTime();b.__touchEvents=a.grep(b.__touchEvents,function(a,b){return c-a.time>6e4}),d(b._$origin)||b.close(function(){b.destroy()})},2e4):clearInterval(b.__garbageCollector),b},__prepareOrigin:function(){var a=this;if(a._$origin.off("."+a.__namespace+"-triggerOpen"),h.hasTouchCapability&&a._$origin.on("touchstart."+a.__namespace+"-triggerOpen touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen",function(b){a._touchRecordEvent(b)}),a.__options.triggerOpen.click||a.__options.triggerOpen.tap&&h.hasTouchCapability){var b="";a.__options.triggerOpen.click&&(b+="click."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.tap&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&a._open(b)})}if(a.__options.triggerOpen.mouseenter||a.__options.triggerOpen.touchstart&&h.hasTouchCapability){var b="";a.__options.triggerOpen.mouseenter&&(b+="mouseenter."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.touchstart&&h.hasTouchCapability&&(b+="touchstart."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){!a._touchIsTouchEvent(b)&&a._touchIsEmulatedEvent(b)||(a.__pointerIsOverOrigin=!0,a._openShortly(b))})}if(a.__options.triggerClose.mouseleave||a.__options.triggerClose.touchleave&&h.hasTouchCapability){var b="";a.__options.triggerClose.mouseleave&&(b+="mouseleave."+a.__namespace+"-triggerOpen "),a.__options.triggerClose.touchleave&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&(a.__pointerIsOverOrigin=!1)})}return a},__prepareTooltip:function(){var b=this,c=b.__options.interactive?"auto":"";return b._$tooltip.attr("id",b.__namespace).css({"pointer-events":c,zIndex:b.__options.zIndex}),a.each(b.__previousThemes,function(a,c){b._$tooltip.removeClass(c)}),a.each(b.__options.theme,function(a,c){b._$tooltip.addClass(c)}),b.__previousThemes=a.merge([],b.__options.theme),b},__scrollHandler:function(b){var c=this;if(c.__options.triggerClose.scroll)c._close(b);else if(d(c._$origin)&&d(c._$tooltip)){var e=null;if(b.target===h.window.document)c.__Geometry.origin.fixedLineage||c.__options.repositionOnScroll&&c.reposition(b);else{e=c.__geometry();var f=!1;if("fixed"!=c._$origin.css("position")&&c.__$originParents.each(function(b,c){var d=a(c),g=d.css("overflow-x"),h=d.css("overflow-y");if("visible"!=g||"visible"!=h){var i=c.getBoundingClientRect();if("visible"!=g&&(e.origin.windowOffset.left<i.left||e.origin.windowOffset.right>i.right))return f=!0,!1;if("visible"!=h&&(e.origin.windowOffset.top<i.top||e.origin.windowOffset.bottom>i.bottom))return f=!0,!1}return"fixed"==d.css("position")?!1:void 0}),f)c._$tooltip.css("visibility","hidden");else if(c._$tooltip.css("visibility","visible"),c.__options.repositionOnScroll)c.reposition(b);else{var g=e.origin.offset.left-c.__Geometry.origin.offset.left,i=e.origin.offset.top-c.__Geometry.origin.offset.top;c._$tooltip.css({left:c.__lastPosition.coord.left+g,top:c.__lastPosition.coord.top+i})}}c._trigger({type:"scroll",event:b,geo:e})}return c},__stateSet:function(a){return this.__state=a,this._trigger({type:"state",state:a}),this},__timeoutsClear:function(){return clearTimeout(this.__timeouts.open),this.__timeouts.open=null,a.each(this.__timeouts.close,function(a,b){clearTimeout(b)}),this.__timeouts.close=[],this},__trackerStart:function(){var a=this,b=a._$tooltip.find(".tooltipster-content");return a.__options.trackTooltip&&(a.__contentBcr=b[0].getBoundingClientRect()),a.__tracker=setInterval(function(){if(d(a._$origin)&&d(a._$tooltip)){if(a.__options.trackOrigin){var e=a.__geometry(),f=!1;c(e.origin.size,a.__Geometry.origin.size)&&(a.__Geometry.origin.fixedLineage?c(e.origin.windowOffset,a.__Geometry.origin.windowOffset)&&(f=!0):c(e.origin.offset,a.__Geometry.origin.offset)&&(f=!0)),f||(a.__options.triggerClose.mouseleave?a._close():a.reposition())}if(a.__options.trackTooltip){var g=b[0].getBoundingClientRect();g.height===a.__contentBcr.height&&g.width===a.__contentBcr.width||(a.reposition(),a.__contentBcr=g)}}else a._close()},a.__options.trackerInterval),a},_close:function(b,c,d){var e=this,f=!0;if(e._trigger({type:"close",event:b,stop:function(){f=!1}}),f||d){c&&e.__callbacks.close.push(c),e.__callbacks.open=[],e.__timeoutsClear();var g=function(){a.each(e.__callbacks.close,function(a,c){c.call(e,e,{event:b,origin:e._$origin[0]})}),e.__callbacks.close=[]};if("closed"!=e.__state){var i=!0,j=new Date,k=j.getTime(),l=k+e.__options.animationDuration[1];if("disappearing"==e.__state&&l>e.__closingTime&&e.__options.animationDuration[1]>0&&(i=!1),i){e.__closingTime=l,"disappearing"!=e.__state&&e.__stateSet("disappearing");var m=function(){clearInterval(e.__tracker),e._trigger({type:"closing",event:b}),e._$tooltip.off("."+e.__namespace+"-triggerClose").removeClass("tooltipster-dying"),a(h.window).off("."+e.__namespace+"-triggerClose"),e.__$originParents.each(function(b,c){a(c).off("scroll."+e.__namespace+"-triggerClose")}),e.__$originParents=null,a(h.window.document.body).off("."+e.__namespace+"-triggerClose"),e._$origin.off("."+e.__namespace+"-triggerClose"),e._off("dismissable"),e.__stateSet("closed"),e._trigger({type:"after",event:b}),e.__options.functionAfter&&e.__options.functionAfter.call(e,e,{event:b,origin:e._$origin[0]}),g()};h.hasTransitions?(e._$tooltip.css({"-moz-animation-duration":e.__options.animationDuration[1]+"ms","-ms-animation-duration":e.__options.animationDuration[1]+"ms","-o-animation-duration":e.__options.animationDuration[1]+"ms","-webkit-animation-duration":e.__options.animationDuration[1]+"ms","animation-duration":e.__options.animationDuration[1]+"ms","transition-duration":e.__options.animationDuration[1]+"ms"}),e._$tooltip.clearQueue().removeClass("tooltipster-show").addClass("tooltipster-dying"),e.__options.animationDuration[1]>0&&e._$tooltip.delay(e.__options.animationDuration[1]),e._$tooltip.queue(m)):e._$tooltip.stop().fadeOut(e.__options.animationDuration[1],m)}}else g()}return e},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_open:function(b,c){var e=this;if(!e.__destroying&&d(e._$origin)&&e.__enabled){var f=!0;if("closed"==e.__state&&(e._trigger({type:"before",event:b,stop:function(){f=!1}}),f&&e.__options.functionBefore&&(f=e.__options.functionBefore.call(e,e,{event:b,origin:e._$origin[0]}))),f!==!1&&null!==e.__Content){c&&e.__callbacks.open.push(c),e.__callbacks.close=[],e.__timeoutsClear();var g,i=function(){"stable"!=e.__state&&e.__stateSet("stable"),a.each(e.__callbacks.open,function(a,b){b.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}),e.__callbacks.open=[]};if("closed"!==e.__state)g=0,"disappearing"===e.__state?(e.__stateSet("appearing"),h.hasTransitions?(e._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i)):e._$tooltip.stop().fadeIn(i)):"stable"==e.__state&&i();else{if(e.__stateSet("appearing"),g=e.__options.animationDuration[0],e.__contentInsert(),e.reposition(b,!0),h.hasTransitions?(e._$tooltip.addClass("tooltipster-"+e.__options.animation).addClass("tooltipster-initial").css({"-moz-animation-duration":e.__options.animationDuration[0]+"ms","-ms-animation-duration":e.__options.animationDuration[0]+"ms","-o-animation-duration":e.__options.animationDuration[0]+"ms","-webkit-animation-duration":e.__options.animationDuration[0]+"ms","animation-duration":e.__options.animationDuration[0]+"ms","transition-duration":e.__options.animationDuration[0]+"ms"}),setTimeout(function(){"closed"!=e.__state&&(e._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i))},0)):e._$tooltip.css("display","none").fadeIn(e.__options.animationDuration[0],i),e.__trackerStart(),a(h.window).on("resize."+e.__namespace+"-triggerClose",function(b){var c=a(document.activeElement);(c.is("input")||c.is("textarea"))&&a.contains(e._$tooltip[0],c[0])||e.reposition(b)}).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)}),e.__$originParents=e._$origin.parents(),e.__$originParents.each(function(b,c){a(c).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)})}),e.__options.triggerClose.mouseleave||e.__options.triggerClose.touchleave&&h.hasTouchCapability){e._on("dismissable",function(a){a.dismissable?a.delay?(m=setTimeout(function(){e._close(a.event)},a.delay),e.__timeouts.close.push(m)):e._close(a):clearTimeout(m)});var j=e._$origin,k="",l="",m=null;e.__options.interactive&&(j=j.add(e._$tooltip)),e.__options.triggerClose.mouseleave&&(k+="mouseenter."+e.__namespace+"-triggerClose ",l+="mouseleave."+e.__namespace+"-triggerClose "),e.__options.triggerClose.touchleave&&h.hasTouchCapability&&(k+="touchstart."+e.__namespace+"-triggerClose",l+="touchend."+e.__namespace+"-triggerClose touchcancel."+e.__namespace+"-triggerClose"),j.on(l,function(a){if(e._touchIsTouchEvent(a)||!e._touchIsEmulatedEvent(a)){var b="mouseleave"==a.type?e.__options.delay:e.__options.delayTouch;e._trigger({delay:b[1],dismissable:!0,event:a,type:"dismissable"})}}).on(k,function(a){!e._touchIsTouchEvent(a)&&e._touchIsEmulatedEvent(a)||e._trigger({dismissable:!1,event:a,type:"dismissable"})})}e.__options.triggerClose.originClick&&e._$origin.on("click."+e.__namespace+"-triggerClose",function(a){e._touchIsTouchEvent(a)||e._touchIsEmulatedEvent(a)||e._close(a)}),(e.__options.triggerClose.click||e.__options.triggerClose.tap&&h.hasTouchCapability)&&setTimeout(function(){if("closed"!=e.__state){var b="",c=a(h.window.document.body);e.__options.triggerClose.click&&(b+="click."+e.__namespace+"-triggerClose "),e.__options.triggerClose.tap&&h.hasTouchCapability&&(b+="touchend."+e.__namespace+"-triggerClose"),c.on(b,function(b){e._touchIsMeaningfulEvent(b)&&(e._touchRecordEvent(b),e.__options.interactive&&a.contains(e._$tooltip[0],b.target)||e._close(b))}),e.__options.triggerClose.tap&&h.hasTouchCapability&&c.on("touchstart."+e.__namespace+"-triggerClose",function(a){e._touchRecordEvent(a)})}},0),e._trigger("ready"),e.__options.functionReady&&e.__options.functionReady.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}if(e.__options.timer>0){var m=setTimeout(function(){e._close()},e.__options.timer+g);e.__timeouts.close.push(m)}}}return e},_openShortly:function(a){var b=this,c=!0;if("stable"!=b.__state&&"appearing"!=b.__state&&!b.__timeouts.open&&(b._trigger({type:"start",event:a,stop:function(){c=!1}}),c)){var d=0==a.type.indexOf("touch")?b.__options.delayTouch:b.__options.delay;d[0]?b.__timeouts.open=setTimeout(function(){b.__timeouts.open=null,b.__pointerIsOverOrigin&&b._touchIsMeaningfulEvent(a)?(b._trigger("startend"),b._open(a)):b._trigger("startcancel")},d[0]):(b._trigger("startend"),b._open(a))}return b},_optionsExtract:function(b,c){var d=this,e=a.extend(!0,{},c),f=d.__options[b];return f||(f={},a.each(c,function(a,b){var c=d.__options[a];void 0!==c&&(f[a]=c)})),a.each(e,function(b,c){void 0!==f[b]&&("object"!=typeof c||c instanceof Array||null==c||"object"!=typeof f[b]||f[b]instanceof Array||null==f[b]?e[b]=f[b]:a.extend(e[b],f[b]))}),e},_plug:function(b){var c=a.tooltipster._plugin(b);if(!c)throw new Error('The "'+b+'" plugin is not defined');return c.instance&&a.tooltipster.__bridge(c.instance,this,c.name),this},_touchIsEmulatedEvent:function(a){for(var b=!1,c=(new Date).getTime(),d=this.__touchEvents.length-1;d>=0;d--){var e=this.__touchEvents[d];if(!(c-e.time<500))break;e.target===a.target&&(b=!0)}return b},_touchIsMeaningfulEvent:function(a){return this._touchIsTouchEvent(a)&&!this._touchSwiped(a.target)||!this._touchIsTouchEvent(a)&&!this._touchIsEmulatedEvent(a)},_touchIsTouchEvent:function(a){return 0==a.type.indexOf("touch")},_touchRecordEvent:function(a){return this._touchIsTouchEvent(a)&&(a.time=(new Date).getTime(),this.__touchEvents.push(a)),this},_touchSwiped:function(a){for(var b=!1,c=this.__touchEvents.length-1;c>=0;c--){var d=this.__touchEvents[c];if("touchmove"==d.type){b=!0;break}if("touchstart"==d.type&&a===d.target)break}return b},_trigger:function(){var b=Array.prototype.slice.apply(arguments);return"string"==typeof b[0]&&(b[0]={type:b[0]}),b[0].instance=this,b[0].origin=this._$origin?this._$origin[0]:null,b[0].tooltip=this._$tooltip?this._$tooltip[0]:null,this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,b),a.tooltipster._trigger.apply(a.tooltipster,b),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,b),this},_unplug:function(b){var c=this;if(c[b]){var d=a.tooltipster._plugin(b);d.instance&&a.each(d.instance,function(a,d){c[a]&&c[a].bridged===c[b]&&delete c[a]}),c[b].__destroy&&c[b].__destroy(),delete c[b]}return c},close:function(a){return this.__destroyed?this.__destroyError():this._close(null,a),this},content:function(a){var b=this;if(void 0===a)return b.__Content;if(b.__destroyed)b.__destroyError();else if(b.__contentSet(a),null!==b.__Content){if("closed"!==b.__state&&(b.__contentInsert(),b.reposition(),b.__options.updateAnimation))if(h.hasTransitions){var c=b.__options.updateAnimation;b._$tooltip.addClass("tooltipster-update-"+c),setTimeout(function(){"closed"!=b.__state&&b._$tooltip.removeClass("tooltipster-update-"+c)},1e3)}else b._$tooltip.fadeTo(200,.5,function(){"closed"!=b.__state&&b._$tooltip.fadeTo(200,1)})}else b._close();return b},destroy:function(){var b=this;if(b.__destroyed)b.__destroyError();else{"closed"!=b.__state?b.option("animationDuration",0)._close(null,null,!0):b.__timeoutsClear(),b._trigger("destroy"),b.__destroyed=!0,b._$origin.removeData(b.__namespace).off("."+b.__namespace+"-triggerOpen"),a(h.window.document.body).off("."+b.__namespace+"-triggerOpen");var c=b._$origin.data("tooltipster-ns");if(c)if(1===c.length){var d=null;"previous"==b.__options.restoration?d=b._$origin.data("tooltipster-initialTitle"):"current"==b.__options.restoration&&(d="string"==typeof b.__Content?b.__Content:a("<div></div>").append(b.__Content).html()),d&&b._$origin.attr("title",d),b._$origin.removeClass("tooltipstered"),b._$origin.removeData("tooltipster-ns").removeData("tooltipster-initialTitle")}else c=a.grep(c,function(a,c){return a!==b.__namespace}),b._$origin.data("tooltipster-ns",c);b._trigger("destroyed"),b._off(),b.off(),b.__Content=null,b.__$emitterPrivate=null,b.__$emitterPublic=null,b.__options.parent=null,b._$origin=null,b._$tooltip=null,a.tooltipster.__instancesLatestArr=a.grep(a.tooltipster.__instancesLatestArr,function(a,c){return b!==a}),clearInterval(b.__garbageCollector)}return b},disable:function(){return this.__destroyed?(this.__destroyError(),this):(this._close(),this.__enabled=!1,this)},elementOrigin:function(){return this.__destroyed?void this.__destroyError():this._$origin[0]},elementTooltip:function(){return this._$tooltip?this._$tooltip[0]:null},enable:function(){return this.__enabled=!0,this},hide:function(a){return this.close(a)},instance:function(){return this},off:function(){return this.__destroyed||this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},open:function(a){return this.__destroyed?this.__destroyError():this._open(null,a),this},option:function(b,c){return void 0===c?this.__options[b]:(this.__destroyed?this.__destroyError():(this.__options[b]=c,this.__optionsFormat(),a.inArray(b,["trigger","triggerClose","triggerOpen"])>=0&&this.__prepareOrigin(),"selfDestruction"===b&&this.__prepareGC()),this)},reposition:function(a,b){var c=this;return c.__destroyed?c.__destroyError():"closed"!=c.__state&&d(c._$origin)&&(b||d(c._$tooltip))&&(b||c._$tooltip.detach(),c.__Geometry=c.__geometry(),c._trigger({type:"reposition",event:a,helper:{geo:c.__Geometry}})),c},show:function(a){return this.open(a)},status:function(){return{destroyed:this.__destroyed,enabled:this.__enabled,open:"closed"!==this.__state,state:this.__state}},triggerHandler:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.fn.tooltipster=function(){var b=Array.prototype.slice.apply(arguments),c="You are using a single HTML element as content for several tooltips. You probably want to set the contentCloning option to TRUE.";if(0===this.length)return this;if("string"==typeof b[0]){var d="#*$~&";return this.each(function(){var e=a(this).data("tooltipster-ns"),f=e?a(this).data(e[0]):null;if(!f)throw new Error("You called Tooltipster's \""+b[0]+'" method on an uninitialized element');if("function"!=typeof f[b[0]])throw new Error('Unknown method "'+b[0]+'"');this.length>1&&"content"==b[0]&&(b[1]instanceof a||"object"==typeof b[1]&&null!=b[1]&&b[1].tagName)&&!f.__options.contentCloning&&f.__options.debug&&console.log(c);var g=f[b[0]](b[1],b[2]);return g!==f||"instance"===b[0]?(d=g,!1):void 0}),"#*$~&"!==d?d:this}a.tooltipster.__instancesLatestArr=[];var e=b[0]&&void 0!==b[0].multiple,g=e&&b[0].multiple||!e&&f.multiple,h=b[0]&&void 0!==b[0].content,i=h&&b[0].content||!h&&f.content,j=b[0]&&void 0!==b[0].contentCloning,k=j&&b[0].contentCloning||!j&&f.contentCloning,l=b[0]&&void 0!==b[0].debug,m=l&&b[0].debug||!l&&f.debug;return this.length>1&&(i instanceof a||"object"==typeof i&&null!=i&&i.tagName)&&!k&&m&&console.log(c),this.each(function(){var c=!1,d=a(this),e=d.data("tooltipster-ns"),f=null;e?g?c=!0:m&&(console.log("Tooltipster: one or more tooltips are already attached to the element below. Ignoring."),console.log(this)):c=!0,c&&(f=new a.Tooltipster(this,b[0]),e||(e=[]),e.push(f.__namespace),d.data("tooltipster-ns",e),d.data(f.__namespace,f),f.__options.functionInit&&f.__options.functionInit.call(f,f,{origin:this}),f._trigger("init")),a.tooltipster.__instancesLatestArr.push(f)}),this},b.prototype={__init:function(b){this.__$tooltip=b,this.__$tooltip.css({left:0,overflow:"hidden",position:"absolute",top:0}).find(".tooltipster-content").css("overflow","auto"),this.$container=a('<div class="tooltipster-ruler"></div>').append(this.__$tooltip).appendTo(h.window.document.body)},__forceRedraw:function(){var a=this.__$tooltip.parent();this.__$tooltip.detach(),this.__$tooltip.appendTo(a)},constrain:function(a,b){return this.constraints={width:a,height:b},this.__$tooltip.css({display:"block",height:"",overflow:"auto",width:a}),this},destroy:function(){this.__$tooltip.detach().find(".tooltipster-content").css({display:"",overflow:""}),this.$container.remove()},free:function(){return this.constraints=null,this.__$tooltip.css({display:"",height:"",overflow:"visible",width:""}),this},measure:function(){this.__forceRedraw();var a=this.__$tooltip[0].getBoundingClientRect(),b={size:{height:a.height||a.bottom-a.top,width:a.width||a.right-a.left}};if(this.constraints){var c=this.__$tooltip.find(".tooltipster-content"),d=this.__$tooltip.outerHeight(),e=c[0].getBoundingClientRect(),f={height:d<=this.constraints.height,width:a.width<=this.constraints.width&&e.width>=c[0].scrollWidth-1};b.fits=f.height&&f.width}return h.IE&&h.IE<=11&&b.size.width!==h.window.document.documentElement.clientWidth&&(b.size.width=Math.ceil(b.size.width)+1),b}};var j=navigator.userAgent.toLowerCase();-1!=j.indexOf("msie")?h.IE=parseInt(j.split("msie")[1]):-1!==j.toLowerCase().indexOf("trident")&&-1!==j.indexOf(" rv:11")?h.IE=11:-1!=j.toLowerCase().indexOf("edge/")&&(h.IE=parseInt(j.toLowerCase().split("edge/")[1]));var k="tooltipster.sideTip";return a.tooltipster._plugin({name:k,instance:{__defaults:function(){return{arrow:!0,distance:6,functionPosition:null,maxWidth:null,minIntersection:16,minWidth:0,position:null,side:"top",viewportAware:!0}},__init:function(a){var b=this;b.__instance=a,b.__namespace="tooltipster-sideTip-"+Math.round(1e6*Math.random()),b.__previousState="closed",b.__options,b.__optionsFormat(),b.__instance._on("state."+b.__namespace,function(a){"closed"==a.state?b.__close():"appearing"==a.state&&"closed"==b.__previousState&&b.__create(),b.__previousState=a.state}),b.__instance._on("options."+b.__namespace,function(){b.__optionsFormat()}),b.__instance._on("reposition."+b.__namespace,function(a){b.__reposition(a.event,a.helper)})},__close:function(){this.__instance.content()instanceof a&&this.__instance.content().detach(),this.__instance._$tooltip.remove(),this.__instance._$tooltip=null},__create:function(){var b=a('<div class="tooltipster-base tooltipster-sidetip"><div class="tooltipster-box"><div class="tooltipster-content"></div></div><div class="tooltipster-arrow"><div class="tooltipster-arrow-uncropped"><div class="tooltipster-arrow-border"></div><div class="tooltipster-arrow-background"></div></div></div></div>');this.__options.arrow||b.find(".tooltipster-box").css("margin",0).end().find(".tooltipster-arrow").hide(),this.__options.minWidth&&b.css("min-width",this.__options.minWidth+"px"),this.__options.maxWidth&&b.css("max-width",this.__options.maxWidth+"px"),
this.__instance._$tooltip=b,this.__instance._trigger("created")},__destroy:function(){this.__instance._off("."+self.__namespace)},__optionsFormat:function(){var b=this;if(b.__options=b.__instance._optionsExtract(k,b.__defaults()),b.__options.position&&(b.__options.side=b.__options.position),"object"!=typeof b.__options.distance&&(b.__options.distance=[b.__options.distance]),b.__options.distance.length<4&&(void 0===b.__options.distance[1]&&(b.__options.distance[1]=b.__options.distance[0]),void 0===b.__options.distance[2]&&(b.__options.distance[2]=b.__options.distance[0]),void 0===b.__options.distance[3]&&(b.__options.distance[3]=b.__options.distance[1])),b.__options.distance={top:b.__options.distance[0],right:b.__options.distance[1],bottom:b.__options.distance[2],left:b.__options.distance[3]},"string"==typeof b.__options.side){var c={top:"bottom",right:"left",bottom:"top",left:"right"};b.__options.side=[b.__options.side,c[b.__options.side]],"left"==b.__options.side[0]||"right"==b.__options.side[0]?b.__options.side.push("top","bottom"):b.__options.side.push("right","left")}6===a.tooltipster._env.IE&&b.__options.arrow!==!0&&(b.__options.arrow=!1)},__reposition:function(b,c){var d,e=this,f=e.__targetFind(c),g=[];e.__instance._$tooltip.detach();var h=e.__instance._$tooltip.clone(),i=a.tooltipster._getRuler(h),j=!1,k=e.__instance.option("animation");switch(k&&h.removeClass("tooltipster-"+k),a.each(["window","document"],function(d,k){var l=null;if(e.__instance._trigger({container:k,helper:c,satisfied:j,takeTest:function(a){l=a},results:g,type:"positionTest"}),1==l||0!=l&&0==j&&("window"!=k||e.__options.viewportAware))for(var d=0;d<e.__options.side.length;d++){var m={horizontal:0,vertical:0},n=e.__options.side[d];"top"==n||"bottom"==n?m.vertical=e.__options.distance[n]:m.horizontal=e.__options.distance[n],e.__sideChange(h,n),a.each(["natural","constrained"],function(a,d){if(l=null,e.__instance._trigger({container:k,event:b,helper:c,mode:d,results:g,satisfied:j,side:n,takeTest:function(a){l=a},type:"positionTest"}),1==l||0!=l&&0==j){var h={container:k,distance:m,fits:null,mode:d,outerSize:null,side:n,size:null,target:f[n],whole:null},o="natural"==d?i.free():i.constrain(c.geo.available[k][n].width-m.horizontal,c.geo.available[k][n].height-m.vertical),p=o.measure();if(h.size=p.size,h.outerSize={height:p.size.height+m.vertical,width:p.size.width+m.horizontal},"natural"==d?c.geo.available[k][n].width>=h.outerSize.width&&c.geo.available[k][n].height>=h.outerSize.height?h.fits=!0:h.fits=!1:h.fits=p.fits,"window"==k&&(h.fits?"top"==n||"bottom"==n?h.whole=c.geo.origin.windowOffset.right>=e.__options.minIntersection&&c.geo.window.size.width-c.geo.origin.windowOffset.left>=e.__options.minIntersection:h.whole=c.geo.origin.windowOffset.bottom>=e.__options.minIntersection&&c.geo.window.size.height-c.geo.origin.windowOffset.top>=e.__options.minIntersection:h.whole=!1),g.push(h),h.whole)j=!0;else if("natural"==h.mode&&(h.fits||h.size.width<=c.geo.available[k][n].width))return!1}})}}),e.__instance._trigger({edit:function(a){g=a},event:b,helper:c,results:g,type:"positionTested"}),g.sort(function(a,b){if(a.whole&&!b.whole)return-1;if(!a.whole&&b.whole)return 1;if(a.whole&&b.whole){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}if(a.fits&&!b.fits)return-1;if(!a.fits&&b.fits)return 1;if(a.fits&&b.fits){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}return"document"==a.container&&"bottom"==a.side&&"natural"==a.mode?-1:1}),d=g[0],d.coord={},d.side){case"left":case"right":d.coord.top=Math.floor(d.target-d.size.height/2);break;case"bottom":case"top":d.coord.left=Math.floor(d.target-d.size.width/2)}switch(d.side){case"left":d.coord.left=c.geo.origin.windowOffset.left-d.outerSize.width;break;case"right":d.coord.left=c.geo.origin.windowOffset.right+d.distance.horizontal;break;case"top":d.coord.top=c.geo.origin.windowOffset.top-d.outerSize.height;break;case"bottom":d.coord.top=c.geo.origin.windowOffset.bottom+d.distance.vertical}"window"==d.container?"top"==d.side||"bottom"==d.side?d.coord.left<0?c.geo.origin.windowOffset.right-this.__options.minIntersection>=0?d.coord.left=0:d.coord.left=c.geo.origin.windowOffset.right-this.__options.minIntersection-1:d.coord.left>c.geo.window.size.width-d.size.width&&(c.geo.origin.windowOffset.left+this.__options.minIntersection<=c.geo.window.size.width?d.coord.left=c.geo.window.size.width-d.size.width:d.coord.left=c.geo.origin.windowOffset.left+this.__options.minIntersection+1-d.size.width):d.coord.top<0?c.geo.origin.windowOffset.bottom-this.__options.minIntersection>=0?d.coord.top=0:d.coord.top=c.geo.origin.windowOffset.bottom-this.__options.minIntersection-1:d.coord.top>c.geo.window.size.height-d.size.height&&(c.geo.origin.windowOffset.top+this.__options.minIntersection<=c.geo.window.size.height?d.coord.top=c.geo.window.size.height-d.size.height:d.coord.top=c.geo.origin.windowOffset.top+this.__options.minIntersection+1-d.size.height):(d.coord.left>c.geo.window.size.width-d.size.width&&(d.coord.left=c.geo.window.size.width-d.size.width),d.coord.left<0&&(d.coord.left=0)),e.__sideChange(h,d.side),c.tooltipClone=h[0],c.tooltipParent=e.__instance.option("parent").parent[0],c.mode=d.mode,c.whole=d.whole,c.origin=e.__instance._$origin[0],c.tooltip=e.__instance._$tooltip[0],delete d.container,delete d.fits,delete d.mode,delete d.outerSize,delete d.whole,d.distance=d.distance.horizontal||d.distance.vertical;var l=a.extend(!0,{},d);if(e.__instance._trigger({edit:function(a){d=a},event:b,helper:c,position:l,type:"position"}),e.__options.functionPosition){var m=e.__options.functionPosition.call(e,e.__instance,c,l);m&&(d=m)}i.destroy();var n,o;"top"==d.side||"bottom"==d.side?(n={prop:"left",val:d.target-d.coord.left},o=d.size.width-this.__options.minIntersection):(n={prop:"top",val:d.target-d.coord.top},o=d.size.height-this.__options.minIntersection),n.val<this.__options.minIntersection?n.val=this.__options.minIntersection:n.val>o&&(n.val=o);var p;p=c.geo.origin.fixedLineage?c.geo.origin.windowOffset:{left:c.geo.origin.windowOffset.left+c.geo.window.scroll.left,top:c.geo.origin.windowOffset.top+c.geo.window.scroll.top},d.coord={left:p.left+(d.coord.left-c.geo.origin.windowOffset.left),top:p.top+(d.coord.top-c.geo.origin.windowOffset.top)},e.__sideChange(e.__instance._$tooltip,d.side),c.geo.origin.fixedLineage?e.__instance._$tooltip.css("position","fixed"):e.__instance._$tooltip.css("position",""),e.__instance._$tooltip.css({left:d.coord.left,top:d.coord.top,height:d.size.height,width:d.size.width}).find(".tooltipster-arrow").css({left:"",top:""}).css(n.prop,n.val),e.__instance._$tooltip.appendTo(e.__instance.option("parent")),e.__instance._trigger({type:"repositioned",event:b,position:d})},__sideChange:function(a,b){a.removeClass("tooltipster-bottom").removeClass("tooltipster-left").removeClass("tooltipster-right").removeClass("tooltipster-top").addClass("tooltipster-"+b)},__targetFind:function(a){var b={},c=this.__instance._$origin[0].getClientRects();if(c.length>1){var d=this.__instance._$origin.css("opacity");1==d&&(this.__instance._$origin.css("opacity",.99),c=this.__instance._$origin[0].getClientRects(),this.__instance._$origin.css("opacity",1))}if(c.length<2)b.top=Math.floor(a.geo.origin.windowOffset.left+a.geo.origin.size.width/2),b.bottom=b.top,b.left=Math.floor(a.geo.origin.windowOffset.top+a.geo.origin.size.height/2),b.right=b.left;else{var e=c[0];b.top=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil(c.length/2)-1]:c[0],b.right=Math.floor(e.top+(e.bottom-e.top)/2),e=c[c.length-1],b.bottom=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil((c.length+1)/2)-1]:c[c.length-1],b.left=Math.floor(e.top+(e.bottom-e.top)/2)}return b}}}),a});
PK!jLZk		js/wf-licensing.jsnu�[���/**
 * WebFactory Licensing Manager
 * (c) WebFactory Ltd
 * www.webfactoryltd.com
 */


function wf_licensing_verify_licence_ajax(prefix, license_key, button) {
  data = window['wf_licensing_' + prefix];
  if (!data) {
    alert('Licensing data is missing. Please reload the page and try again.');
    return;
  }

  jQuery(button).addClass('loading');

  jQuery
    .post(
      ajaxurl,
      {
        action: 'wf_licensing_' + prefix + '_validate',
        license_key: license_key,
        _ajax_nonce: data.nonce,
        _rand: Math.floor(Math.random() * 9999) + 1
      },
      function (response) {
        if (data.debug) {
          console.log('Validate license, first try: ', response);
        }
        if (response.success) {
          location.reload();
        } else {
          alert('Unable to contact licensing server. Please try again in a few moments or contact support.');
        }
      }
    )
    .fail(function () {
      alert('Undocumented error. Please reload the page and try again.');
    })
    .always(function () {
      jQuery(button).removeClass('loading');
      jQuery(window).trigger('wf_licensing:ajax_always');
    });
} // wf_licensing_verify_licence_ajax


function wf_licensing_deactivate_licence_ajax(prefix, license_key, button) {
  data = window['wf_licensing_' + prefix];
  if (!data) {
    alert('Licensing data is missing. Please reload the page and try again.');
    return;
  }

  jQuery(button).addClass('loading');

  jQuery
    .post(
      ajaxurl,
      {
        action: 'wf_licensing_' + prefix + '_deactivate',
        license_key: license_key,
        _ajax_nonce: data.nonce,
        _rand: Math.floor(Math.random() * 9999) + 1
      },
      function (response) {
        if (data.debug) {
          console.log('Deactivate license, first try: ', response);
        }
        if (response.success) {
          location.reload();
        } else {
          alert('Unable to contact licensing server. Please try again in a few moments or contact support.');
        }
      }
    )
    .fail(function () {
      alert('Undocumented error. Please reload the page and try again.');
    })
    .always(function () {
      jQuery(button).removeClass('loading');
      jQuery(window).trigger('wf_licensing:ajax_always');
    });
} // wf_licensing_deactivate_licence_ajax
PK!�	index.phpnu�[���PK!�/:�)�)Vimg/wp-reset-logo.pngnu�[���PK!�
�*img/index.phpnu�[���PK!�E�]�]�*img/wp-force-ssl-logo.pngnu�[���PK!F[��tt��img/wp-reset-icon.pngnu�[���PK!�q��I-I-e�wp-reset-cli.phpnu�[���PK!�`�,a,a��css/sweetalert2.min.cssnu�[���PK!t���e�ea$css/wp-reset.cssnu�[���PK!tx!7__,�css/tooltipster.bundle.min.cssnu�[���PK!���&٣css/font/fontello.eotnu�[���PK!H��y�	�	�css/font/fontello.woff2nu�[���PK!|�eߵ��css/font/fontello.svgnu�[���PK!M��@@�css/font/fontello.woffnu�[���PK!ź�XX��css/font/fontello.ttfnu�[���PK!Ρ�
6�css/index.phpnu�[���PK!�F(�v5v5
��readme.txtnu�[���PK!j�c�R�R@"wp-reset.phpnu�[���PK!.�S;<;<0uwp-reset-licensing.phpnu�[���PK!8ĸ��
��libs/diff.phpnu�[���PK!Ρ���libs/index.phpnu�[���PK!V<�;??2�libs/diff/Renderer/Abstract.phpnu�[���PK!a��}��"��libs/diff/Renderer/Html/Inline.phpnu�[���PK!�<�!��libs/diff/Renderer/Html/Array.phpnu�[���PK!�M��&	libs/diff/Renderer/Html/SideBySide.phpnu�[���PK!�"����#n!libs/diff/Renderer/Text/Context.phpnu�[���PK!�ߤ�EE#�1libs/diff/Renderer/Text/Unified.phpnu�[���PK!��%�HMHM>libs/diff/SequenceMatcher.phpnu�[���PK!n�]�4747��libs/dumper.phpnu�[���PK!]M�s;s;!�license.txtnu�[���PK!��Z���wf-flyout/config.phpnu�[���PK!��cT''�wf-flyout/wf-flyout.jsnu�[���PK!���QQD	wf-flyout/wf-flyout.cssnu�[���PK!F[��tt�wf-flyout/icons/wp-reset.pngnu�[���PK!&�3A3A�%wf-flyout/icons/ucp.pngnu�[���PK!/��44gwf-flyout/icons/wp-ssl.pngnu�[���PK!���)RRh�wf-flyout/icons/301-logo.pngnu�[���PK!���6���wf-flyout/wf-flyout.phpnu�[���PK!`���D�D#�wp-reset-utility.phpnu�[���PK!)��DPP�js/wp-reset-pointers.jsnu�[���PK!ٓ[YZ�Z��js/wp-reset.jsnu�[���PK!Ρ�!�js/index.phpnu�[���PK!���J�Jz�js/wp-reset-libs.min.jsnu�[���PK!jLZk		�	js/wf-licensing.jsnu�[���PK++b�	

Youez - 2016 - github.com/yon3zu
LinuXploit