diff --git a/assets/css/admin-bar.css b/assets/css/admin-bar.css index 47713a1..ab5173b 100644 --- a/assets/css/admin-bar.css +++ b/assets/css/admin-bar.css @@ -19,4 +19,11 @@ line-height: 1 !important; font-size: 11px !important; } -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFkbWluLWJhci5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtDO0FBQUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtBQUFBO0VBQ0M7RUFDQSIsImZpbGUiOiJhc3NldHMvY3NzL2FkbWluLWJhci5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXUCBNYWlsIFNNVFAgYWRtaW4gYmFyIG1lbnUgc3R5bGVzLlxuXG5AaW1wb3J0IFwidmFyaWFibGVzXCI7XG5cbiN3cGFkbWluYmFyIHtcblx0LndwLW1haWwtc210cC1hZG1pbi1iYXItbWVudS1ub3RpZmljYXRpb24tY291bnRlcixcblx0LndwLW1haWwtc210cC1hZG1pbi1iYXItbWVudS1lcnJvciB7XG5cdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG5cdFx0dmVydGljYWwtYWxpZ246IHRvcCAhaW1wb3J0YW50O1xuXHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcblx0XHRtYXJnaW46IDdweCAwIDAgMnB4ICFpbXBvcnRhbnQ7XG5cdFx0cGFkZGluZzogMCA1cHggIWltcG9ydGFudDtcblx0XHRtaW4td2lkdGg6IDE4cHggIWltcG9ydGFudDtcblx0XHRoZWlnaHQ6IDE4cHggIWltcG9ydGFudDtcblx0XHRib3JkZXItcmFkaXVzOiA5cHggIWltcG9ydGFudDtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkbmVnYXRpdmUgIWltcG9ydGFudDtcblx0XHRjb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuXHRcdGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50O1xuXHRcdGxpbmUtaGVpZ2h0OiAxLjYgIWltcG9ydGFudDtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcblxuXHRcdHNwYW4ge1xuXHRcdFx0bGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcblx0XHRcdGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50O1xuXHRcdH1cblx0fVxufVxuIl19 */ + +body.wp-admin #adminmenu #toplevel_page_wp-mail-smtp .wp-menu-image.svg { + background-position-x: 11px; +} +body.wp-admin.folded #adminmenu #toplevel_page_wp-mail-smtp .wp-menu-image.svg { + background-position-x: 9px; +} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFkbWluLWJhci5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtDO0FBQUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtBQUFBO0VBQ0M7RUFDQTs7O0FBTUY7RUFDQzs7QUFJQTtFQUNDIiwiZmlsZSI6ImFzc2V0cy9jc3MvYWRtaW4tYmFyLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFdQIE1haWwgU01UUCBhZG1pbiBiYXIgbWVudSBzdHlsZXMuXG5cbkBpbXBvcnQgXCJ2YXJpYWJsZXNcIjtcblxuI3dwYWRtaW5iYXIge1xuXHQud3AtbWFpbC1zbXRwLWFkbWluLWJhci1tZW51LW5vdGlmaWNhdGlvbi1jb3VudGVyLFxuXHQud3AtbWFpbC1zbXRwLWFkbWluLWJhci1tZW51LWVycm9yIHtcblx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcblx0XHR2ZXJ0aWNhbC1hbGlnbjogdG9wICFpbXBvcnRhbnQ7XG5cdFx0Ym94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuXHRcdG1hcmdpbjogN3B4IDAgMCAycHggIWltcG9ydGFudDtcblx0XHRwYWRkaW5nOiAwIDVweCAhaW1wb3J0YW50O1xuXHRcdG1pbi13aWR0aDogMThweCAhaW1wb3J0YW50O1xuXHRcdGhlaWdodDogMThweCAhaW1wb3J0YW50O1xuXHRcdGJvcmRlci1yYWRpdXM6IDlweCAhaW1wb3J0YW50O1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICRuZWdhdGl2ZSAhaW1wb3J0YW50O1xuXHRcdGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7XG5cdFx0Zm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG5cdFx0bGluZS1oZWlnaHQ6IDEuNiAhaW1wb3J0YW50O1xuXHRcdHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuXG5cdFx0c3BhbiB7XG5cdFx0XHRsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuXHRcdFx0Zm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG5cdFx0fVxuXHR9XG59XG5cbmJvZHkud3AtYWRtaW4ge1xuXHQjYWRtaW5tZW51ICN0b3BsZXZlbF9wYWdlX3dwLW1haWwtc210cCAud3AtbWVudS1pbWFnZS5zdmcge1xuXHRcdGJhY2tncm91bmQtcG9zaXRpb24teDogMTFweDtcblx0fVxuXG5cdCYuZm9sZGVkIHtcblx0XHQjYWRtaW5tZW51ICN0b3BsZXZlbF9wYWdlX3dwLW1haWwtc210cCAud3AtbWVudS1pbWFnZS5zdmcge1xuXHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbi14OiA5cHg7XG5cdFx0fVxuXHR9XG59XG5cbiJdfQ== */ diff --git a/assets/css/admin-bar.min.css b/assets/css/admin-bar.min.css index cff4daa..ae0fd23 100644 --- a/assets/css/admin-bar.min.css +++ b/assets/css/admin-bar.min.css @@ -1 +1 @@ -#wpadminbar .wp-mail-smtp-admin-bar-menu-notification-counter,#wpadminbar .wp-mail-smtp-admin-bar-menu-error{display:inline-block !important;vertical-align:top !important;box-sizing:border-box !important;margin:7px 0 0 2px !important;padding:0 5px !important;min-width:18px !important;height:18px !important;border-radius:9px !important;background-color:#d63638 !important;color:#fff !important;font-size:11px !important;line-height:1.6 !important;text-align:center !important}#wpadminbar .wp-mail-smtp-admin-bar-menu-notification-counter span,#wpadminbar .wp-mail-smtp-admin-bar-menu-error span{line-height:1 !important;font-size:11px !important} \ No newline at end of file +#wpadminbar .wp-mail-smtp-admin-bar-menu-notification-counter,#wpadminbar .wp-mail-smtp-admin-bar-menu-error{display:inline-block !important;vertical-align:top !important;box-sizing:border-box !important;margin:7px 0 0 2px !important;padding:0 5px !important;min-width:18px !important;height:18px !important;border-radius:9px !important;background-color:#d63638 !important;color:#fff !important;font-size:11px !important;line-height:1.6 !important;text-align:center !important}#wpadminbar .wp-mail-smtp-admin-bar-menu-notification-counter span,#wpadminbar .wp-mail-smtp-admin-bar-menu-error span{line-height:1 !important;font-size:11px !important}body.wp-admin #adminmenu #toplevel_page_wp-mail-smtp .wp-menu-image.svg{background-position-x:11px}body.wp-admin.folded #adminmenu #toplevel_page_wp-mail-smtp .wp-menu-image.svg{background-position-x:9px} \ No newline at end of file diff --git a/assets/css/admin-bar.scss b/assets/css/admin-bar.scss index 72dff66..55b93ed 100644 --- a/assets/css/admin-bar.scss +++ b/assets/css/admin-bar.scss @@ -25,3 +25,16 @@ } } } + +body.wp-admin { + #adminmenu #toplevel_page_wp-mail-smtp .wp-menu-image.svg { + background-position-x: 11px; + } + + &.folded { + #adminmenu #toplevel_page_wp-mail-smtp .wp-menu-image.svg { + background-position-x: 9px; + } + } +} + diff --git a/assets/css/smtp-admin.css b/assets/css/smtp-admin.css index 2fbc7be..3324a38 100644 --- a/assets/css/smtp-admin.css +++ b/assets/css/smtp-admin.css @@ -1729,7 +1729,6 @@ body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrad background-color: #fff; vertical-align: middle; max-width: 210px; - line-height: normal; } @media (max-width: 782px) { #wp-mail-smtp .wp-mail-smtp-filter-date__control { @@ -2197,4 +2196,4 @@ a.wp-mail-smtp-btn.wp-mail-smtp-btn-md { .wp-mail-smtp-dashicons-pdf-gray { background-image: url("../images/icons/dashicons/dashicons-pdf-grey.svg"); } -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9nZW5lcmFsLnNjc3MiLCJfaW5jbHVkZS1tZWRpYS5zY3NzIiwiX2NvbmZpcm0uc2NzcyIsIl92YXJpYWJsZXMuc2NzcyIsIl9lZHVjYXRpb24uc2NzcyIsIl9sb2FkZXIuc2NzcyIsIl9mbHlvdXQtbWVudS5zY3NzIiwiX3Rvb2x0aXAuc2NzcyIsIl9jb25kaXRpb25hbC1sb2dpYy5zY3NzIiwic210cC1hZG1pbi5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQTtFQUNDO0VBQ0E7O0FDNGlCQTtFRDlpQkQ7SUFLRTs7OztBQ3lpQkQ7RURyaUJEO0lBRUU7Ozs7QUFLRjtFQUNDO0lBQVU7O0VBQ1Y7SUFBTTs7RUFDTjtJQUFNOzs7QUFHUDtFQUNDO0lBQVU7O0VBQ1Y7SUFBTTs7RUFDTjtJQUFNOzs7QUVyQkw7QUFBQTtBQUFBO0VBR0M7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBOztBQUVBO0VBQ0M7O0FBSUY7RUFDQztFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0FBQUE7RUFFQzs7QUFJRjtFQUNDO0VBQ0EsT0NyRFU7RURzRFY7RUFDQTs7QUFJRjtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBOztBQUlGO0VBQ0M7RUFDQSxPQ3ZFVztFRHdFWDs7QUFFQTtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQzs7QUFJRjtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7O0FBS0g7RUFDQzs7QUFFQTtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0Esa0JDdElHOztBRHlJSjtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBRUM7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7O0FBS0g7RUFDQyxjQzdKVTs7QUQrSlY7RUFDQyxrQkNoS1M7RURpS1QsY0NqS1M7O0FEcUtYO0VBQ0MsY0N2S1c7O0FEeUtYO0VBQ0Msa0JDMUtVO0VEMktWLGNDM0tVOztBRCtLWjtFQUNDLGNDOUtROztBRGdMUjtFQUNDLGtCQ2pMTztFRGtMUCxjQ2xMTzs7QURzTFQ7RUFDQyxjQ3RMUzs7QUR3TFQ7RUFDQyxrQkN6TFE7RUQwTFIsY0MxTFE7O0FEOExWO0VBQ0M7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUlGO0VBQ0M7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EscUJDck9JO0VEc09KO0VBQ0E7O0FBS0g7RUFDQztFQUNBOztBQUVBO0VBQ0M7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7O0FBRUE7RUFDQzs7QUFLSDtFQUNDOztBQUdEO0VBQ0Msa0JDblFLO0VEb1FMLGNDcFFLOztBRHVRTjtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFJRjtFQUNDO0VBQ0EsT0MvUk07O0FEa1NQO0VBQ0M7RUFDQTtFQUNBOzs7QUU5U0w7RUFDQztJQUNDOzs7QUFJRjtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQSxPRHJCZTtFQ3NCZjtFQUNBOztBQUdEO0VBQ0MsT0RyQk87O0FDd0JSO0VBQ0MsT0R4Qlk7O0FDMkJiO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0M7RUFDQTtFQUNBOzs7QUFHRDtBQUVDO0FBd0xBO0FBd0NBO0FBYUE7O0FBMU9DO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7O0FBSUY7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPRHBIWTs7QUNzSFo7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFJRjtFQUNDO0VBQ0E7RUFDQSxPRG5JYztFQ29JZDtFQUNBOztBQUdEO0VBQ0M7RUFDQTs7QUhtYUY7RUdyYUM7SUFLRTs7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTs7QUh5Wkg7RUc3WkU7SUFPRTtJQUNBOzs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBR0Q7RUFDQzs7QUFJRjtFQUNDO0VBQ0E7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBLE9EdE1ZOztBQzBNZDtFQUNDOztBQUdEO0VBQ0M7O0FBTUQ7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBLE9EM05XOztBQzhOWjtFQUNDO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLE9ENU9ZOztBQzhPWjtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBOztBQVVKO0VBQ0M7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBLE9EM1FXO0VDNFFYO0VBQ0E7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQzs7QUFRRjtFQUNDO0VBQ0E7O0FBR0Q7RUFDQzs7QUFNRDtFQUNDO0VBQ0E7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTs7QUFHRDtFQUNDOztBQUVBO0VBQ0M7O0FBR0Q7RUFDQzs7QUFJRjtFQUNDOzs7QUFLSDtBQUVDOztBQUdDO0VBQ0M7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUNsV0o7RUFDQzs7O0FBR0Q7RUFDQztFQUNBOzs7QUFHRDtFQUNDO0VBQ0E7OztBQUlEO0VBQ0M7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNDO0lBQ0M7O0VBRUQ7SUFDQzs7O0FDekNGO0VBTUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBTGdpQkE7RUszaUJEO0lBY0U7OztBQUdEO0VBQ0M7O0FBRUE7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBOztBQUlGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxZSHRFVztFR3VFWDs7QUFFQTtFQUNDOztBQUlBO0VBQ0M7O0FBREQ7RUFDQzs7QUFERDtFQUNDOztBQUREO0VBQ0M7O0FBREQ7RUFDQzs7QUFJRjtFQUNDOztBQUVBO0VBQ0M7O0FBT0Y7RUFDQztFQUNBO0VBQ0E7O0FBS0E7RUFDQzs7QUFHRDtFQUNDOztBQUtEO0VBQ0M7O0FBREQ7RUFDQzs7QUFERDtFQUNDOztBQUREO0VBQ0M7O0FBREQ7RUFDQzs7QUFLSDtFQUNDO0VBQ0E7OztBQ2pKRjtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPSkpnQjtFSUtoQjs7QUFFQTtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFJRjtFQUNDOzs7QUNqQ0E7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7O0FQNGhCRjtFT3poQkM7SUFHRTtJQUNBOzs7QUFHRDtBQUFBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDQzs7QVB3Z0JGO0VPemdCQztJQUlFOzs7QUFJRjtFQUNDOztBUGdnQkY7RU9qZ0JDO0lBSUU7OztBQUlGO0VBQ0M7O0FQd2ZGO0VPemZDO0lBSUU7OztBQUlGO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDLE9MckVPOztBS3lFVDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPTHpGZ0I7OztBTVNuQjtBQUFBO0VBRUM7OztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7O0FSOGdCRDtFUWpoQkE7SUFNRTs7OztBQUtIO0VBQ0MsT056Q2M7O0FNMkNkO0VBQ0MsT05uQ0s7O0FNcUNMO0VBRUMsT050Q1U7OztBTTJDYjtFQUNDOztBQUVBO0VBQ0M7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQzs7QUFHRDtFQUNDOztBQUlGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBUm1kRjtFUXpkQztJQVNFOzs7QUFJRjtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDQzs7QUFFQTtBQUFBO0FBQUE7RUFHQztFQUNBO0VBQ0E7O0FBSUE7RUFDQztFQUNBOztBQUVEO0VBQ0M7RUFDQTtFQUNBOztBQUtGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQzs7QVJvYUg7RVEzYUM7SUFXRTs7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUlEO0VBQ0M7O0FBR0M7QUFBQTtFQUVDOztBQUlGO0VBQ0M7RUFDQTs7QUFHRDtFQUNDOztBQU9EO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDOztBQVVEO0VBQ0M7O0FBT0Q7RUFDQzs7QUFTQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTs7QUFNSDtFQUNDOztBQUdEO0VBQ0M7O0FBUUM7RUFDQztFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQyxrQk41UEk7O0FNOFBKO0VBQ0M7RUFDQTtFQUNBOztBQUtEO0VBRUM7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUlGO0VBQ0M7O0FBR0Q7RUFDQzs7QUFHRDtFQUVDOztBQUtBO0VBQ0M7O0FBTUQ7RUFDQztFQUNBOztBQUtIO0FBQUE7RUFFQztFQUNBO0VBQ0EsT05yVVc7RU1zVVg7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQU9KO0VBQ0M7O0FBSUM7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0EsZU5sV1M7RU1tV1Q7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlGO0VBQ0M7O0FBSUE7RUFDQyxjTmhhQzs7QU1rYUQ7RUFDQzs7QUFNRjtFQUNDOztBQUVBO0VBQ0M7O0FBUU47RUFDQztFQUNBOztBQUVBO0VBQ0M7O0FBR0Q7RUFDQzs7QUFFQTtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7O0FBRUE7RUFDQztFQUNBOztBQUtIO0VBQ0M7O0FBRUE7RUFDQzs7QUFNRDtBQUFBO0VBRUM7O0FBS0Q7RUFDQzs7QUFJRjtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQyxPTjFlSzs7QU1pZlA7RUFDQzs7QUFFQTtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFNSDtFQUNDLE9ON2dCVztFTThnQlg7RUFDQTtFQUNBOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQyxPTnhoQlc7RU15aEJYO0VBQ0E7RUFDQTs7QUFHRDtFQUNDLE9OL2hCVztFTWdpQlg7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBOztBQUVBO0VBQ0M7O0FBR0Q7RUFDQztFQUNBO0VBQ0EsT05oakJZOztBTWtqQlo7RUFDQzs7QUFHRjtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDLGNOdmpCSztFTXdqQkw7RUFDQTs7QUFFRDtFQUNDO0VBQ0E7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7O0FBTUo7RUFDQzs7QUFHQztFQUNDO0VBQ0E7O0FBT0Q7RUFDQztFQUNBOztBQUlBO0VBQ0M7O0FBRUQ7RUFDQzs7QUFHQTtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBRUMsT05obkJFOztBTWtuQkY7RUFDQzs7QUFXUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0VBS0M7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPTmhwQlM7RU1pcEJUO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBUjVHSDtFUTRGRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0lBbUJFOzs7QVIvR0o7RVE0RkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtJQXVCRTtJQUNBO0lBQ0E7O0VBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtJQUNDOzs7QUFJRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0VBQ0M7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQUNDOztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7RUFDQztFQUNBO0VBQ0E7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQUNDOztBQU1EO0FBQUE7RUFDQztFQUNBO0VBQ0E7O0FBTUQ7RUFDQztFQUNBOztBQUdEO0VBQ0MsT05uc0JNOztBTXlzQlQ7RUFDQztFQUNBO0VBQ0E7RUFDQTs7QVIxS0Y7RVFzS0M7SUFPRTtJQUNBO0lBQ0E7OztBQUdEO0VBQ0M7RUFDQTs7QUFLRjtFQUNDO0VBQ0E7RUFDQTs7QVI1TEY7RVF5TEM7SUFNRTs7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7O0FBRUE7RUFDQzs7QUFLSDtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBOztBQU9BO0VBQ0M7O0FBR0Q7RUFDQztFQUNBLGVObnZCVztFTW92Qlg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQU1IO0VBRUM7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0MsbUJOL3hCTzs7QU1reUJSO0VBQ0M7O0FBR0Q7RUFDQyxtQk50eUJPOztBTXl5QlI7RUFDQzs7QUFJRjtBQUFBO0VBRUM7RUFDQTs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQyxhTjl5QmU7O0FGbWhCakI7RVEwUkM7SUFJRTtJQUNBO0lBQ0E7OztBQUlGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7RUFDQSxPTm4xQkU7RU1vMUJGO0VBQ0E7RUFDQTs7QUFJRjtFQUNDLE9OejJCVztFTTAyQlg7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQSxPTmgzQmE7RU1pM0JiOztBQUVBO0VBQ0M7O0FBSUY7RUFDQztFQUNBO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTs7QVJwVko7RVFnVkc7SUFPRTtJQUNBOzs7QUFHRDtFQUNDO0VBQ0E7RUFDQSxPTjM0Qlc7RU00NEJYO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTs7QUFHRDtFQUNDOztBQU1KO0VBQ0MsT054NUJLOztBTTA1Qkw7RUFDQyxPTjE1QlM7O0FNODVCWDtFQUNDOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDQyxPTnY2Qk87RU13NkJQOztBQU9GO0VBQ0M7O0FBR0Q7RUFBK0I7O0FBQy9CO0VBQStCOztBQUMvQjtFQUErQjs7QUFDL0I7RUFBK0I7O0FBQy9CO0VBQStCOztBQUMvQjtFQUErQjs7QUFFL0I7RUFBaUM7O0FBRWpDO0VBQ0M7RUFDQTtFQUNBOztBQUlGO0VBQ0M7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7O0FBSUY7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFFQyxPTnArQk87O0FGa2lCVjtFUTBjRTtJQUNDOztFQUVEO0lBQ0M7O0VBRUQ7SUFDQzs7RUFFRDtJQUNDOzs7QVJwZEg7RVEwZEE7SUFHRTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBUjllRjtFUXVlQztJQVVFO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7O0FBSUY7RUFDQztFQUNBOztBQUlGO0VBQ0M7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQyxrQk5obENPOztBTWtsQ1A7RUFDQztFQUNBO0VBQ0E7O0FBTUQ7RUFDQzs7QUFNRDtFQUNDO0VBQ0E7O0FBS0Q7RUFFQzs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7OztBQVFMO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBOztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7O0FBR0Q7RUFDQyxrQk5wckNPO0VNcXJDUCxjTnJyQ087RU1zckNQOztBQUVBO0VBR0Msa0JOMXJDVztFTTJyQ1gsY04zckNXO0VNNHJDWDs7QUFHRDtFQUNDOztBQUlGO0VBQ0Msa0JOanNDUztFTWtzQ1QsY05sc0NTO0VNbXNDVDs7QUFFQTtFQUdDO0VBQ0E7RUFDQTs7QUFHRDtFQUNDOztBQUlGO0VBQ0M7RUFDQTtFQUNBOztBQUVBO0VBR0M7RUFDQTtFQUNBOztBQUlGO0VBQ0M7RUFDQTtFQUNBOztBQUVBO0VBR0M7RUFDQTs7QUFJRjtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUdDO0VBQ0E7RUFDQTs7QUFHRDtFQUNDOzs7QUFLSDtFQUNDOzs7QUFLQTtFQUNDLE9ObnhDYTtFTW94Q2I7RUFDQTtFQUNBO0VBQ0E7O0FBS0E7RUFDQztFQUNBO0VBQ0E7O0FBRUE7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTs7QUFJQTtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsT05qekNVO0VNa3pDVjs7QUFHRDtFQUNDLE9OcnpDWTtFTXN6Q1o7RUFDQTtFQUNBOztBQUVBO0VBQ0M7OztBQVdMO0VBQ0M7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPTnoyQ1k7O0FNNDJDYjtFQUNDO0VBQ0E7RUFDQTtFQUNBLE9OLzJDYzs7QU1xM0NmO0VBQ0M7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7O0FBSUY7RUFDQzs7QUFFQTtFQUNDO0VBQ0EsT056NENZO0VNMDRDWjtFQUNBO0VBQ0E7O0FBR0Q7RUFDQztFQUNBLE9OaDVDYztFTWk1Q2Q7RUFDQTs7QUFHRDtFQUNDOztBQUdEO0FBQUE7RUFFQztFQUNBLE9ONTVDYztFTTY1Q2Q7RUFDQTs7QUFFQTtBQUFBO0VBQ0M7O0FBRUE7QUFBQTtFQUNDOztBQUdEO0FBQUE7RUFDQzs7QUFLSDtFQUNDLE9OeDZDTTtFTXk2Q047RUFDQTtFQUNBO0VBQ0E7O0FBR0Q7RUFDQyxPTjU2Q1E7RU02NkNSOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQztFQUNBOztBQUdEO0VBQ0M7O0FBRUE7RUFDQzs7QUFNRDtFQUNDOztBQUdEO0VBQ0M7O0FBSUY7RUFDQztFQUNBO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7OztBQVNGO0VBQ0M7O0FBR0Q7RUFDQyxPTm4vQ1k7RU1vL0NaO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7O0FBR0Q7QUFBQTtFQUVDOztBQUdEO0VBQ0M7RUFDQTs7O0FBS0g7QUFFQzs7QUFDQTtFQUNDO0VBQ0E7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBOztBQU1EO0VBQ0M7O0FBRUE7RUFFQzs7O0FBT0o7RUFDQzs7QUFFQTtFQUNDO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUVBO0VBQ0MsT04xakRjO0VNMmpEZDtFQUNBOztBQUlGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7O0FBR0Q7RUFDQyxPTnpsRGM7O0FNNGxEZjtFQUNDOztBQUtEO0VBQ0M7OztBQUtIO0VBQ0M7RUFDQTtFQUNBOzs7QUFHRDtFQUNDOzs7QUFHRDtFQUNDIiwiZmlsZSI6ImFzc2V0cy9jc3Mvc210cC1hZG1pbi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3JlIGFkbWluIHN0eWxlIG92ZXJyaWRlcy5cbiN3cGNvbnRlbnQge1xuXHRwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdEBpbmNsdWRlIG1lZGlhKFwiPD1waG9uZVwiKSB7XG5cdFx0cGFkZGluZy10b3A6IDQ2cHg7XG5cdH1cbn1cblxuI3dwYm9keSB7XG5cdEBpbmNsdWRlIG1lZGlhKFwiPD1waG9uZVwiKSB7XG5cdFx0cGFkZGluZy10b3A6IDA7XG5cdH1cbn1cblxuLy8gRmFkZSBpbi1vdXQgd2l0aCBhIFwicGVhayBzdG9wXCIgYW5pbWF0aW9uLlxuQC13ZWJraXQta2V5ZnJhbWVzIHdwLW1haWwtc210cC1mYWRlLWluLXN0b3Atb3V0IHtcblx0MCUsMTAwJSB7IG9wYWNpdHk6IDAgfVxuXHQzNSUgeyBvcGFjaXR5OiAxIH1cblx0NjUlIHsgb3BhY2l0eTogMSB9XG59XG5cbkBrZXlmcmFtZXMgd3AtbWFpbC1zbXRwLWZhZGUtaW4tc3RvcC1vdXQge1xuXHQwJSwxMDAlIHsgb3BhY2l0eTogMCB9XG5cdDM1JSB7IG9wYWNpdHk6IDEgfVxuXHQ2NSUgeyBvcGFjaXR5OiAxIH1cbn1cbiIsIkBjaGFyc2V0IFwiVVRGLThcIjtcblxuLy8gICAgIF8gICAgICAgICAgICBfICAgICAgICAgICBfICAgICAgICAgICAgICAgICAgICAgICAgICAgXyBfXG4vLyAgICAoXykgICAgICAgICAgfCB8ICAgICAgICAgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF8pXG4vLyAgICAgXyBfIF9fICAgX19ffCB8XyAgIF8gIF9ffCB8IF9fXyAgIF8gX18gX19fICAgX19fICBfX3wgfF8gIF9fIF9cbi8vICAgIHwgfCAnXyBcXCAvIF9ffCB8IHwgfCB8LyBfYCB8LyBfIFxcIHwgJ18gYCBfIFxcIC8gXyBcXC8gX2AgfCB8LyBfYCB8XG4vLyAgICB8IHwgfCB8IHwgKF9ffCB8IHxffCB8IChffCB8ICBfXy8gfCB8IHwgfCB8IHwgIF9fLyAoX3wgfCB8IChffCB8XG4vLyAgICB8X3xffCB8X3xcXF9fX3xffFxcX18sX3xcXF9fLF98XFxfX198IHxffCB8X3wgfF98XFxfX198XFxfXyxffF98XFxfXyxffFxuLy9cbi8vICAgICAgU2ltcGxlLCBlbGVnYW50IGFuZCBtYWludGFpbmFibGUgbWVkaWEgcXVlcmllcyBpbiBTYXNzXG4vLyAgICAgICAgICAgICAgICAgICAgICAgIHYxLjQuOVxuLy9cbi8vICAgICAgICAgICAgICAgIGh0dHA6Ly9pbmNsdWRlLW1lZGlhLmNvbVxuLy9cbi8vICAgICAgICAgQXV0aG9yczogRWR1YXJkbyBCb3VjYXMgKEBlZHVhcmRvYm91Y2FzKVxuLy8gICAgICAgICAgICAgICAgICBIdWdvIEdpcmF1ZGVsIChAaHVnb2dpcmF1ZGVsKVxuLy9cbi8vICAgICAgVGhpcyBwcm9qZWN0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIGxpY2Vuc2VcblxuXG4vLy8vXG4vLy8gaW5jbHVkZS1tZWRpYSBsaWJyYXJ5IHB1YmxpYyBjb25maWd1cmF0aW9uXG4vLy8gQGF1dGhvciBFZHVhcmRvIEJvdWNhc1xuLy8vIEBhY2Nlc3MgcHVibGljXG4vLy8vXG5cblxuLy8vXG4vLy8gQ3JlYXRlcyBhIGxpc3Qgb2YgZ2xvYmFsIGJyZWFrcG9pbnRzXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gQ3JlYXRlcyBhIHNpbmdsZSBicmVha3BvaW50IHdpdGggdGhlIGxhYmVsIGBwaG9uZWBcbi8vLyAgJGJyZWFrcG9pbnRzOiAoJ3Bob25lJzogMzIwcHgpO1xuLy8vXG4kYnJlYWtwb2ludHM6IChcbiAgJ3Bob25lJzogMzIwcHgsXG4gICd0YWJsZXQnOiA3NjhweCxcbiAgJ2Rlc2t0b3AnOiAxMDI0cHhcbikgIWRlZmF1bHQ7XG5cblxuLy8vXG4vLy8gQ3JlYXRlcyBhIGxpc3Qgb2Ygc3RhdGljIGV4cHJlc3Npb25zIG9yIG1lZGlhIHR5cGVzXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gQ3JlYXRlcyBhIHNpbmdsZSBtZWRpYSB0eXBlIChzY3JlZW4pXG4vLy8gICRtZWRpYS1leHByZXNzaW9uczogKCdzY3JlZW4nOiAnc2NyZWVuJyk7XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gQ3JlYXRlcyBhIHN0YXRpYyBleHByZXNzaW9uIHdpdGggbG9naWNhbCBkaXNqdW5jdGlvbiAoT1Igb3BlcmF0b3IpXG4vLy8gICRtZWRpYS1leHByZXNzaW9uczogKFxuLy8vICAgICdyZXRpbmEyeCc6ICcoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpJ1xuLy8vICApO1xuLy8vXG4kbWVkaWEtZXhwcmVzc2lvbnM6IChcbiAgJ3NjcmVlbic6ICdzY3JlZW4nLFxuICAncHJpbnQnOiAncHJpbnQnLFxuICAnaGFuZGhlbGQnOiAnaGFuZGhlbGQnLFxuICAnbGFuZHNjYXBlJzogJyhvcmllbnRhdGlvbjogbGFuZHNjYXBlKScsXG4gICdwb3J0cmFpdCc6ICcob3JpZW50YXRpb246IHBvcnRyYWl0KScsXG4gICdyZXRpbmEyeCc6ICcoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLCAobWluLXJlc29sdXRpb246IDJkcHB4KScsXG4gICdyZXRpbmEzeCc6ICcoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSwgKG1pbi1yZXNvbHV0aW9uOiAzNTBkcGkpLCAobWluLXJlc29sdXRpb246IDNkcHB4KSdcbikgIWRlZmF1bHQ7XG5cblxuLy8vXG4vLy8gRGVmaW5lcyBhIG51bWJlciB0byBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkIGZyb20gZWFjaCB1bml0IHdoZW4gZGVjbGFyaW5nIGJyZWFrcG9pbnRzIHdpdGggZXhjbHVzaXZlIGludGVydmFsc1xuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIEludGVydmFsIGZvciBwaXhlbHMgaXMgZGVmaW5lZCBhcyBgMWAgYnkgZGVmYXVsdFxuLy8vICBAaW5jbHVkZSBtZWRpYSgnPjEyOHB4Jykge31cbi8vL1xuLy8vICAvKiBHZW5lcmF0ZXM6ICovXG4vLy8gIEBtZWRpYSAobWluLXdpZHRoOiAxMjlweCkge31cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBJbnRlcnZhbCBmb3IgZW1zIGlzIGRlZmluZWQgYXMgYDAuMDFgIGJ5IGRlZmF1bHRcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz4yMGVtJykge31cbi8vL1xuLy8vICAvKiBHZW5lcmF0ZXM6ICovXG4vLy8gIEBtZWRpYSAobWluLXdpZHRoOiAyMC4wMWVtKSB7fVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIEludGVydmFsIGZvciByZW1zIGlzIGRlZmluZWQgYXMgYDAuMWAgYnkgZGVmYXVsdCwgdG8gYmUgdXNlZCB3aXRoIGBmb250LXNpemU6IDYyLjUlO2Bcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz4yLjByZW0nKSB7fVxuLy8vXG4vLy8gIC8qIEdlbmVyYXRlczogKi9cbi8vLyAgQG1lZGlhIChtaW4td2lkdGg6IDIuMXJlbSkge31cbi8vL1xuJHVuaXQtaW50ZXJ2YWxzOiAoXG4gICdweCc6IDEsXG4gICdlbSc6IDAuMDEsXG4gICdyZW0nOiAwLjEsXG4gICcnOiAwXG4pICFkZWZhdWx0O1xuXG4vLy9cbi8vLyBEZWZpbmVzIHdoZXRoZXIgc3VwcG9ydCBmb3IgbWVkaWEgcXVlcmllcyBpcyBhdmFpbGFibGUsIHVzZWZ1bCBmb3IgY3JlYXRpbmcgc2VwYXJhdGUgc3R5bGVzaGVldHNcbi8vLyBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IG1lZGlhIHF1ZXJpZXMuXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gRGlzYWJsZXMgc3VwcG9ydCBmb3IgbWVkaWEgcXVlcmllc1xuLy8vICAkaW0tbWVkaWEtc3VwcG9ydDogZmFsc2U7XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+PXRhYmxldCcpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIGNvbG9yOiB0b21hdG87XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbi8vLyAgLyogR2VuZXJhdGVzOiAqL1xuLy8vICAuZm9vIHtcbi8vLyAgICBjb2xvcjogdG9tYXRvO1xuLy8vICB9XG4vLy9cbiRpbS1tZWRpYS1zdXBwb3J0OiB0cnVlICFkZWZhdWx0O1xuXG4vLy9cbi8vLyBTZWxlY3RzIHdoaWNoIGJyZWFrcG9pbnQgdG8gZW11bGF0ZSB3aGVuIHN1cHBvcnQgZm9yIG1lZGlhIHF1ZXJpZXMgaXMgZGlzYWJsZWQuIE1lZGlhIHF1ZXJpZXMgdGhhdCBzdGFydCBhdCBvclxuLy8vIGludGVyY2VwdCB0aGUgYnJlYWtwb2ludCB3aWxsIGJlIGRpc3BsYXllZCwgYW55IG90aGVycyB3aWxsIGJlIGlnbm9yZWQuXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gVGhpcyBtZWRpYSBxdWVyeSB3aWxsIHNob3cgYmVjYXVzZSBpdCBpbnRlcmNlcHRzIHRoZSBzdGF0aWMgYnJlYWtwb2ludFxuLy8vICAkaW0tbWVkaWEtc3VwcG9ydDogZmFsc2U7XG4vLy8gICRpbS1uby1tZWRpYS1icmVha3BvaW50OiAnZGVza3RvcCc7XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+PXRhYmxldCcpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIGNvbG9yOiB0b21hdG87XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbi8vLyAgLyogR2VuZXJhdGVzOiAqL1xuLy8vICAuZm9vIHtcbi8vLyAgICBjb2xvcjogdG9tYXRvO1xuLy8vICB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gVGhpcyBtZWRpYSBxdWVyeSB3aWxsIE5PVCBzaG93IGJlY2F1c2UgaXQgZG9lcyBub3QgaW50ZXJjZXB0IHRoZSBkZXNrdG9wIGJyZWFrcG9pbnRcbi8vLyAgJGltLW1lZGlhLXN1cHBvcnQ6IGZhbHNlO1xuLy8vICAkaW0tbm8tbWVkaWEtYnJlYWtwb2ludDogJ3RhYmxldCc7XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+PWRlc2t0b3AnKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBjb2xvcjogdG9tYXRvO1xuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG4vLy8gIC8qIE5vIG91dHB1dCAqL1xuLy8vXG4kaW0tbm8tbWVkaWEtYnJlYWtwb2ludDogJ2Rlc2t0b3AnICFkZWZhdWx0O1xuXG4vLy9cbi8vLyBTZWxlY3RzIHdoaWNoIG1lZGlhIGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkIGluIGFuIGV4cHJlc3Npb24gZm9yIGl0IHRvIGJlIHVzZWQgd2hlbiBtZWRpYSBxdWVyaWVzXG4vLy8gYXJlIG5vdCBzdXBwb3J0ZWQuXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gVGhpcyBtZWRpYSBxdWVyeSB3aWxsIHNob3cgYmVjYXVzZSBpdCBpbnRlcmNlcHRzIHRoZSBzdGF0aWMgYnJlYWtwb2ludCBhbmQgY29udGFpbnMgb25seSBhY2NlcHRlZCBtZWRpYSBleHByZXNzaW9uc1xuLy8vICAkaW0tbWVkaWEtc3VwcG9ydDogZmFsc2U7XG4vLy8gICRpbS1uby1tZWRpYS1icmVha3BvaW50OiAnZGVza3RvcCc7XG4vLy8gICRpbS1uby1tZWRpYS1leHByZXNzaW9uczogKCdzY3JlZW4nKTtcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz49dGFibGV0JywgJ3NjcmVlbicpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIGNvbG9yOiB0b21hdG87XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbi8vLyAgIC8qIEdlbmVyYXRlczogKi9cbi8vLyAgIC5mb28ge1xuLy8vICAgICBjb2xvcjogdG9tYXRvO1xuLy8vICAgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFRoaXMgbWVkaWEgcXVlcnkgd2lsbCBOT1Qgc2hvdyBiZWNhdXNlIGl0IGludGVyY2VwdHMgdGhlIHN0YXRpYyBicmVha3BvaW50IGJ1dCBjb250YWlucyBhIG1lZGlhIGV4cHJlc3Npb24gdGhhdCBpcyBub3QgYWNjZXB0ZWRcbi8vLyAgJGltLW1lZGlhLXN1cHBvcnQ6IGZhbHNlO1xuLy8vICAkaW0tbm8tbWVkaWEtYnJlYWtwb2ludDogJ2Rlc2t0b3AnO1xuLy8vICAkaW0tbm8tbWVkaWEtZXhwcmVzc2lvbnM6ICgnc2NyZWVuJyk7XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+PXRhYmxldCcsICdyZXRpbmEyeCcpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIGNvbG9yOiB0b21hdG87XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbi8vLyAgLyogTm8gb3V0cHV0ICovXG4vLy9cbiRpbS1uby1tZWRpYS1leHByZXNzaW9uczogKCdzY3JlZW4nLCAncG9ydHJhaXQnLCAnbGFuZHNjYXBlJykgIWRlZmF1bHQ7XG5cbi8vLy9cbi8vLyBDcm9zcy1lbmdpbmUgbG9nZ2luZyBlbmdpbmVcbi8vLyBAYXV0aG9yIEh1Z28gR2lyYXVkZWxcbi8vLyBAYWNjZXNzIHByaXZhdGVcbi8vLy9cblxuXG4vLy9cbi8vLyBMb2cgYSBtZXNzYWdlIGVpdGhlciB3aXRoIGBAZXJyb3JgIGlmIHN1cHBvcnRlZFxuLy8vIGVsc2Ugd2l0aCBgQHdhcm5gLCB1c2luZyBgZmVhdHVyZS1leGlzdHMoJ2F0LWVycm9yJylgXG4vLy8gdG8gZGV0ZWN0IHN1cHBvcnQuXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJG1lc3NhZ2UgLSBNZXNzYWdlIHRvIGxvZ1xuLy8vXG5AZnVuY3Rpb24gaW0tbG9nKCRtZXNzYWdlKSB7XG4gIEBpZiBmZWF0dXJlLWV4aXN0cygnYXQtZXJyb3InKSB7XG5cdEBlcnJvciAkbWVzc2FnZTtcbiAgfSBAZWxzZSB7XG5cdEB3YXJuICRtZXNzYWdlO1xuXHQkXzogbm9vcCgpO1xuICB9XG5cbiAgQHJldHVybiAkbWVzc2FnZTtcbn1cblxuXG4vLy9cbi8vLyBXcmFwcGVyIG1peGluIGZvciB0aGUgbG9nIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggYSBtb3JlIGZyaWVuZGx5XG4vLy8gQVBJIHRoYW4gYEBpZiBpbS1sb2coJy4uJykge31gIG9yIGAkXzogaW0tbG9nKCcuLicpYC4gQmFzaWNhbGx5LCB1c2UgdGhlIGZ1bmN0aW9uXG4vLy8gd2l0aGluIGZ1bmN0aW9ucyBiZWNhdXNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbmNsdWRlIGEgbWl4aW4gaW4gYSBmdW5jdGlvblxuLy8vIGFuZCB1c2UgdGhlIG1peGluIGV2ZXJ5d2hlcmUgZWxzZSBiZWNhdXNlIGl0J3MgbXVjaCBtb3JlIGVsZWdhbnQuXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJG1lc3NhZ2UgLSBNZXNzYWdlIHRvIGxvZ1xuLy8vXG5AbWl4aW4gbG9nKCRtZXNzYWdlKSB7XG4gIEBpZiBpbS1sb2coJG1lc3NhZ2UpIHt9XG59XG5cblxuLy8vXG4vLy8gRnVuY3Rpb24gd2l0aCBubyBgQHJldHVybmAgY2FsbGVkIG5leHQgdG8gYEB3YXJuYCBpbiBTYXNzIDMuM1xuLy8vIHRvIHRyaWdnZXIgYSBjb21waWxpbmcgZXJyb3IgYW5kIHN0b3AgdGhlIHByb2Nlc3MuXG4vLy9cbkBmdW5jdGlvbiBub29wKCkge31cblxuLy8vXG4vLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbGlzdCBvZiBjb25kaXRpb25zIGlzIGludGVyY2VwdGVkIGJ5IHRoZSBzdGF0aWMgYnJlYWtwb2ludC5cbi8vL1xuLy8vIEBwYXJhbSB7QXJnbGlzdH0gICAkY29uZGl0aW9ucyAgLSBNZWRpYSBxdWVyeSBjb25kaXRpb25zXG4vLy9cbi8vLyBAcmV0dXJuIHtCb29sZWFufSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29uZGl0aW9ucyBhcmUgaW50ZXJjZXB0ZWQgYnkgdGhlIHN0YXRpYyBicmVha3BvaW50XG4vLy9cbkBmdW5jdGlvbiBpbS1pbnRlcmNlcHRzLXN0YXRpYy1icmVha3BvaW50KCRjb25kaXRpb25zLi4uKSB7XG4gICRuby1tZWRpYS1icmVha3BvaW50LXZhbHVlOiBtYXAtZ2V0KCRicmVha3BvaW50cywgJGltLW5vLW1lZGlhLWJyZWFrcG9pbnQpO1xuXG4gIEBpZiBub3QgJG5vLW1lZGlhLWJyZWFrcG9pbnQtdmFsdWUge1xuXHRAaWYgaW0tbG9nKCdgI3skaW0tbm8tbWVkaWEtYnJlYWtwb2ludH1gIGlzIG5vdCBhIHZhbGlkIGJyZWFrcG9pbnQuJykge31cbiAgfVxuXG4gIEBlYWNoICRjb25kaXRpb24gaW4gJGNvbmRpdGlvbnMge1xuXHRAaWYgbm90IG1hcC1oYXMta2V5KCRtZWRpYS1leHByZXNzaW9ucywgJGNvbmRpdGlvbikge1xuXHQgICRvcGVyYXRvcjogZ2V0LWV4cHJlc3Npb24tb3BlcmF0b3IoJGNvbmRpdGlvbik7XG5cdCAgJHByZWZpeDogZ2V0LWV4cHJlc3Npb24tcHJlZml4KCRvcGVyYXRvcik7XG5cdCAgJHZhbHVlOiBnZXQtZXhwcmVzc2lvbi12YWx1ZSgkY29uZGl0aW9uLCAkb3BlcmF0b3IpO1xuXG5cdCAgQGlmICgkcHJlZml4ID09ICdtYXgnIGFuZCAkdmFsdWUgPD0gJG5vLW1lZGlhLWJyZWFrcG9pbnQtdmFsdWUpIG9yXG5cdFx0ICAoJHByZWZpeCA9PSAnbWluJyBhbmQgJHZhbHVlID4gJG5vLW1lZGlhLWJyZWFrcG9pbnQtdmFsdWUpIHtcblx0XHRAcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0fSBAZWxzZSBpZiBub3QgaW5kZXgoJGltLW5vLW1lZGlhLWV4cHJlc3Npb25zLCAkY29uZGl0aW9uKSB7XG5cdCAgQHJldHVybiBmYWxzZTtcblx0fVxuICB9XG5cbiAgQHJldHVybiB0cnVlO1xufVxuXG4vLy8vXG4vLy8gUGFyc2luZyBlbmdpbmVcbi8vLyBAYXV0aG9yIEh1Z28gR2lyYXVkZWxcbi8vLyBAYWNjZXNzIHByaXZhdGVcbi8vLy9cblxuXG4vLy9cbi8vLyBHZXQgb3BlcmF0b3Igb2YgYW4gZXhwcmVzc2lvblxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRleHByZXNzaW9uIC0gRXhwcmVzc2lvbiB0byBleHRyYWN0IG9wZXJhdG9yIGZyb21cbi8vL1xuLy8vIEByZXR1cm4ge1N0cmluZ30gLSBBbnkgb2YgYD49YCwgYD5gLCBgPD1gLCBgPGAsIGDiiaVgLCBg4omkYFxuLy8vXG5AZnVuY3Rpb24gZ2V0LWV4cHJlc3Npb24tb3BlcmF0b3IoJGV4cHJlc3Npb24pIHtcbiAgQGVhY2ggJG9wZXJhdG9yIGluICgnPj0nLCAnPicsICc8PScsICc8JywgJ+KJpScsICfiiaQnKSB7XG5cdEBpZiBzdHItaW5kZXgoJGV4cHJlc3Npb24sICRvcGVyYXRvcikge1xuXHQgIEByZXR1cm4gJG9wZXJhdG9yO1xuXHR9XG4gIH1cblxuICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gaW5jbHVkZSBhIG1peGluIGluc2lkZSBhIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvXG4gIC8vIHJlbHkgb24gdGhlIGBpbS1sb2coLi4pYCBmdW5jdGlvbiByYXRoZXIgdGhhbiB0aGUgYGxvZyguLilgIG1peGluLiBCZWNhdXNlXG4gIC8vIGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGFueXdoZXJlIGluIFNhc3MsIHdlIG5lZWQgdG8gaGFjayB0aGUgY2FsbCBpblxuICAvLyBhIGR1bW15IHZhcmlhYmxlLCBzdWNoIGFzIGAkX2AuIElmIGFueWJvZHkgZXZlciByYWlzZSBhIHNjb3BpbmcgaXNzdWUgd2l0aFxuICAvLyBTYXNzIDMuMywgY2hhbmdlIHRoaXMgbGluZSBpbiBgQGlmIGltLWxvZyguLikge31gIGluc3RlYWQuXG4gICRfOiBpbS1sb2coJ05vIG9wZXJhdG9yIGZvdW5kIGluIGAjeyRleHByZXNzaW9ufWAuJyk7XG59XG5cblxuLy8vXG4vLy8gR2V0IGRpbWVuc2lvbiBvZiBhbiBleHByZXNzaW9uLCBiYXNlZCBvbiBhIGZvdW5kIG9wZXJhdG9yXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJGV4cHJlc3Npb24gLSBFeHByZXNzaW9uIHRvIGV4dHJhY3QgZGltZW5zaW9uIGZyb21cbi8vLyBAcGFyYW0ge1N0cmluZ30gJG9wZXJhdG9yIC0gT3BlcmF0b3IgZnJvbSBgJGV4cHJlc3Npb25gXG4vLy9cbi8vLyBAcmV0dXJuIHtTdHJpbmd9IC0gYHdpZHRoYCBvciBgaGVpZ2h0YCAob3IgcG90ZW50aWFsbHkgYW55dGhpbmcgZWxzZSlcbi8vL1xuQGZ1bmN0aW9uIGdldC1leHByZXNzaW9uLWRpbWVuc2lvbigkZXhwcmVzc2lvbiwgJG9wZXJhdG9yKSB7XG4gICRvcGVyYXRvci1pbmRleDogc3RyLWluZGV4KCRleHByZXNzaW9uLCAkb3BlcmF0b3IpO1xuICAkcGFyc2VkLWRpbWVuc2lvbjogc3RyLXNsaWNlKCRleHByZXNzaW9uLCAwLCAkb3BlcmF0b3ItaW5kZXggLSAxKTtcbiAgJGRpbWVuc2lvbjogJ3dpZHRoJztcblxuICBAaWYgc3RyLWxlbmd0aCgkcGFyc2VkLWRpbWVuc2lvbikgPiAwIHtcblx0JGRpbWVuc2lvbjogJHBhcnNlZC1kaW1lbnNpb247XG4gIH1cblxuICBAcmV0dXJuICRkaW1lbnNpb247XG59XG5cblxuLy8vXG4vLy8gR2V0IGRpbWVuc2lvbiBwcmVmaXggYmFzZWQgb24gYW4gb3BlcmF0b3Jcbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkb3BlcmF0b3IgLSBPcGVyYXRvclxuLy8vXG4vLy8gQHJldHVybiB7U3RyaW5nfSAtIGBtaW5gIG9yIGBtYXhgXG4vLy9cbkBmdW5jdGlvbiBnZXQtZXhwcmVzc2lvbi1wcmVmaXgoJG9wZXJhdG9yKSB7XG4gIEByZXR1cm4gaWYoaW5kZXgoKCc8JywgJzw9JywgJ+KJpCcpLCAkb3BlcmF0b3IpLCAnbWF4JywgJ21pbicpO1xufVxuXG5cbi8vL1xuLy8vIEdldCB2YWx1ZSBvZiBhbiBleHByZXNzaW9uLCBiYXNlZCBvbiBhIGZvdW5kIG9wZXJhdG9yXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJGV4cHJlc3Npb24gLSBFeHByZXNzaW9uIHRvIGV4dHJhY3QgdmFsdWUgZnJvbVxuLy8vIEBwYXJhbSB7U3RyaW5nfSAkb3BlcmF0b3IgLSBPcGVyYXRvciBmcm9tIGAkZXhwcmVzc2lvbmBcbi8vL1xuLy8vIEByZXR1cm4ge051bWJlcn0gLSBBIG51bWVyaWMgdmFsdWVcbi8vL1xuQGZ1bmN0aW9uIGdldC1leHByZXNzaW9uLXZhbHVlKCRleHByZXNzaW9uLCAkb3BlcmF0b3IpIHtcbiAgJG9wZXJhdG9yLWluZGV4OiBzdHItaW5kZXgoJGV4cHJlc3Npb24sICRvcGVyYXRvcik7XG4gICR2YWx1ZTogc3RyLXNsaWNlKCRleHByZXNzaW9uLCAkb3BlcmF0b3ItaW5kZXggKyBzdHItbGVuZ3RoKCRvcGVyYXRvcikpO1xuXG4gIEBpZiBtYXAtaGFzLWtleSgkYnJlYWtwb2ludHMsICR2YWx1ZSkge1xuXHQkdmFsdWU6IG1hcC1nZXQoJGJyZWFrcG9pbnRzLCAkdmFsdWUpO1xuICB9IEBlbHNlIHtcblx0JHZhbHVlOiB0by1udW1iZXIoJHZhbHVlKTtcbiAgfVxuXG4gICRpbnRlcnZhbDogbWFwLWdldCgkdW5pdC1pbnRlcnZhbHMsIHVuaXQoJHZhbHVlKSk7XG5cbiAgQGlmIG5vdCAkaW50ZXJ2YWwge1xuXHQvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gaW5jbHVkZSBhIG1peGluIGluc2lkZSBhIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvXG5cdC8vIHJlbHkgb24gdGhlIGBpbS1sb2coLi4pYCBmdW5jdGlvbiByYXRoZXIgdGhhbiB0aGUgYGxvZyguLilgIG1peGluLiBCZWNhdXNlXG5cdC8vIGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGFueXdoZXJlIGluIFNhc3MsIHdlIG5lZWQgdG8gaGFjayB0aGUgY2FsbCBpblxuXHQvLyBhIGR1bW15IHZhcmlhYmxlLCBzdWNoIGFzIGAkX2AuIElmIGFueWJvZHkgZXZlciByYWlzZSBhIHNjb3BpbmcgaXNzdWUgd2l0aFxuXHQvLyBTYXNzIDMuMywgY2hhbmdlIHRoaXMgbGluZSBpbiBgQGlmIGltLWxvZyguLikge31gIGluc3RlYWQuXG5cdCRfOiBpbS1sb2coJ1Vua25vd24gdW5pdCBgI3t1bml0KCR2YWx1ZSl9YC4nKTtcbiAgfVxuXG4gIEBpZiAkb3BlcmF0b3IgPT0gJz4nIHtcblx0JHZhbHVlOiAkdmFsdWUgKyAkaW50ZXJ2YWw7XG4gIH0gQGVsc2UgaWYgJG9wZXJhdG9yID09ICc8JyB7XG5cdCR2YWx1ZTogJHZhbHVlIC0gJGludGVydmFsO1xuICB9XG5cbiAgQHJldHVybiAkdmFsdWU7XG59XG5cblxuLy8vXG4vLy8gUGFyc2UgYW4gZXhwcmVzc2lvbiB0byByZXR1cm4gYSB2YWxpZCBtZWRpYS1xdWVyeSBleHByZXNzaW9uXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJGV4cHJlc3Npb24gLSBFeHByZXNzaW9uIHRvIHBhcnNlXG4vLy9cbi8vLyBAcmV0dXJuIHtTdHJpbmd9IC0gVmFsaWQgbWVkaWEgcXVlcnlcbi8vL1xuQGZ1bmN0aW9uIHBhcnNlLWV4cHJlc3Npb24oJGV4cHJlc3Npb24pIHtcbiAgLy8gSWYgaXQgaXMgcGFydCBvZiAkbWVkaWEtZXhwcmVzc2lvbnMsIGl0IGhhcyBubyBvcGVyYXRvclxuICAvLyB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ28gYW55IGZ1cnRoZXIsIGp1c3QgcmV0dXJuIHRoZSB2YWx1ZVxuICBAaWYgbWFwLWhhcy1rZXkoJG1lZGlhLWV4cHJlc3Npb25zLCAkZXhwcmVzc2lvbikge1xuXHRAcmV0dXJuIG1hcC1nZXQoJG1lZGlhLWV4cHJlc3Npb25zLCAkZXhwcmVzc2lvbik7XG4gIH1cblxuICAkb3BlcmF0b3I6IGdldC1leHByZXNzaW9uLW9wZXJhdG9yKCRleHByZXNzaW9uKTtcbiAgJGRpbWVuc2lvbjogZ2V0LWV4cHJlc3Npb24tZGltZW5zaW9uKCRleHByZXNzaW9uLCAkb3BlcmF0b3IpO1xuICAkcHJlZml4OiBnZXQtZXhwcmVzc2lvbi1wcmVmaXgoJG9wZXJhdG9yKTtcbiAgJHZhbHVlOiBnZXQtZXhwcmVzc2lvbi12YWx1ZSgkZXhwcmVzc2lvbiwgJG9wZXJhdG9yKTtcblxuICBAcmV0dXJuICcoI3skcHJlZml4fS0jeyRkaW1lbnNpb259OiAjeyR2YWx1ZX0pJztcbn1cblxuLy8vXG4vLy8gU2xpY2UgYCRsaXN0YCBiZXR3ZWVuIGAkc3RhcnRgIGFuZCBgJGVuZGAgaW5kZXhlc1xuLy8vXG4vLy8gQGFjY2VzcyBwcml2YXRlXG4vLy9cbi8vLyBAcGFyYW0ge0xpc3R9ICRsaXN0IC0gTGlzdCB0byBzbGljZVxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkc3RhcnQgWzFdIC0gU3RhcnQgaW5kZXhcbi8vLyBAcGFyYW0ge051bWJlcn0gJGVuZCBbbGVuZ3RoKCRsaXN0KV0gLSBFbmQgaW5kZXhcbi8vL1xuLy8vIEByZXR1cm4ge0xpc3R9IFNsaWNlZCBsaXN0XG4vLy9cbkBmdW5jdGlvbiBzbGljZSgkbGlzdCwgJHN0YXJ0OiAxLCAkZW5kOiBsZW5ndGgoJGxpc3QpKSB7XG4gIEBpZiBsZW5ndGgoJGxpc3QpIDwgMSBvciAkc3RhcnQgPiAkZW5kIHtcblx0QHJldHVybiAoKTtcbiAgfVxuXG4gICRyZXN1bHQ6ICgpO1xuXG4gIEBmb3IgJGkgZnJvbSAkc3RhcnQgdGhyb3VnaCAkZW5kIHtcblx0JHJlc3VsdDogYXBwZW5kKCRyZXN1bHQsIG50aCgkbGlzdCwgJGkpKTtcbiAgfVxuXG4gIEByZXR1cm4gJHJlc3VsdDtcbn1cblxuLy8vL1xuLy8vIFN0cmluZyB0byBudW1iZXIgY29udmVydGVyXG4vLy8gQGF1dGhvciBIdWdvIEdpcmF1ZGVsXG4vLy8gQGFjY2VzcyBwcml2YXRlXG4vLy8vXG5cblxuLy8vXG4vLy8gQ2FzdHMgYSBzdHJpbmcgaW50byBhIG51bWJlclxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmcgfCBOdW1iZXJ9ICR2YWx1ZSAtIFZhbHVlIHRvIGJlIHBhcnNlZFxuLy8vXG4vLy8gQHJldHVybiB7TnVtYmVyfVxuLy8vXG5AZnVuY3Rpb24gdG8tbnVtYmVyKCR2YWx1ZSkge1xuICBAaWYgdHlwZS1vZigkdmFsdWUpID09ICdudW1iZXInIHtcblx0QHJldHVybiAkdmFsdWU7XG4gIH0gQGVsc2UgaWYgdHlwZS1vZigkdmFsdWUpICE9ICdzdHJpbmcnIHtcblx0JF86IGltLWxvZygnVmFsdWUgZm9yIGB0by1udW1iZXJgIHNob3VsZCBiZSBhIG51bWJlciBvciBhIHN0cmluZy4nKTtcbiAgfVxuXG4gICRmaXJzdC1jaGFyYWN0ZXI6IHN0ci1zbGljZSgkdmFsdWUsIDEsIDEpO1xuICAkcmVzdWx0OiAwO1xuICAkZGlnaXRzOiAwO1xuICAkbWludXM6ICgkZmlyc3QtY2hhcmFjdGVyID09ICctJyk7XG4gICRudW1iZXJzOiAoJzAnOiAwLCAnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDQsICc1JzogNSwgJzYnOiA2LCAnNyc6IDcsICc4JzogOCwgJzknOiA5KTtcblxuICAvLyBSZW1vdmUgKy8tIHNpZ24gaWYgcHJlc2VudCBhdCBmaXJzdCBjaGFyYWN0ZXJcbiAgQGlmICgkZmlyc3QtY2hhcmFjdGVyID09ICcrJyBvciAkZmlyc3QtY2hhcmFjdGVyID09ICctJykge1xuXHQkdmFsdWU6IHN0ci1zbGljZSgkdmFsdWUsIDIpO1xuICB9XG5cbiAgQGZvciAkaSBmcm9tIDEgdGhyb3VnaCBzdHItbGVuZ3RoKCR2YWx1ZSkge1xuXHQkY2hhcmFjdGVyOiBzdHItc2xpY2UoJHZhbHVlLCAkaSwgJGkpO1xuXG5cdEBpZiBub3QgKGluZGV4KG1hcC1rZXlzKCRudW1iZXJzKSwgJGNoYXJhY3Rlcikgb3IgJGNoYXJhY3RlciA9PSAnLicpIHtcblx0ICBAcmV0dXJuIHRvLWxlbmd0aChpZigkbWludXMsIC0kcmVzdWx0LCAkcmVzdWx0KSwgc3RyLXNsaWNlKCR2YWx1ZSwgJGkpKVxuXHR9XG5cblx0QGlmICRjaGFyYWN0ZXIgPT0gJy4nIHtcblx0ICAkZGlnaXRzOiAxO1xuXHR9IEBlbHNlIGlmICRkaWdpdHMgPT0gMCB7XG5cdCAgJHJlc3VsdDogJHJlc3VsdCAqIDEwICsgbWFwLWdldCgkbnVtYmVycywgJGNoYXJhY3Rlcik7XG5cdH0gQGVsc2Uge1xuXHQgICRkaWdpdHM6ICRkaWdpdHMgKiAxMDtcblx0ICAkcmVzdWx0OiAkcmVzdWx0ICsgbWFwLWdldCgkbnVtYmVycywgJGNoYXJhY3RlcikgLyAkZGlnaXRzO1xuXHR9XG4gIH1cblxuICBAcmV0dXJuIGlmKCRtaW51cywgLSRyZXN1bHQsICRyZXN1bHQpO1xufVxuXG5cbi8vL1xuLy8vIEFkZCBgJHVuaXRgIHRvIGAkdmFsdWVgXG4vLy9cbi8vLyBAcGFyYW0ge051bWJlcn0gJHZhbHVlIC0gVmFsdWUgdG8gYWRkIHVuaXQgdG9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJHVuaXQgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXRcbi8vL1xuLy8vIEByZXR1cm4ge051bWJlcn0gLSBgJHZhbHVlYCBleHByZXNzZWQgaW4gYCR1bml0YFxuLy8vXG5AZnVuY3Rpb24gdG8tbGVuZ3RoKCR2YWx1ZSwgJHVuaXQpIHtcbiAgJHVuaXRzOiAoJ3B4JzogMXB4LCAnY20nOiAxY20sICdtbSc6IDFtbSwgJyUnOiAxJSwgJ2NoJzogMWNoLCAncGMnOiAxcGMsICdpbic6IDFpbiwgJ2VtJzogMWVtLCAncmVtJzogMXJlbSwgJ3B0JzogMXB0LCAnZXgnOiAxZXgsICd2dyc6IDF2dywgJ3ZoJzogMXZoLCAndm1pbic6IDF2bWluLCAndm1heCc6IDF2bWF4KTtcblxuICBAaWYgbm90IGluZGV4KG1hcC1rZXlzKCR1bml0cyksICR1bml0KSB7XG5cdCRfOiBpbS1sb2coJ0ludmFsaWQgdW5pdCBgI3skdW5pdH1gLicpO1xuICB9XG5cbiAgQHJldHVybiAkdmFsdWUgKiBtYXAtZ2V0KCR1bml0cywgJHVuaXQpO1xufVxuXG4vLy9cbi8vLyBUaGlzIG1peGluIGFpbXMgYXQgcmVkZWZpbmluZyB0aGUgY29uZmlndXJhdGlvbiBqdXN0IGZvciB0aGUgc2NvcGUgb2Zcbi8vLyB0aGUgY2FsbC4gSXQgaXMgaGVscGZ1bCB3aGVuIGhhdmluZyBhIGNvbXBvbmVudCBuZWVkaW5nIGFuIGV4dGVuZGVkXG4vLy8gY29uZmlndXJhdGlvbiBzdWNoIGFzIGN1c3RvbSBicmVha3BvaW50cyAocmVmZXJyZWQgdG8gYXMgdHdlYWtwb2ludHMpXG4vLy8gZm9yIGluc3RhbmNlLlxuLy8vXG4vLy8gQGF1dGhvciBIdWdvIEdpcmF1ZGVsXG4vLy9cbi8vLyBAcGFyYW0ge01hcH0gJHR3ZWFrcG9pbnRzIFsoKV0gLSBNYXAgb2YgdHdlYWtwb2ludHMgdG8gYmUgbWVyZ2VkIHdpdGggYCRicmVha3BvaW50c2Bcbi8vLyBAcGFyYW0ge01hcH0gJHR3ZWFrLW1lZGlhLWV4cHJlc3Npb25zIFsoKV0gLSBNYXAgb2YgdHdlYWtlZCBtZWRpYSBleHByZXNzaW9ucyB0byBiZSBtZXJnZWQgd2l0aCBgJG1lZGlhLWV4cHJlc3Npb25gXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gRXh0ZW5kIHRoZSBnbG9iYWwgYnJlYWtwb2ludHMgd2l0aCBhIHR3ZWFrcG9pbnRcbi8vLyAgQGluY2x1ZGUgbWVkaWEtY29udGV4dCgoJ2N1c3RvbSc6IDY3OHB4KSkge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgQGluY2x1ZGUgbWVkaWEoJz5waG9uZScsICc8PWN1c3RvbScpIHtcbi8vLyAgICAgICAvLyAuLi5cbi8vLyAgICAgIH1cbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBFeHRlbmQgdGhlIGdsb2JhbCBtZWRpYSBleHByZXNzaW9ucyB3aXRoIGEgY3VzdG9tIG9uZVxuLy8vICBAaW5jbHVkZSBtZWRpYS1jb250ZXh0KCR0d2Vhay1tZWRpYS1leHByZXNzaW9uczogKCdhbGwnOiAnYWxsJykpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIEBpbmNsdWRlIG1lZGlhKCdhbGwnLCAnPnBob25lJykge1xuLy8vICAgICAgIC8vIC4uLlxuLy8vICAgICAgfVxuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIEV4dGVuZCBib3RoIGNvbmZpZ3VyYXRpb24gbWFwc1xuLy8vICBAaW5jbHVkZSBtZWRpYS1jb250ZXh0KCgnY3VzdG9tJzogNjc4cHgpLCAoJ2FsbCc6ICdhbGwnKSkge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgQGluY2x1ZGUgbWVkaWEoJ2FsbCcsICc+cGhvbmUnLCAnPD1jdXN0b20nKSB7XG4vLy8gICAgICAgLy8gLi4uXG4vLy8gICAgICB9XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbkBtaXhpbiBtZWRpYS1jb250ZXh0KCR0d2Vha3BvaW50czogKCksICR0d2Vhay1tZWRpYS1leHByZXNzaW9uczogKCkpIHtcbiAgLy8gU2F2ZSBnbG9iYWwgY29uZmlndXJhdGlvblxuICAkZ2xvYmFsLWJyZWFrcG9pbnRzOiAkYnJlYWtwb2ludHM7XG4gICRnbG9iYWwtbWVkaWEtZXhwcmVzc2lvbnM6ICRtZWRpYS1leHByZXNzaW9ucztcblxuICAvLyBVcGRhdGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb25cbiAgJGJyZWFrcG9pbnRzOiBtYXAtbWVyZ2UoJGJyZWFrcG9pbnRzLCAkdHdlYWtwb2ludHMpICFnbG9iYWw7XG4gICRtZWRpYS1leHByZXNzaW9uczogbWFwLW1lcmdlKCRtZWRpYS1leHByZXNzaW9ucywgJHR3ZWFrLW1lZGlhLWV4cHJlc3Npb25zKSAhZ2xvYmFsO1xuXG4gIEBjb250ZW50O1xuXG4gIC8vIFJlc3RvcmUgZ2xvYmFsIGNvbmZpZ3VyYXRpb25cbiAgJGJyZWFrcG9pbnRzOiAkZ2xvYmFsLWJyZWFrcG9pbnRzICFnbG9iYWw7XG4gICRtZWRpYS1leHByZXNzaW9uczogJGdsb2JhbC1tZWRpYS1leHByZXNzaW9ucyAhZ2xvYmFsO1xufVxuXG4vLy8vXG4vLy8gaW5jbHVkZS1tZWRpYSBwdWJsaWMgZXhwb3NlZCBBUElcbi8vLyBAYXV0aG9yIEVkdWFyZG8gQm91Y2FzXG4vLy8gQGFjY2VzcyBwdWJsaWNcbi8vLy9cblxuXG4vLy9cbi8vLyBHZW5lcmF0ZXMgYSBtZWRpYSBxdWVyeSBiYXNlZCBvbiBhIGxpc3Qgb2YgY29uZGl0aW9uc1xuLy8vXG4vLy8gQHBhcmFtIHtBcmdsaXN0fSAgICRjb25kaXRpb25zICAtIE1lZGlhIHF1ZXJ5IGNvbmRpdGlvbnNcbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBXaXRoIGEgc2luZ2xlIHNldCBicmVha3BvaW50XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+cGhvbmUnKSB7IH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBXaXRoIHR3byBzZXQgYnJlYWtwb2ludHNcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz5waG9uZScsICc8PXRhYmxldCcpIHsgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFdpdGggY3VzdG9tIHZhbHVlc1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPj0zNThweCcsICc8ODUwcHgnKSB7IH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBXaXRoIHNldCBicmVha3BvaW50cyB3aXRoIGN1c3RvbSB2YWx1ZXNcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz5kZXNrdG9wJywgJzw9MTM1MHB4JykgeyB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gV2l0aCBhIHN0YXRpYyBleHByZXNzaW9uXG4vLy8gIEBpbmNsdWRlIG1lZGlhKCdyZXRpbmEyeCcpIHsgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIE1peGluZyBldmVyeXRoaW5nXG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+PTM1MHB4JywgJzx0YWJsZXQnLCAncmV0aW5hM3gnKSB7IH1cbi8vL1xuQG1peGluIG1lZGlhKCRjb25kaXRpb25zLi4uKSB7XG4gIEBpZiAoJGltLW1lZGlhLXN1cHBvcnQgYW5kIGxlbmd0aCgkY29uZGl0aW9ucykgPT0gMCkgb3Jcblx0ICAobm90ICRpbS1tZWRpYS1zdXBwb3J0IGFuZCBpbS1pbnRlcmNlcHRzLXN0YXRpYy1icmVha3BvaW50KCRjb25kaXRpb25zLi4uKSkge1xuXHRAY29udGVudDtcbiAgfSBAZWxzZSBpZiAoJGltLW1lZGlhLXN1cHBvcnQgYW5kIGxlbmd0aCgkY29uZGl0aW9ucykgPiAwKSB7XG5cdEBtZWRpYSAje3VucXVvdGUocGFyc2UtZXhwcmVzc2lvbihudGgoJGNvbmRpdGlvbnMsIDEpKSl9IHtcblx0ICAvLyBSZWN1cnNpdmUgY2FsbFxuXHQgIEBpbmNsdWRlIG1lZGlhKHNsaWNlKCRjb25kaXRpb25zLCAyKS4uLikge1xuXHRcdEBjb250ZW50O1xuXHQgIH1cblx0fVxuICB9XG59XG4iLCIvLyBTdHlsaW5nIHR3ZWFrcyBmb3IgalF1ZXJ5LWNvbmZpcm0gSlMgYWxlcnQgbGlicmFyeS5cbmJvZHkud3AtbWFpbC1zbXRwLWFkbWluLXBhZ2UtYm9keSB7XG5cblx0ZGl2Lmpjb25maXJtIHtcblxuXHRcdCosXG5cdFx0Kjo6YmVmb3JlLFxuXHRcdCo6OmFmdGVyIHtcblx0XHRcdC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0fVxuXG5cdFx0Lmpjb25maXJtLWJnIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTE0LCAxMTksIDEyNCwgMC43NSk7XG5cdFx0XHRvcGFjaXR5OiAxO1xuXHRcdH1cblxuXHRcdC5qY29uZmlybS1ib3gge1xuXHRcdFx0cGFkZGluZzogMzBweDtcblx0XHRcdGJvcmRlci1yYWRpdXM6IDZweDtcblx0XHRcdGJveC1zaGFkb3c6IDAgM3B4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuXHRcdFx0Ym9yZGVyLXRvcC13aWR0aDogNHB4O1xuXG5cdFx0XHRkaXYuamNvbmZpcm0tY2xvc2VJY29uIHtcblx0XHRcdFx0Y29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcblx0XHRcdFx0dG9wOiA4cHg7XG5cdFx0XHRcdHJpZ2h0OiA4cHg7XG5cblx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0Y29sb3I6IHJnYmEoMCwgMCwgMCwgMC44MCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZGl2Lmpjb25maXJtLXRpdGxlLWMge1xuXHRcdFx0XHRtYXJnaW46IDAgMCAxNXB4IDA7XG5cdFx0XHRcdHBhZGRpbmc6IDA7XG5cblx0XHRcdFx0Lmpjb25maXJtLWljb24tYyB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIDAgMzBweDtcblx0XHRcdFx0XHQtd2Via2l0LXRyYW5zaXRpb246IG5vbmU7XG5cdFx0XHRcdFx0dHJhbnNpdGlvbjogbm9uZTtcblx0XHRcdFx0XHQtd2Via2l0LXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0XHRcdC1tcy10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0XHR0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcblxuXHRcdFx0XHRcdCY6ZW1wdHksXG5cdFx0XHRcdFx0aTplbXB0eSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5qY29uZmlybS10aXRsZSB7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0XHRcdFx0XHRmb250LXNpemU6IDI0cHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZGl2Lmpjb25maXJtLWNvbnRlbnQtcGFuZSB7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAzMHB4O1xuXG5cdFx0XHRcdC5qY29uZmlybS1jb250ZW50IHtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0XHRcdG92ZXJmbG93OiBpbmhlcml0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRpdi5qY29uZmlybS1jb250ZW50IHtcblx0XHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0XHRjb2xvcjogJHByaW1hcnktdGV4dDtcblx0XHRcdFx0bGluZS1oZWlnaHQ6IDEuNDtcblxuXHRcdFx0XHRwIHtcblx0XHRcdFx0XHRtYXJnaW46IDAgMCAyMHB4O1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMS41O1xuXG5cdFx0XHRcdFx0JjpsYXN0LW9mLXR5cGUge1xuXHRcdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYubGFyZ2Uge1xuXHRcdFx0XHRcdFx0Zm9udC1zaXplOiAxOHB4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYuc21hbGwge1xuXHRcdFx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC53cC1tYWlsLXNtdHAtZGVidWctZXZlbnQtcHJldmlldyBwIHtcblx0XHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLWJ0biB7XG5cdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdFx0XHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRcdFx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuMXM7XG5cdFx0XHRcdFx0dHJhbnNpdGlvbjogYmFja2dyb3VuZCAuMXM7XG5cdFx0XHRcdFx0cGFkZGluZzogMTBweCAyMHB4O1xuXHRcdFx0XHRcdG91dGxpbmU6IG5vbmU7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMS40O1xuXHRcdFx0XHRcdC1tcy10b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcblx0XHRcdFx0XHR0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdFx0LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0XHQtbW96LXVzZXItc2VsZWN0OiBub25lO1xuXHRcdFx0XHRcdC1tcy11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0XHR1c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdFx0XHRcdFx0bWluLWhlaWdodDogMWVtO1xuXHRcdFx0XHRcdC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0XHRcdFx0Ym9yZGVyOiAwO1xuXHRcdFx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG5cblx0XHRcdFx0XHQmLndpdGgtbG9hZGVyIHtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDEycHggMTJweCA3cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRpdi5qY29uZmlybS1idXR0b25zIHtcblx0XHRcdFx0cGFkZGluZzogMDtcblxuXHRcdFx0XHRidXR0b24ge1xuXHRcdFx0XHRcdHRyYW5zaXRpb246IDAuMnM7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHRcdFx0XHRtYXJnaW46IDAgMTBweCAwO1xuXG5cdFx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0XHRib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxMDBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ji5idG4tY29uZmlybSB7XG5cdFx0XHRcdFx0XHRjb2xvcjogI2ZmZjtcblx0XHRcdFx0XHRcdG91dGxpbmU6IG5vbmU7XG5cdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAkb3JhbmdlO1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJG9yYW5nZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLmJ0bi1jYW5jZWwge1xuXHRcdFx0XHRcdFx0Y29sb3I6ICM3Nzc3Nzc7XG5cdFx0XHRcdFx0XHRvdXRsaW5lOiBub25lO1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZDogI0Y4RjhGODtcblx0XHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Jixcblx0XHRcdFx0XHQmLmJ0bi1kZWZhdWx0IHtcblx0XHRcdFx0XHRcdGNvbG9yOiAjNjY2O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYuYnRuLWhpZGUge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLmJ0bi1ibG9jayB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdFx0bWFyZ2luOiAwIDAgMTBweCAwICFpbXBvcnRhbnQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ji5idG4tbm9ybWFsLWNhc2Uge1xuXHRcdFx0XHRcdFx0dGV4dC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ji5qY29uZmlybS10eXBlLWdyZWVuIHtcblx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkbW9kYWwtZ3JlZW47XG5cblx0XHRcdFx0ZGl2Lmpjb25maXJtLWJ1dHRvbnMgYnV0dG9uLmJ0bi1jb25maXJtIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtZ3JlZW47XG5cdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkbW9kYWwtZ3JlZW47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ji5qY29uZmlybS10eXBlLW9yYW5nZSB7XG5cdFx0XHRcdGJvcmRlci1jb2xvcjogJG1vZGFsLW9yYW5nZTtcblxuXHRcdFx0XHRkaXYuamNvbmZpcm0tYnV0dG9ucyBidXR0b24uYnRuLWNvbmZpcm0ge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICRtb2RhbC1vcmFuZ2U7XG5cdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkbW9kYWwtb3JhbmdlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCYuamNvbmZpcm0tdHlwZS1yZWQge1xuXHRcdFx0XHRib3JkZXItY29sb3I6ICRtb2RhbC1yZWQ7XG5cblx0XHRcdFx0ZGl2Lmpjb25maXJtLWJ1dHRvbnMgYnV0dG9uLmJ0bi1jb25maXJtIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtcmVkO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogJG1vZGFsLXJlZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQmLmpjb25maXJtLXR5cGUtYmx1ZSB7XG5cdFx0XHRcdGJvcmRlci1jb2xvcjogJG1vZGFsLWJsdWU7XG5cblx0XHRcdFx0ZGl2Lmpjb25maXJtLWJ1dHRvbnMgYnV0dG9uLmJ0bi1jb25maXJtIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtYmx1ZTtcblx0XHRcdFx0XHRib3JkZXItY29sb3I6ICRtb2RhbC1ibHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCYubG9hZGluZyB7XG5cdFx0XHRcdGJvcmRlci10b3AtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcblx0XHRcdFx0aGVpZ2h0OiAxNjBweDtcblxuXHRcdFx0XHQuamNvbmZpcm0tdGl0bGUtYyB7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0ei1pbmRleDogNDtcblxuXHRcdFx0XHRcdC5qY29uZmlybS1pY29uLWMge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmOmJlZm9yZSB7XG5cdFx0XHRcdFx0ei1pbmRleDogMjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6YWZ0ZXIge1xuXHRcdFx0XHRcdGNvbnRlbnQ6ICcnO1xuXHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRsZWZ0OiA1MCU7XG5cdFx0XHRcdFx0dG9wOiA2OCU7XG5cdFx0XHRcdFx0bWFyZ2luLWxlZnQ6IC0yMHB4O1xuXHRcdFx0XHRcdGhlaWdodDogNDBweDtcblx0XHRcdFx0XHR3aWR0aDogNDBweDtcblx0XHRcdFx0XHRib3JkZXI6IHNvbGlkIDZweCB0cmFuc3BhcmVudDtcblx0XHRcdFx0XHRib3JkZXItYm90dG9tLWNvbG9yOiAkb3JhbmdlO1xuXHRcdFx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHRcdFx0ei1pbmRleDogMztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5qY29uZmlybS1ib3gud3AtbWFpbC1zbXRwLXVwZ3JhZGUtbWFpbGVyLWVkdWNhdGlvbi1tb2RhbCB7XG5cdFx0XHRwYWRkaW5nOiAzMHB4IDMwcHggMTVweDtcblx0XHRcdGJvcmRlci10b3A6IG5vbmU7XG5cblx0XHRcdGRpdi5qY29uZmlybS10aXRsZS1jIHtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMjZweCAwO1xuXHRcdFx0XHRwYWRkaW5nOiAwO1xuXG5cdFx0XHRcdC5qY29uZmlybS1pY29uLWMge1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDIwcHg7XG5cdFx0XHRcdFx0Y29sb3I6ICNjNGM0YzQgIWltcG9ydGFudDtcblxuXHRcdFx0XHRcdHN2ZyB7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDM1cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRpdi5qY29uZmlybS1jb250ZW50LXBhbmUge1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAyNXB4O1xuXHRcdFx0fVxuXG5cdFx0XHRkaXYuamNvbmZpcm0tYnV0dG9ucyBidXR0b24uYnRuLWNvbmZpcm0ge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkb3JhbmdlO1xuXHRcdFx0XHRib3JkZXItY29sb3I6ICRvcmFuZ2U7XG5cdFx0XHR9XG5cblx0XHRcdC5kaXNjb3VudC1ub3RlIHtcblx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHRtYXJnaW46IDQ1cHggMCAwO1xuXG5cdFx0XHRcdHAge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmY2Y5ZTg7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIC0zMHB4O1xuXHRcdFx0XHRcdHBhZGRpbmc6IDI0cHggNjBweCAyMHB4O1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTVweDtcblx0XHRcdFx0XHRjb2xvcjogIzRkNGQ0ZDtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0XHRcdFx0XHQmOmFmdGVyIHtcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IHVybCguLi9pbWFnZXMvZm9udC1hd2Vzb21lL2NoZWNrLWNpcmNsZS1zb2xpZC1ncmVlbi5zdmcpO1xuXHRcdFx0XHRcdFx0d2lkdGg6IDQwcHg7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDQwcHg7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogNTAlO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogNXB4IDZweDtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRcdHRvcDogLTIwcHg7XG5cdFx0XHRcdFx0XHRyaWdodDogNTAlO1xuXHRcdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiAtMThweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzcGFuIHtcblx0XHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0XHRcdGNvbG9yOiAkcG9zaXRpdmU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhIHtcblx0XHRcdFx0XHRjb2xvcjogI2FhYTtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRtYXJnaW4tdG9wOiAxMnB4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4iLCIvLyBDb2xvciBzdHlsZXNcbiRwcmltYXJ5LXRleHQ6ICMyMjIyMjI7XG4kc2Vjb25kYXJ5LXRleHQ6ICM1NTU1NTU7XG4kZGVzY3JpcHRpb24tdGV4dDogIzg4ODg4ODtcbiRmaWVsZC10ZXh0OiAjNTU1NTU1O1xuJGZpZWxkLWJvcmRlcjogIzk5OTk5OTtcbiRzdGVlbDogIzczOEU5RTtcbiRzdGVlbC1kYXJrOiAjMzk1MzYwO1xuJG9yYW5nZTogI0UyNzczMDtcbiRvcmFuZ2UtZGFyazogI0I4NUExQjtcbiRsaW5rOiAjMjE3MUIxO1xuJGxpbmstaG92ZXI6ICMxMzVlOTY7XG4kcG9zaXRpdmU6ICMwMEEzMkE7XG4kbmVnYXRpdmU6ICNENjM2Mzg7XG5cbiRncmV5OiAjQTlBOUE5O1xuXG4kbW9kYWwtb3JhbmdlOiAjRTI3NzMwO1xuJG1vZGFsLWdyZWVuOiAjMDBBMzJBO1xuJG1vZGFsLXJlZDogI0Q2MzYzODtcbiRtb2RhbC1ibHVlOiAjMzU4MmM0O1xuXG4vLyBFZmZlY3Qgc3R5bGVzXG4kc2hhZG93LXNtOiAgMHB4IDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA3KTtcbiRzaGFkb3ctbWQ6ICAwcHggMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDcpO1xuJHNoYWRvdy1sZzogIDBweCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuXG4kY29udGVudC1wYWRkaW5nOiAyMHB4O1xuJHBhZGRpbmctZGVmYXVsdDogMzBweDtcblxuJGJvcmRlci1jb2xvcjogI0U1RTZFNjtcbiRib3JkZXItcmFkaXVzOiA0cHg7XG4kYm9yZGVyOiAxcHggc29saWQgJGJvcmRlci1jb2xvcjtcblxuJGJyZWFrcG9pbnRzOiAoXG5cdCd4cy1waG9uZSc6IDMyMHB4LFxuXHQncGhvbmUnOiA2MDBweCxcblx0J2lwYWQnOiA3NjhweCxcblx0J3RhYmxldCc6IDc4MnB4LFxuXHQnZGVza3RvcCc6IDk2MHB4LFxuKTtcbiIsIi8vIEVkdWNhdGlvbiBzdHlsZXMuXG5cbi8vIE5vdGljZSBiYXIuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDIzcHgpIHtcblx0I3dwLW1haWwtc210cC1ub3RpY2UtYmFyIHtcblx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdH1cbn1cblxuI3dwLW1haWwtc210cC1ub3RpY2UtYmFyIHtcblx0bWF4LWhlaWdodDogMzVweDtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRtYXJnaW4tYm90dG9tOiAtM3B4O1xuXHR0cmFuc2l0aW9uOiBhbGwgLjNzIGVhc2Utb3V0O1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXG5cdCYub3V0IHtcblx0XHRtYXgtaGVpZ2h0OiAzcHg7XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLW5vdGljZS1iYXItY29udGFpbmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjREREREREO1xuXHRcdGJvcmRlci10b3A6IDNweCBzb2xpZCAkb3JhbmdlO1xuXHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdHBhZGRpbmc6IDdweDtcblx0fVxuXG5cdGEge1xuXHRcdGNvbG9yOiAkb3JhbmdlO1xuXHR9XG5cblx0YTpob3ZlciB7XG5cdFx0Y29sb3I6ICRvcmFuZ2UtZGFyaztcblx0fVxuXG5cdC5kaXNtaXNzIHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0dG9wOiAwO1xuXHRcdHJpZ2h0OiAwO1xuXHRcdGJvcmRlcjogbm9uZTtcblx0XHRwYWRkaW5nOiA1cHg7XG5cdFx0bWFyZ2luLXRvcDogNHB4O1xuXHRcdGJhY2tncm91bmQ6IDAgMDtcblx0XHRjb2xvcjogIzcyNzc3Yztcblx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdH1cblxuXHQuZGlzbWlzczpiZWZvcmUge1xuXHRcdGJhY2tncm91bmQ6IDAgMDtcblx0XHRjb2xvcjogIzcyNzc3Yztcblx0XHRjb250ZW50OiBcIlxcZjMzNVwiO1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdGZvbnQ6IG5vcm1hbCAyMHB4LzIwcHggZGFzaGljb25zO1xuXHRcdHNwZWFrOiBub25lO1xuXHRcdGhlaWdodDogMjBweDtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0d2lkdGg6IDIwcHg7XG5cdFx0LXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG5cdH1cbn1cblxuI3NjcmVlbi1tZXRhLWxpbmtzIC5zY3JlZW4tbWV0YS10b2dnbGUge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdHJpZ2h0OiAyMHB4O1xuXHR0b3A6IGF1dG87XG59XG5cbiN3cC1tYWlsLXNtdHAge1xuXG5cdC8qIEdlbmVyYWwgc3R5bGVzLiAqL1xuXHQud3AtbWFpbC1zbXRwLXByb2R1Y3QtZWR1Y2F0aW9uIHtcblxuXHRcdCZfX3JvdyB7XG5cdFx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U0ZTRlNDtcblx0XHRcdHBhZGRpbmc6IDI1cHggMCA1cHg7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMS4zO1xuXHRcdFx0bWF4LXdpZHRoOiAxMDA1cHg7XG5cblx0XHRcdCYgPiAqOmxhc3QtY2hpbGQge1xuXHRcdFx0XHRib3JkZXItYm90dG9tOiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdCYtLWluYWN0aXZlIHtcblx0XHRcdFx0b3BhY2l0eTogMC41O1xuXHRcdFx0XHRwb2ludGVyLWV2ZW50czogbm9uZTtcblx0XHRcdH1cblxuXHRcdFx0Ji0tZnVsbC13aWR0aCB7XG5cdFx0XHRcdG1heC13aWR0aDogdW5zZXQ7XG5cdFx0XHR9XG5cblx0XHRcdCYtLW5vLWJvcmRlciB7XG5cdFx0XHRcdGJvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdH1cblxuXHRcdFx0Ji0tbm8tcGFkZGluZyB7XG5cdFx0XHRcdHBhZGRpbmc6IDAgIWltcG9ydGFudDtcblx0XHRcdH1cblxuXHRcdFx0JjpmaXJzdC1vZi10eXBlIHtcblx0XHRcdFx0cGFkZGluZy10b3A6IDEwcHg7XG5cdFx0XHR9XG5cblx0XHRcdCY6bGFzdC1vZi10eXBlICsgLndwLW1haWwtc210cC1idG4tdXBncmFkZSB7XG5cdFx0XHRcdG1hcmdpbi10b3A6IDI1cHg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jl9faGVhZGluZyB7XG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdG1hcmdpbi10b3A6IDA7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAxMHB4O1xuXHRcdFx0Zm9udC1zaXplOiAyMHB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDI0cHg7XG5cdFx0XHRjb2xvcjogJHByaW1hcnktdGV4dDtcblxuXHRcdFx0JjphZnRlciB7XG5cdFx0XHRcdGNvbnRlbnQ6ICcnO1xuXHRcdFx0XHRtYXJnaW4tbGVmdDogMTBweDtcblx0XHRcdFx0YmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWFnZXMvcHJvLWJhZGdlLXNtYWxsLnN2ZycpO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG5cdFx0XHRcdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdFx0XHRcdHdpZHRoOiAzNXB4O1xuXHRcdFx0XHRoZWlnaHQ6IDE2cHg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jl9fZGVzY3JpcHRpb24ge1xuXHRcdFx0bWFyZ2luLXRvcDogMDtcblx0XHRcdG1hcmdpbi1ib3R0b206IDIwcHg7XG5cdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDEuNWVtO1xuXHRcdH1cblxuXHRcdCZfX3NjcmVlbnNob3RzIHtcblx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPHBob25lXCIpIHtcblx0XHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdH1cblxuXHRcdFx0JiA+IGRpdiB7XG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdG1hcmdpbjogMCAyNXB4IDIwcHggMDtcblxuXHRcdFx0XHRAaW5jbHVkZSBtZWRpYShcIjxwaG9uZVwiKSB7XG5cdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiAwO1xuXHRcdFx0XHRcdG1heC13aWR0aDogdW5zZXQgIWltcG9ydGFudDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6bGFzdC1jaGlsZCB7XG5cdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YSB7XG5cdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDEwcHg7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI0ZGRkZGRjtcblx0XHRcdFx0XHRib3JkZXI6IDVweCBzb2xpZCAjRkZGRkZGO1xuXHRcdFx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xuXG5cdFx0XHRcdFx0JjphZnRlciB7XG5cdFx0XHRcdFx0XHRjb250ZW50OiBcIlwiO1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdFx0b3BhY2l0eTogMDtcblx0XHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdFx0dG9wOiAwO1xuXHRcdFx0XHRcdFx0bGVmdDogMDtcblx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjgsIDY4LCA2OCwgMC4xNSk7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uLy4uL2Fzc2V0cy9pbWFnZXMvaWNvbnMvem9vbS5zdmcnKTtcblx0XHRcdFx0XHRcdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLXNpemU6IDUwcHg7XG5cdFx0XHRcdFx0XHR0cmFuc2l0aW9uOiBhbGwgMC4zcztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmOmhvdmVyOmFmdGVyIHtcblx0XHRcdFx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW1nIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0aGVpZ2h0OiBhdXRvO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3BhbiB7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAxOHB4O1xuXHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCYtLXR3byA+IGRpdiB7XG5cdFx0XHRcdG1heC13aWR0aDogNDg3cHg7XG5cdFx0XHR9XG5cblx0XHRcdCYtLXRocmVlID4gZGl2IHtcblx0XHRcdFx0bWF4LXdpZHRoOiAzMTZweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmX19saXN0IHtcblxuXHRcdFx0JiA+IGg0IHtcblx0XHRcdFx0bWFyZ2luLXRvcDogMDtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMjBweDtcblx0XHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0XHRsaW5lLWhlaWdodDogMjBweDtcblx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHR9XG5cblx0XHRcdCYgPiBkaXYge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cdFx0XHR9XG5cblx0XHRcdHVsIHtcblx0XHRcdFx0d2lkdGg6IDI5MHB4O1xuXHRcdFx0XHRtYXJnaW46IDAgNDBweCAyMHB4IDA7XG5cblx0XHRcdFx0bGkge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMDtcblx0XHRcdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXG5cdFx0XHRcdFx0JiArIGxpIHtcblx0XHRcdFx0XHRcdG1hcmdpbi10b3A6IDIwcHg7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdFx0Y29udGVudDogdXJsKCcuLi8uLi9hc3NldHMvaW1hZ2VzL2ljb25zL2NoZWNrLXNvbGlkLnN2ZycpO1xuXHRcdFx0XHRcdFx0d2lkdGg6IDE2cHg7XG5cdFx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IDEwcHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyogRXhwb3J0IGVtYWlsIGxvZ3MgZWR1Y2F0aW9uIHBhZ2UuICovXG5cdCN3cC1tYWlsLXNtdHAtdG9vbHMtZXhwb3J0LWVtYWlsLWxvZ3MtcHJvZHVjdC1lZHVjYXRpb24ge1xuXG5cdFx0c2VjdGlvbiB7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAyMHB4O1xuXHRcdFx0Y3Vyc29yOiBub3QtYWxsb3dlZDtcblxuXHRcdFx0JjpsYXN0LW9mLXR5cGUge1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAyMHB4O1xuXHRcdFx0fVxuXG5cdFx0XHRoNSB7XG5cdFx0XHRcdGNsZWFyOiBib3RoO1xuXHRcdFx0XHRtYXJnaW46IDAgMCAxMHB4IDA7XG5cdFx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHR9XG5cblx0XHRcdGxhYmVsIHtcblx0XHRcdFx0Y2xlYXI6IGJvdGg7XG5cdFx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0XHRtYXJnaW46IDNweCAwIDNweCAwO1xuXHRcdFx0fVxuXG5cdFx0XHQud3AtbWFpbC1zbXRwLWRhdGUtc2VsZWN0b3Ige1xuXHRcdFx0XHR3aWR0aDogMjAwcHg7XG5cdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdH1cblxuXHRcdFx0LndwLW1haWwtc210cC1zZWFyY2gtYm94LWZpZWxkIHtcblx0XHRcdFx0d2lkdGg6IDIwMHB4O1xuXHRcdFx0fVxuXG5cdFx0XHQud3AtbWFpbC1zbXRwLXNlYXJjaC1ib3gtdGVybSB7XG5cdFx0XHRcdHdpZHRoOiAzMDBweDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKiBDb250cm9scyBlZHVjYXRpb24gcGFnZS4gKi9cblx0I3dwLW1haWwtc210cC1lbWFpbC1jb250cm9scy1wcm9kdWN0LWVkdWNhdGlvbiB7XG5cblx0XHQud3AtbWFpbC1zbXRwLXByb2R1Y3QtZWR1Y2F0aW9uX19yb3ctLWluYWN0aXZlIHtcblx0XHRcdHBhZGRpbmctdG9wOiAyMHB4O1xuXHRcdFx0cGFkZGluZy1ib3R0b206IDA7XG5cdFx0fVxuXG5cdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXJvdzpsYXN0LWNoaWxkIHtcblx0XHRcdGJvcmRlci1ib3R0b206IG5vbmU7XG5cdFx0fVxuXHR9XG5cblx0LyogTmV0d29yayBlZHVjYXRpb24gcGFnZS4gKi9cblx0LndwLW1haWwtc210cC1wYWdlLW53LXByb2R1Y3QtZWR1IHtcblx0XHRoMiB7XG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdH1cblxuXHRcdC5iYWRnZSB7XG5cdFx0XHRtYXJnaW46IDAgMCAycHggN3B4O1xuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHRcdHdpZHRoOiA0MHB4O1xuXHRcdFx0aGVpZ2h0OiAxN3B4O1xuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctbXVsdGlzaXRlIHtcblx0XHRcdGNvbG9yOiAjOWE5YTlhO1xuXG5cdFx0XHRwLmRlc2Mge1xuXHRcdFx0XHRjb2xvcjogI2JhYmFiYTtcblx0XHRcdH1cblxuXHRcdFx0aW5wdXRbdHlwZT1jaGVja2JveF06ZGlzYWJsZWQge1xuXHRcdFx0XHRib3JkZXItY29sb3I6ICNhYWE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1uby1zZXR0aW5nIHtcblx0XHRcdG1hcmdpbi10b3A6IDMwcHg7XG5cdFx0fVxuXHR9XG59XG5cbi53cC1tYWlsLXNtdHAtbGl0ZSAjd3AtbWFpbC1zbXRwIHtcblxuXHQvKiBFbWFpbCByZXBvcnRzIGVkdWNhdGlvbiBwYWdlLiAqL1xuXHQud3AtbWFpbC1zbXRwLXBhZ2UtcmVwb3J0cyB7XG5cblx0XHQud3AtbWFpbC1zbXRwLXBhZ2UtdGl0bGUgLnBhZ2UtdGl0bGUge1xuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHQmOmFmdGVyIHtcblx0XHRcdFx0Y29udGVudDogJyc7XG5cdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IDEwcHg7XG5cdFx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL3Byby1iYWRnZS1zbWFsbC5zdmcnKTtcblx0XHRcdFx0YmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuXHRcdFx0XHR3aWR0aDogMzVweDtcblx0XHRcdFx0aGVpZ2h0OiAxNnB4O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5cbiIsIi8vIEN1c3RvbSBzdHlsZSBmb3IgdGhlIHBsdWdpbiBTVkcgbG9hZGVyLlxuLndwLW1haWwtc210cC1sb2FkaW5nIHtcblx0YW5pbWF0aW9uOiAwLjY1cyBsaW5lYXIgaW5maW5pdGUgd3AtbWFpbC1zbXRwLWxvYWRpbmctc3Bpbjtcbn1cblxuLndwLW1haWwtc210cC1sb2FkaW5nLW1kIHtcblx0d2lkdGg6IDMycHg7XG5cdGhlaWdodDogMzJweDtcbn1cblxuLndwLW1haWwtc210cC1sb2FkaW5nLXNtIHtcblx0d2lkdGg6IDE2cHg7XG5cdGhlaWdodDogMTZweDtcbn1cblxuLy8gQ1NTIGxvYWRpbmcgc3Bpbm5lci5cbi53cC1tYWlsLXNtdHAtbG9hZGluZy1zcGluIHtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRjb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcblx0cG9pbnRlci1ldmVudHM6IG5vbmU7XG5cblx0JjphZnRlciB7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0YW5pbWF0aW9uOiAwLjY1cyBsaW5lYXIgaW5maW5pdGUgd3AtbWFpbC1zbXRwLWxvYWRpbmctc3Bpbjtcblx0XHRib3JkZXI6IDJweCBzb2xpZCAjZmZmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDUwJTtcblx0XHRib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG5cdFx0Ym9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcblx0XHRjb250ZW50OiBcIlwiO1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdHRvcDogNTAlO1xuXHRcdGxlZnQ6IDUwJTtcblx0XHR3aWR0aDogMTZweDtcblx0XHRoZWlnaHQ6IDE2cHg7XG5cdFx0bWFyZ2luLXRvcDogLThweDtcblx0XHRtYXJnaW4tbGVmdDogLThweDtcblx0fVxufVxuXG5Aa2V5ZnJhbWVzIHdwLW1haWwtc210cC1sb2FkaW5nLXNwaW4ge1xuXHQwJSB7XG5cdFx0dHJhbnNmb3JtOiByb3RhdGVaKDI3MGRlZyk7XG5cdH1cblx0MTAwJSB7XG5cdFx0dHJhbnNmb3JtOiByb3RhdGVaKDYzMGRlZylcblx0fVxufVxuIiwiLy8gRmx5b3V0IE1lbnUgc3R5bGVzLlxuXG5AaW1wb3J0IFwidmFyaWFibGVzXCI7XG5cbiN3cC1tYWlsLXNtdHAtZmx5b3V0IHtcblx0JHN0YXJ0OiA3NXB4O1xuXHQkc3RlcDogNTVweDtcblx0JHRyYW5zOiAwLjJzO1xuXHQkZGVsYXk6IDM1bXM7XG5cblx0cG9zaXRpb246IGZpeGVkO1xuXHR6LWluZGV4OiA5OTk5OTtcblx0dHJhbnNpdGlvbjogYWxsICR0cmFucyBlYXNlLWluLW91dDtcblx0cmlnaHQ6IDQwcHg7XG5cdGJvdHRvbTogNDBweDtcblx0b3BhY2l0eTogMTtcblxuXHRAaW5jbHVkZSBtZWRpYSgnPGRlc2t0b3AnKSB7XG5cdFx0ZGlzcGxheTogbm9uZTtcblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtZmx5b3V0LWhlYWQge1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXG5cdFx0Jjpmb2N1cyB7XG5cdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdH1cblxuXHRcdGZpZ3VyZSB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0XHRib3JkZXI6IDNweCBzb2xpZCAkb3JhbmdlO1xuXHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdGJveC1zaGFkb3c6IDAgMnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHR0cmFuc2l0aW9uOiBhbGwgJHRyYW5zIGVhc2UtaW4tb3V0O1xuXG5cdFx0XHRpbWcge1xuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0d2lkdGg6IDU0cHg7XG5cdFx0XHRcdGhlaWdodDogNTRweDtcblx0XHRcdFx0dHJhbnNpdGlvbjogYWxsICR0cmFucyBlYXNlLWluLW91dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmOmhvdmVyIGZpZ3VyZSB7XG5cdFx0XHRib3gtc2hhZG93OiAwIDJweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcblx0XHR9XG5cblx0XHQud3AtbWFpbC1zbXRwLWZseW91dC1sYWJlbCB7XG5cdFx0XHRyaWdodDogY2FsYygxMDAlICsgMTVweCk7XG5cdFx0XHRvcGFjaXR5OiAwO1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDApO1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAtNTBweDtcblx0XHR9XG5cblx0XHQmOmhvdmVyIC53cC1tYWlsLXNtdHAtZmx5b3V0LWxhYmVsIHtcblx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMSk7XG5cdFx0XHRtYXJnaW4tcmlnaHQ6IDA7XG5cdFx0fVxuXHR9XG5cblx0LndwLW1haWwtc210cC1mbHlvdXQtbGFiZWwge1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0XHR0b3A6IDUwJTtcblx0XHRyaWdodDogY2FsYygxMDAlICsgMTVweCk7XG5cdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuXHRcdC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuXHRcdC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuXHRcdGNvbG9yOiAjZmZmO1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNBN0FBQUQ7XG5cdFx0Zm9udC1zaXplOiAxMnB4O1xuXHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdFx0cGFkZGluZzogNnB4IDEwcHg7XG5cdFx0aGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG5cdFx0bGluZS1oZWlnaHQ6IGluaXRpYWw7XG5cdFx0dHJhbnNpdGlvbjogYWxsICR0cmFucyBlYXNlLW91dDtcblx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0LW1vei1ib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0LXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLWZseW91dC1pdGVtIHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0ZGlzcGxheTogZmxleDtcblx0XHRsZWZ0OiAxMHB4O1xuXHRcdHdpZHRoOiA0MHB4O1xuXHRcdGhlaWdodDogNDBweDtcblx0XHRvcGFjaXR5OiAwO1xuXHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHR0cmFuc2l0aW9uOiBhbGwgJHRyYW5zIGVhc2UtaW4tb3V0O1xuXHRcdHRyYW5zZm9ybTogc2NhbGUoMCk7XG5cdFx0Ym9yZGVyLXJhZGl1czogNTAlO1xuXHRcdGJveC1zaGFkb3c6ICRzaGFkb3ctbGc7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogIzczOEU5RTtcblxuXHRcdGltZyB7XG5cdFx0XHRtYXJnaW46IGF1dG87XG5cdFx0fVxuXG5cdFx0QGZvciAkaSBmcm9tIDAgdGhyb3VnaCA0IHtcblx0XHRcdCYud3AtbWFpbC1zbXRwLWZseW91dC1pdGVtLSN7JGl9IHtcblx0XHRcdFx0Ym90dG9tOiAkc3RhcnQgKyAkaSAqICRzdGVwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCY6aG92ZXIge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogIzM5NTM2MDtcblxuXHRcdFx0LndwLW1haWwtc210cC1mbHlvdXQtbGFiZWwge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjNzg3QzgyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdCYub3BlbmVkIHtcblxuXHRcdC53cC1tYWlsLXNtdHAtZmx5b3V0LWl0ZW0ge1xuXHRcdFx0b3BhY2l0eTogMTtcblx0XHRcdHZpc2liaWxpdHk6IHZpc2libGU7XG5cdFx0XHR0cmFuc2Zvcm06IHNjYWxlKDEpO1xuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtZmx5b3V0LWhlYWQge1xuXG5cdFx0XHQud3AtbWFpbC1zbXRwLWZseW91dC1sYWJlbCB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cblx0XHRcdGZpZ3VyZSBpbWcge1xuXHRcdFx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgtMTVkZWcpIHNjYWxlKDEuMTcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdEBmb3IgJGkgZnJvbSAwIHRocm91Z2ggNCB7XG5cdFx0XHQud3AtbWFpbC1zbXRwLWZseW91dC1pdGVtLSN7JGl9IHtcblx0XHRcdFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtICR0cmFucyAkaSAqICRkZWxheSwgYmFja2dyb3VuZC1jb2xvciAkdHJhbnM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ji5vdXQge1xuXHRcdG9wYWNpdHk6IDA7XG5cdFx0dmlzaWJpbGl0eTogaGlkZGVuO1xuXHR9XG59XG4iLCIud3AtbWFpbC1zbXRwLXRvb2x0aXAge1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG5cdHRleHQtZGVjb3JhdGlvbi1zdHlsZTogZG90dGVkO1xuXHRjdXJzb3I6IGhlbHA7XG5cdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdG1hcmdpbi10b3A6IDE1cHggIWltcG9ydGFudDtcblxuXHQmLXRleHQge1xuXHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0ei1pbmRleDogOTk5OTtcblx0XHR3aWR0aDogMzYwcHg7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogIzJENEY2MDtcblx0XHRjb2xvcjogI2ZmZjtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0cGFkZGluZzogMTZweCAyMHB4O1xuXHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRib3JkZXItcmFkaXVzOiA1cHg7XG5cdFx0Ym90dG9tOiAxMDAlO1xuXHRcdGxlZnQ6IDUwJTtcblx0XHRtYXJnaW4tbGVmdDogLTE4MHB4O1xuXG5cdFx0Jjo6YWZ0ZXIge1xuXHRcdFx0Y29udGVudDogXCIgXCI7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6IDEwMCU7XG5cdFx0XHRsZWZ0OiA1MCU7XG5cdFx0XHRtYXJnaW4tbGVmdDogLTVweDtcblx0XHRcdGJvcmRlci13aWR0aDogNXB4O1xuXHRcdFx0Ym9yZGVyLXN0eWxlOiBzb2xpZDtcblx0XHRcdGJvcmRlci1jb2xvcjogIzJENEY2MCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcblx0XHR9XG5cdH1cblxuXHQmOmhvdmVyIC53cC1tYWlsLXNtdHAtdG9vbHRpcC10ZXh0IHtcblx0XHR2aXNpYmlsaXR5OiB2aXNpYmxlO1xuXHR9XG59XG4iLCIjd3AtbWFpbC1zbXRwIHtcblxuXHQud3AtbWFpbC1zbXRwLWNvbmRpdGlvbmFsIHtcblxuXHRcdGJ1dHRvbiB7XG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0fVxuXG5cdFx0dGFibGUge1xuXHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRtYXgtd2lkdGg6IDc0MHB4O1xuXHRcdFx0cGFkZGluZzogMDtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG5cdFx0XHRib3JkZXItc3BhY2luZzogMDtcblx0XHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHR9XG5cblx0XHR0YWJsZSB0ZCB7XG5cdFx0XHRwYWRkaW5nOiAwIDEwcHggMjBweCAwO1xuXHRcdH1cblxuXHRcdCZfX3JvdyB7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPD1waG9uZVwiKSB7XG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHR9XG5cblx0XHRcdGlucHV0LFxuXHRcdFx0c2VsZWN0IHtcblx0XHRcdFx0d2lkdGg6IDEwMCUgIWltcG9ydGFudDtcblx0XHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCZfX3Byb3BlcnR5LWNvbCB7XG5cdFx0XHR3aWR0aDogMjMlO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmX19vcGVyYXRvci1jb2wge1xuXHRcdFx0d2lkdGg6IDIzJTtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8PXBob25lXCIpIHtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jl9fdmFsdWUtY29sIHtcblx0XHRcdHdpZHRoOiA0MiU7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPD1waG9uZVwiKSB7XG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCZfX3ZhbHVlIDpkaXNhYmxlZCB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xuXHRcdFx0Y3Vyc29yOiBub3QtYWxsb3dlZDtcblx0XHR9XG5cblx0XHQmX19hY3Rpb25zIHtcblx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0cGFkZGluZy1yaWdodDogMDtcblx0XHR9XG5cblx0XHQmX19kZWxldGUtcnVsZSB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcblx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdGNvbG9yOiAjOTk5OTk5O1xuXHRcdFx0bWFyZ2luOiAwIDAgMCAxMHB4O1xuXHRcdFx0cGFkZGluZzogMDtcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRjb2xvcjogJG5lZ2F0aXZlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCZfX2dyb3VwLWRlbGltaXRlciB7XG5cdFx0XHRtYXJnaW46IDAgMCAyMHB4O1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDQwMDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAxN3B4O1xuXHRcdFx0Y29sb3I6ICRkZXNjcmlwdGlvbi10ZXh0O1xuXHRcdH1cblx0fVxufVxuIiwiQGltcG9ydCBcImluY2x1ZGUtbWVkaWFcIjtcbkBpbXBvcnQgXCJ2YXJpYWJsZXNcIjtcbkBpbXBvcnQgXCJnZW5lcmFsXCI7XG5AaW1wb3J0IFwiY29uZmlybVwiO1xuQGltcG9ydCBcImVkdWNhdGlvblwiO1xuQGltcG9ydCBcImxvYWRlclwiO1xuQGltcG9ydCBcImZseW91dC1tZW51XCI7XG5AaW1wb3J0IFwidG9vbHRpcFwiO1xuQGltcG9ydCBcImNvbmRpdGlvbmFsLWxvZ2ljXCI7XG5cbi8vIFNjcmVlbiBvcHRpb25zIGFyZSBoaWRkZW4gb24gbG9hZCwgdGhlbiBtYWRlIHZpc2libGUgd2l0aCBKUywgdG9cbi8vIHByZXZlbnQgaXQgZnJvbSBcImp1bXBpbmdcIi5cbiNzY3JlZW4tbWV0YS1saW5rcyxcbiNzY3JlZW4tbWV0YSB7XG5cdGRpc3BsYXk6IG5vbmU7XG59XG5cbiN3cC1tYWlsLXNtdHAtaGVhZGVyLXRlbXAge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdG1hcmdpbjogMDtcblx0dG9wOiAtMXB4O1xuXHRsZWZ0OiAyMHB4O1xuXHRyaWdodDogMDtcblx0ei1pbmRleDogOTk7XG59XG5cbiN3cC1tYWlsLXNtdHAtaGVhZGVyIHtcblx0Ym9yZGVyLXRvcDogM3B4IHNvbGlkICRvcmFuZ2U7XG5cdHBhZGRpbmc6IDI0cHggJGNvbnRlbnQtcGFkZGluZztcblxuXHRpbWcge1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdG1hcmdpbjogMDtcblx0XHRtYXgtd2lkdGg6IDI0MnB4O1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8PXRhYmxldFwiKSB7XG5cdFx0XHRtYXgtd2lkdGg6IDIwMHB4O1xuXHRcdH1cblx0fVxufVxuXG4ud3AtbWFpbC1zbXRwLXBhZ2Uge1xuXHRjb2xvcjogJHByaW1hcnktdGV4dDtcblxuXHRhIHtcblx0XHRjb2xvcjogJGxpbms7XG5cblx0XHQmOmhvdmVyLFxuXHRcdCY6YWN0aXZlIHtcblx0XHRcdGNvbG9yOiAkbGluay1ob3Zlcjtcblx0XHR9XG5cdH1cbn1cblxuI3dwLW1haWwtc210cCB7XG5cdG1hcmdpbjogMDtcblxuXHQud3AtbWFpbC1zbXRwLWhpZGUge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLXBhZ2UtdGl0bGUge1xuXHRcdG1pbi1oZWlnaHQ6IDU4cHg7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0bWFyZ2luOiAwIDAgMjBweCAwO1xuXHRcdHBhZGRpbmc6IDAgJGNvbnRlbnQtcGFkZGluZztcblxuXHRcdGEudGFiIHtcblx0XHRcdGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZmZmO1xuXHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHRcdGNvbG9yOiAjNjY2O1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAzMHB4O1xuXHRcdFx0cGFkZGluZzogMjBweCAwIDE4cHggMDtcblx0XHRcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxuXHRcdFx0Ji5hY3RpdmUge1xuXHRcdFx0XHRib3JkZXItYm90dG9tOiAycHggc29saWQgJG9yYW5nZTtcblx0XHRcdH1cblxuXHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdGJvcmRlci1jb2xvcjogIzk5OTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhLmFjdGlvbiB7XG5cdFx0XHRjb2xvcjogI2ZmZjtcblx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRtYXJnaW46IDE0cHggMCAxNHB4IDEwcHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjhweDtcblx0XHRcdG1pbi1oZWlnaHQ6IDMwcHg7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdFx0XHRtYXJnaW4tbGVmdDogMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQucGFnZS10aXRsZSB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0Zm9udC1zaXplOiAyM3B4O1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0cGFkZGluZzogMjBweCAyMHB4IDIwcHggMDtcblx0XHR9XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLXBhZ2UtY29udGVudCB7XG5cdFx0cGFkZGluZzogMCAkY29udGVudC1wYWRkaW5nO1xuXG5cdFx0Kixcblx0XHQqOjpiZWZvcmUsXG5cdFx0Kjo6YWZ0ZXIge1xuXHRcdFx0LXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdFx0LW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHR9XG5cblx0XHQud3AtbWFpbC1zbXRwLWNsZWFyIHtcblx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0Y29udGVudDogXCIgXCI7XG5cdFx0XHRcdGRpc3BsYXk6IHRhYmxlO1xuXHRcdFx0fVxuXHRcdFx0JjphZnRlciB7XG5cdFx0XHRcdGNsZWFyOiBib3RoO1xuXHRcdFx0XHRjb250ZW50OiBcIiBcIjtcblx0XHRcdFx0ZGlzcGxheTogdGFibGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0dGluZyByb3dzLCBlZyBmaWVsZCByb3cuXG5cdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXJvdyB7XG5cdFx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U0ZTRlNDtcblx0XHRcdHBhZGRpbmc6IDMwcHggMDtcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAxLjM7XG5cblx0XHRcdCY6Zmlyc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdHBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPHRhYmxldFwiKSB7XG5cdFx0XHRcdHBhZGRpbmc6IDIwcHggMDtcblx0XHRcdH1cblxuXHRcdFx0Ji5pbmFjdGl2ZSB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cblx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1taWQtcm93LXNlcCB7XG5cdFx0XHRcdGJhY2tncm91bmQ6ICNlNGU0ZTQ7XG5cdFx0XHRcdGhlaWdodDogMXB4O1xuXHRcdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRcdG1hcmdpbjogMTVweCAwO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZWN0aW9uIGhlYWRpbmcuXG5cdFx0XHQmLnNlY3Rpb24taGVhZGluZyB7XG5cdFx0XHRcdHBhZGRpbmc6IDIwcHggMDtcblxuXHRcdFx0XHQmLm5vLWRlc2Mge1xuXHRcdFx0XHRcdGgyLFxuXHRcdFx0XHRcdGg0IHtcblx0XHRcdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctZmllbGQge1xuXHRcdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMDVweDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5kZXNjIHtcblx0XHRcdFx0XHRmb250LXN0eWxlOiBub3JtYWw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hlY2tib3ggc2V0dGluZ3MgZmllbGQuXG5cdFx0XHQmLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1jaGVja2JveCB7XG5cblx0XHRcdFx0aW5wdXRbdHlwZT1jaGVja2JveF0ge1xuXHRcdFx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0XHRcdG1hcmdpbjogMXB4IDAgMCAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW5wdXRbdHlwZT1jaGVja2JveF0gKyBsYWJlbCB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIDAgMCA4cHg7XG5cdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LmRlc2Mge1xuXHRcdFx0XHRcdG1hcmdpbjogMCAwIDAgMzBweDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlucHV0W3R5cGU9Y2hlY2tib3hdICsgbGFiZWwgKyAuZGVzYyB7XG5cdFx0XHRcdFx0bWFyZ2luOiA4cHggMCAwIDA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGV4dCBiYXNlZCBzZXR0aW5ncyBmaWVsZC5cblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LXRleHQsXG5cdFx0XHQmLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1wYXNzd29yZCxcblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LW51bWJlcixcblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LWVtYWlsIHtcblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctbGFiZWwge1xuXHRcdFx0XHRcdHBhZGRpbmctdG9wOiA4cHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VsZWN0IHNldHRpbmdzIGZpZWxkLlxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctc2VsZWN0IHtcblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctbGFiZWwge1xuXHRcdFx0XHRcdHBhZGRpbmctdG9wOiA4cHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmFkaW8gc2V0dGluZ3MgZmllbGQuXG5cdFx0XHQmLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1yYWRpbyB7XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWZpZWxkIHtcblxuXHRcdFx0XHRcdGlucHV0W3R5cGU9cmFkaW9dIHtcblx0XHRcdFx0XHRcdG1hcmdpbjogLTNweCAxMHB4IDAgMDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsYWJlbCB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IDMwcHg7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctbm8tYm9yZGVyIHtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogbm9uZTtcblx0XHRcdH1cblxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctbm8tcGFkZGluZyB7XG5cdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJhZGlvIHNldHRpbmdzIGZpZWxkLlxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctY2hlY2tib3gtdG9nZ2xlIHtcblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctZmllbGQge1xuXG5cdFx0XHRcdFx0bGFiZWwge1xuXHRcdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpbnB1dFt0eXBlPWNoZWNrYm94XSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0XHR0b3A6IGF1dG87XG5cdFx0XHRcdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdFx0XHRcdFx0Y2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1xuXHRcdFx0XHRcdFx0d2lkdGg6IDFweDtcblx0XHRcdFx0XHRcdGhlaWdodDogMXB4O1xuXHRcdFx0XHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuXHRcdFx0XHRcdFx0JjpjaGVja2VkICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gge1xuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkcG9zaXRpdmU7XG5cblx0XHRcdFx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdFx0XHRcdC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE2cHgpO1xuXHRcdFx0XHRcdFx0XHRcdC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTZweCk7XG5cdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE2cHgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCY6ZGlzYWJsZWQge1xuXHRcdFx0XHRcdFx0XHQmOmNoZWNrZWQ6aG92ZXIgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXN3aXRjaCxcblx0XHRcdFx0XHRcdFx0Jjpub3QoOmNoZWNrZWQpOmhvdmVyICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQmOm5vdCg6Y2hlY2tlZCk6aG92ZXIgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXN3aXRjaCB7XG5cdFx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2RkZDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXN3aXRjaCB7XG5cdFx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2RkZDtcblx0XHRcdFx0XHRcdFx0XHRjdXJzb3I6IGRlZmF1bHQ7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQmOmNoZWNrZWQgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXN3aXRjaCB7XG5cdFx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogbGlnaHRlbigkcG9zaXRpdmUsIDI1KTtcblx0XHRcdFx0XHRcdFx0XHRjdXJzb3I6IGRlZmF1bHQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0JjpjaGVja2VkICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2ggKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLWNoZWNrZWQtbGFiZWwge1xuXHRcdFx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCY6Y2hlY2tlZCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1jaGVja2VkLWxhYmVsICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS11bmNoZWNrZWQtbGFiZWwge1xuXHRcdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQmOmRpc2FibGVkICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2ggKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLWNoZWNrZWQtbGFiZWwsXG5cdFx0XHRcdFx0XHQmOmRpc2FibGVkICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2ggKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXVuY2hlY2tlZC1sYWJlbCB7XG5cdFx0XHRcdFx0XHRcdGNvbG9yOiBsaWdodGVuKCM0NDQsIDQwKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0JjpjaGVja2VkOmhvdmVyLFxuXHRcdFx0XHRcdFx0JjpjaGVja2VkOmZvY3VzIHtcblx0XHRcdFx0XHRcdFx0JiArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRib3gtc2hhZG93OiAwIDAgMCAxcHggI2ZmZiwgMCAwIDAgM3B4ICRwb3NpdGl2ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQmOm5vdCg6Y2hlY2tlZCk6aG92ZXIsXG5cdFx0XHRcdFx0XHQmOm5vdCg6Y2hlY2tlZCk6Zm9jdXMge1xuXHRcdFx0XHRcdFx0XHQmICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICM5OTk7XG5cdFx0XHRcdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAjOTk5O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS11bmNoZWNrZWQtbGFiZWwsXG5cdFx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1jaGVja2VkLWxhYmVsIHtcblx0XHRcdFx0XHRcdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdFx0XHRcdFx0XHRmb250LXdlaWdodDogNDAwO1xuXHRcdFx0XHRcdFx0Y29sb3I6ICRzZWNvbmRhcnktdGV4dDtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLWNoZWNrZWQtbGFiZWwge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXN3aXRjaCB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xuXHRcdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogMTVweDtcblx0XHRcdFx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHQtbW96LXRyYW5zaXRpb246ICAgIGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0LW1zLXRyYW5zaXRpb246ICAgICBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdHRyYW5zaXRpb246ICAgICAgICAgYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdFx0bWFyZ2luOiAtMXB4IDVweCAwIDA7XG5cdFx0XHRcdFx0XHR3aWR0aDogMzZweDtcblx0XHRcdFx0XHRcdGhlaWdodDogMjBweDtcblxuXHRcdFx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGhlaWdodDogMTZweDtcblx0XHRcdFx0XHRcdFx0d2lkdGg6IDE2cHg7XG5cdFx0XHRcdFx0XHRcdGxlZnQ6IDJweDtcblx0XHRcdFx0XHRcdFx0dG9wOiAycHg7XG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IDUwJTtcblx0XHRcdFx0XHRcdFx0LXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0LW1vei10cmFuc2l0aW9uOiAgICBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0LW1zLXRyYW5zaXRpb246ICAgICBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0dHJhbnNpdGlvbjogICAgICAgICBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbGVyIGltYWdlIHJhZGlvIHNldHRpbmdzIGZpZWxkLlxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctbWFpbGVyIHtcblx0XHRcdFx0cGFkZGluZy1ib3R0b206IDIwcHg7XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1tYWlsZXJzIHtcblxuXHRcdFx0XHRcdC53cC1tYWlsLXNtdHAtbWFpbGVyIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHRcdHdpZHRoOiAxNDBweDtcblx0XHRcdFx0XHRcdG1hcmdpbi1yaWdodDogMTJweDtcblx0XHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDEycHg7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0XHRcdFx0XHRcdC53cC1tYWlsLXNtdHAtbWFpbGVyLWltYWdlIHtcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcblx0XHRcdFx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHRcdFx0XHRib3JkZXI6IDJweCBzb2xpZCAjRTVFNUU1O1xuXHRcdFx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcblx0XHRcdFx0XHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IDc2cHg7XG5cdFx0XHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblx0XHRcdFx0XHRcdFx0LXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0LW1vei10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0LW1zLXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0XHR0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblxuXHRcdFx0XHRcdFx0XHQmLmlzLXJlY29tbWVuZGVkIHtcblx0XHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL3JlY29tbWVuZGVkLnN2Zyk7XG5cdFx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcblx0XHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLXNpemU6IDYwJTtcblx0XHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgcmlnaHQgLTJweDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGltZyB7XG5cdFx0XHRcdFx0XHRcdFx0bWF4LXdpZHRoOiA4MCU7XG5cdFx0XHRcdFx0XHRcdFx0bWF4LWhlaWdodDogNDBweDtcblx0XHRcdFx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0XHRcdFx0dG9wOiA1MCU7XG5cdFx0XHRcdFx0XHRcdFx0bGVmdDogNTAlO1xuXHRcdFx0XHRcdFx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuXHRcdFx0XHRcdFx0XHRcdG9wYWNpdHk6IDAuNjtcblx0XHRcdFx0XHRcdFx0XHQtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0XHRcdC1tb3otdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHRcdFx0LW1zLXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0XHRcdHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCYud3AtbWFpbC1zbXRwLW1haWxlci1zbXRwIC53cC1tYWlsLXNtdHAtbWFpbGVyLWltYWdlIGltZyB7XG5cdFx0XHRcdFx0XHRcdG1heC1oZWlnaHQ6IDMwcHhcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ji5hY3RpdmUge1xuXHRcdFx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLW1haWxlci1pbWFnZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkb3JhbmdlO1xuXG5cdFx0XHRcdFx0XHRcdFx0aW1nIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLW1haWxlci1pbWFnZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAjY2NjO1xuXG5cdFx0XHRcdFx0XHRcdFx0aW1nIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LWFsZXJ0IHtcblx0XHRcdFx0cGFkZGluZy10b3A6IDIwcHg7XG5cdFx0XHRcdHBhZGRpbmctYm90dG9tOiAyNXB4O1xuXG5cdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3cge1xuXHRcdFx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5zZWN0aW9uLWhlYWRpbmcge1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDI1cHg7XG5cblx0XHRcdFx0XHRoMyB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAxMHB4O1xuXHRcdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMThweDtcblx0XHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAyMnB4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC5ub3RpY2Uge1xuXHRcdFx0XHRcdFx0bWFyZ2luLXRvcDogMjBweDtcblxuXHRcdFx0XHRcdFx0cCB7XG5cdFx0XHRcdFx0XHRcdG1hcmdpbjogNi41cHggMDtcblx0XHRcdFx0XHRcdFx0Zm9udC1zaXplOiAxM3B4O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3cge1xuXHRcdFx0XHRcdHBhZGRpbmc6IDAgIWltcG9ydGFudDtcblxuXHRcdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctcm93IHtcblx0XHRcdFx0XHRcdG1hcmdpbi10b3A6IDIwcHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWZpZWxkIHtcblxuXHRcdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtY2hlY2tlZC1sYWJlbCxcblx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXVuY2hlY2tlZC1sYWJlbCB7XG5cdFx0XHRcdFx0XHR0ZXh0LXRyYW5zZm9ybTogbm9uZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctbGFiZWwge1xuXHRcdFx0XHRcdGxhYmVsIHtcblx0XHRcdFx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0LmRhc2hpY29ucy10cmFzaCB7XG5cdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdHRvcDogNnB4O1xuXHRcdFx0XHRcdGNvbG9yOiAjQTdBQUFEO1xuXHRcdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdFx0XHR0cmFuc2l0aW9uOiAwLjJzO1xuXG5cdFx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0XHRjb2xvcjogJG5lZ2F0aXZlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQmI3dwLW1haWwtc210cC1zZXR0aW5nLXJvdy1hbGVydHMtdHdpbGlvX3NtcyB7XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1hbGVydC1jb25uZWN0aW9uLW9wdGlvbnMge1xuXHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHRcdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LWFsZXJ0LWNvbm5lY3Rpb24tb3B0aW9uczpiZWZvcmUge1xuXHRcdFx0XHRcdFx0Y29udGVudDogJyc7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRcdG1heC13aWR0aDogNjA1cHg7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDFweDtcblx0XHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDIwcHg7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjRENEQ0RFO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBHZW5lcmFsIGVsZW1lbnRzLlxuXHRcdFx0aDIsIGg0IHtcblx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdFx0bWFyZ2luOiAwIDAgNnB4IDA7XG5cdFx0XHR9XG5cblx0XHRcdGgyIHtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMTVweDtcblx0XHRcdH1cblxuXHRcdFx0aDMge1xuXHRcdFx0XHRjb2xvcjogJHByaW1hcnktdGV4dDtcblx0XHRcdFx0Zm9udC1zaXplOiAyNHB4O1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0XHRtYXJnaW46IDAgMCAyMHB4IDA7XG5cdFx0XHR9XG5cblx0XHRcdGg1IHtcblx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMjBweCAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwIHtcblx0XHRcdFx0bWFyZ2luOiAxMnB4IDAgMDtcblx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHRsaW5lLWhlaWdodDogMS41ZW07XG5cblx0XHRcdFx0JjpmaXJzdC1vZi10eXBlIHtcblx0XHRcdFx0XHRtYXJnaW46IDhweCAwIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmLmRlc2Mge1xuXHRcdFx0XHRcdG1hcmdpbjogMTBweCAwIDA7XG5cdFx0XHRcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRcdFx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cblx0XHRcdFx0XHQmICsgLmRlc2Mge1xuXHRcdFx0XHRcdFx0Zm9udC1zdHlsZTogbm9ybWFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQmLmJ1dHRvbm5lZCB7XG5cdFx0XHRcdFx0bWFyZ2luLXRvcDogMzBweDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCYuaW5saW5lLW5vdGljZSB7XG5cdFx0XHRcdFx0bWFyZ2luOiA1cHggMCAxNXB4O1xuXHRcdFx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcblx0XHRcdFx0XHRib3JkZXItbGVmdDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuXHRcdFx0XHRcdGJveC1zaGFkb3c6IDAgMXB4IDFweCAwIHJnYmEoIDAsIDAsIDAsIDAuMSApO1xuXG5cdFx0XHRcdFx0Ji5pbmxpbmUtZXJyb3Ige1xuXHRcdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkbmVnYXRpdmU7XG5cdFx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiA1cHg7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiAxMHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQmLmlubGluZS1lZHUtbm90aWNlIHtcblx0XHRcdFx0XHRcdGJvcmRlci1jb2xvcjogIzgwOUVCMDtcblx0XHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAxLjVlbTtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDEwcHg7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YS53cC1tYWlsLXNtdHAtbWFpbGVyLW5vdGljZS1kaXNtaXNzIHtcblx0XHRcdFx0XHRcdGZsb2F0OiByaWdodDtcblx0XHRcdFx0XHRcdGNvbG9yOiAjOTk5REExO1xuXHRcdFx0XHRcdFx0bWFyZ2luOiAwIDAgMTBweCAxMHB4O1xuXHRcdFx0XHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG5cdFx0XHRcdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0XHRcdFx0Y29sb3I6IGRhcmtlbigjOTk5REExLCAyMCUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR1bCB7XG5cdFx0XHRcdG1hcmdpbjogOHB4IDAgMDtcblxuXHRcdFx0XHQmLmxpc3Qge1xuXHRcdFx0XHRcdGxpIHtcblx0XHRcdFx0XHRcdG1hcmdpbi1sZWZ0OiAyMHB4O1xuXHRcdFx0XHRcdFx0bGlzdC1zdHlsZS10eXBlOiBkaXNjO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0YWJsZSB7XG5cdFx0XHRcdCYuYWN0aW9ucy1saXN0IHtcblx0XHRcdFx0XHR0ZCwgdGgge1xuXHRcdFx0XHRcdFx0cGFkZGluZzogNXB4IDVweCA1cHggMDtcblx0XHRcdFx0XHRcdHRleHQtYWxpZ246IGxlZnQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGQge1xuXHRcdFx0XHRcdFx0Ji5lbWFpbCB7XG5cdFx0XHRcdFx0XHRcdHBhZGRpbmctcmlnaHQ6IDJlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCYuc3RhdHVzIHtcblx0XHRcdFx0XHRcdFx0d2lkdGg6IDEwMHB4O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ji5hY3Rpb25zIHtcblx0XHRcdFx0XHRcdFx0YSB7XG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuXHRcdFx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IDVweDtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cblx0XHRcdFx0XHRcdFx0XHQmW2NsYXNzKj1kZWxldGVdLFxuXHRcdFx0XHRcdFx0XHRcdCZbY2xhc3MqPWVycm9yXSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xvcjogJG5lZ2F0aXZlO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQmOmhvdmVyLCAmOmFjdGl2ZSwgJjpmb2N1cyB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbG9yOiBkYXJrZW4oICRuZWdhdGl2ZSwgMjAgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3JtIGVsZW1lbnRzLlxuXHRcdFx0aW5wdXRbdHlwZT10ZXh0XSxcblx0XHRcdGlucHV0W3R5cGU9ZW1haWxdLFxuXHRcdFx0aW5wdXRbdHlwZT1udW1iZXJdLFxuXHRcdFx0aW5wdXRbdHlwZT1wYXNzd29yZF0sXG5cdFx0XHRzZWxlY3Qge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAkZmllbGQtYm9yZGVyO1xuXHRcdFx0XHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdFx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRcdGNvbG9yOiAkZmllbGQtdGV4dDtcblx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdFx0XHRwYWRkaW5nOiA3cHggMTJweDtcblx0XHRcdFx0bWFyZ2luOiAwIDEwcHggMCAwO1xuXHRcdFx0XHR3aWR0aDogNDAwcHg7XG5cdFx0XHRcdG1pbi1oZWlnaHQ6IDM1cHg7XG5cdFx0XHRcdGxpbmUtaGVpZ2h0OiAxLjM7XG5cblx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8ZGVza3RvcFwiKSB7XG5cdFx0XHRcdFx0d2lkdGg6IDMwMHB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8cGhvbmVcIikge1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdG1heC13aWR0aDogdW5zZXQ7XG5cdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiAwO1xuXG5cdFx0XHRcdFx0JiB+IGJ1dHRvbiB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tdG9wOiA4cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0JltyZWFkb25seV0ge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmLnNtYWxsLXRleHQge1xuXHRcdFx0XHRcdHdpZHRoOiA3NXB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Jjpmb2N1cyB7XG5cdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgIzAxNkFBQjtcblx0XHRcdFx0XHRib3gtc2hhZG93OiAwIDAgMCAxcHggIzAxNkFBQjtcblx0XHRcdFx0XHRvdXRsaW5lOiBub25lO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JjpkaXNhYmxlZCB7XG5cdFx0XHRcdFx0b3BhY2l0eTogMC42O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlucHV0W3R5cGU9Y2hlY2tib3hdLFxuXHRcdFx0aW5wdXRbdHlwZT1yYWRpb10ge1xuXHRcdFx0XHQmOmZvY3VzIHtcblx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjMDE2QUFCO1xuXHRcdFx0XHRcdGJveC1zaGFkb3c6IDAgMCAwIDFweCAjMDE2QUFCO1xuXHRcdFx0XHRcdG91dGxpbmU6IG5vbmU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQW5pbWF0ZSBkYXNoaWNvbiB5ZXMgaWNvbiB3aGVuIGNsaWNraW5nIG9uIGNvcHkgYnV0dG9uLlxuXHRcdFx0LndwLW1haWwtc210cC1kYXNoaWNvbnMteWVzLWFsdC1ncmVlbiB7XG5cdFx0XHRcdCYud3AtbWFpbC1zbXRwLWFuaW1hdGUge1xuXHRcdFx0XHRcdC13ZWJraXQtYW5pbWF0aW9uOiB3cC1tYWlsLXNtdHAtZmFkZS1pbi1zdG9wLW91dCAxcyBsaW5lYXI7XG5cdFx0XHRcdFx0YW5pbWF0aW9uOiB3cC1tYWlsLXNtdHAtZmFkZS1pbi1zdG9wLW91dCAxcyBsaW5lYXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmLndwLW1haWwtc210cC1zdWNjZXNzIHtcblx0XHRcdFx0XHRjb2xvcjogJHBvc2l0aXZlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUm93IGxhYmVsIChsZWZ0KS5cblx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctbGFiZWwge1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdHdpZHRoOiAyMDVweDtcblx0XHRcdHBhZGRpbmc6IDAgMjBweCAwIDA7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPHRhYmxldFwiKSB7XG5cdFx0XHRcdGZsb2F0OiBub25lO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0cGFkZGluZy1ib3R0b206IDE1cHg7XG5cdFx0XHR9XG5cblx0XHRcdGxhYmVsIHtcblx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUm93IGZpZWxkIChyaWdodCkuXG5cdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWZpZWxkIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0bWFyZ2luOiAwIDAgMCAyMDVweDtcblx0XHRcdG1heC13aWR0aDogODAwcHg7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPHRhYmxldFwiKSB7XG5cdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdH1cblxuXHRcdFx0aHIge1xuXHRcdFx0XHRtYXJnaW46IDIwcHggMDtcblx0XHRcdH1cblxuXHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWZpZWxkLXJvdyB7XG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdGZsZXgtd3JhcDogd3JhcDtcblxuXHRcdFx0XHQmID4gLndwLW1haWwtc210cC1idG4ge1xuXHRcdFx0XHRcdG1hcmdpbi1yaWdodDogMTBweDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtc3VibWl0IHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDI1cHggMDtcblxuXHRcdFx0LmhlbHAtdGV4dCB7XG5cdFx0XHRcdG1hcmdpbi1sZWZ0OiAxMHB4O1xuXHRcdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE1haWxlciBPcHRpb25zXG5cdFx0LndwLW1haWwtc210cC1tYWlsZXItb3B0aW9ucyB7XG5cdFx0XHQud3AtbWFpbC1zbXRwLW1haWxlci1vcHRpb24ge1xuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LnNlY3Rpb24taGVhZGluZyB7XG5cdFx0XHRcdFx0cGFkZGluZzogMjBweCAwICFpbXBvcnRhbnQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRibG9ja3F1b3RlIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAjRTVFNUU1O1xuXHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuXHRcdFx0XHRcdGNvbG9yOiAjNjY2O1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHRtYXJnaW46IDIwcHggMDtcblx0XHRcdFx0XHRwYWRkaW5nOiAxNXB4O1xuXHRcdFx0XHRcdG1heC13aWR0aDogMTAwNXB4O1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTWlzYy5cblx0XHQmLndwLW1haWwtc210cC1wYWdlLWdlbmVyYWwgcCB7XG5cdFx0XHQvLyBUaGlzIHdpbGwgcmVtb3ZlIGp1bXBpbmVzcy5cblx0XHRcdG1hcmdpbjogMDtcblx0XHR9XG5cblx0XHQubm90aWNlLWlubGluZSB7XG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xuXHRcdFx0Ym9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZmZmO1xuXHRcdFx0Ym94LXNoYWRvdzogMCAxcHggMXB4IDAgcmdiYSggMCwgMCwgMCwgMC4xICk7XG5cdFx0XHRtYXJnaW46IDVweCAwIDE1cHg7XG5cdFx0XHRwYWRkaW5nOiAxcHggMTJweDtcblxuXHRcdFx0Ji5ub3RpY2Utc3VjY2VzcyB7XG5cdFx0XHRcdGJvcmRlci1sZWZ0LWNvbG9yOiAkcG9zaXRpdmU7XG5cdFx0XHR9XG5cblx0XHRcdCYubm90aWNlLXdhcm5pbmcge1xuXHRcdFx0XHRib3JkZXItbGVmdC1jb2xvcjogI2ZmYjkwMDtcblx0XHRcdH1cblxuXHRcdFx0Ji5ub3RpY2UtZXJyb3Ige1xuXHRcdFx0XHRib3JkZXItbGVmdC1jb2xvcjogJG5lZ2F0aXZlO1xuXHRcdFx0fVxuXG5cdFx0XHQmLm5vdGljZS1pbmZvIHtcblx0XHRcdFx0Ym9yZGVyLWxlZnQtY29sb3I6ICMwMGEwZDI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Lm5vdGljZSBwLFxuXHRcdC5ub3RpY2UtaW5saW5lIHAge1xuXHRcdFx0bWFyZ2luOiAwLjVlbSAwO1xuXHRcdFx0cGFkZGluZzogMnB4O1xuXHRcdH1cblxuXHRcdHByZSB7XG5cdFx0XHR3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG5cdFx0fVxuXG5cdFx0Ji5hY3RpdmUge1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0fVxuXG5cdFx0LmNvbm5lY3RlZC1hcyB7XG5cdFx0XHRtYXJnaW4tbGVmdDogJHBhZGRpbmctZGVmYXVsdDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8cGhvbmVcIikge1xuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IDA7XG5cdFx0XHRcdG1hcmdpbi10b3A6IDhweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQjd3AtbWFpbC1zbXRwLXByby1iYW5uZXIge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRcdHBhZGRpbmc6IDI1cHggMjBweDtcblx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkYWRhZGE7XG5cdFx0XHRtYXJnaW46IDEwcHggMCAwIDA7XG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0XHRcdC53cC1tYWlsLXNtdHAtcHJvLWJhbm5lci1kaXNtaXNzIHtcblx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRyaWdodDogMTBweDtcblx0XHRcdFx0dG9wOiAxMHB4O1xuXG5cdFx0XHRcdGJ1dHRvbiB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogbm9uZTtcblx0XHRcdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHRcdFx0Y29sb3I6ICRncmV5O1xuXHRcdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRoMiB7XG5cdFx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0XHRtYXJnaW4tdG9wOiAwO1xuXHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHR9XG5cblx0XHRcdHAge1xuXHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDEuMWVtO1xuXG5cdFx0XHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0LmJlbmVmaXRzIHtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMTZweCAwO1xuXHRcdFx0XHRvdmVyZmxvdzogYXV0bztcblx0XHRcdFx0bWF4LXdpZHRoOiAxMDAwcHg7XG5cblx0XHRcdFx0dWwge1xuXHRcdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdHdpZHRoOiA1MCU7XG5cdFx0XHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cblx0XHRcdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0XHRmbG9hdDogbm9uZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsaSB7XG5cdFx0XHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiAwIDAgMnB4IDE2cHg7XG5cdFx0XHRcdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHRcdFx0XHQmOmJlZm9yZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6ICcrJztcblx0XHRcdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdFx0XHR0b3A6IC0xcHg7XG5cdFx0XHRcdFx0XHRcdGxlZnQ6IDA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCYuYXJyb3ctcmlnaHQ6YmVmb3JlIHtcblx0XHRcdFx0XHRcdFx0Y29udGVudDogJ+KGkic7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGEge1xuXHRcdFx0XHRjb2xvcjogJG9yYW5nZTtcblxuXHRcdFx0XHQmOmhvdmVyLCAmOmFjdGl2ZSwgJjpmb2N1cyB7XG5cdFx0XHRcdFx0Y29sb3I6ICRvcmFuZ2UtZGFyaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQuc3RhcnMge1xuXHRcdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cblx0XHRcdFx0LmRhc2hpY29ucyB7XG5cdFx0XHRcdFx0d2lkdGg6IDE2cHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxNnB4O1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdFx0XHR2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0LnByaWNlLW9mZiB7XG5cdFx0XHRcdGNvbG9yOiAkcG9zaXRpdmU7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW5zIHtcblxuXHRcdCYgPiBkaXZbY2xhc3MqPVwiLWNvbHVtbi1cIl0ge1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0fVxuXG5cdFx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW4tMjAge3dpZHRoOiAyMCV9XG5cdFx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW4tMzMge3dpZHRoOiAzMy4zMzMzMyV9XG5cdFx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW4tNDAge3dpZHRoOiA0MCV9XG5cdFx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW4tNTAge3dpZHRoOiA1MCV9XG5cdFx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW4tNjAge3dpZHRoOiA2MCV9XG5cdFx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW4tODAge3dpZHRoOiA4MCV9XG5cblx0XHQud3AtbWFpbC1zbXRwLWFkbWluLWNvbHVtbi1sYXN0IHtmbG9hdDogcmlnaHQgIWltcG9ydGFudH1cblxuXHRcdCY6YWZ0ZXIge1xuXHRcdFx0Y29udGVudDogXCJcIjtcblx0XHRcdGRpc3BsYXk6IHRhYmxlO1xuXHRcdFx0Y2xlYXI6IGJvdGg7XG5cdFx0fVxuXHR9XG5cblx0Lm5vdGljZSBibG9ja3F1b3RlIHtcblx0XHRtYXJnaW4tbGVmdDogMDtcblx0XHRwYWRkaW5nOiAycHg7XG5cblx0XHRwcmUge1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0d2hpdGUtc3BhY2U6IHByZS1saW5lO1xuXHRcdH1cblx0fVxuXG5cdCN3cC1tYWlsLXNtdHAtcmVzZXQtZmlsdGVyIHtcblx0XHRjbGVhcjogYm90aDtcblx0XHRtYXJnaW46IDIwcHggMDtcblx0XHRwYWRkaW5nOiAxMHB4O1xuXHRcdGZvbnQtc2l6ZTogMTVweDtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0YmFja2dyb3VuZDogI2ZmZjtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjY2NkMGQ0O1xuXHRcdGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDQpO1xuXG5cdFx0YSB7XG5cdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0fVxuXG5cdFx0LnJlc2V0IHtcblx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdGNvbG9yOiAjYTZhNmE2O1xuXHRcdFx0Zm9udC1zaXplOiAxNXB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDE4cHg7XG5cdFx0XHR3aWR0aDogMThweDtcblx0XHRcdGhlaWdodDogMThweDtcblxuXHRcdFx0Jjpmb2N1cyxcblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRjb2xvcjogJG5lZ2F0aXZlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFRvb2xzIC0+IERlYnVnIEV2ZW50cyB0YWIgc3R5bGVzLlxuXHQud3AtbWFpbC1zbXRwLXRhYi10b29scy1kZWJ1Zy1ldmVudHMge1xuXHRcdEBpbmNsdWRlIG1lZGlhKFwiPnRhYmxldFwiKSB7XG5cdFx0XHR0aCNldmVudCB7XG5cdFx0XHRcdHdpZHRoOiAxMzBweDtcblx0XHRcdH1cblx0XHRcdHRoI3R5cGUge1xuXHRcdFx0XHR3aWR0aDogODBweDtcblx0XHRcdH1cblx0XHRcdHRoI2luaXRpYXRvciB7XG5cdFx0XHRcdHdpZHRoOiAyMCU7XG5cdFx0XHR9XG5cdFx0XHR0aCNjcmVhdGVkX2F0IHtcblx0XHRcdFx0d2lkdGg6IDIwMHB4O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEZsYXRwaWNrZXIgKGRhdGUgcGlja2VyKSBzdHlsZSBpbiB0aGUgV1AgTGlzdCBUYWJsZSBmaWx0ZXIuXG5cdC53cC1tYWlsLXNtdHAtZmlsdGVyLWRhdGUge1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8PXRhYmxldFwiKSB7XG5cdFx0XHRkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG5cdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdFx0YWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG5cdFx0XHRmbG9hdDogbm9uZTtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0cGFkZGluZy1yaWdodDogMDtcblx0XHRcdG1hcmdpbi1ib3R0b206IDEwcHg7XG5cdFx0XHRtYXgtd2lkdGg6IDYwMHB4O1xuXHRcdH1cblxuXHRcdCZfX2NvbnRyb2wge1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0XHRtYXJnaW46IDAgNXB4IDAgMDtcblx0XHRcdG1pbi1oZWlnaHQ6IDMwcHg7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHRcdG1heC13aWR0aDogMjEwcHg7XG5cdFx0XHRsaW5lLWhlaWdodDogbm9ybWFsO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9dGFibGV0XCIpIHtcblx0XHRcdFx0ZmxleC1ncm93OiAxO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0bWF4LXdpZHRoOiBub25lO1xuXHRcdFx0XHRtaW4taGVpZ2h0OiA0MHB4O1xuXHRcdFx0XHRtYXJnaW4tcmlnaHQ6IDA7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDVweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmX19idG4ge1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0dmVydGljYWwtYWxpZ246IHRvcDtcblx0XHR9XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlIHtcblx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuXHRcdCZfX3N3aXRjaCB7XG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogMTVweDtcblx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHQtbW96LXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0LW1zLXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0dHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0bWFyZ2luOiAtMXB4IDAgMCAwO1xuXHRcdFx0d2lkdGg6IDM2cHg7XG5cdFx0XHRoZWlnaHQ6IDIwcHg7XG5cblx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRjb250ZW50OiBcIlwiO1xuXHRcdFx0XHRoZWlnaHQ6IDE2cHg7XG5cdFx0XHRcdHdpZHRoOiAxNnB4O1xuXHRcdFx0XHRsZWZ0OiAycHg7XG5cdFx0XHRcdHRvcDogMnB4O1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdC1tb3otdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdC1tcy10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0dHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aW5wdXRbdHlwZT1jaGVja2JveF0ge1xuXHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0dG9wOiBhdXRvO1xuXHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcblx0XHRcdHdpZHRoOiAxcHg7XG5cdFx0XHRoZWlnaHQ6IDFweDtcblx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cblx0XHRcdCY6Y2hlY2tlZCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICRwb3NpdGl2ZTtcblxuXHRcdFx0XHQmOmJlZm9yZSB7XG5cdFx0XHRcdFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTZweCk7XG5cdFx0XHRcdFx0LW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxNnB4KTtcblx0XHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTZweCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0JjpjaGVja2VkOmhvdmVyLFxuXHRcdFx0JjpjaGVja2VkOmZvY3VzIHtcblx0XHRcdFx0JiArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAjMDBhMzJhO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCY6bm90KDpjaGVja2VkKTpob3Zlcixcblx0XHRcdCY6bm90KDpjaGVja2VkKTpmb2N1cyB7XG5cdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlX19zd2l0Y2gge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICM5OTk7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAjOTk5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCY6ZGlzYWJsZWQge1xuXHRcdFx0XHQmOmNoZWNrZWQ6aG92ZXIgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlX19zd2l0Y2gsXG5cdFx0XHRcdCY6bm90KDpjaGVja2VkKTpob3ZlciArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6bm90KDpjaGVja2VkKTpob3ZlciArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2RkZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlX19zd2l0Y2gge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG5cdFx0XHRcdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JjpjaGVja2VkICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZV9fc3dpdGNoIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGVuKCMwMGEzMmEsIDI1KTtcblx0XHRcdFx0XHRjdXJzb3I6IGRlZmF1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy8gQnV0dG9ucy5cbi53cC1tYWlsLXNtdHAtYnRuIHtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRtYXJnaW46IDA7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHR0ZXh0LXNoYWRvdzogbm9uZTtcblx0Ym94LXNoYWRvdzogbm9uZTtcblx0b3V0bGluZTogbm9uZTtcblxuXHQuZGFzaGljb25zIHtcblx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0d2lkdGg6IDE2cHg7XG5cdFx0aGVpZ2h0OiAxNnB4O1xuXHR9XG5cblx0JjpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC41O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tbWQge1xuXHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRcdG1pbi1oZWlnaHQ6IDM1cHg7XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tbGcge1xuXHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdHBhZGRpbmc6IDE2cHggMjhweDtcblx0fVxuXG5cdCYud3AtbWFpbC1zbXRwLWJ0bi11cGdyYWRlLFxuXHQmLndwLW1haWwtc210cC1idG4tY3RhIHtcblx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0XHRwYWRkaW5nOiAxNHB4IDMwcHg7XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tb3JhbmdlIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkb3JhbmdlO1xuXHRcdGJvcmRlci1jb2xvcjogJG9yYW5nZTtcblx0XHRjb2xvcjogI2ZmZjtcblxuXHRcdCY6aG92ZXIsXG5cdFx0JjphY3RpdmUsXG5cdFx0Jjpmb2N1cyB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkb3JhbmdlLWRhcms7XG5cdFx0XHRib3JkZXItY29sb3I6ICRvcmFuZ2UtZGFyaztcblx0XHRcdGNvbG9yOiAjRkZGRkZGO1xuXHRcdH1cblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAkb3JhbmdlLWRhcms7XG5cdFx0fVxuXHR9XG5cblx0Ji53cC1tYWlsLXNtdHAtYnRuLXJlZCB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogJG5lZ2F0aXZlO1xuXHRcdGJvcmRlci1jb2xvcjogJG5lZ2F0aXZlO1xuXHRcdGNvbG9yOiAjZmZmO1xuXG5cdFx0Jjpob3Zlcixcblx0XHQmOmFjdGl2ZSxcblx0XHQmOmZvY3VzIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNiMzJkMmU7XG5cdFx0XHRib3JkZXItY29sb3I6ICNiMzJkMmU7XG5cdFx0XHRjb2xvcjogI0ZGRkZGRjtcblx0XHR9XG5cblx0XHQmOmZvY3VzIHtcblx0XHRcdGJveC1zaGFkb3c6IDAgMCAwIDFweCAjZmZmLCAwIDAgMCAzcHggI2IzMmQyZTtcblx0XHR9XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tZ3JleSB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5O1xuXHRcdGNvbG9yOiAjNTU1NTU1O1xuXG5cdFx0Jjpob3Zlcixcblx0XHQmOmFjdGl2ZSxcblx0XHQmOmZvY3VzIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG5cdFx0XHRib3JkZXItY29sb3I6ICM1NTU1NTU7XG5cdFx0XHRjb2xvcjogIzQ0NDtcblx0XHR9XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tbGlnaHQtZ3JleSB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuXHRcdGNvbG9yOiAjNjY2O1xuXG5cdFx0Jjpob3Zlcixcblx0XHQmOmFjdGl2ZSxcblx0XHQmOmZvY3VzIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG5cdFx0XHRjb2xvcjogIzQ0NDtcblx0XHR9XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tYmx1ZWlzaCB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogIzczOGU5ZTtcblx0XHRib3JkZXItY29sb3I6ICM3MzhlOWU7XG5cdFx0Y29sb3I6ICNmZmY7XG5cblx0XHQmOmhvdmVyLFxuXHRcdCY6YWN0aXZlLFxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogIzM5NTM2MDtcblx0XHRcdGJvcmRlci1jb2xvcjogIzM5NTM2MDtcblx0XHRcdGNvbG9yOiAjZmZmO1xuXHRcdH1cblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAjMzk1MzYwO1xuXHRcdH1cblx0fVxufVxuXG5hLndwLW1haWwtc210cC1idG4ud3AtbWFpbC1zbXRwLWJ0bi1tZCB7XG5cdGxpbmUtaGVpZ2h0OiAxOXB4O1xufVxuXG4vLyBEb21haW4gQ2hlY2tlciBSZXN1bHRzIHNlY3Rpb24gb24gRW1haWwgVGVzdCB0YWIuXG4jd3AtbWFpbC1zbXRwLWRvbWFpbi1jaGVjay1kZXRhaWxzIHtcblx0aDIge1xuXHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRsaW5lLWhlaWdodDogMjRweDtcblx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdG1hcmdpbjogMjhweCAwIDIzcHg7XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLWRvbWFpbi1jaGVjay1kZXRhaWxzLWNoZWNrLWxpc3Qge1xuXG5cdFx0Ji1pdGVtIHtcblx0XHRcdHBhZGRpbmc6IDI1cHggMDtcblx0XHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjRTRFNEU0O1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblxuXHRcdFx0JjpsYXN0LWNoaWxkIHtcblx0XHRcdFx0cGFkZGluZy1ib3R0b206IDA7XG5cdFx0XHR9XG5cblx0XHRcdCYtaWNvbiB7XG5cdFx0XHRcdHdpZHRoOiAxOHB4O1xuXHRcdFx0XHRoZWlnaHQ6IDE2cHg7XG5cdFx0XHRcdG1hcmdpbi1yaWdodDogMTBweDtcblx0XHRcdH1cblxuXHRcdFx0Ji1jb250ZW50IHtcblx0XHRcdFx0aDMge1xuXHRcdFx0XHRcdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDE3cHg7XG5cdFx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIDAgNHB4IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwIHtcblx0XHRcdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMjBweDtcblx0XHRcdFx0XHRtYXJnaW46IDAgMCAxMHB4IDA7XG5cblx0XHRcdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLyBFbWFpbCBUZXN0IFRhYi5cbi53cC1tYWlsLXNtdHAtdGFiLXRvb2xzLXRlc3Qge1xuXG5cdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3cuc2VjdGlvbi1oZWFkaW5nIHtcblx0XHRtYXJnaW4tYm90dG9tOiAyMnB4O1xuXHR9XG5cblx0LndwLW1haWwtc210cC10ZXN0LWVtYWlsLXJlc2VuZCB7XG5cdFx0cGFkZGluZy10b3A6IDIycHg7XG5cdFx0bWFyZ2luLXRvcDogMjJweDtcblx0XHRib3JkZXItdG9wOiAxcHggc29saWQgI0U0RTRFNDtcblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtdGVzdC1lbWFpbC1yZXNlbmQgYSB7XG5cdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdG91dGxpbmU6IG5vbmU7XG5cdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0fVxuXG5cdCNlbWFpbC10ZXN0LXN1Y2Nlc3Mge1xuXHRcdG1hcmdpbi10b3A6IDMwcHg7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG5cdFx0c3ZnIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0bWF4LXdpZHRoOiA1MDBweDtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0aGVpZ2h0OiBhdXRvO1xuXHRcdFx0bWFyZ2luOiAwIGF1dG8gMjJweDtcblx0XHR9XG5cblx0XHRoMiB7XG5cdFx0XHRtYXJnaW4tdG9wOiAwO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0XHRmb250LXNpemU6IDI0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjlweDtcblx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdH1cblxuXHRcdHAge1xuXHRcdFx0bWFyZ2luLXRvcDogMDtcblx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAyNHB4O1xuXHRcdFx0Y29sb3I6ICRzZWNvbmRhcnktdGV4dDtcblx0XHR9XG5cdH1cblxuXHQjZW1haWwtdGVzdC1mb3JtIHtcblxuXHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3cuc2VjdGlvbi1oZWFkaW5nIHtcblx0XHRcdG1hcmdpbi1ib3R0b206IDA7XG5cdFx0fVxuXG5cdFx0LndwLW1haWwtc210cC1idG4ge1xuXHRcdFx0bWluLXdpZHRoOiA5NXB4O1xuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtbG9hZGluZyB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogLTJweDtcblx0XHR9XG5cdH1cblxuXHQjd3AtbWFpbC1zbXRwLWRlYnVnIHtcblx0XHRtYXJnaW4tdG9wOiAyNXB4O1xuXG5cdFx0aDIge1xuXHRcdFx0bWFyZ2luOiAyMHB4IDAgMTBweDtcblx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdH1cblxuXHRcdHAge1xuXHRcdFx0bWFyZ2luOiAxMHB4IDA7XG5cdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0fVxuXG5cdFx0dWwge1xuXHRcdFx0bGlzdC1zdHlsZS10eXBlOiBkaXNjO1xuXHRcdH1cblxuXHRcdHVsLFxuXHRcdG9sIHtcblx0XHRcdG1hcmdpbjogMTBweCAwIDEwcHggMTVweDtcblx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjBweDtcblxuXHRcdFx0bGkge1xuXHRcdFx0XHRtYXJnaW46IDAgMCA4cHggMDtcblxuXHRcdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dWwge1xuXHRcdFx0XHRcdGxpc3Qtc3R5bGUtdHlwZTogZGlzYztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5kYXNoaWNvbnMtc3Rhci1maWxsZWQge1xuXHRcdFx0Y29sb3I6ICRvcmFuZ2U7XG5cdFx0XHR3aWR0aDogMTZweDtcblx0XHRcdGhlaWdodDogMTZweDtcblx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDtcblx0XHR9XG5cblx0XHQucHJpY2Utb2ZmIHtcblx0XHRcdGNvbG9yOiAkcG9zaXRpdmU7XG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdH1cblxuXHRcdC5lcnJvci1sb2ctYnV0dG9uLWNvbnRhaW5lciB7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAyMnB4O1xuXHRcdH1cblxuXHRcdC5lcnJvci1sb2ctdG9nZ2xlIHtcblx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAxMHB4O1xuXHRcdH1cblxuXHRcdC5lcnJvci1sb2ctY29weSB7XG5cdFx0XHRtaW4td2lkdGg6IDEyMnB4O1xuXG5cdFx0XHQuZXJyb3ItbG9nLWNvcHktYmFjayB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LmVycm9yLWxvZy1jb3B5LWNvcGllZCB7XG5cblx0XHRcdC5lcnJvci1sb2ctY29weS1mcm9udCB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cblx0XHRcdC5lcnJvci1sb2ctY29weS1iYWNrIHtcblx0XHRcdFx0ZGlzcGxheTogaW5saW5lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5lcnJvci1sb2cge1xuXHRcdFx0cGFkZGluZy10b3A6IDEwcHg7XG5cdFx0XHRwYWRkaW5nLWJvdHRvbTogMTBweDtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cblx0XHRcdCYuZXJyb3ItbG9nLXNlbGVjdGlvbiB7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG5cdFx0XHRcdG9wYWNpdHk6IDA7XG5cdFx0XHRcdGhlaWdodDogMDtcblx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmUge1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi53cC1tYWlsLXNtdHAtdGFiLXRvb2xzLWFjdGlvbi1zY2hlZHVsZXIge1xuXG5cdC53cC1tYWlsLXNtdHAtcGFnZS1jb250ZW50IHtcblx0XHQud3JhcCwgLnN1YnN1YnN1YiB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0fVxuXG5cdFx0JiA+IGgxIHtcblx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0Zm9udC1zaXplOiAyMHB4O1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdG1hcmdpbjogMCAwIDE1cHggMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0fVxuXG5cdFx0JiA+IHAge1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdH1cblxuXHRcdGgxLndwLWhlYWRpbmctaW5saW5lLFxuXHRcdHNwYW4uc3VidGl0bGUge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cblx0XHRoci53cC1oZWFkZXItZW5kIHtcblx0XHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHRcdG1hcmdpbjogLTJweCAwIDA7XG5cdFx0fVxuXHR9XG59XG5cbi53cC1tYWlsLXNtdHAtYWRtaW4tcGFnZS1ib2R5IHtcblxuXHQvKiBMaWdodGJveCBsaWJyYXJ5IGdsb2JhbCBzdHlsZXMuICovXG5cdC5saXR5IHtcblx0XHR6LWluZGV4OiA5OTk5OTk5OTk7XG5cdFx0cGFkZGluZzogMjBweDtcblx0fVxuXG5cdC5saXR5LWNsb3NlIHtcblx0XHRtYXJnaW46IDEwcHg7XG5cdH1cblxuXHQubGl0eS1jb250ZW50IHtcblx0XHRtYXgtd2lkdGg6IDgwdnc7XG5cdFx0bWF4LWhlaWdodDogODB2aDtcblxuXHRcdGltZyB7XG5cdFx0XHRtYXgtaGVpZ2h0OiA4MHZoICFpbXBvcnRhbnQ7XG5cdFx0XHRtYXgtd2lkdGg6IDgwdncgIWltcG9ydGFudDtcblx0XHR9XG5cdH1cblxuXHQjd3Bmb290ZXIge1xuXG5cdFx0YSB7XG5cdFx0XHRjb2xvcjogJGxpbmsgIWltcG9ydGFudDtcblxuXHRcdFx0Jjpob3Zlcixcblx0XHRcdCY6YWN0aXZlIHtcblx0XHRcdFx0Y29sb3I6ICRsaW5rLWhvdmVyICFpbXBvcnRhbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vIFRoZSBzaW5nbGUgRGVidWcgRXZlbnQgcG9wdXAgcHJldmlldy5cbi53cC1tYWlsLXNtdHAtZGVidWctZXZlbnQtcHJldmlldyB7XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cblx0aDQge1xuXHRcdG1hcmdpbjogMTVweCAwO1xuXHRcdGZvbnQtc2l6ZTogMThweDtcblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtZGVidWctZXZlbnQtcHJldmlldy1zdWJ0aXRsZSB7XG5cdFx0bWFyZ2luLWJvdHRvbTogMzBweDtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cblx0XHRzcGFuIHtcblx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjJweDtcblx0XHR9XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLWRlYnVnLWV2ZW50LXJvdyB7XG5cdFx0cGFkZGluZzogMjBweCAwO1xuXHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkZGRkO1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0anVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRsaW5lLWhlaWdodDogMjJweDtcblxuXHRcdC5kZWJ1Zy1ldmVudC1sYWJlbCB7XG5cdFx0XHR3aWR0aDogNjBweDtcblx0XHRcdG1hcmdpbi1yaWdodDogMzBweDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0fVxuXG5cdFx0LmRlYnVnLWV2ZW50LXZhbHVlIHtcblx0XHRcdHdpZHRoOiBjYWxjKCAxMDAlIC0gOTBweCApO1xuXHRcdH1cblxuXHRcdC5kZWJ1Zy1ldmVudC1pbml0aWF0b3Ige1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogNXB4O1xuXHRcdH1cblxuXHRcdC5kZWJ1Zy1ldmVudC1jb2RlIHtcblx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0fVxuXG5cdFx0JjpsYXN0LWNoaWxkIHtcblx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkO1xuXHRcdH1cblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtZGVidWctZXZlbnQtcHJldmlldy1jb250ZW50IHtcblx0XHQ+IGRpdiB7XG5cdFx0XHR3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuXHRcdH1cblx0fVxufVxuXG5bY2xhc3NePVwid3AtbWFpbC1zbXRwLWRhc2hpY29uc1wiXSB7XG5cdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0d2lkdGg6IDIwcHg7XG5cdGhlaWdodDogMjBweDtcbn1cblxuLndwLW1haWwtc210cC1kYXNoaWNvbnMteWVzLWFsdC1ncmVlbiB7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL2ljb25zL2Rhc2hpY29ucy9kYXNoaWNvbnMteWVzLWFsdC1ncmVlbi5zdmcnKTtcbn1cblxuLndwLW1haWwtc210cC1kYXNoaWNvbnMtcGRmLWdyYXkge1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9pY29ucy9kYXNoaWNvbnMvZGFzaGljb25zLXBkZi1ncmV5LnN2ZycpO1xufVxuIl19 */ +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9nZW5lcmFsLnNjc3MiLCJfaW5jbHVkZS1tZWRpYS5zY3NzIiwiX2NvbmZpcm0uc2NzcyIsIl92YXJpYWJsZXMuc2NzcyIsIl9lZHVjYXRpb24uc2NzcyIsIl9sb2FkZXIuc2NzcyIsIl9mbHlvdXQtbWVudS5zY3NzIiwiX3Rvb2x0aXAuc2NzcyIsIl9jb25kaXRpb25hbC1sb2dpYy5zY3NzIiwic210cC1hZG1pbi5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQTtFQUNDO0VBQ0E7O0FDNGlCQTtFRDlpQkQ7SUFLRTs7OztBQ3lpQkQ7RURyaUJEO0lBRUU7Ozs7QUFLRjtFQUNDO0lBQVU7O0VBQ1Y7SUFBTTs7RUFDTjtJQUFNOzs7QUFHUDtFQUNDO0lBQVU7O0VBQ1Y7SUFBTTs7RUFDTjtJQUFNOzs7QUVyQkw7QUFBQTtBQUFBO0VBR0M7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBOztBQUVBO0VBQ0M7O0FBSUY7RUFDQztFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0FBQUE7RUFFQzs7QUFJRjtFQUNDO0VBQ0EsT0NyRFU7RURzRFY7RUFDQTs7QUFJRjtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBOztBQUlGO0VBQ0M7RUFDQSxPQ3ZFVztFRHdFWDs7QUFFQTtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQzs7QUFJRjtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7O0FBS0g7RUFDQzs7QUFFQTtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0Esa0JDdElHOztBRHlJSjtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBRUM7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7O0FBS0g7RUFDQyxjQzdKVTs7QUQrSlY7RUFDQyxrQkNoS1M7RURpS1QsY0NqS1M7O0FEcUtYO0VBQ0MsY0N2S1c7O0FEeUtYO0VBQ0Msa0JDMUtVO0VEMktWLGNDM0tVOztBRCtLWjtFQUNDLGNDOUtROztBRGdMUjtFQUNDLGtCQ2pMTztFRGtMUCxjQ2xMTzs7QURzTFQ7RUFDQyxjQ3RMUzs7QUR3TFQ7RUFDQyxrQkN6TFE7RUQwTFIsY0MxTFE7O0FEOExWO0VBQ0M7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUlGO0VBQ0M7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EscUJDck9JO0VEc09KO0VBQ0E7O0FBS0g7RUFDQztFQUNBOztBQUVBO0VBQ0M7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7O0FBRUE7RUFDQzs7QUFLSDtFQUNDOztBQUdEO0VBQ0Msa0JDblFLO0VEb1FMLGNDcFFLOztBRHVRTjtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFJRjtFQUNDO0VBQ0EsT0MvUk07O0FEa1NQO0VBQ0M7RUFDQTtFQUNBOzs7QUU5U0w7RUFDQztJQUNDOzs7QUFJRjtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQSxPRHJCZTtFQ3NCZjtFQUNBOztBQUdEO0VBQ0MsT0RyQk87O0FDd0JSO0VBQ0MsT0R4Qlk7O0FDMkJiO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0M7RUFDQTtFQUNBOzs7QUFHRDtBQUVDO0FBd0xBO0FBd0NBO0FBYUE7O0FBMU9DO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7O0FBSUY7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPRHBIWTs7QUNzSFo7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFJRjtFQUNDO0VBQ0E7RUFDQSxPRG5JYztFQ29JZDtFQUNBOztBQUdEO0VBQ0M7RUFDQTs7QUhtYUY7RUdyYUM7SUFLRTs7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTs7QUh5Wkg7RUc3WkU7SUFPRTtJQUNBOzs7QUFHRDtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBR0Q7RUFDQzs7QUFJRjtFQUNDO0VBQ0E7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBLE9EdE1ZOztBQzBNZDtFQUNDOztBQUdEO0VBQ0M7O0FBTUQ7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBLE9EM05XOztBQzhOWjtFQUNDO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLE9ENU9ZOztBQzhPWjtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBOztBQVVKO0VBQ0M7RUFDQTs7QUFFQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTtFQUNBLE9EM1FXO0VDNFFYO0VBQ0E7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUdEO0VBQ0M7O0FBR0Q7RUFDQzs7QUFRRjtFQUNDO0VBQ0E7O0FBR0Q7RUFDQzs7QUFNRDtFQUNDO0VBQ0E7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTs7QUFHRDtFQUNDOztBQUVBO0VBQ0M7O0FBR0Q7RUFDQzs7QUFJRjtFQUNDOzs7QUFLSDtBQUVDOztBQUdDO0VBQ0M7O0FBRUE7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUNsV0o7RUFDQzs7O0FBR0Q7RUFDQztFQUNBOzs7QUFHRDtFQUNDO0VBQ0E7OztBQUlEO0VBQ0M7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNDO0lBQ0M7O0VBRUQ7SUFDQzs7O0FDekNGO0VBTUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBTGdpQkE7RUszaUJEO0lBY0U7OztBQUdEO0VBQ0M7O0FBRUE7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBOztBQUlGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxZSHRFVztFR3VFWDs7QUFFQTtFQUNDOztBQUlBO0VBQ0M7O0FBREQ7RUFDQzs7QUFERDtFQUNDOztBQUREO0VBQ0M7O0FBREQ7RUFDQzs7QUFJRjtFQUNDOztBQUVBO0VBQ0M7O0FBT0Y7RUFDQztFQUNBO0VBQ0E7O0FBS0E7RUFDQzs7QUFHRDtFQUNDOztBQUtEO0VBQ0M7O0FBREQ7RUFDQzs7QUFERDtFQUNDOztBQUREO0VBQ0M7O0FBREQ7RUFDQzs7QUFLSDtFQUNDO0VBQ0E7OztBQ2pKRjtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPSkpnQjtFSUtoQjs7QUFFQTtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFJRjtFQUNDOzs7QUNqQ0E7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7O0FQNGhCRjtFT3poQkM7SUFHRTtJQUNBOzs7QUFHRDtBQUFBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDQzs7QVB3Z0JGO0VPemdCQztJQUlFOzs7QUFJRjtFQUNDOztBUGdnQkY7RU9qZ0JDO0lBSUU7OztBQUlGO0VBQ0M7O0FQd2ZGO0VPemZDO0lBSUU7OztBQUlGO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDLE9MckVPOztBS3lFVDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPTHpGZ0I7OztBTVNuQjtBQUFBO0VBRUM7OztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUNDO0VBQ0E7O0FBRUE7RUFDQztFQUNBO0VBQ0E7O0FSOGdCRDtFUWpoQkE7SUFNRTs7OztBQUtIO0VBQ0MsT056Q2M7O0FNMkNkO0VBQ0MsT05uQ0s7O0FNcUNMO0VBRUMsT050Q1U7OztBTTJDYjtFQUNDOztBQUVBO0VBQ0M7O0FBR0Q7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQzs7QUFHRDtFQUNDOztBQUlGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBUm1kRjtFUXpkQztJQVNFOzs7QUFJRjtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDQzs7QUFFQTtBQUFBO0FBQUE7RUFHQztFQUNBO0VBQ0E7O0FBSUE7RUFDQztFQUNBOztBQUVEO0VBQ0M7RUFDQTtFQUNBOztBQUtGO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQzs7QVJvYUg7RVEzYUM7SUFXRTs7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUlEO0VBQ0M7O0FBR0M7QUFBQTtFQUVDOztBQUlGO0VBQ0M7RUFDQTs7QUFHRDtFQUNDOztBQU9EO0VBQ0M7RUFDQTs7QUFHRDtFQUNDO0VBQ0E7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDOztBQVVEO0VBQ0M7O0FBT0Q7RUFDQzs7QUFTQTtFQUNDOztBQUdEO0VBQ0M7RUFDQTs7QUFNSDtFQUNDOztBQUdEO0VBQ0M7O0FBUUM7RUFDQztFQUNBOztBQUdEO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQyxrQk41UEk7O0FNOFBKO0VBQ0M7RUFDQTtFQUNBOztBQUtEO0VBRUM7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7O0FBR0Q7RUFDQztFQUNBOztBQUlGO0VBQ0M7O0FBR0Q7RUFDQzs7QUFHRDtFQUVDOztBQUtBO0VBQ0M7O0FBTUQ7RUFDQztFQUNBOztBQUtIO0FBQUE7RUFFQztFQUNBO0VBQ0EsT05yVVc7RU1zVVg7O0FBR0Q7RUFDQzs7QUFHRDtFQUNDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQU9KO0VBQ0M7O0FBSUM7RUFDQztFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0M7RUFDQTtFQUNBO0VBQ0EsZU5sV1M7RU1tV1Q7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNDO0VBQ0E7RUFDQTtFQUNBOztBQUdEO0VBQ0M7RUFDQTtF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RGY7RUFDQzs7QUFLRDtFQUNDOzs7QUFLSDtFQUNDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFDQzs7O0FBR0Q7RUFDQyIsImZpbGUiOiJhc3NldHMvY3NzL3NtdHAtYWRtaW4uY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29yZSBhZG1pbiBzdHlsZSBvdmVycmlkZXMuXG4jd3Bjb250ZW50IHtcblx0cGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdHBhZGRpbmctdG9wOiA0NnB4O1xuXHR9XG59XG5cbiN3cGJvZHkge1xuXHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdHBhZGRpbmctdG9wOiAwO1xuXHR9XG59XG5cbi8vIEZhZGUgaW4tb3V0IHdpdGggYSBcInBlYWsgc3RvcFwiIGFuaW1hdGlvbi5cbkAtd2Via2l0LWtleWZyYW1lcyB3cC1tYWlsLXNtdHAtZmFkZS1pbi1zdG9wLW91dCB7XG5cdDAlLDEwMCUgeyBvcGFjaXR5OiAwIH1cblx0MzUlIHsgb3BhY2l0eTogMSB9XG5cdDY1JSB7IG9wYWNpdHk6IDEgfVxufVxuXG5Aa2V5ZnJhbWVzIHdwLW1haWwtc210cC1mYWRlLWluLXN0b3Atb3V0IHtcblx0MCUsMTAwJSB7IG9wYWNpdHk6IDAgfVxuXHQzNSUgeyBvcGFjaXR5OiAxIH1cblx0NjUlIHsgb3BhY2l0eTogMSB9XG59XG4iLCJAY2hhcnNldCBcIlVURi04XCI7XG5cbi8vICAgICBfICAgICAgICAgICAgXyAgICAgICAgICAgXyAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gX1xuLy8gICAgKF8pICAgICAgICAgIHwgfCAgICAgICAgIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IChfKVxuLy8gICAgIF8gXyBfXyAgIF9fX3wgfF8gICBfICBfX3wgfCBfX18gICBfIF9fIF9fXyAgIF9fXyAgX198IHxfICBfXyBfXG4vLyAgICB8IHwgJ18gXFwgLyBfX3wgfCB8IHwgfC8gX2AgfC8gXyBcXCB8ICdfIGAgXyBcXCAvIF8gXFwvIF9gIHwgfC8gX2AgfFxuLy8gICAgfCB8IHwgfCB8IChfX3wgfCB8X3wgfCAoX3wgfCAgX18vIHwgfCB8IHwgfCB8ICBfXy8gKF98IHwgfCAoX3wgfFxuLy8gICAgfF98X3wgfF98XFxfX198X3xcXF9fLF98XFxfXyxffFxcX19ffCB8X3wgfF98IHxffFxcX19ffFxcX18sX3xffFxcX18sX3xcbi8vXG4vLyAgICAgIFNpbXBsZSwgZWxlZ2FudCBhbmQgbWFpbnRhaW5hYmxlIG1lZGlhIHF1ZXJpZXMgaW4gU2Fzc1xuLy8gICAgICAgICAgICAgICAgICAgICAgICB2MS40Ljlcbi8vXG4vLyAgICAgICAgICAgICAgICBodHRwOi8vaW5jbHVkZS1tZWRpYS5jb21cbi8vXG4vLyAgICAgICAgIEF1dGhvcnM6IEVkdWFyZG8gQm91Y2FzIChAZWR1YXJkb2JvdWNhcylcbi8vICAgICAgICAgICAgICAgICAgSHVnbyBHaXJhdWRlbCAoQGh1Z29naXJhdWRlbClcbi8vXG4vLyAgICAgIFRoaXMgcHJvamVjdCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBsaWNlbnNlXG5cblxuLy8vL1xuLy8vIGluY2x1ZGUtbWVkaWEgbGlicmFyeSBwdWJsaWMgY29uZmlndXJhdGlvblxuLy8vIEBhdXRob3IgRWR1YXJkbyBCb3VjYXNcbi8vLyBAYWNjZXNzIHB1YmxpY1xuLy8vL1xuXG5cbi8vL1xuLy8vIENyZWF0ZXMgYSBsaXN0IG9mIGdsb2JhbCBicmVha3BvaW50c1xuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIENyZWF0ZXMgYSBzaW5nbGUgYnJlYWtwb2ludCB3aXRoIHRoZSBsYWJlbCBgcGhvbmVgXG4vLy8gICRicmVha3BvaW50czogKCdwaG9uZSc6IDMyMHB4KTtcbi8vL1xuJGJyZWFrcG9pbnRzOiAoXG4gICdwaG9uZSc6IDMyMHB4LFxuICAndGFibGV0JzogNzY4cHgsXG4gICdkZXNrdG9wJzogMTAyNHB4XG4pICFkZWZhdWx0O1xuXG5cbi8vL1xuLy8vIENyZWF0ZXMgYSBsaXN0IG9mIHN0YXRpYyBleHByZXNzaW9ucyBvciBtZWRpYSB0eXBlc1xuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIENyZWF0ZXMgYSBzaW5nbGUgbWVkaWEgdHlwZSAoc2NyZWVuKVxuLy8vICAkbWVkaWEtZXhwcmVzc2lvbnM6ICgnc2NyZWVuJzogJ3NjcmVlbicpO1xuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIENyZWF0ZXMgYSBzdGF0aWMgZXhwcmVzc2lvbiB3aXRoIGxvZ2ljYWwgZGlzanVuY3Rpb24gKE9SIG9wZXJhdG9yKVxuLy8vICAkbWVkaWEtZXhwcmVzc2lvbnM6IChcbi8vLyAgICAncmV0aW5hMngnOiAnKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksIChtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSdcbi8vLyAgKTtcbi8vL1xuJG1lZGlhLWV4cHJlc3Npb25zOiAoXG4gICdzY3JlZW4nOiAnc2NyZWVuJyxcbiAgJ3ByaW50JzogJ3ByaW50JyxcbiAgJ2hhbmRoZWxkJzogJ2hhbmRoZWxkJyxcbiAgJ2xhbmRzY2FwZSc6ICcob3JpZW50YXRpb246IGxhbmRzY2FwZSknLFxuICAncG9ydHJhaXQnOiAnKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknLFxuICAncmV0aW5hMngnOiAnKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksIChtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSwgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCknLFxuICAncmV0aW5hM3gnOiAnKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMyksIChtaW4tcmVzb2x1dGlvbjogMzUwZHBpKSwgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCknXG4pICFkZWZhdWx0O1xuXG5cbi8vL1xuLy8vIERlZmluZXMgYSBudW1iZXIgdG8gYmUgYWRkZWQgb3Igc3VidHJhY3RlZCBmcm9tIGVhY2ggdW5pdCB3aGVuIGRlY2xhcmluZyBicmVha3BvaW50cyB3aXRoIGV4Y2x1c2l2ZSBpbnRlcnZhbHNcbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBJbnRlcnZhbCBmb3IgcGl4ZWxzIGlzIGRlZmluZWQgYXMgYDFgIGJ5IGRlZmF1bHRcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz4xMjhweCcpIHt9XG4vLy9cbi8vLyAgLyogR2VuZXJhdGVzOiAqL1xuLy8vICBAbWVkaWEgKG1pbi13aWR0aDogMTI5cHgpIHt9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gSW50ZXJ2YWwgZm9yIGVtcyBpcyBkZWZpbmVkIGFzIGAwLjAxYCBieSBkZWZhdWx0XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+MjBlbScpIHt9XG4vLy9cbi8vLyAgLyogR2VuZXJhdGVzOiAqL1xuLy8vICBAbWVkaWEgKG1pbi13aWR0aDogMjAuMDFlbSkge31cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBJbnRlcnZhbCBmb3IgcmVtcyBpcyBkZWZpbmVkIGFzIGAwLjFgIGJ5IGRlZmF1bHQsIHRvIGJlIHVzZWQgd2l0aCBgZm9udC1zaXplOiA2Mi41JTtgXG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+Mi4wcmVtJykge31cbi8vL1xuLy8vICAvKiBHZW5lcmF0ZXM6ICovXG4vLy8gIEBtZWRpYSAobWluLXdpZHRoOiAyLjFyZW0pIHt9XG4vLy9cbiR1bml0LWludGVydmFsczogKFxuICAncHgnOiAxLFxuICAnZW0nOiAwLjAxLFxuICAncmVtJzogMC4xLFxuICAnJzogMFxuKSAhZGVmYXVsdDtcblxuLy8vXG4vLy8gRGVmaW5lcyB3aGV0aGVyIHN1cHBvcnQgZm9yIG1lZGlhIHF1ZXJpZXMgaXMgYXZhaWxhYmxlLCB1c2VmdWwgZm9yIGNyZWF0aW5nIHNlcGFyYXRlIHN0eWxlc2hlZXRzXG4vLy8gZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtZWRpYSBxdWVyaWVzLlxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIERpc2FibGVzIHN1cHBvcnQgZm9yIG1lZGlhIHF1ZXJpZXNcbi8vLyAgJGltLW1lZGlhLXN1cHBvcnQ6IGZhbHNlO1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPj10YWJsZXQnKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBjb2xvcjogdG9tYXRvO1xuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG4vLy8gIC8qIEdlbmVyYXRlczogKi9cbi8vLyAgLmZvbyB7XG4vLy8gICAgY29sb3I6IHRvbWF0bztcbi8vLyAgfVxuLy8vXG4kaW0tbWVkaWEtc3VwcG9ydDogdHJ1ZSAhZGVmYXVsdDtcblxuLy8vXG4vLy8gU2VsZWN0cyB3aGljaCBicmVha3BvaW50IHRvIGVtdWxhdGUgd2hlbiBzdXBwb3J0IGZvciBtZWRpYSBxdWVyaWVzIGlzIGRpc2FibGVkLiBNZWRpYSBxdWVyaWVzIHRoYXQgc3RhcnQgYXQgb3Jcbi8vLyBpbnRlcmNlcHQgdGhlIGJyZWFrcG9pbnQgd2lsbCBiZSBkaXNwbGF5ZWQsIGFueSBvdGhlcnMgd2lsbCBiZSBpZ25vcmVkLlxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFRoaXMgbWVkaWEgcXVlcnkgd2lsbCBzaG93IGJlY2F1c2UgaXQgaW50ZXJjZXB0cyB0aGUgc3RhdGljIGJyZWFrcG9pbnRcbi8vLyAgJGltLW1lZGlhLXN1cHBvcnQ6IGZhbHNlO1xuLy8vICAkaW0tbm8tbWVkaWEtYnJlYWtwb2ludDogJ2Rlc2t0b3AnO1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPj10YWJsZXQnKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBjb2xvcjogdG9tYXRvO1xuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG4vLy8gIC8qIEdlbmVyYXRlczogKi9cbi8vLyAgLmZvbyB7XG4vLy8gICAgY29sb3I6IHRvbWF0bztcbi8vLyAgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFRoaXMgbWVkaWEgcXVlcnkgd2lsbCBOT1Qgc2hvdyBiZWNhdXNlIGl0IGRvZXMgbm90IGludGVyY2VwdCB0aGUgZGVza3RvcCBicmVha3BvaW50XG4vLy8gICRpbS1tZWRpYS1zdXBwb3J0OiBmYWxzZTtcbi8vLyAgJGltLW5vLW1lZGlhLWJyZWFrcG9pbnQ6ICd0YWJsZXQnO1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPj1kZXNrdG9wJykge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgY29sb3I6IHRvbWF0bztcbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuLy8vICAvKiBObyBvdXRwdXQgKi9cbi8vL1xuJGltLW5vLW1lZGlhLWJyZWFrcG9pbnQ6ICdkZXNrdG9wJyAhZGVmYXVsdDtcblxuLy8vXG4vLy8gU2VsZWN0cyB3aGljaCBtZWRpYSBleHByZXNzaW9ucyBhcmUgYWxsb3dlZCBpbiBhbiBleHByZXNzaW9uIGZvciBpdCB0byBiZSB1c2VkIHdoZW4gbWVkaWEgcXVlcmllc1xuLy8vIGFyZSBub3Qgc3VwcG9ydGVkLlxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFRoaXMgbWVkaWEgcXVlcnkgd2lsbCBzaG93IGJlY2F1c2UgaXQgaW50ZXJjZXB0cyB0aGUgc3RhdGljIGJyZWFrcG9pbnQgYW5kIGNvbnRhaW5zIG9ubHkgYWNjZXB0ZWQgbWVkaWEgZXhwcmVzc2lvbnNcbi8vLyAgJGltLW1lZGlhLXN1cHBvcnQ6IGZhbHNlO1xuLy8vICAkaW0tbm8tbWVkaWEtYnJlYWtwb2ludDogJ2Rlc2t0b3AnO1xuLy8vICAkaW0tbm8tbWVkaWEtZXhwcmVzc2lvbnM6ICgnc2NyZWVuJyk7XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+PXRhYmxldCcsICdzY3JlZW4nKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBjb2xvcjogdG9tYXRvO1xuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG4vLy8gICAvKiBHZW5lcmF0ZXM6ICovXG4vLy8gICAuZm9vIHtcbi8vLyAgICAgY29sb3I6IHRvbWF0bztcbi8vLyAgIH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBUaGlzIG1lZGlhIHF1ZXJ5IHdpbGwgTk9UIHNob3cgYmVjYXVzZSBpdCBpbnRlcmNlcHRzIHRoZSBzdGF0aWMgYnJlYWtwb2ludCBidXQgY29udGFpbnMgYSBtZWRpYSBleHByZXNzaW9uIHRoYXQgaXMgbm90IGFjY2VwdGVkXG4vLy8gICRpbS1tZWRpYS1zdXBwb3J0OiBmYWxzZTtcbi8vLyAgJGltLW5vLW1lZGlhLWJyZWFrcG9pbnQ6ICdkZXNrdG9wJztcbi8vLyAgJGltLW5vLW1lZGlhLWV4cHJlc3Npb25zOiAoJ3NjcmVlbicpO1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPj10YWJsZXQnLCAncmV0aW5hMngnKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBjb2xvcjogdG9tYXRvO1xuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG4vLy8gIC8qIE5vIG91dHB1dCAqL1xuLy8vXG4kaW0tbm8tbWVkaWEtZXhwcmVzc2lvbnM6ICgnc2NyZWVuJywgJ3BvcnRyYWl0JywgJ2xhbmRzY2FwZScpICFkZWZhdWx0O1xuXG4vLy8vXG4vLy8gQ3Jvc3MtZW5naW5lIGxvZ2dpbmcgZW5naW5lXG4vLy8gQGF1dGhvciBIdWdvIEdpcmF1ZGVsXG4vLy8gQGFjY2VzcyBwcml2YXRlXG4vLy8vXG5cblxuLy8vXG4vLy8gTG9nIGEgbWVzc2FnZSBlaXRoZXIgd2l0aCBgQGVycm9yYCBpZiBzdXBwb3J0ZWRcbi8vLyBlbHNlIHdpdGggYEB3YXJuYCwgdXNpbmcgYGZlYXR1cmUtZXhpc3RzKCdhdC1lcnJvcicpYFxuLy8vIHRvIGRldGVjdCBzdXBwb3J0LlxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRtZXNzYWdlIC0gTWVzc2FnZSB0byBsb2dcbi8vL1xuQGZ1bmN0aW9uIGltLWxvZygkbWVzc2FnZSkge1xuICBAaWYgZmVhdHVyZS1leGlzdHMoJ2F0LWVycm9yJykge1xuXHRAZXJyb3IgJG1lc3NhZ2U7XG4gIH0gQGVsc2Uge1xuXHRAd2FybiAkbWVzc2FnZTtcblx0JF86IG5vb3AoKTtcbiAgfVxuXG4gIEByZXR1cm4gJG1lc3NhZ2U7XG59XG5cblxuLy8vXG4vLy8gV3JhcHBlciBtaXhpbiBmb3IgdGhlIGxvZyBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGEgbW9yZSBmcmllbmRseVxuLy8vIEFQSSB0aGFuIGBAaWYgaW0tbG9nKCcuLicpIHt9YCBvciBgJF86IGltLWxvZygnLi4nKWAuIEJhc2ljYWxseSwgdXNlIHRoZSBmdW5jdGlvblxuLy8vIHdpdGhpbiBmdW5jdGlvbnMgYmVjYXVzZSBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5jbHVkZSBhIG1peGluIGluIGEgZnVuY3Rpb25cbi8vLyBhbmQgdXNlIHRoZSBtaXhpbiBldmVyeXdoZXJlIGVsc2UgYmVjYXVzZSBpdCdzIG11Y2ggbW9yZSBlbGVnYW50LlxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRtZXNzYWdlIC0gTWVzc2FnZSB0byBsb2dcbi8vL1xuQG1peGluIGxvZygkbWVzc2FnZSkge1xuICBAaWYgaW0tbG9nKCRtZXNzYWdlKSB7fVxufVxuXG5cbi8vL1xuLy8vIEZ1bmN0aW9uIHdpdGggbm8gYEByZXR1cm5gIGNhbGxlZCBuZXh0IHRvIGBAd2FybmAgaW4gU2FzcyAzLjNcbi8vLyB0byB0cmlnZ2VyIGEgY29tcGlsaW5nIGVycm9yIGFuZCBzdG9wIHRoZSBwcm9jZXNzLlxuLy8vXG5AZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vL1xuLy8vIERldGVybWluZXMgd2hldGhlciBhIGxpc3Qgb2YgY29uZGl0aW9ucyBpcyBpbnRlcmNlcHRlZCBieSB0aGUgc3RhdGljIGJyZWFrcG9pbnQuXG4vLy9cbi8vLyBAcGFyYW0ge0FyZ2xpc3R9ICAgJGNvbmRpdGlvbnMgIC0gTWVkaWEgcXVlcnkgY29uZGl0aW9uc1xuLy8vXG4vLy8gQHJldHVybiB7Qm9vbGVhbn0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbmRpdGlvbnMgYXJlIGludGVyY2VwdGVkIGJ5IHRoZSBzdGF0aWMgYnJlYWtwb2ludFxuLy8vXG5AZnVuY3Rpb24gaW0taW50ZXJjZXB0cy1zdGF0aWMtYnJlYWtwb2ludCgkY29uZGl0aW9ucy4uLikge1xuICAkbm8tbWVkaWEtYnJlYWtwb2ludC12YWx1ZTogbWFwLWdldCgkYnJlYWtwb2ludHMsICRpbS1uby1tZWRpYS1icmVha3BvaW50KTtcblxuICBAaWYgbm90ICRuby1tZWRpYS1icmVha3BvaW50LXZhbHVlIHtcblx0QGlmIGltLWxvZygnYCN7JGltLW5vLW1lZGlhLWJyZWFrcG9pbnR9YCBpcyBub3QgYSB2YWxpZCBicmVha3BvaW50LicpIHt9XG4gIH1cblxuICBAZWFjaCAkY29uZGl0aW9uIGluICRjb25kaXRpb25zIHtcblx0QGlmIG5vdCBtYXAtaGFzLWtleSgkbWVkaWEtZXhwcmVzc2lvbnMsICRjb25kaXRpb24pIHtcblx0ICAkb3BlcmF0b3I6IGdldC1leHByZXNzaW9uLW9wZXJhdG9yKCRjb25kaXRpb24pO1xuXHQgICRwcmVmaXg6IGdldC1leHByZXNzaW9uLXByZWZpeCgkb3BlcmF0b3IpO1xuXHQgICR2YWx1ZTogZ2V0LWV4cHJlc3Npb24tdmFsdWUoJGNvbmRpdGlvbiwgJG9wZXJhdG9yKTtcblxuXHQgIEBpZiAoJHByZWZpeCA9PSAnbWF4JyBhbmQgJHZhbHVlIDw9ICRuby1tZWRpYS1icmVha3BvaW50LXZhbHVlKSBvclxuXHRcdCAgKCRwcmVmaXggPT0gJ21pbicgYW5kICR2YWx1ZSA+ICRuby1tZWRpYS1icmVha3BvaW50LXZhbHVlKSB7XG5cdFx0QHJldHVybiBmYWxzZTtcblx0ICB9XG5cdH0gQGVsc2UgaWYgbm90IGluZGV4KCRpbS1uby1tZWRpYS1leHByZXNzaW9ucywgJGNvbmRpdGlvbikge1xuXHQgIEByZXR1cm4gZmFsc2U7XG5cdH1cbiAgfVxuXG4gIEByZXR1cm4gdHJ1ZTtcbn1cblxuLy8vL1xuLy8vIFBhcnNpbmcgZW5naW5lXG4vLy8gQGF1dGhvciBIdWdvIEdpcmF1ZGVsXG4vLy8gQGFjY2VzcyBwcml2YXRlXG4vLy8vXG5cblxuLy8vXG4vLy8gR2V0IG9wZXJhdG9yIG9mIGFuIGV4cHJlc3Npb25cbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24gdG8gZXh0cmFjdCBvcGVyYXRvciBmcm9tXG4vLy9cbi8vLyBAcmV0dXJuIHtTdHJpbmd9IC0gQW55IG9mIGA+PWAsIGA+YCwgYDw9YCwgYDxgLCBg4omlYCwgYOKJpGBcbi8vL1xuQGZ1bmN0aW9uIGdldC1leHByZXNzaW9uLW9wZXJhdG9yKCRleHByZXNzaW9uKSB7XG4gIEBlYWNoICRvcGVyYXRvciBpbiAoJz49JywgJz4nLCAnPD0nLCAnPCcsICfiiaUnLCAn4omkJykge1xuXHRAaWYgc3RyLWluZGV4KCRleHByZXNzaW9uLCAkb3BlcmF0b3IpIHtcblx0ICBAcmV0dXJuICRvcGVyYXRvcjtcblx0fVxuICB9XG5cbiAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGluY2x1ZGUgYSBtaXhpbiBpbnNpZGUgYSBmdW5jdGlvbiwgc28gd2UgaGF2ZSB0b1xuICAvLyByZWx5IG9uIHRoZSBgaW0tbG9nKC4uKWAgZnVuY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGBsb2coLi4pYCBtaXhpbi4gQmVjYXVzZVxuICAvLyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBhbnl3aGVyZSBpbiBTYXNzLCB3ZSBuZWVkIHRvIGhhY2sgdGhlIGNhbGwgaW5cbiAgLy8gYSBkdW1teSB2YXJpYWJsZSwgc3VjaCBhcyBgJF9gLiBJZiBhbnlib2R5IGV2ZXIgcmFpc2UgYSBzY29waW5nIGlzc3VlIHdpdGhcbiAgLy8gU2FzcyAzLjMsIGNoYW5nZSB0aGlzIGxpbmUgaW4gYEBpZiBpbS1sb2coLi4pIHt9YCBpbnN0ZWFkLlxuICAkXzogaW0tbG9nKCdObyBvcGVyYXRvciBmb3VuZCBpbiBgI3skZXhwcmVzc2lvbn1gLicpO1xufVxuXG5cbi8vL1xuLy8vIEdldCBkaW1lbnNpb24gb2YgYW4gZXhwcmVzc2lvbiwgYmFzZWQgb24gYSBmb3VuZCBvcGVyYXRvclxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRleHByZXNzaW9uIC0gRXhwcmVzc2lvbiB0byBleHRyYWN0IGRpbWVuc2lvbiBmcm9tXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRvcGVyYXRvciAtIE9wZXJhdG9yIGZyb20gYCRleHByZXNzaW9uYFxuLy8vXG4vLy8gQHJldHVybiB7U3RyaW5nfSAtIGB3aWR0aGAgb3IgYGhlaWdodGAgKG9yIHBvdGVudGlhbGx5IGFueXRoaW5nIGVsc2UpXG4vLy9cbkBmdW5jdGlvbiBnZXQtZXhwcmVzc2lvbi1kaW1lbnNpb24oJGV4cHJlc3Npb24sICRvcGVyYXRvcikge1xuICAkb3BlcmF0b3ItaW5kZXg6IHN0ci1pbmRleCgkZXhwcmVzc2lvbiwgJG9wZXJhdG9yKTtcbiAgJHBhcnNlZC1kaW1lbnNpb246IHN0ci1zbGljZSgkZXhwcmVzc2lvbiwgMCwgJG9wZXJhdG9yLWluZGV4IC0gMSk7XG4gICRkaW1lbnNpb246ICd3aWR0aCc7XG5cbiAgQGlmIHN0ci1sZW5ndGgoJHBhcnNlZC1kaW1lbnNpb24pID4gMCB7XG5cdCRkaW1lbnNpb246ICRwYXJzZWQtZGltZW5zaW9uO1xuICB9XG5cbiAgQHJldHVybiAkZGltZW5zaW9uO1xufVxuXG5cbi8vL1xuLy8vIEdldCBkaW1lbnNpb24gcHJlZml4IGJhc2VkIG9uIGFuIG9wZXJhdG9yXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJG9wZXJhdG9yIC0gT3BlcmF0b3Jcbi8vL1xuLy8vIEByZXR1cm4ge1N0cmluZ30gLSBgbWluYCBvciBgbWF4YFxuLy8vXG5AZnVuY3Rpb24gZ2V0LWV4cHJlc3Npb24tcHJlZml4KCRvcGVyYXRvcikge1xuICBAcmV0dXJuIGlmKGluZGV4KCgnPCcsICc8PScsICfiiaQnKSwgJG9wZXJhdG9yKSwgJ21heCcsICdtaW4nKTtcbn1cblxuXG4vLy9cbi8vLyBHZXQgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiwgYmFzZWQgb24gYSBmb3VuZCBvcGVyYXRvclxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRleHByZXNzaW9uIC0gRXhwcmVzc2lvbiB0byBleHRyYWN0IHZhbHVlIGZyb21cbi8vLyBAcGFyYW0ge1N0cmluZ30gJG9wZXJhdG9yIC0gT3BlcmF0b3IgZnJvbSBgJGV4cHJlc3Npb25gXG4vLy9cbi8vLyBAcmV0dXJuIHtOdW1iZXJ9IC0gQSBudW1lcmljIHZhbHVlXG4vLy9cbkBmdW5jdGlvbiBnZXQtZXhwcmVzc2lvbi12YWx1ZSgkZXhwcmVzc2lvbiwgJG9wZXJhdG9yKSB7XG4gICRvcGVyYXRvci1pbmRleDogc3RyLWluZGV4KCRleHByZXNzaW9uLCAkb3BlcmF0b3IpO1xuICAkdmFsdWU6IHN0ci1zbGljZSgkZXhwcmVzc2lvbiwgJG9wZXJhdG9yLWluZGV4ICsgc3RyLWxlbmd0aCgkb3BlcmF0b3IpKTtcblxuICBAaWYgbWFwLWhhcy1rZXkoJGJyZWFrcG9pbnRzLCAkdmFsdWUpIHtcblx0JHZhbHVlOiBtYXAtZ2V0KCRicmVha3BvaW50cywgJHZhbHVlKTtcbiAgfSBAZWxzZSB7XG5cdCR2YWx1ZTogdG8tbnVtYmVyKCR2YWx1ZSk7XG4gIH1cblxuICAkaW50ZXJ2YWw6IG1hcC1nZXQoJHVuaXQtaW50ZXJ2YWxzLCB1bml0KCR2YWx1ZSkpO1xuXG4gIEBpZiBub3QgJGludGVydmFsIHtcblx0Ly8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGluY2x1ZGUgYSBtaXhpbiBpbnNpZGUgYSBmdW5jdGlvbiwgc28gd2UgaGF2ZSB0b1xuXHQvLyByZWx5IG9uIHRoZSBgaW0tbG9nKC4uKWAgZnVuY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGBsb2coLi4pYCBtaXhpbi4gQmVjYXVzZVxuXHQvLyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBhbnl3aGVyZSBpbiBTYXNzLCB3ZSBuZWVkIHRvIGhhY2sgdGhlIGNhbGwgaW5cblx0Ly8gYSBkdW1teSB2YXJpYWJsZSwgc3VjaCBhcyBgJF9gLiBJZiBhbnlib2R5IGV2ZXIgcmFpc2UgYSBzY29waW5nIGlzc3VlIHdpdGhcblx0Ly8gU2FzcyAzLjMsIGNoYW5nZSB0aGlzIGxpbmUgaW4gYEBpZiBpbS1sb2coLi4pIHt9YCBpbnN0ZWFkLlxuXHQkXzogaW0tbG9nKCdVbmtub3duIHVuaXQgYCN7dW5pdCgkdmFsdWUpfWAuJyk7XG4gIH1cblxuICBAaWYgJG9wZXJhdG9yID09ICc+JyB7XG5cdCR2YWx1ZTogJHZhbHVlICsgJGludGVydmFsO1xuICB9IEBlbHNlIGlmICRvcGVyYXRvciA9PSAnPCcge1xuXHQkdmFsdWU6ICR2YWx1ZSAtICRpbnRlcnZhbDtcbiAgfVxuXG4gIEByZXR1cm4gJHZhbHVlO1xufVxuXG5cbi8vL1xuLy8vIFBhcnNlIGFuIGV4cHJlc3Npb24gdG8gcmV0dXJuIGEgdmFsaWQgbWVkaWEtcXVlcnkgZXhwcmVzc2lvblxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRleHByZXNzaW9uIC0gRXhwcmVzc2lvbiB0byBwYXJzZVxuLy8vXG4vLy8gQHJldHVybiB7U3RyaW5nfSAtIFZhbGlkIG1lZGlhIHF1ZXJ5XG4vLy9cbkBmdW5jdGlvbiBwYXJzZS1leHByZXNzaW9uKCRleHByZXNzaW9uKSB7XG4gIC8vIElmIGl0IGlzIHBhcnQgb2YgJG1lZGlhLWV4cHJlc3Npb25zLCBpdCBoYXMgbm8gb3BlcmF0b3JcbiAgLy8gdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIGdvIGFueSBmdXJ0aGVyLCBqdXN0IHJldHVybiB0aGUgdmFsdWVcbiAgQGlmIG1hcC1oYXMta2V5KCRtZWRpYS1leHByZXNzaW9ucywgJGV4cHJlc3Npb24pIHtcblx0QHJldHVybiBtYXAtZ2V0KCRtZWRpYS1leHByZXNzaW9ucywgJGV4cHJlc3Npb24pO1xuICB9XG5cbiAgJG9wZXJhdG9yOiBnZXQtZXhwcmVzc2lvbi1vcGVyYXRvcigkZXhwcmVzc2lvbik7XG4gICRkaW1lbnNpb246IGdldC1leHByZXNzaW9uLWRpbWVuc2lvbigkZXhwcmVzc2lvbiwgJG9wZXJhdG9yKTtcbiAgJHByZWZpeDogZ2V0LWV4cHJlc3Npb24tcHJlZml4KCRvcGVyYXRvcik7XG4gICR2YWx1ZTogZ2V0LWV4cHJlc3Npb24tdmFsdWUoJGV4cHJlc3Npb24sICRvcGVyYXRvcik7XG5cbiAgQHJldHVybiAnKCN7JHByZWZpeH0tI3skZGltZW5zaW9ufTogI3skdmFsdWV9KSc7XG59XG5cbi8vL1xuLy8vIFNsaWNlIGAkbGlzdGAgYmV0d2VlbiBgJHN0YXJ0YCBhbmQgYCRlbmRgIGluZGV4ZXNcbi8vL1xuLy8vIEBhY2Nlc3MgcHJpdmF0ZVxuLy8vXG4vLy8gQHBhcmFtIHtMaXN0fSAkbGlzdCAtIExpc3QgdG8gc2xpY2Vcbi8vLyBAcGFyYW0ge051bWJlcn0gJHN0YXJ0IFsxXSAtIFN0YXJ0IGluZGV4XG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRlbmQgW2xlbmd0aCgkbGlzdCldIC0gRW5kIGluZGV4XG4vLy9cbi8vLyBAcmV0dXJuIHtMaXN0fSBTbGljZWQgbGlzdFxuLy8vXG5AZnVuY3Rpb24gc2xpY2UoJGxpc3QsICRzdGFydDogMSwgJGVuZDogbGVuZ3RoKCRsaXN0KSkge1xuICBAaWYgbGVuZ3RoKCRsaXN0KSA8IDEgb3IgJHN0YXJ0ID4gJGVuZCB7XG5cdEByZXR1cm4gKCk7XG4gIH1cblxuICAkcmVzdWx0OiAoKTtcblxuICBAZm9yICRpIGZyb20gJHN0YXJ0IHRocm91Z2ggJGVuZCB7XG5cdCRyZXN1bHQ6IGFwcGVuZCgkcmVzdWx0LCBudGgoJGxpc3QsICRpKSk7XG4gIH1cblxuICBAcmV0dXJuICRyZXN1bHQ7XG59XG5cbi8vLy9cbi8vLyBTdHJpbmcgdG8gbnVtYmVyIGNvbnZlcnRlclxuLy8vIEBhdXRob3IgSHVnbyBHaXJhdWRlbFxuLy8vIEBhY2Nlc3MgcHJpdmF0ZVxuLy8vL1xuXG5cbi8vL1xuLy8vIENhc3RzIGEgc3RyaW5nIGludG8gYSBudW1iZXJcbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nIHwgTnVtYmVyfSAkdmFsdWUgLSBWYWx1ZSB0byBiZSBwYXJzZWRcbi8vL1xuLy8vIEByZXR1cm4ge051bWJlcn1cbi8vL1xuQGZ1bmN0aW9uIHRvLW51bWJlcigkdmFsdWUpIHtcbiAgQGlmIHR5cGUtb2YoJHZhbHVlKSA9PSAnbnVtYmVyJyB7XG5cdEByZXR1cm4gJHZhbHVlO1xuICB9IEBlbHNlIGlmIHR5cGUtb2YoJHZhbHVlKSAhPSAnc3RyaW5nJyB7XG5cdCRfOiBpbS1sb2coJ1ZhbHVlIGZvciBgdG8tbnVtYmVyYCBzaG91bGQgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcuJyk7XG4gIH1cblxuICAkZmlyc3QtY2hhcmFjdGVyOiBzdHItc2xpY2UoJHZhbHVlLCAxLCAxKTtcbiAgJHJlc3VsdDogMDtcbiAgJGRpZ2l0czogMDtcbiAgJG1pbnVzOiAoJGZpcnN0LWNoYXJhY3RlciA9PSAnLScpO1xuICAkbnVtYmVyczogKCcwJzogMCwgJzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0LCAnNSc6IDUsICc2JzogNiwgJzcnOiA3LCAnOCc6IDgsICc5JzogOSk7XG5cbiAgLy8gUmVtb3ZlICsvLSBzaWduIGlmIHByZXNlbnQgYXQgZmlyc3QgY2hhcmFjdGVyXG4gIEBpZiAoJGZpcnN0LWNoYXJhY3RlciA9PSAnKycgb3IgJGZpcnN0LWNoYXJhY3RlciA9PSAnLScpIHtcblx0JHZhbHVlOiBzdHItc2xpY2UoJHZhbHVlLCAyKTtcbiAgfVxuXG4gIEBmb3IgJGkgZnJvbSAxIHRocm91Z2ggc3RyLWxlbmd0aCgkdmFsdWUpIHtcblx0JGNoYXJhY3Rlcjogc3RyLXNsaWNlKCR2YWx1ZSwgJGksICRpKTtcblxuXHRAaWYgbm90IChpbmRleChtYXAta2V5cygkbnVtYmVycyksICRjaGFyYWN0ZXIpIG9yICRjaGFyYWN0ZXIgPT0gJy4nKSB7XG5cdCAgQHJldHVybiB0by1sZW5ndGgoaWYoJG1pbnVzLCAtJHJlc3VsdCwgJHJlc3VsdCksIHN0ci1zbGljZSgkdmFsdWUsICRpKSlcblx0fVxuXG5cdEBpZiAkY2hhcmFjdGVyID09ICcuJyB7XG5cdCAgJGRpZ2l0czogMTtcblx0fSBAZWxzZSBpZiAkZGlnaXRzID09IDAge1xuXHQgICRyZXN1bHQ6ICRyZXN1bHQgKiAxMCArIG1hcC1nZXQoJG51bWJlcnMsICRjaGFyYWN0ZXIpO1xuXHR9IEBlbHNlIHtcblx0ICAkZGlnaXRzOiAkZGlnaXRzICogMTA7XG5cdCAgJHJlc3VsdDogJHJlc3VsdCArIG1hcC1nZXQoJG51bWJlcnMsICRjaGFyYWN0ZXIpIC8gJGRpZ2l0cztcblx0fVxuICB9XG5cbiAgQHJldHVybiBpZigkbWludXMsIC0kcmVzdWx0LCAkcmVzdWx0KTtcbn1cblxuXG4vLy9cbi8vLyBBZGQgYCR1bml0YCB0byBgJHZhbHVlYFxuLy8vXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICR2YWx1ZSAtIFZhbHVlIHRvIGFkZCB1bml0IHRvXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICR1bml0IC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0XG4vLy9cbi8vLyBAcmV0dXJuIHtOdW1iZXJ9IC0gYCR2YWx1ZWAgZXhwcmVzc2VkIGluIGAkdW5pdGBcbi8vL1xuQGZ1bmN0aW9uIHRvLWxlbmd0aCgkdmFsdWUsICR1bml0KSB7XG4gICR1bml0czogKCdweCc6IDFweCwgJ2NtJzogMWNtLCAnbW0nOiAxbW0sICclJzogMSUsICdjaCc6IDFjaCwgJ3BjJzogMXBjLCAnaW4nOiAxaW4sICdlbSc6IDFlbSwgJ3JlbSc6IDFyZW0sICdwdCc6IDFwdCwgJ2V4JzogMWV4LCAndncnOiAxdncsICd2aCc6IDF2aCwgJ3ZtaW4nOiAxdm1pbiwgJ3ZtYXgnOiAxdm1heCk7XG5cbiAgQGlmIG5vdCBpbmRleChtYXAta2V5cygkdW5pdHMpLCAkdW5pdCkge1xuXHQkXzogaW0tbG9nKCdJbnZhbGlkIHVuaXQgYCN7JHVuaXR9YC4nKTtcbiAgfVxuXG4gIEByZXR1cm4gJHZhbHVlICogbWFwLWdldCgkdW5pdHMsICR1bml0KTtcbn1cblxuLy8vXG4vLy8gVGhpcyBtaXhpbiBhaW1zIGF0IHJlZGVmaW5pbmcgdGhlIGNvbmZpZ3VyYXRpb24ganVzdCBmb3IgdGhlIHNjb3BlIG9mXG4vLy8gdGhlIGNhbGwuIEl0IGlzIGhlbHBmdWwgd2hlbiBoYXZpbmcgYSBjb21wb25lbnQgbmVlZGluZyBhbiBleHRlbmRlZFxuLy8vIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBjdXN0b20gYnJlYWtwb2ludHMgKHJlZmVycmVkIHRvIGFzIHR3ZWFrcG9pbnRzKVxuLy8vIGZvciBpbnN0YW5jZS5cbi8vL1xuLy8vIEBhdXRob3IgSHVnbyBHaXJhdWRlbFxuLy8vXG4vLy8gQHBhcmFtIHtNYXB9ICR0d2Vha3BvaW50cyBbKCldIC0gTWFwIG9mIHR3ZWFrcG9pbnRzIHRvIGJlIG1lcmdlZCB3aXRoIGAkYnJlYWtwb2ludHNgXG4vLy8gQHBhcmFtIHtNYXB9ICR0d2Vhay1tZWRpYS1leHByZXNzaW9ucyBbKCldIC0gTWFwIG9mIHR3ZWFrZWQgbWVkaWEgZXhwcmVzc2lvbnMgdG8gYmUgbWVyZ2VkIHdpdGggYCRtZWRpYS1leHByZXNzaW9uYFxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIEV4dGVuZCB0aGUgZ2xvYmFsIGJyZWFrcG9pbnRzIHdpdGggYSB0d2Vha3BvaW50XG4vLy8gIEBpbmNsdWRlIG1lZGlhLWNvbnRleHQoKCdjdXN0b20nOiA2NzhweCkpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIEBpbmNsdWRlIG1lZGlhKCc+cGhvbmUnLCAnPD1jdXN0b20nKSB7XG4vLy8gICAgICAgLy8gLi4uXG4vLy8gICAgICB9XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gRXh0ZW5kIHRoZSBnbG9iYWwgbWVkaWEgZXhwcmVzc2lvbnMgd2l0aCBhIGN1c3RvbSBvbmVcbi8vLyAgQGluY2x1ZGUgbWVkaWEtY29udGV4dCgkdHdlYWstbWVkaWEtZXhwcmVzc2lvbnM6ICgnYWxsJzogJ2FsbCcpKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBAaW5jbHVkZSBtZWRpYSgnYWxsJywgJz5waG9uZScpIHtcbi8vLyAgICAgICAvLyAuLi5cbi8vLyAgICAgIH1cbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBFeHRlbmQgYm90aCBjb25maWd1cmF0aW9uIG1hcHNcbi8vLyAgQGluY2x1ZGUgbWVkaWEtY29udGV4dCgoJ2N1c3RvbSc6IDY3OHB4KSwgKCdhbGwnOiAnYWxsJykpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIEBpbmNsdWRlIG1lZGlhKCdhbGwnLCAnPnBob25lJywgJzw9Y3VzdG9tJykge1xuLy8vICAgICAgIC8vIC4uLlxuLy8vICAgICAgfVxuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG5AbWl4aW4gbWVkaWEtY29udGV4dCgkdHdlYWtwb2ludHM6ICgpLCAkdHdlYWstbWVkaWEtZXhwcmVzc2lvbnM6ICgpKSB7XG4gIC8vIFNhdmUgZ2xvYmFsIGNvbmZpZ3VyYXRpb25cbiAgJGdsb2JhbC1icmVha3BvaW50czogJGJyZWFrcG9pbnRzO1xuICAkZ2xvYmFsLW1lZGlhLWV4cHJlc3Npb25zOiAkbWVkaWEtZXhwcmVzc2lvbnM7XG5cbiAgLy8gVXBkYXRlIGdsb2JhbCBjb25maWd1cmF0aW9uXG4gICRicmVha3BvaW50czogbWFwLW1lcmdlKCRicmVha3BvaW50cywgJHR3ZWFrcG9pbnRzKSAhZ2xvYmFsO1xuICAkbWVkaWEtZXhwcmVzc2lvbnM6IG1hcC1tZXJnZSgkbWVkaWEtZXhwcmVzc2lvbnMsICR0d2Vhay1tZWRpYS1leHByZXNzaW9ucykgIWdsb2JhbDtcblxuICBAY29udGVudDtcblxuICAvLyBSZXN0b3JlIGdsb2JhbCBjb25maWd1cmF0aW9uXG4gICRicmVha3BvaW50czogJGdsb2JhbC1icmVha3BvaW50cyAhZ2xvYmFsO1xuICAkbWVkaWEtZXhwcmVzc2lvbnM6ICRnbG9iYWwtbWVkaWEtZXhwcmVzc2lvbnMgIWdsb2JhbDtcbn1cblxuLy8vL1xuLy8vIGluY2x1ZGUtbWVkaWEgcHVibGljIGV4cG9zZWQgQVBJXG4vLy8gQGF1dGhvciBFZHVhcmRvIEJvdWNhc1xuLy8vIEBhY2Nlc3MgcHVibGljXG4vLy8vXG5cblxuLy8vXG4vLy8gR2VuZXJhdGVzIGEgbWVkaWEgcXVlcnkgYmFzZWQgb24gYSBsaXN0IG9mIGNvbmRpdGlvbnNcbi8vL1xuLy8vIEBwYXJhbSB7QXJnbGlzdH0gICAkY29uZGl0aW9ucyAgLSBNZWRpYSBxdWVyeSBjb25kaXRpb25zXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gV2l0aCBhIHNpbmdsZSBzZXQgYnJlYWtwb2ludFxuLy8vICBAaW5jbHVkZSBtZWRpYSgnPnBob25lJykgeyB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gV2l0aCB0d28gc2V0IGJyZWFrcG9pbnRzXG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+cGhvbmUnLCAnPD10YWJsZXQnKSB7IH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBXaXRoIGN1c3RvbSB2YWx1ZXNcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz49MzU4cHgnLCAnPDg1MHB4JykgeyB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gV2l0aCBzZXQgYnJlYWtwb2ludHMgd2l0aCBjdXN0b20gdmFsdWVzXG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+ZGVza3RvcCcsICc8PTEzNTBweCcpIHsgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFdpdGggYSBzdGF0aWMgZXhwcmVzc2lvblxuLy8vICBAaW5jbHVkZSBtZWRpYSgncmV0aW5hMngnKSB7IH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBNaXhpbmcgZXZlcnl0aGluZ1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPj0zNTBweCcsICc8dGFibGV0JywgJ3JldGluYTN4JykgeyB9XG4vLy9cbkBtaXhpbiBtZWRpYSgkY29uZGl0aW9ucy4uLikge1xuICBAaWYgKCRpbS1tZWRpYS1zdXBwb3J0IGFuZCBsZW5ndGgoJGNvbmRpdGlvbnMpID09IDApIG9yXG5cdCAgKG5vdCAkaW0tbWVkaWEtc3VwcG9ydCBhbmQgaW0taW50ZXJjZXB0cy1zdGF0aWMtYnJlYWtwb2ludCgkY29uZGl0aW9ucy4uLikpIHtcblx0QGNvbnRlbnQ7XG4gIH0gQGVsc2UgaWYgKCRpbS1tZWRpYS1zdXBwb3J0IGFuZCBsZW5ndGgoJGNvbmRpdGlvbnMpID4gMCkge1xuXHRAbWVkaWEgI3t1bnF1b3RlKHBhcnNlLWV4cHJlc3Npb24obnRoKCRjb25kaXRpb25zLCAxKSkpfSB7XG5cdCAgLy8gUmVjdXJzaXZlIGNhbGxcblx0ICBAaW5jbHVkZSBtZWRpYShzbGljZSgkY29uZGl0aW9ucywgMikuLi4pIHtcblx0XHRAY29udGVudDtcblx0ICB9XG5cdH1cbiAgfVxufVxuIiwiLy8gU3R5bGluZyB0d2Vha3MgZm9yIGpRdWVyeS1jb25maXJtIEpTIGFsZXJ0IGxpYnJhcnkuXG5ib2R5LndwLW1haWwtc210cC1hZG1pbi1wYWdlLWJvZHkge1xuXG5cdGRpdi5qY29uZmlybSB7XG5cblx0XHQqLFxuXHRcdCo6OmJlZm9yZSxcblx0XHQqOjphZnRlciB7XG5cdFx0XHQtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0XHQtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdH1cblxuXHRcdC5qY29uZmlybS1iZyB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDExNCwgMTE5LCAxMjQsIDAuNzUpO1xuXHRcdFx0b3BhY2l0eTogMTtcblx0XHR9XG5cblx0XHQuamNvbmZpcm0tYm94IHtcblx0XHRcdHBhZGRpbmc6IDMwcHg7XG5cdFx0XHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdFx0XHRib3gtc2hhZG93OiAwIDNweCA2cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcblx0XHRcdGJvcmRlci10b3Atd2lkdGg6IDRweDtcblxuXHRcdFx0ZGl2Lmpjb25maXJtLWNsb3NlSWNvbiB7XG5cdFx0XHRcdGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XG5cdFx0XHRcdHRvcDogOHB4O1xuXHRcdFx0XHRyaWdodDogOHB4O1xuXG5cdFx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRcdGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRpdi5qY29uZmlybS10aXRsZS1jIHtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMTVweCAwO1xuXHRcdFx0XHRwYWRkaW5nOiAwO1xuXG5cdFx0XHRcdC5qY29uZmlybS1pY29uLWMge1xuXHRcdFx0XHRcdG1hcmdpbjogMCAwIDMwcHg7XG5cdFx0XHRcdFx0LXdlYmtpdC10cmFuc2l0aW9uOiBub25lO1xuXHRcdFx0XHRcdHRyYW5zaXRpb246IG5vbmU7XG5cdFx0XHRcdFx0LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0XHQtbXMtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdFx0dHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XG5cblx0XHRcdFx0XHQmOmVtcHR5LFxuXHRcdFx0XHRcdGk6ZW1wdHkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuamNvbmZpcm0tdGl0bGUge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAyNHB4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRpdi5qY29uZmlybS1jb250ZW50LXBhbmUge1xuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMzBweDtcblxuXHRcdFx0XHQuamNvbmZpcm0tY29udGVudCB7XG5cdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMDtcblx0XHRcdFx0XHRvdmVyZmxvdzogaW5oZXJpdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRkaXYuamNvbmZpcm0tY29udGVudCB7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHRcdGxpbmUtaGVpZ2h0OiAxLjQ7XG5cblx0XHRcdFx0cCB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIDAgMjBweDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDEuNTtcblxuXHRcdFx0XHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLmxhcmdlIHtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMThweDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLnNtYWxsIHtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLWRlYnVnLWV2ZW50LXByZXZpZXcgcCB7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1idG4ge1xuXHRcdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRcdFx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0XHRcdFx0XHQtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQgLjFzO1xuXHRcdFx0XHRcdHRyYW5zaXRpb246IGJhY2tncm91bmQgLjFzO1xuXHRcdFx0XHRcdHBhZGRpbmc6IDEwcHggMjBweDtcblx0XHRcdFx0XHRvdXRsaW5lOiBub25lO1xuXHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDEuNDtcblx0XHRcdFx0XHQtbXMtdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247XG5cdFx0XHRcdFx0dG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247XG5cdFx0XHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdFx0XHRcdC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHRcdFx0LW1vei11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0XHQtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHRcdFx0dXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xuXHRcdFx0XHRcdG1pbi1oZWlnaHQ6IDFlbTtcblx0XHRcdFx0XHQtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuXHRcdFx0XHRcdGJvcmRlcjogMDtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuXG5cdFx0XHRcdFx0Ji53aXRoLWxvYWRlciB7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiAxMnB4IDEycHggN3B4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRkaXYuamNvbmZpcm0tYnV0dG9ucyB7XG5cdFx0XHRcdHBhZGRpbmc6IDA7XG5cblx0XHRcdFx0YnV0dG9uIHtcblx0XHRcdFx0XHR0cmFuc2l0aW9uOiAwLjJzO1xuXHRcdFx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIDEwcHggMDtcblxuXHRcdFx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRcdFx0Ym94LXNoYWRvdzogaW5zZXQgMCAwIDAgMTAwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYuYnRuLWNvbmZpcm0ge1xuXHRcdFx0XHRcdFx0Y29sb3I6ICNmZmY7XG5cdFx0XHRcdFx0XHRvdXRsaW5lOiBub25lO1xuXHRcdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgJG9yYW5nZTtcblx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICRvcmFuZ2U7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ji5idG4tY2FuY2VsIHtcblx0XHRcdFx0XHRcdGNvbG9yOiAjNzc3Nzc3O1xuXHRcdFx0XHRcdFx0b3V0bGluZTogbm9uZTtcblx0XHRcdFx0XHRcdGJhY2tncm91bmQ6ICNGOEY4Rjg7XG5cdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYsXG5cdFx0XHRcdFx0Ji5idG4tZGVmYXVsdCB7XG5cdFx0XHRcdFx0XHRjb2xvcjogIzY2Njtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLmJ0bi1oaWRlIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ji5idG4tYmxvY2sge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdG1hcmdpbjogMCAwIDEwcHggMCAhaW1wb3J0YW50O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYuYnRuLW5vcm1hbC1jYXNlIHtcblx0XHRcdFx0XHRcdHRleHQtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCYuamNvbmZpcm0tdHlwZS1ncmVlbiB7XG5cdFx0XHRcdGJvcmRlci1jb2xvcjogJG1vZGFsLWdyZWVuO1xuXG5cdFx0XHRcdGRpdi5qY29uZmlybS1idXR0b25zIGJ1dHRvbi5idG4tY29uZmlybSB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJG1vZGFsLWdyZWVuO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogJG1vZGFsLWdyZWVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCYuamNvbmZpcm0tdHlwZS1vcmFuZ2Uge1xuXHRcdFx0XHRib3JkZXItY29sb3I6ICRtb2RhbC1vcmFuZ2U7XG5cblx0XHRcdFx0ZGl2Lmpjb25maXJtLWJ1dHRvbnMgYnV0dG9uLmJ0bi1jb25maXJtIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkbW9kYWwtb3JhbmdlO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogJG1vZGFsLW9yYW5nZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQmLmpjb25maXJtLXR5cGUtcmVkIHtcblx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkbW9kYWwtcmVkO1xuXG5cdFx0XHRcdGRpdi5qY29uZmlybS1idXR0b25zIGJ1dHRvbi5idG4tY29uZmlybSB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJG1vZGFsLXJlZDtcblx0XHRcdFx0XHRib3JkZXItY29sb3I6ICRtb2RhbC1yZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ji5qY29uZmlybS10eXBlLWJsdWUge1xuXHRcdFx0XHRib3JkZXItY29sb3I6ICRtb2RhbC1ibHVlO1xuXG5cdFx0XHRcdGRpdi5qY29uZmlybS1idXR0b25zIGJ1dHRvbi5idG4tY29uZmlybSB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJG1vZGFsLWJsdWU7XG5cdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkbW9kYWwtYmx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQmLmxvYWRpbmcge1xuXHRcdFx0XHRib3JkZXItdG9wLWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7XG5cdFx0XHRcdGhlaWdodDogMTYwcHg7XG5cblx0XHRcdFx0Lmpjb25maXJtLXRpdGxlLWMge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG5cdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdHotaW5kZXg6IDQ7XG5cblx0XHRcdFx0XHQuamNvbmZpcm0taWNvbi1jIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdHotaW5kZXg6IDI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmOmFmdGVyIHtcblx0XHRcdFx0XHRjb250ZW50OiAnJztcblx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0bGVmdDogNTAlO1xuXHRcdFx0XHRcdHRvcDogNjglO1xuXHRcdFx0XHRcdG1hcmdpbi1sZWZ0OiAtMjBweDtcblx0XHRcdFx0XHRoZWlnaHQ6IDQwcHg7XG5cdFx0XHRcdFx0d2lkdGg6IDQwcHg7XG5cdFx0XHRcdFx0Ym9yZGVyOiBzb2xpZCA2cHggdHJhbnNwYXJlbnQ7XG5cdFx0XHRcdFx0Ym9yZGVyLWJvdHRvbS1jb2xvcjogJG9yYW5nZTtcblx0XHRcdFx0XHRvcGFjaXR5OiAxO1xuXHRcdFx0XHRcdHotaW5kZXg6IDM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQuamNvbmZpcm0tYm94LndwLW1haWwtc210cC11cGdyYWRlLW1haWxlci1lZHVjYXRpb24tbW9kYWwge1xuXHRcdFx0cGFkZGluZzogMzBweCAzMHB4IDE1cHg7XG5cdFx0XHRib3JkZXItdG9wOiBub25lO1xuXG5cdFx0XHRkaXYuamNvbmZpcm0tdGl0bGUtYyB7XG5cdFx0XHRcdG1hcmdpbjogMCAwIDI2cHggMDtcblx0XHRcdFx0cGFkZGluZzogMDtcblxuXHRcdFx0XHQuamNvbmZpcm0taWNvbi1jIHtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAyMHB4O1xuXHRcdFx0XHRcdGNvbG9yOiAjYzRjNGM0ICFpbXBvcnRhbnQ7XG5cblx0XHRcdFx0XHRzdmcge1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiAzNXB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRkaXYuamNvbmZpcm0tY29udGVudC1wYW5lIHtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMjVweDtcblx0XHRcdH1cblxuXHRcdFx0ZGl2Lmpjb25maXJtLWJ1dHRvbnMgYnV0dG9uLmJ0bi1jb25maXJtIHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJG9yYW5nZTtcblx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAkb3JhbmdlO1xuXHRcdFx0fVxuXG5cdFx0XHQuZGlzY291bnQtbm90ZSB7XG5cdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0bWFyZ2luOiA0NXB4IDAgMDtcblxuXHRcdFx0XHRwIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOWU4O1xuXHRcdFx0XHRcdG1hcmdpbjogMCAtMzBweDtcblx0XHRcdFx0XHRwYWRkaW5nOiAyNHB4IDYwcHggMjBweDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE1cHg7XG5cdFx0XHRcdFx0Y29sb3I6ICM0ZDRkNGQ7XG5cdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHRcdFx0JjphZnRlciB7XG5cdFx0XHRcdFx0XHRjb250ZW50OiB1cmwoLi4vaW1hZ2VzL2ZvbnQtYXdlc29tZS9jaGVjay1jaXJjbGUtc29saWQtZ3JlZW4uc3ZnKTtcblx0XHRcdFx0XHRcdHdpZHRoOiA0MHB4O1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiA0MHB4O1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IDUwJTtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDVweCA2cHg7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0XHR0b3A6IC0yMHB4O1xuXHRcdFx0XHRcdFx0cmlnaHQ6IDUwJTtcblx0XHRcdFx0XHRcdG1hcmdpbi1yaWdodDogLTE4cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3BhbiB7XG5cdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdFx0XHRjb2xvcjogJHBvc2l0aXZlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YSB7XG5cdFx0XHRcdFx0Y29sb3I6ICNhYWE7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0bWFyZ2luLXRvcDogMTJweDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIiwiLy8gQ29sb3Igc3R5bGVzXG4kcHJpbWFyeS10ZXh0OiAjMjIyMjIyO1xuJHNlY29uZGFyeS10ZXh0OiAjNTU1NTU1O1xuJGRlc2NyaXB0aW9uLXRleHQ6ICM4ODg4ODg7XG4kZmllbGQtdGV4dDogIzU1NTU1NTtcbiRmaWVsZC1ib3JkZXI6ICM5OTk5OTk7XG4kc3RlZWw6ICM3MzhFOUU7XG4kc3RlZWwtZGFyazogIzM5NTM2MDtcbiRvcmFuZ2U6ICNFMjc3MzA7XG4kb3JhbmdlLWRhcms6ICNCODVBMUI7XG4kbGluazogIzIxNzFCMTtcbiRsaW5rLWhvdmVyOiAjMTM1ZTk2O1xuJHBvc2l0aXZlOiAjMDBBMzJBO1xuJG5lZ2F0aXZlOiAjRDYzNjM4O1xuXG4kZ3JleTogI0E5QTlBOTtcblxuJG1vZGFsLW9yYW5nZTogI0UyNzczMDtcbiRtb2RhbC1ncmVlbjogIzAwQTMyQTtcbiRtb2RhbC1yZWQ6ICNENjM2Mzg7XG4kbW9kYWwtYmx1ZTogIzM1ODJjNDtcblxuLy8gRWZmZWN0IHN0eWxlc1xuJHNoYWRvdy1zbTogIDBweCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNyk7XG4kc2hhZG93LW1kOiAgMHB4IDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjA3KTtcbiRzaGFkb3ctbGc6ICAwcHggMnB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcblxuJGNvbnRlbnQtcGFkZGluZzogMjBweDtcbiRwYWRkaW5nLWRlZmF1bHQ6IDMwcHg7XG5cbiRib3JkZXItY29sb3I6ICNFNUU2RTY7XG4kYm9yZGVyLXJhZGl1czogNHB4O1xuJGJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItY29sb3I7XG5cbiRicmVha3BvaW50czogKFxuXHQneHMtcGhvbmUnOiAzMjBweCxcblx0J3Bob25lJzogNjAwcHgsXG5cdCdpcGFkJzogNzY4cHgsXG5cdCd0YWJsZXQnOiA3ODJweCxcblx0J2Rlc2t0b3AnOiA5NjBweCxcbik7XG4iLCIvLyBFZHVjYXRpb24gc3R5bGVzLlxuXG4vLyBOb3RpY2UgYmFyLlxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyM3B4KSB7XG5cdCN3cC1tYWlsLXNtdHAtbm90aWNlLWJhciB7XG5cdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHR9XG59XG5cbiN3cC1tYWlsLXNtdHAtbm90aWNlLWJhciB7XG5cdG1heC1oZWlnaHQ6IDM1cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0bWFyZ2luLWJvdHRvbTogLTNweDtcblx0dHJhbnNpdGlvbjogYWxsIC4zcyBlYXNlLW91dDtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblxuXHQmLm91dCB7XG5cdFx0bWF4LWhlaWdodDogM3B4O1xuXHR9XG5cblx0LndwLW1haWwtc210cC1ub3RpY2UtYmFyLWNvbnRhaW5lciB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI0RERERERDtcblx0XHRib3JkZXItdG9wOiAzcHggc29saWQgJG9yYW5nZTtcblx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRwYWRkaW5nOiA3cHg7XG5cdH1cblxuXHRhIHtcblx0XHRjb2xvcjogJG9yYW5nZTtcblx0fVxuXG5cdGE6aG92ZXIge1xuXHRcdGNvbG9yOiAkb3JhbmdlLWRhcms7XG5cdH1cblxuXHQuZGlzbWlzcyB7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdHRvcDogMDtcblx0XHRyaWdodDogMDtcblx0XHRib3JkZXI6IG5vbmU7XG5cdFx0cGFkZGluZzogNXB4O1xuXHRcdG1hcmdpbi10b3A6IDRweDtcblx0XHRiYWNrZ3JvdW5kOiAwIDA7XG5cdFx0Y29sb3I6ICM3Mjc3N2M7XG5cdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHR9XG5cblx0LmRpc21pc3M6YmVmb3JlIHtcblx0XHRiYWNrZ3JvdW5kOiAwIDA7XG5cdFx0Y29sb3I6ICM3Mjc3N2M7XG5cdFx0Y29udGVudDogXCJcXGYzMzVcIjtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRmb250OiBub3JtYWwgMjBweC8yMHB4IGRhc2hpY29ucztcblx0XHRzcGVhazogbm9uZTtcblx0XHRoZWlnaHQ6IDIwcHg7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdHdpZHRoOiAyMHB4O1xuXHRcdC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuXHR9XG59XG5cbiNzY3JlZW4tbWV0YS1saW5rcyAuc2NyZWVuLW1ldGEtdG9nZ2xlIHtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRyaWdodDogMjBweDtcblx0dG9wOiBhdXRvO1xufVxuXG4jd3AtbWFpbC1zbXRwIHtcblxuXHQvKiBHZW5lcmFsIHN0eWxlcy4gKi9cblx0LndwLW1haWwtc210cC1wcm9kdWN0LWVkdWNhdGlvbiB7XG5cblx0XHQmX19yb3cge1xuXHRcdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNGU0ZTQ7XG5cdFx0XHRwYWRkaW5nOiAyNXB4IDAgNXB4O1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDEuMztcblx0XHRcdG1heC13aWR0aDogMTAwNXB4O1xuXG5cdFx0XHQmID4gKjpsYXN0LWNoaWxkIHtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0fVxuXG5cdFx0XHQmLS1pbmFjdGl2ZSB7XG5cdFx0XHRcdG9wYWNpdHk6IDAuNTtcblx0XHRcdFx0cG9pbnRlci1ldmVudHM6IG5vbmU7XG5cdFx0XHR9XG5cblx0XHRcdCYtLWZ1bGwtd2lkdGgge1xuXHRcdFx0XHRtYXgtd2lkdGg6IHVuc2V0O1xuXHRcdFx0fVxuXG5cdFx0XHQmLS1uby1ib3JkZXIge1xuXHRcdFx0XHRib3JkZXItYm90dG9tOiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdCYtLW5vLXBhZGRpbmcge1xuXHRcdFx0XHRwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdCY6Zmlyc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdHBhZGRpbmctdG9wOiAxMHB4O1xuXHRcdFx0fVxuXG5cdFx0XHQmOmxhc3Qtb2YtdHlwZSArIC53cC1tYWlsLXNtdHAtYnRuLXVwZ3JhZGUge1xuXHRcdFx0XHRtYXJnaW4tdG9wOiAyNXB4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCZfX2hlYWRpbmcge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRtYXJnaW4tdG9wOiAwO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblx0XHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAyNHB4O1xuXHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cblx0XHRcdCY6YWZ0ZXIge1xuXHRcdFx0XHRjb250ZW50OiAnJztcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IDEwcHg7XG5cdFx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL3Byby1iYWRnZS1zbWFsbC5zdmcnKTtcblx0XHRcdFx0YmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuXHRcdFx0XHR3aWR0aDogMzVweDtcblx0XHRcdFx0aGVpZ2h0OiAxNnB4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCZfX2Rlc2NyaXB0aW9uIHtcblx0XHRcdG1hcmdpbi10b3A6IDA7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAyMHB4O1xuXHRcdFx0Y29sb3I6ICRzZWNvbmRhcnktdGV4dDtcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAxLjVlbTtcblx0XHR9XG5cblx0XHQmX19zY3JlZW5zaG90cyB7XG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0ZmxleC13cmFwOiB3cmFwO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjxwaG9uZVwiKSB7XG5cdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHR9XG5cblx0XHRcdCYgPiBkaXYge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0XHRtYXJnaW46IDAgMjVweCAyMHB4IDA7XG5cblx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8cGhvbmVcIikge1xuXHRcdFx0XHRcdG1hcmdpbi1yaWdodDogMDtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IHVuc2V0ICFpbXBvcnRhbnQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmOmxhc3QtY2hpbGQge1xuXHRcdFx0XHRcdG1hcmdpbi1yaWdodDogMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGEge1xuXHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAxMHB4O1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6ICNGRkZGRkY7XG5cdFx0XHRcdFx0Ym9yZGVyOiA1cHggc29saWQgI0ZGRkZGRjtcblx0XHRcdFx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IDRweDtcblxuXHRcdFx0XHRcdCY6YWZ0ZXIge1xuXHRcdFx0XHRcdFx0Y29udGVudDogXCJcIjtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRcdG9wYWNpdHk6IDA7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdHRvcDogMDtcblx0XHRcdFx0XHRcdGxlZnQ6IDA7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDY4LCA2OCwgNjgsIDAuMTUpO1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi8uLi9hc3NldHMvaW1hZ2VzL2ljb25zL3pvb20uc3ZnJyk7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZC1zaXplOiA1MHB4O1xuXHRcdFx0XHRcdFx0dHJhbnNpdGlvbjogYWxsIDAuM3M7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Jjpob3ZlcjphZnRlciB7XG5cdFx0XHRcdFx0XHRvcGFjaXR5OiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGltZyB7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdGhlaWdodDogYXV0bztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNwYW4ge1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMThweDtcblx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRcdFx0Y29sb3I6ICRzZWNvbmRhcnktdGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQmLS10d28gPiBkaXYge1xuXHRcdFx0XHRtYXgtd2lkdGg6IDQ4N3B4O1xuXHRcdFx0fVxuXG5cdFx0XHQmLS10aHJlZSA+IGRpdiB7XG5cdFx0XHRcdG1heC13aWR0aDogMzE2cHg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jl9fbGlzdCB7XG5cblx0XHRcdCYgPiBoNCB7XG5cdFx0XHRcdG1hcmdpbi10b3A6IDA7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDIwcHg7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHQmID4gZGl2IHtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0ZmxleC13cmFwOiB3cmFwO1xuXHRcdFx0fVxuXG5cdFx0XHR1bCB7XG5cdFx0XHRcdHdpZHRoOiAyOTBweDtcblx0XHRcdFx0bWFyZ2luOiAwIDQwcHggMjBweCAwO1xuXG5cdFx0XHRcdGxpIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAyMHB4O1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDA7XG5cdFx0XHRcdFx0Y29sb3I6ICRzZWNvbmRhcnktdGV4dDtcblxuXHRcdFx0XHRcdCYgKyBsaSB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tdG9wOiAyMHB4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IHVybCgnLi4vLi4vYXNzZXRzL2ltYWdlcy9pY29ucy9jaGVjay1zb2xpZC5zdmcnKTtcblx0XHRcdFx0XHRcdHdpZHRoOiAxNnB4O1xuXHRcdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiAxMHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qIEV4cG9ydCBlbWFpbCBsb2dzIGVkdWNhdGlvbiBwYWdlLiAqL1xuXHQjd3AtbWFpbC1zbXRwLXRvb2xzLWV4cG9ydC1lbWFpbC1sb2dzLXByb2R1Y3QtZWR1Y2F0aW9uIHtcblxuXHRcdHNlY3Rpb24ge1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMjBweDtcblx0XHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cblx0XHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMjBweDtcblx0XHRcdH1cblxuXHRcdFx0aDUge1xuXHRcdFx0XHRjbGVhcjogYm90aDtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMTBweCAwO1xuXHRcdFx0XHRjb2xvcjogJHByaW1hcnktdGV4dDtcblx0XHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0fVxuXG5cdFx0XHRsYWJlbCB7XG5cdFx0XHRcdGNsZWFyOiBib3RoO1xuXHRcdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdFx0bWFyZ2luOiAzcHggMCAzcHggMDtcblx0XHRcdH1cblxuXHRcdFx0LndwLW1haWwtc210cC1kYXRlLXNlbGVjdG9yIHtcblx0XHRcdFx0d2lkdGg6IDIwMHB4O1xuXHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHR9XG5cblx0XHRcdC53cC1tYWlsLXNtdHAtc2VhcmNoLWJveC1maWVsZCB7XG5cdFx0XHRcdHdpZHRoOiAyMDBweDtcblx0XHRcdH1cblxuXHRcdFx0LndwLW1haWwtc210cC1zZWFyY2gtYm94LXRlcm0ge1xuXHRcdFx0XHR3aWR0aDogMzAwcHg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyogQ29udHJvbHMgZWR1Y2F0aW9uIHBhZ2UuICovXG5cdCN3cC1tYWlsLXNtdHAtZW1haWwtY29udHJvbHMtcHJvZHVjdC1lZHVjYXRpb24ge1xuXG5cdFx0LndwLW1haWwtc210cC1wcm9kdWN0LWVkdWNhdGlvbl9fcm93LS1pbmFjdGl2ZSB7XG5cdFx0XHRwYWRkaW5nLXRvcDogMjBweDtcblx0XHRcdHBhZGRpbmctYm90dG9tOiAwO1xuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3c6bGFzdC1jaGlsZCB7XG5cdFx0XHRib3JkZXItYm90dG9tOiBub25lO1xuXHRcdH1cblx0fVxuXG5cdC8qIE5ldHdvcmsgZWR1Y2F0aW9uIHBhZ2UuICovXG5cdC53cC1tYWlsLXNtdHAtcGFnZS1udy1wcm9kdWN0LWVkdSB7XG5cdFx0aDIge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHR9XG5cblx0XHQuYmFkZ2Uge1xuXHRcdFx0bWFyZ2luOiAwIDAgMnB4IDdweDtcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0XHR3aWR0aDogNDBweDtcblx0XHRcdGhlaWdodDogMTdweDtcblx0XHR9XG5cblx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LW11bHRpc2l0ZSB7XG5cdFx0XHRjb2xvcjogIzlhOWE5YTtcblxuXHRcdFx0cC5kZXNjIHtcblx0XHRcdFx0Y29sb3I6ICNiYWJhYmE7XG5cdFx0XHR9XG5cblx0XHRcdGlucHV0W3R5cGU9Y2hlY2tib3hdOmRpc2FibGVkIHtcblx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAjYWFhO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctbm8tc2V0dGluZyB7XG5cdFx0XHRtYXJnaW4tdG9wOiAzMHB4O1xuXHRcdH1cblx0fVxufVxuXG4ud3AtbWFpbC1zbXRwLWxpdGUgI3dwLW1haWwtc210cCB7XG5cblx0LyogRW1haWwgcmVwb3J0cyBlZHVjYXRpb24gcGFnZS4gKi9cblx0LndwLW1haWwtc210cC1wYWdlLXJlcG9ydHMge1xuXG5cdFx0LndwLW1haWwtc210cC1wYWdlLXRpdGxlIC5wYWdlLXRpdGxlIHtcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHRcdFx0JjphZnRlciB7XG5cdFx0XHRcdGNvbnRlbnQ6ICcnO1xuXHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdG1hcmdpbi1sZWZ0OiAxMHB4O1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9wcm8tYmFkZ2Utc21hbGwuc3ZnJyk7XG5cdFx0XHRcdGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcblx0XHRcdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcblx0XHRcdFx0d2lkdGg6IDM1cHg7XG5cdFx0XHRcdGhlaWdodDogMTZweDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuXG4iLCIvLyBDdXN0b20gc3R5bGUgZm9yIHRoZSBwbHVnaW4gU1ZHIGxvYWRlci5cbi53cC1tYWlsLXNtdHAtbG9hZGluZyB7XG5cdGFuaW1hdGlvbjogMC42NXMgbGluZWFyIGluZmluaXRlIHdwLW1haWwtc210cC1sb2FkaW5nLXNwaW47XG59XG5cbi53cC1tYWlsLXNtdHAtbG9hZGluZy1tZCB7XG5cdHdpZHRoOiAzMnB4O1xuXHRoZWlnaHQ6IDMycHg7XG59XG5cbi53cC1tYWlsLXNtdHAtbG9hZGluZy1zbSB7XG5cdHdpZHRoOiAxNnB4O1xuXHRoZWlnaHQ6IDE2cHg7XG59XG5cbi8vIENTUyBsb2FkaW5nIHNwaW5uZXIuXG4ud3AtbWFpbC1zbXRwLWxvYWRpbmctc3BpbiB7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0Y29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG5cdHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG5cdCY6YWZ0ZXIge1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdGFuaW1hdGlvbjogMC42NXMgbGluZWFyIGluZmluaXRlIHdwLW1haWwtc210cC1sb2FkaW5nLXNwaW47XG5cdFx0Ym9yZGVyOiAycHggc29saWQgI2ZmZjtcblx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0Ym9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuXHRcdGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG5cdFx0Y29udGVudDogXCJcIjtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0XHR0b3A6IDUwJTtcblx0XHRsZWZ0OiA1MCU7XG5cdFx0d2lkdGg6IDE2cHg7XG5cdFx0aGVpZ2h0OiAxNnB4O1xuXHRcdG1hcmdpbi10b3A6IC04cHg7XG5cdFx0bWFyZ2luLWxlZnQ6IC04cHg7XG5cdH1cbn1cblxuQGtleWZyYW1lcyB3cC1tYWlsLXNtdHAtbG9hZGluZy1zcGluIHtcblx0MCUge1xuXHRcdHRyYW5zZm9ybTogcm90YXRlWigyNzBkZWcpO1xuXHR9XG5cdDEwMCUge1xuXHRcdHRyYW5zZm9ybTogcm90YXRlWig2MzBkZWcpXG5cdH1cbn1cbiIsIi8vIEZseW91dCBNZW51IHN0eWxlcy5cblxuQGltcG9ydCBcInZhcmlhYmxlc1wiO1xuXG4jd3AtbWFpbC1zbXRwLWZseW91dCB7XG5cdCRzdGFydDogNzVweDtcblx0JHN0ZXA6IDU1cHg7XG5cdCR0cmFuczogMC4ycztcblx0JGRlbGF5OiAzNW1zO1xuXG5cdHBvc2l0aW9uOiBmaXhlZDtcblx0ei1pbmRleDogOTk5OTk7XG5cdHRyYW5zaXRpb246IGFsbCAkdHJhbnMgZWFzZS1pbi1vdXQ7XG5cdHJpZ2h0OiA0MHB4O1xuXHRib3R0b206IDQwcHg7XG5cdG9wYWNpdHk6IDE7XG5cblx0QGluY2x1ZGUgbWVkaWEoJzxkZXNrdG9wJykge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLWZseW91dC1oZWFkIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHR9XG5cblx0XHRmaWd1cmUge1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogNTAlO1xuXHRcdFx0Ym9yZGVyOiAzcHggc29saWQgJG9yYW5nZTtcblx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG5cdFx0XHRib3gtc2hhZG93OiAwIDJweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0dHJhbnNpdGlvbjogYWxsICR0cmFucyBlYXNlLWluLW91dDtcblxuXHRcdFx0aW1nIHtcblx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdHdpZHRoOiA1NHB4O1xuXHRcdFx0XHRoZWlnaHQ6IDU0cHg7XG5cdFx0XHRcdHRyYW5zaXRpb246IGFsbCAkdHJhbnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jjpob3ZlciBmaWd1cmUge1xuXHRcdFx0Ym94LXNoYWRvdzogMCAycHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMik7XG5cdFx0fVxuXG5cdFx0LndwLW1haWwtc210cC1mbHlvdXQtbGFiZWwge1xuXHRcdFx0cmlnaHQ6IGNhbGMoMTAwJSArIDE1cHgpO1xuXHRcdFx0b3BhY2l0eTogMDtcblx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwKTtcblx0XHRcdG1hcmdpbi1yaWdodDogLTUwcHg7XG5cdFx0fVxuXG5cdFx0Jjpob3ZlciAud3AtbWFpbC1zbXRwLWZseW91dC1sYWJlbCB7XG5cdFx0XHRvcGFjaXR5OiAxO1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDEpO1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAwO1xuXHRcdH1cblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtZmx5b3V0LWxhYmVsIHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0dG9wOiA1MCU7XG5cdFx0cmlnaHQ6IGNhbGMoMTAwJSArIDE1cHgpO1xuXHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcblx0XHQtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcblx0XHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcblx0XHRjb2xvcjogI2ZmZjtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjQTdBQUFEO1xuXHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdHBhZGRpbmc6IDZweCAxMHB4O1xuXHRcdGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuXHRcdGxpbmUtaGVpZ2h0OiBpbml0aWFsO1xuXHRcdHRyYW5zaXRpb246IGFsbCAkdHJhbnMgZWFzZS1vdXQ7XG5cdFx0Ym9yZGVyLXJhZGl1czogM3B4O1xuXHRcdC1tb3otYm9yZGVyLXJhZGl1czogM3B4O1xuXHRcdC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4O1xuXHR9XG5cblx0LndwLW1haWwtc210cC1mbHlvdXQtaXRlbSB7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0bGVmdDogMTBweDtcblx0XHR3aWR0aDogNDBweDtcblx0XHRoZWlnaHQ6IDQwcHg7XG5cdFx0b3BhY2l0eTogMDtcblx0XHR2aXNpYmlsaXR5OiBoaWRkZW47XG5cdFx0dHJhbnNpdGlvbjogYWxsICR0cmFucyBlYXNlLWluLW91dDtcblx0XHR0cmFuc2Zvcm06IHNjYWxlKDApO1xuXHRcdGJvcmRlci1yYWRpdXM6IDUwJTtcblx0XHRib3gtc2hhZG93OiAkc2hhZG93LWxnO1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICM3MzhFOUU7XG5cblx0XHRpbWcge1xuXHRcdFx0bWFyZ2luOiBhdXRvO1xuXHRcdH1cblxuXHRcdEBmb3IgJGkgZnJvbSAwIHRocm91Z2ggNCB7XG5cdFx0XHQmLndwLW1haWwtc210cC1mbHlvdXQtaXRlbS0jeyRpfSB7XG5cdFx0XHRcdGJvdHRvbTogJHN0YXJ0ICsgJGkgKiAkc3RlcDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmOmhvdmVyIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICMzOTUzNjA7XG5cblx0XHRcdC53cC1tYWlsLXNtdHAtZmx5b3V0LWxhYmVsIHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogIzc4N0M4Mjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQmLm9wZW5lZCB7XG5cblx0XHQud3AtbWFpbC1zbXRwLWZseW91dC1pdGVtIHtcblx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHR2aXNpYmlsaXR5OiB2aXNpYmxlO1xuXHRcdFx0dHJhbnNmb3JtOiBzY2FsZSgxKTtcblx0XHR9XG5cblx0XHQud3AtbWFpbC1zbXRwLWZseW91dC1oZWFkIHtcblxuXHRcdFx0LndwLW1haWwtc210cC1mbHlvdXQtbGFiZWwge1xuXHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0fVxuXG5cdFx0XHRmaWd1cmUgaW1nIHtcblx0XHRcdFx0dHJhbnNmb3JtOiByb3RhdGUoLTE1ZGVnKSBzY2FsZSgxLjE3KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRAZm9yICRpIGZyb20gMCB0aHJvdWdoIDQge1xuXHRcdFx0LndwLW1haWwtc210cC1mbHlvdXQtaXRlbS0jeyRpfSB7XG5cdFx0XHRcdHRyYW5zaXRpb246IHRyYW5zZm9ybSAkdHJhbnMgJGkgKiAkZGVsYXksIGJhY2tncm91bmQtY29sb3IgJHRyYW5zO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdCYub3V0IHtcblx0XHRvcGFjaXR5OiAwO1xuXHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0fVxufVxuIiwiLndwLW1haWwtc210cC10b29sdGlwIHtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHR0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDtcblx0Y3Vyc29yOiBoZWxwO1xuXHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRtYXJnaW4tdG9wOiAxNXB4ICFpbXBvcnRhbnQ7XG5cblx0Ji10ZXh0IHtcblx0XHR2aXNpYmlsaXR5OiBoaWRkZW47XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdHotaW5kZXg6IDk5OTk7XG5cdFx0d2lkdGg6IDM2MHB4O1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICMyRDRGNjA7XG5cdFx0Y29sb3I6ICNmZmY7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdHBhZGRpbmc6IDE2cHggMjBweDtcblx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0Ym9yZGVyLXJhZGl1czogNXB4O1xuXHRcdGJvdHRvbTogMTAwJTtcblx0XHRsZWZ0OiA1MCU7XG5cdFx0bWFyZ2luLWxlZnQ6IC0xODBweDtcblxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGNvbnRlbnQ6IFwiIFwiO1xuXHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0dG9wOiAxMDAlO1xuXHRcdFx0bGVmdDogNTAlO1xuXHRcdFx0bWFyZ2luLWxlZnQ6IC01cHg7XG5cdFx0XHRib3JkZXItd2lkdGg6IDVweDtcblx0XHRcdGJvcmRlci1zdHlsZTogc29saWQ7XG5cdFx0XHRib3JkZXItY29sb3I6ICMyRDRGNjAgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG5cdFx0fVxuXHR9XG5cblx0Jjpob3ZlciAud3AtbWFpbC1zbXRwLXRvb2x0aXAtdGV4dCB7XG5cdFx0dmlzaWJpbGl0eTogdmlzaWJsZTtcblx0fVxufVxuIiwiI3dwLW1haWwtc210cCB7XG5cblx0LndwLW1haWwtc210cC1jb25kaXRpb25hbCB7XG5cblx0XHRidXR0b24ge1xuXHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdH1cblxuXHRcdHRhYmxlIHtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0bWF4LXdpZHRoOiA3NDBweDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuXHRcdFx0Ym9yZGVyLXNwYWNpbmc6IDA7XG5cdFx0XHRmb250LXNpemU6IDEzcHg7XG5cdFx0fVxuXG5cdFx0dGFibGUgdGQge1xuXHRcdFx0cGFkZGluZzogMCAxMHB4IDIwcHggMDtcblx0XHR9XG5cblx0XHQmX19yb3cge1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdFx0fVxuXG5cdFx0XHRpbnB1dCxcblx0XHRcdHNlbGVjdCB7XG5cdFx0XHRcdHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG5cdFx0XHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmX19wcm9wZXJ0eS1jb2wge1xuXHRcdFx0d2lkdGg6IDIzJTtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8PXBob25lXCIpIHtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jl9fb3BlcmF0b3ItY29sIHtcblx0XHRcdHdpZHRoOiAyMyU7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPD1waG9uZVwiKSB7XG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCZfX3ZhbHVlLWNvbCB7XG5cdFx0XHR3aWR0aDogNDIlO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmX192YWx1ZSA6ZGlzYWJsZWQge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcblx0XHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdFx0fVxuXG5cdFx0Jl9fYWN0aW9ucyB7XG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdHBhZGRpbmctcmlnaHQ6IDA7XG5cdFx0fVxuXG5cdFx0Jl9fZGVsZXRlLXJ1bGUge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHRjb2xvcjogIzk5OTk5OTtcblx0XHRcdG1hcmdpbjogMCAwIDAgMTBweDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0Y29sb3I6ICRuZWdhdGl2ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmX19ncm91cC1kZWxpbWl0ZXIge1xuXHRcdFx0bWFyZ2luOiAwIDAgMjBweDtcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0XHRcdGZvbnQtd2VpZ2h0OiA0MDA7XG5cdFx0XHRsaW5lLWhlaWdodDogMTdweDtcblx0XHRcdGNvbG9yOiAkZGVzY3JpcHRpb24tdGV4dDtcblx0XHR9XG5cdH1cbn1cbiIsIkBpbXBvcnQgXCJpbmNsdWRlLW1lZGlhXCI7XG5AaW1wb3J0IFwidmFyaWFibGVzXCI7XG5AaW1wb3J0IFwiZ2VuZXJhbFwiO1xuQGltcG9ydCBcImNvbmZpcm1cIjtcbkBpbXBvcnQgXCJlZHVjYXRpb25cIjtcbkBpbXBvcnQgXCJsb2FkZXJcIjtcbkBpbXBvcnQgXCJmbHlvdXQtbWVudVwiO1xuQGltcG9ydCBcInRvb2x0aXBcIjtcbkBpbXBvcnQgXCJjb25kaXRpb25hbC1sb2dpY1wiO1xuXG4vLyBTY3JlZW4gb3B0aW9ucyBhcmUgaGlkZGVuIG9uIGxvYWQsIHRoZW4gbWFkZSB2aXNpYmxlIHdpdGggSlMsIHRvXG4vLyBwcmV2ZW50IGl0IGZyb20gXCJqdW1waW5nXCIuXG4jc2NyZWVuLW1ldGEtbGlua3MsXG4jc2NyZWVuLW1ldGEge1xuXHRkaXNwbGF5OiBub25lO1xufVxuXG4jd3AtbWFpbC1zbXRwLWhlYWRlci10ZW1wIHtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRtYXJnaW46IDA7XG5cdHRvcDogLTFweDtcblx0bGVmdDogMjBweDtcblx0cmlnaHQ6IDA7XG5cdHotaW5kZXg6IDk5O1xufVxuXG4jd3AtbWFpbC1zbXRwLWhlYWRlciB7XG5cdGJvcmRlci10b3A6IDNweCBzb2xpZCAkb3JhbmdlO1xuXHRwYWRkaW5nOiAyNHB4ICRjb250ZW50LXBhZGRpbmc7XG5cblx0aW1nIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRtYXJnaW46IDA7XG5cdFx0bWF4LXdpZHRoOiAyNDJweDtcblxuXHRcdEBpbmNsdWRlIG1lZGlhKFwiPD10YWJsZXRcIikge1xuXHRcdFx0bWF4LXdpZHRoOiAyMDBweDtcblx0XHR9XG5cdH1cbn1cblxuLndwLW1haWwtc210cC1wYWdlIHtcblx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cblx0YSB7XG5cdFx0Y29sb3I6ICRsaW5rO1xuXG5cdFx0Jjpob3Zlcixcblx0XHQmOmFjdGl2ZSB7XG5cdFx0XHRjb2xvcjogJGxpbmstaG92ZXI7XG5cdFx0fVxuXHR9XG59XG5cbiN3cC1tYWlsLXNtdHAge1xuXHRtYXJnaW46IDA7XG5cblx0LndwLW1haWwtc210cC1oaWRlIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG5cblx0LndwLW1haWwtc210cC1wYWdlLXRpdGxlIHtcblx0XHRtaW4taGVpZ2h0OiA1OHB4O1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdG1hcmdpbjogMCAwIDIwcHggMDtcblx0XHRwYWRkaW5nOiAwICRjb250ZW50LXBhZGRpbmc7XG5cblx0XHRhLnRhYiB7XG5cdFx0XHRib3JkZXItYm90dG9tOiAycHggc29saWQgI2ZmZjtcblx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRjb2xvcjogIzY2Njtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdG1hcmdpbi1yaWdodDogMzBweDtcblx0XHRcdHBhZGRpbmc6IDIwcHggMCAxOHB4IDA7XG5cdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cblx0XHRcdCYuYWN0aXZlIHtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICRvcmFuZ2U7XG5cdFx0XHR9XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRib3JkZXItY29sb3I6ICM5OTk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YS5hY3Rpb24ge1xuXHRcdFx0Y29sb3I6ICNmZmY7XG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0bWFyZ2luOiAxNHB4IDAgMTRweCAxMHB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDI4cHg7XG5cdFx0XHRtaW4taGVpZ2h0OiAzMHB4O1xuXHRcdFx0dmVydGljYWwtYWxpZ246IHRvcDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8PXBob25lXCIpIHtcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LnBhZ2UtdGl0bGUge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdGZvbnQtc2l6ZTogMjNweDtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDIwcHggMjBweCAyMHB4IDA7XG5cdFx0fVxuXHR9XG5cblx0LndwLW1haWwtc210cC1wYWdlLWNvbnRlbnQge1xuXHRcdHBhZGRpbmc6IDAgJGNvbnRlbnQtcGFkZGluZztcblxuXHRcdCosXG5cdFx0Kjo6YmVmb3JlLFxuXHRcdCo6OmFmdGVyIHtcblx0XHRcdC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0fVxuXG5cdFx0LndwLW1haWwtc210cC1jbGVhciB7XG5cdFx0XHQmOmJlZm9yZSB7XG5cdFx0XHRcdGNvbnRlbnQ6IFwiIFwiO1xuXHRcdFx0XHRkaXNwbGF5OiB0YWJsZTtcblx0XHRcdH1cblx0XHRcdCY6YWZ0ZXIge1xuXHRcdFx0XHRjbGVhcjogYm90aDtcblx0XHRcdFx0Y29udGVudDogXCIgXCI7XG5cdFx0XHRcdGRpc3BsYXk6IHRhYmxlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldHRpbmcgcm93cywgZWcgZmllbGQgcm93LlxuXHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3cge1xuXHRcdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNGU0ZTQ7XG5cdFx0XHRwYWRkaW5nOiAzMHB4IDA7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMS4zO1xuXG5cdFx0XHQmOmZpcnN0LW9mLXR5cGUge1xuXHRcdFx0XHRwYWRkaW5nLXRvcDogMTBweCAhaW1wb3J0YW50O1xuXHRcdFx0fVxuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjx0YWJsZXRcIikge1xuXHRcdFx0XHRwYWRkaW5nOiAyMHB4IDA7XG5cdFx0XHR9XG5cblx0XHRcdCYuaW5hY3RpdmUge1xuXHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0fVxuXG5cdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctbWlkLXJvdy1zZXAge1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjZTRlNGU0O1xuXHRcdFx0XHRoZWlnaHQ6IDFweDtcblx0XHRcdFx0Ym9yZGVyOiAwO1xuXHRcdFx0XHRtYXJnaW46IDE1cHggMDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VjdGlvbiBoZWFkaW5nLlxuXHRcdFx0Ji5zZWN0aW9uLWhlYWRpbmcge1xuXHRcdFx0XHRwYWRkaW5nOiAyMHB4IDA7XG5cblx0XHRcdFx0Ji5uby1kZXNjIHtcblx0XHRcdFx0XHRoMixcblx0XHRcdFx0XHRoNCB7XG5cdFx0XHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWZpZWxkIHtcblx0XHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdFx0bWF4LXdpZHRoOiAxMDA1cHg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuZGVzYyB7XG5cdFx0XHRcdFx0Zm9udC1zdHlsZTogbm9ybWFsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrYm94IHNldHRpbmdzIGZpZWxkLlxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctY2hlY2tib3gge1xuXG5cdFx0XHRcdGlucHV0W3R5cGU9Y2hlY2tib3hdIHtcblx0XHRcdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdFx0XHRtYXJnaW46IDFweCAwIDAgMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlucHV0W3R5cGU9Y2hlY2tib3hdICsgbGFiZWwge1xuXHRcdFx0XHRcdG1hcmdpbjogMCAwIDAgOHB4O1xuXHRcdFx0XHRcdHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5kZXNjIHtcblx0XHRcdFx0XHRtYXJnaW46IDAgMCAwIDMwcHg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnB1dFt0eXBlPWNoZWNrYm94XSArIGxhYmVsICsgLmRlc2Mge1xuXHRcdFx0XHRcdG1hcmdpbjogOHB4IDAgMCAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRleHQgYmFzZWQgc2V0dGluZ3MgZmllbGQuXG5cdFx0XHQmLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy10ZXh0LFxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctcGFzc3dvcmQsXG5cdFx0XHQmLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1udW1iZXIsXG5cdFx0XHQmLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1lbWFpbCB7XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWxhYmVsIHtcblx0XHRcdFx0XHRwYWRkaW5nLXRvcDogOHB4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlbGVjdCBzZXR0aW5ncyBmaWVsZC5cblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LXNlbGVjdCB7XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWxhYmVsIHtcblx0XHRcdFx0XHRwYWRkaW5nLXRvcDogOHB4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJhZGlvIHNldHRpbmdzIGZpZWxkLlxuXHRcdFx0Ji53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctcmFkaW8ge1xuXG5cdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1maWVsZCB7XG5cblx0XHRcdFx0XHRpbnB1dFt0eXBlPXJhZGlvXSB7XG5cdFx0XHRcdFx0XHRtYXJnaW46IC0zcHggMTBweCAwIDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bGFiZWwge1xuXHRcdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiAzMHB4O1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LW5vLWJvcmRlciB7XG5cdFx0XHRcdGJvcmRlci1ib3R0b206IG5vbmU7XG5cdFx0XHR9XG5cblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LW5vLXBhZGRpbmcge1xuXHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSYWRpbyBzZXR0aW5ncyBmaWVsZC5cblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LWNoZWNrYm94LXRvZ2dsZSB7XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWZpZWxkIHtcblxuXHRcdFx0XHRcdGxhYmVsIHtcblx0XHRcdFx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aW5wdXRbdHlwZT1jaGVja2JveF0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdFx0dG9wOiBhdXRvO1xuXHRcdFx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdFx0XHRcdGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcblx0XHRcdFx0XHRcdHdpZHRoOiAxcHg7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDFweDtcblx0XHRcdFx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cblx0XHRcdFx0XHRcdCY6Y2hlY2tlZCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoIHtcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJHBvc2l0aXZlO1xuXG5cdFx0XHRcdFx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0XHRcdFx0XHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxNnB4KTtcblx0XHRcdFx0XHRcdFx0XHQtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE2cHgpO1xuXHRcdFx0XHRcdFx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxNnB4KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQmOmRpc2FibGVkIHtcblx0XHRcdFx0XHRcdFx0JjpjaGVja2VkOmhvdmVyICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gsXG5cdFx0XHRcdFx0XHRcdCY6bm90KDpjaGVja2VkKTpob3ZlciArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Jjpub3QoOmNoZWNrZWQpOmhvdmVyICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQmICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG5cdFx0XHRcdFx0XHRcdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0JjpjaGVja2VkICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IGxpZ2h0ZW4oJHBvc2l0aXZlLCAyNSk7XG5cdFx0XHRcdFx0XHRcdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCY6Y2hlY2tlZCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1jaGVja2VkLWxhYmVsIHtcblx0XHRcdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQmOmNoZWNrZWQgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXN3aXRjaCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtY2hlY2tlZC1sYWJlbCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtdW5jaGVja2VkLWxhYmVsIHtcblx0XHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0JjpkaXNhYmxlZCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1jaGVja2VkLWxhYmVsLFxuXHRcdFx0XHRcdFx0JjpkaXNhYmxlZCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS11bmNoZWNrZWQtbGFiZWwge1xuXHRcdFx0XHRcdFx0XHRjb2xvcjogbGlnaHRlbigjNDQ0LCA0MCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCY6Y2hlY2tlZDpob3Zlcixcblx0XHRcdFx0XHRcdCY6Y2hlY2tlZDpmb2N1cyB7XG5cdFx0XHRcdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLXN3aXRjaCB7XG5cdFx0XHRcdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAkcG9zaXRpdmU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Jjpub3QoOmNoZWNrZWQpOmhvdmVyLFxuXHRcdFx0XHRcdFx0Jjpub3QoOmNoZWNrZWQpOmZvY3VzIHtcblx0XHRcdFx0XHRcdFx0JiArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtc3dpdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5O1xuXHRcdFx0XHRcdFx0XHRcdGJveC1zaGFkb3c6IDAgMCAwIDFweCAjZmZmLCAwIDAgMCAzcHggIzk5OTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtdW5jaGVja2VkLWxhYmVsLFxuXHRcdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGUtY2hlY2tlZC1sYWJlbCB7XG5cdFx0XHRcdFx0XHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRcdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDQwMDtcblx0XHRcdFx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0XHRcdFx0XHRmb250LXNpemU6IDEzcHg7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1jaGVja2VkLWxhYmVsIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS1zd2l0Y2gge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2NjYztcblx0XHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IDE1cHg7XG5cdFx0XHRcdFx0XHQtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0LW1vei10cmFuc2l0aW9uOiAgICBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdC1tcy10cmFuc2l0aW9uOiAgICAgYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHR0cmFuc2l0aW9uOiAgICAgICAgIGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHRcdG1hcmdpbjogLTFweCA1cHggMCAwO1xuXHRcdFx0XHRcdFx0d2lkdGg6IDM2cHg7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDIwcHg7XG5cblx0XHRcdFx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBcIlwiO1xuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IDE2cHg7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOiAxNnB4O1xuXHRcdFx0XHRcdFx0XHRsZWZ0OiAycHg7XG5cdFx0XHRcdFx0XHRcdHRvcDogMnB4O1xuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0XHRcdFx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHRcdC1tb3otdHJhbnNpdGlvbjogICAgYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHRcdC1tcy10cmFuc2l0aW9uOiAgICAgYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHRcdHRyYW5zaXRpb246ICAgICAgICAgYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haWxlciBpbWFnZSByYWRpbyBzZXR0aW5ncyBmaWVsZC5cblx0XHRcdCYud3AtbWFpbC1zbXRwLXNldHRpbmctcm93LW1haWxlciB7XG5cdFx0XHRcdHBhZGRpbmctYm90dG9tOiAyMHB4O1xuXG5cdFx0XHRcdC53cC1tYWlsLXNtdHAtbWFpbGVycyB7XG5cblx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLW1haWxlciB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0XHR3aWR0aDogMTQwcHg7XG5cdFx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IDEycHg7XG5cdFx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAxMnB4O1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLW1haWxlci1pbWFnZSB7XG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XG5cdFx0XHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0XHRcdFx0Ym9yZGVyOiAycHggc29saWQgI0U1RTVFNTtcblx0XHRcdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG5cdFx0XHRcdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiA3NnB4O1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDEwcHg7XG5cdFx0XHRcdFx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHRcdC1tb3otdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdFx0XHRcdC1tcy10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0dHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cblx0XHRcdFx0XHRcdFx0Ji5pcy1yZWNvbW1lbmRlZCB7XG5cdFx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9yZWNvbW1lbmRlZC5zdmcpO1xuXHRcdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdFx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1zaXplOiA2MCU7XG5cdFx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIHJpZ2h0IC0ycHg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpbWcge1xuXHRcdFx0XHRcdFx0XHRcdG1heC13aWR0aDogODAlO1xuXHRcdFx0XHRcdFx0XHRcdG1heC1oZWlnaHQ6IDQwcHg7XG5cdFx0XHRcdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdFx0XHRcdHRvcDogNTAlO1xuXHRcdFx0XHRcdFx0XHRcdGxlZnQ6IDUwJTtcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcblx0XHRcdFx0XHRcdFx0XHRvcGFjaXR5OiAwLjY7XG5cdFx0XHRcdFx0XHRcdFx0LXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0XHQtbW96LXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHRcdFx0XHRcdC1tcy10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQmLndwLW1haWwtc210cC1tYWlsZXItc210cCAud3AtbWFpbC1zbXRwLW1haWxlci1pbWFnZSBpbWcge1xuXHRcdFx0XHRcdFx0XHRtYXgtaGVpZ2h0OiAzMHB4XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCYuYWN0aXZlIHtcblx0XHRcdFx0XHRcdFx0LndwLW1haWwtc210cC1tYWlsZXItaW1hZ2Uge1xuXHRcdFx0XHRcdFx0XHRcdGJvcmRlci1jb2xvcjogJG9yYW5nZTtcblxuXHRcdFx0XHRcdFx0XHRcdGltZyB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvcGFjaXR5OiAxO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0XHRcdFx0LndwLW1haWwtc210cC1tYWlsZXItaW1hZ2Uge1xuXHRcdFx0XHRcdFx0XHRcdGJvcmRlci1jb2xvcjogI2NjYztcblxuXHRcdFx0XHRcdFx0XHRcdGltZyB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvcGFjaXR5OiAxO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQmLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1hbGVydCB7XG5cdFx0XHRcdHBhZGRpbmctdG9wOiAyMHB4O1xuXHRcdFx0XHRwYWRkaW5nLWJvdHRvbTogMjVweDtcblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctcm93IHtcblx0XHRcdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuc2VjdGlvbi1oZWFkaW5nIHtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAyNXB4O1xuXG5cdFx0XHRcdFx0aDMge1xuXHRcdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblx0XHRcdFx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0XHRcdFx0XHRmb250LXNpemU6IDE4cHg7XG5cdFx0XHRcdFx0XHRsaW5lLWhlaWdodDogMjJweDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQubm90aWNlIHtcblx0XHRcdFx0XHRcdG1hcmdpbi10b3A6IDIwcHg7XG5cblx0XHRcdFx0XHRcdHAge1xuXHRcdFx0XHRcdFx0XHRtYXJnaW46IDYuNXB4IDA7XG5cdFx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctcm93IHtcblx0XHRcdFx0XHRwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG5cblx0XHRcdFx0XHQmICsgLndwLW1haWwtc210cC1zZXR0aW5nLXJvdyB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tdG9wOiAyMHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1maWVsZCB7XG5cblx0XHRcdFx0XHQud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlLWNoZWNrZWQtbGFiZWwsXG5cdFx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZS11bmNoZWNrZWQtbGFiZWwge1xuXHRcdFx0XHRcdFx0dGV4dC10cmFuc2Zvcm06IG5vbmU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWxhYmVsIHtcblx0XHRcdFx0XHRsYWJlbCB7XG5cdFx0XHRcdFx0XHRmb250LXdlaWdodDogNTAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5kYXNoaWNvbnMtdHJhc2gge1xuXHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHR0b3A6IDZweDtcblx0XHRcdFx0XHRjb2xvcjogI0E3QUFBRDtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdFx0dHJhbnNpdGlvbjogMC4ycztcblxuXHRcdFx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRcdFx0Y29sb3I6ICRuZWdhdGl2ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0JiN3cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctYWxlcnRzLXR3aWxpb19zbXMge1xuXG5cdFx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3ctYWxlcnQtY29ubmVjdGlvbi1vcHRpb25zIHtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0XHRcdFx0XHQmICsgLndwLW1haWwtc210cC1zZXR0aW5nLXJvdy1hbGVydC1jb25uZWN0aW9uLW9wdGlvbnM6YmVmb3JlIHtcblx0XHRcdFx0XHRcdGNvbnRlbnQ6ICcnO1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0XHRtYXgtd2lkdGg6IDYwNXB4O1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiAxcHg7XG5cdFx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAyMHB4O1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI0RDRENERTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gR2VuZXJhbCBlbGVtZW50cy5cblx0XHRcdGgyLCBoNCB7XG5cdFx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0XHRmb250LXNpemU6IDIwcHg7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRcdG1hcmdpbjogMCAwIDZweCAwO1xuXHRcdFx0fVxuXG5cdFx0XHRoMiB7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDE1cHg7XG5cdFx0XHR9XG5cblx0XHRcdGgzIHtcblx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMjRweDtcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMjBweCAwO1xuXHRcdFx0fVxuXG5cdFx0XHRoNSB7XG5cdFx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRcdG1hcmdpbjogMCAwIDIwcHggMDtcblx0XHRcdH1cblxuXHRcdFx0cCB7XG5cdFx0XHRcdG1hcmdpbjogMTJweCAwIDA7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0bGluZS1oZWlnaHQ6IDEuNWVtO1xuXG5cdFx0XHRcdCY6Zmlyc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0bWFyZ2luOiA4cHggMCAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ji5kZXNjIHtcblx0XHRcdFx0XHRtYXJnaW46IDEwcHggMCAwO1xuXHRcdFx0XHRcdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0XHRcdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXG5cdFx0XHRcdFx0JiArIC5kZXNjIHtcblx0XHRcdFx0XHRcdGZvbnQtc3R5bGU6IG5vcm1hbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ji5idXR0b25uZWQge1xuXHRcdFx0XHRcdG1hcmdpbi10b3A6IDMwcHg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmLmlubGluZS1ub3RpY2Uge1xuXHRcdFx0XHRcdG1hcmdpbjogNXB4IDAgMTVweDtcblx0XHRcdFx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XG5cdFx0XHRcdFx0Ym9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcblx0XHRcdFx0XHRib3gtc2hhZG93OiAwIDFweCAxcHggMCByZ2JhKCAwLCAwLCAwLCAwLjEgKTtcblxuXHRcdFx0XHRcdCYuaW5saW5lLWVycm9yIHtcblx0XHRcdFx0XHRcdGJvcmRlci1jb2xvcjogJG5lZ2F0aXZlO1xuXHRcdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogNXB4O1xuXHRcdFx0XHRcdFx0cGFkZGluZzogMTBweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ji5pbmxpbmUtZWR1LW5vdGljZSB7XG5cdFx0XHRcdFx0XHRib3JkZXItY29sb3I6ICM4MDlFQjA7XG5cdFx0XHRcdFx0XHRsaW5lLWhlaWdodDogMS41ZW07XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiAxMHB4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGEud3AtbWFpbC1zbXRwLW1haWxlci1ub3RpY2UtZGlzbWlzcyB7XG5cdFx0XHRcdFx0XHRmbG9hdDogcmlnaHQ7XG5cdFx0XHRcdFx0XHRjb2xvcjogIzk5OURBMTtcblx0XHRcdFx0XHRcdG1hcmdpbjogMCAwIDEwcHggMTBweDtcblx0XHRcdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxuXHRcdFx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0XHRcdGNvbG9yOiBkYXJrZW4oIzk5OURBMSwgMjAlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dWwge1xuXHRcdFx0XHRtYXJnaW46IDhweCAwIDA7XG5cblx0XHRcdFx0Ji5saXN0IHtcblx0XHRcdFx0XHRsaSB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tbGVmdDogMjBweDtcblx0XHRcdFx0XHRcdGxpc3Qtc3R5bGUtdHlwZTogZGlzYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGFibGUge1xuXHRcdFx0XHQmLmFjdGlvbnMtbGlzdCB7XG5cdFx0XHRcdFx0dGQsIHRoIHtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDVweCA1cHggNXB4IDA7XG5cdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiBsZWZ0O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRkIHtcblx0XHRcdFx0XHRcdCYuZW1haWwge1xuXHRcdFx0XHRcdFx0XHRwYWRkaW5nLXJpZ2h0OiAyZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQmLnN0YXR1cyB7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOiAxMDBweDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCYuYWN0aW9ucyB7XG5cdFx0XHRcdFx0XHRcdGEge1xuXHRcdFx0XHRcdFx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZDtcblx0XHRcdFx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiA1cHg7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG5cdFx0XHRcdFx0XHRcdFx0JltjbGFzcyo9ZGVsZXRlXSxcblx0XHRcdFx0XHRcdFx0XHQmW2NsYXNzKj1lcnJvcl0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29sb3I6ICRuZWdhdGl2ZTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Jjpob3ZlciwgJjphY3RpdmUsICY6Zm9jdXMge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb2xvcjogZGFya2VuKCAkbmVnYXRpdmUsIDIwICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9ybSBlbGVtZW50cy5cblx0XHRcdGlucHV0W3R5cGU9dGV4dF0sXG5cdFx0XHRpbnB1dFt0eXBlPWVtYWlsXSxcblx0XHRcdGlucHV0W3R5cGU9bnVtYmVyXSxcblx0XHRcdGlucHV0W3R5cGU9cGFzc3dvcmRdLFxuXHRcdFx0c2VsZWN0IHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgJGZpZWxkLWJvcmRlcjtcblx0XHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xuXHRcdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdFx0XHRjb2xvcjogJGZpZWxkLXRleHQ7XG5cdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHRcdFx0cGFkZGluZzogN3B4IDEycHg7XG5cdFx0XHRcdG1hcmdpbjogMCAxMHB4IDAgMDtcblx0XHRcdFx0d2lkdGg6IDQwMHB4O1xuXHRcdFx0XHRtaW4taGVpZ2h0OiAzNXB4O1xuXHRcdFx0XHRsaW5lLWhlaWdodDogMS4zO1xuXG5cdFx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPGRlc2t0b3BcIikge1xuXHRcdFx0XHRcdHdpZHRoOiAzMDBweDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPHBob25lXCIpIHtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IHVuc2V0O1xuXHRcdFx0XHRcdG1hcmdpbi1yaWdodDogMDtcblxuXHRcdFx0XHRcdCYgfiBidXR0b24ge1xuXHRcdFx0XHRcdFx0bWFyZ2luLXRvcDogOHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCZbcmVhZG9ubHldIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ji5zbWFsbC10ZXh0IHtcblx0XHRcdFx0XHR3aWR0aDogNzVweDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6Zm9jdXMge1xuXHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICMwMTZBQUI7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICMwMTZBQUI7XG5cdFx0XHRcdFx0b3V0bGluZTogbm9uZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6ZGlzYWJsZWQge1xuXHRcdFx0XHRcdG9wYWNpdHk6IDAuNjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpbnB1dFt0eXBlPWNoZWNrYm94XSxcblx0XHRcdGlucHV0W3R5cGU9cmFkaW9dIHtcblx0XHRcdFx0Jjpmb2N1cyB7XG5cdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgIzAxNkFBQjtcblx0XHRcdFx0XHRib3gtc2hhZG93OiAwIDAgMCAxcHggIzAxNkFBQjtcblx0XHRcdFx0XHRvdXRsaW5lOiBub25lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFuaW1hdGUgZGFzaGljb24geWVzIGljb24gd2hlbiBjbGlja2luZyBvbiBjb3B5IGJ1dHRvbi5cblx0XHRcdC53cC1tYWlsLXNtdHAtZGFzaGljb25zLXllcy1hbHQtZ3JlZW4ge1xuXHRcdFx0XHQmLndwLW1haWwtc210cC1hbmltYXRlIHtcblx0XHRcdFx0XHQtd2Via2l0LWFuaW1hdGlvbjogd3AtbWFpbC1zbXRwLWZhZGUtaW4tc3RvcC1vdXQgMXMgbGluZWFyO1xuXHRcdFx0XHRcdGFuaW1hdGlvbjogd3AtbWFpbC1zbXRwLWZhZGUtaW4tc3RvcC1vdXQgMXMgbGluZWFyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ji53cC1tYWlsLXNtdHAtc3VjY2VzcyB7XG5cdFx0XHRcdFx0Y29sb3I6ICRwb3NpdGl2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJvdyBsYWJlbCAobGVmdCkuXG5cdFx0LndwLW1haWwtc210cC1zZXR0aW5nLWxhYmVsIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0XHR3aWR0aDogMjA1cHg7XG5cdFx0XHRwYWRkaW5nOiAwIDIwcHggMCAwO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjx0YWJsZXRcIikge1xuXHRcdFx0XHRmbG9hdDogbm9uZTtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdHBhZGRpbmctYm90dG9tOiAxNXB4O1xuXHRcdFx0fVxuXG5cdFx0XHRsYWJlbCB7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJvdyBmaWVsZCAocmlnaHQpLlxuXHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1maWVsZCB7XG5cdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdG1hcmdpbjogMCAwIDAgMjA1cHg7XG5cdFx0XHRtYXgtd2lkdGg6IDgwMHB4O1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjx0YWJsZXRcIikge1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHR9XG5cblx0XHRcdGhyIHtcblx0XHRcdFx0bWFyZ2luOiAyMHB4IDA7XG5cdFx0XHR9XG5cblx0XHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1maWVsZC1yb3cge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cblx0XHRcdFx0JiA+IC53cC1tYWlsLXNtdHAtYnRuIHtcblx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IDEwcHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQud3AtbWFpbC1zbXRwLXN1Ym1pdCB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRwYWRkaW5nOiAyNXB4IDA7XG5cblx0XHRcdC5oZWxwLXRleHQge1xuXHRcdFx0XHRtYXJnaW4tbGVmdDogMTBweDtcblx0XHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBNYWlsZXIgT3B0aW9uc1xuXHRcdC53cC1tYWlsLXNtdHAtbWFpbGVyLW9wdGlvbnMge1xuXHRcdFx0LndwLW1haWwtc210cC1tYWlsZXItb3B0aW9uIHtcblx0XHRcdFx0LndwLW1haWwtc210cC1zZXR0aW5nLXJvdy5zZWN0aW9uLWhlYWRpbmcge1xuXHRcdFx0XHRcdHBhZGRpbmc6IDIwcHggMCAhaW1wb3J0YW50O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YmxvY2txdW90ZSB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI0U1RTVFNTtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcblx0XHRcdFx0XHRjb2xvcjogIzY2Njtcblx0XHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdFx0bWFyZ2luOiAyMHB4IDA7XG5cdFx0XHRcdFx0cGFkZGluZzogMTVweDtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMDVweDtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE1pc2MuXG5cdFx0Ji53cC1tYWlsLXNtdHAtcGFnZS1nZW5lcmFsIHAge1xuXHRcdFx0Ly8gVGhpcyB3aWxsIHJlbW92ZSBqdW1waW5lc3MuXG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0fVxuXG5cdFx0Lm5vdGljZS1pbmxpbmUge1xuXHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcblx0XHRcdGJvcmRlci1sZWZ0OiA0cHggc29saWQgI2ZmZjtcblx0XHRcdGJveC1zaGFkb3c6IDAgMXB4IDFweCAwIHJnYmEoIDAsIDAsIDAsIDAuMSApO1xuXHRcdFx0bWFyZ2luOiA1cHggMCAxNXB4O1xuXHRcdFx0cGFkZGluZzogMXB4IDEycHg7XG5cblx0XHRcdCYubm90aWNlLXN1Y2Nlc3Mge1xuXHRcdFx0XHRib3JkZXItbGVmdC1jb2xvcjogJHBvc2l0aXZlO1xuXHRcdFx0fVxuXG5cdFx0XHQmLm5vdGljZS13YXJuaW5nIHtcblx0XHRcdFx0Ym9yZGVyLWxlZnQtY29sb3I6ICNmZmI5MDA7XG5cdFx0XHR9XG5cblx0XHRcdCYubm90aWNlLWVycm9yIHtcblx0XHRcdFx0Ym9yZGVyLWxlZnQtY29sb3I6ICRuZWdhdGl2ZTtcblx0XHRcdH1cblxuXHRcdFx0Ji5ub3RpY2UtaW5mbyB7XG5cdFx0XHRcdGJvcmRlci1sZWZ0LWNvbG9yOiAjMDBhMGQyO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5ub3RpY2UgcCxcblx0XHQubm90aWNlLWlubGluZSBwIHtcblx0XHRcdG1hcmdpbjogMC41ZW0gMDtcblx0XHRcdHBhZGRpbmc6IDJweDtcblx0XHR9XG5cblx0XHRwcmUge1xuXHRcdFx0d2hpdGUtc3BhY2U6IHByZS1saW5lO1xuXHRcdH1cblxuXHRcdCYuYWN0aXZlIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdH1cblxuXHRcdC5jb25uZWN0ZWQtYXMge1xuXHRcdFx0bWFyZ2luLWxlZnQ6ICRwYWRkaW5nLWRlZmF1bHQ7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPHBob25lXCIpIHtcblx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdG1hcmdpbi1sZWZ0OiAwO1xuXHRcdFx0XHRtYXJnaW4tdG9wOiA4cHg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0I3dwLW1haWwtc210cC1wcm8tYmFubmVyIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHRwYWRkaW5nOiAyNXB4IDIwcHg7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZGFkYWRhO1xuXHRcdFx0bWFyZ2luOiAxMHB4IDAgMCAwO1xuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHQud3AtbWFpbC1zbXRwLXByby1iYW5uZXItZGlzbWlzcyB7XG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0cmlnaHQ6IDEwcHg7XG5cdFx0XHRcdHRvcDogMTBweDtcblxuXHRcdFx0XHRidXR0b24ge1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6IG5vbmU7XG5cdFx0XHRcdFx0Ym9yZGVyOiBub25lO1xuXHRcdFx0XHRcdGNvbG9yOiAkZ3JleTtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aDIge1xuXHRcdFx0XHRjb2xvcjogJHByaW1hcnktdGV4dDtcblx0XHRcdFx0bWFyZ2luLXRvcDogMDtcblx0XHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwIHtcblx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAxLjFlbTtcblxuXHRcdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC5iZW5lZml0cyB7XG5cdFx0XHRcdG1hcmdpbjogMCAwIDE2cHggMDtcblx0XHRcdFx0b3ZlcmZsb3c6IGF1dG87XG5cdFx0XHRcdG1heC13aWR0aDogMTAwMHB4O1xuXG5cdFx0XHRcdHVsIHtcblx0XHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHR3aWR0aDogNTAlO1xuXHRcdFx0XHRcdGZsb2F0OiBsZWZ0O1xuXG5cdFx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8PXBob25lXCIpIHtcblx0XHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdFx0ZmxvYXQ6IG5vbmU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bGkge1xuXHRcdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogMCAwIDJweCAxNnB4O1xuXHRcdFx0XHRcdFx0Y29sb3I6ICRzZWNvbmRhcnktdGV4dDtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHRcdFx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdFx0XHRjb250ZW50OiAnKyc7XG5cdFx0XHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRcdFx0dG9wOiAtMXB4O1xuXHRcdFx0XHRcdFx0XHRsZWZ0OiAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQmLmFycm93LXJpZ2h0OmJlZm9yZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6ICfihpInO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRhIHtcblx0XHRcdFx0Y29sb3I6ICRvcmFuZ2U7XG5cblx0XHRcdFx0Jjpob3ZlciwgJjphY3RpdmUsICY6Zm9jdXMge1xuXHRcdFx0XHRcdGNvbG9yOiAkb3JhbmdlLWRhcms7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0LnN0YXJzIHtcblx0XHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG5cdFx0XHRcdC5kYXNoaWNvbnMge1xuXHRcdFx0XHRcdHdpZHRoOiAxNnB4O1xuXHRcdFx0XHRcdGhlaWdodDogMTZweDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IHRleHQtdG9wO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC5wcmljZS1vZmYge1xuXHRcdFx0XHRjb2xvcjogJHBvc2l0aXZlO1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtYWRtaW4tY29sdW1ucyB7XG5cblx0XHQmID4gZGl2W2NsYXNzKj1cIi1jb2x1bW4tXCJdIHtcblx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtYWRtaW4tY29sdW1uLTIwIHt3aWR0aDogMjAlfVxuXHRcdC53cC1tYWlsLXNtdHAtYWRtaW4tY29sdW1uLTMzIHt3aWR0aDogMzMuMzMzMzMlfVxuXHRcdC53cC1tYWlsLXNtdHAtYWRtaW4tY29sdW1uLTQwIHt3aWR0aDogNDAlfVxuXHRcdC53cC1tYWlsLXNtdHAtYWRtaW4tY29sdW1uLTUwIHt3aWR0aDogNTAlfVxuXHRcdC53cC1tYWlsLXNtdHAtYWRtaW4tY29sdW1uLTYwIHt3aWR0aDogNjAlfVxuXHRcdC53cC1tYWlsLXNtdHAtYWRtaW4tY29sdW1uLTgwIHt3aWR0aDogODAlfVxuXG5cdFx0LndwLW1haWwtc210cC1hZG1pbi1jb2x1bW4tbGFzdCB7ZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnR9XG5cblx0XHQmOmFmdGVyIHtcblx0XHRcdGNvbnRlbnQ6IFwiXCI7XG5cdFx0XHRkaXNwbGF5OiB0YWJsZTtcblx0XHRcdGNsZWFyOiBib3RoO1xuXHRcdH1cblx0fVxuXG5cdC5ub3RpY2UgYmxvY2txdW90ZSB7XG5cdFx0bWFyZ2luLWxlZnQ6IDA7XG5cdFx0cGFkZGluZzogMnB4O1xuXG5cdFx0cHJlIHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcblx0XHR9XG5cdH1cblxuXHQjd3AtbWFpbC1zbXRwLXJlc2V0LWZpbHRlciB7XG5cdFx0Y2xlYXI6IGJvdGg7XG5cdFx0bWFyZ2luOiAyMHB4IDA7XG5cdFx0cGFkZGluZzogMTBweDtcblx0XHRmb250LXNpemU6IDE1cHg7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdGJhY2tncm91bmQ6ICNmZmY7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgI2NjZDBkNDtcblx0XHRib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA0KTtcblxuXHRcdGEge1xuXHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRcdH1cblxuXHRcdC5yZXNldCB7XG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRjb2xvcjogI2E2YTZhNjtcblx0XHRcdGZvbnQtc2l6ZTogMTVweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAxOHB4O1xuXHRcdFx0d2lkdGg6IDE4cHg7XG5cdFx0XHRoZWlnaHQ6IDE4cHg7XG5cblx0XHRcdCY6Zm9jdXMsXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0Y29sb3I6ICRuZWdhdGl2ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBUb29scyAtPiBEZWJ1ZyBFdmVudHMgdGFiIHN0eWxlcy5cblx0LndwLW1haWwtc210cC10YWItdG9vbHMtZGVidWctZXZlbnRzIHtcblx0XHRAaW5jbHVkZSBtZWRpYShcIj50YWJsZXRcIikge1xuXHRcdFx0dGgjZXZlbnQge1xuXHRcdFx0XHR3aWR0aDogMTMwcHg7XG5cdFx0XHR9XG5cdFx0XHR0aCN0eXBlIHtcblx0XHRcdFx0d2lkdGg6IDgwcHg7XG5cdFx0XHR9XG5cdFx0XHR0aCNpbml0aWF0b3Ige1xuXHRcdFx0XHR3aWR0aDogMjAlO1xuXHRcdFx0fVxuXHRcdFx0dGgjY3JlYXRlZF9hdCB7XG5cdFx0XHRcdHdpZHRoOiAyMDBweDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBGbGF0cGlja2VyIChkYXRlIHBpY2tlcikgc3R5bGUgaW4gdGhlIFdQIExpc3QgVGFibGUgZmlsdGVyLlxuXHQud3AtbWFpbC1zbXRwLWZpbHRlci1kYXRlIHtcblxuXHRcdEBpbmNsdWRlIG1lZGlhKFwiPD10YWJsZXRcIikge1xuXHRcdFx0ZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuXHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRcdFx0ZmxvYXQ6IG5vbmU7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdHBhZGRpbmctcmlnaHQ6IDA7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAxMHB4O1xuXHRcdFx0bWF4LXdpZHRoOiA2MDBweDtcblx0XHR9XG5cblx0XHQmX19jb250cm9sIHtcblx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0bWFyZ2luOiAwIDVweCAwIDA7XG5cdFx0XHRtaW4taGVpZ2h0OiAzMHB4O1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0XHRtYXgtd2lkdGg6IDIxMHB4O1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9dGFibGV0XCIpIHtcblx0XHRcdFx0ZmxleC1ncm93OiAxO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0bWF4LXdpZHRoOiBub25lO1xuXHRcdFx0XHRtaW4taGVpZ2h0OiA0MHB4O1xuXHRcdFx0XHRtYXJnaW4tcmlnaHQ6IDA7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDVweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQmX19idG4ge1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0dmVydGljYWwtYWxpZ246IHRvcDtcblx0XHR9XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlIHtcblx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuXHRcdCZfX3N3aXRjaCB7XG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogMTVweDtcblx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHQtbW96LXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0LW1zLXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXHRcdFx0dHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0bWFyZ2luOiAtMXB4IDAgMCAwO1xuXHRcdFx0d2lkdGg6IDM2cHg7XG5cdFx0XHRoZWlnaHQ6IDIwcHg7XG5cblx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRjb250ZW50OiBcIlwiO1xuXHRcdFx0XHRoZWlnaHQ6IDE2cHg7XG5cdFx0XHRcdHdpZHRoOiAxNnB4O1xuXHRcdFx0XHRsZWZ0OiAycHg7XG5cdFx0XHRcdHRvcDogMnB4O1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdC1tb3otdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdC1tcy10cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcblx0XHRcdFx0dHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aW5wdXRbdHlwZT1jaGVja2JveF0ge1xuXHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0dG9wOiBhdXRvO1xuXHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcblx0XHRcdHdpZHRoOiAxcHg7XG5cdFx0XHRoZWlnaHQ6IDFweDtcblx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cblx0XHRcdCY6Y2hlY2tlZCArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICRwb3NpdGl2ZTtcblxuXHRcdFx0XHQmOmJlZm9yZSB7XG5cdFx0XHRcdFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTZweCk7XG5cdFx0XHRcdFx0LW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxNnB4KTtcblx0XHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTZweCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0JjpjaGVja2VkOmhvdmVyLFxuXHRcdFx0JjpjaGVja2VkOmZvY3VzIHtcblx0XHRcdFx0JiArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAjMDBhMzJhO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCY6bm90KDpjaGVja2VkKTpob3Zlcixcblx0XHRcdCY6bm90KDpjaGVja2VkKTpmb2N1cyB7XG5cdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlX19zd2l0Y2gge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICM5OTk7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAjOTk5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCY6ZGlzYWJsZWQge1xuXHRcdFx0XHQmOmNoZWNrZWQ6aG92ZXIgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlX19zd2l0Y2gsXG5cdFx0XHRcdCY6bm90KDpjaGVja2VkKTpob3ZlciArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6bm90KDpjaGVja2VkKTpob3ZlciArIC53cC1tYWlsLXNtdHAtc2V0dGluZy10b2dnbGVfX3N3aXRjaCB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2RkZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCYgKyAud3AtbWFpbC1zbXRwLXNldHRpbmctdG9nZ2xlX19zd2l0Y2gge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG5cdFx0XHRcdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JjpjaGVja2VkICsgLndwLW1haWwtc210cC1zZXR0aW5nLXRvZ2dsZV9fc3dpdGNoIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGVuKCMwMGEzMmEsIDI1KTtcblx0XHRcdFx0XHRjdXJzb3I6IGRlZmF1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy8gQnV0dG9ucy5cbi53cC1tYWlsLXNtdHAtYnRuIHtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRtYXJnaW46IDA7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHR0ZXh0LXNoYWRvdzogbm9uZTtcblx0Ym94LXNoYWRvdzogbm9uZTtcblx0b3V0bGluZTogbm9uZTtcblxuXHQuZGFzaGljb25zIHtcblx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0d2lkdGg6IDE2cHg7XG5cdFx0aGVpZ2h0OiAxNnB4O1xuXHR9XG5cblx0JjpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC41O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tbWQge1xuXHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRcdG1pbi1oZWlnaHQ6IDM1cHg7XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tbGcge1xuXHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdHBhZGRpbmc6IDE2cHggMjhweDtcblx0fVxuXG5cdCYud3AtbWFpbC1zbXRwLWJ0bi11cGdyYWRlLFxuXHQmLndwLW1haWwtc210cC1idG4tY3RhIHtcblx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0XHRwYWRkaW5nOiAxNHB4IDMwcHg7XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tb3JhbmdlIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkb3JhbmdlO1xuXHRcdGJvcmRlci1jb2xvcjogJG9yYW5nZTtcblx0XHRjb2xvcjogI2ZmZjtcblxuXHRcdCY6aG92ZXIsXG5cdFx0JjphY3RpdmUsXG5cdFx0Jjpmb2N1cyB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkb3JhbmdlLWRhcms7XG5cdFx0XHRib3JkZXItY29sb3I6ICRvcmFuZ2UtZGFyaztcblx0XHRcdGNvbG9yOiAjRkZGRkZGO1xuXHRcdH1cblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAkb3JhbmdlLWRhcms7XG5cdFx0fVxuXHR9XG5cblx0Ji53cC1tYWlsLXNtdHAtYnRuLXJlZCB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogJG5lZ2F0aXZlO1xuXHRcdGJvcmRlci1jb2xvcjogJG5lZ2F0aXZlO1xuXHRcdGNvbG9yOiAjZmZmO1xuXG5cdFx0Jjpob3Zlcixcblx0XHQmOmFjdGl2ZSxcblx0XHQmOmZvY3VzIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNiMzJkMmU7XG5cdFx0XHRib3JkZXItY29sb3I6ICNiMzJkMmU7XG5cdFx0XHRjb2xvcjogI0ZGRkZGRjtcblx0XHR9XG5cblx0XHQmOmZvY3VzIHtcblx0XHRcdGJveC1zaGFkb3c6IDAgMCAwIDFweCAjZmZmLCAwIDAgMCAzcHggI2IzMmQyZTtcblx0XHR9XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tZ3JleSB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5O1xuXHRcdGNvbG9yOiAjNTU1NTU1O1xuXG5cdFx0Jjpob3Zlcixcblx0XHQmOmFjdGl2ZSxcblx0XHQmOmZvY3VzIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG5cdFx0XHRib3JkZXItY29sb3I6ICM1NTU1NTU7XG5cdFx0XHRjb2xvcjogIzQ0NDtcblx0XHR9XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tbGlnaHQtZ3JleSB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuXHRcdGNvbG9yOiAjNjY2O1xuXG5cdFx0Jjpob3Zlcixcblx0XHQmOmFjdGl2ZSxcblx0XHQmOmZvY3VzIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG5cdFx0XHRjb2xvcjogIzQ0NDtcblx0XHR9XG5cdH1cblxuXHQmLndwLW1haWwtc210cC1idG4tYmx1ZWlzaCB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogIzczOGU5ZTtcblx0XHRib3JkZXItY29sb3I6ICM3MzhlOWU7XG5cdFx0Y29sb3I6ICNmZmY7XG5cblx0XHQmOmhvdmVyLFxuXHRcdCY6YWN0aXZlLFxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogIzM5NTM2MDtcblx0XHRcdGJvcmRlci1jb2xvcjogIzM5NTM2MDtcblx0XHRcdGNvbG9yOiAjZmZmO1xuXHRcdH1cblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICNmZmYsIDAgMCAwIDNweCAjMzk1MzYwO1xuXHRcdH1cblx0fVxufVxuXG5hLndwLW1haWwtc210cC1idG4ud3AtbWFpbC1zbXRwLWJ0bi1tZCB7XG5cdGxpbmUtaGVpZ2h0OiAxOXB4O1xufVxuXG4vLyBEb21haW4gQ2hlY2tlciBSZXN1bHRzIHNlY3Rpb24gb24gRW1haWwgVGVzdCB0YWIuXG4jd3AtbWFpbC1zbXRwLWRvbWFpbi1jaGVjay1kZXRhaWxzIHtcblx0aDIge1xuXHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRsaW5lLWhlaWdodDogMjRweDtcblx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdG1hcmdpbjogMjhweCAwIDIzcHg7XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLWRvbWFpbi1jaGVjay1kZXRhaWxzLWNoZWNrLWxpc3Qge1xuXG5cdFx0Ji1pdGVtIHtcblx0XHRcdHBhZGRpbmc6IDI1cHggMDtcblx0XHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjRTRFNEU0O1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblxuXHRcdFx0JjpsYXN0LWNoaWxkIHtcblx0XHRcdFx0cGFkZGluZy1ib3R0b206IDA7XG5cdFx0XHR9XG5cblx0XHRcdCYtaWNvbiB7XG5cdFx0XHRcdHdpZHRoOiAxOHB4O1xuXHRcdFx0XHRoZWlnaHQ6IDE2cHg7XG5cdFx0XHRcdG1hcmdpbi1yaWdodDogMTBweDtcblx0XHRcdH1cblxuXHRcdFx0Ji1jb250ZW50IHtcblx0XHRcdFx0aDMge1xuXHRcdFx0XHRcdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDE3cHg7XG5cdFx0XHRcdFx0Y29sb3I6ICRwcmltYXJ5LXRleHQ7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIDAgNHB4IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwIHtcblx0XHRcdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMjBweDtcblx0XHRcdFx0XHRtYXJnaW46IDAgMCAxMHB4IDA7XG5cblx0XHRcdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLyBFbWFpbCBUZXN0IFRhYi5cbi53cC1tYWlsLXNtdHAtdGFiLXRvb2xzLXRlc3Qge1xuXG5cdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3cuc2VjdGlvbi1oZWFkaW5nIHtcblx0XHRtYXJnaW4tYm90dG9tOiAyMnB4O1xuXHR9XG5cblx0LndwLW1haWwtc210cC10ZXN0LWVtYWlsLXJlc2VuZCB7XG5cdFx0cGFkZGluZy10b3A6IDIycHg7XG5cdFx0bWFyZ2luLXRvcDogMjJweDtcblx0XHRib3JkZXItdG9wOiAxcHggc29saWQgI0U0RTRFNDtcblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtdGVzdC1lbWFpbC1yZXNlbmQgYSB7XG5cdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdG91dGxpbmU6IG5vbmU7XG5cdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0fVxuXG5cdCNlbWFpbC10ZXN0LXN1Y2Nlc3Mge1xuXHRcdG1hcmdpbi10b3A6IDMwcHg7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG5cdFx0c3ZnIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0bWF4LXdpZHRoOiA1MDBweDtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0aGVpZ2h0OiBhdXRvO1xuXHRcdFx0bWFyZ2luOiAwIGF1dG8gMjJweDtcblx0XHR9XG5cblx0XHRoMiB7XG5cdFx0XHRtYXJnaW4tdG9wOiAwO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0XHRmb250LXNpemU6IDI0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjlweDtcblx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdH1cblxuXHRcdHAge1xuXHRcdFx0bWFyZ2luLXRvcDogMDtcblx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAyNHB4O1xuXHRcdFx0Y29sb3I6ICRzZWNvbmRhcnktdGV4dDtcblx0XHR9XG5cdH1cblxuXHQjZW1haWwtdGVzdC1mb3JtIHtcblxuXHRcdC53cC1tYWlsLXNtdHAtc2V0dGluZy1yb3cuc2VjdGlvbi1oZWFkaW5nIHtcblx0XHRcdG1hcmdpbi1ib3R0b206IDA7XG5cdFx0fVxuXG5cdFx0LndwLW1haWwtc210cC1idG4ge1xuXHRcdFx0bWluLXdpZHRoOiA5NXB4O1xuXHRcdH1cblxuXHRcdC53cC1tYWlsLXNtdHAtbG9hZGluZyB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogLTJweDtcblx0XHR9XG5cdH1cblxuXHQjd3AtbWFpbC1zbXRwLWRlYnVnIHtcblx0XHRtYXJnaW4tdG9wOiAyNXB4O1xuXG5cdFx0aDIge1xuXHRcdFx0bWFyZ2luOiAyMHB4IDAgMTBweDtcblx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdH1cblxuXHRcdHAge1xuXHRcdFx0bWFyZ2luOiAxMHB4IDA7XG5cdFx0XHRjb2xvcjogJHNlY29uZGFyeS10ZXh0O1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0fVxuXG5cdFx0dWwge1xuXHRcdFx0bGlzdC1zdHlsZS10eXBlOiBkaXNjO1xuXHRcdH1cblxuXHRcdHVsLFxuXHRcdG9sIHtcblx0XHRcdG1hcmdpbjogMTBweCAwIDEwcHggMTVweDtcblx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjBweDtcblxuXHRcdFx0bGkge1xuXHRcdFx0XHRtYXJnaW46IDAgMCA4cHggMDtcblxuXHRcdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dWwge1xuXHRcdFx0XHRcdGxpc3Qtc3R5bGUtdHlwZTogZGlzYztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5kYXNoaWNvbnMtc3Rhci1maWxsZWQge1xuXHRcdFx0Y29sb3I6ICRvcmFuZ2U7XG5cdFx0XHR3aWR0aDogMTZweDtcblx0XHRcdGhlaWdodDogMTZweDtcblx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDtcblx0XHR9XG5cblx0XHQucHJpY2Utb2ZmIHtcblx0XHRcdGNvbG9yOiAkcG9zaXRpdmU7XG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdH1cblxuXHRcdC5lcnJvci1sb2ctYnV0dG9uLWNvbnRhaW5lciB7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAyMnB4O1xuXHRcdH1cblxuXHRcdC5lcnJvci1sb2ctdG9nZ2xlIHtcblx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAxMHB4O1xuXHRcdH1cblxuXHRcdC5lcnJvci1sb2ctY29weSB7XG5cdFx0XHRtaW4td2lkdGg6IDEyMnB4O1xuXG5cdFx0XHQuZXJyb3ItbG9nLWNvcHktYmFjayB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LmVycm9yLWxvZy1jb3B5LWNvcGllZCB7XG5cblx0XHRcdC5lcnJvci1sb2ctY29weS1mcm9udCB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cblx0XHRcdC5lcnJvci1sb2ctY29weS1iYWNrIHtcblx0XHRcdFx0ZGlzcGxheTogaW5saW5lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5lcnJvci1sb2cge1xuXHRcdFx0cGFkZGluZy10b3A6IDEwcHg7XG5cdFx0XHRwYWRkaW5nLWJvdHRvbTogMTBweDtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cblx0XHRcdCYuZXJyb3ItbG9nLXNlbGVjdGlvbiB7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG5cdFx0XHRcdG9wYWNpdHk6IDA7XG5cdFx0XHRcdGhlaWdodDogMDtcblx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmUge1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi53cC1tYWlsLXNtdHAtdGFiLXRvb2xzLWFjdGlvbi1zY2hlZHVsZXIge1xuXG5cdC53cC1tYWlsLXNtdHAtcGFnZS1jb250ZW50IHtcblx0XHQud3JhcCwgLnN1YnN1YnN1YiB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0fVxuXG5cdFx0JiA+IGgxIHtcblx0XHRcdGNvbG9yOiAkcHJpbWFyeS10ZXh0O1xuXHRcdFx0Zm9udC1zaXplOiAyMHB4O1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdG1hcmdpbjogMCAwIDE1cHggMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0fVxuXG5cdFx0JiA+IHAge1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdH1cblxuXHRcdGgxLndwLWhlYWRpbmctaW5saW5lLFxuXHRcdHNwYW4uc3VidGl0bGUge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cblx0XHRoci53cC1oZWFkZXItZW5kIHtcblx0XHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHRcdG1hcmdpbjogLTJweCAwIDA7XG5cdFx0fVxuXHR9XG59XG5cbi53cC1tYWlsLXNtdHAtYWRtaW4tcGFnZS1ib2R5IHtcblxuXHQvKiBMaWdodGJveCBsaWJyYXJ5IGdsb2JhbCBzdHlsZXMuICovXG5cdC5saXR5IHtcblx0XHR6LWluZGV4OiA5OTk5OTk5OTk7XG5cdFx0cGFkZGluZzogMjBweDtcblx0fVxuXG5cdC5saXR5LWNsb3NlIHtcblx0XHRtYXJnaW46IDEwcHg7XG5cdH1cblxuXHQubGl0eS1jb250ZW50IHtcblx0XHRtYXgtd2lkdGg6IDgwdnc7XG5cdFx0bWF4LWhlaWdodDogODB2aDtcblxuXHRcdGltZyB7XG5cdFx0XHRtYXgtaGVpZ2h0OiA4MHZoICFpbXBvcnRhbnQ7XG5cdFx0XHRtYXgtd2lkdGg6IDgwdncgIWltcG9ydGFudDtcblx0XHR9XG5cdH1cblxuXHQjd3Bmb290ZXIge1xuXG5cdFx0YSB7XG5cdFx0XHRjb2xvcjogJGxpbmsgIWltcG9ydGFudDtcblxuXHRcdFx0Jjpob3Zlcixcblx0XHRcdCY6YWN0aXZlIHtcblx0XHRcdFx0Y29sb3I6ICRsaW5rLWhvdmVyICFpbXBvcnRhbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vIFRoZSBzaW5nbGUgRGVidWcgRXZlbnQgcG9wdXAgcHJldmlldy5cbi53cC1tYWlsLXNtdHAtZGVidWctZXZlbnQtcHJldmlldyB7XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cblx0aDQge1xuXHRcdG1hcmdpbjogMTVweCAwO1xuXHRcdGZvbnQtc2l6ZTogMThweDtcblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtZGVidWctZXZlbnQtcHJldmlldy1zdWJ0aXRsZSB7XG5cdFx0bWFyZ2luLWJvdHRvbTogMzBweDtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cblx0XHRzcGFuIHtcblx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjJweDtcblx0XHR9XG5cdH1cblxuXHQud3AtbWFpbC1zbXRwLWRlYnVnLWV2ZW50LXJvdyB7XG5cdFx0cGFkZGluZzogMjBweCAwO1xuXHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkZGRkO1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0anVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRsaW5lLWhlaWdodDogMjJweDtcblxuXHRcdC5kZWJ1Zy1ldmVudC1sYWJlbCB7XG5cdFx0XHR3aWR0aDogNjBweDtcblx0XHRcdG1hcmdpbi1yaWdodDogMzBweDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0fVxuXG5cdFx0LmRlYnVnLWV2ZW50LXZhbHVlIHtcblx0XHRcdHdpZHRoOiBjYWxjKCAxMDAlIC0gOTBweCApO1xuXHRcdH1cblxuXHRcdC5kZWJ1Zy1ldmVudC1pbml0aWF0b3Ige1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogNXB4O1xuXHRcdH1cblxuXHRcdC5kZWJ1Zy1ldmVudC1jb2RlIHtcblx0XHRcdGNvbG9yOiAkc2Vjb25kYXJ5LXRleHQ7XG5cdFx0fVxuXG5cdFx0JjpsYXN0LWNoaWxkIHtcblx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkO1xuXHRcdH1cblx0fVxuXG5cdC53cC1tYWlsLXNtdHAtZGVidWctZXZlbnQtcHJldmlldy1jb250ZW50IHtcblx0XHQ+IGRpdiB7XG5cdFx0XHR3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuXHRcdH1cblx0fVxufVxuXG5bY2xhc3NePVwid3AtbWFpbC1zbXRwLWRhc2hpY29uc1wiXSB7XG5cdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0d2lkdGg6IDIwcHg7XG5cdGhlaWdodDogMjBweDtcbn1cblxuLndwLW1haWwtc210cC1kYXNoaWNvbnMteWVzLWFsdC1ncmVlbiB7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL2ljb25zL2Rhc2hpY29ucy9kYXNoaWNvbnMteWVzLWFsdC1ncmVlbi5zdmcnKTtcbn1cblxuLndwLW1haWwtc210cC1kYXNoaWNvbnMtcGRmLWdyYXkge1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9pY29ucy9kYXNoaWNvbnMvZGFzaGljb25zLXBkZi1ncmV5LnN2ZycpO1xufVxuIl19 */ diff --git a/assets/css/smtp-admin.min.css b/assets/css/smtp-admin.min.css index 83f6e42..a83410e 100644 --- a/assets/css/smtp-admin.min.css +++ b/assets/css/smtp-admin.min.css @@ -1 +1 @@ -#wpcontent{padding-left:0 !important;position:relative}@media(max-width: 600px){#wpcontent{padding-top:46px}}@media(max-width: 600px){#wpbody{padding-top:0}}@-webkit-keyframes wp-mail-smtp-fade-in-stop-out{0%,100%{opacity:0}35%{opacity:1}65%{opacity:1}}@keyframes wp-mail-smtp-fade-in-stop-out{0%,100%{opacity:0}35%{opacity:1}65%{opacity:1}}body.wp-mail-smtp-admin-page-body div.jconfirm *,body.wp-mail-smtp-admin-page-body div.jconfirm *::before,body.wp-mail-smtp-admin-page-body div.jconfirm *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-bg{background-color:rgba(114,119,124,.75);opacity:1}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box{padding:30px;border-radius:6px;box-shadow:0 3px 6px rgba(0,0,0,.15);border-top-width:4px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,.4);top:8px;right:8px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{color:rgba(0,0,0,.8)}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c{margin:0 0 15px 0;padding:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin:0 0 30px;-webkit-transition:none;transition:none;-webkit-transform:none !important;-ms-transform:none !important;transform:none !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty,body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i:empty{display:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{display:block;color:#222;font-weight:500;font-size:24px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content-pane{display:block;margin-bottom:30px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{margin-bottom:0;overflow:inherit}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content{font-size:16px;color:#222;line-height:1.4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p{margin:0 0 20px;font-size:16px;line-height:1.5}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p:last-of-type{margin:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p.large{font-size:18px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p.small{font-size:14px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content .wp-mail-smtp-debug-event-preview p{font-size:14px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content .wp-mail-smtp-btn{font-weight:600;text-transform:uppercase;-webkit-transition:background .1s;transition:background .1s;padding:10px 20px;outline:none;display:inline-block;font-size:14px;line-height:1.4;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;-webkit-tap-highlight-color:transparent;border:0;background-image:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content .wp-mail-smtp-btn.with-loader{padding:12px 12px 7px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons{padding:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button{transition:.2s;box-shadow:none;margin:0 10px 0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button:hover{box-shadow:inset 0 0 0 100px rgba(0,0,0,.1)}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-confirm{color:#fff;outline:none;border:1px solid #e27730;background-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-cancel{color:#777;outline:none;background:#f8f8f8;border:1px solid #ccc}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button,body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-default{color:#666}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-hide{display:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-block{display:block;text-align:center;width:100%;margin:0 0 10px 0 !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-normal-case{text-transform:none !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-green{border-color:#00a32a}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-green div.jconfirm-buttons button.btn-confirm{background-color:#00a32a;border-color:#00a32a}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-orange{border-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-orange div.jconfirm-buttons button.btn-confirm{background-color:#e27730;border-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-red{border-color:#d63638}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-red div.jconfirm-buttons button.btn-confirm{background-color:#d63638;border-color:#d63638}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-blue{border-color:#3582c4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-blue div.jconfirm-buttons button.btn-confirm{background-color:#3582c4;border-color:#3582c4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading{border-top-color:#fff !important;height:160px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading .jconfirm-title-c{display:block !important;position:relative;z-index:4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading .jconfirm-title-c .jconfirm-icon-c{display:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading:before{z-index:2}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading:after{content:"";position:absolute;left:50%;top:68%;margin-left:-20px;height:40px;width:40px;border:solid 6px transparent;border-bottom-color:#e27730;opacity:1;z-index:3}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal{padding:30px 30px 15px;border-top:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-title-c{margin:0 0 26px 0;padding:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-title-c .jconfirm-icon-c{margin-bottom:20px;color:#c4c4c4 !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-title-c .jconfirm-icon-c svg{height:35px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-content-pane{margin-bottom:25px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-buttons button.btn-confirm{background-color:#e27730;border-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note{text-align:center;margin:45px 0 0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note p{background-color:#fcf9e8;margin:0 -30px;padding:24px 60px 20px;font-size:15px;color:#4d4d4d;position:relative}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note p:after{content:url(../images/font-awesome/check-circle-solid-green.svg);width:40px;height:40px;background-color:#fff;border-radius:50%;padding:5px 6px;position:absolute;top:-20px;right:50%;margin-right:-18px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note span{font-weight:600;color:#00a32a}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note a{color:#aaa;display:block;margin-top:12px}@media screen and (max-width: 1023px){#wp-mail-smtp-notice-bar{display:none !important}}#wp-mail-smtp-notice-bar{max-height:35px;position:relative;margin-bottom:-3px;transition:all .3s ease-out;overflow:hidden}#wp-mail-smtp-notice-bar.out{max-height:3px}#wp-mail-smtp-notice-bar .wp-mail-smtp-notice-bar-container{background-color:#ddd;border-top:3px solid #e27730;color:#555;text-align:center;padding:7px}#wp-mail-smtp-notice-bar a{color:#e27730}#wp-mail-smtp-notice-bar a:hover{color:#b85a1b}#wp-mail-smtp-notice-bar .dismiss{position:absolute;top:0;right:0;border:none;padding:5px;margin-top:4px;background:0 0;color:#72777c;cursor:pointer}#wp-mail-smtp-notice-bar .dismiss:before{background:0 0;color:#72777c;content:"";display:block;font:normal 20px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased}#screen-meta-links .screen-meta-toggle{position:absolute;right:20px;top:auto}#wp-mail-smtp .wp-mail-smtp-product-education__row{border-bottom:1px solid #e4e4e4;padding:25px 0 5px;font-size:14px;line-height:1.3;max-width:1005px}#wp-mail-smtp .wp-mail-smtp-product-education__row>*:last-child{border-bottom:none !important}#wp-mail-smtp .wp-mail-smtp-product-education__row--inactive{opacity:.5;pointer-events:none}#wp-mail-smtp .wp-mail-smtp-product-education__row--full-width{max-width:unset}#wp-mail-smtp .wp-mail-smtp-product-education__row--no-border{border-bottom:none !important}#wp-mail-smtp .wp-mail-smtp-product-education__row--no-padding{padding:0 !important}#wp-mail-smtp .wp-mail-smtp-product-education__row:first-of-type{padding-top:10px}#wp-mail-smtp .wp-mail-smtp-product-education__row:last-of-type+.wp-mail-smtp-btn-upgrade{margin-top:25px}#wp-mail-smtp .wp-mail-smtp-product-education__heading{display:flex;align-items:center;margin-top:0;margin-bottom:10px;font-size:20px;line-height:24px;color:#222}#wp-mail-smtp .wp-mail-smtp-product-education__heading:after{content:"";margin-left:10px;background-image:url("../images/pro-badge-small.svg");background-size:contain;background-repeat:no-repeat;width:35px;height:16px}#wp-mail-smtp .wp-mail-smtp-product-education__description{margin-top:0;margin-bottom:20px;color:#555;font-size:14px;line-height:1.5em}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots{display:flex;flex-wrap:wrap}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-product-education__screenshots{flex-direction:column}}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div{display:flex;flex-direction:column;align-items:center;margin:0 25px 20px 0}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div{margin-right:0;max-width:unset !important}}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div:last-child{margin-right:0}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div a{position:relative;margin-bottom:10px;background:#fff;border:5px solid #fff;box-sizing:border-box;border-radius:4px}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div a:after{content:"";position:absolute;opacity:0;height:100%;width:100%;top:0;left:0;background-color:rgba(68,68,68,.15);background-image:url("../../assets/images/icons/zoom.svg");background-repeat:no-repeat;background-position:center;background-size:50px;transition:all .3s}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div a:hover:after{opacity:1}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div img{display:block;max-width:100%;height:auto}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div span{font-size:14px;line-height:18px;text-align:center;color:#555}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots--two>div{max-width:487px}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots--three>div{max-width:316px}#wp-mail-smtp .wp-mail-smtp-product-education__list>h4{margin-top:0;margin-bottom:20px;font-size:16px;line-height:20px;color:#222}#wp-mail-smtp .wp-mail-smtp-product-education__list>div{display:flex;flex-wrap:wrap}#wp-mail-smtp .wp-mail-smtp-product-education__list ul{width:290px;margin:0 40px 20px 0}#wp-mail-smtp .wp-mail-smtp-product-education__list ul li{display:flex;align-items:center;font-size:14px;line-height:20px;margin-bottom:0;color:#555}#wp-mail-smtp .wp-mail-smtp-product-education__list ul li+li{margin-top:20px}#wp-mail-smtp .wp-mail-smtp-product-education__list ul li:before{content:url("../../assets/images/icons/check-solid.svg");width:16px;margin-right:10px}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section{margin-bottom:20px;cursor:not-allowed}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section:last-of-type{margin-bottom:20px}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section h5{clear:both;margin:0 0 10px 0;color:#222;font-size:16px;font-weight:600}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section label{clear:both;float:left;margin:3px 0 3px 0}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section .wp-mail-smtp-date-selector{width:200px;cursor:pointer}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section .wp-mail-smtp-search-box-field{width:200px}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section .wp-mail-smtp-search-box-term{width:300px}#wp-mail-smtp #wp-mail-smtp-email-controls-product-education .wp-mail-smtp-product-education__row--inactive{padding-top:20px;padding-bottom:0}#wp-mail-smtp #wp-mail-smtp-email-controls-product-education .wp-mail-smtp-setting-row:last-child{border-bottom:none}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu h2{display:inline-block;vertical-align:middle}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .badge{margin:0 0 2px 7px;vertical-align:middle;width:40px;height:17px}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-multisite{color:#9a9a9a}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-multisite p.desc{color:#bababa}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-multisite input[type=checkbox]:disabled{border-color:#aaa}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-no-setting{margin-top:30px}.wp-mail-smtp-lite #wp-mail-smtp .wp-mail-smtp-page-reports .wp-mail-smtp-page-title .page-title{position:relative}.wp-mail-smtp-lite #wp-mail-smtp .wp-mail-smtp-page-reports .wp-mail-smtp-page-title .page-title:after{content:"";display:inline-block;margin-left:10px;background-image:url("../images/pro-badge-small.svg");background-size:contain;background-repeat:no-repeat;width:35px;height:16px}.wp-mail-smtp-loading{animation:.65s linear infinite wp-mail-smtp-loading-spin}.wp-mail-smtp-loading-md{width:32px;height:32px}.wp-mail-smtp-loading-sm{width:16px;height:16px}.wp-mail-smtp-loading-spin{position:relative;color:transparent !important;pointer-events:none}.wp-mail-smtp-loading-spin:after{position:absolute;box-sizing:border-box;animation:.65s linear infinite wp-mail-smtp-loading-spin;border:2px solid #fff;border-radius:50%;border-right-color:transparent !important;border-top-color:transparent !important;content:"";display:block;top:50%;left:50%;width:16px;height:16px;margin-top:-8px;margin-left:-8px}@keyframes wp-mail-smtp-loading-spin{0%{transform:rotateZ(270deg)}100%{transform:rotateZ(630deg)}}#wp-mail-smtp-flyout{position:fixed;z-index:99999;transition:all .2s ease-in-out;right:40px;bottom:40px;opacity:1}@media(max-width: 959px){#wp-mail-smtp-flyout{display:none}}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head{display:block}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head:focus{box-shadow:none}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head figure{margin:0;border-radius:50%;border:3px solid #e27730;overflow:hidden;box-shadow:0 2px 20px rgba(0,0,0,.15);background-color:#fff;transition:all .2s ease-in-out}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head figure img{display:block;width:54px;height:54px;transition:all .2s ease-in-out}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head:hover figure{box-shadow:0 2px 30px rgba(0,0,0,.2)}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head .wp-mail-smtp-flyout-label{right:calc(100% + 15px);opacity:0;transform:translateY(-50%) scale(0);margin-right:-50px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head:hover .wp-mail-smtp-flyout-label{opacity:1;transform:translateY(-50%) scale(1);margin-right:0}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-label{position:absolute;display:block;top:50%;right:calc(100% + 15px);transform:translateY(-50%);-moz-transform:translateY(-50%);-webkit-transform:translateY(-50%);color:#fff;background-color:#a7aaad;font-size:12px;white-space:nowrap;padding:6px 10px;height:auto !important;line-height:initial;transition:all .2s ease-out;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item{position:absolute;display:flex;left:10px;width:40px;height:40px;opacity:0;visibility:hidden;transition:all .2s ease-in-out;transform:scale(0);border-radius:50%;box-shadow:0px 2px 10px rgba(0,0,0,.15);background-color:#738e9e}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item img{margin:auto}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-0{bottom:75px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-1{bottom:130px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-2{bottom:185px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-3{bottom:240px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-4{bottom:295px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item:hover{background-color:#395360}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item:hover .wp-mail-smtp-flyout-label{background-color:#787c82}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item{opacity:1;visibility:visible;transform:scale(1)}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-head .wp-mail-smtp-flyout-label{display:none}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-head figure img{transform:rotate(-15deg) scale(1.17)}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-0{transition:transform .2s 0ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-1{transition:transform .2s 35ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-2{transition:transform .2s 70ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-3{transition:transform .2s 105ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-4{transition:transform .2s 140ms,background-color .2s}#wp-mail-smtp-flyout.out{opacity:0;visibility:hidden}.wp-mail-smtp-tooltip{position:relative;display:inline-block;text-decoration:underline;text-decoration-style:dotted;cursor:help;color:#555;margin-top:15px !important}.wp-mail-smtp-tooltip-text{visibility:hidden;position:absolute;z-index:9999;width:360px;background-color:#2d4f60;color:#fff;text-align:center;padding:16px 20px;font-size:14px;border-radius:5px;bottom:100%;left:50%;margin-left:-180px}.wp-mail-smtp-tooltip-text::after{content:" ";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#2d4f60 transparent transparent transparent}.wp-mail-smtp-tooltip:hover .wp-mail-smtp-tooltip-text{visibility:visible}#wp-mail-smtp .wp-mail-smtp-conditional button{cursor:pointer}#wp-mail-smtp .wp-mail-smtp-conditional table{width:100%;max-width:740px;padding:0;margin:0;border-collapse:collapse;border-spacing:0;font-size:13px}#wp-mail-smtp .wp-mail-smtp-conditional table td{padding:0 10px 20px 0}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__row{display:flex;flex-direction:column}}#wp-mail-smtp .wp-mail-smtp-conditional__row input,#wp-mail-smtp .wp-mail-smtp-conditional__row select{width:100% !important;max-width:100%;margin:0;text-overflow:ellipsis}#wp-mail-smtp .wp-mail-smtp-conditional__property-col{width:23%}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__property-col{width:100%}}#wp-mail-smtp .wp-mail-smtp-conditional__operator-col{width:23%}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__operator-col{width:100%}}#wp-mail-smtp .wp-mail-smtp-conditional__value-col{width:42%}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__value-col{width:100%}}#wp-mail-smtp .wp-mail-smtp-conditional__value :disabled{background-color:#f1f1f1;cursor:not-allowed}#wp-mail-smtp .wp-mail-smtp-conditional__actions{display:flex;align-items:center;padding-right:0}#wp-mail-smtp .wp-mail-smtp-conditional__delete-rule{background-color:transparent;border:none;color:#999;margin:0 0 0 10px;padding:0;vertical-align:middle}#wp-mail-smtp .wp-mail-smtp-conditional__delete-rule:hover{color:#d63638}#wp-mail-smtp .wp-mail-smtp-conditional__group-delimiter{margin:0 0 20px;font-size:14px;font-style:italic;font-weight:400;line-height:17px;color:#888}#screen-meta-links,#screen-meta{display:none}#wp-mail-smtp-header-temp{position:absolute;margin:0;top:-1px;left:20px;right:0;z-index:99}#wp-mail-smtp-header{border-top:3px solid #e27730;padding:24px 20px}#wp-mail-smtp-header img{display:block;margin:0;max-width:242px}@media(max-width: 782px){#wp-mail-smtp-header img{max-width:200px}}.wp-mail-smtp-page{color:#222}.wp-mail-smtp-page a{color:#2171b1}.wp-mail-smtp-page a:hover,.wp-mail-smtp-page a:active{color:#135e96}#wp-mail-smtp{margin:0}#wp-mail-smtp .wp-mail-smtp-hide{display:none}#wp-mail-smtp .wp-mail-smtp-page-title{min-height:58px;background-color:#fff;font-size:14px;margin:0 0 20px 0;padding:0 20px}#wp-mail-smtp .wp-mail-smtp-page-title a.tab{border-bottom:2px solid #fff;box-shadow:none;color:#666;display:inline-block;margin-right:30px;padding:20px 0 18px 0;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-title a.tab.active{border-bottom:2px solid #e27730}#wp-mail-smtp .wp-mail-smtp-page-title a.tab:hover{border-color:#999}#wp-mail-smtp .wp-mail-smtp-page-title a.action{color:#fff;font-weight:600;margin:14px 0 14px 10px;line-height:28px;min-height:30px;vertical-align:top}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-page-title a.action{margin-left:0}}#wp-mail-smtp .wp-mail-smtp-page-title .page-title{background-color:#fff;display:inline-block;font-size:23px;margin:0;padding:20px 20px 20px 0}#wp-mail-smtp .wp-mail-smtp-page-content{padding:0 20px}#wp-mail-smtp .wp-mail-smtp-page-content *,#wp-mail-smtp .wp-mail-smtp-page-content *::before,#wp-mail-smtp .wp-mail-smtp-page-content *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-clear:before{content:" ";display:table}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-clear:after{clear:both;content:" ";display:table}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row{border-bottom:1px solid #e4e4e4;padding:30px 0;font-size:14px;line-height:1.3}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row:first-of-type{padding-top:10px !important}@media(max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row{padding:20px 0}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.inactive{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row .wp-mail-smtp-setting-mid-row-sep{background:#e4e4e4;height:1px;border:0;margin:15px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading{padding:20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading.no-desc h2,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading.no-desc h4{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading .wp-mail-smtp-setting-field{margin:0;max-width:1005px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading .desc{font-style:normal}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]{float:left;margin:1px 0 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]+label{margin:0 0 0 8px;vertical-align:baseline}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox .desc{margin:0 0 0 30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]+label+.desc{margin:8px 0 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-text .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-password .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-number .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-email .wp-mail-smtp-setting-label{padding-top:8px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-select .wp-mail-smtp-setting-label{padding-top:8px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-radio .wp-mail-smtp-setting-field input[type=radio]{margin:-3px 10px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-radio .wp-mail-smtp-setting-field label{margin-right:30px;display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-no-border{border-bottom:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-no-padding{padding:0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field label{vertical-align:middle;display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]{position:absolute;top:auto;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;white-space:nowrap}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch{background-color:#00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch:before{-webkit-transform:translateX(16px);-ms-transform:translateX(16px);transform:translateX(16px)}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:checked:hover+.wp-mail-smtp-setting-toggle-switch,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle-switch{box-shadow:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle-switch{background-color:#ddd}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch{background-color:#ddd;cursor:default}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:checked+.wp-mail-smtp-setting-toggle-switch{background-color:#24ff5c;cursor:default}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label{display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label+.wp-mail-smtp-setting-toggle-unchecked-label{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-unchecked-label{color:#aaa}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked:hover+.wp-mail-smtp-setting-toggle-switch,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked:focus+.wp-mail-smtp-setting-toggle-switch{box-shadow:0 0 0 1px #fff,0 0 0 3px #00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:not(:checked):hover+.wp-mail-smtp-setting-toggle-switch,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:not(:checked):focus+.wp-mail-smtp-setting-toggle-switch{background-color:#999;box-shadow:0 0 0 1px #fff,0 0 0 3px #999}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-unchecked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label{text-transform:uppercase;font-weight:400;color:#555;font-size:13px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-switch{position:relative;cursor:pointer;background-color:#ccc;border-radius:15px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;vertical-align:middle;display:inline-block;margin:-1px 5px 0 0;width:36px;height:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-switch:before{position:absolute;content:"";height:16px;width:16px;left:2px;top:2px;background-color:#fff;border-radius:50%;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer{padding-bottom:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer{display:inline-block;width:140px;margin-right:12px;margin-bottom:12px;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image{background:#fff;text-align:center;border:2px solid #e5e5e5;border-radius:4px;cursor:pointer;height:76px;position:relative;margin-bottom:10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image.is-recommended{background-image:url(../images/recommended.svg);background-repeat:no-repeat;background-size:60%;background-position:top right -2px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image img{max-width:80%;max-height:40px;display:block;position:relative;top:50%;left:50%;transform:translate(-50%, -50%);opacity:.6;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.wp-mail-smtp-mailer-smtp .wp-mail-smtp-mailer-image img{max-height:30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.active .wp-mail-smtp-mailer-image{border-color:#e27730}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.active .wp-mail-smtp-mailer-image img{opacity:1}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer:hover .wp-mail-smtp-mailer-image{border-color:#ccc}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer:hover .wp-mail-smtp-mailer-image img{opacity:1}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert{padding-top:20px;padding-bottom:25px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-row{border:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading{margin-bottom:25px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading h3{margin-bottom:10px;font-weight:500;font-size:18px;line-height:22px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading .notice{margin-top:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading .notice p{margin:6.5px 0;font-size:13px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-row{padding:0 !important}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-row+.wp-mail-smtp-setting-row{margin-top:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-unchecked-label{text-transform:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-label label{font-weight:500}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .dashicons-trash{position:relative;top:6px;color:#a7aaad;cursor:pointer;transition:.2s}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .dashicons-trash:hover{color:#d63638}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row#wp-mail-smtp-setting-row-alerts-twilio_sms .wp-mail-smtp-setting-row-alert-connection-options{position:relative}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row#wp-mail-smtp-setting-row-alerts-twilio_sms .wp-mail-smtp-setting-row-alert-connection-options+.wp-mail-smtp-setting-row-alert-connection-options:before{content:"";display:block;max-width:605px;height:1px;margin-bottom:20px;background-color:#dcdcde}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h2,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h4{color:#222;font-size:20px;font-weight:600;margin:0 0 6px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h2{margin-bottom:15px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h3{color:#222;font-size:24px;font-weight:600;margin:0 0 20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h5{color:#222;font-size:16px;font-weight:600;margin:0 0 20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p{margin:12px 0 0;font-size:14px;line-height:1.5em}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p:first-of-type{margin:8px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.desc{margin:10px 0 0;font-style:italic;color:#555}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.desc+.desc{font-style:normal}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.buttonned{margin-top:30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice{margin:5px 0 15px;box-sizing:border-box;background:#fff;border-left:4px solid transparent;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice.inline-error{border-color:#d63638;margin-bottom:5px;padding:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice.inline-edu-notice{border-color:#809eb0;line-height:1.5em;padding:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice a.wp-mail-smtp-mailer-notice-dismiss{float:right;color:#999da1;margin:0 0 10px 10px;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice a.wp-mail-smtp-mailer-notice-dismiss:hover{color:#666a6e}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row ul{margin:8px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row ul.list li{margin-left:20px;list-style-type:disc}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list th{padding:5px 5px 5px 0;text-align:left}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.email{padding-right:2em}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.status{width:100px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a{border-bottom:1px solid;display:inline-block;margin-right:5px;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]{color:#d63638}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:hover,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:active,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]:hover,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]:active,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]:focus{color:#8a1c1d}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select{background-color:#fff;border:1px solid #999;border-radius:4px;box-shadow:none;color:#555;display:inline-block;vertical-align:middle;padding:7px 12px;margin:0 10px 0 0;width:400px;min-height:35px;line-height:1.3}@media(max-width: 959px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select{width:300px}}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select{width:100%;max-width:unset;margin-right:0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select~button{margin-top:8px}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select[readonly]{background-color:#f9f9f9}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select.small-text{width:75px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select:focus{border:1px solid #016aab;box-shadow:0 0 0 1px #016aab;outline:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select:disabled{opacity:.6}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=checkbox]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=radio]:focus{border:1px solid #016aab;box-shadow:0 0 0 1px #016aab;outline:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row .wp-mail-smtp-dashicons-yes-alt-green.wp-mail-smtp-animate{-webkit-animation:wp-mail-smtp-fade-in-stop-out 1s linear;animation:wp-mail-smtp-fade-in-stop-out 1s linear}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row .wp-mail-smtp-dashicons-yes-alt-green.wp-mail-smtp-success{color:#00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label{display:block;float:left;width:205px;padding:0 20px 0 0}@media(max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label{float:none;width:100%;padding-bottom:15px}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label label{display:block;font-weight:600}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field{display:block;margin:0 0 0 205px;max-width:800px}@media(max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field{margin:0}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field hr{margin:20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field .wp-mail-smtp-setting-field-row{display:flex;flex-wrap:wrap}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field .wp-mail-smtp-setting-field-row>.wp-mail-smtp-btn{margin-right:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-submit{margin:0;padding:25px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-submit .help-text{margin-left:10px;vertical-align:middle}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-mailer-options .wp-mail-smtp-mailer-option .wp-mail-smtp-setting-row.section-heading{padding:20px 0 !important}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-mailer-options .wp-mail-smtp-mailer-option blockquote{background:#e5e5e5;border-radius:4px;color:#666;font-size:14px;margin:20px 0;padding:15px;max-width:1005px;width:100%}#wp-mail-smtp .wp-mail-smtp-page-content.wp-mail-smtp-page-general p{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline{background:#fff;border-left:4px solid #fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 15px;padding:1px 12px}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-success{border-left-color:#00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-warning{border-left-color:#ffb900}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-error{border-left-color:#d63638}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-info{border-left-color:#00a0d2}#wp-mail-smtp .wp-mail-smtp-page-content .notice p,#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline p{margin:.5em 0;padding:2px}#wp-mail-smtp .wp-mail-smtp-page-content pre{white-space:pre-line}#wp-mail-smtp .wp-mail-smtp-page-content.active{display:block}#wp-mail-smtp .wp-mail-smtp-page-content .connected-as{margin-left:30px}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-page-content .connected-as{display:block;margin-left:0;margin-top:8px}}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner{background-color:#fff;padding:25px 20px;border:1px solid #dadada;margin:10px 0 0 0;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .wp-mail-smtp-pro-banner-dismiss{position:absolute;right:10px;top:10px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .wp-mail-smtp-pro-banner-dismiss button{background:none;border:none;color:#a9a9a9;cursor:pointer;margin:0;padding:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner h2{color:#222;margin-top:0;font-size:16px;font-weight:600}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner p{font-size:14px;color:#555;margin-bottom:1.1em}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner p:last-of-type{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits{margin:0 0 16px 0;overflow:auto;max-width:1000px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul{margin:0;padding:0;width:50%;float:left}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul{width:100%;float:none}}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li{margin:0;padding:0 0 2px 16px;color:#555;font-size:14px;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li:before{content:"+";position:absolute;top:-1px;left:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li.arrow-right:before{content:"→"}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a{color:#e27730}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:hover,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:active,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:focus{color:#b85a1b}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .stars{text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .stars .dashicons{width:16px;height:16px;font-size:16px;vertical-align:text-top}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .price-off{color:#00a32a;font-weight:600}#wp-mail-smtp .wp-mail-smtp-admin-columns>div[class*=-column-]{float:left}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-20{width:20%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-33{width:33.33333%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-40{width:40%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-50{width:50%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-60{width:60%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-80{width:80%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-last{float:right !important}#wp-mail-smtp .wp-mail-smtp-admin-columns:after{content:"";display:table;clear:both}#wp-mail-smtp .notice blockquote{margin-left:0;padding:2px}#wp-mail-smtp .notice blockquote pre{margin:0;white-space:pre-line}#wp-mail-smtp #wp-mail-smtp-reset-filter{clear:both;margin:20px 0;padding:10px;font-size:15px;text-align:center;background:#fff;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04)}#wp-mail-smtp #wp-mail-smtp-reset-filter a{text-decoration:none}#wp-mail-smtp #wp-mail-smtp-reset-filter .reset{cursor:pointer;color:#a6a6a6;font-size:15px;line-height:18px;width:18px;height:18px}#wp-mail-smtp #wp-mail-smtp-reset-filter .reset:focus,#wp-mail-smtp #wp-mail-smtp-reset-filter .reset:hover{color:#d63638}@media(min-width: 783px){#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#event{width:130px}#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#type{width:80px}#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#initiator{width:20%}#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#created_at{width:200px}}@media(max-width: 782px){#wp-mail-smtp .wp-mail-smtp-filter-date{display:flex !important;flex-direction:column;align-items:flex-start;float:none;width:100%;padding-right:0;margin-bottom:10px;max-width:600px}}#wp-mail-smtp .wp-mail-smtp-filter-date__control{float:left;margin:0 5px 0 0;min-height:30px;background-color:#fff;vertical-align:middle;max-width:210px;line-height:normal}@media(max-width: 782px){#wp-mail-smtp .wp-mail-smtp-filter-date__control{flex-grow:1;width:100%;max-width:none;min-height:40px;margin-right:0;margin-bottom:5px}}#wp-mail-smtp .wp-mail-smtp-filter-date__btn{margin:0;vertical-align:top}#wp-mail-smtp .wp-mail-smtp-setting-toggle{vertical-align:middle;display:inline-block}#wp-mail-smtp .wp-mail-smtp-setting-toggle__switch{position:relative;cursor:pointer;background-color:#ccc;border-radius:15px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;vertical-align:middle;display:inline-block;margin:-1px 0 0 0;width:36px;height:20px}#wp-mail-smtp .wp-mail-smtp-setting-toggle__switch:before{position:absolute;content:"";height:16px;width:16px;left:2px;top:2px;background-color:#fff;border-radius:50%;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]{position:absolute;top:auto;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;white-space:nowrap}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle__switch{background-color:#00a32a}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle__switch:before{-webkit-transform:translateX(16px);-ms-transform:translateX(16px);transform:translateX(16px)}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked:hover+.wp-mail-smtp-setting-toggle__switch,#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked:focus+.wp-mail-smtp-setting-toggle__switch{box-shadow:0 0 0 1px #fff,0 0 0 3px #00a32a}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:not(:checked):hover+.wp-mail-smtp-setting-toggle__switch,#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:not(:checked):focus+.wp-mail-smtp-setting-toggle__switch{background-color:#999;box-shadow:0 0 0 1px #fff,0 0 0 3px #999}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:checked:hover+.wp-mail-smtp-setting-toggle__switch,#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle__switch{box-shadow:none}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle__switch{background-color:#ddd}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle__switch{background-color:#ddd;cursor:default}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:checked+.wp-mail-smtp-setting-toggle__switch{background-color:#24ff5c;cursor:default}.wp-mail-smtp-btn{border:0;border-radius:3px;cursor:pointer;display:inline-block;margin:0;text-decoration:none;text-align:center;vertical-align:middle;white-space:nowrap;text-shadow:none;box-shadow:none;outline:none}.wp-mail-smtp-btn .dashicons{font-size:16px;width:16px;height:16px}.wp-mail-smtp-btn:disabled{opacity:.5;cursor:not-allowed}.wp-mail-smtp-btn.wp-mail-smtp-btn-md{font-size:13px;font-weight:600;padding:8px 12px;min-height:35px}.wp-mail-smtp-btn.wp-mail-smtp-btn-lg{font-size:16px;font-weight:600;padding:16px 28px}.wp-mail-smtp-btn.wp-mail-smtp-btn-upgrade,.wp-mail-smtp-btn.wp-mail-smtp-btn-cta{font-size:16px;line-height:20px;font-weight:500;padding:14px 30px}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange{background-color:#e27730;border-color:#e27730;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:focus{background-color:#b85a1b;border-color:#b85a1b;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #b85a1b}.wp-mail-smtp-btn.wp-mail-smtp-btn-red{background-color:#d63638;border-color:#d63638;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-red:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-red:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-red:focus{background-color:#b32d2e;border-color:#b32d2e;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-red:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #b32d2e}.wp-mail-smtp-btn.wp-mail-smtp-btn-grey{background-color:#f8f8f8;border:1px solid #999;color:#555}.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:focus{background-color:#eee;border-color:#555;color:#444}.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey{background-color:#f5f5f5;border:1px solid #ccc;color:#666}.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:focus{background-color:#eee;color:#444}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish{background-color:#738e9e;border-color:#738e9e;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:focus{background-color:#395360;border-color:#395360;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #395360}a.wp-mail-smtp-btn.wp-mail-smtp-btn-md{line-height:19px}#wp-mail-smtp-domain-check-details h2{color:#222;font-size:20px;line-height:24px;font-weight:600;margin:28px 0 23px}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item{padding:25px 0;border-top:1px solid #e4e4e4;display:flex}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item:last-child{padding-bottom:0}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-icon{width:18px;height:16px;margin-right:10px}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-content h3{text-transform:uppercase;font-weight:500;font-size:14px;line-height:17px;color:#222;margin:0 0 4px 0}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-content p{color:#555;font-size:14px;line-height:20px;margin:0 0 10px 0}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-content p:last-of-type{margin-bottom:0}.wp-mail-smtp-tab-tools-test .wp-mail-smtp-setting-row.section-heading{margin-bottom:22px}.wp-mail-smtp-tab-tools-test .wp-mail-smtp-test-email-resend{padding-top:22px;margin-top:22px;border-top:1px solid #e4e4e4}.wp-mail-smtp-tab-tools-test .wp-mail-smtp-test-email-resend a{font-size:14px;outline:none;box-shadow:none}.wp-mail-smtp-tab-tools-test #email-test-success{margin-top:30px;text-align:center}.wp-mail-smtp-tab-tools-test #email-test-success svg{display:block;max-width:500px;width:100%;height:auto;margin:0 auto 22px}.wp-mail-smtp-tab-tools-test #email-test-success h2{margin-top:0;margin-bottom:10px;font-weight:500;font-size:24px;line-height:29px;color:#222}.wp-mail-smtp-tab-tools-test #email-test-success p{margin-top:0;font-size:16px;line-height:24px;color:#555}.wp-mail-smtp-tab-tools-test #email-test-form .wp-mail-smtp-setting-row.section-heading{margin-bottom:0}.wp-mail-smtp-tab-tools-test #email-test-form .wp-mail-smtp-btn{min-width:95px}.wp-mail-smtp-tab-tools-test #email-test-form .wp-mail-smtp-loading{display:none;margin-bottom:-2px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug{margin-top:25px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug h2{margin:20px 0 10px;color:#222;font-size:16px;line-height:20px;font-weight:600}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug p{margin:10px 0;color:#555;font-size:14px;line-height:20px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul{list-style-type:disc}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol{margin:10px 0 10px 15px;color:#555;font-size:14px;line-height:20px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul li,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol li{margin:0 0 8px 0}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul li:last-of-type,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol li:last-of-type{margin:0}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul li ul,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol li ul{list-style-type:disc}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .dashicons-star-filled{color:#e27730;width:16px;height:16px;font-size:16px;vertical-align:text-top}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .price-off{color:#00a32a;font-weight:600}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-button-container{margin-bottom:22px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-toggle{float:left;margin-right:10px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy{min-width:122px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy .error-log-copy-back{display:none}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy-copied .error-log-copy-front{display:none}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy-copied .error-log-copy-back{display:inline}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log{padding-top:10px;padding-bottom:10px;display:none}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log.error-log-selection{display:block !important;opacity:0;height:0;padding:0;margin:0}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log pre{margin:0}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content .wrap,.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content .subsubsub{margin:0}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content>h1{color:#222;font-size:20px;font-weight:600;margin:0 0 15px 0;padding:0}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content>p{font-size:14px}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content h1.wp-heading-inline,.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content span.subtitle{display:none}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content hr.wp-header-end{visibility:hidden;margin:-2px 0 0}.wp-mail-smtp-admin-page-body .lity{z-index:999999999;padding:20px}.wp-mail-smtp-admin-page-body .lity-close{margin:10px}.wp-mail-smtp-admin-page-body .lity-content{max-width:80vw;max-height:80vh}.wp-mail-smtp-admin-page-body .lity-content img{max-height:80vh !important;max-width:80vw !important}.wp-mail-smtp-admin-page-body #wpfooter a{color:#2171b1 !important}.wp-mail-smtp-admin-page-body #wpfooter a:hover,.wp-mail-smtp-admin-page-body #wpfooter a:active{color:#135e96 !important}.wp-mail-smtp-debug-event-preview{text-align:left}.wp-mail-smtp-debug-event-preview h4{margin:15px 0;font-size:18px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-preview-subtitle{margin-bottom:30px;text-align:center}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-preview-subtitle span{color:#555;font-size:16px;line-height:22px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row{padding:20px 0;border-top:1px solid #ddd;display:flex;justify-content:flex-start;align-items:flex-start;font-size:16px;line-height:22px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-label{width:60px;margin-right:30px;font-weight:500}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-value{width:calc(100% - 90px)}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-initiator{display:inline-block;margin-bottom:5px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-code{color:#555}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row:last-child{border-bottom:1px solid #ddd}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-preview-content>div{word-break:break-word}[class^=wp-mail-smtp-dashicons]{display:inline-block;width:20px;height:20px}.wp-mail-smtp-dashicons-yes-alt-green{background-image:url("../images/icons/dashicons/dashicons-yes-alt-green.svg")}.wp-mail-smtp-dashicons-pdf-gray{background-image:url("../images/icons/dashicons/dashicons-pdf-grey.svg")} \ No newline at end of file +#wpcontent{padding-left:0 !important;position:relative}@media(max-width: 600px){#wpcontent{padding-top:46px}}@media(max-width: 600px){#wpbody{padding-top:0}}@-webkit-keyframes wp-mail-smtp-fade-in-stop-out{0%,100%{opacity:0}35%{opacity:1}65%{opacity:1}}@keyframes wp-mail-smtp-fade-in-stop-out{0%,100%{opacity:0}35%{opacity:1}65%{opacity:1}}body.wp-mail-smtp-admin-page-body div.jconfirm *,body.wp-mail-smtp-admin-page-body div.jconfirm *::before,body.wp-mail-smtp-admin-page-body div.jconfirm *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-bg{background-color:rgba(114,119,124,.75);opacity:1}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box{padding:30px;border-radius:6px;box-shadow:0 3px 6px rgba(0,0,0,.15);border-top-width:4px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,.4);top:8px;right:8px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{color:rgba(0,0,0,.8)}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c{margin:0 0 15px 0;padding:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin:0 0 30px;-webkit-transition:none;transition:none;-webkit-transform:none !important;-ms-transform:none !important;transform:none !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty,body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i:empty{display:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{display:block;color:#222;font-weight:500;font-size:24px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content-pane{display:block;margin-bottom:30px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{margin-bottom:0;overflow:inherit}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content{font-size:16px;color:#222;line-height:1.4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p{margin:0 0 20px;font-size:16px;line-height:1.5}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p:last-of-type{margin:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p.large{font-size:18px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content p.small{font-size:14px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content .wp-mail-smtp-debug-event-preview p{font-size:14px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content .wp-mail-smtp-btn{font-weight:600;text-transform:uppercase;-webkit-transition:background .1s;transition:background .1s;padding:10px 20px;outline:none;display:inline-block;font-size:14px;line-height:1.4;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;-webkit-tap-highlight-color:transparent;border:0;background-image:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-content .wp-mail-smtp-btn.with-loader{padding:12px 12px 7px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons{padding:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button{transition:.2s;box-shadow:none;margin:0 10px 0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button:hover{box-shadow:inset 0 0 0 100px rgba(0,0,0,.1)}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-confirm{color:#fff;outline:none;border:1px solid #e27730;background-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-cancel{color:#777;outline:none;background:#f8f8f8;border:1px solid #ccc}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button,body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-default{color:#666}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-hide{display:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-block{display:block;text-align:center;width:100%;margin:0 0 10px 0 !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box div.jconfirm-buttons button.btn-normal-case{text-transform:none !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-green{border-color:#00a32a}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-green div.jconfirm-buttons button.btn-confirm{background-color:#00a32a;border-color:#00a32a}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-orange{border-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-orange div.jconfirm-buttons button.btn-confirm{background-color:#e27730;border-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-red{border-color:#d63638}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-red div.jconfirm-buttons button.btn-confirm{background-color:#d63638;border-color:#d63638}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-blue{border-color:#3582c4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.jconfirm-type-blue div.jconfirm-buttons button.btn-confirm{background-color:#3582c4;border-color:#3582c4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading{border-top-color:#fff !important;height:160px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading .jconfirm-title-c{display:block !important;position:relative;z-index:4}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading .jconfirm-title-c .jconfirm-icon-c{display:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading:before{z-index:2}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.loading:after{content:"";position:absolute;left:50%;top:68%;margin-left:-20px;height:40px;width:40px;border:solid 6px transparent;border-bottom-color:#e27730;opacity:1;z-index:3}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal{padding:30px 30px 15px;border-top:none}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-title-c{margin:0 0 26px 0;padding:0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-title-c .jconfirm-icon-c{margin-bottom:20px;color:#c4c4c4 !important}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-title-c .jconfirm-icon-c svg{height:35px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-content-pane{margin-bottom:25px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal div.jconfirm-buttons button.btn-confirm{background-color:#e27730;border-color:#e27730}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note{text-align:center;margin:45px 0 0}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note p{background-color:#fcf9e8;margin:0 -30px;padding:24px 60px 20px;font-size:15px;color:#4d4d4d;position:relative}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note p:after{content:url(../images/font-awesome/check-circle-solid-green.svg);width:40px;height:40px;background-color:#fff;border-radius:50%;padding:5px 6px;position:absolute;top:-20px;right:50%;margin-right:-18px}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note span{font-weight:600;color:#00a32a}body.wp-mail-smtp-admin-page-body div.jconfirm .jconfirm-box.wp-mail-smtp-upgrade-mailer-education-modal .discount-note a{color:#aaa;display:block;margin-top:12px}@media screen and (max-width: 1023px){#wp-mail-smtp-notice-bar{display:none !important}}#wp-mail-smtp-notice-bar{max-height:35px;position:relative;margin-bottom:-3px;transition:all .3s ease-out;overflow:hidden}#wp-mail-smtp-notice-bar.out{max-height:3px}#wp-mail-smtp-notice-bar .wp-mail-smtp-notice-bar-container{background-color:#ddd;border-top:3px solid #e27730;color:#555;text-align:center;padding:7px}#wp-mail-smtp-notice-bar a{color:#e27730}#wp-mail-smtp-notice-bar a:hover{color:#b85a1b}#wp-mail-smtp-notice-bar .dismiss{position:absolute;top:0;right:0;border:none;padding:5px;margin-top:4px;background:0 0;color:#72777c;cursor:pointer}#wp-mail-smtp-notice-bar .dismiss:before{background:0 0;color:#72777c;content:"";display:block;font:normal 20px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased}#screen-meta-links .screen-meta-toggle{position:absolute;right:20px;top:auto}#wp-mail-smtp .wp-mail-smtp-product-education__row{border-bottom:1px solid #e4e4e4;padding:25px 0 5px;font-size:14px;line-height:1.3;max-width:1005px}#wp-mail-smtp .wp-mail-smtp-product-education__row>*:last-child{border-bottom:none !important}#wp-mail-smtp .wp-mail-smtp-product-education__row--inactive{opacity:.5;pointer-events:none}#wp-mail-smtp .wp-mail-smtp-product-education__row--full-width{max-width:unset}#wp-mail-smtp .wp-mail-smtp-product-education__row--no-border{border-bottom:none !important}#wp-mail-smtp .wp-mail-smtp-product-education__row--no-padding{padding:0 !important}#wp-mail-smtp .wp-mail-smtp-product-education__row:first-of-type{padding-top:10px}#wp-mail-smtp .wp-mail-smtp-product-education__row:last-of-type+.wp-mail-smtp-btn-upgrade{margin-top:25px}#wp-mail-smtp .wp-mail-smtp-product-education__heading{display:flex;align-items:center;margin-top:0;margin-bottom:10px;font-size:20px;line-height:24px;color:#222}#wp-mail-smtp .wp-mail-smtp-product-education__heading:after{content:"";margin-left:10px;background-image:url("../images/pro-badge-small.svg");background-size:contain;background-repeat:no-repeat;width:35px;height:16px}#wp-mail-smtp .wp-mail-smtp-product-education__description{margin-top:0;margin-bottom:20px;color:#555;font-size:14px;line-height:1.5em}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots{display:flex;flex-wrap:wrap}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-product-education__screenshots{flex-direction:column}}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div{display:flex;flex-direction:column;align-items:center;margin:0 25px 20px 0}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div{margin-right:0;max-width:unset !important}}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div:last-child{margin-right:0}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div a{position:relative;margin-bottom:10px;background:#fff;border:5px solid #fff;box-sizing:border-box;border-radius:4px}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div a:after{content:"";position:absolute;opacity:0;height:100%;width:100%;top:0;left:0;background-color:rgba(68,68,68,.15);background-image:url("../../assets/images/icons/zoom.svg");background-repeat:no-repeat;background-position:center;background-size:50px;transition:all .3s}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div a:hover:after{opacity:1}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div img{display:block;max-width:100%;height:auto}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots>div span{font-size:14px;line-height:18px;text-align:center;color:#555}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots--two>div{max-width:487px}#wp-mail-smtp .wp-mail-smtp-product-education__screenshots--three>div{max-width:316px}#wp-mail-smtp .wp-mail-smtp-product-education__list>h4{margin-top:0;margin-bottom:20px;font-size:16px;line-height:20px;color:#222}#wp-mail-smtp .wp-mail-smtp-product-education__list>div{display:flex;flex-wrap:wrap}#wp-mail-smtp .wp-mail-smtp-product-education__list ul{width:290px;margin:0 40px 20px 0}#wp-mail-smtp .wp-mail-smtp-product-education__list ul li{display:flex;align-items:center;font-size:14px;line-height:20px;margin-bottom:0;color:#555}#wp-mail-smtp .wp-mail-smtp-product-education__list ul li+li{margin-top:20px}#wp-mail-smtp .wp-mail-smtp-product-education__list ul li:before{content:url("../../assets/images/icons/check-solid.svg");width:16px;margin-right:10px}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section{margin-bottom:20px;cursor:not-allowed}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section:last-of-type{margin-bottom:20px}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section h5{clear:both;margin:0 0 10px 0;color:#222;font-size:16px;font-weight:600}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section label{clear:both;float:left;margin:3px 0 3px 0}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section .wp-mail-smtp-date-selector{width:200px;cursor:pointer}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section .wp-mail-smtp-search-box-field{width:200px}#wp-mail-smtp #wp-mail-smtp-tools-export-email-logs-product-education section .wp-mail-smtp-search-box-term{width:300px}#wp-mail-smtp #wp-mail-smtp-email-controls-product-education .wp-mail-smtp-product-education__row--inactive{padding-top:20px;padding-bottom:0}#wp-mail-smtp #wp-mail-smtp-email-controls-product-education .wp-mail-smtp-setting-row:last-child{border-bottom:none}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu h2{display:inline-block;vertical-align:middle}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .badge{margin:0 0 2px 7px;vertical-align:middle;width:40px;height:17px}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-multisite{color:#9a9a9a}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-multisite p.desc{color:#bababa}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-multisite input[type=checkbox]:disabled{border-color:#aaa}#wp-mail-smtp .wp-mail-smtp-page-nw-product-edu .wp-mail-smtp-setting-row-no-setting{margin-top:30px}.wp-mail-smtp-lite #wp-mail-smtp .wp-mail-smtp-page-reports .wp-mail-smtp-page-title .page-title{position:relative}.wp-mail-smtp-lite #wp-mail-smtp .wp-mail-smtp-page-reports .wp-mail-smtp-page-title .page-title:after{content:"";display:inline-block;margin-left:10px;background-image:url("../images/pro-badge-small.svg");background-size:contain;background-repeat:no-repeat;width:35px;height:16px}.wp-mail-smtp-loading{animation:.65s linear infinite wp-mail-smtp-loading-spin}.wp-mail-smtp-loading-md{width:32px;height:32px}.wp-mail-smtp-loading-sm{width:16px;height:16px}.wp-mail-smtp-loading-spin{position:relative;color:transparent !important;pointer-events:none}.wp-mail-smtp-loading-spin:after{position:absolute;box-sizing:border-box;animation:.65s linear infinite wp-mail-smtp-loading-spin;border:2px solid #fff;border-radius:50%;border-right-color:transparent !important;border-top-color:transparent !important;content:"";display:block;top:50%;left:50%;width:16px;height:16px;margin-top:-8px;margin-left:-8px}@keyframes wp-mail-smtp-loading-spin{0%{transform:rotateZ(270deg)}100%{transform:rotateZ(630deg)}}#wp-mail-smtp-flyout{position:fixed;z-index:99999;transition:all .2s ease-in-out;right:40px;bottom:40px;opacity:1}@media(max-width: 959px){#wp-mail-smtp-flyout{display:none}}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head{display:block}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head:focus{box-shadow:none}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head figure{margin:0;border-radius:50%;border:3px solid #e27730;overflow:hidden;box-shadow:0 2px 20px rgba(0,0,0,.15);background-color:#fff;transition:all .2s ease-in-out}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head figure img{display:block;width:54px;height:54px;transition:all .2s ease-in-out}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head:hover figure{box-shadow:0 2px 30px rgba(0,0,0,.2)}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head .wp-mail-smtp-flyout-label{right:calc(100% + 15px);opacity:0;transform:translateY(-50%) scale(0);margin-right:-50px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-head:hover .wp-mail-smtp-flyout-label{opacity:1;transform:translateY(-50%) scale(1);margin-right:0}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-label{position:absolute;display:block;top:50%;right:calc(100% + 15px);transform:translateY(-50%);-moz-transform:translateY(-50%);-webkit-transform:translateY(-50%);color:#fff;background-color:#a7aaad;font-size:12px;white-space:nowrap;padding:6px 10px;height:auto !important;line-height:initial;transition:all .2s ease-out;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item{position:absolute;display:flex;left:10px;width:40px;height:40px;opacity:0;visibility:hidden;transition:all .2s ease-in-out;transform:scale(0);border-radius:50%;box-shadow:0px 2px 10px rgba(0,0,0,.15);background-color:#738e9e}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item img{margin:auto}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-0{bottom:75px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-1{bottom:130px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-2{bottom:185px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-3{bottom:240px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item.wp-mail-smtp-flyout-item-4{bottom:295px}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item:hover{background-color:#395360}#wp-mail-smtp-flyout .wp-mail-smtp-flyout-item:hover .wp-mail-smtp-flyout-label{background-color:#787c82}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item{opacity:1;visibility:visible;transform:scale(1)}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-head .wp-mail-smtp-flyout-label{display:none}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-head figure img{transform:rotate(-15deg) scale(1.17)}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-0{transition:transform .2s 0ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-1{transition:transform .2s 35ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-2{transition:transform .2s 70ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-3{transition:transform .2s 105ms,background-color .2s}#wp-mail-smtp-flyout.opened .wp-mail-smtp-flyout-item-4{transition:transform .2s 140ms,background-color .2s}#wp-mail-smtp-flyout.out{opacity:0;visibility:hidden}.wp-mail-smtp-tooltip{position:relative;display:inline-block;text-decoration:underline;text-decoration-style:dotted;cursor:help;color:#555;margin-top:15px !important}.wp-mail-smtp-tooltip-text{visibility:hidden;position:absolute;z-index:9999;width:360px;background-color:#2d4f60;color:#fff;text-align:center;padding:16px 20px;font-size:14px;border-radius:5px;bottom:100%;left:50%;margin-left:-180px}.wp-mail-smtp-tooltip-text::after{content:" ";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#2d4f60 transparent transparent transparent}.wp-mail-smtp-tooltip:hover .wp-mail-smtp-tooltip-text{visibility:visible}#wp-mail-smtp .wp-mail-smtp-conditional button{cursor:pointer}#wp-mail-smtp .wp-mail-smtp-conditional table{width:100%;max-width:740px;padding:0;margin:0;border-collapse:collapse;border-spacing:0;font-size:13px}#wp-mail-smtp .wp-mail-smtp-conditional table td{padding:0 10px 20px 0}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__row{display:flex;flex-direction:column}}#wp-mail-smtp .wp-mail-smtp-conditional__row input,#wp-mail-smtp .wp-mail-smtp-conditional__row select{width:100% !important;max-width:100%;margin:0;text-overflow:ellipsis}#wp-mail-smtp .wp-mail-smtp-conditional__property-col{width:23%}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__property-col{width:100%}}#wp-mail-smtp .wp-mail-smtp-conditional__operator-col{width:23%}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__operator-col{width:100%}}#wp-mail-smtp .wp-mail-smtp-conditional__value-col{width:42%}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-conditional__value-col{width:100%}}#wp-mail-smtp .wp-mail-smtp-conditional__value :disabled{background-color:#f1f1f1;cursor:not-allowed}#wp-mail-smtp .wp-mail-smtp-conditional__actions{display:flex;align-items:center;padding-right:0}#wp-mail-smtp .wp-mail-smtp-conditional__delete-rule{background-color:transparent;border:none;color:#999;margin:0 0 0 10px;padding:0;vertical-align:middle}#wp-mail-smtp .wp-mail-smtp-conditional__delete-rule:hover{color:#d63638}#wp-mail-smtp .wp-mail-smtp-conditional__group-delimiter{margin:0 0 20px;font-size:14px;font-style:italic;font-weight:400;line-height:17px;color:#888}#screen-meta-links,#screen-meta{display:none}#wp-mail-smtp-header-temp{position:absolute;margin:0;top:-1px;left:20px;right:0;z-index:99}#wp-mail-smtp-header{border-top:3px solid #e27730;padding:24px 20px}#wp-mail-smtp-header img{display:block;margin:0;max-width:242px}@media(max-width: 782px){#wp-mail-smtp-header img{max-width:200px}}.wp-mail-smtp-page{color:#222}.wp-mail-smtp-page a{color:#2171b1}.wp-mail-smtp-page a:hover,.wp-mail-smtp-page a:active{color:#135e96}#wp-mail-smtp{margin:0}#wp-mail-smtp .wp-mail-smtp-hide{display:none}#wp-mail-smtp .wp-mail-smtp-page-title{min-height:58px;background-color:#fff;font-size:14px;margin:0 0 20px 0;padding:0 20px}#wp-mail-smtp .wp-mail-smtp-page-title a.tab{border-bottom:2px solid #fff;box-shadow:none;color:#666;display:inline-block;margin-right:30px;padding:20px 0 18px 0;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-title a.tab.active{border-bottom:2px solid #e27730}#wp-mail-smtp .wp-mail-smtp-page-title a.tab:hover{border-color:#999}#wp-mail-smtp .wp-mail-smtp-page-title a.action{color:#fff;font-weight:600;margin:14px 0 14px 10px;line-height:28px;min-height:30px;vertical-align:top}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-page-title a.action{margin-left:0}}#wp-mail-smtp .wp-mail-smtp-page-title .page-title{background-color:#fff;display:inline-block;font-size:23px;margin:0;padding:20px 20px 20px 0}#wp-mail-smtp .wp-mail-smtp-page-content{padding:0 20px}#wp-mail-smtp .wp-mail-smtp-page-content *,#wp-mail-smtp .wp-mail-smtp-page-content *::before,#wp-mail-smtp .wp-mail-smtp-page-content *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-clear:before{content:" ";display:table}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-clear:after{clear:both;content:" ";display:table}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row{border-bottom:1px solid #e4e4e4;padding:30px 0;font-size:14px;line-height:1.3}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row:first-of-type{padding-top:10px !important}@media(max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row{padding:20px 0}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.inactive{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row .wp-mail-smtp-setting-mid-row-sep{background:#e4e4e4;height:1px;border:0;margin:15px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading{padding:20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading.no-desc h2,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading.no-desc h4{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading .wp-mail-smtp-setting-field{margin:0;max-width:1005px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading .desc{font-style:normal}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]{float:left;margin:1px 0 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]+label{margin:0 0 0 8px;vertical-align:baseline}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox .desc{margin:0 0 0 30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]+label+.desc{margin:8px 0 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-text .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-password .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-number .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-email .wp-mail-smtp-setting-label{padding-top:8px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-select .wp-mail-smtp-setting-label{padding-top:8px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-radio .wp-mail-smtp-setting-field input[type=radio]{margin:-3px 10px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-radio .wp-mail-smtp-setting-field label{margin-right:30px;display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-no-border{border-bottom:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-no-padding{padding:0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field label{vertical-align:middle;display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]{position:absolute;top:auto;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;white-space:nowrap}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch{background-color:#00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch:before{-webkit-transform:translateX(16px);-ms-transform:translateX(16px);transform:translateX(16px)}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:checked:hover+.wp-mail-smtp-setting-toggle-switch,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle-switch{box-shadow:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle-switch{background-color:#ddd}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch{background-color:#ddd;cursor:default}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled:checked+.wp-mail-smtp-setting-toggle-switch{background-color:#24ff5c;cursor:default}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label{display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label+.wp-mail-smtp-setting-toggle-unchecked-label{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-unchecked-label{color:#aaa}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked:hover+.wp-mail-smtp-setting-toggle-switch,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked:focus+.wp-mail-smtp-setting-toggle-switch{box-shadow:0 0 0 1px #fff,0 0 0 3px #00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:not(:checked):hover+.wp-mail-smtp-setting-toggle-switch,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:not(:checked):focus+.wp-mail-smtp-setting-toggle-switch{background-color:#999;box-shadow:0 0 0 1px #fff,0 0 0 3px #999}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-unchecked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label{text-transform:uppercase;font-weight:400;color:#555;font-size:13px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-switch{position:relative;cursor:pointer;background-color:#ccc;border-radius:15px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;vertical-align:middle;display:inline-block;margin:-1px 5px 0 0;width:36px;height:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-switch:before{position:absolute;content:"";height:16px;width:16px;left:2px;top:2px;background-color:#fff;border-radius:50%;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer{padding-bottom:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer{display:inline-block;width:140px;margin-right:12px;margin-bottom:12px;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image{background:#fff;text-align:center;border:2px solid #e5e5e5;border-radius:4px;cursor:pointer;height:76px;position:relative;margin-bottom:10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image.is-recommended{background-image:url(../images/recommended.svg);background-repeat:no-repeat;background-size:60%;background-position:top right -2px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image img{max-width:80%;max-height:40px;display:block;position:relative;top:50%;left:50%;transform:translate(-50%, -50%);opacity:.6;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.wp-mail-smtp-mailer-smtp .wp-mail-smtp-mailer-image img{max-height:30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.active .wp-mail-smtp-mailer-image{border-color:#e27730}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.active .wp-mail-smtp-mailer-image img{opacity:1}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer:hover .wp-mail-smtp-mailer-image{border-color:#ccc}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer:hover .wp-mail-smtp-mailer-image img{opacity:1}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert{padding-top:20px;padding-bottom:25px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-row{border:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading{margin-bottom:25px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading h3{margin-bottom:10px;font-weight:500;font-size:18px;line-height:22px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading .notice{margin-top:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .section-heading .notice p{margin:6.5px 0;font-size:13px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-row{padding:0 !important}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-row+.wp-mail-smtp-setting-row{margin-top:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-unchecked-label{text-transform:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .wp-mail-smtp-setting-label label{font-weight:500}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .dashicons-trash{position:relative;top:6px;color:#a7aaad;cursor:pointer;transition:.2s}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-alert .dashicons-trash:hover{color:#d63638}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row#wp-mail-smtp-setting-row-alerts-twilio_sms .wp-mail-smtp-setting-row-alert-connection-options{position:relative}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row#wp-mail-smtp-setting-row-alerts-twilio_sms .wp-mail-smtp-setting-row-alert-connection-options+.wp-mail-smtp-setting-row-alert-connection-options:before{content:"";display:block;max-width:605px;height:1px;margin-bottom:20px;background-color:#dcdcde}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h2,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h4{color:#222;font-size:20px;font-weight:600;margin:0 0 6px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h2{margin-bottom:15px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h3{color:#222;font-size:24px;font-weight:600;margin:0 0 20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h5{color:#222;font-size:16px;font-weight:600;margin:0 0 20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p{margin:12px 0 0;font-size:14px;line-height:1.5em}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p:first-of-type{margin:8px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.desc{margin:10px 0 0;font-style:italic;color:#555}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.desc+.desc{font-style:normal}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.buttonned{margin-top:30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice{margin:5px 0 15px;box-sizing:border-box;background:#fff;border-left:4px solid transparent;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice.inline-error{border-color:#d63638;margin-bottom:5px;padding:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice.inline-edu-notice{border-color:#809eb0;line-height:1.5em;padding:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice a.wp-mail-smtp-mailer-notice-dismiss{float:right;color:#999da1;margin:0 0 10px 10px;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice a.wp-mail-smtp-mailer-notice-dismiss:hover{color:#666a6e}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row ul{margin:8px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row ul.list li{margin-left:20px;list-style-type:disc}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list th{padding:5px 5px 5px 0;text-align:left}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.email{padding-right:2em}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.status{width:100px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a{border-bottom:1px solid;display:inline-block;margin-right:5px;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]{color:#d63638}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:hover,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:active,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]:hover,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]:active,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=error]:focus{color:#8a1c1d}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select{background-color:#fff;border:1px solid #999;border-radius:4px;box-shadow:none;color:#555;display:inline-block;vertical-align:middle;padding:7px 12px;margin:0 10px 0 0;width:400px;min-height:35px;line-height:1.3}@media(max-width: 959px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select{width:300px}}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select{width:100%;max-width:unset;margin-right:0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]~button,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select~button{margin-top:8px}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select[readonly]{background-color:#f9f9f9}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select.small-text{width:75px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select:focus{border:1px solid #016aab;box-shadow:0 0 0 1px #016aab;outline:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row select:disabled{opacity:.6}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=checkbox]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=radio]:focus{border:1px solid #016aab;box-shadow:0 0 0 1px #016aab;outline:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row .wp-mail-smtp-dashicons-yes-alt-green.wp-mail-smtp-animate{-webkit-animation:wp-mail-smtp-fade-in-stop-out 1s linear;animation:wp-mail-smtp-fade-in-stop-out 1s linear}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row .wp-mail-smtp-dashicons-yes-alt-green.wp-mail-smtp-success{color:#00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label{display:block;float:left;width:205px;padding:0 20px 0 0}@media(max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label{float:none;width:100%;padding-bottom:15px}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label label{display:block;font-weight:600}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field{display:block;margin:0 0 0 205px;max-width:800px}@media(max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field{margin:0}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field hr{margin:20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field .wp-mail-smtp-setting-field-row{display:flex;flex-wrap:wrap}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field .wp-mail-smtp-setting-field-row>.wp-mail-smtp-btn{margin-right:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-submit{margin:0;padding:25px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-submit .help-text{margin-left:10px;vertical-align:middle}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-mailer-options .wp-mail-smtp-mailer-option .wp-mail-smtp-setting-row.section-heading{padding:20px 0 !important}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-mailer-options .wp-mail-smtp-mailer-option blockquote{background:#e5e5e5;border-radius:4px;color:#666;font-size:14px;margin:20px 0;padding:15px;max-width:1005px;width:100%}#wp-mail-smtp .wp-mail-smtp-page-content.wp-mail-smtp-page-general p{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline{background:#fff;border-left:4px solid #fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 15px;padding:1px 12px}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-success{border-left-color:#00a32a}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-warning{border-left-color:#ffb900}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-error{border-left-color:#d63638}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-info{border-left-color:#00a0d2}#wp-mail-smtp .wp-mail-smtp-page-content .notice p,#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline p{margin:.5em 0;padding:2px}#wp-mail-smtp .wp-mail-smtp-page-content pre{white-space:pre-line}#wp-mail-smtp .wp-mail-smtp-page-content.active{display:block}#wp-mail-smtp .wp-mail-smtp-page-content .connected-as{margin-left:30px}@media(max-width: 599px){#wp-mail-smtp .wp-mail-smtp-page-content .connected-as{display:block;margin-left:0;margin-top:8px}}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner{background-color:#fff;padding:25px 20px;border:1px solid #dadada;margin:10px 0 0 0;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .wp-mail-smtp-pro-banner-dismiss{position:absolute;right:10px;top:10px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .wp-mail-smtp-pro-banner-dismiss button{background:none;border:none;color:#a9a9a9;cursor:pointer;margin:0;padding:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner h2{color:#222;margin-top:0;font-size:16px;font-weight:600}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner p{font-size:14px;color:#555;margin-bottom:1.1em}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner p:last-of-type{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits{margin:0 0 16px 0;overflow:auto;max-width:1000px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul{margin:0;padding:0;width:50%;float:left}@media(max-width: 600px){#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul{width:100%;float:none}}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li{margin:0;padding:0 0 2px 16px;color:#555;font-size:14px;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li:before{content:"+";position:absolute;top:-1px;left:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li.arrow-right:before{content:"→"}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a{color:#e27730}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:hover,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:active,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:focus{color:#b85a1b}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .stars{text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .stars .dashicons{width:16px;height:16px;font-size:16px;vertical-align:text-top}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .price-off{color:#00a32a;font-weight:600}#wp-mail-smtp .wp-mail-smtp-admin-columns>div[class*=-column-]{float:left}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-20{width:20%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-33{width:33.33333%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-40{width:40%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-50{width:50%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-60{width:60%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-80{width:80%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-last{float:right !important}#wp-mail-smtp .wp-mail-smtp-admin-columns:after{content:"";display:table;clear:both}#wp-mail-smtp .notice blockquote{margin-left:0;padding:2px}#wp-mail-smtp .notice blockquote pre{margin:0;white-space:pre-line}#wp-mail-smtp #wp-mail-smtp-reset-filter{clear:both;margin:20px 0;padding:10px;font-size:15px;text-align:center;background:#fff;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04)}#wp-mail-smtp #wp-mail-smtp-reset-filter a{text-decoration:none}#wp-mail-smtp #wp-mail-smtp-reset-filter .reset{cursor:pointer;color:#a6a6a6;font-size:15px;line-height:18px;width:18px;height:18px}#wp-mail-smtp #wp-mail-smtp-reset-filter .reset:focus,#wp-mail-smtp #wp-mail-smtp-reset-filter .reset:hover{color:#d63638}@media(min-width: 783px){#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#event{width:130px}#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#type{width:80px}#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#initiator{width:20%}#wp-mail-smtp .wp-mail-smtp-tab-tools-debug-events th#created_at{width:200px}}@media(max-width: 782px){#wp-mail-smtp .wp-mail-smtp-filter-date{display:flex !important;flex-direction:column;align-items:flex-start;float:none;width:100%;padding-right:0;margin-bottom:10px;max-width:600px}}#wp-mail-smtp .wp-mail-smtp-filter-date__control{float:left;margin:0 5px 0 0;min-height:30px;background-color:#fff;vertical-align:middle;max-width:210px}@media(max-width: 782px){#wp-mail-smtp .wp-mail-smtp-filter-date__control{flex-grow:1;width:100%;max-width:none;min-height:40px;margin-right:0;margin-bottom:5px}}#wp-mail-smtp .wp-mail-smtp-filter-date__btn{margin:0;vertical-align:top}#wp-mail-smtp .wp-mail-smtp-setting-toggle{vertical-align:middle;display:inline-block}#wp-mail-smtp .wp-mail-smtp-setting-toggle__switch{position:relative;cursor:pointer;background-color:#ccc;border-radius:15px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;vertical-align:middle;display:inline-block;margin:-1px 0 0 0;width:36px;height:20px}#wp-mail-smtp .wp-mail-smtp-setting-toggle__switch:before{position:absolute;content:"";height:16px;width:16px;left:2px;top:2px;background-color:#fff;border-radius:50%;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]{position:absolute;top:auto;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;white-space:nowrap}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle__switch{background-color:#00a32a}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle__switch:before{-webkit-transform:translateX(16px);-ms-transform:translateX(16px);transform:translateX(16px)}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked:hover+.wp-mail-smtp-setting-toggle__switch,#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:checked:focus+.wp-mail-smtp-setting-toggle__switch{box-shadow:0 0 0 1px #fff,0 0 0 3px #00a32a}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:not(:checked):hover+.wp-mail-smtp-setting-toggle__switch,#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:not(:checked):focus+.wp-mail-smtp-setting-toggle__switch{background-color:#999;box-shadow:0 0 0 1px #fff,0 0 0 3px #999}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:checked:hover+.wp-mail-smtp-setting-toggle__switch,#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle__switch{box-shadow:none}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:not(:checked):hover+.wp-mail-smtp-setting-toggle__switch{background-color:#ddd}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle__switch{background-color:#ddd;cursor:default}#wp-mail-smtp .wp-mail-smtp-setting-toggle input[type=checkbox]:disabled:checked+.wp-mail-smtp-setting-toggle__switch{background-color:#24ff5c;cursor:default}.wp-mail-smtp-btn{border:0;border-radius:3px;cursor:pointer;display:inline-block;margin:0;text-decoration:none;text-align:center;vertical-align:middle;white-space:nowrap;text-shadow:none;box-shadow:none;outline:none}.wp-mail-smtp-btn .dashicons{font-size:16px;width:16px;height:16px}.wp-mail-smtp-btn:disabled{opacity:.5;cursor:not-allowed}.wp-mail-smtp-btn.wp-mail-smtp-btn-md{font-size:13px;font-weight:600;padding:8px 12px;min-height:35px}.wp-mail-smtp-btn.wp-mail-smtp-btn-lg{font-size:16px;font-weight:600;padding:16px 28px}.wp-mail-smtp-btn.wp-mail-smtp-btn-upgrade,.wp-mail-smtp-btn.wp-mail-smtp-btn-cta{font-size:16px;line-height:20px;font-weight:500;padding:14px 30px}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange{background-color:#e27730;border-color:#e27730;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:focus{background-color:#b85a1b;border-color:#b85a1b;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #b85a1b}.wp-mail-smtp-btn.wp-mail-smtp-btn-red{background-color:#d63638;border-color:#d63638;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-red:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-red:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-red:focus{background-color:#b32d2e;border-color:#b32d2e;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-red:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #b32d2e}.wp-mail-smtp-btn.wp-mail-smtp-btn-grey{background-color:#f8f8f8;border:1px solid #999;color:#555}.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:focus{background-color:#eee;border-color:#555;color:#444}.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey{background-color:#f5f5f5;border:1px solid #ccc;color:#666}.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:focus{background-color:#eee;color:#444}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish{background-color:#738e9e;border-color:#738e9e;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:focus{background-color:#395360;border-color:#395360;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #395360}a.wp-mail-smtp-btn.wp-mail-smtp-btn-md{line-height:19px}#wp-mail-smtp-domain-check-details h2{color:#222;font-size:20px;line-height:24px;font-weight:600;margin:28px 0 23px}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item{padding:25px 0;border-top:1px solid #e4e4e4;display:flex}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item:last-child{padding-bottom:0}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-icon{width:18px;height:16px;margin-right:10px}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-content h3{text-transform:uppercase;font-weight:500;font-size:14px;line-height:17px;color:#222;margin:0 0 4px 0}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-content p{color:#555;font-size:14px;line-height:20px;margin:0 0 10px 0}#wp-mail-smtp-domain-check-details .wp-mail-smtp-domain-check-details-check-list-item-content p:last-of-type{margin-bottom:0}.wp-mail-smtp-tab-tools-test .wp-mail-smtp-setting-row.section-heading{margin-bottom:22px}.wp-mail-smtp-tab-tools-test .wp-mail-smtp-test-email-resend{padding-top:22px;margin-top:22px;border-top:1px solid #e4e4e4}.wp-mail-smtp-tab-tools-test .wp-mail-smtp-test-email-resend a{font-size:14px;outline:none;box-shadow:none}.wp-mail-smtp-tab-tools-test #email-test-success{margin-top:30px;text-align:center}.wp-mail-smtp-tab-tools-test #email-test-success svg{display:block;max-width:500px;width:100%;height:auto;margin:0 auto 22px}.wp-mail-smtp-tab-tools-test #email-test-success h2{margin-top:0;margin-bottom:10px;font-weight:500;font-size:24px;line-height:29px;color:#222}.wp-mail-smtp-tab-tools-test #email-test-success p{margin-top:0;font-size:16px;line-height:24px;color:#555}.wp-mail-smtp-tab-tools-test #email-test-form .wp-mail-smtp-setting-row.section-heading{margin-bottom:0}.wp-mail-smtp-tab-tools-test #email-test-form .wp-mail-smtp-btn{min-width:95px}.wp-mail-smtp-tab-tools-test #email-test-form .wp-mail-smtp-loading{display:none;margin-bottom:-2px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug{margin-top:25px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug h2{margin:20px 0 10px;color:#222;font-size:16px;line-height:20px;font-weight:600}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug p{margin:10px 0;color:#555;font-size:14px;line-height:20px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul{list-style-type:disc}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol{margin:10px 0 10px 15px;color:#555;font-size:14px;line-height:20px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul li,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol li{margin:0 0 8px 0}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul li:last-of-type,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol li:last-of-type{margin:0}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ul li ul,.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug ol li ul{list-style-type:disc}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .dashicons-star-filled{color:#e27730;width:16px;height:16px;font-size:16px;vertical-align:text-top}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .price-off{color:#00a32a;font-weight:600}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-button-container{margin-bottom:22px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-toggle{float:left;margin-right:10px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy{min-width:122px}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy .error-log-copy-back{display:none}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy-copied .error-log-copy-front{display:none}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log-copy-copied .error-log-copy-back{display:inline}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log{padding-top:10px;padding-bottom:10px;display:none}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log.error-log-selection{display:block !important;opacity:0;height:0;padding:0;margin:0}.wp-mail-smtp-tab-tools-test #wp-mail-smtp-debug .error-log pre{margin:0}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content .wrap,.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content .subsubsub{margin:0}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content>h1{color:#222;font-size:20px;font-weight:600;margin:0 0 15px 0;padding:0}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content>p{font-size:14px}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content h1.wp-heading-inline,.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content span.subtitle{display:none}.wp-mail-smtp-tab-tools-action-scheduler .wp-mail-smtp-page-content hr.wp-header-end{visibility:hidden;margin:-2px 0 0}.wp-mail-smtp-admin-page-body .lity{z-index:999999999;padding:20px}.wp-mail-smtp-admin-page-body .lity-close{margin:10px}.wp-mail-smtp-admin-page-body .lity-content{max-width:80vw;max-height:80vh}.wp-mail-smtp-admin-page-body .lity-content img{max-height:80vh !important;max-width:80vw !important}.wp-mail-smtp-admin-page-body #wpfooter a{color:#2171b1 !important}.wp-mail-smtp-admin-page-body #wpfooter a:hover,.wp-mail-smtp-admin-page-body #wpfooter a:active{color:#135e96 !important}.wp-mail-smtp-debug-event-preview{text-align:left}.wp-mail-smtp-debug-event-preview h4{margin:15px 0;font-size:18px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-preview-subtitle{margin-bottom:30px;text-align:center}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-preview-subtitle span{color:#555;font-size:16px;line-height:22px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row{padding:20px 0;border-top:1px solid #ddd;display:flex;justify-content:flex-start;align-items:flex-start;font-size:16px;line-height:22px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-label{width:60px;margin-right:30px;font-weight:500}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-value{width:calc(100% - 90px)}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-initiator{display:inline-block;margin-bottom:5px}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row .debug-event-code{color:#555}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-row:last-child{border-bottom:1px solid #ddd}.wp-mail-smtp-debug-event-preview .wp-mail-smtp-debug-event-preview-content>div{word-break:break-word}[class^=wp-mail-smtp-dashicons]{display:inline-block;width:20px;height:20px}.wp-mail-smtp-dashicons-yes-alt-green{background-image:url("../images/icons/dashicons/dashicons-yes-alt-green.svg")}.wp-mail-smtp-dashicons-pdf-gray{background-image:url("../images/icons/dashicons/dashicons-pdf-grey.svg")} \ No newline at end of file diff --git a/assets/css/smtp-admin.scss b/assets/css/smtp-admin.scss index 5a666f5..ea77849 100644 --- a/assets/css/smtp-admin.scss +++ b/assets/css/smtp-admin.scss @@ -1051,7 +1051,6 @@ background-color: #fff; vertical-align: middle; max-width: 210px; - line-height: normal; @include media("<=tablet") { flex-grow: 1; diff --git a/assets/images/about/duplicator-icon-large.png b/assets/images/about/duplicator-icon-large.png new file mode 100644 index 0000000..3add72c Binary files /dev/null and b/assets/images/about/duplicator-icon-large.png differ diff --git a/assets/images/about/plugin-charitable.png b/assets/images/about/plugin-charitable.png new file mode 100644 index 0000000..c85adc9 Binary files /dev/null and b/assets/images/about/plugin-charitable.png differ diff --git a/assets/images/about/plugin-wpcode.png b/assets/images/about/plugin-wpcode.png new file mode 100644 index 0000000..456134a Binary files /dev/null and b/assets/images/about/plugin-wpcode.png differ diff --git a/assets/images/about/team.jpg b/assets/images/about/team.jpg index d392945..effb8c8 100644 Binary files a/assets/images/about/team.jpg and b/assets/images/about/team.jpg differ diff --git a/assets/js/smtp-admin.js b/assets/js/smtp-admin.js index 39b30d7..f5b3641 100644 --- a/assets/js/smtp-admin.js +++ b/assets/js/smtp-admin.js @@ -259,15 +259,17 @@ WPMailSMTP.Admin.Settings = WPMailSMTP.Admin.Settings || ( function( document, w education: { upgradeMailer: function( $input ) { + var mailerName = $input.data( 'title' ).trim(); + $.alert( { backgroundDismiss: true, escapeKey: true, animationBounce: 1, type: 'blue', closeIcon: true, - title: wp_mail_smtp.education.upgrade_title.replace( /%name%/g, $input.siblings( 'label' ).text().trim() ), + title: wp_mail_smtp.education.upgrade_title.replace( /%name%/g, mailerName ), icon: '">' + wp_mail_smtp.education.upgrade_icon_lock + '' + wp_mail_smtp.education.upgrade_bonus + wp_mail_smtp.education.upgrade_doc + '' ); diff --git a/assets/js/smtp-admin.min.js b/assets/js/smtp-admin.min.js index 88cd6da..fe43926 100644 --- a/assets/js/smtp-admin.min.js +++ b/assets/js/smtp-admin.min.js @@ -1 +1 @@ -"use strict";var WPMailSMTP=window.WPMailSMTP||{};WPMailSMTP.Admin=WPMailSMTP.Admin||{},WPMailSMTP.Admin.Settings=WPMailSMTP.Admin.Settings||function(s,l,p){var a={pluginSettingsChanged:!1,init:function(){p(a.ready)},ready:function(){a.pageHolder=p(".wp-mail-smtp-tab-settings"),a.settingsForm=p(".wp-mail-smtp-connection-settings-form"),p("#screen-meta-links, #screen-meta").prependTo("#wp-mail-smtp-header-temp").show(),a.bindActions(),a.setJQueryConfirmDefaults(),a.initFlyoutMenu()},bindActions:function(){p(".wp-mail-smtp-mailer-image",a.settingsForm).on("click",function(){p(this).parents(".wp-mail-smtp-mailer").find("input").trigger("click")}),p(".wp-mail-smtp-mailer input",a.settingsForm).on("click",function(){var t=p(this);if(t.prop("disabled"))return t.hasClass("educate")&&a.education.upgradeMailer(t),!1;p(".wp-mail-smtp-mailer",a.settingsForm).removeClass("active"),p(this).parents(".wp-mail-smtp-mailer").addClass("active"),p(".wp-mail-smtp-mailer-option",a.settingsForm).addClass("hidden").removeClass("active"),p(".wp-mail-smtp-mailer-option-"+p(this).val(),a.settingsForm).addClass("active").removeClass("hidden")}),a.mailers.smtp.bindActions(),p("#wp-mail-smtp-pro-banner-dismiss",a.pageHolder).on("click",function(){p.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",task:"pro_banner_dismiss",nonce:wp_mail_smtp.nonce}}).always(function(){p("#wp-mail-smtp-pro-banner",a.pageHolder).fadeOut("fast")})}),p(".js-wp-mail-smtp-mailer-notice-dismiss",a.settingsForm).on("click",function(t){t.preventDefault();var e=p(this),i=e.parents(".inline-notice");if(e.hasClass("disabled"))return!1;p.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",nonce:wp_mail_smtp.nonce,task:"notice_dismiss",notice:i.data("notice"),mailer:i.data("mailer")},beforeSend:function(){e.addClass("disabled")}}).always(function(){i.fadeOut("fast",function(){e.removeClass("disabled")})})}),p("#wp-mail-smtp-debug .error-log-toggle").on("click",function(t){t.preventDefault(),p("#wp-mail-smtp-debug .error-log").slideToggle()}),p("#wp-mail-smtp-debug .error-log-copy").on("click",function(t){t.preventDefault();var e=p(this),i=p("#wp-mail-smtp-debug .error-log");i.is(":visible")||i.addClass("error-log-selection");t=s.createRange();t.selectNode(i[0]),l.getSelection().removeAllRanges(),l.getSelection().addRange(t),s.execCommand("Copy"),l.getSelection().removeAllRanges(),i.removeClass("error-log-selection"),e.addClass("error-log-copy-copied"),setTimeout(function(){e.removeClass("error-log-copy-copied")},1500)}),p(".js-wp-mail-smtp-provider-remove",a.settingsForm).on("click",function(){return confirm(wp_mail_smtp.text_provider_remove)}),p(".wp-mail-smtp-setting-copy",a.settingsForm).on("click",function(t){t.preventDefault(),p("#"+p(this).data("source_id")).get(0).select(),s.execCommand("Copy");var e=p(this).find(".dashicons");e.removeClass("dashicons-admin-page").addClass("wp-mail-smtp-dashicons-yes-alt-green wp-mail-smtp-success wp-mail-smtp-animate"),setTimeout(function(){e.removeClass("wp-mail-smtp-dashicons-yes-alt-green wp-mail-smtp-success wp-mail-smtp-animate").addClass("dashicons-admin-page")},1e3)}),p("#wp-mail-smtp-notice-bar").on("click",".dismiss",function(){var t=p(this).closest("#wp-mail-smtp-notice-bar");t.addClass("out"),setTimeout(function(){t.remove()},300),p.post(ajaxurl,{action:"wp_mail_smtp_notice_bar_dismiss",nonce:wp_mail_smtp.nonce})}),a.triggerExitNotice(),a.beforeSaveChecks(),p(".js-wp-mail-smtp-setting-mailer-radio-input",a.settingsForm).on("change",this.processMailerSettingsOnChange),p(".wp-mail-smtp-tab-tools-test #email-test-form").on("submit",function(){var t=p(this).find(".wp-mail-smtp-btn");t.attr("disabled",!0),t.find("span").hide(),t.find(".wp-mail-smtp-loading").show()})},education:{upgradeMailer:function(e){p.alert({backgroundDismiss:!0,escapeKey:!0,animationBounce:1,type:"blue",closeIcon:!0,title:wp_mail_smtp.education.upgrade_title.replace(/%name%/g,e.siblings("label").text().trim()),icon:'">'+wp_mail_smtp.education.upgrade_icon_lock+''+wp_mail_smtp.education.upgrade_bonus+wp_mail_smtp.education.upgrade_doc+""),this.$body.addClass("wp-mail-smtp-upgrade-mailer-education-modal")},buttons:{confirm:{text:wp_mail_smtp.education.upgrade_button,btnClass:"btn-confirm",keys:["enter"],action:function(){var t=/(\?)/.test(wp_mail_smtp.education.upgrade_url)?"&":"?",t=wp_mail_smtp.education.upgrade_url+t+"utm_content="+encodeURIComponent(e.val());l.open(t,"_blank")}}}})}},mailers:{smtp:{bindActions:function(){p("#wp-mail-smtp-setting-smtp-auth").on("change",function(){p("#wp-mail-smtp-setting-row-smtp-user, #wp-mail-smtp-setting-row-smtp-pass").toggleClass("inactive")}),p("#wp-mail-smtp-setting-row-smtp-encryption input").on("change",function(){var t=p(this),e=p("#wp-mail-smtp-setting-smtp-port",a.settingsForm);"tls"===t.val()?(e.val("587"),p("#wp-mail-smtp-setting-row-smtp-autotls").addClass("inactive")):("ssl"===t.val()?e.val("465"):e.val("25"),p("#wp-mail-smtp-setting-row-smtp-autotls").removeClass("inactive"))})}}},triggerExitNotice:function(){var t=p(".wp-mail-smtp-page-general");p(l).on("beforeunload",function(){if(a.pluginSettingsChanged)return wp_mail_smtp.text_settings_not_saved}),p(":input:not( #wp-mail-smtp-setting-license-key, .wp-mail-smtp-not-form-input )",t).on("change",function(){a.pluginSettingsChanged=!0}),p("form",t).on("submit",function(){a.pluginSettingsChanged=!1})},beforeSaveChecks:function(){a.settingsForm.on("submit",function(){if("mail"===p(".wp-mail-smtp-mailer input:checked",a.settingsForm).val()){var t=p(this);return p.alert({backgroundDismiss:!1,escapeKey:!1,animationBounce:1,type:"orange",icon:'">'+wp_mail_smtp.default_mailer_notice.icon_alt+''+wp_mail_smtp.education.upgrade_icon_lock+''+wp_mail_smtp.education.upgrade_bonus+wp_mail_smtp.education.upgrade_doc+""),this.$body.addClass("wp-mail-smtp-upgrade-mailer-education-modal")},buttons:{confirm:{text:wp_mail_smtp.education.upgrade_button,btnClass:"btn-confirm",keys:["enter"],action:function(){var t=/(\?)/.test(wp_mail_smtp.education.upgrade_url)?"&":"?",t=wp_mail_smtp.education.upgrade_url+t+"utm_content="+encodeURIComponent(e.val());l.open(t,"_blank")}}}})}},mailers:{smtp:{bindActions:function(){p("#wp-mail-smtp-setting-smtp-auth").on("change",function(){p("#wp-mail-smtp-setting-row-smtp-user, #wp-mail-smtp-setting-row-smtp-pass").toggleClass("inactive")}),p("#wp-mail-smtp-setting-row-smtp-encryption input").on("change",function(){var t=p(this),e=p("#wp-mail-smtp-setting-smtp-port",a.settingsForm);"tls"===t.val()?(e.val("587"),p("#wp-mail-smtp-setting-row-smtp-autotls").addClass("inactive")):("ssl"===t.val()?e.val("465"):e.val("25"),p("#wp-mail-smtp-setting-row-smtp-autotls").removeClass("inactive"))})}}},triggerExitNotice:function(){var t=p(".wp-mail-smtp-page-general");p(l).on("beforeunload",function(){if(a.pluginSettingsChanged)return wp_mail_smtp.text_settings_not_saved}),p(":input:not( #wp-mail-smtp-setting-license-key, .wp-mail-smtp-not-form-input )",t).on("change",function(){a.pluginSettingsChanged=!0}),p("form",t).on("submit",function(){a.pluginSettingsChanged=!1})},beforeSaveChecks:function(){a.settingsForm.on("submit",function(){if("mail"===p(".wp-mail-smtp-mailer input:checked",a.settingsForm).val()){var t=p(this);return p.alert({backgroundDismiss:!1,escapeKey:!1,animationBounce:1,type:"orange",icon:'">'+wp_mail_smtp.default_mailer_notice.icon_alt+'>>0,s=0;sDe(e)?(r=e+1,a=o-De(e)):(r=e,a=o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(De(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),H("week","w"),H("isoWeek","W"),L("week",5),L("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=k(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),H("day","d"),H("weekday","e"),H("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=k(e)});var je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var $e=ae;var qe=ae;var Je=ae;function Be(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=de(o[t]),u[t]=de(u[t]),l[t]=de(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ke(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),H("hour","h"),L("hour",13),ue("a",Ke),ue("A",Ke),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=k(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=k(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i))});var et,tt=Te("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:He,monthsShort:Re,week:{dow:0,doy:6},weekdays:je,weekdaysMin:ze,weekdaysShort:Ze,meridiemParse:/[ap]\.?m?\.?/i},st={},it={};function rt(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!st[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),ot(t)}catch(e){}return st[e]}function ot(e,t){var n;return e&&((n=l(t)?lt(e):ut(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function ut(e,t){if(null!==t){var n,s=nt;if(t.abbr=e,null!=st[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])s=st[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;s=n._config}return st[e]=new P(b(s,t)),it[e]&&it[e].forEach(function(e){ut(e.name,e.config)}),ot(e),st[e]}return delete st[e],null}function lt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!o(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r=t&&a(i,n,!0)>=t-1)break;t--}r++}return et}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11Pe(n[me],n[_e])?ye:n[ge]<0||24Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ht(e._a[me],s[me]),(e._dayOfYear>De(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[pe]&&0===e._a[ve]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&0<=e&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var ft=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/Z|[+-]\d\d(?::?\d\d)?/,yt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],gt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function vt(e){var t,n,s,i,r,a,o=e._i,u=ft.exec(o)||mt.exec(o);if(u){for(g(e).iso=!0,t=0,n=yt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ln.isLocal=function(){return!!this.isValid()&&!this._isUTC},ln.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ln.isUtc=Vt,ln.isUTC=Vt,ln.zoneAbbr=function(){return this._isUTC?"UTC":""},ln.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ln.dates=n("dates accessor is deprecated. Use date instead.",nn),ln.months=n("months accessor is deprecated. Use month instead",Fe),ln.years=n("years accessor is deprecated. Use year instead",Oe),ln.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),ln.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Yt(e))._a){var t=e._isUTC?y(e._a):Tt(e._a);this._isDSTShifted=this.isValid()&&0>>0,s=0;sAe(e)?(r=e+1,t-Ae(e)):(r=e,t);return{year:r,dayOfYear:n}}function qe(e,t,n){var s,i,r=ze(e.year(),t,n),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+P(i=e.year()-1,t,n):r>P(e.year(),t,n)?(s=r-P(e.year(),t,n),i=e.year()+1):(i=e.year(),s=r),{week:s,year:i}}function P(e,t,n){var s=ze(e,t,n),t=ze(e+1,t,n);return(Ae(e)-s+t)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),t("week","w"),t("isoWeek","W"),n("week",5),n("isoWeek",5),v("w",p),v("ww",p,w),v("W",p),v("WW",p,w),Te(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=g(e)});function Be(e,t){return e.slice(t,7).concat(e.slice(0,t))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),t("day","d"),t("weekday","e"),t("isoWeekday","E"),n("day",11),n("weekday",11),n("isoWeekday",11),v("d",p),v("e",p),v("E",p),v("dd",function(e,t){return t.weekdaysMinRegex(e)}),v("ddd",function(e,t){return t.weekdaysShortRegex(e)}),v("dddd",function(e,t){return t.weekdaysRegex(e)}),Te(["dd","ddd","dddd"],function(e,t,n,s){s=n._locale.weekdaysParse(e,s,n._strict);null!=s?t.d=s:m(n).invalidWeekday=e}),Te(["d","e","E"],function(e,t,n,s){t[s]=g(e)});var Je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Xe="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Ke=k,et=k,tt=k;function nt(){function e(e,t){return t.length-e.length}for(var t,n,s,i=[],r=[],a=[],o=[],u=0;u<7;u++)s=l([2e3,1]).day(u),t=M(this.weekdaysMin(s,"")),n=M(this.weekdaysShort(s,"")),s=M(this.weekdays(s,"")),i.push(t),r.push(n),a.push(s),o.push(t),o.push(n),o.push(s);i.sort(e),r.sort(e),a.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function st(){return this.hours()%12||12}function it(e,t){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function rt(e,t){return t._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,st),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+st.apply(this)+r(this.minutes(),2)}),s("hmmss",0,0,function(){return""+st.apply(this)+r(this.minutes(),2)+r(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+r(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+r(this.minutes(),2)+r(this.seconds(),2)}),it("a",!0),it("A",!1),t("hour","h"),n("hour",13),v("a",rt),v("A",rt),v("H",p),v("h",p),v("k",p),v("HH",p,w),v("hh",p,w),v("kk",p,w),v("hmm",ge),v("hmmss",we),v("Hmm",ge),v("Hmmss",we),D(["H","HH"],x),D(["k","kk"],function(e,t,n){e=g(e);t[x]=24===e?0:e}),D(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),D(["h","hh"],function(e,t,n){t[x]=g(e),m(n).bigHour=!0}),D("hmm",function(e,t,n){var s=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s)),m(n).bigHour=!0}),D("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s,2)),t[N]=g(e.substr(i)),m(n).bigHour=!0}),D("Hmm",function(e,t,n){var s=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s))}),D("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s,2)),t[N]=g(e.substr(i))});k=de("Hours",!0);var at,ot={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ce,monthsShort:Ue,week:{dow:0,doy:6},weekdays:Je,weekdaysMin:Xe,weekdaysShort:Qe,meridiemParse:/[ap]\.?m?\.?/i},R={},ut={};function lt(e){return e&&e.toLowerCase().replace("_","-")}function ht(e){for(var t,n,s,i,r=0;r=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s=t-1)break;t--}r++}return at}function dt(t){var e;if(void 0===R[t]&&"undefined"!=typeof module&&module&&module.exports&&null!=t.match("^[^/\\\\]*$"))try{e=at._abbr,require("./locale/"+t),ct(e)}catch(e){R[t]=null}return R[t]}function ct(e,t){return e&&((t=o(t)?mt(e):ft(e,t))?at=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),at._abbr}function ft(e,t){if(null===t)return delete R[e],null;var n,s=ot;if(t.abbr=e,null!=R[e])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=R[e]._config;else if(null!=t.parentLocale)if(null!=R[t.parentLocale])s=R[t.parentLocale]._config;else{if(null==(n=dt(t.parentLocale)))return ut[t.parentLocale]||(ut[t.parentLocale]=[]),ut[t.parentLocale].push({name:e,config:t}),null;s=n._config}return R[e]=new K(X(s,t)),ut[e]&&ut[e].forEach(function(e){ft(e.name,e.config)}),ct(e),R[e]}function mt(e){var t;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return at;if(!a(e)){if(t=dt(e))return t;e=[e]}return ht(e)}function _t(e){var t=e._a;return t&&-2===m(e).overflow&&(t=t[O]<0||11We(t[Y],t[O])?b:t[x]<0||24P(r,u,l)?m(s)._overflowWeeks=!0:null!=h?m(s)._overflowWeekday=!0:(d=$e(r,a,o,u,l),s._a[Y]=d.year,s._dayOfYear=d.dayOfYear)),null!=e._dayOfYear&&(i=bt(e._a[Y],n[Y]),(e._dayOfYear>Ae(i)||0===e._dayOfYear)&&(m(e)._overflowDayOfYear=!0),h=Ze(i,0,e._dayOfYear),e._a[O]=h.getUTCMonth(),e._a[b]=h.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=c[t]=n[t];for(;t<7;t++)e._a[t]=c[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[x]&&0===e._a[T]&&0===e._a[N]&&0===e._a[Ne]&&(e._nextDay=!0,e._a[x]=0),e._d=(e._useUTC?Ze:je).apply(null,c),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[x]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(m(e).weekdayMismatch=!0)}}function Tt(e){if(e._f===f.ISO_8601)St(e);else if(e._f===f.RFC_2822)Ot(e);else{e._a=[],m(e).empty=!0;for(var t,n,s,i,r,a=""+e._i,o=a.length,u=0,l=ae(e._f,e._locale).match(te)||[],h=l.length,d=0;de.valueOf():e.valueOf()"}),i.toJSON=function(){return this.isValid()?this.toISOString():null},i.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},i.unix=function(){return Math.floor(this.valueOf()/1e3)},i.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},i.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},i.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},i.isLocal=function(){return!!this.isValid()&&!this._isUTC},i.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},i.isUtc=At,i.isUTC=At,i.zoneAbbr=function(){return this._isUTC?"UTC":""},i.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},i.dates=e("dates accessor is deprecated. Use date instead.",ke),i.months=e("months accessor is deprecated. Use month instead",Ge),i.years=e("years accessor is deprecated. Use year instead",Ie),i.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,t),this):-this.utcOffset()}),i.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var e,t={};return $(t,this),(t=Nt(t))._a?(e=(t._isUTC?l:W)(t._a),this._isDSTShifted=this.isValid()&&0 constant in your wp-config.php file.', 'wp-mail-smtp' ), // Reference: src/modules/settings/components/input/SettingsInputText.vue:36 @@ -337,10 +346,10 @@ // Reference: src/modules/setup-wizard/components/steps/WizardStepConfigurationFailure.vue:13 __( 'Start Troubleshooting', 'wp-mail-smtp' ), - // Reference: src/modules/setup-wizard/components/steps/WizardStepConfigurationSuccess.vue:23 + // Reference: src/modules/setup-wizard/components/steps/WizardStepConfigurationFailure.vue:14 __( 'Send us Feedback', 'wp-mail-smtp' ), - // Reference: src/modules/setup-wizard/components/steps/WizardStepConfigurationSuccess.vue:24 + // Reference: src/modules/setup-wizard/components/steps/WizardStepConfigurationFailure.vue:15 __( 'Finish Setup', 'wp-mail-smtp' ), // Reference: src/modules/setup-wizard/components/steps/WizardStepImport.vue:12 @@ -441,16 +450,16 @@ // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Zoho.vue:17 __( 'The data center location used by your Zoho account.', 'wp-mail-smtp' ), - // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Zoho.vue:18 + // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Gmail.vue:15 __( 'Client ID', 'wp-mail-smtp' ), - // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Zoho.vue:19 + // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Gmail.vue:16 __( 'Client Secret', 'wp-mail-smtp' ), - // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Zoho.vue:20 + // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Outlook.vue:17 __( 'Redirect URI', 'wp-mail-smtp' ), - // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Zoho.vue:21 + // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Outlook.vue:18 __( 'Authorization', 'wp-mail-smtp' ), // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Zoho.vue:26 @@ -483,7 +492,7 @@ // Reference: src/modules/setup-wizard/components/steps/configure-mailer/SmtpCom.vue:28 __( 'Read how to set up SMTP.com', 'wp-mail-smtp' ), - // Reference: src/modules/setup-wizard/components/steps/configure-mailer/Sendinblue.vue:29 + // Reference: src/modules/setup-wizard/components/steps/configure-mailer/SmtpCom.vue:29 __( 'Transparency and Disclosure', 'wp-mail-smtp' ), // Reference: src/modules/setup-wizard/components/steps/configure-mailer/SmtpCom.vue:31 diff --git a/assets/languages/wp-mail-smtp.pot b/assets/languages/wp-mail-smtp.pot index f532bec..2982dc1 100644 --- a/assets/languages/wp-mail-smtp.pot +++ b/assets/languages/wp-mail-smtp.pot @@ -1,15 +1,15 @@ msgid "" msgstr "" -"Project-Id-Version: WP Mail SMTP 3.7.0\n" +"Project-Id-Version: WP Mail SMTP 3.8.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-mail-smtp\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2022-12-12T08:02:00+00:00\n" +"POT-Creation-Date: 2023-04-25T08:58:52+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.6.0\n" "X-Domain: wp-mail-smtp\n" #. Plugin Name of the plugin @@ -17,6 +17,7 @@ msgid "WP Mail SMTP Pro" msgstr "" #. Plugin URI of the plugin +#. Author URI of the plugin msgid "https://wpmailsmtp.com/" msgstr "" @@ -25,13 +26,14 @@ msgid "Reconfigures the wp_mail() function to use Gmail/Mailgun/Sen msgstr "" #. Author of the plugin -#: src/Admin/Pages/AboutTab.php:278 -#: src/Admin/Pages/SmartRoutingTab.php:289 -msgid "WPForms" -msgstr "" - -#. Author URI of the plugin -msgid "https://wpforms.com/" +#: src/Admin/Area.php:255 +#: src/Admin/Area.php:256 +#: src/Admin/Area.php:313 +#: src/Admin/Area.php:314 +#: src/Admin/DashboardWidget.php:168 +#: src/Admin/DashboardWidget.php:444 +#: src/SiteHealth.php:43 +msgid "WP Mail SMTP" msgstr "" #: assets/languages/wp-mail-smtp-vue.php:5 @@ -346,68 +348,68 @@ msgstr "" msgid "Define which endpoint you want to use for sending messages. If you are operating under EU laws, you may be required to use EU region. %1$sMore information%2$s on Mailgun.com." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:239 +#: assets/languages/wp-mail-smtp-vue.php:240 #: src/Admin/ConnectionSettings.php:147 #: src/Admin/Pages/ExportTab.php:121 msgid "From Name" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:242 +#: assets/languages/wp-mail-smtp-vue.php:244 #: src/Admin/ConnectionSettings.php:175 msgid "Force From Name" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:245 +#: assets/languages/wp-mail-smtp-vue.php:248 #: src/Admin/ConnectionSettings.php:69 -#: src/Admin/Pages/SmartRoutingTab.php:191 -#: src/Admin/Pages/SmartRoutingTab.php:221 +#: src/Admin/Pages/SmartRoutingTab.php:189 +#: src/Admin/Pages/SmartRoutingTab.php:219 msgid "From Email" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:248 +#: assets/languages/wp-mail-smtp-vue.php:252 #: src/Admin/ConnectionSettings.php:128 msgid "Force From Email" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:251 +#: assets/languages/wp-mail-smtp-vue.php:256 msgid "If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:254 +#: assets/languages/wp-mail-smtp-vue.php:260 msgid "If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:257 +#: assets/languages/wp-mail-smtp-vue.php:264 #: src/Admin/ConnectionSettings.php:160 msgid "The name that emails are sent from." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:260 +#: assets/languages/wp-mail-smtp-vue.php:268 #: src/Admin/ConnectionSettings.php:107 msgid "The email address that emails are sent from." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:263 +#: assets/languages/wp-mail-smtp-vue.php:271 msgid "Read how to set up Mailgun" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:266 +#: assets/languages/wp-mail-smtp-vue.php:274 #: src/Providers/Mailgun/Options.php:126 #: src/Providers/SparkPost/Options.php:132 msgid "US" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:269 +#: assets/languages/wp-mail-smtp-vue.php:277 #: src/Providers/Mailgun/Options.php:135 #: src/Providers/SparkPost/Options.php:141 msgid "EU" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:272 +#: assets/languages/wp-mail-smtp-vue.php:280 msgid "Close and exit the Setup Wizard" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:275 +#: assets/languages/wp-mail-smtp-vue.php:284 #: src/Providers/PepipostAPI/Options.php:96 #: src/Providers/Sendgrid/Options.php:67 #: src/Providers/Sendinblue/Options.php:111 @@ -417,851 +419,851 @@ msgstr "" msgid "API Key" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:278 +#: assets/languages/wp-mail-smtp-vue.php:287 #: src/Providers/Sendgrid/Options.php:107 #: src/Providers/Sendinblue/Options.php:143 msgid "Sending Domain" msgstr "" #. Translators: Link to the Sendgrid API settings. -#: assets/languages/wp-mail-smtp-vue.php:282 +#: assets/languages/wp-mail-smtp-vue.php:291 msgid "%1$sFollow this link%2$s to get an API Key for Sendgrid." msgstr "" #. Translators: italic styling. -#: assets/languages/wp-mail-smtp-vue.php:286 +#: assets/languages/wp-mail-smtp-vue.php:295 msgid "To send emails you will need only a %1$sMail Send%2$s access level for this API key." msgstr "" #. Translators: Link to the Sendgrid doc page on wpmailsmtp.com. -#: assets/languages/wp-mail-smtp-vue.php:290 +#: assets/languages/wp-mail-smtp-vue.php:299 msgid "Please input the sending domain/subdomain you configured in your SendGrid dashboard. More information can be found in our %1$sSendGrid documentation%2$s" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:293 +#: assets/languages/wp-mail-smtp-vue.php:302 msgid "Read how to set up Sendgrid" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:296 +#: assets/languages/wp-mail-smtp-vue.php:305 #: src/Admin/SetupWizard.php:471 msgid "WP Mail SMTP logo" msgstr "" #. Translators: %1$s - the number of current step, %2$s - number of all steps. -#: assets/languages/wp-mail-smtp-vue.php:300 +#: assets/languages/wp-mail-smtp-vue.php:309 msgid "Step %1$s of %2$s" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:303 +#: assets/languages/wp-mail-smtp-vue.php:312 msgid "Configure Mailer Settings" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:306 +#: assets/languages/wp-mail-smtp-vue.php:315 msgid "Below, we'll show you all of the settings required to set up this mailer." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:311 +#: assets/languages/wp-mail-smtp-vue.php:320 msgid "This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the constant in your wp-config.php file." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:314 +#: assets/languages/wp-mail-smtp-vue.php:323 msgid "Copy input value" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:317 +#: assets/languages/wp-mail-smtp-vue.php:326 msgid "Copied!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:320 +#: assets/languages/wp-mail-smtp-vue.php:329 msgid "The value entered does not match the required format" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:323 +#: assets/languages/wp-mail-smtp-vue.php:332 msgid "Checking Mailer Configuration" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:326 +#: assets/languages/wp-mail-smtp-vue.php:335 msgid "We're running some tests in the background to make sure everything is set up properly." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:329 +#: assets/languages/wp-mail-smtp-vue.php:338 msgid "Checking mailer configuration image" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:332 +#: assets/languages/wp-mail-smtp-vue.php:341 msgid "Whoops, looks like things aren’t configured properly." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:335 +#: assets/languages/wp-mail-smtp-vue.php:344 msgid "We just tried to send a test email, but something prevented that from working. To see more details about the issue we detected, as well as our suggestions to fix it, please start troubleshooting." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:338 +#: assets/languages/wp-mail-smtp-vue.php:347 msgid "Start Troubleshooting" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:341 +#: assets/languages/wp-mail-smtp-vue.php:350 msgid "Send us Feedback" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:344 +#: assets/languages/wp-mail-smtp-vue.php:353 msgid "Finish Setup" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:347 +#: assets/languages/wp-mail-smtp-vue.php:356 msgid "Import data from your current plugins" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:350 +#: assets/languages/wp-mail-smtp-vue.php:359 msgid "We have detected other SMTP plugins installed on your website. Select which plugin's data you would like to import to WP Mail SMTP." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:353 +#: assets/languages/wp-mail-smtp-vue.php:362 msgid "Import Data and Continue" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:356 +#: assets/languages/wp-mail-smtp-vue.php:365 msgid "Skip this Step" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:359 +#: assets/languages/wp-mail-smtp-vue.php:368 msgid "Easy WP SMTP" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:362 +#: assets/languages/wp-mail-smtp-vue.php:371 msgid "FluentSMTP" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:365 +#: assets/languages/wp-mail-smtp-vue.php:374 msgid "Post SMTP Mailer" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:368 +#: assets/languages/wp-mail-smtp-vue.php:377 msgid "SMTP Mailer" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:371 +#: assets/languages/wp-mail-smtp-vue.php:380 msgid "WP SMTP" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:374 +#: assets/languages/wp-mail-smtp-vue.php:383 msgid "Help Improve WP Mail SMTP + Smart Recommendations" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:377 +#: assets/languages/wp-mail-smtp-vue.php:386 msgid "Get helpful suggestions from WP Mail SMTP on how to optimize your email deliverability and grow your business." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:380 +#: assets/languages/wp-mail-smtp-vue.php:389 msgid "Your Email Address" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:383 +#: assets/languages/wp-mail-smtp-vue.php:392 msgid "Your email is needed, so you can receive recommendations." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:386 +#: assets/languages/wp-mail-smtp-vue.php:395 msgid "Help make WP Mail SMTP better for everyone" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:389 +#: assets/languages/wp-mail-smtp-vue.php:398 msgid "Yes, count me in" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:392 +#: assets/languages/wp-mail-smtp-vue.php:401 #: src/Admin/Pages/MiscTab.php:240 msgid "By allowing us to track usage data we can better help you because we know with which WordPress configurations, themes and plugins we should test." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:395 +#: assets/languages/wp-mail-smtp-vue.php:404 #: src/Providers/Postmark/Options.php:89 msgid "Server API Token" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:398 +#: assets/languages/wp-mail-smtp-vue.php:407 #: src/Providers/Postmark/Options.php:118 msgid "Message Stream ID" msgstr "" #. Translators: Link to the Postmark API settings. -#: assets/languages/wp-mail-smtp-vue.php:402 +#: assets/languages/wp-mail-smtp-vue.php:411 msgid "%1$sFollow this link%2$s to get a Server API Token for Postmark." msgstr "" #. Translators: Link to the Postmark Message Stream ID settings. -#: assets/languages/wp-mail-smtp-vue.php:406 +#: assets/languages/wp-mail-smtp-vue.php:415 msgid "Message Stream ID is optional. By default outbound (Default Transactional Stream) will be used. More information can be found in our %1$sPostmark documentation%2$s." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:409 +#: assets/languages/wp-mail-smtp-vue.php:418 msgid "Read how to set up Postmark" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:412 +#: assets/languages/wp-mail-smtp-vue.php:421 msgid "Configure Email Logs" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:415 +#: assets/languages/wp-mail-smtp-vue.php:424 msgid "Enable these powerful logging features for more control of your WordPress emails." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:418 +#: assets/languages/wp-mail-smtp-vue.php:427 msgid "Store the content for all sent emails" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:421 +#: assets/languages/wp-mail-smtp-vue.php:430 msgid "This option must be enabled if you'd like to be able to resend emails. Please be aware that all email content will be stored in your WordPress database. This may include sensitive data, passwords, and personal details." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:424 +#: assets/languages/wp-mail-smtp-vue.php:433 msgid "Save file attachments sent from WordPress" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:427 +#: assets/languages/wp-mail-smtp-vue.php:436 msgid "All file attachments sent from your site will be saved to the WordPress Uploads folder. Please note that this may reduce available disk space on your server." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:430 +#: assets/languages/wp-mail-smtp-vue.php:439 msgid "Track when an email is opened" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:433 +#: assets/languages/wp-mail-smtp-vue.php:442 msgid "See which emails were opened by the recipients. Email open tracking works with emails that are sent in HTML format." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:436 +#: assets/languages/wp-mail-smtp-vue.php:445 msgid "Track when a link in an email is clicked" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:439 +#: assets/languages/wp-mail-smtp-vue.php:448 msgid "See which links were clicked in emails sent from your WordPress site. Click tracking works with emails that are sent in HTML format." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:442 +#: assets/languages/wp-mail-smtp-vue.php:451 msgid "The data center location used by your Zoho account." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:445 +#: assets/languages/wp-mail-smtp-vue.php:454 #: src/Providers/Gmail/Options.php:91 msgid "Client ID" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:448 +#: assets/languages/wp-mail-smtp-vue.php:457 #: src/Providers/Gmail/Options.php:106 msgid "Client Secret" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:451 +#: assets/languages/wp-mail-smtp-vue.php:460 msgid "Redirect URI" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:454 +#: assets/languages/wp-mail-smtp-vue.php:463 #: src/Providers/Gmail/Options.php:150 msgid "Authorization" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:457 +#: assets/languages/wp-mail-smtp-vue.php:466 msgid "Read how to set up Zoho Mail" msgstr "" #. Translators: Link to the SendLayer API settings. -#: assets/languages/wp-mail-smtp-vue.php:461 +#: assets/languages/wp-mail-smtp-vue.php:470 msgid "%1$sFollow this link%2$s to get an API Key for SendLayer." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:464 +#: assets/languages/wp-mail-smtp-vue.php:473 #: src/Providers/Sendlayer/Options.php:64 msgid "Get Started with SendLayer" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:467 +#: assets/languages/wp-mail-smtp-vue.php:476 msgid "Read how to set up SendLayer" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:470 +#: assets/languages/wp-mail-smtp-vue.php:479 #: src/Providers/SMTPcom/Options.php:137 msgid "Sender Name" msgstr "" #. Translators: Link to the SMTP.com API settings. -#: assets/languages/wp-mail-smtp-vue.php:474 +#: assets/languages/wp-mail-smtp-vue.php:483 msgid "%1$sFollow this link%2$s to get an API Key for SMTP.com." msgstr "" #. Translators: Link to the SMTP.com Senders/Channel settings. -#: assets/languages/wp-mail-smtp-vue.php:478 +#: assets/languages/wp-mail-smtp-vue.php:487 msgid "%1$sFollow this link%2$s to get a Sender Name for SMTP.com." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:481 +#: assets/languages/wp-mail-smtp-vue.php:490 #: src/Providers/SMTPcom/Options.php:68 msgid "Get Started with SMTP.com" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:484 +#: assets/languages/wp-mail-smtp-vue.php:493 msgid "Read how to set up SMTP.com" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:487 +#: assets/languages/wp-mail-smtp-vue.php:496 #: src/Providers/Sendinblue/Options.php:67 #: src/Providers/SMTPcom/Options.php:73 msgid "Transparency and Disclosure" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:490 +#: assets/languages/wp-mail-smtp-vue.php:499 #: src/Providers/SMTPcom/Options.php:75 msgid "We believe in full transparency. The SMTP.com links above are tracking links as part of our partnership with SMTP (j2 Global). We can recommend just about any SMTP service, but we only recommend products that we believe will add value to our users." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:493 +#: assets/languages/wp-mail-smtp-vue.php:502 msgid "How was your WP Mail SMTP setup experience?" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:496 +#: assets/languages/wp-mail-smtp-vue.php:505 msgid "Our goal is to make your SMTP setup as simple and straightforward as possible. We'd love to know how this process went for you!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:499 +#: assets/languages/wp-mail-smtp-vue.php:508 msgid "Congrats, you’ve successfully set up WP Mail SMTP!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:502 +#: assets/languages/wp-mail-smtp-vue.php:511 msgid "Here’s what to do next:" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:505 +#: assets/languages/wp-mail-smtp-vue.php:514 msgid "Check out our other free WordPress plugins:" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:508 +#: assets/languages/wp-mail-smtp-vue.php:517 msgid "Upgrade to Unlock Powerful SMTP Features" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:511 +#: assets/languages/wp-mail-smtp-vue.php:520 msgid "Upgrade to WP Mail SMTP Pro to unlock more awesome features and experience why WP Mail SMTP is used by over 3,000,000 websites." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:514 +#: assets/languages/wp-mail-smtp-vue.php:523 msgid "Upgrade to Pro Today" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:517 +#: assets/languages/wp-mail-smtp-vue.php:526 #: src/Admin/Pages/TestTab.php:249 #: src/SiteHealth.php:352 msgid "Send a Test Email" msgstr "" #. Translators: Different bold styles and discount value (%5$s). -#: assets/languages/wp-mail-smtp-vue.php:521 +#: assets/languages/wp-mail-smtp-vue.php:530 msgid "%1$sBonus:%2$s You can upgrade to the Pro plan and %3$ssave %5$s today%4$s, automatically applied at checkout." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:524 +#: assets/languages/wp-mail-smtp-vue.php:533 msgid "Star icon" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:527 +#: assets/languages/wp-mail-smtp-vue.php:536 msgid "Thanks for the feedback!" msgstr "" #. Translators: %1$s and %2$s are HTML bold tags; %3$s is a new line HTML tag; %4$s are 5 golden star icons in HTML. -#: assets/languages/wp-mail-smtp-vue.php:531 +#: assets/languages/wp-mail-smtp-vue.php:540 msgid "Help us spread the word %1$sby giving WP Mail SMTP a 5-star rating %3$s(%4$s) on WordPress.org%2$s. Thanks for your support and we look forward to bringing you more awesome features." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:534 +#: assets/languages/wp-mail-smtp-vue.php:543 msgid "Rate on WordPress.org" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:537 +#: assets/languages/wp-mail-smtp-vue.php:546 msgid "What could we do to improve?" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:540 +#: assets/languages/wp-mail-smtp-vue.php:549 msgid "We're sorry things didn't go smoothly for you, and want to keep improving. Please let us know any specific parts of this process that you think could be better. We really appreciate any details you're willing to share!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:543 +#: assets/languages/wp-mail-smtp-vue.php:552 msgid "Yes, I give WP Mail SMTP permission to contact me for any follow up questions." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:546 +#: assets/languages/wp-mail-smtp-vue.php:555 msgid "Submit Feedback" msgstr "" #. Translators: Link to the Sendinblue API settings. -#: assets/languages/wp-mail-smtp-vue.php:550 +#: assets/languages/wp-mail-smtp-vue.php:559 msgid "%1$sFollow this link%2$s to get an API Key for Sendinblue." msgstr "" #. Translators: Link to the Sendinblue doc page on wpmailsmtp.com. -#: assets/languages/wp-mail-smtp-vue.php:554 +#: assets/languages/wp-mail-smtp-vue.php:563 msgid "Please input the sending domain/subdomain you configured in your Sendinblue dashboard. More information can be found in our %1$sSendinblue documentation%2$s" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:557 +#: assets/languages/wp-mail-smtp-vue.php:566 msgid "Get Started with Sendinblue" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:560 +#: assets/languages/wp-mail-smtp-vue.php:569 msgid "Read how to set up Sendinblue" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:563 +#: assets/languages/wp-mail-smtp-vue.php:572 #: src/Providers/Sendinblue/Options.php:69 msgid "We believe in full transparency. The Sendinblue links above are tracking links as part of our partnership with Sendinblue. We can recommend just about any SMTP service, but we only recommend products that we believe will add value to our users." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:566 +#: assets/languages/wp-mail-smtp-vue.php:575 #: src/Providers/OptionsAbstract.php:226 msgid "SMTP Host" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:569 +#: assets/languages/wp-mail-smtp-vue.php:578 #: src/Providers/OptionsAbstract.php:240 msgid "Encryption" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:572 +#: assets/languages/wp-mail-smtp-vue.php:581 #: src/Providers/OptionsAbstract.php:280 msgid "SMTP Port" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:575 +#: assets/languages/wp-mail-smtp-vue.php:584 #: src/Providers/OptionsAbstract.php:294 msgid "Auto TLS" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:578 +#: assets/languages/wp-mail-smtp-vue.php:587 msgid "Enable Auto TLS" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:581 +#: assets/languages/wp-mail-smtp-vue.php:590 #: src/Providers/OptionsAbstract.php:308 msgid "By default, TLS encryption is automatically used if the server supports it (recommended). In some cases, due to server misconfigurations, this can cause issues and may need to be disabled." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:584 +#: assets/languages/wp-mail-smtp-vue.php:593 #: src/Providers/OptionsAbstract.php:316 msgid "Authentication" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:587 -#: src/Admin/Pages/TestTab.php:830 +#: assets/languages/wp-mail-smtp-vue.php:596 +#: src/Admin/Pages/TestTab.php:834 msgid "Enable Authentication" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:590 +#: assets/languages/wp-mail-smtp-vue.php:599 #: src/Providers/OptionsAbstract.php:335 msgid "SMTP Username" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:593 +#: assets/languages/wp-mail-smtp-vue.php:602 #: src/Providers/OptionsAbstract.php:349 msgid "SMTP Password" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:596 +#: assets/languages/wp-mail-smtp-vue.php:605 #: src/Providers/OptionsAbstract.php:272 msgid "For most servers TLS is the recommended option. If your SMTP provider offers both SSL and TLS options, we recommend using TLS." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:599 +#: assets/languages/wp-mail-smtp-vue.php:608 #: src/Admin/Pages/SettingsTab.php:371 #: src/Providers/OptionsAbstract.php:250 msgid "None" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:602 +#: assets/languages/wp-mail-smtp-vue.php:611 #: src/Providers/OptionsAbstract.php:259 msgid "SSL" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:605 +#: assets/languages/wp-mail-smtp-vue.php:614 #: src/Providers/OptionsAbstract.php:268 msgid "TLS" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:608 +#: assets/languages/wp-mail-smtp-vue.php:617 msgid "Access Key ID" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:611 +#: assets/languages/wp-mail-smtp-vue.php:620 msgid "Secret Access Key" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:614 +#: assets/languages/wp-mail-smtp-vue.php:623 msgid "SES Identities" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:617 +#: assets/languages/wp-mail-smtp-vue.php:626 msgid "Please select the Amazon SES API region which is the closest to where your website is hosted. This can help to decrease network latency between your site and Amazon SES, which will speed up email sending." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:620 +#: assets/languages/wp-mail-smtp-vue.php:629 msgid "Read how to set up Amazon SES" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:623 +#: assets/languages/wp-mail-smtp-vue.php:632 msgid "Amazon SES requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out " msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:626 +#: assets/languages/wp-mail-smtp-vue.php:635 msgid "WPBeginner's tutorial on how to set up SSL" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:629 +#: assets/languages/wp-mail-smtp-vue.php:638 msgid "If you'd prefer not to set up SSL, or need an SMTP solution in the meantime, please go back and select a different mailer option." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:632 +#: assets/languages/wp-mail-smtp-vue.php:641 msgid "Choose Your SMTP Mailer" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:635 +#: assets/languages/wp-mail-smtp-vue.php:644 #: src/Admin/ConnectionSettings.php:217 #: src/Admin/Pages/ExportTab.php:135 msgid "Mailer" msgstr "" #. Translators: Link to the SMTP Mailer docs page. -#: assets/languages/wp-mail-smtp-vue.php:639 +#: assets/languages/wp-mail-smtp-vue.php:648 msgid "Which mailer would you like to use to send emails? Not sure which mailer to choose? Check out our %1$scomplete mailer guide%2$s for details on each option." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:642 +#: assets/languages/wp-mail-smtp-vue.php:651 msgid "I Understand, Continue" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:645 +#: assets/languages/wp-mail-smtp-vue.php:654 msgid "Choose a Different Mailer" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:648 +#: assets/languages/wp-mail-smtp-vue.php:657 msgid "Recommended Mailers" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:651 +#: assets/languages/wp-mail-smtp-vue.php:660 msgid "Your mailer is already configured in a WP Mail SMTP constant, so the options below have been disabled. To change your mailer, please edit or remove the WPMS_MAILER constant in your wp-config.php file." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:654 +#: assets/languages/wp-mail-smtp-vue.php:663 msgid "is a PRO Feature" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:657 +#: assets/languages/wp-mail-smtp-vue.php:666 msgid "Microsoft 365 / Outlook" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:660 +#: assets/languages/wp-mail-smtp-vue.php:669 msgid "Successful Upgrade!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:663 +#: assets/languages/wp-mail-smtp-vue.php:672 msgid "Upgrade Failed!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:666 +#: assets/languages/wp-mail-smtp-vue.php:675 msgid "Enter your WP Mail SMTP License Key" msgstr "" #. Translators: %1$s and %2$s are bold tags. -#: assets/languages/wp-mail-smtp-vue.php:670 +#: assets/languages/wp-mail-smtp-vue.php:679 msgid "You're currently using %1$sWP Mail SMTP Lite%2$s - no license needed. Enjoy!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:673 +#: assets/languages/wp-mail-smtp-vue.php:682 msgid "Continue" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:676 +#: assets/languages/wp-mail-smtp-vue.php:685 msgid "Would you like to purchase the following features now?" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:679 +#: assets/languages/wp-mail-smtp-vue.php:688 msgid "These features are available as part of WP Mail SMTP Pro plan." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:682 +#: assets/languages/wp-mail-smtp-vue.php:691 msgid "Purchase Now" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:685 +#: assets/languages/wp-mail-smtp-vue.php:694 msgid "I'll do it later" msgstr "" #. Translators: Link to the WPMailSMTP.com pricing page. -#: assets/languages/wp-mail-smtp-vue.php:689 +#: assets/languages/wp-mail-smtp-vue.php:698 msgid "To unlock selected features, %1$sUpgrade to Pro%2$s and enter your license key below." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:692 +#: assets/languages/wp-mail-smtp-vue.php:701 msgid "Enhanced Weekly Email Summary" msgstr "" #. Translators: bold HTML tags. -#: assets/languages/wp-mail-smtp-vue.php:696 +#: assets/languages/wp-mail-smtp-vue.php:705 msgid "Already purchased? Enter your license key below to connect with %1$sWP Mail SMTP Pro%2$s!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:699 +#: assets/languages/wp-mail-smtp-vue.php:708 msgid "Enter your license key below to unlock plugin updates!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:702 +#: assets/languages/wp-mail-smtp-vue.php:711 msgid "Verify License Key" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:705 +#: assets/languages/wp-mail-smtp-vue.php:714 #: src/Admin/Pages/SettingsTab.php:188 msgid "Connect" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:708 +#: assets/languages/wp-mail-smtp-vue.php:717 msgid "The License Key format is incorrect. Please enter a valid key and try again." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:711 +#: assets/languages/wp-mail-smtp-vue.php:720 msgid "Your license was successfully verified! You are ready for the next step." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:714 +#: assets/languages/wp-mail-smtp-vue.php:723 msgid "Pro badge" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:717 +#: assets/languages/wp-mail-smtp-vue.php:726 msgid "License key input" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:720 +#: assets/languages/wp-mail-smtp-vue.php:729 msgid "Paste your license key here" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:723 +#: assets/languages/wp-mail-smtp-vue.php:732 msgid "Successful Verification!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:726 +#: assets/languages/wp-mail-smtp-vue.php:735 msgid "Verification Error!" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:729 +#: assets/languages/wp-mail-smtp-vue.php:738 msgid "Authorized Redirect URI" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:732 +#: assets/languages/wp-mail-smtp-vue.php:741 msgid "Select which email address you would like to send your emails from." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:735 +#: assets/languages/wp-mail-smtp-vue.php:744 msgid "Read how to set up the Gmail mailer" msgstr "" #. Translators: Link to the SparkPost documentation. -#: assets/languages/wp-mail-smtp-vue.php:739 +#: assets/languages/wp-mail-smtp-vue.php:748 msgid "Select your SparkPost account region. %1$sMore information%2$s on SparkPost." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:742 +#: assets/languages/wp-mail-smtp-vue.php:751 msgid "Read how to set up SparkPost" msgstr "" #. Translators: Link to the SparkPost Account API section. -#: assets/languages/wp-mail-smtp-vue.php:746 +#: assets/languages/wp-mail-smtp-vue.php:755 msgid "%1$sFollow this link%2$s to get an API Key for SparkPost." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:749 +#: assets/languages/wp-mail-smtp-vue.php:758 msgid "Application ID" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:752 +#: assets/languages/wp-mail-smtp-vue.php:761 msgid "Application Password" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:755 +#: assets/languages/wp-mail-smtp-vue.php:764 msgid "Read how to set up Microsoft Outlook / 365" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:758 +#: assets/languages/wp-mail-smtp-vue.php:767 msgid "Outlook / 365 requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out " msgstr "" #. Translators: Minimum and maximum number that can be used. -#: assets/languages/wp-mail-smtp-vue.php:762 +#: assets/languages/wp-mail-smtp-vue.php:771 msgid "Please enter a value between %1$s and %2$s" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:765 +#: assets/languages/wp-mail-smtp-vue.php:774 msgid "Value has to be a round number" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:768 +#: assets/languages/wp-mail-smtp-vue.php:777 #: src/Admin/Area.php:163 msgid "There was an error while processing the authentication request. Please try again." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:771 +#: assets/languages/wp-mail-smtp-vue.php:780 msgid "There was an error while processing the authentication request. Please recheck your Client ID and Client Secret and try again." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:774 +#: assets/languages/wp-mail-smtp-vue.php:783 #: src/Admin/Area.php:149 msgid "There was an error while processing the authentication request. The nonce is invalid. Please try again." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:777 +#: assets/languages/wp-mail-smtp-vue.php:786 msgid "There was an error while processing the authentication request. The authorization code is missing. Please try again." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:780 +#: assets/languages/wp-mail-smtp-vue.php:789 msgid "There was an error while processing the authentication request. Please recheck your Region, Client ID and Client Secret and try again." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:783 +#: assets/languages/wp-mail-smtp-vue.php:792 #: src/Admin/Area.php:179 msgid "You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:786 +#: assets/languages/wp-mail-smtp-vue.php:795 msgid "You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:789 +#: assets/languages/wp-mail-smtp-vue.php:798 msgid "You have successfully linked the current site with your Zoho Mail API project. Now you can start sending emails through Zoho Mail." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:792 +#: assets/languages/wp-mail-smtp-vue.php:801 msgid "Successful Authorization" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:795 +#: assets/languages/wp-mail-smtp-vue.php:804 msgid "Authorization Error!" msgstr "" #. Translators: name of the oAuth provider (Google, Microsoft, ...). -#: assets/languages/wp-mail-smtp-vue.php:799 +#: assets/languages/wp-mail-smtp-vue.php:808 msgid "Connect to %s" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:802 +#: assets/languages/wp-mail-smtp-vue.php:811 msgid "Before continuing, you'll need to allow this plugin to send emails using your %s account." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:805 +#: assets/languages/wp-mail-smtp-vue.php:814 #: src/Providers/Gmail/Options.php:187 msgid "Remove OAuth Connection" msgstr "" #. Translators: link to the Google documentation page. -#: assets/languages/wp-mail-smtp-vue.php:809 +#: assets/languages/wp-mail-smtp-vue.php:818 msgid "If you want to use a different From Email address you can setup a Google email alias. %1$sFollow these instructions%2$s, then select the alias in the From Email section below." msgstr "" #. Translators: name of the oAuth provider (Google, Microsoft, ...). -#: assets/languages/wp-mail-smtp-vue.php:813 +#: assets/languages/wp-mail-smtp-vue.php:822 msgid "Removing this OAuth connection will give you the ability to redo the OAuth connection or connect to different %s account." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:816 +#: assets/languages/wp-mail-smtp-vue.php:825 msgid "Connected as" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:819 +#: assets/languages/wp-mail-smtp-vue.php:828 #: src/Admin/Area.php:142 msgid "There was an error while processing the authentication request. The state key is invalid. Please try again." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:822 +#: assets/languages/wp-mail-smtp-vue.php:831 msgid "Please enter a domain" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:825 +#: assets/languages/wp-mail-smtp-vue.php:834 msgid "Please enter a valid email address" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:828 +#: assets/languages/wp-mail-smtp-vue.php:837 msgid "Enter the domain name to verify it on Amazon SES and generate the required DNS CNAME records." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:831 +#: assets/languages/wp-mail-smtp-vue.php:840 msgid "Enter a valid email address. A verification email will be sent to the email address you entered." msgstr "" #. Translators: Email address. -#: assets/languages/wp-mail-smtp-vue.php:835 +#: assets/languages/wp-mail-smtp-vue.php:844 msgid "Please check the inbox of %s for a confirmation email." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:838 +#: assets/languages/wp-mail-smtp-vue.php:847 msgid "Verify Email" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:841 +#: assets/languages/wp-mail-smtp-vue.php:850 msgid "No registered domains or emails." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:844 +#: assets/languages/wp-mail-smtp-vue.php:853 msgid "You will not be able to send emails until you verify at least one domain or email address for the selected Amazon SES Region." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:847 +#: assets/languages/wp-mail-smtp-vue.php:856 msgid "View DNS" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:850 +#: assets/languages/wp-mail-smtp-vue.php:859 msgid "Resend" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:853 +#: assets/languages/wp-mail-smtp-vue.php:862 msgid "Here are the domains and email addresses that have been verified and can be used as the From Email." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:856 +#: assets/languages/wp-mail-smtp-vue.php:865 msgid "Verify SES Identity" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:859 +#: assets/languages/wp-mail-smtp-vue.php:868 msgid "Add New SES Identity" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:862 +#: assets/languages/wp-mail-smtp-vue.php:871 msgid "Name" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:865 +#: assets/languages/wp-mail-smtp-vue.php:874 msgid "Value" msgstr "" #. Translators: Link to Amazon SES documentation. -#: assets/languages/wp-mail-smtp-vue.php:869 +#: assets/languages/wp-mail-smtp-vue.php:878 msgid "Please add these CNAME records to your domain's DNS settings. For information on how to add CNAME DNS records, please refer to the %1$sAmazon SES documentation%2$s." msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:872 +#: assets/languages/wp-mail-smtp-vue.php:881 msgid "Verify Domain" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:875 +#: assets/languages/wp-mail-smtp-vue.php:884 msgid "Verify Email Address" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:878 +#: assets/languages/wp-mail-smtp-vue.php:887 msgid "Install" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:881 +#: assets/languages/wp-mail-smtp-vue.php:890 msgid "Installed" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:884 -#: src/Admin/Area.php:585 +#: assets/languages/wp-mail-smtp-vue.php:893 +#: src/Admin/Area.php:586 #: src/Admin/Pages/AboutTab.php:224 msgid "Activated" msgstr "" -#: assets/languages/wp-mail-smtp-vue.php:887 -#: src/Core.php:1114 +#: assets/languages/wp-mail-smtp-vue.php:896 +#: src/Core.php:1069 msgid "Loading" msgstr "" @@ -1279,19 +1281,9 @@ msgstr "" msgid "Thanks for using WP Mail SMTP! To complete the plugin setup and start sending emails, please select and configure your Mailer." msgstr "" -#: src/Admin/Area.php:255 -#: src/Admin/Area.php:256 -#: src/Admin/Area.php:313 -#: src/Admin/Area.php:314 -#: src/Admin/DashboardWidget.php:168 -#: src/Admin/DashboardWidget.php:444 -#: src/SiteHealth.php:43 -msgid "WP Mail SMTP" -msgstr "" - #: src/Admin/Area.php:266 #: src/Admin/Area.php:267 -#: src/Admin/Area.php:1207 +#: src/Admin/Area.php:1208 msgid "Settings" msgstr "" @@ -1306,7 +1298,7 @@ msgstr "" #: src/Admin/Area.php:296 #: src/Admin/Area.php:297 -#: src/Admin/Area.php:482 +#: src/Admin/Area.php:483 #: src/Admin/SetupWizard.php:233 #: src/Reports/Emails/Summary.php:313 msgid "Upgrade to Pro" @@ -1347,7 +1339,7 @@ msgid "If enabled, these global settings will manage email sending for all subsi msgstr "" #: src/Admin/Area.php:385 -#: src/Admin/Area.php:1199 +#: src/Admin/Area.php:1200 #: src/Admin/DashboardWidget.php:278 #: src/Admin/FlyoutMenu.php:100 #: src/Admin/Pages/AdditionalConnectionsTab.php:134 @@ -1356,7 +1348,7 @@ msgstr "" #: src/Admin/Pages/EmailReportsTab.php:184 #: src/Admin/Pages/ExportTab.php:156 #: src/Admin/Pages/LogsTab.php:198 -#: src/Admin/Pages/SmartRoutingTab.php:319 +#: src/Admin/Pages/SmartRoutingTab.php:317 msgid "Upgrade to WP Mail SMTP Pro" msgstr "" @@ -1390,80 +1382,84 @@ msgstr "" msgid "%name% is a PRO Feature" msgstr "" +#: src/Admin/Area.php:482 +msgid "We're sorry, the %name% mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features." +msgstr "" + #. Translators: %s - discount value $50. -#: src/Admin/Area.php:487 +#: src/Admin/Area.php:488 msgid "Bonus: WP Mail SMTP users get %s off regular price,
applied at checkout." msgstr "" -#: src/Admin/Area.php:501 +#: src/Admin/Area.php:502 #: src/Admin/SetupWizard.php:252 msgid "Already purchased?" msgstr "" -#: src/Admin/Area.php:584 -#: src/Admin/Area.php:592 +#: src/Admin/Area.php:585 +#: src/Admin/Area.php:593 #: src/Admin/Pages/AboutTab.php:232 #: src/Connect.php:54 msgid "Activate" msgstr "" -#: src/Admin/Area.php:586 +#: src/Admin/Area.php:587 #: src/Admin/Pages/AboutTab.php:221 msgid "Active" msgstr "" -#: src/Admin/Area.php:587 +#: src/Admin/Area.php:588 #: src/Admin/Pages/AboutTab.php:229 msgid "Inactive" msgstr "" -#: src/Admin/Area.php:588 +#: src/Admin/Area.php:589 msgid "Processing..." msgstr "" -#: src/Admin/Area.php:589 +#: src/Admin/Area.php:590 #: src/Admin/Pages/AboutTab.php:250 msgid "Visit Site" msgstr "" -#: src/Admin/Area.php:590 +#: src/Admin/Area.php:591 msgid "Could not install a plugin. Please download from WordPress.org and install manually." msgstr "" -#: src/Admin/Area.php:591 +#: src/Admin/Area.php:592 msgid "Install and Activate" msgstr "" -#: src/Admin/Area.php:593 +#: src/Admin/Area.php:594 msgid "Download" msgstr "" #. translators: %1$s - WP.org link; %2$s - same WP.org link. -#: src/Admin/Area.php:662 +#: src/Admin/Area.php:663 msgid "Please rate WP Mail SMTP ★★★★★ on WordPress.org to help us spread the word. Thank you from the WP Mail SMTP team!" msgstr "" -#: src/Admin/Area.php:1112 +#: src/Admin/Area.php:1113 msgid "WP Mail SMTP Pro related message was successfully dismissed." msgstr "" -#: src/Admin/Area.php:1170 +#: src/Admin/Area.php:1171 msgid "Educational notice for this mailer was successfully dismissed." msgstr "" -#: src/Admin/Area.php:1200 +#: src/Admin/Area.php:1201 msgid "Get WP Mail SMTP Pro" msgstr "" -#: src/Admin/Area.php:1206 +#: src/Admin/Area.php:1207 msgid "Go to WP Mail SMTP Settings page" msgstr "" -#: src/Admin/Area.php:1214 +#: src/Admin/Area.php:1215 msgid "Go to WPMailSMTP.com documentation page" msgstr "" -#: src/Admin/Area.php:1215 +#: src/Admin/Area.php:1216 msgid "Docs" msgstr "" @@ -1511,15 +1507,15 @@ msgstr "" msgid "If unchecked, bounce messages may be lost." msgstr "" -#: src/Admin/ConnectionSettings.php:259 +#: src/Admin/ConnectionSettings.php:261 msgid "Don't see what you're looking for?" msgstr "" -#: src/Admin/ConnectionSettings.php:264 +#: src/Admin/ConnectionSettings.php:266 msgid "Suggest a Mailer" msgstr "" -#: src/Admin/ConnectionSettings.php:292 +#: src/Admin/ConnectionSettings.php:294 msgid "Dismiss this notice" msgstr "" @@ -1684,7 +1680,7 @@ msgid "Debug" msgstr "" #: src/Admin/DebugEvents/Event.php:244 -#: src/WP.php:570 +#: src/WP.php:571 msgid "N/A" msgstr "" @@ -1874,9 +1870,14 @@ msgstr "" msgid "Instantly get more subscribers, leads, and sales with the #1 conversion optimization toolkit. Create high converting popups, announcement bars, spin a wheel, and more with smart targeting and personalization." msgstr "" +#: src/Admin/Pages/AboutTab.php:278 +#: src/Admin/Pages/SmartRoutingTab.php:287 +msgid "WPForms" +msgstr "" + #: src/Admin/Pages/AboutTab.php:279 #: src/Admin/Pages/AboutTab.php:285 -msgid "The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment forms, and more with our 100+ form templates. Trusted by over 5 million websites as the best forms plugin." +msgid "The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment forms, and more with our 600+ form templates. Trusted by over 5 million websites as the best forms plugin." msgstr "" #: src/Admin/Pages/AboutTab.php:284 @@ -1934,7 +1935,7 @@ msgid "PushEngage" msgstr "" #: src/Admin/Pages/AboutTab.php:349 -msgid "Connect with your visitors after they leave your website with the leading web push notification software. Over 10,000+ businesses worldwide use PushEngage to send 9 billion notifications each month." +msgid "Connect with your visitors after they leave your website with the leading web push notification software. Over 10,000+ businesses worldwide use PushEngage to send 15 billion notifications each month." msgstr "" #: src/Admin/Pages/AboutTab.php:355 @@ -2039,35 +2040,69 @@ msgstr "" msgid "Sugar Calendar" msgstr "" -#: src/Admin/Pages/AboutTab.php:493 +#: src/Admin/Pages/AboutTab.php:481 +msgid "WP Charitable" +msgstr "" + +#: src/Admin/Pages/AboutTab.php:482 +msgid "Top-rated WordPress donation and fundraising plugin. Over 10,000+ non-profit organizations and website owners use Charitable to create fundraising campaigns and raise more money online." +msgstr "" + +#: src/Admin/Pages/AboutTab.php:488 +msgid "WPCode Lite" +msgstr "" + +#: src/Admin/Pages/AboutTab.php:489 +#: src/Admin/Pages/AboutTab.php:495 +msgid "Future proof your WordPress customizations with the most popular code snippet management plugin for WordPress. Trusted by over 1,500,000+ websites for easily adding code to WordPress right from the admin area." +msgstr "" + +#: src/Admin/Pages/AboutTab.php:494 +msgid "WPCode Pro" +msgstr "" + +#: src/Admin/Pages/AboutTab.php:502 +msgid "Duplicator" +msgstr "" + +#: src/Admin/Pages/AboutTab.php:503 +#: src/Admin/Pages/AboutTab.php:509 +msgid "Leading WordPress backup & site migration plugin. Over 1,500,000+ smart website owners use Duplicator to make reliable and secure WordPress backups to protect their websites. It also makes website migration really easy." +msgstr "" + +#: src/Admin/Pages/AboutTab.php:508 +msgid "Duplicator Pro" +msgstr "" + +#: src/Admin/Pages/AboutTab.php:528 msgid "Could not activate the plugin. Please activate it from the Plugins page." msgstr "" -#: src/Admin/Pages/AboutTab.php:519 +#: src/Admin/Pages/AboutTab.php:554 msgid "Could not activate the plugin. Plugin is not whitelisted." msgstr "" -#: src/Admin/Pages/AboutTab.php:525 +#: src/Admin/Pages/AboutTab.php:560 msgid "Plugin activated." msgstr "" -#: src/Admin/Pages/AboutTab.php:541 +#: src/Admin/Pages/AboutTab.php:576 msgid "Could not install the plugin." msgstr "" -#: src/Admin/Pages/AboutTab.php:555 +#: src/Admin/Pages/AboutTab.php:590 #: src/Admin/SetupWizard.php:862 msgid "Could not install the plugin. Plugin is not whitelisted." msgstr "" -#: src/Admin/Pages/AboutTab.php:608 +#: src/Admin/Pages/AboutTab.php:643 #: src/Connect.php:214 #: src/Connect.php:222 #: src/Connect.php:291 msgid "Plugin installed & activated." msgstr "" -#: src/Admin/Pages/AboutTab.php:616 +#: src/Admin/Pages/AboutTab.php:651 msgid "Plugin installed." msgstr "" @@ -2108,7 +2143,7 @@ msgstr "" #: src/Admin/Pages/AdditionalConnectionsTab.php:157 #: src/Admin/Pages/SmartRoutingTab.php:50 -#: src/Admin/Pages/SmartRoutingTab.php:105 +#: src/Admin/Pages/SmartRoutingTab.php:103 msgid "Smart Routing" msgstr "" @@ -2500,7 +2535,7 @@ msgid "Close" msgstr "" #: src/Admin/Pages/DebugEventsTab.php:150 -#: src/Admin/Review.php:122 +#: src/Admin/Review.php:139 msgid "Yes" msgstr "" @@ -2711,7 +2746,7 @@ msgid "From Address" msgstr "" #: src/Admin/Pages/ExportTab.php:122 -#: src/Admin/Pages/SmartRoutingTab.php:168 +#: src/Admin/Pages/SmartRoutingTab.php:166 msgid "Subject" msgstr "" @@ -3046,83 +3081,83 @@ msgid "Once you add an additional connection, you can select msgstr "" #. translators: %s - WPMailSMTP.com Upgrade page URL. -#: src/Admin/Pages/SmartRoutingTab.php:111 +#: src/Admin/Pages/SmartRoutingTab.php:109 msgid "Send emails from different additional connections based on your configured conditions. Emails that do not match any of the conditions below will be sent via your Primary Connection. Upgrade to WP Mail SMTP Pro!" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:133 +#: src/Admin/Pages/SmartRoutingTab.php:131 msgid "Enable Smart Routing" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:141 -#: src/Admin/Pages/SmartRoutingTab.php:253 +#: src/Admin/Pages/SmartRoutingTab.php:139 +#: src/Admin/Pages/SmartRoutingTab.php:251 msgid "Send with" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:143 +#: src/Admin/Pages/SmartRoutingTab.php:141 msgid "WooCommerce Emails (SendLayer)" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:145 -#: src/Admin/Pages/SmartRoutingTab.php:257 +#: src/Admin/Pages/SmartRoutingTab.php:143 +#: src/Admin/Pages/SmartRoutingTab.php:255 msgid "if the following conditions are met..." msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:149 -#: src/Admin/Pages/SmartRoutingTab.php:261 +#: src/Admin/Pages/SmartRoutingTab.php:147 +#: src/Admin/Pages/SmartRoutingTab.php:259 msgid "Arrow Up" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:152 -#: src/Admin/Pages/SmartRoutingTab.php:264 +#: src/Admin/Pages/SmartRoutingTab.php:150 +#: src/Admin/Pages/SmartRoutingTab.php:262 msgid "Arrow Down" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:173 +#: src/Admin/Pages/SmartRoutingTab.php:171 msgid "Contains" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:177 +#: src/Admin/Pages/SmartRoutingTab.php:175 msgid "Order" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:181 -#: src/Admin/Pages/SmartRoutingTab.php:204 -#: src/Admin/Pages/SmartRoutingTab.php:234 -#: src/Admin/Pages/SmartRoutingTab.php:293 +#: src/Admin/Pages/SmartRoutingTab.php:179 +#: src/Admin/Pages/SmartRoutingTab.php:202 +#: src/Admin/Pages/SmartRoutingTab.php:232 +#: src/Admin/Pages/SmartRoutingTab.php:291 msgid "And" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:196 -#: src/Admin/Pages/SmartRoutingTab.php:226 -#: src/Admin/Pages/SmartRoutingTab.php:285 +#: src/Admin/Pages/SmartRoutingTab.php:194 +#: src/Admin/Pages/SmartRoutingTab.php:224 +#: src/Admin/Pages/SmartRoutingTab.php:283 msgid "Is" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:213 -#: src/Admin/Pages/SmartRoutingTab.php:243 -#: src/Admin/Pages/SmartRoutingTab.php:302 +#: src/Admin/Pages/SmartRoutingTab.php:211 +#: src/Admin/Pages/SmartRoutingTab.php:241 +#: src/Admin/Pages/SmartRoutingTab.php:300 msgid "or" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:246 -#: src/Admin/Pages/SmartRoutingTab.php:305 +#: src/Admin/Pages/SmartRoutingTab.php:244 +#: src/Admin/Pages/SmartRoutingTab.php:303 msgid "Add New Group" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:255 +#: src/Admin/Pages/SmartRoutingTab.php:253 msgid "Contact Emails (SMTP.com)" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:280 +#: src/Admin/Pages/SmartRoutingTab.php:278 msgid "Initiator" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:312 +#: src/Admin/Pages/SmartRoutingTab.php:310 msgid "Light bulb icon" msgstr "" -#: src/Admin/Pages/SmartRoutingTab.php:313 +#: src/Admin/Pages/SmartRoutingTab.php:311 msgid "Friendly reminder, your Primary Connection will be used for all emails that do not match the conditions above." msgstr "" @@ -3162,591 +3197,591 @@ msgstr "" msgid "Test plain text email was sent successfully! Please check your inbox to make sure it was delivered." msgstr "" -#: src/Admin/Pages/TestTab.php:315 +#: src/Admin/Pages/TestTab.php:316 msgid "Test failed. Please use a valid email address and try to resend the test email." msgstr "" #. translators: %s - email address a test email will be sent to. -#: src/Admin/Pages/TestTab.php:327 -#: src/Admin/Pages/TestTab.php:333 +#: src/Admin/Pages/TestTab.php:328 +#: src/Admin/Pages/TestTab.php:334 msgid "Test email to %s" msgstr "" -#: src/Admin/Pages/TestTab.php:694 +#: src/Admin/Pages/TestTab.php:698 msgid "SSL certificate issue." msgstr "" -#: src/Admin/Pages/TestTab.php:696 +#: src/Admin/Pages/TestTab.php:700 msgid "This means your web server cannot reliably make secure connections (make requests to HTTPS sites)." msgstr "" -#: src/Admin/Pages/TestTab.php:697 -#: src/Admin/Pages/TestTab.php:762 +#: src/Admin/Pages/TestTab.php:701 +#: src/Admin/Pages/TestTab.php:766 msgid "Typically this error is returned when web server is not configured properly." msgstr "" -#: src/Admin/Pages/TestTab.php:700 +#: src/Admin/Pages/TestTab.php:704 msgid "Contact your web hosting provider and inform them your site has an issue with SSL certificates." msgstr "" -#: src/Admin/Pages/TestTab.php:701 -#: src/Admin/Pages/TestTab.php:766 +#: src/Admin/Pages/TestTab.php:705 +#: src/Admin/Pages/TestTab.php:770 msgid "The exact error you can provide them is in the Error log, available at the bottom of this page." msgstr "" -#: src/Admin/Pages/TestTab.php:702 -#: src/Admin/Pages/TestTab.php:767 +#: src/Admin/Pages/TestTab.php:706 +#: src/Admin/Pages/TestTab.php:771 msgid "Ask them to resolve the issue then try again." msgstr "" -#: src/Admin/Pages/TestTab.php:712 +#: src/Admin/Pages/TestTab.php:716 msgid "Could not connect to host." msgstr "" #. translators: %s - SMTP host address. -#: src/Admin/Pages/TestTab.php:716 -#: src/Admin/Pages/TestTab.php:758 -#: src/Admin/Pages/TestTab.php:874 +#: src/Admin/Pages/TestTab.php:720 +#: src/Admin/Pages/TestTab.php:762 +#: src/Admin/Pages/TestTab.php:878 msgid "This means your web server was unable to connect to %s." msgstr "" -#: src/Admin/Pages/TestTab.php:719 -#: src/Admin/Pages/TestTab.php:761 -#: src/Admin/Pages/TestTab.php:877 +#: src/Admin/Pages/TestTab.php:723 +#: src/Admin/Pages/TestTab.php:765 +#: src/Admin/Pages/TestTab.php:881 msgid "This means your web server was unable to connect to the host server." msgstr "" -#: src/Admin/Pages/TestTab.php:720 +#: src/Admin/Pages/TestTab.php:724 msgid "Typically this error is returned your web server is blocking the connections or the SMTP host denying the request." msgstr "" #. translators: %s - SMTP host address. -#: src/Admin/Pages/TestTab.php:724 +#: src/Admin/Pages/TestTab.php:728 msgid "Contact your web hosting provider and ask them to verify your server can connect to %s. Additionally, ask them if a firewall or security policy may be preventing the connection." msgstr "" -#: src/Admin/Pages/TestTab.php:727 +#: src/Admin/Pages/TestTab.php:731 msgid "If using \"Other SMTP\" Mailer, triple check your SMTP settings including host address, email, and password." msgstr "" -#: src/Admin/Pages/TestTab.php:728 +#: src/Admin/Pages/TestTab.php:732 msgid "If using \"Other SMTP\" Mailer, contact your SMTP host to confirm they are accepting outside connections with the settings you have configured (address, username, port, security, etc)." msgstr "" -#: src/Admin/Pages/TestTab.php:737 +#: src/Admin/Pages/TestTab.php:741 msgid "Invalid SendGrid API key" msgstr "" -#: src/Admin/Pages/TestTab.php:739 +#: src/Admin/Pages/TestTab.php:743 msgid "It looks like your SendGrid API Key is invalid." msgstr "" -#: src/Admin/Pages/TestTab.php:742 -#: src/Admin/Pages/TestTab.php:829 +#: src/Admin/Pages/TestTab.php:746 +#: src/Admin/Pages/TestTab.php:833 msgid "Go to WP Mail SMTP plugin Settings page." msgstr "" -#: src/Admin/Pages/TestTab.php:743 +#: src/Admin/Pages/TestTab.php:747 msgid "Make sure your API Key in the SendGrid mailer settings is correct and valid." msgstr "" -#: src/Admin/Pages/TestTab.php:744 +#: src/Admin/Pages/TestTab.php:748 msgid "Save the plugin settings." msgstr "" -#: src/Admin/Pages/TestTab.php:745 +#: src/Admin/Pages/TestTab.php:749 msgid "If updating the API Key doesn't resolve this issue, please contact our support." msgstr "" -#: src/Admin/Pages/TestTab.php:754 +#: src/Admin/Pages/TestTab.php:758 msgid "Could not connect to your host." msgstr "" -#: src/Admin/Pages/TestTab.php:765 +#: src/Admin/Pages/TestTab.php:769 msgid "Contact your web hosting provider and inform them you are having issues making outbound connections." msgstr "" -#: src/Admin/Pages/TestTab.php:776 +#: src/Admin/Pages/TestTab.php:780 msgid "Could not authenticate your SMTP account." msgstr "" -#: src/Admin/Pages/TestTab.php:778 +#: src/Admin/Pages/TestTab.php:782 msgid "This means we were able to connect to your SMTP host, but were not able to proceed using the email/password in the settings." msgstr "" -#: src/Admin/Pages/TestTab.php:779 +#: src/Admin/Pages/TestTab.php:783 msgid "Typically this error is returned when the email or password is not correct or is not what the SMTP host is expecting." msgstr "" -#: src/Admin/Pages/TestTab.php:782 +#: src/Admin/Pages/TestTab.php:786 msgid "Triple check your SMTP settings including host address, email, and password. If you have recently reset your password you will need to update the settings." msgstr "" -#: src/Admin/Pages/TestTab.php:783 -#: src/Admin/Pages/TestTab.php:910 +#: src/Admin/Pages/TestTab.php:787 +#: src/Admin/Pages/TestTab.php:914 msgid "Contact your SMTP host to confirm you are using the correct username and password." msgstr "" -#: src/Admin/Pages/TestTab.php:784 -#: src/Admin/Pages/TestTab.php:911 +#: src/Admin/Pages/TestTab.php:788 +#: src/Admin/Pages/TestTab.php:915 msgid "Verify with your SMTP host that your account has permissions to send emails using outside connections." msgstr "" #. translators: %s - URL to the wpmailsmtp.com doc page. -#: src/Admin/Pages/TestTab.php:787 +#: src/Admin/Pages/TestTab.php:791 msgid "Visit our documentation for additional tips on how to resolve this error." msgstr "" -#: src/Admin/Pages/TestTab.php:807 +#: src/Admin/Pages/TestTab.php:811 msgid "Error due to unsolicited and/or bulk e-mail." msgstr "" -#: src/Admin/Pages/TestTab.php:809 +#: src/Admin/Pages/TestTab.php:813 msgid "This means the connection to your SMTP host was made successfully, but the host rejected the email." msgstr "" -#: src/Admin/Pages/TestTab.php:810 +#: src/Admin/Pages/TestTab.php:814 msgid "Typically this error is returned when you are sending too many e-mails or e-mails that have been identified as spam." msgstr "" -#: src/Admin/Pages/TestTab.php:813 +#: src/Admin/Pages/TestTab.php:817 msgid "Check the emails that are sending are sending individually. Example: email is not sending to 30 recipients. You can install any WordPress e-mail logging plugin to do that." msgstr "" -#: src/Admin/Pages/TestTab.php:814 +#: src/Admin/Pages/TestTab.php:818 msgid "Contact your SMTP host to ask about sending/rate limits." msgstr "" -#: src/Admin/Pages/TestTab.php:815 +#: src/Admin/Pages/TestTab.php:819 msgid "Verify with them your SMTP account is in good standing and your account has not been flagged." msgstr "" -#: src/Admin/Pages/TestTab.php:824 +#: src/Admin/Pages/TestTab.php:828 msgid "Unauthenticated senders are not allowed." msgstr "" -#: src/Admin/Pages/TestTab.php:826 +#: src/Admin/Pages/TestTab.php:830 msgid "This means the connection to your SMTP host was made successfully, but you should enable Authentication and provide correct Username and Password." msgstr "" -#: src/Admin/Pages/TestTab.php:831 +#: src/Admin/Pages/TestTab.php:835 msgid "Enter correct SMTP Username (usually this is an email address) and Password in the appropriate fields." msgstr "" -#: src/Admin/Pages/TestTab.php:842 +#: src/Admin/Pages/TestTab.php:846 msgid "Misconfigured server certificate." msgstr "" -#: src/Admin/Pages/TestTab.php:844 +#: src/Admin/Pages/TestTab.php:848 msgid "This means OpenSSL on your server isn't able to verify the host certificate." msgstr "" -#: src/Admin/Pages/TestTab.php:845 +#: src/Admin/Pages/TestTab.php:849 msgid "There are a few reasons why this is happening. It could be that the host certificate is misconfigured, or this server's OpenSSL is using an outdated CA bundle." msgstr "" -#: src/Admin/Pages/TestTab.php:848 +#: src/Admin/Pages/TestTab.php:852 msgid "Verify that the host's SSL certificate is valid." msgstr "" #. translators: %s - URL to the PHP openssl manual -#: src/Admin/Pages/TestTab.php:851 +#: src/Admin/Pages/TestTab.php:855 msgid "Contact your hosting support, show them the \"full Error Log for debugging\" below and share this link with them." msgstr "" -#: src/Admin/Pages/TestTab.php:870 +#: src/Admin/Pages/TestTab.php:874 msgid "Could not connect to the SMTP host." msgstr "" -#: src/Admin/Pages/TestTab.php:878 -#: src/Admin/Pages/TestTab.php:1342 +#: src/Admin/Pages/TestTab.php:882 +#: src/Admin/Pages/TestTab.php:1346 msgid "Typically this error is returned for one of the following reasons:" msgstr "" -#: src/Admin/Pages/TestTab.php:881 +#: src/Admin/Pages/TestTab.php:885 msgid "SMTP settings are incorrect (wrong port, security setting, incorrect host)." msgstr "" -#: src/Admin/Pages/TestTab.php:884 -#: src/Admin/Pages/TestTab.php:1348 +#: src/Admin/Pages/TestTab.php:888 +#: src/Admin/Pages/TestTab.php:1352 msgid "Your web server is blocking the connection." msgstr "" -#: src/Admin/Pages/TestTab.php:887 +#: src/Admin/Pages/TestTab.php:891 msgid "Your SMTP host is rejecting the connection." msgstr "" -#: src/Admin/Pages/TestTab.php:892 +#: src/Admin/Pages/TestTab.php:896 msgid "Triple check your SMTP settings including host address, email, and password, port, and security." msgstr "" #. translators: %1$s - SMTP host address, %2$s - SMTP port, %3$s - SMTP encryption. -#: src/Admin/Pages/TestTab.php:895 +#: src/Admin/Pages/TestTab.php:899 msgid "Contact your web hosting provider and ask them to verify your server can connect to %1$s on port %2$s using %3$s encryption. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.
Note: this is the most common cause of this issue." msgstr "" -#: src/Admin/Pages/TestTab.php:908 +#: src/Admin/Pages/TestTab.php:912 msgid "no" msgstr "" -#: src/Admin/Pages/TestTab.php:920 -#: src/Admin/Pages/TestTab.php:935 -#: src/Admin/Pages/TestTab.php:975 +#: src/Admin/Pages/TestTab.php:924 +#: src/Admin/Pages/TestTab.php:939 +#: src/Admin/Pages/TestTab.php:979 msgid "Mailgun failed." msgstr "" -#: src/Admin/Pages/TestTab.php:922 +#: src/Admin/Pages/TestTab.php:926 msgid "It seems that you forgot to activate your Mailgun account." msgstr "" -#: src/Admin/Pages/TestTab.php:925 +#: src/Admin/Pages/TestTab.php:929 msgid "Check your inbox you used to create a Mailgun account. Click the activation link in an email from Mailgun." msgstr "" -#: src/Admin/Pages/TestTab.php:926 +#: src/Admin/Pages/TestTab.php:930 msgid "If you do not see activation email, go to your Mailgun control panel and resend the activation email." msgstr "" -#: src/Admin/Pages/TestTab.php:937 +#: src/Admin/Pages/TestTab.php:941 msgid "Typically this error occurs because there is an issue with your Mailgun settings, in many cases Private API Key, Domain Name, or Region is incorrect." msgstr "" #. translators: %1$s - Mailgun API Key area URL. -#: src/Admin/Pages/TestTab.php:942 +#: src/Admin/Pages/TestTab.php:946 msgid "Go to your Mailgun account and verify that your Private API Key is correct." msgstr "" #. translators: %1$s - Mailgun domains area URL. -#: src/Admin/Pages/TestTab.php:955 +#: src/Admin/Pages/TestTab.php:959 msgid "Verify your Domain Name is correct." msgstr "" -#: src/Admin/Pages/TestTab.php:966 +#: src/Admin/Pages/TestTab.php:970 msgid "Verify your domain Region is correct." msgstr "" -#: src/Admin/Pages/TestTab.php:977 +#: src/Admin/Pages/TestTab.php:981 msgid "Your Mailgun account does not have access to send emails." msgstr "" -#: src/Admin/Pages/TestTab.php:978 +#: src/Admin/Pages/TestTab.php:982 msgid "Typically this error occurs because you have not set up and/or complete domain name verification for your Mailgun account." msgstr "" #. translators: %s - Mailgun documentation URL. -#: src/Admin/Pages/TestTab.php:983 +#: src/Admin/Pages/TestTab.php:987 msgid "Go to our how-to guide for setting up Mailgun with WP Mail SMTP." msgstr "" -#: src/Admin/Pages/TestTab.php:995 +#: src/Admin/Pages/TestTab.php:999 msgid "Complete the steps in section \"2. Verify Your Domain\"." msgstr "" -#: src/Admin/Pages/TestTab.php:1004 -#: src/Admin/Pages/TestTab.php:1053 -#: src/Admin/Pages/TestTab.php:1073 -#: src/Admin/Pages/TestTab.php:1101 -#: src/Admin/Pages/TestTab.php:1117 -#: src/Admin/Pages/TestTab.php:1169 -#: src/Admin/Pages/TestTab.php:1195 +#: src/Admin/Pages/TestTab.php:1008 +#: src/Admin/Pages/TestTab.php:1057 +#: src/Admin/Pages/TestTab.php:1077 +#: src/Admin/Pages/TestTab.php:1105 +#: src/Admin/Pages/TestTab.php:1121 +#: src/Admin/Pages/TestTab.php:1173 +#: src/Admin/Pages/TestTab.php:1199 msgid "Google API Error." msgstr "" -#: src/Admin/Pages/TestTab.php:1006 +#: src/Admin/Pages/TestTab.php:1010 msgid "You have not properly configured Gmail mailer." msgstr "" -#: src/Admin/Pages/TestTab.php:1007 +#: src/Admin/Pages/TestTab.php:1011 msgid "Make sure that you have clicked the \"Allow plugin to send emails using your Google account\" button under Gmail settings." msgstr "" -#: src/Admin/Pages/TestTab.php:1010 +#: src/Admin/Pages/TestTab.php:1014 msgid "Go to plugin Settings page and click the \"Allow plugin to send emails using your Google account\" button." msgstr "" -#: src/Admin/Pages/TestTab.php:1011 +#: src/Admin/Pages/TestTab.php:1015 msgid "After the click you should be redirected to a Gmail authorization screen, where you will be asked a permission to send emails on your behalf." msgstr "" -#: src/Admin/Pages/TestTab.php:1012 +#: src/Admin/Pages/TestTab.php:1016 msgid "Please click \"Agree\", if you see that button. If not - you will need to enable less secure apps first:" msgstr "" #. translators: %s - Google support article URL. -#: src/Admin/Pages/TestTab.php:1017 +#: src/Admin/Pages/TestTab.php:1021 msgid "if you are using regular Gmail account, please read this article to proceed." msgstr "" #. translators: %s - Google support article URL. -#: src/Admin/Pages/TestTab.php:1032 +#: src/Admin/Pages/TestTab.php:1036 msgid "if you are using G Suite, please read this article to proceed." msgstr "" -#: src/Admin/Pages/TestTab.php:1055 +#: src/Admin/Pages/TestTab.php:1059 msgid "Typically this error occurs because the address to which the email was sent to is invalid or was empty." msgstr "" -#: src/Admin/Pages/TestTab.php:1058 +#: src/Admin/Pages/TestTab.php:1062 msgid "Check the \"Send To\" email address used and confirm it is a valid email and was not empty." msgstr "" #. translators: 1 - correct email address example. 2 - incorrect email address example. -#: src/Admin/Pages/TestTab.php:1060 +#: src/Admin/Pages/TestTab.php:1064 msgid "It should be something like this: %1$s. These are incorrect values: %2$s." msgstr "" -#: src/Admin/Pages/TestTab.php:1064 +#: src/Admin/Pages/TestTab.php:1068 msgid "Make sure that the generated email has a TO header, useful when you are responsible for email creation." msgstr "" -#: src/Admin/Pages/TestTab.php:1075 +#: src/Admin/Pages/TestTab.php:1079 msgid "Unfortunately, this error can be due to many different reasons." msgstr "" #. translators: %s - Blog article URL. -#: src/Admin/Pages/TestTab.php:1078 +#: src/Admin/Pages/TestTab.php:1082 msgid "Please read this article to learn more about what can cause this error and follow the steps below." msgstr "" -#: src/Admin/Pages/TestTab.php:1091 +#: src/Admin/Pages/TestTab.php:1095 #: src/Providers/Gmail/Mailer.php:249 msgid "Go to WP Mail SMTP plugin settings page. Click the “Remove OAuth Connection” button." msgstr "" -#: src/Admin/Pages/TestTab.php:1092 +#: src/Admin/Pages/TestTab.php:1096 #: src/Providers/Gmail/Mailer.php:250 msgid "Then click the “Allow plugin to send emails using your Google account” button and re-enable access." msgstr "" -#: src/Admin/Pages/TestTab.php:1103 +#: src/Admin/Pages/TestTab.php:1107 msgid "Authentication code that Google returned to you has already been used on your previous auth attempt." msgstr "" -#: src/Admin/Pages/TestTab.php:1106 +#: src/Admin/Pages/TestTab.php:1110 msgid "Make sure that you are not trying to manually clean up the plugin options to retry the \"Allow...\" step." msgstr "" -#: src/Admin/Pages/TestTab.php:1107 +#: src/Admin/Pages/TestTab.php:1111 msgid "Reinstall the plugin with clean plugin data turned on on Misc page. This will remove all the plugin options and you will be safe to retry." msgstr "" -#: src/Admin/Pages/TestTab.php:1108 +#: src/Admin/Pages/TestTab.php:1112 msgid "Make sure there is no aggressive caching on site admin area pages or try to clean cache between attempts." msgstr "" -#: src/Admin/Pages/TestTab.php:1119 +#: src/Admin/Pages/TestTab.php:1123 msgid "There are various reasons for that, please review the steps below." msgstr "" #. translators: %s - Google G Suite Admin area URL. -#: src/Admin/Pages/TestTab.php:1124 +#: src/Admin/Pages/TestTab.php:1128 msgid "Make sure that your G Suite trial period has not expired. You can check the status here." msgstr "" #. translators: %s - Google G Suite Admin area URL. -#: src/Admin/Pages/TestTab.php:1137 +#: src/Admin/Pages/TestTab.php:1141 msgid "Make sure that Gmail app in your G Suite is actually enabled. You can check that in Apps list in G Suite Admin area." msgstr "" #. translators: %s - Google Developers Console URL. -#: src/Admin/Pages/TestTab.php:1150 +#: src/Admin/Pages/TestTab.php:1154 msgid "Make sure that you have Gmail API enabled, and you can do that here." msgstr "" -#: src/Admin/Pages/TestTab.php:1172 -#: src/Admin/Pages/TestTab.php:1200 +#: src/Admin/Pages/TestTab.php:1176 +#: src/Admin/Pages/TestTab.php:1204 msgid "Make sure that the used Client ID/Secret correspond to a proper project that has Gmail API enabled." msgstr "" #. translators: %s - Gmail documentation URL. -#: src/Admin/Pages/TestTab.php:1175 +#: src/Admin/Pages/TestTab.php:1179 msgid "Please follow our Gmail tutorial to be sure that all the correct project and data is applied." msgstr "" -#: src/Admin/Pages/TestTab.php:1197 +#: src/Admin/Pages/TestTab.php:1201 msgid "You may have added a new API to a project" msgstr "" -#: src/Admin/Pages/TestTab.php:1201 +#: src/Admin/Pages/TestTab.php:1205 msgid "Try to use a separate project for your emails, so the project has only 1 Gmail API in it enabled. You will need to remove the old project and create a new one from scratch." msgstr "" -#: src/Admin/Pages/TestTab.php:1210 +#: src/Admin/Pages/TestTab.php:1214 msgid "SMTP.com API Error." msgstr "" -#: src/Admin/Pages/TestTab.php:1212 +#: src/Admin/Pages/TestTab.php:1216 msgid "Your Sender Name option is incorrect." msgstr "" -#: src/Admin/Pages/TestTab.php:1215 +#: src/Admin/Pages/TestTab.php:1219 msgid "Please make sure you entered an accurate Sender Name in WP Mail SMTP plugin settings." msgstr "" -#: src/Admin/Pages/TestTab.php:1224 +#: src/Admin/Pages/TestTab.php:1228 msgid "GuzzleHttp requirements." msgstr "" -#: src/Admin/Pages/TestTab.php:1226 +#: src/Admin/Pages/TestTab.php:1230 msgid "GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler." msgstr "" -#: src/Admin/Pages/TestTab.php:1229 +#: src/Admin/Pages/TestTab.php:1233 msgid "Edit your php.ini file on your hosting server." msgstr "" -#: src/Admin/Pages/TestTab.php:1230 +#: src/Admin/Pages/TestTab.php:1234 msgid "(Recommended) Enable PHP extension: cURL, by adding \"extension=curl\" to the php.ini file (without the quotation marks) OR" msgstr "" -#: src/Admin/Pages/TestTab.php:1231 +#: src/Admin/Pages/TestTab.php:1235 msgid "(If cURL can't be enabled on your hosting server) Enable PHP setting: allow_url_fopen, by adding \"allow_url_fopen = On\" to the php.ini file (without the quotation marks)" msgstr "" -#: src/Admin/Pages/TestTab.php:1232 +#: src/Admin/Pages/TestTab.php:1236 msgid "If you don't know how to do the above we strongly suggest contacting your hosting support and provide them the \"full Error Log for debugging\" below and these steps. They should be able to fix this issue for you." msgstr "" -#: src/Admin/Pages/TestTab.php:1241 -#: src/Admin/Pages/TestTab.php:1270 +#: src/Admin/Pages/TestTab.php:1245 +#: src/Admin/Pages/TestTab.php:1274 msgid "SparkPost API failed." msgstr "" -#: src/Admin/Pages/TestTab.php:1243 +#: src/Admin/Pages/TestTab.php:1247 msgid "Typically this error occurs because there is an issue with your SparkPost settings, in many cases an incorrect API key." msgstr "" #. translators: %1$s - SparkPost API Keys area URL, %1$s - SparkPost EU API Keys area URL. -#: src/Admin/Pages/TestTab.php:1248 +#: src/Admin/Pages/TestTab.php:1252 msgid "Go to your SparkPost account or SparkPost EU account and verify that your API key is correct." msgstr "" -#: src/Admin/Pages/TestTab.php:1261 +#: src/Admin/Pages/TestTab.php:1265 msgid "Verify that your API key has \"Transmissions: Read/Write\" permission." msgstr "" -#: src/Admin/Pages/TestTab.php:1272 +#: src/Admin/Pages/TestTab.php:1276 msgid "Typically this error occurs because there is an issue with your SparkPost settings, in many cases an incorrect region." msgstr "" -#: src/Admin/Pages/TestTab.php:1275 +#: src/Admin/Pages/TestTab.php:1279 msgid "Verify that your SparkPost account region is selected in WP Mail SMTP settings." msgstr "" -#: src/Admin/Pages/TestTab.php:1296 +#: src/Admin/Pages/TestTab.php:1300 msgid "PCRE library issue" msgstr "" -#: src/Admin/Pages/TestTab.php:1298 +#: src/Admin/Pages/TestTab.php:1302 msgid "It looks like your server is running PHP version 7.4.x with an outdated PCRE library (libpcre2) that has a known issue with email address validation." msgstr "" -#: src/Admin/Pages/TestTab.php:1299 +#: src/Admin/Pages/TestTab.php:1303 msgid "There is a known issue with PHP version 7.4.x, when using libpcre2 library version lower than 10.33." msgstr "" -#: src/Admin/Pages/TestTab.php:1302 +#: src/Admin/Pages/TestTab.php:1306 msgid "Contact your web hosting provider and inform them you are having issues with libpcre2 library on PHP 7.4." msgstr "" -#: src/Admin/Pages/TestTab.php:1303 +#: src/Admin/Pages/TestTab.php:1307 msgid "They should be able to resolve this issue for you." msgstr "" -#: src/Admin/Pages/TestTab.php:1304 +#: src/Admin/Pages/TestTab.php:1308 msgid "For a quick fix, until your web hosting resolves this, you can downgrade to PHP version 7.3 on your server." msgstr "" -#: src/Admin/Pages/TestTab.php:1339 +#: src/Admin/Pages/TestTab.php:1343 msgid "An issue was detected." msgstr "" -#: src/Admin/Pages/TestTab.php:1341 +#: src/Admin/Pages/TestTab.php:1345 msgid "This means your test email was unable to be sent." msgstr "" -#: src/Admin/Pages/TestTab.php:1345 +#: src/Admin/Pages/TestTab.php:1349 msgid "Plugin settings are incorrect (wrong SMTP settings, invalid Mailer configuration, etc)." msgstr "" -#: src/Admin/Pages/TestTab.php:1351 +#: src/Admin/Pages/TestTab.php:1355 msgid "Your host is rejecting the connection." msgstr "" -#: src/Admin/Pages/TestTab.php:1356 +#: src/Admin/Pages/TestTab.php:1360 msgid "Triple check the plugin settings, consider reconfiguring to make sure everything is correct (eg bad copy and paste)." msgstr "" -#: src/Admin/Pages/TestTab.php:1358 +#: src/Admin/Pages/TestTab.php:1362 msgid "Contact your web hosting provider and ask them to verify your server can make outside connections. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.
Note: this is the most common cause of this issue." msgstr "" -#: src/Admin/Pages/TestTab.php:1364 +#: src/Admin/Pages/TestTab.php:1368 msgid "Try using a different mailer." msgstr "" -#: src/Admin/Pages/TestTab.php:1402 +#: src/Admin/Pages/TestTab.php:1406 msgid "There was a problem while sending the test email." msgstr "" -#: src/Admin/Pages/TestTab.php:1419 +#: src/Admin/Pages/TestTab.php:1423 msgid "Recommended next steps:" msgstr "" -#: src/Admin/Pages/TestTab.php:1427 +#: src/Admin/Pages/TestTab.php:1431 msgid "Need support?" msgstr "" #. translators: %s - WPMailSMTP.com account area link. -#: src/Admin/Pages/TestTab.php:1435 +#: src/Admin/Pages/TestTab.php:1439 msgid "As a WP Mail SMTP Pro user you have access to WP Mail SMTP priority support. Please log in to your WPMailSMTP.com account and submit a support ticket." msgstr "" -#: src/Admin/Pages/TestTab.php:1453 +#: src/Admin/Pages/TestTab.php:1457 msgid "WP Mail SMTP is a free plugin, and the team behind WPForms maintains it to give back to the WordPress community." msgstr "" #. translators: %s - WPMailSMTP.com URL. -#: src/Admin/Pages/TestTab.php:1460 +#: src/Admin/Pages/TestTab.php:1464 msgid "To access our world class support, please upgrade to WP Mail SMTP Pro. Along with getting expert support, you will also get Notification controls, Email Logging, and integrations for Amazon SES, Office 365, and Outlook.com." msgstr "" -#: src/Admin/Pages/TestTab.php:1475 +#: src/Admin/Pages/TestTab.php:1479 msgid "Additionally, you can take advantage of our White Glove Setup. Sit back and relax while we handle everything for you! If you simply don't have time or maybe you feel a bit in over your head - we got you covered." msgstr "" #. Translators: %s - discount value $50 -#: src/Admin/Pages/TestTab.php:1482 +#: src/Admin/Pages/TestTab.php:1486 msgid "As a valued WP Mail SMTP user, you will get %s off regular pricing, automatically applied at checkout!" msgstr "" #. translators: %1$s - WP Mail SMTP support policy URL, %2$s - WP Mail SMTP support forum URL, %3$s - WPMailSMTP.com URL. -#: src/Admin/Pages/TestTab.php:1498 +#: src/Admin/Pages/TestTab.php:1502 msgid "Alternatively, we also offer limited support on the WordPress.org support forums. You can create a support thread there, but please understand that free support is not guaranteed and is limited to simple issues. If you have an urgent or complex issue, then please consider upgrading to WP Mail SMTP Pro to access our priority support ticket system." msgstr "" -#: src/Admin/Pages/TestTab.php:1517 +#: src/Admin/Pages/TestTab.php:1521 msgid "Please copy the error log message below into the support ticket." msgstr "" -#: src/Admin/Pages/TestTab.php:1522 +#: src/Admin/Pages/TestTab.php:1526 msgid "View Full Error Log" msgstr "" -#: src/Admin/Pages/TestTab.php:1526 +#: src/Admin/Pages/TestTab.php:1530 msgid "Copy Error Log" msgstr "" -#: src/Admin/Pages/TestTab.php:1529 +#: src/Admin/Pages/TestTab.php:1533 msgid "Copied" msgstr "" -#: src/Admin/Pages/TestTab.php:1540 -#: src/Admin/Pages/TestTab.php:1571 +#: src/Admin/Pages/TestTab.php:1544 +#: src/Admin/Pages/TestTab.php:1575 msgid "Send Another Test Email" msgstr "" -#: src/Admin/Pages/TestTab.php:1563 +#: src/Admin/Pages/TestTab.php:1567 msgid "The test email might have sent, but its deliverability should be improved." msgstr "" @@ -3848,43 +3883,43 @@ msgstr "" msgid "Priority Support" msgstr "" -#: src/Admin/Review.php:120 +#: src/Admin/Review.php:137 msgid "Are you enjoying WP Mail SMTP?" msgstr "" -#: src/Admin/Review.php:123 +#: src/Admin/Review.php:140 msgid "Not Really" msgstr "" -#: src/Admin/Review.php:127 +#: src/Admin/Review.php:144 msgid "We're sorry to hear you aren't enjoying WP Mail SMTP. We would love a chance to improve. Could you take a minute and let us know what we can do better?" msgstr "" -#: src/Admin/Review.php:134 +#: src/Admin/Review.php:151 msgid "Give Feedback" msgstr "" -#: src/Admin/Review.php:139 +#: src/Admin/Review.php:156 msgid "No thanks" msgstr "" -#: src/Admin/Review.php:144 +#: src/Admin/Review.php:161 msgid "That’s awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?" msgstr "" -#: src/Admin/Review.php:145 +#: src/Admin/Review.php:162 msgid "~ Jared Atchison
Co-Founder, WP Mail SMTP" msgstr "" -#: src/Admin/Review.php:148 +#: src/Admin/Review.php:165 msgid "Ok, you deserve it" msgstr "" -#: src/Admin/Review.php:150 +#: src/Admin/Review.php:167 msgid "Nope, maybe later" msgstr "" -#: src/Admin/Review.php:151 +#: src/Admin/Review.php:168 msgid "I already did" msgstr "" @@ -4081,95 +4116,86 @@ msgstr "" msgid "Primary" msgstr "" -#. translators: %1$s - WP Mail SMTP plugin name; %2$s - WPMailSMTP.com URL to a related doc. -#: src/Core.php:446 -msgid "Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. Read more for additional information." -msgstr "" - -#: src/Core.php:461 -msgid "Please Note: Support for PHP 5.5 will be discontinued in 2021. After this, if no further action is taken, WP Mail SMTP functionality will be disabled." -msgstr "" - #. translators: %s - plugin name and its version. -#: src/Core.php:495 +#: src/Core.php:446 msgid "EMAILING DISABLED: The %s is currently blocking all emails from being sent." msgstr "" #. translators: %1$s - constant name; %2$s - constant value. -#: src/Core.php:502 +#: src/Core.php:453 msgid "To send emails, change the value of the %1$s constant to %2$s." msgstr "" #. translators: %s - plugin Misc settings page URL. -#: src/Core.php:509 +#: src/Core.php:460 msgid "To send emails, go to plugin Misc settings and disable the \"Do Not Send\" option." msgstr "" -#: src/Core.php:521 +#: src/Core.php:472 msgid "If you create a test email on this page, it will still be sent." msgstr "" -#: src/Core.php:560 +#: src/Core.php:511 msgid "Heads up! The last email your site attempted to send was unsuccessful." msgstr "" -#: src/Core.php:1357 +#: src/Core.php:1312 msgid "WP Mail SMTP has detected incorrect \"wp_mail\" function location. Usually, this means that emails will not be sent successfully!" msgstr "" #. translators: %s - plugin name. -#: src/Core.php:1362 +#: src/Core.php:1317 msgid "It looks like the \"%s\" plugin is overwriting the \"wp_mail\" function. Please reach out to the plugin developer on how to disable or remove the \"wp_mail\" function overwrite to prevent conflicts with WP Mail SMTP." msgstr "" #. translators: %s - must-use plugin name. -#: src/Core.php:1368 +#: src/Core.php:1323 msgid "It looks like the \"%s\" must-use plugin is overwriting the \"wp_mail\" function. Please reach out to your hosting provider on how to disable or remove the \"wp_mail\" function overwrite to prevent conflicts with WP Mail SMTP." msgstr "" -#: src/Core.php:1372 +#: src/Core.php:1327 msgid "It looks like it's overwritten in the \"wp-config.php\" file. Please reach out to your hosting provider on how to disable or remove the \"wp_mail\" function overwrite to prevent conflicts with WP Mail SMTP." msgstr "" #. translators: %s - path. -#: src/Core.php:1377 +#: src/Core.php:1332 msgid "Current function path: %s" msgstr "" -#: src/DBRepair.php:89 +#: src/DBRepair.php:91 msgid "Unknown." msgstr "" #. translators: %1$s - missing table name; %2$s - error message. -#: src/DBRepair.php:142 +#: src/DBRepair.php:144 msgid "Table %1$s: Reason %2$s" msgstr "" -#: src/DBRepair.php:172 +#: src/DBRepair.php:174 msgid "Missing DB tables were created successfully." msgstr "" #. translators: %1$s: Singular/Plural string, %2$s - the error messages from the migrations for the missing tables. -#: src/DBRepair.php:190 +#: src/DBRepair.php:192 msgid "The following DB %1$s still missing.
%2$s" msgstr "" -#: src/DBRepair.php:195 +#: src/DBRepair.php:197 msgid "Table is" msgid_plural "Tables are" msgstr[0] "" msgstr[1] "" -#: src/DBRepair.php:199 +#: src/DBRepair.php:201 msgid "Some DB Tables are still missing." msgstr "" -#: src/MailCatcherTrait.php:156 +#: src/MailCatcherTrait.php:164 #: src/Providers/MailerAbstract.php:308 msgid "An email request was sent." msgstr "" -#: src/MailCatcherTrait.php:176 +#: src/MailCatcherTrait.php:184 msgid "Debug Output:" msgstr "" @@ -4813,29 +4839,29 @@ msgstr "" msgid "WP Core (%s)" msgstr "" -#: src/WP.php:692 +#: src/WP.php:693 msgid "WP Core" msgstr "" -#: wp_mail_smtp.php:154 +#: wp_mail_smtp.php:169 msgid "Please deactivate the free version of the WP Mail SMTP plugin before activating WP Mail SMTP Pro." msgstr "" #. translators: %1$s - WPBeginner URL for recommended WordPress hosting. -#: wp_mail_smtp.php:182 +#: wp_mail_smtp.php:197 msgid "Your site is running an insecure version of PHP that is no longer supported. Please contact your web hosting provider to update your PHP version or switch to a recommended WordPress hosting company." msgstr "" #. translators: %s - WPMailSMTP.com docs URL with more details. -#: wp_mail_smtp.php:210 +#: wp_mail_smtp.php:225 msgid "WP Mail SMTP plugin is disabled on your site until you fix the issue. Read more for additional information." msgstr "" #. translators: %s The minimal WP version supported by WP Mail SMTP. -#: wp_mail_smtp.php:262 +#: wp_mail_smtp.php:277 msgid "Your site is running an old version of WordPress that is no longer supported by WP Mail SMTP. Please update your WordPress site to at least version %s." msgstr "" -#: wp_mail_smtp.php:273 +#: wp_mail_smtp.php:288 msgid "WP Mail SMTP plugin is disabled on your site until WordPress is updated to the required version." msgstr "" diff --git a/assets/vue/js/chunk-vendors.min.js b/assets/vue/js/chunk-vendors.min.js index d21bd1a..b832957 100644 --- a/assets/vue/js/chunk-vendors.min.js +++ b/assets/vue/js/chunk-vendors.min.js @@ -1,9 +1,9 @@ -(self["wpmailsmtpjsonp"]=self["wpmailsmtpjsonp"]||[]).push([[998],{1001:function(t,e,n){"use strict";function r(t,e,n,r,o,i,a,s){var c,u="function"===typeof t?t.options:t;if(e&&(u.render=e,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(c=function(t){t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,t||"undefined"===typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},u._ssrRegister=c):o&&(c=s?function(){o.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:o),c)if(u.functional){u._injectStyles=c;var l=u.render;u.render=function(t,e){return c.call(e),l(t,e)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,c):[c]}return{exports:t,options:u}}n.d(e,{Z:function(){return r}})},3165:function(t,e,n){"use strict";n.d(e,{__:function(){return J},l5:function(){return X},gB:function(){return c}});var r=n(9588),o=n.n(r),i=n(8975),a=n.n(i),s=o()(console.error);function c(t){try{for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r=0||u[o]":5,">=":5,"==":4,"!=":4,"&&":3,"||":2,"?":1,"?:":1},l=["(","?"],f={")":["("],":":["?","?:"]},p=/<=|>=|==|!=|&&|\|\||\?:|\(|!|\*|\/|%|\+|-|<|>|\?|\)|:/;var v={"!":function(t){return!t},"*":function(t,e){return t*e},"/":function(t,e){return t/e},"%":function(t,e){return t%e},"+":function(t,e){return t+e},"-":function(t,e){return t-e},"<":function(t,e){return t":function(t,e){return t>e},">=":function(t,e){return t>=e},"==":function(t,e){return t===e},"!=":function(t,e){return t!==e},"&&":function(t,e){return t&&e},"||":function(t,e){return t||e},"?:":function(t,e,n){if(t)throw e;return n}};function m(t,e){var n,r,o,i,a,s,c=[];for(n=0;n0&&void 0!==arguments[0]?arguments[0]:"default";return r.data[t]},c=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"default";r.data[e]=O(O(O({},k),r.data[e]),t),r.data[e][""]=O(O({},k[""]),r.data[e][""])},u=function(t,e){c(t,e),i()},l=function(t,e){r.data={},r.pluralForms={},u(t,e)},f=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default",e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0;return r.data[t]||c(void 0,t),r.dcnpgettext(t,e,n,o,i)},p=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default";return t},d=function(t,e){var r=f(e,void 0,t);return n?(r=n.applyFilters("i18n.gettext",r,t,e),n.applyFilters("i18n.gettext_"+p(e),r,t,e)):r},h=function(t,e,r){var o=f(r,e,t);return n?(o=n.applyFilters("i18n.gettext_with_context",o,t,e,r),n.applyFilters("i18n.gettext_with_context_"+p(r),o,t,e,r)):o},v=function(t,e,r,o){var i=f(o,void 0,t,e,r);return n?(i=n.applyFilters("i18n.ngettext",i,t,e,r,o),n.applyFilters("i18n.ngettext_"+p(o),i,t,e,r,o)):i},m=function(t,e,r,o,i){var a=f(i,o,t,e,r);return n?(a=n.applyFilters("i18n.ngettext_with_context",a,t,e,r,o,i),n.applyFilters("i18n.ngettext_with_context_"+p(i),a,t,e,r,o,i)):a},g=function(){return"rtl"===h("ltr","text direction")},y=function(t,e,o){var i,a,s=e?e+""+t:t,c=!(null===(i=r.data)||void 0===i||null===(a=i[null!==o&&void 0!==o?o:"default"])||void 0===a||!a[s]);return n&&(c=n.applyFilters("i18n.has_translation",c,t,e,o),c=n.applyFilters("i18n.has_translation_"+p(o),c,t,e,o)),c};if(t&&u(t,e),n){var w=function(t){C.test(t)&&i()};n.addAction("hookAdded","core/i18n",w),n.addAction("hookRemoved","core/i18n",w)}return{getLocaleData:s,setLocaleData:u,resetLocaleData:l,subscribe:a,__:d,_x:h,_n:v,_nx:m,isRTL:g,hasTranslation:y}},S=n(5226);function E(t){return"string"!==typeof t||""===t?(console.error("The namespace must be a non-empty string."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.\-\/]*$/.test(t)||(console.error("The namespace can only contain numbers, letters, dashes, periods, underscores and slashes."),!1)}var A=E;function $(t){return"string"!==typeof t||""===t?(console.error("The hook name must be a non-empty string."),!1):/^__/.test(t)?(console.error("The hook name cannot begin with `__`."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(t)||(console.error("The hook name can only contain numbers, letters, dashes, periods and underscores."),!1)}var T=$;function P(t,e){return function(n,r,o){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:10,a=t[e];if(T(n)&&A(r))if("function"===typeof o)if("number"===typeof i){var s={callback:o,priority:i,namespace:r};if(a[n]){var c,u=a[n].handlers;for(c=u.length;c>0;c--)if(i>=u[c-1].priority)break;c===u.length?u[c]=s:u.splice(c,0,s),a.__current.forEach((function(t){t.name===n&&t.currentIndex>=c&&t.currentIndex++}))}else a[n]={handlers:[s],runs:0};"hookAdded"!==n&&t.doAction("hookAdded",n,r,o,i)}else console.error("If specified, the hook priority must be a number.");else console.error("The hook callback must be a function.")}}var L=P;function I(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return function(r,o){var i=t[e];if(T(r)&&(n||A(o))){if(!i[r])return 0;var a=0;if(n)a=i[r].handlers.length,i[r]={runs:i[r].runs,handlers:[]};else for(var s=i[r].handlers,c=function(t){s[t].namespace===o&&(s.splice(t,1),a++,i.__current.forEach((function(e){e.name===r&&e.currentIndex>=t&&e.currentIndex--})))},u=s.length-1;u>=0;u--)c(u);return"hookRemoved"!==r&&t.doAction("hookRemoved",r,o),a}}}var N=I;function R(t,e){return function(n,r){var o=t[e];return"undefined"!==typeof r?n in o&&o[n].handlers.some((function(t){return t.namespace===r})):n in o}}var D=R;function M(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return function(r){var o=t[e];o[r]||(o[r]={handlers:[],runs:0}),o[r].runs++;var i=o[r].handlers;for(var a=arguments.length,s=new Array(a>1?a-1:0),c=1;c=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(t){l.headers[t]={}})),r.forEach(["post","put","patch"],(function(t){l.headers[t]=r.merge(a)})),t.exports=l},7288:function(t){t.exports={version:"0.24.0"}},1849:function(t){"use strict";t.exports=function(t,e){return function(){for(var n=new Array(arguments.length),r=0;r=0)return;a[e]="set-cookie"===e?(a[e]?a[e]:[]).concat([n]):a[e]?a[e]+", "+n:n}})),a):a}},8713:function(t){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},4875:function(t,e,n){"use strict";var r=n(7288).version,o={};["object","boolean","number","function","string","symbol"].forEach((function(t,e){o[t]=function(n){return typeof n===t||"a"+(e<1?"n ":" ")+t}}));var i={};function a(t,e,n){if("object"!==typeof t)throw new TypeError("options must be an object");var r=Object.keys(t),o=r.length;while(o-- >0){var i=r[o],a=e[i];if(a){var s=t[i],c=void 0===s||a(s,i,t);if(!0!==c)throw new TypeError("option "+i+" must be "+c)}else if(!0!==n)throw Error("Unknown option "+i)}}o.transitional=function(t,e,n){function o(t,e){return"[Axios v"+r+"] Transitional option '"+t+"'"+e+(n?". "+n:"")}return function(n,r,a){if(!1===t)throw new Error(o(r," has been removed"+(e?" in "+e:"")));return e&&!i[r]&&(i[r]=!0,console.warn(o(r," has been deprecated since v"+e+" and will be removed in the near future"))),!t||t(n,r,a)}},t.exports={assertOptions:a,validators:o}},4867:function(t,e,n){"use strict";var r=n(1849),o=Object.prototype.toString;function i(t){return"[object Array]"===o.call(t)}function a(t){return"undefined"===typeof t}function s(t){return null!==t&&!a(t)&&null!==t.constructor&&!a(t.constructor)&&"function"===typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}function c(t){return"[object ArrayBuffer]"===o.call(t)}function u(t){return"undefined"!==typeof FormData&&t instanceof FormData}function l(t){var e;return e="undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&t.buffer instanceof ArrayBuffer,e}function f(t){return"string"===typeof t}function p(t){return"number"===typeof t}function d(t){return null!==t&&"object"===typeof t}function h(t){if("[object Object]"!==o.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}function v(t){return"[object Date]"===o.call(t)}function m(t){return"[object File]"===o.call(t)}function g(t){return"[object Blob]"===o.call(t)}function y(t){return"[object Function]"===o.call(t)}function w(t){return d(t)&&y(t.pipe)}function b(t){return"undefined"!==typeof URLSearchParams&&t instanceof URLSearchParams}function _(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function x(){return("undefined"===typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!==typeof window&&"undefined"!==typeof document)}function O(t,e){if(null!==t&&"undefined"!==typeof t)if("object"!==typeof t&&(t=[t]),i(t))for(var n=0,r=t.length;nl)if(s=c[l++],s!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},3658:function(t,e,n){"use strict";var r=n(9781),o=n(3157),i=TypeError,a=Object.getOwnPropertyDescriptor,s=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=s?function(t,e){if(o(t)&&!a(t,"length").writable)throw i("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},4326:function(t,e,n){var r=n(1702),o=r({}.toString),i=r("".slice);t.exports=function(t){return i(o(t),8,-1)}},9920:function(t,e,n){var r=n(2597),o=n(3887),i=n(1236),a=n(3070);t.exports=function(t,e,n){for(var s=o(e),c=a.f,u=i.f,l=0;ln)throw e("Maximum allowed index exceeded");return t}},8113:function(t,e,n){var r=n(5005);t.exports=r("navigator","userAgent")||""},7392:function(t,e,n){var r,o,i=n(7854),a=n(8113),s=i.process,c=i.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(r=l.split("."),o=r[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(r=a.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/),r&&(o=+r[1]))),t.exports=o},748:function(t){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(t,e,n){var r=n(7854),o=n(1236).f,i=n(8880),a=n(8052),s=n(3072),c=n(9920),u=n(4705);t.exports=function(t,e){var n,l,f,p,d,h,v=t.target,m=t.global,g=t.stat;if(l=m?r:g?r[v]||s(v,{}):(r[v]||{}).prototype,l)for(f in e){if(d=e[f],t.dontCallGetSet?(h=o(l,f),p=h&&h.value):p=l[f],n=u(m?f:v+(g?".":"#")+f,t.forced),!n&&void 0!==p){if(typeof d==typeof p)continue;c(d,p)}(t.sham||p&&p.sham)&&i(d,"sham",!0),a(l,f,d,t)}}},7293:function(t){t.exports=function(t){try{return!!t()}catch(e){return!0}}},4374:function(t,e,n){var r=n(7293);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},6916:function(t,e,n){var r=n(4374),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:function(t,e,n){var r=n(9781),o=n(2597),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),c=s&&"something"===function(){}.name,u=s&&(!r||r&&a(i,"name").configurable);t.exports={EXISTS:s,PROPER:c,CONFIGURABLE:u}},1702:function(t,e,n){var r=n(4374),o=Function.prototype,i=o.call,a=r&&o.bind.bind(i,i);t.exports=r?a:function(t){return function(){return i.apply(t,arguments)}}},5005:function(t,e,n){var r=n(7854),o=n(614),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},8173:function(t,e,n){var r=n(9662),o=n(8554);t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},7854:function(t,e,n){var r=function(t){return t&&t.Math==Math&&t};t.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:function(t,e,n){var r=n(1702),o=n(7908),i=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return i(o(t),e)}},3501:function(t){t.exports={}},4664:function(t,e,n){var r=n(9781),o=n(7293),i=n(317);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:function(t,e,n){var r=n(1702),o=n(7293),i=n(4326),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?s(t,""):a(t)}:a},2788:function(t,e,n){var r=n(1702),o=n(614),i=n(5465),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},9909:function(t,e,n){var r,o,i,a=n(4811),s=n(7854),c=n(111),u=n(8880),l=n(2597),f=n(5465),p=n(6200),d=n(3501),h="Object already initialized",v=s.TypeError,m=s.WeakMap,g=function(t){return i(t)?o(t):r(t,{})},y=function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw v("Incompatible receiver, "+t+" required");return n}};if(a||f.state){var w=f.state||(f.state=new m);w.get=w.get,w.has=w.has,w.set=w.set,r=function(t,e){if(w.has(t))throw v(h);return e.facade=t,w.set(t,e),e},o=function(t){return w.get(t)||{}},i=function(t){return w.has(t)}}else{var b=p("state");d[b]=!0,r=function(t,e){if(l(t,b))throw v(h);return e.facade=t,u(t,b,e),e},o=function(t){return l(t,b)?t[b]:{}},i=function(t){return l(t,b)}}t.exports={set:r,get:o,has:i,enforce:g,getterFor:y}},3157:function(t,e,n){var r=n(4326);t.exports=Array.isArray||function(t){return"Array"==r(t)}},614:function(t,e,n){var r=n(4154),o=r.all;t.exports=r.IS_HTMLDDA?function(t){return"function"==typeof t||t===o}:function(t){return"function"==typeof t}},4705:function(t,e,n){var r=n(7293),o=n(614),i=/#|\.prototype\./,a=function(t,e){var n=c[s(t)];return n==l||n!=u&&(o(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},8554:function(t){t.exports=function(t){return null===t||void 0===t}},111:function(t,e,n){var r=n(614),o=n(4154),i=o.all;t.exports=o.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:r(t)||t===i}:function(t){return"object"==typeof t?null!==t:r(t)}},1913:function(t){t.exports=!1},2190:function(t,e,n){var r=n(5005),o=n(614),i=n(7976),a=n(3307),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},6244:function(t,e,n){var r=n(7466);t.exports=function(t){return r(t.length)}},6339:function(t,e,n){var r=n(7293),o=n(614),i=n(2597),a=n(9781),s=n(6530).CONFIGURABLE,c=n(2788),u=n(9909),l=u.enforce,f=u.get,p=Object.defineProperty,d=a&&!r((function(){return 8!==p((function(){}),"length",{value:8}).length})),h=String(String).split("String"),v=t.exports=function(t,e,n){"Symbol("===String(e).slice(0,7)&&(e="["+String(e).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!i(t,"name")||s&&t.name!==e)&&(a?p(t,"name",{value:e,configurable:!0}):t.name=e),d&&n&&i(n,"arity")&&t.length!==n.arity&&p(t,"length",{value:n.arity});try{n&&i(n,"constructor")&&n.constructor?a&&p(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(o){}var r=l(t);return i(r,"source")||(r.source=h.join("string"==typeof e?e:"")),t};Function.prototype.toString=v((function(){return o(this)&&f(this).source||c(this)}),"toString")},4758:function(t){var e=Math.ceil,n=Math.floor;t.exports=Math.trunc||function(t){var r=+t;return(r>0?n:e)(r)}},3070:function(t,e,n){var r=n(9781),o=n(4664),i=n(3353),a=n(9670),s=n(4948),c=TypeError,u=Object.defineProperty,l=Object.getOwnPropertyDescriptor,f="enumerable",p="configurable",d="writable";e.f=r?i?function(t,e,n){if(a(t),e=s(e),a(n),"function"===typeof t&&"prototype"===e&&"value"in n&&d in n&&!n[d]){var r=l(t,e);r&&r[d]&&(t[e]=n.value,n={configurable:p in n?n[p]:r[p],enumerable:f in n?n[f]:r[f],writable:!1})}return u(t,e,n)}:u:function(t,e,n){if(a(t),e=s(e),a(n),o)try{return u(t,e,n)}catch(r){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},1236:function(t,e,n){var r=n(9781),o=n(6916),i=n(5296),a=n(9114),s=n(5656),c=n(4948),u=n(2597),l=n(4664),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=c(e),l)try{return f(t,e)}catch(n){}if(u(t,e))return a(!o(i.f,t,e),t[e])}},8006:function(t,e,n){var r=n(6324),o=n(748),i=o.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},5181:function(t,e){e.f=Object.getOwnPropertySymbols},7976:function(t,e,n){var r=n(1702);t.exports=r({}.isPrototypeOf)},6324:function(t,e,n){var r=n(1702),o=n(2597),i=n(5656),a=n(1318).indexOf,s=n(3501),c=r([].push);t.exports=function(t,e){var n,r=i(t),u=0,l=[];for(n in r)!o(s,n)&&o(r,n)&&c(l,n);while(e.length>u)o(r,n=e[u++])&&(~a(l,n)||c(l,n));return l}},5296:function(t,e){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);e.f=o?function(t){var e=r(this,t);return!!e&&e.enumerable}:n},2140:function(t,e,n){var r=n(6916),o=n(614),i=n(111),a=TypeError;t.exports=function(t,e){var n,s;if("string"===e&&o(n=t.toString)&&!i(s=r(n,t)))return s;if(o(n=t.valueOf)&&!i(s=r(n,t)))return s;if("string"!==e&&o(n=t.toString)&&!i(s=r(n,t)))return s;throw a("Can't convert object to primitive value")}},3887:function(t,e,n){var r=n(5005),o=n(1702),i=n(8006),a=n(5181),s=n(9670),c=o([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=i.f(s(t)),n=a.f;return n?c(e,n(t)):e}},4488:function(t,e,n){var r=n(8554),o=TypeError;t.exports=function(t){if(r(t))throw o("Can't call method on "+t);return t}},6200:function(t,e,n){var r=n(2309),o=n(9711),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},5465:function(t,e,n){var r=n(7854),o=n(3072),i="__core-js_shared__",a=r[i]||o(i,{});t.exports=a},2309:function(t,e,n){var r=n(1913),o=n(5465);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.26.1",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.26.1/LICENSE",source:"https://github.com/zloirock/core-js"})},6293:function(t,e,n){var r=n(7392),o=n(7293);t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},1400:function(t,e,n){var r=n(9303),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},5656:function(t,e,n){var r=n(8361),o=n(4488);t.exports=function(t){return r(o(t))}},9303:function(t,e,n){var r=n(4758);t.exports=function(t){var e=+t;return e!==e||0===e?0:r(e)}},7466:function(t,e,n){var r=n(9303),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},7908:function(t,e,n){var r=n(4488),o=Object;t.exports=function(t){return o(r(t))}},7593:function(t,e,n){var r=n(6916),o=n(111),i=n(2190),a=n(8173),s=n(2140),c=n(5112),u=TypeError,l=c("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var n,c=a(t,l);if(c){if(void 0===e&&(e="default"),n=r(c,t,e),!o(n)||i(n))return n;throw u("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},4948:function(t,e,n){var r=n(7593),o=n(2190);t.exports=function(t){var e=r(t,"string");return o(e)?e:e+""}},6330:function(t){var e=String;t.exports=function(t){try{return e(t)}catch(n){return"Object"}}},9711:function(t,e,n){var r=n(1702),o=0,i=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},3307:function(t,e,n){var r=n(6293);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:function(t,e,n){var r=n(9781),o=n(7293);t.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},4811:function(t,e,n){var r=n(7854),o=n(614),i=r.WeakMap;t.exports=o(i)&&/native code/.test(String(i))},5112:function(t,e,n){var r=n(7854),o=n(2309),i=n(2597),a=n(9711),s=n(6293),c=n(3307),u=o("wks"),l=r.Symbol,f=l&&l["for"],p=c?l:l&&l.withoutSetter||a;t.exports=function(t){if(!i(u,t)||!s&&"string"!=typeof u[t]){var e="Symbol."+t;s&&i(l,t)?u[t]=l[t]:u[t]=c&&f?f(e):p(e)}return u[t]}},7658:function(t,e,n){"use strict";var r=n(2109),o=n(7908),i=n(6244),a=n(3658),s=n(7207),c=n(7293),u=c((function(){return 4294967297!==[].push.call({length:4294967296},1)})),l=!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}}();r({target:"Array",proto:!0,arity:1,forced:u||l},{push:function(t){var e=o(this),n=i(e),r=arguments.length;s(n+r);for(var c=0;c-1}function Vt(t,e){var n=this.__data__,r=ie(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}function qt(t){var e=-1,n=t?t.length:0;this.clear();while(++e-1&&t%1==0&&t-1&&t%1==0&&t<=i}function We(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Ge(t){return!!t&&"object"==typeof t}function Ze(t){return ze(t)?re(t):pe(t)}function Ke(){return[]}function Ye(){return!1}t.exports=De},1296:function(t,e,n){var r="Expected a function",o=NaN,i="[object Symbol]",a=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,u=/^0o[0-7]+$/i,l=parseInt,f="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,p="object"==typeof self&&self&&self.Object===Object&&self,d=f||p||Function("return this")(),h=Object.prototype,v=h.toString,m=Math.max,g=Math.min,y=function(){return d.Date.now()};function w(t,e,n){var o,i,a,s,c,u,l=0,f=!1,p=!1,d=!0;if("function"!=typeof t)throw new TypeError(r);function h(e){var n=o,r=i;return o=i=void 0,l=e,s=t.apply(r,n),s}function v(t){return l=t,c=setTimeout(x,e),f?h(t):s}function w(t){var n=t-u,r=t-l,o=e-n;return p?g(o,a-r):o}function _(t){var n=t-u,r=t-l;return void 0===u||n>=e||n<0||p&&r>=a}function x(){var t=y();if(_(t))return k(t);c=setTimeout(x,w(t))}function k(t){return c=void 0,d&&o?h(t):(o=i=void 0,s)}function C(){void 0!==c&&clearTimeout(c),l=0,o=u=i=c=void 0}function j(){return void 0===c?s:k(y())}function S(){var t=y(),n=_(t);if(o=arguments,i=this,u=t,n){if(void 0===c)return v(u);if(p)return c=setTimeout(x,e),h(u)}return void 0===c&&(c=setTimeout(x,e)),s}return e=O(e)||0,b(n)&&(f=!!n.leading,p="maxWait"in n,a=p?m(O(n.maxWait)||0,e):a,d="trailing"in n?!!n.trailing:d),S.cancel=C,S.flush=j,S}function b(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function _(t){return!!t&&"object"==typeof t}function x(t){return"symbol"==typeof t||_(t)&&v.call(t)==i}function O(t){if("number"==typeof t)return t;if(x(t))return o;if(b(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=b(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(a,"");var n=c.test(t);return n||u.test(t)?l(t.slice(2),n?2:8):s.test(t)?o:+t}t.exports=w},8394:function(t,e,n){var r="Expected a function",o="__lodash_hash_undefined__",i=1/0,a=9007199254740991,s="[object Arguments]",c="[object Function]",u="[object GeneratorFunction]",l="[object Symbol]",f=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,p=/^\w*$/,d=/^\./,h=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,v=/[\\^$.*+?()[\]{}|]/g,m=/\\(\\)?/g,g=/^\[object .+?Constructor\]$/,y=/^(?:0|[1-9]\d*)$/,w="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,b="object"==typeof self&&self&&self.Object===Object&&self,_=w||b||Function("return this")();function x(t,e){return null==t?void 0:t[e]}function O(t){var e=!1;if(null!=t&&"function"!=typeof t.toString)try{e=!!(t+"")}catch(n){}return e}var k=Array.prototype,C=Function.prototype,j=Object.prototype,S=_["__core-js_shared__"],E=function(){var t=/[^.]+$/.exec(S&&S.keys&&S.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),A=C.toString,$=j.hasOwnProperty,T=j.toString,P=RegExp("^"+A.call($).replace(v,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),L=_.Symbol,I=j.propertyIsEnumerable,N=k.splice,R=lt(_,"Map"),D=lt(Object,"create"),M=L?L.prototype:void 0,B=M?M.toString:void 0;function F(t){var e=-1,n=t?t.length:0;this.clear();while(++e-1}function X(t,e){var n=this.__data__,r=ot(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}function J(t){var e=-1,n=t?t.length:0;this.clear();while(++e-1&&t%1==0&&t-1&&t%1==0&&t<=a}function St(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Et(t){return!!t&&"object"==typeof t}function At(t){return"symbol"==typeof t||Et(t)&&T.call(t)==l}function $t(t){return null==t?"":st(t)}function Tt(t,e){return null!=t&&ft(t,e,it)}t.exports=Tt},2378:function(t,e,n){t=n.nmd(t);var r=200,o="__lodash_hash_undefined__",i=800,a=16,s=9007199254740991,c="[object Arguments]",u="[object Array]",l="[object AsyncFunction]",f="[object Boolean]",p="[object Date]",d="[object Error]",h="[object Function]",v="[object GeneratorFunction]",m="[object Map]",g="[object Number]",y="[object Null]",w="[object Object]",b="[object Proxy]",_="[object RegExp]",x="[object Set]",O="[object String]",k="[object Undefined]",C="[object WeakMap]",j="[object ArrayBuffer]",S="[object DataView]",E="[object Float32Array]",A="[object Float64Array]",$="[object Int8Array]",T="[object Int16Array]",P="[object Int32Array]",L="[object Uint8Array]",I="[object Uint8ClampedArray]",N="[object Uint16Array]",R="[object Uint32Array]",D=/[\\^$.*+?()[\]{}|]/g,M=/^\[object .+?Constructor\]$/,B=/^(?:0|[1-9]\d*)$/,F={};F[E]=F[A]=F[$]=F[T]=F[P]=F[L]=F[I]=F[N]=F[R]=!0,F[c]=F[u]=F[j]=F[f]=F[S]=F[p]=F[d]=F[h]=F[m]=F[g]=F[w]=F[_]=F[x]=F[O]=F[C]=!1;var z="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,H="object"==typeof self&&self&&self.Object===Object&&self,U=z||H||Function("return this")(),V=e&&!e.nodeType&&e,q=V&&t&&!t.nodeType&&t,W=q&&q.exports===V,G=W&&z.process,Z=function(){try{var t=q&&q.require&&q.require("util").types;return t||G&&G.binding&&G.binding("util")}catch(e){}}(),K=Z&&Z.isTypedArray;function Y(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function X(t,e){var n=-1,r=Array(t);while(++n-1}function Mt(t,e){var n=this.__data__,r=te(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this}function Bt(t){var e=-1,n=null==t?0:t.length;this.clear();while(++e1?n[o-1]:void 0,a=o>2?n[2]:void 0;i=t.length>3&&"function"==typeof i?(o--,i):void 0,a&&ke(n[0],n[1],a)&&(i=o<3?void 0:i,o=1),e=Object(e);while(++r-1&&t%1==0&&t0){if(++e>=i)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}function Ie(t){if(null!=t){try{return it.call(t)}catch(e){}try{return t+""}catch(e){}}return""}function Ne(t,e){return t===e||t!==t&&e!==e}var Re=oe(function(){return arguments}())?oe:function(t){return Ve(t)&&at.call(t,"callee")&&!gt.call(t,"callee")},De=Array.isArray;function Me(t){return null!=t&&He(t.length)&&!ze(t)}function Be(t){return Ve(t)&&Me(t)}var Fe=_t||Je;function ze(t){if(!Ue(t))return!1;var e=re(t);return e==h||e==v||e==l||e==b}function He(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=s}function Ue(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Ve(t){return null!=t&&"object"==typeof t}function qe(t){if(!Ve(t)||re(t)!=w)return!1;var e=vt(t);if(null===e)return!0;var n=at.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&it.call(n)==ut}var We=K?J(K):ae;function Ge(t){return me(t,Ze(t))}function Ze(t){return Me(t)?Xt(t,!0):se(t)}var Ke=ge((function(t,e,n){ce(t,e,n)}));function Ye(t){return function(){return t}}function Xe(t){return t}function Je(){return!1}t.exports=Ke},8552:function(t,e,n){var r=n(852),o=n(5639),i=r(o,"DataView");t.exports=i},1989:function(t,e,n){var r=n(1789),o=n(401),i=n(7667),a=n(1327),s=n(1866);function c(t){var e=-1,n=null==t?0:t.length;this.clear();while(++e1?n[i-1]:void 0,s=i>2?n[2]:void 0;a=t.length>3&&"function"==typeof a?(i--,a):void 0,s&&o(n[0],n[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);while(++rp))return!1;var h=l.get(t),v=l.get(e);if(h&&v)return h==e&&v==t;var m=-1,g=!0,y=n&s?new r:void 0;l.set(t,e),l.set(e,t);while(++m-1&&t%1==0&&t-1}t.exports=o},3399:function(t,e,n){var r=n(8470);function o(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}t.exports=o},4785:function(t,e,n){var r=n(1989),o=n(8407),i=n(7071);function a(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}t.exports=a},1285:function(t,e,n){var r=n(5050);function o(t){var e=r(this,t)["delete"](t);return this.size-=e?1:0,e}t.exports=o},6e3:function(t,e,n){var r=n(5050);function o(t){return r(this,t).get(t)}t.exports=o},9916:function(t,e,n){var r=n(5050);function o(t){return r(this,t).has(t)}t.exports=o},5265:function(t,e,n){var r=n(5050);function o(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}t.exports=o},8776:function(t){function e(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}t.exports=e},4536:function(t,e,n){var r=n(852),o=r(Object,"create");t.exports=o},9850:function(t,e,n){var r=n(5569),o=r(Object.keys,Object);t.exports=o},3498:function(t){function e(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}t.exports=e},1167:function(t,e,n){t=n.nmd(t);var r=n(1957),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o,s=a&&r.process,c=function(){try{var t=i&&i.require&&i.require("util").types;return t||s&&s.binding&&s.binding("util")}catch(e){}}();t.exports=c},2333:function(t){var e=Object.prototype,n=e.toString;function r(t){return n.call(t)}t.exports=r},5569:function(t){function e(t,e){return function(n){return t(e(n))}}t.exports=e},5357:function(t,e,n){var r=n(6874),o=Math.max;function i(t,e,n){return e=o(void 0===e?t.length-1:e,0),function(){var i=arguments,a=-1,s=o(i.length-e,0),c=Array(s);while(++a0){if(++o>=e)return arguments[0]}else o=0;return t.apply(void 0,arguments)}}t.exports=o},7465:function(t,e,n){var r=n(8407);function o(){this.__data__=new r,this.size=0}t.exports=o},3779:function(t){function e(t){var e=this.__data__,n=e["delete"](t);return this.size=e.size,n}t.exports=e},7599:function(t){function e(t){return this.__data__.get(t)}t.exports=e},6783:function(t){function e(t){return this.__data__.has(t)}t.exports=e},4309:function(t,e,n){var r=n(8407),o=n(7071),i=n(3369),a=200;function s(t,e){var n=this.__data__;if(n instanceof r){var s=n.__data__;if(!o||s.length-1&&t%1==0&&t<=e}t.exports=n},3218:function(t){function e(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=e},7005:function(t){function e(t){return null!=t&&"object"==typeof t}t.exports=e},8630:function(t,e,n){var r=n(4239),o=n(5924),i=n(7005),a="[object Object]",s=Function.prototype,c=Object.prototype,u=s.toString,l=c.hasOwnProperty,f=u.call(Object);function p(t){if(!i(t)||r(t)!=a)return!1;var e=o(t);if(null===e)return!0;var n=l.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&u.call(n)==f}t.exports=p},6719:function(t,e,n){var r=n(8749),o=n(1717),i=n(1167),a=i&&i.isTypedArray,s=a?o(a):r;t.exports=s},3674:function(t,e,n){var r=n(4636),o=n(280),i=n(8612);function a(t){return i(t)?r(t):o(t)}t.exports=a},1704:function(t,e,n){var r=n(4636),o=n(313),i=n(8612);function a(t){return i(t)?r(t,!0):o(t)}t.exports=a},3857:function(t,e,n){var r=n(2980),o=n(1463),i=o((function(t,e,n){r(t,e,n)}));t.exports=i},479:function(t){function e(){return[]}t.exports=e},5062:function(t){function e(){return!1}t.exports=e},9881:function(t,e,n){var r=n(8363),o=n(1704);function i(t){return r(t,o(t))}t.exports=i},9588:function(t){function e(t,e){var n,r,o=0;function i(){var i,a,s=n,c=arguments.length;t:while(s){if(s.args.length===arguments.length){for(a=0;a=0),s.type){case"b":n=parseInt(n,10).toString(2);break;case"c":n=String.fromCharCode(parseInt(n,10));break;case"d":case"i":n=parseInt(n,10);break;case"j":n=JSON.stringify(n,null,s.width?parseInt(s.width):0);break;case"e":n=s.precision?parseFloat(n).toExponential(s.precision):parseFloat(n).toExponential();break;case"f":n=s.precision?parseFloat(n).toFixed(s.precision):parseFloat(n);break;case"g":n=s.precision?String(Number(n.toPrecision(s.precision))):parseFloat(n);break;case"o":n=(parseInt(n,10)>>>0).toString(8);break;case"s":n=String(n),n=s.precision?n.substring(0,s.precision):n;break;case"t":n=String(!!n),n=s.precision?n.substring(0,s.precision):n;break;case"T":n=Object.prototype.toString.call(n).slice(8,-1).toLowerCase(),n=s.precision?n.substring(0,s.precision):n;break;case"u":n=parseInt(n,10)>>>0;break;case"v":n=n.valueOf(),n=s.precision?n.substring(0,s.precision):n;break;case"x":n=(parseInt(n,10)>>>0).toString(16);break;case"X":n=(parseInt(n,10)>>>0).toString(16).toUpperCase();break}o.json.test(s.type)?v+=n:(!o.number.test(s.type)||f&&!s.sign?p="":(p=f?"+":"-",n=n.toString().replace(o.sign,"")),u=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",l=s.width-(p+n).length,c=s.width&&l>0?u.repeat(l):"",v+=s.align?p+n+c:"0"===u?p+c+n:c+p+n)}return v}var c=Object.create(null);function u(t){if(c[t])return c[t];var e,n=t,r=[],i=0;while(n){if(null!==(e=o.text.exec(n)))r.push(e[0]);else if(null!==(e=o.modulo.exec(n)))r.push("%");else{if(null===(e=o.placeholder.exec(n)))throw new SyntaxError("[sprintf] unexpected placeholder");if(e[2]){i|=1;var a=[],s=e[2],u=[];if(null===(u=o.key.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1]);while(""!==(s=s.substring(u[0].length)))if(null!==(u=o.key_access.exec(s)))a.push(u[1]);else{if(null===(u=o.index_access.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1])}e[2]=a}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");r.push({placeholder:e[0],param_no:e[1],keys:e[2],sign:e[3],pad_char:e[4],align:e[5],width:e[6],precision:e[7],type:e[8]})}n=n.substring(e[0].length)}return c[t]=r}e.sprintf=i,e.vsprintf=a,"undefined"!==typeof window&&(window["sprintf"]=i,window["vsprintf"]=a,r=function(){return{sprintf:i,vsprintf:a}}.call(e,n,e,t),void 0===r||(t.exports=r))}()},6455:function(t){ +(self["wpmailsmtpjsonp"]=self["wpmailsmtpjsonp"]||[]).push([[998],{3736:function(t,e,n){"use strict";function r(t,e,n,r,o,i,a,s){var c,u="function"===typeof t?t.options:t;if(e&&(u.render=e,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(c=function(t){t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,t||"undefined"===typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},u._ssrRegister=c):o&&(c=s?function(){o.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:o),c)if(u.functional){u._injectStyles=c;var l=u.render;u.render=function(t,e){return c.call(e),l(t,e)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,c):[c]}return{exports:t,options:u}}n.d(e,{Z:function(){return r}})},3165:function(t,e,n){"use strict";n.d(e,{__:function(){return J},l5:function(){return X},gB:function(){return c}});var r=n(9588),o=n.n(r),i=n(8975),a=n.n(i),s=o()(console.error);function c(t){try{for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r=0||u[o]":5,">=":5,"==":4,"!=":4,"&&":3,"||":2,"?":1,"?:":1},l=["(","?"],f={")":["("],":":["?","?:"]},p=/<=|>=|==|!=|&&|\|\||\?:|\(|!|\*|\/|%|\+|-|<|>|\?|\)|:/;var v={"!":function(t){return!t},"*":function(t,e){return t*e},"/":function(t,e){return t/e},"%":function(t,e){return t%e},"+":function(t,e){return t+e},"-":function(t,e){return t-e},"<":function(t,e){return t":function(t,e){return t>e},">=":function(t,e){return t>=e},"==":function(t,e){return t===e},"!=":function(t,e){return t!==e},"&&":function(t,e){return t&&e},"||":function(t,e){return t||e},"?:":function(t,e,n){if(t)throw e;return n}};function m(t,e){var n,r,o,i,a,s,c=[];for(n=0;n0&&void 0!==arguments[0]?arguments[0]:"default";return r.data[t]},c=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"default";r.data[e]=O(O(O({},k),r.data[e]),t),r.data[e][""]=O(O({},k[""]),r.data[e][""])},u=function(t,e){c(t,e),i()},l=function(t,e){r.data={},r.pluralForms={},u(t,e)},f=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default",e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0;return r.data[t]||c(void 0,t),r.dcnpgettext(t,e,n,o,i)},p=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default";return t},d=function(t,e){var r=f(e,void 0,t);return n?(r=n.applyFilters("i18n.gettext",r,t,e),n.applyFilters("i18n.gettext_"+p(e),r,t,e)):r},h=function(t,e,r){var o=f(r,e,t);return n?(o=n.applyFilters("i18n.gettext_with_context",o,t,e,r),n.applyFilters("i18n.gettext_with_context_"+p(r),o,t,e,r)):o},v=function(t,e,r,o){var i=f(o,void 0,t,e,r);return n?(i=n.applyFilters("i18n.ngettext",i,t,e,r,o),n.applyFilters("i18n.ngettext_"+p(o),i,t,e,r,o)):i},m=function(t,e,r,o,i){var a=f(i,o,t,e,r);return n?(a=n.applyFilters("i18n.ngettext_with_context",a,t,e,r,o,i),n.applyFilters("i18n.ngettext_with_context_"+p(i),a,t,e,r,o,i)):a},g=function(){return"rtl"===h("ltr","text direction")},y=function(t,e,o){var i,a,s=e?e+""+t:t,c=!(null===(i=r.data)||void 0===i||null===(a=i[null!==o&&void 0!==o?o:"default"])||void 0===a||!a[s]);return n&&(c=n.applyFilters("i18n.has_translation",c,t,e,o),c=n.applyFilters("i18n.has_translation_"+p(o),c,t,e,o)),c};if(t&&u(t,e),n){var w=function(t){C.test(t)&&i()};n.addAction("hookAdded","core/i18n",w),n.addAction("hookRemoved","core/i18n",w)}return{getLocaleData:s,setLocaleData:u,resetLocaleData:l,subscribe:a,__:d,_x:h,_n:v,_nx:m,isRTL:g,hasTranslation:y}},S=n(5226);function E(t){return"string"!==typeof t||""===t?(console.error("The namespace must be a non-empty string."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.\-\/]*$/.test(t)||(console.error("The namespace can only contain numbers, letters, dashes, periods, underscores and slashes."),!1)}var A=E;function $(t){return"string"!==typeof t||""===t?(console.error("The hook name must be a non-empty string."),!1):/^__/.test(t)?(console.error("The hook name cannot begin with `__`."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(t)||(console.error("The hook name can only contain numbers, letters, dashes, periods and underscores."),!1)}var T=$;function P(t,e){return function(n,r,o){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:10,a=t[e];if(T(n)&&A(r))if("function"===typeof o)if("number"===typeof i){var s={callback:o,priority:i,namespace:r};if(a[n]){var c,u=a[n].handlers;for(c=u.length;c>0;c--)if(i>=u[c-1].priority)break;c===u.length?u[c]=s:u.splice(c,0,s),a.__current.forEach((function(t){t.name===n&&t.currentIndex>=c&&t.currentIndex++}))}else a[n]={handlers:[s],runs:0};"hookAdded"!==n&&t.doAction("hookAdded",n,r,o,i)}else console.error("If specified, the hook priority must be a number.");else console.error("The hook callback must be a function.")}}var L=P;function I(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return function(r,o){var i=t[e];if(T(r)&&(n||A(o))){if(!i[r])return 0;var a=0;if(n)a=i[r].handlers.length,i[r]={runs:i[r].runs,handlers:[]};else for(var s=i[r].handlers,c=function(t){s[t].namespace===o&&(s.splice(t,1),a++,i.__current.forEach((function(e){e.name===r&&e.currentIndex>=t&&e.currentIndex--})))},u=s.length-1;u>=0;u--)c(u);return"hookRemoved"!==r&&t.doAction("hookRemoved",r,o),a}}}var N=I;function R(t,e){return function(n,r){var o=t[e];return"undefined"!==typeof r?n in o&&o[n].handlers.some((function(t){return t.namespace===r})):n in o}}var D=R;function M(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return function(r){var o=t[e];o[r]||(o[r]={handlers:[],runs:0}),o[r].runs++;var i=o[r].handlers;for(var a=arguments.length,s=new Array(a>1?a-1:0),c=1;c=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(t){l.headers[t]={}})),r.forEach(["post","put","patch"],(function(t){l.headers[t]=r.merge(a)})),t.exports=l},7288:function(t){t.exports={version:"0.24.0"}},1849:function(t){"use strict";t.exports=function(t,e){return function(){for(var n=new Array(arguments.length),r=0;r=0)return;a[e]="set-cookie"===e?(a[e]?a[e]:[]).concat([n]):a[e]?a[e]+", "+n:n}})),a):a}},8713:function(t){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},4875:function(t,e,n){"use strict";var r=n(7288).version,o={};["object","boolean","number","function","string","symbol"].forEach((function(t,e){o[t]=function(n){return typeof n===t||"a"+(e<1?"n ":" ")+t}}));var i={};function a(t,e,n){if("object"!==typeof t)throw new TypeError("options must be an object");var r=Object.keys(t),o=r.length;while(o-- >0){var i=r[o],a=e[i];if(a){var s=t[i],c=void 0===s||a(s,i,t);if(!0!==c)throw new TypeError("option "+i+" must be "+c)}else if(!0!==n)throw Error("Unknown option "+i)}}o.transitional=function(t,e,n){function o(t,e){return"[Axios v"+r+"] Transitional option '"+t+"'"+e+(n?". "+n:"")}return function(n,r,a){if(!1===t)throw new Error(o(r," has been removed"+(e?" in "+e:"")));return e&&!i[r]&&(i[r]=!0,console.warn(o(r," has been deprecated since v"+e+" and will be removed in the near future"))),!t||t(n,r,a)}},t.exports={assertOptions:a,validators:o}},4867:function(t,e,n){"use strict";var r=n(1849),o=Object.prototype.toString;function i(t){return"[object Array]"===o.call(t)}function a(t){return"undefined"===typeof t}function s(t){return null!==t&&!a(t)&&null!==t.constructor&&!a(t.constructor)&&"function"===typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}function c(t){return"[object ArrayBuffer]"===o.call(t)}function u(t){return"undefined"!==typeof FormData&&t instanceof FormData}function l(t){var e;return e="undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&t.buffer instanceof ArrayBuffer,e}function f(t){return"string"===typeof t}function p(t){return"number"===typeof t}function d(t){return null!==t&&"object"===typeof t}function h(t){if("[object Object]"!==o.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}function v(t){return"[object Date]"===o.call(t)}function m(t){return"[object File]"===o.call(t)}function g(t){return"[object Blob]"===o.call(t)}function y(t){return"[object Function]"===o.call(t)}function w(t){return d(t)&&y(t.pipe)}function b(t){return"undefined"!==typeof URLSearchParams&&t instanceof URLSearchParams}function _(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function x(){return("undefined"===typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!==typeof window&&"undefined"!==typeof document)}function O(t,e){if(null!==t&&"undefined"!==typeof t)if("object"!==typeof t&&(t=[t]),i(t))for(var n=0,r=t.length;nl)if(s=c[l++],s!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},3658:function(t,e,n){"use strict";var r=n(9781),o=n(3157),i=TypeError,a=Object.getOwnPropertyDescriptor,s=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=s?function(t,e){if(o(t)&&!a(t,"length").writable)throw i("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},4326:function(t,e,n){var r=n(1702),o=r({}.toString),i=r("".slice);t.exports=function(t){return i(o(t),8,-1)}},9920:function(t,e,n){var r=n(2597),o=n(3887),i=n(1236),a=n(3070);t.exports=function(t,e,n){for(var s=o(e),c=a.f,u=i.f,l=0;ln)throw e("Maximum allowed index exceeded");return t}},8113:function(t,e,n){var r=n(5005);t.exports=r("navigator","userAgent")||""},7392:function(t,e,n){var r,o,i=n(7854),a=n(8113),s=i.process,c=i.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(r=l.split("."),o=r[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(r=a.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/),r&&(o=+r[1]))),t.exports=o},748:function(t){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(t,e,n){var r=n(7854),o=n(1236).f,i=n(8880),a=n(8052),s=n(3072),c=n(9920),u=n(4705);t.exports=function(t,e){var n,l,f,p,d,h,v=t.target,m=t.global,g=t.stat;if(l=m?r:g?r[v]||s(v,{}):(r[v]||{}).prototype,l)for(f in e){if(d=e[f],t.dontCallGetSet?(h=o(l,f),p=h&&h.value):p=l[f],n=u(m?f:v+(g?".":"#")+f,t.forced),!n&&void 0!==p){if(typeof d==typeof p)continue;c(d,p)}(t.sham||p&&p.sham)&&i(d,"sham",!0),a(l,f,d,t)}}},7293:function(t){t.exports=function(t){try{return!!t()}catch(e){return!0}}},4374:function(t,e,n){var r=n(7293);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},6916:function(t,e,n){var r=n(4374),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:function(t,e,n){var r=n(9781),o=n(2597),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),c=s&&"something"===function(){}.name,u=s&&(!r||r&&a(i,"name").configurable);t.exports={EXISTS:s,PROPER:c,CONFIGURABLE:u}},1702:function(t,e,n){var r=n(4374),o=Function.prototype,i=o.call,a=r&&o.bind.bind(i,i);t.exports=r?a:function(t){return function(){return i.apply(t,arguments)}}},5005:function(t,e,n){var r=n(7854),o=n(614),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},8173:function(t,e,n){var r=n(9662),o=n(8554);t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},7854:function(t,e,n){var r=function(t){return t&&t.Math==Math&&t};t.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:function(t,e,n){var r=n(1702),o=n(7908),i=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return i(o(t),e)}},3501:function(t){t.exports={}},4664:function(t,e,n){var r=n(9781),o=n(7293),i=n(317);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:function(t,e,n){var r=n(1702),o=n(7293),i=n(4326),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?s(t,""):a(t)}:a},2788:function(t,e,n){var r=n(1702),o=n(614),i=n(5465),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},9909:function(t,e,n){var r,o,i,a=n(4811),s=n(7854),c=n(111),u=n(8880),l=n(2597),f=n(5465),p=n(6200),d=n(3501),h="Object already initialized",v=s.TypeError,m=s.WeakMap,g=function(t){return i(t)?o(t):r(t,{})},y=function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw v("Incompatible receiver, "+t+" required");return n}};if(a||f.state){var w=f.state||(f.state=new m);w.get=w.get,w.has=w.has,w.set=w.set,r=function(t,e){if(w.has(t))throw v(h);return e.facade=t,w.set(t,e),e},o=function(t){return w.get(t)||{}},i=function(t){return w.has(t)}}else{var b=p("state");d[b]=!0,r=function(t,e){if(l(t,b))throw v(h);return e.facade=t,u(t,b,e),e},o=function(t){return l(t,b)?t[b]:{}},i=function(t){return l(t,b)}}t.exports={set:r,get:o,has:i,enforce:g,getterFor:y}},3157:function(t,e,n){var r=n(4326);t.exports=Array.isArray||function(t){return"Array"==r(t)}},614:function(t,e,n){var r=n(4154),o=r.all;t.exports=r.IS_HTMLDDA?function(t){return"function"==typeof t||t===o}:function(t){return"function"==typeof t}},4705:function(t,e,n){var r=n(7293),o=n(614),i=/#|\.prototype\./,a=function(t,e){var n=c[s(t)];return n==l||n!=u&&(o(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},8554:function(t){t.exports=function(t){return null===t||void 0===t}},111:function(t,e,n){var r=n(614),o=n(4154),i=o.all;t.exports=o.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:r(t)||t===i}:function(t){return"object"==typeof t?null!==t:r(t)}},1913:function(t){t.exports=!1},2190:function(t,e,n){var r=n(5005),o=n(614),i=n(7976),a=n(3307),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},6244:function(t,e,n){var r=n(7466);t.exports=function(t){return r(t.length)}},6339:function(t,e,n){var r=n(7293),o=n(614),i=n(2597),a=n(9781),s=n(6530).CONFIGURABLE,c=n(2788),u=n(9909),l=u.enforce,f=u.get,p=Object.defineProperty,d=a&&!r((function(){return 8!==p((function(){}),"length",{value:8}).length})),h=String(String).split("String"),v=t.exports=function(t,e,n){"Symbol("===String(e).slice(0,7)&&(e="["+String(e).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!i(t,"name")||s&&t.name!==e)&&(a?p(t,"name",{value:e,configurable:!0}):t.name=e),d&&n&&i(n,"arity")&&t.length!==n.arity&&p(t,"length",{value:n.arity});try{n&&i(n,"constructor")&&n.constructor?a&&p(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(o){}var r=l(t);return i(r,"source")||(r.source=h.join("string"==typeof e?e:"")),t};Function.prototype.toString=v((function(){return o(this)&&f(this).source||c(this)}),"toString")},4758:function(t){var e=Math.ceil,n=Math.floor;t.exports=Math.trunc||function(t){var r=+t;return(r>0?n:e)(r)}},3070:function(t,e,n){var r=n(9781),o=n(4664),i=n(3353),a=n(9670),s=n(4948),c=TypeError,u=Object.defineProperty,l=Object.getOwnPropertyDescriptor,f="enumerable",p="configurable",d="writable";e.f=r?i?function(t,e,n){if(a(t),e=s(e),a(n),"function"===typeof t&&"prototype"===e&&"value"in n&&d in n&&!n[d]){var r=l(t,e);r&&r[d]&&(t[e]=n.value,n={configurable:p in n?n[p]:r[p],enumerable:f in n?n[f]:r[f],writable:!1})}return u(t,e,n)}:u:function(t,e,n){if(a(t),e=s(e),a(n),o)try{return u(t,e,n)}catch(r){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},1236:function(t,e,n){var r=n(9781),o=n(6916),i=n(5296),a=n(9114),s=n(5656),c=n(4948),u=n(2597),l=n(4664),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=c(e),l)try{return f(t,e)}catch(n){}if(u(t,e))return a(!o(i.f,t,e),t[e])}},8006:function(t,e,n){var r=n(6324),o=n(748),i=o.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},5181:function(t,e){e.f=Object.getOwnPropertySymbols},7976:function(t,e,n){var r=n(1702);t.exports=r({}.isPrototypeOf)},6324:function(t,e,n){var r=n(1702),o=n(2597),i=n(5656),a=n(1318).indexOf,s=n(3501),c=r([].push);t.exports=function(t,e){var n,r=i(t),u=0,l=[];for(n in r)!o(s,n)&&o(r,n)&&c(l,n);while(e.length>u)o(r,n=e[u++])&&(~a(l,n)||c(l,n));return l}},5296:function(t,e){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);e.f=o?function(t){var e=r(this,t);return!!e&&e.enumerable}:n},2140:function(t,e,n){var r=n(6916),o=n(614),i=n(111),a=TypeError;t.exports=function(t,e){var n,s;if("string"===e&&o(n=t.toString)&&!i(s=r(n,t)))return s;if(o(n=t.valueOf)&&!i(s=r(n,t)))return s;if("string"!==e&&o(n=t.toString)&&!i(s=r(n,t)))return s;throw a("Can't convert object to primitive value")}},3887:function(t,e,n){var r=n(5005),o=n(1702),i=n(8006),a=n(5181),s=n(9670),c=o([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=i.f(s(t)),n=a.f;return n?c(e,n(t)):e}},4488:function(t,e,n){var r=n(8554),o=TypeError;t.exports=function(t){if(r(t))throw o("Can't call method on "+t);return t}},6200:function(t,e,n){var r=n(2309),o=n(9711),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},5465:function(t,e,n){var r=n(7854),o=n(3072),i="__core-js_shared__",a=r[i]||o(i,{});t.exports=a},2309:function(t,e,n){var r=n(1913),o=n(5465);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.26.1",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.26.1/LICENSE",source:"https://github.com/zloirock/core-js"})},6293:function(t,e,n){var r=n(7392),o=n(7293);t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},1400:function(t,e,n){var r=n(9303),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},5656:function(t,e,n){var r=n(8361),o=n(4488);t.exports=function(t){return r(o(t))}},9303:function(t,e,n){var r=n(4758);t.exports=function(t){var e=+t;return e!==e||0===e?0:r(e)}},7466:function(t,e,n){var r=n(9303),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},7908:function(t,e,n){var r=n(4488),o=Object;t.exports=function(t){return o(r(t))}},7593:function(t,e,n){var r=n(6916),o=n(111),i=n(2190),a=n(8173),s=n(2140),c=n(5112),u=TypeError,l=c("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var n,c=a(t,l);if(c){if(void 0===e&&(e="default"),n=r(c,t,e),!o(n)||i(n))return n;throw u("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},4948:function(t,e,n){var r=n(7593),o=n(2190);t.exports=function(t){var e=r(t,"string");return o(e)?e:e+""}},6330:function(t){var e=String;t.exports=function(t){try{return e(t)}catch(n){return"Object"}}},9711:function(t,e,n){var r=n(1702),o=0,i=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},3307:function(t,e,n){var r=n(6293);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:function(t,e,n){var r=n(9781),o=n(7293);t.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},4811:function(t,e,n){var r=n(7854),o=n(614),i=r.WeakMap;t.exports=o(i)&&/native code/.test(String(i))},5112:function(t,e,n){var r=n(7854),o=n(2309),i=n(2597),a=n(9711),s=n(6293),c=n(3307),u=o("wks"),l=r.Symbol,f=l&&l["for"],p=c?l:l&&l.withoutSetter||a;t.exports=function(t){if(!i(u,t)||!s&&"string"!=typeof u[t]){var e="Symbol."+t;s&&i(l,t)?u[t]=l[t]:u[t]=c&&f?f(e):p(e)}return u[t]}},7658:function(t,e,n){"use strict";var r=n(2109),o=n(7908),i=n(6244),a=n(3658),s=n(7207),c=n(7293),u=c((function(){return 4294967297!==[].push.call({length:4294967296},1)})),l=!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}}();r({target:"Array",proto:!0,arity:1,forced:u||l},{push:function(t){var e=o(this),n=i(e),r=arguments.length;s(n+r);for(var c=0;c-1}function Vt(t,e){var n=this.__data__,r=ie(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}function qt(t){var e=-1,n=t?t.length:0;this.clear();while(++e-1&&t%1==0&&t-1&&t%1==0&&t<=i}function We(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Ge(t){return!!t&&"object"==typeof t}function Ze(t){return ze(t)?re(t):pe(t)}function Ke(){return[]}function Ye(){return!1}t.exports=De},1296:function(t,e,n){var r="Expected a function",o=NaN,i="[object Symbol]",a=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,u=/^0o[0-7]+$/i,l=parseInt,f="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,p="object"==typeof self&&self&&self.Object===Object&&self,d=f||p||Function("return this")(),h=Object.prototype,v=h.toString,m=Math.max,g=Math.min,y=function(){return d.Date.now()};function w(t,e,n){var o,i,a,s,c,u,l=0,f=!1,p=!1,d=!0;if("function"!=typeof t)throw new TypeError(r);function h(e){var n=o,r=i;return o=i=void 0,l=e,s=t.apply(r,n),s}function v(t){return l=t,c=setTimeout(x,e),f?h(t):s}function w(t){var n=t-u,r=t-l,o=e-n;return p?g(o,a-r):o}function _(t){var n=t-u,r=t-l;return void 0===u||n>=e||n<0||p&&r>=a}function x(){var t=y();if(_(t))return k(t);c=setTimeout(x,w(t))}function k(t){return c=void 0,d&&o?h(t):(o=i=void 0,s)}function C(){void 0!==c&&clearTimeout(c),l=0,o=u=i=c=void 0}function j(){return void 0===c?s:k(y())}function S(){var t=y(),n=_(t);if(o=arguments,i=this,u=t,n){if(void 0===c)return v(u);if(p)return c=setTimeout(x,e),h(u)}return void 0===c&&(c=setTimeout(x,e)),s}return e=O(e)||0,b(n)&&(f=!!n.leading,p="maxWait"in n,a=p?m(O(n.maxWait)||0,e):a,d="trailing"in n?!!n.trailing:d),S.cancel=C,S.flush=j,S}function b(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function _(t){return!!t&&"object"==typeof t}function x(t){return"symbol"==typeof t||_(t)&&v.call(t)==i}function O(t){if("number"==typeof t)return t;if(x(t))return o;if(b(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=b(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(a,"");var n=c.test(t);return n||u.test(t)?l(t.slice(2),n?2:8):s.test(t)?o:+t}t.exports=w},8394:function(t,e,n){var r="Expected a function",o="__lodash_hash_undefined__",i=1/0,a=9007199254740991,s="[object Arguments]",c="[object Function]",u="[object GeneratorFunction]",l="[object Symbol]",f=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,p=/^\w*$/,d=/^\./,h=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,v=/[\\^$.*+?()[\]{}|]/g,m=/\\(\\)?/g,g=/^\[object .+?Constructor\]$/,y=/^(?:0|[1-9]\d*)$/,w="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,b="object"==typeof self&&self&&self.Object===Object&&self,_=w||b||Function("return this")();function x(t,e){return null==t?void 0:t[e]}function O(t){var e=!1;if(null!=t&&"function"!=typeof t.toString)try{e=!!(t+"")}catch(n){}return e}var k=Array.prototype,C=Function.prototype,j=Object.prototype,S=_["__core-js_shared__"],E=function(){var t=/[^.]+$/.exec(S&&S.keys&&S.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),A=C.toString,$=j.hasOwnProperty,T=j.toString,P=RegExp("^"+A.call($).replace(v,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),L=_.Symbol,I=j.propertyIsEnumerable,N=k.splice,R=lt(_,"Map"),D=lt(Object,"create"),M=L?L.prototype:void 0,B=M?M.toString:void 0;function F(t){var e=-1,n=t?t.length:0;this.clear();while(++e-1}function X(t,e){var n=this.__data__,r=ot(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}function J(t){var e=-1,n=t?t.length:0;this.clear();while(++e-1&&t%1==0&&t-1&&t%1==0&&t<=a}function St(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Et(t){return!!t&&"object"==typeof t}function At(t){return"symbol"==typeof t||Et(t)&&T.call(t)==l}function $t(t){return null==t?"":st(t)}function Tt(t,e){return null!=t&&ft(t,e,it)}t.exports=Tt},2378:function(t,e,n){t=n.nmd(t);var r=200,o="__lodash_hash_undefined__",i=800,a=16,s=9007199254740991,c="[object Arguments]",u="[object Array]",l="[object AsyncFunction]",f="[object Boolean]",p="[object Date]",d="[object Error]",h="[object Function]",v="[object GeneratorFunction]",m="[object Map]",g="[object Number]",y="[object Null]",w="[object Object]",b="[object Proxy]",_="[object RegExp]",x="[object Set]",O="[object String]",k="[object Undefined]",C="[object WeakMap]",j="[object ArrayBuffer]",S="[object DataView]",E="[object Float32Array]",A="[object Float64Array]",$="[object Int8Array]",T="[object Int16Array]",P="[object Int32Array]",L="[object Uint8Array]",I="[object Uint8ClampedArray]",N="[object Uint16Array]",R="[object Uint32Array]",D=/[\\^$.*+?()[\]{}|]/g,M=/^\[object .+?Constructor\]$/,B=/^(?:0|[1-9]\d*)$/,F={};F[E]=F[A]=F[$]=F[T]=F[P]=F[L]=F[I]=F[N]=F[R]=!0,F[c]=F[u]=F[j]=F[f]=F[S]=F[p]=F[d]=F[h]=F[m]=F[g]=F[w]=F[_]=F[x]=F[O]=F[C]=!1;var z="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,H="object"==typeof self&&self&&self.Object===Object&&self,U=z||H||Function("return this")(),V=e&&!e.nodeType&&e,q=V&&t&&!t.nodeType&&t,W=q&&q.exports===V,G=W&&z.process,Z=function(){try{var t=q&&q.require&&q.require("util").types;return t||G&&G.binding&&G.binding("util")}catch(e){}}(),K=Z&&Z.isTypedArray;function Y(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function X(t,e){var n=-1,r=Array(t);while(++n-1}function Mt(t,e){var n=this.__data__,r=te(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this}function Bt(t){var e=-1,n=null==t?0:t.length;this.clear();while(++e1?n[o-1]:void 0,a=o>2?n[2]:void 0;i=t.length>3&&"function"==typeof i?(o--,i):void 0,a&&ke(n[0],n[1],a)&&(i=o<3?void 0:i,o=1),e=Object(e);while(++r-1&&t%1==0&&t0){if(++e>=i)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}function Ie(t){if(null!=t){try{return it.call(t)}catch(e){}try{return t+""}catch(e){}}return""}function Ne(t,e){return t===e||t!==t&&e!==e}var Re=oe(function(){return arguments}())?oe:function(t){return Ve(t)&&at.call(t,"callee")&&!gt.call(t,"callee")},De=Array.isArray;function Me(t){return null!=t&&He(t.length)&&!ze(t)}function Be(t){return Ve(t)&&Me(t)}var Fe=_t||Je;function ze(t){if(!Ue(t))return!1;var e=re(t);return e==h||e==v||e==l||e==b}function He(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=s}function Ue(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Ve(t){return null!=t&&"object"==typeof t}function qe(t){if(!Ve(t)||re(t)!=w)return!1;var e=vt(t);if(null===e)return!0;var n=at.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&it.call(n)==ut}var We=K?J(K):ae;function Ge(t){return me(t,Ze(t))}function Ze(t){return Me(t)?Xt(t,!0):se(t)}var Ke=ge((function(t,e,n){ce(t,e,n)}));function Ye(t){return function(){return t}}function Xe(t){return t}function Je(){return!1}t.exports=Ke},8552:function(t,e,n){var r=n(852),o=n(5639),i=r(o,"DataView");t.exports=i},1989:function(t,e,n){var r=n(1789),o=n(401),i=n(7667),a=n(1327),s=n(1866);function c(t){var e=-1,n=null==t?0:t.length;this.clear();while(++e1?n[i-1]:void 0,s=i>2?n[2]:void 0;a=t.length>3&&"function"==typeof a?(i--,a):void 0,s&&o(n[0],n[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);while(++rp))return!1;var h=l.get(t),v=l.get(e);if(h&&v)return h==e&&v==t;var m=-1,g=!0,y=n&s?new r:void 0;l.set(t,e),l.set(e,t);while(++m-1&&t%1==0&&t-1}t.exports=o},3399:function(t,e,n){var r=n(8470);function o(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}t.exports=o},4785:function(t,e,n){var r=n(1989),o=n(8407),i=n(7071);function a(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}t.exports=a},1285:function(t,e,n){var r=n(5050);function o(t){var e=r(this,t)["delete"](t);return this.size-=e?1:0,e}t.exports=o},6e3:function(t,e,n){var r=n(5050);function o(t){return r(this,t).get(t)}t.exports=o},9916:function(t,e,n){var r=n(5050);function o(t){return r(this,t).has(t)}t.exports=o},5265:function(t,e,n){var r=n(5050);function o(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}t.exports=o},8776:function(t){function e(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}t.exports=e},4536:function(t,e,n){var r=n(852),o=r(Object,"create");t.exports=o},9850:function(t,e,n){var r=n(5569),o=r(Object.keys,Object);t.exports=o},3498:function(t){function e(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}t.exports=e},1167:function(t,e,n){t=n.nmd(t);var r=n(1957),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o,s=a&&r.process,c=function(){try{var t=i&&i.require&&i.require("util").types;return t||s&&s.binding&&s.binding("util")}catch(e){}}();t.exports=c},2333:function(t){var e=Object.prototype,n=e.toString;function r(t){return n.call(t)}t.exports=r},5569:function(t){function e(t,e){return function(n){return t(e(n))}}t.exports=e},5357:function(t,e,n){var r=n(6874),o=Math.max;function i(t,e,n){return e=o(void 0===e?t.length-1:e,0),function(){var i=arguments,a=-1,s=o(i.length-e,0),c=Array(s);while(++a0){if(++o>=e)return arguments[0]}else o=0;return t.apply(void 0,arguments)}}t.exports=o},7465:function(t,e,n){var r=n(8407);function o(){this.__data__=new r,this.size=0}t.exports=o},3779:function(t){function e(t){var e=this.__data__,n=e["delete"](t);return this.size=e.size,n}t.exports=e},7599:function(t){function e(t){return this.__data__.get(t)}t.exports=e},6783:function(t){function e(t){return this.__data__.has(t)}t.exports=e},4309:function(t,e,n){var r=n(8407),o=n(7071),i=n(3369),a=200;function s(t,e){var n=this.__data__;if(n instanceof r){var s=n.__data__;if(!o||s.length-1&&t%1==0&&t<=e}t.exports=n},3218:function(t){function e(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=e},7005:function(t){function e(t){return null!=t&&"object"==typeof t}t.exports=e},8630:function(t,e,n){var r=n(4239),o=n(5924),i=n(7005),a="[object Object]",s=Function.prototype,c=Object.prototype,u=s.toString,l=c.hasOwnProperty,f=u.call(Object);function p(t){if(!i(t)||r(t)!=a)return!1;var e=o(t);if(null===e)return!0;var n=l.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&u.call(n)==f}t.exports=p},6719:function(t,e,n){var r=n(8749),o=n(1717),i=n(1167),a=i&&i.isTypedArray,s=a?o(a):r;t.exports=s},3674:function(t,e,n){var r=n(4636),o=n(280),i=n(8612);function a(t){return i(t)?r(t):o(t)}t.exports=a},1704:function(t,e,n){var r=n(4636),o=n(313),i=n(8612);function a(t){return i(t)?r(t,!0):o(t)}t.exports=a},3857:function(t,e,n){var r=n(2980),o=n(1463),i=o((function(t,e,n){r(t,e,n)}));t.exports=i},479:function(t){function e(){return[]}t.exports=e},5062:function(t){function e(){return!1}t.exports=e},9881:function(t,e,n){var r=n(8363),o=n(1704);function i(t){return r(t,o(t))}t.exports=i},9588:function(t){function e(t,e){var n,r,o=0;function i(){var i,a,s=n,c=arguments.length;t:while(s){if(s.args.length===arguments.length){for(a=0;a=0),s.type){case"b":n=parseInt(n,10).toString(2);break;case"c":n=String.fromCharCode(parseInt(n,10));break;case"d":case"i":n=parseInt(n,10);break;case"j":n=JSON.stringify(n,null,s.width?parseInt(s.width):0);break;case"e":n=s.precision?parseFloat(n).toExponential(s.precision):parseFloat(n).toExponential();break;case"f":n=s.precision?parseFloat(n).toFixed(s.precision):parseFloat(n);break;case"g":n=s.precision?String(Number(n.toPrecision(s.precision))):parseFloat(n);break;case"o":n=(parseInt(n,10)>>>0).toString(8);break;case"s":n=String(n),n=s.precision?n.substring(0,s.precision):n;break;case"t":n=String(!!n),n=s.precision?n.substring(0,s.precision):n;break;case"T":n=Object.prototype.toString.call(n).slice(8,-1).toLowerCase(),n=s.precision?n.substring(0,s.precision):n;break;case"u":n=parseInt(n,10)>>>0;break;case"v":n=n.valueOf(),n=s.precision?n.substring(0,s.precision):n;break;case"x":n=(parseInt(n,10)>>>0).toString(16);break;case"X":n=(parseInt(n,10)>>>0).toString(16).toUpperCase();break}o.json.test(s.type)?v+=n:(!o.number.test(s.type)||f&&!s.sign?p="":(p=f?"+":"-",n=n.toString().replace(o.sign,"")),u=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",l=s.width-(p+n).length,c=s.width&&l>0?u.repeat(l):"",v+=s.align?p+n+c:"0"===u?p+c+n:c+p+n)}return v}var c=Object.create(null);function u(t){if(c[t])return c[t];var e,n=t,r=[],i=0;while(n){if(null!==(e=o.text.exec(n)))r.push(e[0]);else if(null!==(e=o.modulo.exec(n)))r.push("%");else{if(null===(e=o.placeholder.exec(n)))throw new SyntaxError("[sprintf] unexpected placeholder");if(e[2]){i|=1;var a=[],s=e[2],u=[];if(null===(u=o.key.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1]);while(""!==(s=s.substring(u[0].length)))if(null!==(u=o.key_access.exec(s)))a.push(u[1]);else{if(null===(u=o.index_access.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1])}e[2]=a}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");r.push({placeholder:e[0],param_no:e[1],keys:e[2],sign:e[3],pad_char:e[4],align:e[5],width:e[6],precision:e[7],type:e[8]})}n=n.substring(e[0].length)}return c[t]=r}e.sprintf=i,e.vsprintf=a,"undefined"!==typeof window&&(window["sprintf"]=i,window["vsprintf"]=a,r=function(){return{sprintf:i,vsprintf:a}}.call(e,n,e,t),void 0===r||(t.exports=r))}()},6455:function(t){ /*! -* sweetalert2 v9.17.4 +* sweetalert2 v9.17.2 * Released under the MIT License. */ -(function(e,n){t.exports=n()})(0,(function(){"use strict";function t(e){return t="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(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;ne?1:t1&&void 0!==arguments[1]?arguments[1]:"flex";t.style.opacity="",t.style.display=e},_t=function(t){t.style.opacity="",t.style.display="none"},xt=function(t,e,n){e?bt(t,n):_t(t)},Ot=function(t){return!(!t||!(t.offsetWidth||t.offsetHeight||t.getClientRects().length))},kt=function(t){return!!(t.scrollHeight>t.clientHeight)},Ct=function(t){var e=window.getComputedStyle(t),n=parseFloat(e.getPropertyValue("animation-duration")||"0"),r=parseFloat(e.getPropertyValue("transition-duration")||"0");return n>0||r>0},jt=function(t,e){if("function"===typeof t.contains)return t.contains(e)},St=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=tt();Ot(n)&&(e&&(n.style.transition="none",n.style.width="100%"),setTimeout((function(){n.style.transition="width ".concat(t/1e3,"s linear"),n.style.width="0%"}),10))},Et=function(){var t=tt(),e=parseInt(window.getComputedStyle(t).width);t.style.removeProperty("transition"),t.style.width="100%";var n=parseInt(window.getComputedStyle(t).width),r=parseInt(e/n*100);t.style.removeProperty("transition"),t.style.width="".concat(r,"%")},At=function(){return"undefined"===typeof window||"undefined"===typeof document},$t='\n
\n
\n
    \n
    \n
    \n
    \n
    \n
    \n \n

    \n \n
    \n
    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n').replace(/(^|\n)\s*/g,""),Tt=function(){var t=D();return!!t&&(t.parentNode.removeChild(t),gt([document.documentElement,document.body],[N["no-backdrop"],N["toast-shown"],N["has-column"]]),!0)},Pt=function(t){Nr.isVisible()&&dt!==t.target.value&&Nr.resetValidationMessage(),dt=t.target.value},Lt=function(){var t=V(),e=yt(t,N.input),n=yt(t,N.file),r=t.querySelector(".".concat(N.range," input")),o=t.querySelector(".".concat(N.range," output")),i=yt(t,N.select),a=t.querySelector(".".concat(N.checkbox," input")),s=yt(t,N.textarea);e.oninput=Pt,n.onchange=Pt,i.onchange=Pt,a.onchange=Pt,s.oninput=Pt,r.oninput=function(t){Pt(t),o.value=r.value},r.onchange=function(t){Pt(t),r.nextSibling.value=r.value}},It=function(t){return"string"===typeof t?document.querySelector(t):t},Nt=function(t){var e=F();e.setAttribute("role",t.toast?"alert":"dialog"),e.setAttribute("aria-live",t.toast?"polite":"assertive"),t.toast||e.setAttribute("aria-modal","true")},Rt=function(t){"rtl"===window.getComputedStyle(t).direction&&mt(D(),N.rtl)},Dt=function(t){var e=Tt();if(At())_("SweetAlert2 requires document to initialize");else{var n=document.createElement("div");n.className=N.container,e&&mt(n,N["no-transition"]),ct(n,$t);var r=It(t.target);r.appendChild(n),Nt(t),Rt(r),Lt()}},Mt=function(e,n){e instanceof HTMLElement?n.appendChild(e):"object"===t(e)?Bt(e,n):e&&ct(n,e)},Bt=function(t,e){t.jquery?Ft(e,t):ct(e,t.toString())},Ft=function(t,e){if(t.textContent="",0 in e)for(var n=0;n in e;n++)t.appendChild(e[n].cloneNode(!0));else t.appendChild(e.cloneNode(!0))},zt=function(){if(At())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)&&"undefined"!==typeof t.style[n])return e[n];return!1}(),Ht=function(){var t=document.createElement("div");t.className=N["scrollbar-measure"],document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},Ut=function(t,e){var n=X(),r=K(),o=Y();e.showConfirmButton||e.showCancelButton||_t(n),ft(n,e,"actions"),qt(r,"confirm",e),qt(o,"cancel",e),e.buttonsStyling?Vt(r,o,e):(gt([r,o],N.styled),r.style.backgroundColor=r.style.borderLeftColor=r.style.borderRightColor="",o.style.backgroundColor=o.style.borderLeftColor=o.style.borderRightColor=""),e.reverseButtons&&r.parentNode.insertBefore(o,r)};function Vt(t,e,n){if(mt([t,e],N.styled),n.confirmButtonColor&&(t.style.backgroundColor=n.confirmButtonColor),n.cancelButtonColor&&(e.style.backgroundColor=n.cancelButtonColor),!at()){var r=window.getComputedStyle(t).getPropertyValue("background-color");t.style.borderLeftColor=r,t.style.borderRightColor=r}}function qt(t,e,n){xt(t,n["show".concat(g(e),"Button")],"inline-block"),ct(t,n["".concat(e,"ButtonText")]),t.setAttribute("aria-label",n["".concat(e,"ButtonAriaLabel")]),t.className=N[e],ft(t,n,"".concat(e,"Button")),mt(t,n["".concat(e,"ButtonClass")])}function Wt(t,e){"string"===typeof e?t.style.background=e:e||mt([document.documentElement,document.body],N["no-backdrop"])}function Gt(t,e){e in N?mt(t,N[e]):(b('The "position" parameter is not valid, defaulting to "center"'),mt(t,N.center))}function Zt(t,e){if(e&&"string"===typeof e){var n="grow-".concat(e);n in N&&mt(t,N[n])}}var Kt=function(t,e){var n=D();if(n){Wt(n,e.backdrop),!e.backdrop&&e.allowOutsideClick&&b('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),Gt(n,e.position),Zt(n,e.grow),ft(n,e,"container");var r=document.body.getAttribute("data-swal2-queue-step");r&&(n.setAttribute("data-queue-step",r),document.body.removeAttribute("data-swal2-queue-step"))}},Yt={promise:new WeakMap,innerParams:new WeakMap,domCache:new WeakMap},Xt=["input","file","range","select","radio","checkbox","textarea"],Jt=function(t,e){var n=V(),r=Yt.innerParams.get(t),o=!r||e.input!==r.input;Xt.forEach((function(t){var r=N[t],i=yt(n,r);ee(t,e.inputAttributes),i.className=r,o&&_t(i)})),e.input&&(o&&Qt(e),ne(e))},Qt=function(t){if(!ie[t.input])return _('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "'.concat(t.input,'"'));var e=oe(t.input),n=ie[t.input](e,t);bt(n),setTimeout((function(){ht(n)}))},te=function(t){for(var e=0;en?"".concat(e,"px"):null};new MutationObserver(o).observe(t,{attributes:!0,attributeFilter:["style"]})}return t};var ae=function(t,e){var n=V().querySelector("#".concat(N.content));e.html?(Mt(e.html,n),bt(n,"block")):e.text?(n.textContent=e.text,bt(n,"block")):_t(n),Jt(t,e),ft(V(),e,"content")},se=function(t,e){var n=Q();xt(n,e.footer),e.footer&&Mt(e.footer,n),ft(n,e,"footer")},ce=function(t,e){var n=et();ct(n,e.closeButtonHtml),ft(n,e,"closeButton"),xt(n,e.showCloseButton),n.setAttribute("aria-label",e.closeButtonAriaLabel)},ue=function(t,e){var n=Yt.innerParams.get(t);if(n&&e.icon===n.icon&&H())ft(H(),e,"icon");else if(le(),e.icon)if(-1!==Object.keys(R).indexOf(e.icon)){var r=M(".".concat(N.icon,".").concat(R[e.icon]));bt(r),pe(r,e),fe(),ft(r,e,"icon"),mt(r,e.showClass.icon)}else _('Unknown icon! Expected "success", "error", "warning", "info" or "question", got "'.concat(e.icon,'"'))},le=function(){for(var t=z(),e=0;e\n \n
    \n
    \n ');else if("error"===e.icon)ct(t,'\n \n \n \n \n ');else{var n={question:"?",warning:"!",info:"i"};ct(t,de(n[e.icon]))}},de=function(t){return'
    ').concat(t,"
    ")},he=function(t,e){var n=W();if(!e.imageUrl)return _t(n);bt(n,""),n.setAttribute("src",e.imageUrl),n.setAttribute("alt",e.imageAlt),wt(n,"width",e.imageWidth),wt(n,"height",e.imageHeight),n.className=N.image,ft(n,e,"image")},ve=[],me=function(t){var e=this;ve=t;var n=function(t,e){ve=[],t(e)},r=[];return new Promise((function(t){(function o(i,a){i=e.progressSteps.length&&b("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),e.progressSteps.forEach((function(t,o){var i=be(t);if(n.appendChild(i),o===r&&mt(i,N["active-progress-step"]),o!==e.progressSteps.length-1){var a=_e(e);n.appendChild(a)}}))},Oe=function(t,e){var n=U();xt(n,e.title||e.titleText),e.title&&Mt(e.title,n),e.titleText&&(n.innerText=e.titleText),ft(n,e,"title")},ke=function(t,e){var n=J();ft(n,e,"header"),xe(t,e),ue(t,e),he(t,e),Oe(t,e),ce(t,e)},Ce=function(t,e){var n=F();wt(n,"width",e.width),wt(n,"padding",e.padding),e.background&&(n.style.background=e.background),je(n,e)},je=function(t,e){t.className="".concat(N.popup," ").concat(Ot(t)?e.showClass.popup:""),e.toast?(mt([document.documentElement,document.body],N["toast-shown"]),mt(t,N.toast)):mt(t,N.modal),ft(t,e,"popup"),"string"===typeof e.customClass&&mt(t,e.customClass),e.icon&&mt(t,N["icon-".concat(e.icon)])},Se=function(t,e){Ce(t,e),Kt(t,e),ke(t,e),ae(t,e),Ut(t,e),se(t,e),"function"===typeof e.onRender&&e.onRender(F())},Ee=function(){return Ot(F())},Ae=function(){return K()&&K().click()},$e=function(){return Y()&&Y().click()};function Te(){for(var t=this,e=arguments.length,n=new Array(e),r=0;rwindow.innerHeight&&(st.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight="".concat(st.previousBodyPadding+Ht(),"px"))},an=function(){null!==st.previousBodyPadding&&(document.body.style.paddingRight="".concat(st.previousBodyPadding,"px"),st.previousBodyPadding=null)},sn=function(){var t=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1;if(t&&!ut(document.body,N.iosfix)){var e=document.body.scrollTop;document.body.style.top="".concat(-1*e,"px"),mt(document.body,N.iosfix),un(),cn()}},cn=function(){var t=!navigator.userAgent.match(/(CriOS|FxiOS|EdgiOS|YaBrowser|UCBrowser)/i);if(t){var e=44;F().scrollHeight>window.innerHeight-e&&(D().style.paddingBottom="".concat(e,"px"))}},un=function(){var t,e=D();e.ontouchstart=function(e){t=ln(e.target)},e.ontouchmove=function(e){t&&(e.preventDefault(),e.stopPropagation())}},ln=function(t){var e=D();return t===e||!(kt(e)||"INPUT"===t.tagName||kt(V())&&V().contains(t))},fn=function(){if(ut(document.body,N.iosfix)){var t=parseInt(document.body.style.top,10);gt(document.body,N.iosfix),document.body.style.top="",document.body.scrollTop=-1*t}},pn=function(){return!!window.MSInputMethodContext&&!!document.documentMode},dn=function(){var t=D(),e=F();t.style.removeProperty("align-items"),e.offsetTop<0&&(t.style.alignItems="flex-start")},hn=function(){"undefined"!==typeof window&&pn()&&(dn(),window.addEventListener("resize",dn))},vn=function(){"undefined"!==typeof window&&pn()&&window.removeEventListener("resize",dn)},mn=function(){var t=w(document.body.children);t.forEach((function(t){t===D()||jt(t,D())||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")),t.setAttribute("aria-hidden","true"))}))},gn=function(){var t=w(document.body.children);t.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")}))},yn={swalPromiseResolve:new WeakMap};function wn(t,e,n,r){n?kn(t,r):(De().then((function(){return kn(t,r)})),Ne.keydownTarget.removeEventListener("keydown",Ne.keydownHandler,{capture:Ne.keydownListenerCapture}),Ne.keydownHandlerAdded=!1),e.parentNode&&!document.body.getAttribute("data-swal2-queue-step")&&e.parentNode.removeChild(e),ot()&&(an(),fn(),vn(),gn()),bn()}function bn(){gt([document.documentElement,document.body],[N.shown,N["height-auto"],N["no-backdrop"],N["toast-shown"],N["toast-column"]])}function _n(t){var e=F();if(e){var n=Yt.innerParams.get(this);if(n&&!ut(e,n.hideClass.popup)){var r=yn.swalPromiseResolve.get(this);gt(e,n.showClass.popup),mt(e,n.hideClass.popup);var o=D();gt(o,n.showClass.backdrop),mt(o,n.hideClass.backdrop),xn(this,e,n),"undefined"!==typeof t?(t.isDismissed="undefined"!==typeof t.dismiss,t.isConfirmed="undefined"===typeof t.dismiss):t={isDismissed:!0,isConfirmed:!1},r(t||{})}}}var xn=function(t,e,n){var r=D(),o=zt&&Ct(e),i=n.onClose,a=n.onAfterClose;null!==i&&"function"===typeof i&&i(e),o?On(t,e,r,a):wn(t,r,it(),a)},On=function(t,e,n,r){Ne.swalCloseEventFinishedCallback=wn.bind(null,t,n,it(),r),e.addEventListener(zt,(function(t){t.target===e&&(Ne.swalCloseEventFinishedCallback(),delete Ne.swalCloseEventFinishedCallback)}))},kn=function(t,e){setTimeout((function(){"function"===typeof e&&e(),t._destroy()}))};function Cn(t,e,n){var r=Yt.domCache.get(t);e.forEach((function(t){r[t].disabled=n}))}function jn(t,e){if(!t)return!1;if("radio"===t.type)for(var n=t.parentNode.parentNode,r=n.querySelectorAll("input"),o=0;o")),Dt(t)}var Bn=function(t){var e=D(),n=F();"function"===typeof t.onBeforeOpen&&t.onBeforeOpen(n);var r=window.getComputedStyle(document.body),o=r.overflowY;Un(e,n,t),zn(e,n),ot()&&(Hn(e,t.scrollbarPadding,o),mn()),it()||Ne.previousActiveElement||(Ne.previousActiveElement=document.activeElement),"function"===typeof t.onOpen&&setTimeout((function(){return t.onOpen(n)})),gt(e,N["no-transition"])};function Fn(t){var e=F();if(t.target===e){var n=D();e.removeEventListener(zt,Fn),n.style.overflowY="auto"}}var zn=function(t,e){zt&&Ct(e)?(t.style.overflowY="hidden",e.addEventListener(zt,Fn)):t.style.overflowY="auto"},Hn=function(t,e,n){sn(),hn(),e&&"hidden"!==n&&on(),setTimeout((function(){t.scrollTop=0}))},Un=function(t,e,n){mt(t,n.showClass.backdrop),bt(e),mt(e,n.showClass.popup),mt([document.documentElement,document.body],N.shown),n.heightAuto&&n.backdrop&&!n.toast&&mt([document.documentElement,document.body],N["height-auto"])},Vn=function(t,e){"select"===e.input||"radio"===e.input?Kn(t,e):-1!==["text","email","number","tel","textarea"].indexOf(e.input)&&(j(e.inputValue)||E(e.inputValue))&&Yn(t,e)},qn=function(t,e){var n=t.getInput();if(!n)return null;switch(e.input){case"checkbox":return Wn(n);case"radio":return Gn(n);case"file":return Zn(n);default:return e.inputAutoTrim?n.value.trim():n.value}},Wn=function(t){return t.checked?1:0},Gn=function(t){return t.checked?t.value:null},Zn=function(t){return t.files.length?null!==t.getAttribute("multiple")?t.files:t.files[0]:null},Kn=function(e,n){var r=V(),o=function(t){return Xn[n.input](r,Jn(t),n)};j(n.inputOptions)||E(n.inputOptions)?(Le(),S(n.inputOptions).then((function(t){e.hideLoading(),o(t)}))):"object"===t(n.inputOptions)?o(n.inputOptions):_("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(t(n.inputOptions)))},Yn=function(t,e){var n=t.getInput();_t(n),S(e.inputValue).then((function(r){n.value="number"===e.input?parseFloat(r)||0:"".concat(r),bt(n),n.focus(),t.hideLoading()}))["catch"]((function(e){_("Error in inputValue promise: ".concat(e)),n.value="",bt(n),n.focus(),t.hideLoading()}))},Xn={select:function(t,e,n){var r=yt(t,N.select),o=function(t,e,r){var o=document.createElement("option");o.value=r,ct(o,e),n.inputValue.toString()===r.toString()&&(o.selected=!0),t.appendChild(o)};e.forEach((function(t){var e=t[0],n=t[1];if(Array.isArray(n)){var i=document.createElement("optgroup");i.label=e,i.disabled=!1,r.appendChild(i),n.forEach((function(t){return o(i,t[1],t[0])}))}else o(r,n,e)})),r.focus()},radio:function(t,e,n){var r=yt(t,N.radio);e.forEach((function(t){var e=t[0],o=t[1],i=document.createElement("input"),a=document.createElement("label");i.type="radio",i.name=N.radio,i.value=e,n.inputValue.toString()===e.toString()&&(i.checked=!0);var s=document.createElement("span");ct(s,o),s.className=N.label,a.appendChild(i),a.appendChild(s),r.appendChild(a)}));var o=r.querySelectorAll("input");o.length&&o[0].focus()}},Jn=function e(n){var r=[];return"undefined"!==typeof Map&&n instanceof Map?n.forEach((function(n,o){var i=n;"object"===t(i)&&(i=e(i)),r.push([o,i])})):Object.keys(n).forEach((function(o){var i=n[o];"object"===t(i)&&(i=e(i)),r.push([o,i])})),r},Qn=function(t,e){t.disableButtons(),e.input?er(t,e):rr(t,e,!0)},tr=function(t,e){t.disableButtons(),e(A.cancel)},er=function(t,e){var n=qn(t,e);if(e.inputValidator){t.disableInput();var r=Promise.resolve().then((function(){return S(e.inputValidator(n,e.validationMessage))}));r.then((function(r){t.enableButtons(),t.enableInput(),r?t.showValidationMessage(r):rr(t,e,n)}))}else t.getInput().checkValidity()?rr(t,e,n):(t.enableButtons(),t.showValidationMessage(e.validationMessage))},nr=function(t,e){t.closePopup({value:e})},rr=function(t,e,n){if(e.showLoaderOnConfirm&&Le(),e.preConfirm){t.resetValidationMessage();var r=Promise.resolve().then((function(){return S(e.preConfirm(n,e.validationMessage))}));r.then((function(e){Ot(Z())||!1===e?t.hideLoading():nr(t,"undefined"===typeof e?n:e)}))}else nr(t,n)},or=function(t,e,n,r){e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1),n.toast||(e.keydownHandler=function(e){return cr(t,e,r)},e.keydownTarget=n.keydownListenerCapture?window:F(),e.keydownListenerCapture=n.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)},ir=function(t,e,n){for(var r=rt(),o=0;o3&&setTimeout((function(){document.body.style.pointerEvents="none";var t=document.createElement("audio");t.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3",t.loop=!0,document.body.appendChild(t),setTimeout((function(){t.play()["catch"]((function(){}))}),2500)}),500):localStorage.setItem("swal-initiation","".concat(Lr))}o(Pr.prototype,Tr),o(Pr,en),Object.keys(Tr).forEach((function(t){Pr[t]=function(){var e;if(Er)return(e=Er)[t].apply(e,arguments)}})),Pr.DismissReason=A,Pr.version="9.17.2";var Nr=Pr;return Nr["default"]=Nr,Nr})),"undefined"!==typeof this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2),"undefined"!=typeof document&&function(t,e){var n=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=e);else try{n.innerHTML=e}catch(t){n.innerText=e}}(document,'.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;padding:0}.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;padding:0;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,.swal2-container.swal2-noanimation{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;padding:0 1.8em}.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!important;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-container{position:absolute;right:0;bottom:0;left:0;height:.25em;overflow:hidden;border-bottom-right-radius:.3125em;border-bottom-left-radius:.3125em}.swal2-timer-progress-bar{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;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 1.6em;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::-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}')},7575:function(t,e,n){"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},r(t)}n.d(e,{ZP:function(){return en}});var o=n(4503),i=n(5226);function a(t,e){for(var n=0;ne?1:t1&&void 0!==arguments[1]?arguments[1]:"flex";t.style.opacity="",t.style.display=e},_t=function(t){t.style.opacity="",t.style.display="none"},xt=function(t,e,n){e?bt(t,n):_t(t)},Ot=function(t){return!(!t||!(t.offsetWidth||t.offsetHeight||t.getClientRects().length))},kt=function(t){return!!(t.scrollHeight>t.clientHeight)},Ct=function(t){var e=window.getComputedStyle(t),n=parseFloat(e.getPropertyValue("animation-duration")||"0"),r=parseFloat(e.getPropertyValue("transition-duration")||"0");return n>0||r>0},jt=function(t,e){if("function"===typeof t.contains)return t.contains(e)},St=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=tt();Ot(n)&&(e&&(n.style.transition="none",n.style.width="100%"),setTimeout((function(){n.style.transition="width ".concat(t/1e3,"s linear"),n.style.width="0%"}),10))},Et=function(){var t=tt(),e=parseInt(window.getComputedStyle(t).width);t.style.removeProperty("transition"),t.style.width="100%";var n=parseInt(window.getComputedStyle(t).width),r=parseInt(e/n*100);t.style.removeProperty("transition"),t.style.width="".concat(r,"%")},At=function(){return"undefined"===typeof window||"undefined"===typeof document},$t='\n
    \n
    \n
      \n
      \n
      \n
      \n
      \n
      \n \n

      \n \n
      \n
      \n
      \n \n \n
      \n \n \n
      \n \n
      \n \n \n
      \n
      \n
      \n \n \n
      \n
      \n
      \n
      \n
      \n
      \n').replace(/(^|\n)\s*/g,""),Tt=function(){var t=D();return!!t&&(t.parentNode.removeChild(t),gt([document.documentElement,document.body],[N["no-backdrop"],N["toast-shown"],N["has-column"]]),!0)},Pt=function(t){Lr.isVisible()&&dt!==t.target.value&&Lr.resetValidationMessage(),dt=t.target.value},Lt=function(){var t=V(),e=yt(t,N.input),n=yt(t,N.file),r=t.querySelector(".".concat(N.range," input")),o=t.querySelector(".".concat(N.range," output")),i=yt(t,N.select),a=t.querySelector(".".concat(N.checkbox," input")),s=yt(t,N.textarea);e.oninput=Pt,n.onchange=Pt,i.onchange=Pt,a.onchange=Pt,s.oninput=Pt,r.oninput=function(t){Pt(t),o.value=r.value},r.onchange=function(t){Pt(t),r.nextSibling.value=r.value}},It=function(t){return"string"===typeof t?document.querySelector(t):t},Nt=function(t){var e=F();e.setAttribute("role",t.toast?"alert":"dialog"),e.setAttribute("aria-live",t.toast?"polite":"assertive"),t.toast||e.setAttribute("aria-modal","true")},Rt=function(t){"rtl"===window.getComputedStyle(t).direction&&mt(D(),N.rtl)},Dt=function(t){var e=Tt();if(At())_("SweetAlert2 requires document to initialize");else{var n=document.createElement("div");n.className=N.container,e&&mt(n,N["no-transition"]),ct(n,$t);var r=It(t.target);r.appendChild(n),Nt(t),Rt(r),Lt()}},Mt=function(e,n){e instanceof HTMLElement?n.appendChild(e):"object"===t(e)?Bt(e,n):e&&ct(n,e)},Bt=function(t,e){t.jquery?Ft(e,t):ct(e,t.toString())},Ft=function(t,e){if(t.textContent="",0 in e)for(var n=0;n in e;n++)t.appendChild(e[n].cloneNode(!0));else t.appendChild(e.cloneNode(!0))},zt=function(){if(At())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)&&"undefined"!==typeof t.style[n])return e[n];return!1}(),Ht=function(){var t=document.createElement("div");t.className=N["scrollbar-measure"],document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},Ut=function(t,e){var n=X(),r=K(),o=Y();e.showConfirmButton||e.showCancelButton||_t(n),ft(n,e,"actions"),qt(r,"confirm",e),qt(o,"cancel",e),e.buttonsStyling?Vt(r,o,e):(gt([r,o],N.styled),r.style.backgroundColor=r.style.borderLeftColor=r.style.borderRightColor="",o.style.backgroundColor=o.style.borderLeftColor=o.style.borderRightColor=""),e.reverseButtons&&r.parentNode.insertBefore(o,r)};function Vt(t,e,n){if(mt([t,e],N.styled),n.confirmButtonColor&&(t.style.backgroundColor=n.confirmButtonColor),n.cancelButtonColor&&(e.style.backgroundColor=n.cancelButtonColor),!at()){var r=window.getComputedStyle(t).getPropertyValue("background-color");t.style.borderLeftColor=r,t.style.borderRightColor=r}}function qt(t,e,n){xt(t,n["show".concat(g(e),"Button")],"inline-block"),ct(t,n["".concat(e,"ButtonText")]),t.setAttribute("aria-label",n["".concat(e,"ButtonAriaLabel")]),t.className=N[e],ft(t,n,"".concat(e,"Button")),mt(t,n["".concat(e,"ButtonClass")])}function Wt(t,e){"string"===typeof e?t.style.background=e:e||mt([document.documentElement,document.body],N["no-backdrop"])}function Gt(t,e){e in N?mt(t,N[e]):(b('The "position" parameter is not valid, defaulting to "center"'),mt(t,N.center))}function Zt(t,e){if(e&&"string"===typeof e){var n="grow-".concat(e);n in N&&mt(t,N[n])}}var Kt=function(t,e){var n=D();if(n){Wt(n,e.backdrop),!e.backdrop&&e.allowOutsideClick&&b('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),Gt(n,e.position),Zt(n,e.grow),ft(n,e,"container");var r=document.body.getAttribute("data-swal2-queue-step");r&&(n.setAttribute("data-queue-step",r),document.body.removeAttribute("data-swal2-queue-step"))}},Yt={promise:new WeakMap,innerParams:new WeakMap,domCache:new WeakMap},Xt=["input","file","range","select","radio","checkbox","textarea"],Jt=function(t,e){var n=V(),r=Yt.innerParams.get(t),o=!r||e.input!==r.input;Xt.forEach((function(t){var r=N[t],i=yt(n,r);ee(t,e.inputAttributes),i.className=r,o&&_t(i)})),e.input&&(o&&Qt(e),ne(e))},Qt=function(t){if(!ie[t.input])return _('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "'.concat(t.input,'"'));var e=oe(t.input),n=ie[t.input](e,t);bt(n),setTimeout((function(){ht(n)}))},te=function(t){for(var e=0;en?"".concat(e,"px"):null};new MutationObserver(o).observe(t,{attributes:!0,attributeFilter:["style"]})}return t};var ae=function(t,e){var n=V().querySelector("#".concat(N.content));e.html?(Mt(e.html,n),bt(n,"block")):e.text?(n.textContent=e.text,bt(n,"block")):_t(n),Jt(t,e),ft(V(),e,"content")},se=function(t,e){var n=Q();xt(n,e.footer),e.footer&&Mt(e.footer,n),ft(n,e,"footer")},ce=function(t,e){var n=et();ct(n,e.closeButtonHtml),ft(n,e,"closeButton"),xt(n,e.showCloseButton),n.setAttribute("aria-label",e.closeButtonAriaLabel)},ue=function(t,e){var n=Yt.innerParams.get(t);if(n&&e.icon===n.icon&&H())ft(H(),e,"icon");else if(le(),e.icon)if(-1!==Object.keys(R).indexOf(e.icon)){var r=M(".".concat(N.icon,".").concat(R[e.icon]));bt(r),pe(r,e),fe(),ft(r,e,"icon"),mt(r,e.showClass.icon)}else _('Unknown icon! Expected "success", "error", "warning", "info" or "question", got "'.concat(e.icon,'"'))},le=function(){for(var t=z(),e=0;e\n \n
      \n
      \n ');else if("error"===e.icon)ct(t,'\n \n \n \n \n ');else{var n={question:"?",warning:"!",info:"i"};ct(t,de(n[e.icon]))}},de=function(t){return'
      ').concat(t,"
      ")},he=function(t,e){var n=W();if(!e.imageUrl)return _t(n);bt(n,""),n.setAttribute("src",e.imageUrl),n.setAttribute("alt",e.imageAlt),wt(n,"width",e.imageWidth),wt(n,"height",e.imageHeight),n.className=N.image,ft(n,e,"image")},ve=[],me=function(t){var e=this;ve=t;var n=function(t,e){ve=[],t(e)},r=[];return new Promise((function(t){(function o(i,a){i=e.progressSteps.length&&b("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),e.progressSteps.forEach((function(t,o){var i=be(t);if(n.appendChild(i),o===r&&mt(i,N["active-progress-step"]),o!==e.progressSteps.length-1){var a=_e(e);n.appendChild(a)}}))},Oe=function(t,e){var n=U();xt(n,e.title||e.titleText),e.title&&Mt(e.title,n),e.titleText&&(n.innerText=e.titleText),ft(n,e,"title")},ke=function(t,e){var n=J();ft(n,e,"header"),xe(t,e),ue(t,e),he(t,e),Oe(t,e),ce(t,e)},Ce=function(t,e){var n=F();wt(n,"width",e.width),wt(n,"padding",e.padding),e.background&&(n.style.background=e.background),je(n,e)},je=function(t,e){t.className="".concat(N.popup," ").concat(Ot(t)?e.showClass.popup:""),e.toast?(mt([document.documentElement,document.body],N["toast-shown"]),mt(t,N.toast)):mt(t,N.modal),ft(t,e,"popup"),"string"===typeof e.customClass&&mt(t,e.customClass),e.icon&&mt(t,N["icon-".concat(e.icon)])},Se=function(t,e){Ce(t,e),Kt(t,e),ke(t,e),ae(t,e),Ut(t,e),se(t,e),"function"===typeof e.onRender&&e.onRender(F())},Ee=function(){return Ot(F())},Ae=function(){return K()&&K().click()},$e=function(){return Y()&&Y().click()};function Te(){for(var t=this,e=arguments.length,n=new Array(e),r=0;rwindow.innerHeight&&(st.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight="".concat(st.previousBodyPadding+Ht(),"px"))},an=function(){null!==st.previousBodyPadding&&(document.body.style.paddingRight="".concat(st.previousBodyPadding,"px"),st.previousBodyPadding=null)},sn=function(){var t=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1;if(t&&!ut(document.body,N.iosfix)){var e=document.body.scrollTop;document.body.style.top="".concat(-1*e,"px"),mt(document.body,N.iosfix),un(),cn()}},cn=function(){var t=!navigator.userAgent.match(/(CriOS|FxiOS|EdgiOS|YaBrowser|UCBrowser)/i);if(t){var e=44;F().scrollHeight>window.innerHeight-e&&(D().style.paddingBottom="".concat(e,"px"))}},un=function(){var t,e=D();e.ontouchstart=function(e){t=ln(e.target)},e.ontouchmove=function(e){t&&(e.preventDefault(),e.stopPropagation())}},ln=function(t){var e=D();return t===e||!(kt(e)||"INPUT"===t.tagName||kt(V())&&V().contains(t))},fn=function(){if(ut(document.body,N.iosfix)){var t=parseInt(document.body.style.top,10);gt(document.body,N.iosfix),document.body.style.top="",document.body.scrollTop=-1*t}},pn=function(){return!!window.MSInputMethodContext&&!!document.documentMode},dn=function(){var t=D(),e=F();t.style.removeProperty("align-items"),e.offsetTop<0&&(t.style.alignItems="flex-start")},hn=function(){"undefined"!==typeof window&&pn()&&(dn(),window.addEventListener("resize",dn))},vn=function(){"undefined"!==typeof window&&pn()&&window.removeEventListener("resize",dn)},mn=function(){var t=w(document.body.children);t.forEach((function(t){t===D()||jt(t,D())||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")),t.setAttribute("aria-hidden","true"))}))},gn=function(){var t=w(document.body.children);t.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")}))},yn={swalPromiseResolve:new WeakMap};function wn(t,e,n,r){n?kn(t,r):(De().then((function(){return kn(t,r)})),Ne.keydownTarget.removeEventListener("keydown",Ne.keydownHandler,{capture:Ne.keydownListenerCapture}),Ne.keydownHandlerAdded=!1),e.parentNode&&!document.body.getAttribute("data-swal2-queue-step")&&e.parentNode.removeChild(e),ot()&&(an(),fn(),vn(),gn()),bn()}function bn(){gt([document.documentElement,document.body],[N.shown,N["height-auto"],N["no-backdrop"],N["toast-shown"],N["toast-column"]])}function _n(t){var e=F();if(e){var n=Yt.innerParams.get(this);if(n&&!ut(e,n.hideClass.popup)){var r=yn.swalPromiseResolve.get(this);gt(e,n.showClass.popup),mt(e,n.hideClass.popup);var o=D();gt(o,n.showClass.backdrop),mt(o,n.hideClass.backdrop),xn(this,e,n),"undefined"!==typeof t?(t.isDismissed="undefined"!==typeof t.dismiss,t.isConfirmed="undefined"===typeof t.dismiss):t={isDismissed:!0,isConfirmed:!1},r(t||{})}}}var xn=function(t,e,n){var r=D(),o=zt&&Ct(e),i=n.onClose,a=n.onAfterClose;null!==i&&"function"===typeof i&&i(e),o?On(t,e,r,a):wn(t,r,it(),a)},On=function(t,e,n,r){Ne.swalCloseEventFinishedCallback=wn.bind(null,t,n,it(),r),e.addEventListener(zt,(function(t){t.target===e&&(Ne.swalCloseEventFinishedCallback(),delete Ne.swalCloseEventFinishedCallback)}))},kn=function(t,e){setTimeout((function(){"function"===typeof e&&e(),t._destroy()}))};function Cn(t,e,n){var r=Yt.domCache.get(t);e.forEach((function(t){r[t].disabled=n}))}function jn(t,e){if(!t)return!1;if("radio"===t.type)for(var n=t.parentNode.parentNode,r=n.querySelectorAll("input"),o=0;o")),Dt(t)}var Bn=function(t){var e=D(),n=F();"function"===typeof t.onBeforeOpen&&t.onBeforeOpen(n);var r=window.getComputedStyle(document.body),o=r.overflowY;Un(e,n,t),zn(e,n),ot()&&(Hn(e,t.scrollbarPadding,o),mn()),it()||Ne.previousActiveElement||(Ne.previousActiveElement=document.activeElement),"function"===typeof t.onOpen&&setTimeout((function(){return t.onOpen(n)})),gt(e,N["no-transition"])};function Fn(t){var e=F();if(t.target===e){var n=D();e.removeEventListener(zt,Fn),n.style.overflowY="auto"}}var zn=function(t,e){zt&&Ct(e)?(t.style.overflowY="hidden",e.addEventListener(zt,Fn)):t.style.overflowY="auto"},Hn=function(t,e,n){sn(),hn(),e&&"hidden"!==n&&on(),setTimeout((function(){t.scrollTop=0}))},Un=function(t,e,n){mt(t,n.showClass.backdrop),bt(e),mt(e,n.showClass.popup),mt([document.documentElement,document.body],N.shown),n.heightAuto&&n.backdrop&&!n.toast&&mt([document.documentElement,document.body],N["height-auto"])},Vn=function(t,e){"select"===e.input||"radio"===e.input?Kn(t,e):-1!==["text","email","number","tel","textarea"].indexOf(e.input)&&(j(e.inputValue)||E(e.inputValue))&&Yn(t,e)},qn=function(t,e){var n=t.getInput();if(!n)return null;switch(e.input){case"checkbox":return Wn(n);case"radio":return Gn(n);case"file":return Zn(n);default:return e.inputAutoTrim?n.value.trim():n.value}},Wn=function(t){return t.checked?1:0},Gn=function(t){return t.checked?t.value:null},Zn=function(t){return t.files.length?null!==t.getAttribute("multiple")?t.files:t.files[0]:null},Kn=function(e,n){var r=V(),o=function(t){return Xn[n.input](r,Jn(t),n)};j(n.inputOptions)||E(n.inputOptions)?(Le(),S(n.inputOptions).then((function(t){e.hideLoading(),o(t)}))):"object"===t(n.inputOptions)?o(n.inputOptions):_("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(t(n.inputOptions)))},Yn=function(t,e){var n=t.getInput();_t(n),S(e.inputValue).then((function(r){n.value="number"===e.input?parseFloat(r)||0:"".concat(r),bt(n),n.focus(),t.hideLoading()}))["catch"]((function(e){_("Error in inputValue promise: ".concat(e)),n.value="",bt(n),n.focus(),t.hideLoading()}))},Xn={select:function(t,e,n){var r=yt(t,N.select),o=function(t,e,r){var o=document.createElement("option");o.value=r,ct(o,e),n.inputValue.toString()===r.toString()&&(o.selected=!0),t.appendChild(o)};e.forEach((function(t){var e=t[0],n=t[1];if(Array.isArray(n)){var i=document.createElement("optgroup");i.label=e,i.disabled=!1,r.appendChild(i),n.forEach((function(t){return o(i,t[1],t[0])}))}else o(r,n,e)})),r.focus()},radio:function(t,e,n){var r=yt(t,N.radio);e.forEach((function(t){var e=t[0],o=t[1],i=document.createElement("input"),a=document.createElement("label");i.type="radio",i.name=N.radio,i.value=e,n.inputValue.toString()===e.toString()&&(i.checked=!0);var s=document.createElement("span");ct(s,o),s.className=N.label,a.appendChild(i),a.appendChild(s),r.appendChild(a)}));var o=r.querySelectorAll("input");o.length&&o[0].focus()}},Jn=function e(n){var r=[];return"undefined"!==typeof Map&&n instanceof Map?n.forEach((function(n,o){var i=n;"object"===t(i)&&(i=e(i)),r.push([o,i])})):Object.keys(n).forEach((function(o){var i=n[o];"object"===t(i)&&(i=e(i)),r.push([o,i])})),r},Qn=function(t,e){t.disableButtons(),e.input?er(t,e):rr(t,e,!0)},tr=function(t,e){t.disableButtons(),e(A.cancel)},er=function(t,e){var n=qn(t,e);if(e.inputValidator){t.disableInput();var r=Promise.resolve().then((function(){return S(e.inputValidator(n,e.validationMessage))}));r.then((function(r){t.enableButtons(),t.enableInput(),r?t.showValidationMessage(r):rr(t,e,n)}))}else t.getInput().checkValidity()?rr(t,e,n):(t.enableButtons(),t.showValidationMessage(e.validationMessage))},nr=function(t,e){t.closePopup({value:e})},rr=function(t,e,n){if(e.showLoaderOnConfirm&&Le(),e.preConfirm){t.resetValidationMessage();var r=Promise.resolve().then((function(){return S(e.preConfirm(n,e.validationMessage))}));r.then((function(e){Ot(Z())||!1===e?t.hideLoading():nr(t,"undefined"===typeof e?n:e)}))}else nr(t,n)},or=function(t,e,n,r){e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1),n.toast||(e.keydownHandler=function(e){return cr(t,e,r)},e.keydownTarget=n.keydownListenerCapture?window:F(),e.keydownListenerCapture=n.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)},ir=function(t,e,n){for(var r=rt(),o=0;o: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;padding:0 1.8em}.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!important;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-container{position:absolute;right:0;bottom:0;left:0;height:.25em;overflow:hidden;border-bottom-right-radius:.3125em;border-bottom-left-radius:.3125em}.swal2-timer-progress-bar{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;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 1.6em;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::-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}')},7575:function(t,e,n){"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},r(t)}n.d(e,{ZP:function(){return en}});var o=n(4503),i=n(5226);function a(t,e){for(var n=0;n0?e("div",{staticClass:"wp-mail-smtp-step-below-content",domProps:{innerHTML:t._s(t.content_below)}}):t._e(),t.display_exit_link?e("p",{staticClass:"wp-mail-smtp-exit-link"},[e("a",{attrs:{href:t.exit_href}},[t._v(t._s(t.text_exit_link))])]):t._e()])])],1)},P=[],M=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-container"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-timeline"},[t._l(t.steps,(function(i,a){return[a>0?e("div",{key:a+"line",class:t.lineClass(a)}):t._e(),e("div",{key:a,class:t.stepClass(a)},[e("inline-svg",{staticClass:"icon icon-success",attrs:{src:s(7579),width:"10",height:"10"}}),e("inline-svg",{staticClass:"icon icon-failed",attrs:{src:s(3531),width:"8",height:"11"}})],1)]}))],2)])},E=[],T={name:"TheWizardTimeline",data(){return{steps:this.$wizard_steps}},methods:{stepClass(t){let e="wp-mail-smtp-setup-wizard-timeline-step";const s=this.steps.findIndex((t=>this.$route.name.includes(t)));return(tthis.$route.name.includes(t)));return t<=s&&(e+=" wp-mail-smtp-setup-wizard-timeline-line-active"),e}}},F=T,I=(0,d.Z)(F,M,E,!1,null,null,null),B=I.exports,D={name:"SetupWizardSteps",components:{TheWizardHeader:v,TheWizardTimeline:B},data(){return{text_exit_link:(0,l.__)("Close and exit the Setup Wizard","wp-mail-smtp"),exit_href:this.$wpms.exit_url,content_below:""}},computed:{display_exit_link:function(){return!this.$route.name.includes("check_configuration_step")}},methods:{displayContentBelow:function(t){this.content_below=t}},mounted(){this.$store.dispatch("$_app/start_loading"),Promise.all([this.$store.dispatch("$_settings/getSettings"),this.$store.dispatch("$_plugins/getPlugins")]).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))}},z=D,O=(0,d.Z)(z,S,P,!1,null,null,null),W=O.exports,L=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-import"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("form",[e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-row"},[e("settings-input-radios-with-icons",{attrs:{name:"import_from_plugin",options:t.options},model:{value:t.selectedImport,callback:function(e){t.selectedImport=e},expression:"selectedImport"}})],1)])])],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"skip_step"},domProps:{textContent:t._s(t.text_skip)},on:{click:function(e){return e.preventDefault(),t.nextStep.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step",disabled:null===t.selectedImport},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},R=[],Q=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-input-radios-with-icons"},t._l(t.options,(function(i){return e("label",{key:i.value,class:t.labelClass(i),attrs:{for:"wp-mail-smtp-settings-radio-"+t.name+"["+i.value+"]"},on:{click:function(e){return t.clicked(i)}}},[e("span",{class:t.titleClass(i.value)},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}})],1),i.logo.length?e("img",{staticClass:"wp-mail-smtp-logo-icon",attrs:{src:i.logo,alt:i.label}}):t._e(),e("input",{directives:[{name:"model",rawName:"v-model",value:t.selectedImport,expression:"selectedImport"}],attrs:{id:"wp-mail-smtp-settings-radio-"+t.name+"["+i.value+"]",type:"radio",name:t.name,autocomplete:"off",disabled:i.disabled||!1},domProps:{value:i.value,checked:t.isChecked(i.value),checked:t._q(t.selectedImport,i.value)},on:{change:function(e){t.selectedImport=i.value}}}),e("span",{staticClass:"wp-mail-smtp-styled-radio-text"},[t._v(t._s(i.label))]),i.is_pro?e("inline-svg",{staticClass:"wp-mail-smtp-pro-badge",attrs:{src:s(330),width:"46",height:"26"}}):t._e()],1)})),0)},N=[],Z={name:"SettingsInputRadiosWithIcons",props:{options:Array,name:String,value:String},data(){return{has_error:!1}},computed:{selectedImport:{get(){return this.value},set(t){this.$emit("input",t)}}},methods:{titleClass(t){let e="wp-mail-smtp-styled-radio";return this.isChecked(t)&&(e+=" wp-mail-smtp-styled-radio-checked"),e},labelClass(t){let e="";return this.isChecked(t.value)&&(e+=" wp-mail-smtp-styled-radio-label-checked"),t.disabled&&(e+=" wp-mail-smtp-styled-radio-label-disabled"),t.readonly&&(e+=" wp-mail-smtp-styled-radio-label-readonly"),e},isChecked(t){return t===this.selectedImport},clicked(t){t.is_pro&&this.$emit("clicked-disabled",t)}}},U=Z,H=(0,d.Z)(U,Q,N,!1,null,"5cf7b21e",null),G=H.exports,Y=function(){var t=this,e=t._self._c;return e("p",{staticClass:"wp-mail-smtp-setup-wizard-step-count"},[t._v(" "+t._s(t.stepValue)+" ")])},V=[],K={name:"TheWizardStepCounter",computed:{stepValue:function(){const t=this.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))+1;return(0,l.gB)((0,l.__)("Step %1$s of %2$s","wp-mail-smtp"),t,this.$wizard_steps.length)}}},J=K,q=(0,d.Z)(J,Y,V,!1,null,"44fd4a93",null),X=q.exports,j={name:"WizardStepImport",components:{SettingsInputRadiosWithIcons:G,ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Import data from your current plugins","wp-mail-smtp"),text_header_subtitle:(0,l.__)("We have detected other SMTP plugins installed on your website. Select which plugin's data you would like to import to WP Mail SMTP.","wp-mail-smtp"),text_save:(0,l.__)("Import Data and Continue","wp-mail-smtp"),text_skip:(0,l.__)("Skip this Step","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),options:[{value:"easy-smtp",label:(0,l.__)("Easy WP SMTP","wp-mail-smtp"),logo:s(9515),disabled:!this.$wpms.other_smtp_plugins.includes("easy-smtp"),readonly:!this.$wpms.other_smtp_plugins.includes("easy-smtp")},{value:"fluent-smtp",label:(0,l.__)("FluentSMTP","wp-mail-smtp"),logo:s(5529),disabled:!this.$wpms.other_smtp_plugins.includes("fluent-smtp"),readonly:!this.$wpms.other_smtp_plugins.includes("fluent-smtp")},{value:"post-smtp-mailer",label:(0,l.__)("Post SMTP Mailer","wp-mail-smtp"),logo:s(6557),disabled:!this.$wpms.other_smtp_plugins.includes("post-smtp-mailer"),readonly:!this.$wpms.other_smtp_plugins.includes("post-smtp-mailer")},{value:"smtp-mailer",label:(0,l.__)("SMTP Mailer","wp-mail-smtp"),logo:s(5543),disabled:!this.$wpms.other_smtp_plugins.includes("smtp-mailer"),readonly:!this.$wpms.other_smtp_plugins.includes("smtp-mailer")},{value:"wp-smtp",label:(0,l.__)("WP SMTP","wp-mail-smtp"),logo:s(7445),disabled:!this.$wpms.other_smtp_plugins.includes("wp-smtp"),readonly:!this.$wpms.other_smtp_plugins.includes("wp-smtp")}],selectedImport:null}},methods:{handleSubmit(){null!==this.selectedImport&&(this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/importOtherPlugin",{value:this.selectedImport}).then((t=>{t?this.nextStep():this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")})))},nextStep(){this.$next_step()},previousStep(){this.$previous_step()}}},$=j,tt=(0,d.Z)($,L,R,!1,null,null,null),et=tt.exports,st=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-choose-mailer"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}}),t.mailer_set_via_constants?e("div",{staticClass:"wp-mail-smtp-notice wp-mail-smtp-notice--info"},[e("p",{domProps:{innerHTML:t._s(t.text_mailer_set_via_constants)}})]):t._e(),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("form",[e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-row wp-mail-smtp-setup-wizard-form-row-highlight"},[e("h3",[t._v(t._s(t.text_recommended_mailers))]),e("settings-input-radios-with-icons",{attrs:{name:"choose_mailer",options:t.recommended_options},model:{value:t.selectedMailer,callback:function(e){t.selectedMailer=e},expression:"selectedMailer"}})],1),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-row"},[e("settings-input-radios-with-icons",{attrs:{name:"choose_mailer",options:t.options},on:{"clicked-disabled":t.clickedDisabledOption},model:{value:t.selectedMailer,callback:function(e){t.selectedMailer=e},expression:"selectedMailer"}})],1)])])],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step",disabled:null===t.selectedMailer||"mail"===t.selectedMailer},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},it=[],at=s(629),nt={name:"WizardStepChooseMailer",components:{SettingsInputRadiosWithIcons:G,ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Choose Your SMTP Mailer","wp-mail-smtp"),text_header_subtitle:(0,l.gB)((0,l.__)("Which mailer would you like to use to send emails? Not sure which mailer to choose? Check out our %1$scomplete mailer guide%2$s for details on each option.","wp-mail-smtp"),'',""),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_recommended_mailers:(0,l.__)("Recommended Mailers","wp-mail-smtp"),text_mailer_set_via_constants:(0,l.__)("Your mailer is already configured in a WP Mail SMTP constant, so the options below have been disabled. To change your mailer, please edit or remove the WPMS_MAILER constant in your wp-config.php file.","wp-mail-smtp"),mailer_set_via_constants:this.$wpms.defined_constants.includes("WPMS_MAILER"),recommended_options:[{value:"sendlayer",label:this.$wpms.mailer_options["sendlayer"].title,logo:s(9857),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"smtpcom",label:this.$wpms.mailer_options["smtpcom"].title,logo:s(7536),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"sendinblue",label:this.$wpms.mailer_options["sendinblue"].title,logo:s(4522),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")}],options:[{value:"amazonses",label:this.$wpms.mailer_options["amazonses"].title,logo:s(7557),is_pro:!this.$wpms.is_pro,notice:this.$wpms.mailer_options["amazonses"].edu_notice,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:!this.$wpms.is_pro||this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"gmail",label:this.$wpms.mailer_options["gmail"].title,logo:s(7526),notice:this.$wpms.mailer_options["gmail"].edu_notice,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"mailgun",label:this.$wpms.mailer_options["mailgun"].title,logo:s(5567),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"outlook",label:this.$wpms.is_pro?(0,l.__)("Microsoft 365 / Outlook","wp-mail-smtp"):this.$wpms.mailer_options["outlook"].title,logo:s(6703),is_pro:!this.$wpms.is_pro,notice:this.$wpms.mailer_options["outlook"].edu_notice,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:!this.$wpms.is_pro||this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"postmark",label:this.$wpms.mailer_options["postmark"].title,logo:s(5699),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"sendgrid",label:this.$wpms.mailer_options["sendgrid"].title,logo:s(2763),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"sparkpost",label:this.$wpms.mailer_options["sparkpost"].title,logo:s(2091),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"zoho",label:this.$wpms.mailer_options["zoho"].title,logo:s(9349),is_pro:!this.$wpms.is_pro,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:!this.$wpms.is_pro||this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"smtp",label:this.$wpms.mailer_options["smtp"].title,logo:s(450),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")}],selectedMailer:this.currentMailer}},watch:{currentMailer:function(t){this.selectedMailer=t}},computed:{...(0,at.Se)({currentMailer:"$_settings/mailer"}),selectedMailerOptions:function(){return this.recommended_options.concat(this.options).find((t=>t.value===this.selectedMailer))}},methods:{handleSubmit(t,e=!1){null!==this.selectedMailer&&"mail"!==this.selectedMailer&&(void 0===this.selectedMailerOptions.notice||e?(this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/updateSettings",{value:{mail:{mailer:this.selectedMailer}}}).then((t=>{t.success?(this.$store.dispatch("$_settings/setMailer",this.selectedMailer),this.nextStep()):this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))):this.$swal({title:this.selectedMailerOptions.label+" "+(0,l.__)("Mailer","wp-mail-smtp"),html:this.selectedMailerOptions.notice,width:650,showCloseButton:!0,allowOutsideClick:!1,allowEscapeKey:!1,allowEnterKey:!1,customClass:{container:"wp-mail-smtp-swal"},confirmButtonText:(0,l.__)("I Understand, Continue","wp-mail-smtp"),cancelButtonText:(0,l.__)("Choose a Different Mailer","wp-mail-smtp"),showCancelButton:!0,reverseButtons:!0}).then((t=>{t.value?this.handleSubmit(null,!0):void 0===t.dismiss||"cancel"!==t.dismiss||this.$wpms.defined_constants.includes("WPMS_MAILER")||(this.selectedMailer=null)})))},nextStep(){const t=this.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))+1;this.$router.push({name:`${this.$wizard_steps[t]}_${this.selectedMailer}`})},previousStep(){this.$previous_step()},clickedDisabledOption(t){var e=/(\?)/.test(this.$wpms.education.upgrade_url)?"&":"?",i=this.$wpms.education.upgrade_url+e+"utm_content="+encodeURIComponent(t.value);this.$swal({title:t.label+" "+(0,l.__)("is a PRO Feature","wp-mail-smtp"),html:`

      ${this.$wpms.education.upgrade_text.replace("%mailer%",t.label)}

      \n\t\t\t\t\t\t\t

      ${this.$wpms.education.upgrade_button}

      \n\t\t\t\t\t\t\t

      ${this.$wpms.education.upgrade_bonus}

      \n\t\t\t\t\t\t\t

      ${this.$wpms.education.upgrade_doc}

      `,width:550,imageUrl:s(4523),imageWidth:31,imageHeight:35,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-upgrade-popup"},showConfirmButton:!1})}},mounted(){this.selectedMailer=this.currentMailer}},ot=nt,rt=(0,d.Z)(ot,st,it,!1,null,"6ddea424",null),lt=rt.exports,mt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-configure-mailer"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configure-mailer-header"},[e("div",{staticClass:"wp-mail-smtp-configure-mailer-header-container"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("span",{staticClass:"wp-mail-smtp-configure-mailer-logo"},[e("inline-svg",{attrs:{src:t.logo(t.mailer),height:"40"}})],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("router-view",{ref:"mailerConfiguration"})],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step",disabled:null===t.mailer||!0===t.blocked_step},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},pt=[],ct=s(7452),_t={name:"WizardStepConfigureMailer",components:{ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Configure Mailer Settings","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Below, we'll show you all of the settings required to set up this mailer.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp")}},computed:{...(0,at.Se)({mailer:"$_settings/mailer"}),...(0,ct.vn)("$_wizard",["blocked_step"])},methods:{handleSubmit(){return!this.blocked_step&&(this.$refs.mailerConfiguration.areRequiredFieldsValid()?(this.$store.dispatch("$_app/start_loading"),void this.$store.dispatch("$_settings/saveCurrentSettings").then((t=>{t.success?this.$next_step():this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))):(this.$required_fields_modal(),!1))},previousStep(){this.blocked_step=!1,this.$previous_step()},logo(t){return t="mail"===t?"smtp":t,s(5016)(`./${t}.svg`)}}},dt=_t,ut=(0,d.Z)(dt,mt,pt,!1,null,null,null),ht=ut.exports,gt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-plugin-features"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-plugin-features-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"wp-mail-smtp-plugin-features-list"},[e("settings-input-long-checkbox",{attrs:{value:!0,name:"improved_deliverability",label:t.text_improved_email_deliverability,description:t.text_improved_email_deliverability_desc,disabled:""}}),e("settings-input-long-checkbox",{attrs:{value:!0,name:"error_tracking",label:t.text_error_tracking,description:t.text_error_tracking_desc,disabled:""}}),t.contact_form_already_installed?t._e():e("settings-input-long-checkbox",{attrs:{name:"smart_contact_form",label:t.text_smart_contact_form,description:t.text_smart_contact_form_desc},model:{value:t.smart_contact_form,callback:function(e){t.smart_contact_form=e},expression:"smart_contact_form"}}),t.is_pro?t._e():e("settings-input-long-checkbox",{attrs:{name:"summary_report_email",label:t.text_summary_report_email,description:t.text_summary_report_email_desc},model:{value:t.summary_report_email,callback:function(e){t.summary_report_email=e},expression:"summary_report_email"}}),e("settings-input-long-checkbox",{attrs:{name:"email_log",constant:"WPMS_LOGS_ENABLED",label:t.text_email_log,description:t.text_email_log_desc,show_pro:!t.is_pro},on:{input:t.emailLogEnabledChanged},model:{value:t.email_log,callback:function(e){t.email_log=e},expression:"email_log"}}),t.email_log||!t.is_pro?e("settings-input-long-checkbox",{attrs:{value:t.complete_email_report,name:"complete_email_report",label:t.text_complete_email_report,description:t.text_complete_email_report_desc,show_pro:!t.is_pro,disabled:!!t.is_pro},model:{value:t.complete_email_report,callback:function(e){t.complete_email_report=e},expression:"complete_email_report"}}):t._e(),t.is_pro&&t.email_log?e("settings-input-long-checkbox",{attrs:{name:"summary_report_email",constant:"WPMS_SUMMARY_REPORT_EMAIL_DISABLED",label:t.text_summary_report_email,description:t.text_summary_report_email_desc},model:{value:t.summary_report_email,callback:function(e){t.summary_report_email=e},expression:"summary_report_email"}}):t._e(),e("settings-input-long-checkbox",{attrs:{name:"instant_email_alert_input",label:t.text_instant_email_alert,description:t.text_instant_email_alert_desc,constant:"WPMS_ALERT_EMAIL_SEND_TO",show_pro:!t.is_pro},model:{value:t.instant_email_alert,callback:function(e){t.instant_email_alert=e},expression:"instant_email_alert"}}),t.is_pro?t._e():e("settings-input-long-checkbox",{attrs:{name:"manage_notifications",label:t.text_manage_notifications,description:t.text_manage_notifications_desc,show_pro:!t.is_pro},model:{value:t.manage_notifications,callback:function(e){t.manage_notifications=e},expression:"manage_notifications"}}),t.is_multisite&&!t.is_pro?e("settings-input-long-checkbox",{attrs:{name:"network_settings",label:t.text_network_settings,description:t.text_network_settings_desc,show_pro:!t.is_pro},model:{value:t.network_settings,callback:function(e){t.network_settings=e},expression:"network_settings"}}):t._e()],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},ft=[],wt=function(){var t=this,e=t._self._c;return e("label",{staticClass:"settings-input-long-checkbox",class:{"settings-input-long-checkbox-checked":t.value,"settings-input-long-checkbox-disabled":t.disabled||t.is_constant_set},attrs:{for:"wp-mail-smtp-settings-long-checkbox-"+t.name}},[e("div",{staticClass:"settings-input-long-checkbox-header"},[e("span",{staticClass:"title-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.show_pro?e("inline-svg",{staticClass:"wp-mail-smtp-pro-badge",attrs:{src:s(330),width:"46",height:"24"}}):t._e()],1),t.description?e("p",{staticClass:"description"},[t._v(t._s(t.description))]):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()]),e("span",{staticClass:"settings-input-long-checkbox-container"},[e("span",{staticClass:"checkbox",class:{"checkbox-checked":t.value,"checkbox-disabled":t.disabled||t.is_constant_set}},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}})],1),e("input",{attrs:{id:"wp-mail-smtp-settings-long-checkbox-"+t.name,type:"checkbox",name:t.name,disabled:t.disabled||t.is_constant_set},domProps:{checked:t.value},on:{input:function(e){return t.$emit("input",e.target.checked)}}})])])},At=[],bt={name:"SettingsInputLongCheckbox",props:{label:String,name:String,value:Boolean,description:String,constant:String,disabled:Boolean,show_pro:Boolean},computed:{is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}}},vt=bt,xt=(0,d.Z)(vt,wt,At,!1,null,null,null),kt=xt.exports,yt={name:"WizardStepPluginFeatures",components:{ContentHeader:h,TheWizardStepCounter:X,SettingsInputLongCheckbox:kt},data(){return{text_header_title:(0,l.__)("Which email features do you want to enable?","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Make sure you're getting the most out of WP Mail SMTP. Just check all of the features you'd like to use, and we'll go ahead and enable those for you.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_improved_email_deliverability:(0,l.__)("Improved Email Deliverability","wp-mail-smtp"),text_improved_email_deliverability_desc:(0,l.__)("Ensure your emails are sent successfully and reliably.","wp-mail-smtp"),text_error_tracking:(0,l.__)("Email Error Tracking","wp-mail-smtp"),text_error_tracking_desc:(0,l.__)("Easily spot errors causing delivery issues.","wp-mail-smtp"),text_smart_contact_form:(0,l.__)("Smart Contact Form","wp-mail-smtp"),text_smart_contact_form_desc:(0,l.__)("Create beautiful contact forms with just a few clicks.","wp-mail-smtp"),text_email_log:(0,l.__)("Detailed Email Logs","wp-mail-smtp"),text_email_log_desc:(0,l.__)("Keep records of every email that's sent out from your website.","wp-mail-smtp"),text_instant_email_alert:(0,l.__)("Instant Email Alerts","wp-mail-smtp"),text_instant_email_alert_desc:(0,l.__)("Get notifications via email, SMS, Slack, or webhook when emails fail to send.","wp-mail-smtp"),text_complete_email_report:(0,l.__)("Complete Email Reports","wp-mail-smtp"),text_complete_email_report_desc:(0,l.__)("See the delivery status, track opens and clicks, and create deliverability graphs.","wp-mail-smtp"),text_summary_report_email:(0,l.__)("Weekly Email Summary","wp-mail-smtp"),text_summary_report_email_desc:(0,l.__)("Get statistics about emails you've sent.","wp-mail-smtp"),text_manage_notifications:(0,l.__)("Manage Default Notifications","wp-mail-smtp"),text_manage_notifications_desc:(0,l.__)("Control which email notifications your WordPress site sends.","wp-mail-smtp"),text_network_settings:(0,l.__)("Multisite Network Settings","wp-mail-smtp"),text_network_settings_desc:(0,l.__)("Save time with powerful WordPress Multisite controls.","wp-mail-smtp"),is_pro:this.$wpms.is_pro,is_multisite:this.$wpms.is_multisite,email_log:!1,complete_email_report:!!this.$wpms.is_pro,summary_report_email:!1,manage_notifications:!1,network_settings:!1}},computed:{...(0,at.Se)({contact_form_already_installed:"$_plugins/contact_form_plugin_already_installed",email_log_setting:"$_settings/email_log_enabled",summary_report_email_setting:"$_settings/summary_report_email_enabled"}),...(0,ct.vn)("$_plugins",{smart_contact_form:"smart_contact_form_setting"}),...(0,ct.vn)("$_settings",{alert_email_connections:"settings.alert_email.connections",instant_email_alert:"settings.alert_email.enabled"})},watch:{smart_contact_form:function(t){if(this.contact_form_already_installed)return!1;this.showWPFormsPluginInstallFooterNotice(t)},contact_form_already_installed:function(t){t&&this.$emit("displayContentBelow","")},email_log_setting:function(t){this.email_log=t},summary_report_email_setting:function(t){this.summary_report_email=t}},methods:{handleSubmit(){this.$store.dispatch("$_app/start_loading");let t=[],e={value:{general:{summary_report_email_disabled:!this.summary_report_email}}};if(t.push(this.$store.dispatch("$_settings/setSummaryReportEmail",!this.summary_report_email)),this.is_pro){e.value={...e.value,logs:{enabled:this.email_log}},t.push(this.$store.dispatch("$_settings/setLogs",this.email_log));let s={enabled:this.instant_email_alert};this.instant_email_alert&&0===Object.values(this.alert_email_connections).length&&(s.connections=[{send_to:this.$wpms.current_user_email}]),e.value={...e.value,alert_email:s}}if(t.push(this.$store.dispatch("$_settings/updateSettings",e)),this.smart_contact_form&&!this.contact_form_already_installed&&t.push(this.$store.dispatch("$_plugins/installPlugin","wpforms-lite")),!this.is_pro){const e=[];this.email_log&&e.push("email_log"),this.complete_email_report&&e.push("complete_email_report"),this.instant_email_alert&&e.push("instant_email_alert"),this.manage_notifications&&e.push("manage_notifications"),this.network_settings&&e.push("network_settings"),t.push(this.$store.dispatch("$_settings/savePluginFeatures",e))}Promise.all(t).then((t=>{const e=t.filter((t=>t.success));if(e.length===t.length){this.$emit("displayContentBelow","");let t=this.is_pro&&!this.$store.getters["$_settings/email_log_enabled"]?1:0;this.$next_step(t)}})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},previousStep(){this.$emit("displayContentBelow","");const t=this.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))-1;this.$router.push({name:`${this.$wizard_steps[t]}_${this.$store.getters["$_settings/mailer"]}`})},showWPFormsPluginInstallFooterNotice(t){const e=t?`

      ${(0,l.__)("The following plugin will be installed for free: WPForms","wp-mail-smtp")}

      `:"";this.$emit("displayContentBelow",e)},emailLogEnabledChanged(){"0"===this.$wpms.completed_time&&sessionStorage.setItem("wp_mail_smtp_email_log_enabled_changed","true")}},mounted(){if(this.showWPFormsPluginInstallFooterNotice(this.smart_contact_form&&!this.contact_form_already_installed),this.$wpms.is_pro&&"0"===this.$wpms.completed_time&&"true"!==sessionStorage.getItem("wp_mail_smtp_email_log_enabled_changed")?this.email_log=!0:this.email_log=this.$store.getters["$_settings/email_log_enabled"],this.summary_report_email=this.$store.getters["$_settings/summary_report_email_enabled"],!this.$wpms.is_pro){const t=this.$store.getters["$_settings/plugin_features"];t.includes("email_log")&&(this.email_log=!0),t.includes("complete_email_report")&&(this.complete_email_report=!0),t.includes("instant_email_alert")&&(this.instant_email_alert=!0),t.includes("manage_notifications")&&(this.manage_notifications=!0),t.includes("network_settings")&&(this.network_settings=!0)}}},Ct=yt,St=(0,d.Z)(Ct,gt,ft,!1,null,null,null),Pt=St.exports,Mt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-help-improve"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-help-improve-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("settings-input-text",{attrs:{name:"email",type:"email",label:t.text_email_label,description:t.text_email_description},model:{value:t.current_user_email,callback:function(e){t.current_user_email=e},expression:"current_user_email"}}),e("settings-input-checkbox",{attrs:{name:"usage_tracking",label:t.text_usage_tracking_label,description:t.text_usage_tracking_description,tooltip:t.text_usage_tracking_tooltip},model:{value:t.usage_tracking,callback:function(e){t.usage_tracking=e},expression:"usage_tracking"}})],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"skip_step"},domProps:{textContent:t._s(t.text_skip)},on:{click:function(e){return e.preventDefault(),t.nextStep.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},Et=[],Tt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-text",class:{"settings-input-text-with-copy":t.copy,"input-error":t.has_errors||t.field_error}},[e("label",{staticClass:"settings-input-label-container",attrs:{for:t.id}},[t.label?e("span",{staticClass:"label",domProps:{innerHTML:t._s(t.label)}}):t._e(),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),e("span",{staticClass:"settings-input-container"},["checkbox"===t.type?e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],ref:"input",attrs:{id:t.id,name:t.name,placeholder:t.placeholder,readonly:t.readonly,disabled:t.disabled||t.is_constant_set,type:"checkbox"},domProps:{checked:Array.isArray(t.currentValue)?t._i(t.currentValue,null)>-1:t.currentValue},on:{change:[function(e){var s=t.currentValue,i=e.target,a=!!i.checked;if(Array.isArray(s)){var n=null,o=t._i(s,n);i.checked?o<0&&(t.currentValue=s.concat([n])):o>-1&&(t.currentValue=s.slice(0,o).concat(s.slice(o+1)))}else t.currentValue=a},t.inputUpdate]}}):"radio"===t.type?e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],ref:"input",attrs:{id:t.id,name:t.name,placeholder:t.placeholder,readonly:t.readonly,disabled:t.disabled||t.is_constant_set,type:"radio"},domProps:{checked:t._q(t.currentValue,null)},on:{change:[function(e){t.currentValue=null},t.inputUpdate]}}):e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],ref:"input",attrs:{id:t.id,name:t.name,placeholder:t.placeholder,readonly:t.readonly,disabled:t.disabled||t.is_constant_set,type:t.type},domProps:{value:t.currentValue},on:{change:t.inputUpdate,input:function(e){e.target.composing||(t.currentValue=e.target.value)}}}),t.copy?e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small",class:{"wp-mail-smtp-button-copied":t.show_copied},attrs:{title:t.text_copy_button},on:{click:function(e){return e.preventDefault(),t.copyValue.apply(null,arguments)}}},[e("span",{staticClass:"copy-button-container"},[e("inline-svg",{staticClass:"icon",class:{active:!t.show_copied},attrs:{src:s(8098),width:"16",height:"16"}}),e("inline-svg",{staticClass:"icon copied",class:{active:t.show_copied},attrs:{src:s(5561),width:"16",height:"16"}})],1)]):t._e()]),t.has_errors?e("p",{staticClass:"error"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(4186),width:"16"}}),e("span",{domProps:{innerHTML:t._s(t.text_error)}})],1):t._e(),t.description?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.description)}}):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},Ft=[],It=function(){var t=this,e=t._self._c;return e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.tooltip_data,expression:"tooltip_data"}],staticClass:"wp-mail-smtp-info",attrs:{tabindex:"0"}},[e("inline-svg",{staticClass:"icon",attrs:{src:s(1004),width:"14",height:"14"}})],1)},Bt=[],Dt={name:"SettingsInfoTooltip",props:{content:String},data(){return{tooltip_data:{content:this.content,autoHide:!1,trigger:"hover focus click"}}}},zt=Dt,Ot=(0,d.Z)(zt,It,Bt,!1,null,"74a4d2ae",null),Wt=Ot.exports,Lt={name:"SettingsInputText",components:{SettingsInfoTooltip:Wt},props:{name:String,value:String,label:String,description:String,constant:String,placeholder:String,type:{type:String,default:"text"},tooltip:String,readonly:Boolean,disabled:Boolean,format:RegExp,error:{type:String,default:""},copy:{type:Boolean,default:!1},is_error:Boolean},data(){return{has_error:!1,id:"input-"+this.name,text_copy_button:(0,l.__)("Copy input value","wp-mail-smtp"),text_copied:(0,l.__)("Copied!","wp-mail-smtp"),show_copied:!1}},computed:{currentValue:{get(){return this.value},set(t){this.$emit("is_error_update",!1),this.$emit("input",t)}},field_error:{get(){return this.is_error},set(t){this.$emit("is_error_update",t)}},has_errors:function(){return this.error.length>0||this.has_error},text_error:function(){return this.error.length>0?this.error:(0,l.__)("The value entered does not match the required format","wp-mail-smtp")},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{inputUpdate:function(t){if(this.disabled)return!1;if(this.has_error=!1,this.format||this.type&&"email"===this.type){const e=this.format?this.format:/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;if(!e.test(t.target.value))return this.has_error=!0,this.$emit("error_detected",this.text_error),!1}},copyValue:function(){const t=this.$refs.input;t.select(),document.execCommand("copy"),this.show_copied=!0;let e=this;setTimeout((function(){e.show_copied=!1}),1e3)}}},Rt=Lt,Qt=(0,d.Z)(Rt,Tt,Ft,!1,null,null,null),Nt=Qt.exports,Zt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-checkbox",class:{"settings-input-checkbox-checked":t.value,"settings-input-checkbox-disabled":t.disabled}},[e("span",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),e("label",{staticClass:"settings-input-checkbox-container",attrs:{for:"wp-mail-smtp-settings-checkbox-"+t.name}},[e("span",{staticClass:"checkbox",class:{"checkbox-checked":t.value,"checkbox-disabled":t.disabled}},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"14",height:"14"}})],1),e("input",{attrs:{id:"wp-mail-smtp-settings-checkbox-"+t.name,type:"checkbox",name:t.name,disabled:t.disabled},domProps:{checked:t.value},on:{input:function(e){return t.$emit("input",e.target.checked)}}}),t.description?e("span",{staticClass:"input-label"},[t._v(t._s(t.description))]):t._e()])])},Ut=[],Ht={name:"SettingsInputCheckbox",components:{SettingsInfoTooltip:Wt},props:{label:String,name:String,value:Boolean,description:String,tooltip:String,disabled:Boolean}},Gt=Ht,Yt=(0,d.Z)(Gt,Zt,Ut,!1,null,null,null),Vt=Yt.exports,Kt={name:"WizardStepHelpImprove",components:{ContentHeader:h,TheWizardStepCounter:X,SettingsInputText:Nt,SettingsInputCheckbox:Vt},data(){return{text_header_title:(0,l.__)("Help Improve WP Mail SMTP + Smart Recommendations","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Get helpful suggestions from WP Mail SMTP on how to optimize your email deliverability and grow your business.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_skip:(0,l.__)("Skip this Step","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_email_label:(0,l.__)("Your Email Address","wp-mail-smtp"),text_email_description:(0,l.__)("Your email is needed, so you can receive recommendations.","wp-mail-smtp"),text_usage_tracking_label:(0,l.__)("Help make WP Mail SMTP better for everyone","wp-mail-smtp"),text_usage_tracking_description:(0,l.__)("Yes, count me in","wp-mail-smtp"),text_usage_tracking_tooltip:(0,l.__)("By allowing us to track usage data we can better help you because we know with which WordPress configurations, themes and plugins we should test.","wp-mail-smtp"),is_pro:this.$wpms.is_pro,usage_tracking:!1}},computed:{...(0,ct.vn)("$_wizard",["current_user_email"])},methods:{handleSubmit(){this.$store.dispatch("$_app/start_loading");let t=[];if(this.current_user_email&&t.push(this.$store.dispatch("$_settings/subscribeToNewsletter",this.current_user_email)),this.usage_tracking){const e={value:{general:{"usage-tracking-enabled":!0}}};t.push(this.$store.dispatch("$_settings/updateSettings",e))}Promise.all(t).then((()=>{this.nextStep()})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},nextStep(){this.$next_step()},previousStep(){this.$previous_step()}}},Jt=Kt,qt=(0,d.Z)(Jt,Mt,Et,!1,null,null,null),Xt=qt.exports,jt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-license"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-license-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),t.is_pro?t._e():e("div",{staticClass:"upgrade-content"},[e("p",{staticClass:"medium-bold",domProps:{innerHTML:t._s(t.text_upgrade_paragraph)}}),e("div",{staticClass:"checked-item-list"},[e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_email_log))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_complete_email_report))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_instant_email_alert))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_summary_report_email))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_manage_notifications))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_network_settings))])],1)])]),t.verified?e("div",{staticClass:"verified-license"},[e("p",{domProps:{innerHTML:t._s(t.text_verified_license)}})]):e("div",{staticClass:"license-form",class:{"license-form-error":t.license_error}},[e("p",{domProps:{innerHTML:t._s(t.text_license_form)}}),e("div",{staticClass:"license-control"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.license,expression:"license"}],attrs:{name:"license",type:"password",placeholder:t.text_license_input_placeholder,"aria-label":t.text_aria_label_for_license_input},domProps:{value:t.license},on:{input:function(e){e.target.composing||(t.license=e.target.value)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-success wp-mail-smtp-button-small",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.handleLicenseSubmit.apply(null,arguments)}}},[t._v(" "+t._s(t.text_license_button)+" ")])]),t.license_error?e("p",{staticClass:"error-message",domProps:{textContent:t._s(t.text_license_error)}}):t._e()])]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[t.verified?e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)]):e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"skip_step"},domProps:{textContent:t._s(t.text_skip)},on:{click:function(e){return e.preventDefault(),t.nextStep.apply(null,arguments)}}})])])])},$t=[],te=s(8394),ee=s.n(te),se={name:"WizardStepLicense",components:{ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Enter your WP Mail SMTP License Key","wp-mail-smtp"),text_header_subtitle:this.$wpms.is_pro?"":(0,l.gB)((0,l.__)("You're currently using %1$sWP Mail SMTP Lite%2$s - no license needed. Enjoy!","wp-mail-smtp"),'',"")+" 🙂",text_save:(0,l.__)("Continue","wp-mail-smtp"),text_skip:(0,l.__)("Skip this Step","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_upgrade_paragraph:(0,l.gB)((0,l.__)("To unlock selected features, %1$sUpgrade to Pro%2$s and enter your license key below.","wp-mail-smtp"),'',""),text_network_settings:(0,l.__)("Multisite Network Settings","wp-mail-smtp"),text_manage_notifications:(0,l.__)("Manage Default Notifications","wp-mail-smtp"),text_email_log:(0,l.__)("Detailed Email Logs","wp-mail-smtp"),text_summary_report_email:(0,l.__)("Enhanced Weekly Email Summary","wp-mail-smtp"),text_license_form_lite:(0,l.gB)((0,l.__)("Already purchased? Enter your license key below to connect with %1$sWP Mail SMTP Pro%2$s!","wp-mail-smtp"),"",""),text_license_form_pro:(0,l.__)("Enter your license key below to unlock plugin updates!","wp-mail-smtp"),text_license_button:this.$wpms.is_pro?(0,l.__)("Verify License Key","wp-mail-smtp"):(0,l.__)("Connect","wp-mail-smtp"),text_license_error:(0,l.__)("The License Key format is incorrect. Please enter a valid key and try again.","wp-mail-smtp"),text_verified_license:(0,l.__)("Your license was successfully verified! You are ready for the next step.","wp-mail-smtp"),text_email_log_desc:(0,l.__)("Keep records of every email that's sent out from your website.","wp-mail-smtp"),text_manage_notifications_desc:(0,l.__)("Control which email notifications your WordPress site sends.","wp-mail-smtp"),text_network_settings_desc:(0,l.__)("Save time with powerful WordPress Multisite controls.","wp-mail-smtp"),text_instant_email_alert:(0,l.__)("Instant Email Alerts","wp-mail-smtp"),text_instant_email_alert_desc:(0,l.__)("Get notifications via email, SMS, Slack, or webhook when emails fail to send.","wp-mail-smtp"),text_complete_email_report:(0,l.__)("Complete Email Reports","wp-mail-smtp"),text_complete_email_report_desc:(0,l.__)("See the delivery status, track opens and clicks, and create deliverability graphs.","wp-mail-smtp"),text_pro_badge:(0,l.__)("Pro badge","wp-mail-smtp"),text_aria_label_for_license_input:(0,l.__)("License key input","wp-mail-smtp"),text_license_input_placeholder:(0,l.__)("Paste your license key here","wp-mail-smtp"),pro_badge:s(330),is_pro:this.$wpms.is_pro,verified:!1,license:"",license_error:!1}},computed:{text_license_form:function(){return this.is_pro?this.text_license_form_pro:this.text_license_form_lite},...(0,at.Se)({selectedProFeatures:"$_settings/plugin_features"})},methods:{handleLicenseSubmit(){return this.license_error=!1,!(!this.is_pro&&0===this.license.length)&&(this.is_pro&&this.license.length<16?(this.license_error=!0,!1):(this.$store.dispatch("$_app/start_loading"),void(this.is_pro?this.$store.dispatch("$_settings/verifyLicense",this.license).then((t=>{t.success?(this.verified=!0,this.$swal({title:(0,l.__)("Successful Verification!","wp-mail-smtp"),html:t.data.message,width:450,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})):this.$swal({title:(0,l.__)("Verification Error!","wp-mail-smtp"),html:t.data,width:450,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")})):this.$store.dispatch("$_settings/upgradePlugin",this.license).then((t=>{if(t.success&&ee()(t,"data.redirect_url"))return window.location=t.data.redirect_url;this.$store.dispatch("$_app/stop_loading"),this.$swal({title:t.success?(0,l.__)("Successful Upgrade!","wp-mail-smtp"):(0,l.__)("Upgrade Failed!","wp-mail-smtp"),html:t.data,width:450,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})})))))},handleSubmit(){this.nextStep()},nextStep(){this.$next_step()},previousStep(){let t=this.is_pro&&!this.$store.getters["$_settings/email_log_enabled"]?1:0;this.$previous_step(t)},prepareLongCheckbox(t,e){return``},prepareProFeaturesHtml(){let t="
      ";return this.selectedProFeatures.includes("email_log")&&(t+=this.prepareLongCheckbox(this.text_email_log,this.text_email_log_desc)),this.selectedProFeatures.includes("complete_email_report")&&(t+=this.prepareLongCheckbox(this.text_complete_email_report,this.text_complete_email_report_desc)),this.selectedProFeatures.includes("instant_email_alert")&&(t+=this.prepareLongCheckbox(this.text_instant_email_alert,this.text_instant_email_alert_desc)),this.selectedProFeatures.includes("manage_notifications")&&(t+=this.prepareLongCheckbox(this.text_manage_notifications,this.text_manage_notifications_desc)),this.selectedProFeatures.includes("network_settings")&&(t+=this.prepareLongCheckbox(this.text_network_settings,this.text_network_settings_desc)),t+"
      "}},mounted(){if(!this.is_pro&&this.selectedProFeatures.length>0){const t=this.prepareProFeaturesHtml();this.$swal({title:(0,l.__)("Would you like to purchase the following features now?","wp-mail-smtp"),html:`

      ${(0,l.__)("These features are available as part of WP Mail SMTP Pro plan.","wp-mail-smtp")}

      \n\t\t\t\t\t\t\t${t}\n\t\t\t\t\t\t\t

      ${(0,l.gB)((0,l.__)("%1$sBonus:%2$s You can upgrade to the Pro plan and %3$ssave %5$s today%4$s, automatically applied at checkout.","wp-mail-smtp"),"","",'',"","$50")}

      \n\t\t\t\t\t\t`,width:850,showCloseButton:!0,allowOutsideClick:!1,allowEscapeKey:!1,allowEnterKey:!1,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-plugin-upgrade"},confirmButtonText:(0,l.__)("Purchase Now","wp-mail-smtp"),cancelButtonText:(0,l.__)("I'll do it later","wp-mail-smtp"),showCancelButton:!0,reverseButtons:!0}).then((t=>{if(t.value){const t=window.open(this.$wpms.upgrade_link,"_blank");t.focus()}}))}this.verified=this.$wpms.license_exists},created(){const t=new URLSearchParams(window.location.search);this.$wpms.license_exists&&!t.has("upgrade-redirect")&&this.nextStep()}},ie=se,ae=(0,d.Z)(ie,jt,$t,!1,null,null,null),ne=ae.exports,oe=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-check-configuration"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-check-configuration-header"},[e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"check-configuration-loading-image-container"},[e("img",{attrs:{src:s(7764),alt:t.text_image_alt}})])])])},re=[],le={name:"WizardStepCheckConfiguration",components:{ContentHeader:h},data(){return{text_header_title:(0,l.__)("Checking Mailer Configuration","wp-mail-smtp"),text_header_subtitle:(0,l.__)("We're running some tests in the background to make sure everything is set up properly.","wp-mail-smtp"),text_image_alt:(0,l.__)("Checking mailer configuration image","wp-mail-smtp")}},mounted(){this.$store.dispatch("$_wizard/checkMailerConfiguration").then((t=>{t.success?this.$router.push({name:"check_configuration_step_success"}):this.$router.push({name:"check_configuration_step_failure"})}))}},me=le,pe=(0,d.Z)(me,oe,re,!1,null,null,null),ce=pe.exports,_e=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-configuration-success"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configuration-success-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"plugin-item-container"},[e("p",{staticClass:"medium-bold",domProps:{textContent:t._s(t.text_free_plugins_header)}}),e("div",t._l(t.plugins,(function(t,s){return e("plugin-item",{key:s,attrs:{name:t.name,slug:t.slug,is_installed:t.is_installed,is_activated:t.is_activated}})})),1)]),t.is_pro?t._e():e("div",{staticClass:"upgrade-banner-container"},[e("div",{staticClass:"upgrade-banner"},[e("h2",{domProps:{textContent:t._s(t.text_upgrade_title)}}),e("p",{staticClass:"subtitle",domProps:{textContent:t._s(t.text_upgrade_subtitle)}}),e("div",{staticClass:"checked-item-list"},[e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_email_log))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_manage_notifications))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_network_settings))])],1)]),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-success",attrs:{type:"button"},domProps:{textContent:t._s(t.text_upgrade_button)},on:{click:t.openUpgradePage}})]),e("p",{staticClass:"bonus",domProps:{innerHTML:t._s(t.text_bonus)}})])]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"send_test_email"},domProps:{textContent:t._s(t.text_test_email)},on:{click:function(e){return e.preventDefault(),t.handleTestEmail.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"send_feedback"},domProps:{textContent:t._s(t.text_send_feedback)},on:{click:function(e){return e.preventDefault(),t.handleFeedback.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"button",name:"finish_setup"},domProps:{textContent:t._s(t.text_finish)},on:{click:function(e){return e.preventDefault(),t.handleFinish.apply(null,arguments)}}})])])},de=[],ue=function(){var t=this,e=t._self._c;return e("div",{class:`wp-mail-smtp-plugin-item wp-mail-smtp-plugin-${t.slug}`},[e("span",{staticClass:"wp-mail-smtp-plugin-item-title-container"},[t.logo.length?e("img",{staticClass:"wp-mail-smtp-logo-icon",attrs:{src:t.logo2x,srcset:t.logo_srcset,alt:t.name}}):t._e(),e("span",{domProps:{textContent:t._s(t.name)}})]),e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",disabled:t.is_activated||t.is_installed},on:{click:function(e){return e.preventDefault(),t.handleClick.apply(null,arguments)}}},[t.loading?e("spin-loader",{attrs:{color:"white"}}):e("span",[t._v(" "+t._s(t.text_button_label)+" ")])],1)])},he=[],ge=function(){var t=this,e=t._self._c;return e("img",{class:`wp-mail-smtp-loader wp-mail-smtp-loader-${t.size}`,attrs:{src:t.image,alt:t.text_loading}})},fe=[],we={name:"SpinLoader",props:{color:{type:String,default:""},size:{type:String,default:"sm"}},data(){return{image:s(7630)(`./loading${this.color.length?"-"+this.color:""}.svg`),text_loading:(0,l.__)("Loading","wp-mail-smtp")}}},Ae=we,be=(0,d.Z)(Ae,ge,fe,!1,null,null,null),ve=be.exports,xe={name:"PluginItem",components:{SpinLoader:ve},props:{slug:String,name:String,is_installed:Boolean,is_activated:Boolean},data(){return{loading:!1,logo:s(8517)(`./${this.slug}.png`),logo2x:s(833)(`./${this.slug}@2x.png`)}},computed:{text_button_label:function(){let t=(0,l.__)("Install","wp-mail-smtp");return this.is_installed&&!this.is_activated&&(t=(0,l.__)("Installed","wp-mail-smtp")),this.is_activated&&(t=(0,l.__)("Activated","wp-mail-smtp")),t},logo_srcset:function(){return`${this.logo}, ${this.logo2x} 2x`}},methods:{handleClick(){this.loading||(this.loading=!0,this.$store.dispatch("$_plugins/installPlugin",this.slug).then((t=>{t.success&&this.$wpms_success_toast({title:`Plugin: ${this.name} installed!`}),this.loading=!1})))}}},ke=xe,ye=(0,d.Z)(ke,ue,he,!1,null,"2e2edfa6",null),Ce=ye.exports,Se={name:"WizardStepConfigurationSuccess",components:{ContentHeader:h,TheWizardStepCounter:X,PluginItem:Ce},data(){return{text_header_title:(0,l.__)("Congrats, you’ve successfully set up WP Mail SMTP!","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Here’s what to do next:","wp-mail-smtp"),text_free_plugins_header:(0,l.__)("Check out our other free WordPress plugins:","wp-mail-smtp"),text_upgrade_title:(0,l.__)("Upgrade to Unlock Powerful SMTP Features","wp-mail-smtp"),text_upgrade_subtitle:(0,l.__)("Upgrade to WP Mail SMTP Pro to unlock more awesome features and experience why WP Mail SMTP is used by over 3,000,000 websites.","wp-mail-smtp"),text_network_settings:(0,l.__)("Multisite Network Settings","wp-mail-smtp"),text_manage_notifications:(0,l.__)("Manage Default Notifications","wp-mail-smtp"),text_email_log:(0,l.__)("Detailed Email Logs","wp-mail-smtp"),text_upgrade_button:(0,l.__)("Upgrade to Pro Today","wp-mail-smtp"),text_test_email:(0,l.__)("Send a Test Email","wp-mail-smtp"),text_send_feedback:(0,l.__)("Send us Feedback","wp-mail-smtp"),text_finish:(0,l.__)("Finish Setup","wp-mail-smtp"),text_bonus:(0,l.gB)((0,l.__)("%1$sBonus:%2$s You can upgrade to the Pro plan and %3$ssave %5$s today%4$s, automatically applied at checkout.","wp-mail-smtp"),"","",'',"","$50"),star_image_html:`${(0,l.__)(`,is_pro:this.$wpms.is_pro}},computed:{...(0,at.Se)({plugins:"$_plugins/partner_plugins"})},methods:{handleTestEmail(){return window.location=this.$wpms.email_test_tab_url},goodFeedback(){this.$swal({title:(0,l.__)("Thanks for the feedback!","wp-mail-smtp"),html:`${(0,l.gB)((0,l.__)("Help us spread the word %1$sby giving WP Mail SMTP a 5-star rating %3$s(%4$s) on WordPress.org%2$s. Thanks for your support and we look forward to bringing you more awesome features.","wp-mail-smtp"),'',"","
      ",this.star_image_html+""+this.star_image_html+this.star_image_html+this.star_image_html+this.star_image_html)}`,width:650,showCloseButton:!0,allowEnterKey:!1,confirmButtonText:(0,l.__)("Rate on WordPress.org","wp-mail-smtp"),customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-feedback-good"}}).then((t=>{if(t.value){const t=window.open("https://wordpress.org/support/plugin/wp-mail-smtp/reviews/#new-post","_blank");t.focus()}}))},badFeedback(){this.$swal({title:(0,l.__)("What could we do to improve?","wp-mail-smtp"),html:`${(0,l.__)("We're sorry things didn't go smoothly for you, and want to keep improving. Please let us know any specific parts of this process that you think could be better. We really appreciate any details you're willing to share!","wp-mail-smtp")}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`,width:650,showCloseButton:!0,allowEnterKey:!1,allowOutsideClick:!1,allowEscapeKey:!1,confirmButtonText:(0,l.__)("Submit Feedback","wp-mail-smtp"),customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-feedback-bad"},preConfirm:()=>[document.getElementById("feedback").value,document.getElementById("permission").checked]}).then((t=>{if(t.value){const e=t.value[0],s=t.value[1];this.$store.dispatch("$_wizard/sendFeedback",{feedback:e,permission:s})}}))},handleFeedback(){this.$swal({title:(0,l.__)("How was your WP Mail SMTP setup experience?","wp-mail-smtp"),text:(0,l.__)("Our goal is to make your SMTP setup as simple and straightforward as possible. We'd love to know how this process went for you!","wp-mail-smtp"),width:650,showCloseButton:!0,allowEnterKey:!1,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-feedback"},showCancelButton:!0}).then((t=>{t.value?this.goodFeedback():void 0!==t.dismiss&&"cancel"===t.dismiss&&this.badFeedback()}))},handleFinish(){return window.location=this.$wpms.exit_url},openUpgradePage:function(){const t=window.open(this.$wpms.upgrade_link,"_blank");t.focus()}}},Pe=Se,Me=(0,d.Z)(Pe,_e,de,!1,null,null,null),Ee=Me.exports,Te=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-configuration-failure"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configuration-failure-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"start-troubleshooting-arrow-container"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(1122),width:"112",height:"112"}})],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"button",name:"start_troubleshooting"},domProps:{textContent:t._s(t.text_start_troubleshooting)},on:{click:function(e){return e.preventDefault(),t.handleTroubleshooting.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"finish_setup"},domProps:{textContent:t._s(t.text_finish)},on:{click:function(e){return e.preventDefault(),t.handleFinish.apply(null,arguments)}}})])])},Fe=[],Ie={name:"WizardStepConfigurationFailure",components:{ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Whoops, looks like things aren’t configured properly.","wp-mail-smtp"),text_header_subtitle:(0,l.__)("We just tried to send a test email, but something prevented that from working. To see more details about the issue we detected, as well as our suggestions to fix it, please start troubleshooting.","wp-mail-smtp"),text_start_troubleshooting:(0,l.__)("Start Troubleshooting","wp-mail-smtp"),text_send_feedback:(0,l.__)("Send us Feedback","wp-mail-smtp"),text_finish:(0,l.__)("Finish Setup","wp-mail-smtp")}},methods:{handleTroubleshooting(){return window.location=`${this.$wpms.email_test_tab_url}&auto-start=1`},handleFinish(){return window.location=this.$wpms.exit_url}}},Be=Ie,De=(0,d.Z)(Be,Te,Fe,!1,null,null,null),ze=De.exports,Oe=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-smtp"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"host",constant:"WPMS_SMTP_HOST",label:t.text_host_label,is_error:t.field_errors.includes("host")},on:{is_error_update:function(e){return t.removeFieldError("host")}},model:{value:t.host,callback:function(e){t.host=e},expression:"host"}}),e("settings-input-radio",{attrs:{name:"encryption",constant:"WPMS_SSL",label:t.text_encryption_label,options:t.encryptionOptions,description:t.text_encryption_description},on:{input:t.encryptionChanged},model:{value:t.encryption,callback:function(e){t.encryption=e},expression:"encryption"}}),e("settings-input-number",{attrs:{name:"port",constant:"WPMS_SMTP_PORT",label:t.text_port_label,is_error:t.field_errors.includes("port")},on:{is_error_update:function(e){return t.removeFieldError("port")}},model:{value:t.port,callback:function(e){t.port=e},expression:"port"}}),e("settings-input-switch",{directives:[{name:"show",rawName:"v-show",value:t.show_autotls,expression:"show_autotls"}],attrs:{name:"autotls",constant:"WPMS_SMTP_AUTOTLS",title:t.text_autotls_title,label:t.text_autotls_label,description:t.text_autotls_description},model:{value:t.autotls,callback:function(e){t.autotls=e},expression:"autotls"}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-switch",{attrs:{name:"auth",constant:"WPMS_SMTP_AUTH",title:t.text_auth_title,label:t.text_auth_label},model:{value:t.auth,callback:function(e){t.auth=e},expression:"auth"}}),e("settings-input-text",{directives:[{name:"show",rawName:"v-show",value:t.auth,expression:"auth"}],attrs:{name:"user",constant:"WPMS_SMTP_USER",label:t.text_user_label,is_error:t.field_errors.includes("user")},on:{is_error_update:function(e){return t.removeFieldError("user")}},model:{value:t.user,callback:function(e){t.user=e},expression:"user"}}),e("settings-input-text",{directives:[{name:"show",rawName:"v-show",value:t.auth,expression:"auth"}],attrs:{name:"pass",constant:"WPMS_SMTP_PASS",type:"password",label:t.text_pass_label,is_error:t.field_errors.includes("pass")},on:{is_error_update:function(e){return t.removeFieldError("pass")}},model:{value:t.pass,callback:function(e){t.pass=e},expression:"pass"}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},We=[],Le=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-radio"},[t.label?e("span",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))])]):t._e(),e("div",{staticClass:"settings-input-radio-container"},t._l(t.options,(function(s){return e("label",{key:s.value,class:t.labelClass(s.value),attrs:{for:"wp-mail-smtp-settings-radio-"+t.name+"["+s.value+"]"}},[e("span",{class:t.titleClass(s.value)}),e("input",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],attrs:{id:"wp-mail-smtp-settings-radio-"+t.name+"["+s.value+"]",type:"radio",name:t.name,autocomplete:"off",readonly:t.disabled,disabled:t.is_constant_set},domProps:{value:s.value,checked:t.isChecked(s.value),checked:t._q(t.selected,s.value)},on:{change:[function(e){t.selected=s.value},t.updateSetting]}}),e("span",{staticClass:"input-label"},[t._v(t._s(s.label))])])})),0),t.description?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.description)}}):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},Re=[],Qe={name:"SettingsInputRadio",props:{options:Array,label:String,name:String,value:String,description:String,constant:String,disabled:Boolean},data(){return{has_error:!1}},computed:{selected:{get(){return this.value},set(t){this.$emit("input",t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{updateSetting:function(){if(this.disabled)return!1},titleClass(t){let e="wp-mail-smtp-styled-radio";return this.isChecked(t)&&(e+=" wp-mail-smtp-styled-radio-checked"),this.is_constant_set&&(e+=" wp-mail-smtp-styled-radio-disabled"),e},labelClass(t){let e="";return this.isChecked(t)&&(e+=" wp-mail-smtp-styled-radio-label-checked"),this.is_constant_set&&(e+=" wp-mail-smtp-styled-radio-label-disabled"),e},isChecked(t){return t===this.selected}}},Ne=Qe,Ze=(0,d.Z)(Ne,Le,Re,!1,null,null,null),Ue=Ze.exports,He=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-number",class:{"settings-input-number-error":t.field_error}},[e("label",{staticClass:"settings-input-label-container",attrs:{for:t.id}},[t.label?e("span",{staticClass:"label"},[t._v(t._s(t.label))]):t._e(),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],attrs:{id:t.id,type:"number",name:t.name,placeholder:t.placeholder,min:t.min,max:t.max,step:t.step,readonly:t.disabled,disabled:t.is_constant_set},domProps:{value:t.currentValue},on:{change:t.inputUpdate,input:function(e){e.target.composing||(t.currentValue=e.target.value)}}}),t.has_error?e("p",{staticClass:"error"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(4186),width:"16"}}),e("span",{domProps:{innerHTML:t._s(t.has_error)}})],1):t._e(),t.description?e("p",{staticClass:"description"},[t._v(" "+t._s(t.description)+" ")]):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},Ge=[],Ye={name:"SettingsInputNumber",components:{SettingsInfoTooltip:Wt},props:{name:String,value:[Number,String],label:String,description:String,constant:String,placeholder:String,type:{type:String,default:"text"},tooltip:String,default_value:String,min:Number,max:Number,disabled:Boolean,step:{type:Number,default:1},round:{type:Boolean,default:!1},is_error:Boolean},data(){return{has_error:!1,id:"input-"+this.name,text_error_value:(0,l.gB)((0,l.__)("Please enter a value between %1$s and %2$s","wp-mail-smtp"),""+this.min+"",""+this.max+""),text_error_round:(0,l.__)("Value has to be a round number","wp-mail-smtp")}},computed:{currentValue:{get(){return this.value},set(t){this.$emit("is_error_update",!1),this.$emit("input",parseInt(t,10))}},field_error:{get(){return this.is_error},set(t){this.$emit("is_error_update",t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{inputUpdate:function(t){if(this.disabled)return!1;this.has_error=!1;const e=parseFloat(t.target.value);return this.round&&e%1!==0?(this.has_error=this.text_error_round,!1):e>this.max||e-1:t.currentValue},on:{change:[function(e){var s=t.currentValue,i=e.target,a=!!i.checked;if(Array.isArray(s)){var n=null,o=t._i(s,n);i.checked?o<0&&(t.currentValue=s.concat([n])):o>-1&&(t.currentValue=s.slice(0,o).concat(s.slice(o+1)))}else t.currentValue=a},t.inputUpdate]}}),e("span",{class:{"toggle-switch":!0,"toggle-switch-with-label":t.label}}),t.label?e("span",{staticClass:"label-description",domProps:{innerHTML:t._s(t.label)}}):t._e()])])])},Xe=[],je={name:"SettingsInputSwitch",components:{SettingsInfoTooltip:Wt},props:{name:String,value:Boolean,title:String,label:String,description:String,constant:String,tooltip:String,classname:String,disabled:Boolean},data(){return{has_error:!1,id:"input-"+this.name}},computed:{currentValue:{get(){return this.value},set(t){this.$emit("input",!!t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{inputUpdate:function(){if(this.disabled)return!1}}},$e=je,ts=(0,d.Z)($e,qe,Xe,!1,null,null,null),es=ts.exports,ss={name:"WizardStepConfigureMailerSmtp",components:{SettingsInputText:Nt,SettingsInputRadio:Ue,SettingsInputNumber:Je,SettingsInputSwitch:es},data(){return{mailer:"smtp",text_host_label:(0,l.__)("SMTP Host","wp-mail-smtp"),text_encryption_label:(0,l.__)("Encryption","wp-mail-smtp"),text_port_label:(0,l.__)("SMTP Port","wp-mail-smtp"),text_autotls_title:(0,l.__)("Auto TLS","wp-mail-smtp"),text_autotls_label:(0,l.__)("Enable Auto TLS","wp-mail-smtp"),text_autotls_description:(0,l.__)("By default, TLS encryption is automatically used if the server supports it (recommended). In some cases, due to server misconfigurations, this can cause issues and may need to be disabled.","wp-mail-smtp"),text_auth_title:(0,l.__)("Authentication","wp-mail-smtp"),text_auth_label:(0,l.__)("Enable Authentication","wp-mail-smtp"),text_user_label:(0,l.__)("SMTP Username","wp-mail-smtp"),text_pass_label:(0,l.__)("SMTP Password","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_encryption_description:(0,l.__)("For most servers TLS is the recommended option. If your SMTP provider offers both SSL and TLS options, we recommend using TLS.","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),description:this.$wpms.mailer_options.smtp.description,encryptionOptions:[{label:(0,l.__)("None","wp-mail-smtp"),value:"none",default_port:25},{label:(0,l.__)("SSL","wp-mail-smtp"),value:"ssl",default_port:465},{label:(0,l.__)("TLS","wp-mail-smtp"),value:"tls",default_port:587}],show_autotls:!0,show_user_and_pass:!0,field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.smtp.host","settings.smtp.auth","settings.smtp.port","settings.smtp.encryption","settings.smtp.user","settings.smtp.pass","settings.smtp.autotls","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},watch:{encryption:function(t){this.show_autotls="tls"!==t}},methods:{getEncryptionDefaultPort(t){return this.encryptionOptions.find((e=>e.value===t)).default_port},encryptionChanged(t){this.port=this.getEncryptionDefaultPort(t)},areRequiredFieldsValid(){return""===this.host&&this.field_errors.push("host"),(""===this.port||isNaN(this.port))&&this.field_errors.push("port"),this.auth&&(""===this.user&&this.field_errors.push("user"),""===this.pass&&this.field_errors.push("pass")),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}},mounted(){"tls"===this.encryption&&(this.show_autotls=!1)}},is=ss,as=(0,d.Z)(is,Oe,We,!1,null,null,null),ns=as.exports,os=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sendlayer"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small wp-mail-smtp-button-secondary",attrs:{href:t.get_started_button_url,target:"_blank",rel:"noopener noreferrer"}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_get_started_button)),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"23"}})],1)]),e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SENDLAYER_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},rs=[],ls={name:"WizardStepConfigureMailerSendlayer",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"sendlayer",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for SendLayer.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_get_started_button:(0,l.__)("Get Started with SendLayer","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up SendLayer","wp-mail-smtp"),description:this.$wpms.mailer_options.sendlayer.description.substr(0,this.$wpms.mailer_options.sendlayer.description.lastIndexOf("

      ")),get_started_button_url:this.$getUTMUrl("https://sendlayer.com/wp-mail-smtp/",{source:"wpmailsmtpplugin",medium:"WordPress",content:"Setup Wizard - Mailer Button"}),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sendlayer-mailer-in-wp-mail-smtp/",{content:"Read how to set up SendLayer"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sendlayer.api_key","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},ms=ls,ps=(0,d.Z)(ms,os,rs,!1,null,null,null),cs=ps.exports,_s=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-smtpcom"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small wp-mail-smtp-button-secondary",attrs:{href:"https://wpmailsmtp.com/go/smtp/",target:"_blank",rel:"noopener noreferrer"}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_get_started_button)),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"23"}})],1)]),e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))]),e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.disclosure_tooltip_data,expression:"disclosure_tooltip_data"}],staticClass:"mailer-offer-link-disclosure"},[t._v(t._s(t.text_disclosure))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SMTPCOM_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"channel",constant:"WPMS_SMTPCOM_CHANNEL",label:t.text_channel_label,description:t.text_channel_description,is_error:t.field_errors.includes("channel")},on:{is_error_update:function(e){return t.removeFieldError("channel")}},model:{value:t.channel,callback:function(e){t.channel=e},expression:"channel"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},ds=[],us={name:"WizardStepConfigureMailerSmtpCom",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"smtpcom",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_channel_label:(0,l.__)("Sender Name","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for SMTP.com.","wp-mail-smtp"),'',""),text_channel_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Sender Name for SMTP.com.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_get_started_button:(0,l.__)("Get Started with SMTP.com","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up SMTP.com","wp-mail-smtp"),text_disclosure:(0,l.__)("Transparency and Disclosure","wp-mail-smtp"),disclosure_tooltip_data:{content:(0,l.__)("We believe in full transparency. The SMTP.com links above are tracking links as part of our partnership with SMTP (j2 Global). We can recommend just about any SMTP service, but we only recommend products that we believe will add value to our users.","wp-mail-smtp"),autoHide:!0,trigger:"hover"},description:this.$wpms.mailer_options.smtpcom.description.substr(0,this.$wpms.mailer_options.smtpcom.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-smtp-com-mailer-in-wp-mail-smtp",{content:"Read how to set up SMTP.com"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.smtpcom.api_key","settings.smtpcom.channel","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.channel&&this.field_errors.push("channel"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},hs=us,gs=(0,d.Z)(hs,_s,ds,!1,null,null,null),fs=gs.exports,ws=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sendinblue"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small wp-mail-smtp-button-secondary",attrs:{href:"https://wpmailsmtp.com/go/sendinblue/",target:"_blank",rel:"noopener noreferrer"}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_get_started_button)),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"23"}})],1)]),e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))]),e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.disclosure_tooltip_data,expression:"disclosure_tooltip_data"}],staticClass:"mailer-offer-link-disclosure"},[t._v(t._s(t.text_disclosure))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SENDINBLUE_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"domain",constant:"WPMS_SENDINBLUE_DOMAIN",label:t.text_domain_label,description:t.text_domain_description},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},As=[],bs={name:"WizardStepConfigureMailerSendinblue",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"sendinblue",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_domain_label:(0,l.__)("Sending Domain","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for Sendinblue.","wp-mail-smtp"),'',""),text_domain_description:(0,l.gB)((0,l.__)("Please input the sending domain/subdomain you configured in your Sendinblue dashboard. More information can be found in our %1$sSendinblue documentation%2$s","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_get_started_button:(0,l.__)("Get Started with Sendinblue","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Sendinblue","wp-mail-smtp"),text_disclosure:(0,l.__)("Transparency and Disclosure","wp-mail-smtp"),disclosure_tooltip_data:{content:(0,l.__)("We believe in full transparency. The Sendinblue links above are tracking links as part of our partnership with Sendinblue. We can recommend just about any SMTP service, but we only recommend products that we believe will add value to our users.","wp-mail-smtp"),autoHide:!0,trigger:"hover"},description:this.$wpms.mailer_options.sendinblue.description.substr(0,this.$wpms.mailer_options.sendinblue.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sendinblue-mailer-in-wp-mail-smtp",{content:"Read how to set up Sendinblue"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sendinblue.api_key","settings.sendinblue.domain","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},vs=bs,xs=(0,d.Z)(vs,ws,As,!1,null,null,null),ks=xs.exports,ys=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-mailgun"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_MAILGUN_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"domain",constant:"WPMS_MAILGUN_DOMAIN",label:t.text_domain_label,description:t.text_domain_description,is_error:t.field_errors.includes("domain")},on:{is_error_update:function(e){return t.removeFieldError("domain")}},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-radio",{attrs:{name:"region",constant:"WPMS_MAILGUN_REGION",label:t.text_region_label,options:t.regionOptions,description:t.text_region_description},model:{value:t.region,callback:function(e){t.region=e},expression:"region"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Cs=[],Ss={name:"WizardStepConfigureMailerMailgun",components:{SettingsInputText:Nt,SettingsInputRadio:Ue,SettingsInputSwitch:es},data(){return{mailer:"mailgun",text_api_key_label:(0,l.__)("Private API Key","wp-mail-smtp"),text_domain_label:(0,l.__)("Domain Name","wp-mail-smtp"),text_region_label:(0,l.__)("Region","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Private API Key from Mailgun.","wp-mail-smtp"),'',""),text_domain_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Domain Name from Mailgun.","wp-mail-smtp"),'',""),text_region_description:(0,l.gB)((0,l.__)("Define which endpoint you want to use for sending messages. If you are operating under EU laws, you may be required to use EU region. %1$sMore information%2$s on Mailgun.com.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Mailgun","wp-mail-smtp"),description:this.$wpms.mailer_options.mailgun.description.substr(0,this.$wpms.mailer_options.mailgun.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-mailgun-mailer-in-wp-mail-smtp/",{content:"Read how to set up Mailgun"}),regionOptions:[{label:(0,l.__)("US","wp-mail-smtp"),value:"US"},{label:(0,l.__)("EU","wp-mail-smtp"),value:"EU"}],field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.mailgun.api_key","settings.mailgun.domain","settings.mailgun.region","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.domain&&this.field_errors.push("domain"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Ps=Ss,Ms=(0,d.Z)(Ps,ys,Cs,!1,null,null,null),Es=Ms.exports,Ts=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sendgrid"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SENDGRID_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"domain",constant:"WPMS_SENDGRID_DOMAIN",label:t.text_domain_label,description:t.text_domain_description},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Fs=[],Is={name:"WizardStepConfigureMailerSendgrid",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"sendgrid",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_domain_label:(0,l.__)("Sending Domain","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for Sendgrid.","wp-mail-smtp"),'',"")+"
      "+(0,l.gB)((0,l.__)("To send emails you will need only a %1$sMail Send%2$s access level for this API key.","wp-mail-smtp"),"",""),text_domain_description:(0,l.gB)((0,l.__)("Please input the sending domain/subdomain you configured in your SendGrid dashboard. More information can be found in our %1$sSendGrid documentation%2$s","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Sendgrid","wp-mail-smtp"),description:this.$wpms.mailer_options.sendgrid.description.substr(0,this.$wpms.mailer_options.sendgrid.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sendgrid-mailer-in-wp-mail-smtp/",{content:"Read how to set up Sendgrid"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sendgrid.api_key","settings.sendgrid.domain","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Bs=Is,Ds=(0,d.Z)(Bs,Ts,Fs,!1,null,null,null),zs=Ds.exports,Os=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sparkpost"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SPARKPOST_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-radio",{attrs:{name:"region",constant:"WPMS_SPARKPOST_REGION",label:t.text_region_label,options:t.regionOptions,description:t.text_region_description},model:{value:t.region,callback:function(e){t.region=e},expression:"region"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Ws=[],Ls={name:"WizardStepConfigureMailerSparkPost",components:{SettingsInputText:Nt,SettingsInputRadio:Ue,SettingsInputSwitch:es},data(){return{mailer:"sparkpost",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_region_label:(0,l.__)("Region","wp-mail-smtp"),text_region_description:(0,l.gB)((0,l.__)("Select your SparkPost account region. %1$sMore information%2$s on SparkPost.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up SparkPost","wp-mail-smtp"),description:this.$wpms.mailer_options.sparkpost.description.substr(0,this.$wpms.mailer_options.sparkpost.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sparkpost-mailer-in-wp-mail-smtp/",{content:"Read how to set up SparkPost"}),regionOptions:[{label:(0,l.__)("US","wp-mail-smtp"),value:"US"},{label:(0,l.__)("EU","wp-mail-smtp"),value:"EU"}],field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sparkpost.api_key","settings.sparkpost.region","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"]),text_api_key_description:function(){let t="EU"===this.region?"eu.":"";return(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for SparkPost.","wp-mail-smtp"),'',"")}},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Rs=Ls,Qs=(0,d.Z)(Rs,Os,Ws,!1,null,null,null),Ns=Qs.exports,Zs=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-postmark"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"server_api_token",type:"password",constant:"WPMS_POSTMARK_SERVER_API_TOKEN",label:t.text_server_api_token_label,description:t.text_server_api_token_description,is_error:t.field_errors.includes("server_api_token")},on:{is_error_update:function(e){return t.removeFieldError("server_api_token")}},model:{value:t.server_api_token,callback:function(e){t.server_api_token=e},expression:"server_api_token"}}),e("settings-input-text",{attrs:{name:"message_stream",constant:"WPMS_POSTMARK_MESSAGE_STREAM",label:t.text_message_stream_label,description:t.text_message_stream_description},model:{value:t.message_stream,callback:function(e){t.message_stream=e},expression:"message_stream"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Us=[],Hs={name:"WizardStepConfigureMailerPostmark",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"postmark",text_server_api_token_label:(0,l.__)("Server API Token","wp-mail-smtp"),text_message_stream_label:(0,l.__)("Message Stream ID","wp-mail-smtp"),text_server_api_token_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Server API Token for Postmark.","wp-mail-smtp"),'',""),text_message_stream_description:(0,l.gB)((0,l.__)("Message Stream ID is optional. By default outbound (Default Transactional Stream) will be used. More information can be found in our %1$sPostmark documentation%2$s.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Postmark","wp-mail-smtp"),description:this.$wpms.mailer_options.postmark.description.substr(0,this.$wpms.mailer_options.postmark.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-postmark-mailer-in-wp-mail-smtp/",{content:"Read how to set up Postmark"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.postmark.server_api_token","settings.postmark.message_stream","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.server_api_token&&this.field_errors.push("server_api_token"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Gs=Hs,Ys=(0,d.Z)(Gs,Zs,Us,!1,null,null,null),Vs=Ys.exports,Ks=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-amazonses"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("b",[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])])]),t.is_ssl?e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_AMAZONSES_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",type:"password",constant:"WPMS_AMAZONSES_CLIENT_SECRET",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-select",{attrs:{name:"region",constant:"WPMS_AMAZONSES_REGION",label:t.text_region_label,options:t.regionOptions,description:t.text_region_description,is_error:t.field_errors.includes("region")},on:{is_error_update:function(e){return t.removeFieldError("region")}},model:{value:t.region,callback:function(e){t.region=e},expression:"region"}}),t.is_api_auth_missing?t._e():e("div",[e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-amazon-s-e-s-identities",{attrs:{options:t.identities,label:t.text_identities_label,columns:t.identities_columns}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)],1):e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("div",{staticClass:"wp-mail-smtp-notice wp-mail-smtp-notice--error"},[e("p",[e("span",[t._v(t._s(t.text_no_ssl))]),t._v(" "),e("a",{attrs:{href:"https://www.wpbeginner.com/wp-tutorials/how-to-add-ssl-and-https-in-wordpress/",target:"_blank",rel:"noopener"}},[t._v(t._s(t.text_no_ssl_link_text))]),t._v(".")]),e("p",[t._v(t._s(t.text_no_ssl_diff_mailer))])])])])},Js=[],qs=s(1296),Xs=s.n(qs),js=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-select",class:{"settings-input-select-error":t.field_error}},[e("label",{staticClass:"settings-input-label-container",attrs:{for:`wp-mail-smtp-settings-select-${t.name}`}},[e("span",{staticClass:"label"},[t._v(t._s(t.label))])]),e("div",{staticClass:"settings-input-select-container"},[e("select",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],attrs:{id:`wp-mail-smtp-settings-select-${t.name}`,name:t.name,readonly:t.disabled,disabled:t.is_constant_set},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.selected=e.target.multiple?s:s[0]}}},t._l(t.options,(function(s){return e("option",{key:s.value,domProps:{value:s.value}},[t._v(" "+t._s(s.label)+" ")])})),0)]),t.description?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.description)}}):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},$s=[],ti={name:"SettingsInputSelect",props:{options:Array,label:String,name:String,value:String,description:String,constant:String,disabled:Boolean,is_error:Boolean},computed:{selected:{get(){return this.value},set(t){this.$emit("is_error_update",!1),this.$emit("input",t)}},field_error:{get(){return this.is_error},set(t){this.$emit("is_error_update",t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}}},ei=ti,si=(0,d.Z)(ei,js,$s,!1,null,null,null),ii=si.exports,ai=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-amazon-ses-identities"},[e("label",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),t.options?e("div",[t.options&&0!==t.options.length?e("p",{staticClass:"description"},[t._v(" "+t._s(t.text_identities_table_description)+" ")]):e("p",{staticClass:"description"},[e("strong",[t._v(t._s(t.text_no_registered_identities_title))]),t._v(" "+t._s(t.text_no_registered_identities_content)+" ")]),e("div",{staticClass:"ses-identities-container"},[t.options&&t.options.length>0?e("div",{staticClass:"ses-identities-table-container"},[e("table",[t.columns?e("tr",{staticClass:"ses-identity-columns"},t._l(t.filtered_columns,(function(s){return e("th",{key:s.key,class:`ses-identity-column ses-identity-column-${s.key}`},[t._v(" "+t._s(s.label)+" ")])})),0):t._e(),t._l(t.options,(function(s,i){return e("tr",{key:i},[e("td",[t._v(" "+t._s(s.value)+" ")]),e("td",[t._v(" "+t._s(s.type)+" ")]),e("td",[t._v(" "+t._s(s.status)+" ")])])})),t.show_identity_form?t._e():e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main wp-mail-smtp-button-small",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.addNewIdentity.apply(null,arguments)}}},[t._v(" "+t._s(t.text_add_new_identity)+" ")])],2)]):t._e(),t.show_identity_form||!t.options||0===t.options.length?e("div",{staticClass:"wp-mail-smtp-amazonses-identity-form"},[t.options&&0!==t.options.length?t._e():e("h3",[t._v(" "+t._s(t.text_verify_identity)+" ")]),e("div",{directives:[{name:"show",rawName:"v-show",value:1===t.verify_identity_step,expression:"verify_identity_step === 1"}],staticClass:"amazonses-identity-form-step"},[e("settings-input-radio",{attrs:{name:"identity_type",options:t.identity_type_options},model:{value:t.identity_type,callback:function(e){t.identity_type=e},expression:"identity_type"}}),e("p",{domProps:{textContent:t._s(t.verify_identity_text)}}),e("settings-input-text",{attrs:{name:"identity_value",placeholder:t.identity_value_placeholder},model:{value:t.identity_value,callback:function(e){t.identity_value=e},expression:"identity_value"}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main wp-mail-smtp-button-small wp-mail-smtp-button-verify",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.verifyIdentity.apply(null,arguments)}}},[t.loading_verify_identity?e("spin-loader",{attrs:{color:"white"}}):e("span",[t._v(t._s(t.text_verify))])],1)],1),e("div",{directives:[{name:"show",rawName:"v-show",value:2===t.verify_identity_step&&"domain"===t.verify_identity_result.type,expression:"verify_identity_step === 2 && verify_identity_result.type === 'domain'"}],staticClass:"amazonses-identity-form-step amazonses-identity-form-step-domain"},[e("p",{domProps:{innerHTML:t._s(t.text_verify_identity_step2_domain_text)}}),e("div",{staticClass:"amazonses-dns-records"},[e("div",{staticClass:"amazonses-dns-records__row amazonses-dns-records__row--heading"},[e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--heading"},[t._v(" "+t._s(t.text_name)+" ")]),e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--heading"},[t._v(" "+t._s(t.text_value)+" ")])]),t._l(t.verify_identity_result.domain_dkim_dns_records,(function(t,s){return e("div",{key:t.value,staticClass:"amazonses-dns-records__row amazonses-dns-records__row--record"},[e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--record"},[e("settings-input-text",{attrs:{name:`dns_record_name[${s}]`,value:t.name,readonly:"",copy:""}})],1),e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--record"},[e("settings-input-text",{attrs:{name:`dns_record_value[${s}]`,value:t.value,readonly:"",copy:""}})],1)])}))],2)]),e("div",{directives:[{name:"show",rawName:"v-show",value:2===t.verify_identity_step&&"email"===t.verify_identity_result.type,expression:"verify_identity_step === 2 && verify_identity_result.type === 'email'"}],staticClass:"amazonses-identity-form-step"},[e("p",{staticClass:"ses-identities-email-success-notice"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(2411),width:"16",height:"16"}}),t._v(" "),e("span",{domProps:{innerHTML:t._s(t.text_verify_identity_step2_email_text)}})],1)])]):t._e()])]):e("spin-loader",{attrs:{size:"md"}})],1)},ni=[],oi={name:"SettingsAmazonSESIdentities",components:{SettingsInfoTooltip:Wt,SettingsInputRadio:Ue,SettingsInputText:Nt,SpinLoader:ve},props:{options:Array,columns:Array,label:String,tooltip:String},computed:{filtered_columns:function(){return this.columns.filter((t=>"action"!==t.key))},identity_value_placeholder:function(){return"domain"===this.identity_type?(0,l.__)("Please enter a domain","wp-mail-smtp"):(0,l.__)("Please enter a valid email address","wp-mail-smtp")},verify_identity_text:function(){return"domain"===this.identity_type?(0,l.__)("Enter the domain name to verify it on Amazon SES and generate the required DNS CNAME records.","wp-mail-smtp"):(0,l.__)("Enter a valid email address. A verification email will be sent to the email address you entered.","wp-mail-smtp")},text_verify_identity_step2_email_text:function(){return(0,l.gB)((0,l.__)("Please check the inbox of %s for a confirmation email.","wp-mail-smtp"),this.verify_identity_result.value)},text_verify:function(){return"domain"===this.identity_type?(0,l.__)("Verify Domain","wp-mail-smtp"):(0,l.__)("Verify Email","wp-mail-smtp")}},data(){return{text_no_registered_identities_title:(0,l.__)("No registered domains or emails.","wp-mail-smtp"),text_no_registered_identities_content:(0,l.__)("You will not be able to send emails until you verify at least one domain or email address for the selected Amazon SES Region.","wp-mail-smtp"),text_view_dns:(0,l.__)("View DNS","wp-mail-smtp"),text_resend:(0,l.__)("Resend","wp-mail-smtp"),text_identities_table_description:(0,l.__)("Here are the domains and email addresses that have been verified and can be used as the From Email.","wp-mail-smtp"),text_verify_identity:(0,l.__)("Verify SES Identity","wp-mail-smtp"),text_add_new_identity:(0,l.__)("Add New SES Identity","wp-mail-smtp"),text_name:(0,l.__)("Name","wp-mail-smtp"),text_value:(0,l.__)("Value","wp-mail-smtp"),text_verify_identity_step2_domain_text:(0,l.gB)((0,l.__)("Please add these CNAME records to your domain's DNS settings. For information on how to add CNAME DNS records, please refer to the %1$sAmazon SES documentation%2$s.","wp-mail-smtp"),'',""),show_identity_form:!1,identity_type:"domain",identity_type_options:[{label:(0,l.__)("Verify Domain","wp-mail-smtp"),value:"domain"},{label:(0,l.__)("Verify Email Address","wp-mail-smtp"),value:"email"}],identity_value:"",verify_identity_step:1,verify_identity_result:{},loading_verify_identity:!1}},methods:{verifyIdentity:function(){if(this.loading_verify_identity)return;this.loading_verify_identity=!0;const t=this;this.$store.dispatch("$_settings/amazonSESRegisterIdentity",{value:this.identity_value,type:this.identity_type}).then((function(e){t.loading_verify_identity=!1,e.success&&e.data&&(t.verify_identity_result=e.data,t.verify_identity_step=2)}))},addNewIdentity:function(){this.show_identity_form=!0}}},ri=oi,li=(0,d.Z)(ri,ai,ni,!1,null,null,null),mi=li.exports,pi={name:"WizardStepConfigureMailerAmazonSES",components:{SettingsInputText:Nt,SettingsInputSelect:ii,SettingsInputSwitch:es,SettingsAmazonSESIdentities:mi},data(){return{mailer:"amazonses",text_client_id_label:(0,l.__)("Access Key ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Secret Access Key",{NODE_ENV:"production",VUE_APP_TEXTDOMAIN:"wp-mail-smtp",VUE_APP_PRODUCT_NAME:"WPMailSMTP",BASE_URL:""}.VUE_APP_TEXTclient_id),text_region_label:(0,l.__)("Region","wp-mail-smtp"),text_identities_label:(0,l.__)("SES Identities","wp-mail-smtp"),text_region_description:(0,l.__)("Please select the Amazon SES API region which is the closest to where your website is hosted. This can help to decrease network latency between your site and Amazon SES, which will speed up email sending.","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Amazon SES","wp-mail-smtp"),text_no_ssl:(0,l.__)("Amazon SES requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out ","wp-mail-smtp"),text_no_ssl_link_text:(0,l.__)("WPBeginner's tutorial on how to set up SSL","wp-mail-smtp"),text_no_ssl_diff_mailer:(0,l.__)("If you'd prefer not to set up SSL, or need an SMTP solution in the meantime, please go back and select a different mailer option.","wp-mail-smtp"),description:this.$wpms.mailer_options.amazonses.description.substr(0,this.$wpms.mailer_options.amazonses.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-amazon-ses-mailer-in-wp-mail-smtp/",{content:"Read how to set up Amazon SES"}),regionOptions:this.$wpms.mailer_options.amazonses.region_options||[],fetching_identities:!1,is_ssl:this.$wpms.is_ssl,field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.amazonses.client_id","settings.amazonses.client_secret","settings.amazonses.region","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"]),...(0,ct.vn)("$_settings",{identities_columns:"amazonses_identities.columns",identities:"amazonses_identities.data"}),...(0,ct.vn)("$_wizard",["blocked_step"]),is_api_auth_missing:function(){return!this.client_id||!this.client_secret||!this.region}},watch:{client_id:function(){this.getIdentitiesDelayed()},client_secret:function(){this.getIdentitiesDelayed()},region:function(){this.getIdentities()}},methods:{getIdentities:function(){this.fetching_identities||this.client_id.length<20||this.client_secret.length<40||!this.region||(this.fetching_identities=!0,this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/getAmazonSESIdentities").then((()=>{this.fetching_identities=!1})).finally((()=>{this.$store.dispatch("$_app/stop_loading")})))},getIdentitiesDelayed:Xs()((function(){this.getIdentities()}),500),areRequiredFieldsValid(){return""===this.client_id&&this.field_errors.push("client_id"),""===this.client_secret&&this.field_errors.push("client_secret"),""===this.region&&this.field_errors.push("region"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}},mounted(){this.getIdentities(),this.$wpms.is_ssl||(this.blocked_step=!0)}},ci=pi,_i=(0,d.Z)(ci,Ks,Js,!1,null,"06bea086",null),di=_i.exports,ui=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-gmail"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("b",[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_GMAIL_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",type:"password",constant:"WPMS_GMAIL_CLIENT_SECRET",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-text",{attrs:{value:t.redirect_uri,name:"redirect_uri",label:t.text_redirect_uri_label,copy:"",readonly:""}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-o-auth-connection",{attrs:{label:t.text_authorization_label,mailer:t.mailer,connected_email:t.connected_email_address,is_auth_required:t.is_auth_required,client_id:t.client_id,client_secret:t.client_secret}}),t.is_auth_required?t._e():e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-general-settings"},[e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-select",{attrs:{name:"from_email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,options:t.possible_send_as_emails,description:t.text_from_email_description},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}})],1)],1)])},hi=[],gi=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-oauth-connection"},[e("label",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),t.is_auth_required?e("div",{staticClass:"add-authorization-container"},[e("p",{staticClass:"description",domProps:{textContent:t._s(t.text_authorization_button_description)}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main wp-mail-smtp-button-small",attrs:{type:"button",disabled:!t.are_client_details_ready},on:{click:function(e){return e.preventDefault(),t.authorize.apply(null,arguments)}}},[t._v(" "+t._s(t.text_authorization_button)+" ")])]):e("div",{staticClass:"remove-authorization-container"},[t.connected_email?e("p",{staticClass:"description connected-as"},[e("span",{domProps:{innerHTML:t._s(t.text_connected_as_with_email)}}),t._v(" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(2546),width:"16",height:"16"}})],1):t._e(),"gmail"===t.mailer?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.text_remove_authorization_button_description_google)}}):t._e(),e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.text_remove_authorization_button_description)}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-red wp-mail-smtp-button-small",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.removeAuthorization.apply(null,arguments)}}},[t._v(" "+t._s(t.text_remove_authorization_button)+" ")])])])},fi=[],wi={name:"SettingsOAuthConnection",components:{SettingsInfoTooltip:Wt},props:{label:String,mailer:String,connected_email:String,is_auth_required:Boolean,client_id:String,client_secret:String,tooltip:String,disabled:Boolean},data(){return{text_allow_button:(0,l.__)("Connect to %s","wp-mail-smtp"),text_authorization_button_description_general:(0,l.__)("Before continuing, you'll need to allow this plugin to send emails using your %s account.","wp-mail-smtp"),text_remove_authorization_button:(0,l.__)("Remove OAuth Connection","wp-mail-smtp"),text_remove_authorization_button_description_google:(0,l.gB)((0,l.__)("If you want to use a different From Email address you can setup a Google email alias. %1$sFollow these instructions%2$s, then select the alias in the From Email section below.","wp-mail-smtp"),'',""),text_remove_authorization_button_desc_template:(0,l.__)("Removing this OAuth connection will give you the ability to redo the OAuth connection or connect to different %s account.","wp-mail-smtp"),text_connected_as:(0,l.__)("Connected as","wp-mail-smtp")}},computed:{are_client_details_ready:function(){return!!this.client_id&&!!this.client_secret},mailer_name:function(){let t="Google";return"outlook"===this.mailer?t="Microsoft Outlook":"zoho"===this.mailer&&(t="Zoho Mail"),t},text_authorization_button:function(){return(0,l.gB)(this.text_allow_button,this.mailer_name)},text_authorization_button_description:function(){return(0,l.gB)(this.text_authorization_button_description_general,this.mailer_name)},text_remove_authorization_button_description:function(){return(0,l.gB)(this.text_remove_authorization_button_desc_template,this.mailer_name)},text_connected_as_with_email:function(){return`${this.text_connected_as} ${this.connected_email}`}},methods:{authorize:function(){this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/getAuthUrl",this.mailer).then((function(t){t.success&&t.data.oauth_url&&(window.location.href=t.data.oauth_url)})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},removeAuthorization:function(){this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/removeAuth",this.mailer).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},removeUrlParam:function(t,e,s){e.delete(s),t.search=e.toString(),window.history.replaceState({},document.title,t.toString())},catchAuthNotice:function(){const t=new URL(window.location.href),e=new URLSearchParams(t.search);let s="",i="",a=!1;switch(e.has("success")?(s=e.get("success"),a=!0,this.removeUrlParam(t,e,"success")):e.has("error")&&(s=e.get("error"),this.removeUrlParam(t,e,"error")),s){case"oauth_invalid_state":i=(0,l.__)("There was an error while processing the authentication request. The state key is invalid. Please try again.","wp-mail-smtp");break;case"google_no_code_scope":case"google_access_denied":case"zoho_access_denied":i=(0,l.__)("There was an error while processing the authentication request. Please try again.","wp-mail-smtp");break;case"google_no_clients":case"zoho_no_clients":case"microsoft_unsuccessful_oauth":case"google_unsuccessful_oauth":i=(0,l.__)("There was an error while processing the authentication request. Please recheck your Client ID and Client Secret and try again.","wp-mail-smtp");break;case"google_invalid_nonce":case"microsoft_invalid_nonce":case"zoho_invalid_nonce":i=(0,l.__)("There was an error while processing the authentication request. The nonce is invalid. Please try again.","wp-mail-smtp");break;case"microsoft_no_code":case"zoho_no_code":i=(0,l.__)("There was an error while processing the authentication request. The authorization code is missing. Please try again.","wp-mail-smtp");break;case"zoho_unsuccessful_oauth":i=(0,l.__)("There was an error while processing the authentication request. Please recheck your Region, Client ID and Client Secret and try again.","wp-mail-smtp");break;case"google_site_linked":i=(0,l.__)("You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail.","wp-mail-smtp");break;case"microsoft_site_linked":i=(0,l.__)("You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook.","wp-mail-smtp");break;case"zoho_site_linked":i=(0,l.__)("You have successfully linked the current site with your Zoho Mail API project. Now you can start sending emails through Zoho Mail.","wp-mail-smtp");break}i.length>0&&this.$swal({title:a?(0,l.__)("Successful Authorization","wp-mail-smtp"):(0,l.__)("Authorization Error!","wp-mail-smtp"),text:i,width:550,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})}},mounted(){this.catchAuthNotice()}},Ai=wi,bi=(0,d.Z)(Ai,gi,fi,!1,null,null,null),vi=bi.exports,xi={name:"WizardStepConfigureMailerGmail",components:{SettingsInputText:Nt,SettingsInputSwitch:es,SettingsOAuthConnection:vi,SettingsInputSelect:ii},data(){return{mailer:"gmail",text_client_id_label:(0,l.__)("Client ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Client Secret","wp-mail-smtp"),text_redirect_uri_label:(0,l.__)("Authorized Redirect URI","wp-mail-smtp"),text_authorization_label:(0,l.__)("Authorization","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("Select which email address you would like to send your emails from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up the Gmail mailer","wp-mail-smtp"),description:this.$wpms.mailer_options.gmail.description.substr(0,this.$wpms.mailer_options.gmail.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-gmail-mailer-in-wp-mail-smtp/#create-app",{content:"Read how to set up the Gmail mailer"}),redirect_uri:this.$wpms.mailer_options.gmail.redirect_uri,connected_email_address:null,possible_send_as_emails:[],field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.gmail.client_id","settings.gmail.client_secret","settings.gmail.access_token","settings.gmail.refresh_token","settings.mail.from_email","settings.mail.from_name","settings.mail.from_name_force"]),...(0,ct.vn)("$_wizard",["blocked_step"]),is_auth_required:function(){return!this.access_token||!this.refresh_token}},watch:{is_auth_required:function(t){this.blocked_step=t}},methods:{getConnectedData:function(){const t=this;this.$store.dispatch("$_settings/getConnectedData",this.mailer).then((function(e){e.success&&e.data&&(t.connected_email_address=e.data.connected_email||null,t.possible_send_as_emails=e.data.possible_send_from_addresses||[],t.isEmailInPosibleAddresses(t.from_email)||(t.from_email=t.connected_email_address))}))},isEmailInPosibleAddresses(t){return this.possible_send_as_emails.find((e=>e.value===t))},areRequiredFieldsValid(){let t=!0;return""===this.client_id&&(t=!1,this.field_errors.push("client_id")),""===this.client_secret&&(t=!1,this.field_errors.push("client_secret")),t},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))}},mounted(){this.getConnectedData(),this.is_auth_required&&(this.blocked_step=!0)}},ki=xi,yi=(0,d.Z)(ki,ui,hi,!1,null,null,null),Ci=yi.exports,Si=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-outlook"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),t.is_ssl?e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_OUTLOOK_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",type:"password",constant:"WPMS_OUTLOOK_CLIENT_SECRET",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-text",{attrs:{value:t.redirect_uri,name:"redirect_uri",label:t.text_redirect_uri_label,copy:"",readonly:""}}),e("settings-o-auth-connection",{attrs:{label:t.text_authorization_label,mailer:t.mailer,connected_email:t.connected_email_address,is_auth_required:t.is_auth_required,client_id:t.client_id,client_secret:t.client_secret}}),t.is_auth_required?t._e():e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-general-settings"},[e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)],1):e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("div",{staticClass:"wp-mail-smtp-notice wp-mail-smtp-notice--error"},[e("p",[e("span",[t._v(t._s(t.text_no_ssl))]),t._v(" "),e("a",{attrs:{href:"https://www.wpbeginner.com/wp-tutorials/how-to-add-ssl-and-https-in-wordpress/",target:"_blank",rel:"noopener"}},[t._v(t._s(t.text_no_ssl_link_text))]),t._v(".")]),e("p",[t._v(t._s(t.text_no_ssl_diff_mailer))])])])])},Pi=[],Mi={name:"WizardStepConfigureMailerOutlook",components:{SettingsInputText:Nt,SettingsInputSwitch:es,SettingsOAuthConnection:vi},data(){return{mailer:"outlook",text_client_id_label:(0,l.__)("Application ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Application Password","wp-mail-smtp"),text_redirect_uri_label:(0,l.__)("Redirect URI","wp-mail-smtp"),text_authorization_label:(0,l.__)("Authorization","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Microsoft Outlook / 365","wp-mail-smtp"),text_no_ssl:(0,l.__)("Outlook / 365 requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out ","wp-mail-smtp"),text_no_ssl_link_text:(0,l.__)("WPBeginner's tutorial on how to set up SSL","wp-mail-smtp"),text_no_ssl_diff_mailer:(0,l.__)("If you'd prefer not to set up SSL, or need an SMTP solution in the meantime, please go back and select a different mailer option.","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),description:this.$wpms.mailer_options.outlook.description.substr(0,this.$wpms.mailer_options.outlook.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-outlook-mailer-in-wp-mail-smtp/#microsoft-setup",{content:"Read how to set up Microsoft Outlook / 365"}),redirect_uri:this.$wpms.mailer_options.outlook.redirect_uri,field_errors:[],is_ssl:this.$wpms.is_ssl}},computed:{...(0,ct.vn)("$_settings",["settings.outlook.client_id","settings.outlook.client_secret","settings.outlook.access_token","settings.outlook.refresh_token","settings.mail.from_email","settings.mail.from_email_force"]),...(0,ct.vn)("$_wizard",["blocked_step"]),...(0,at.Se)({connected_email_address:"$_settings/outlook_email"}),is_auth_required:function(){return!this.access_token||!this.refresh_token}},watch:{is_auth_required:function(t){this.blocked_step=t}},methods:{areRequiredFieldsValid(){return""===this.client_id&&this.field_errors.push("client_id"),""===this.client_secret&&this.field_errors.push("client_secret"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}},mounted(){this.is_auth_required&&(this.blocked_step=!0),this.$wpms.is_ssl||(this.blocked_step=!0)}},Ei=Mi,Ti=(0,d.Z)(Ei,Si,Pi,!1,null,"1230186a",null),Fi=Ti.exports,Ii=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-zoho"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-select",{attrs:{name:"domain",constant:"WPMS_ZOHO_DOMAIN",label:t.text_domain_label,options:t.domain_options,description:t.text_domain_description,is_error:t.field_errors.includes("domain")},on:{is_error_update:function(e){return t.removeFieldError("domain")}},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_ZOHO_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",constant:"WPMS_ZOHO_CLIENT_SECRET",type:"password",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-text",{attrs:{value:t.redirect_uri,name:"redirect_uri",label:t.text_redirect_uri_label,copy:"",readonly:""}}),e("settings-o-auth-connection",{attrs:{label:t.text_authorization_label,mailer:t.mailer,connected_email:t.connected_email_address,is_auth_required:t.is_auth_required,client_id:t.client_id,client_secret:t.client_secret}}),t.is_auth_required?t._e():e("div",[e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}})],1)],1)])},Bi=[],Di={name:"WizardStepConfigureMailerZoho",components:{SettingsInputText:Nt,SettingsInputSwitch:es,SettingsInputSelect:ii,SettingsOAuthConnection:vi},data(){return{mailer:"zoho",text_domain_label:(0,l.__)("Region","wp-mail-smtp"),text_domain_description:(0,l.__)("The data center location used by your Zoho account.","wp-mail-smtp"),text_client_id_label:(0,l.__)("Client ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Client Secret","wp-mail-smtp"),text_redirect_uri_label:(0,l.__)("Redirect URI","wp-mail-smtp"),text_authorization_label:(0,l.__)("Authorization","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Zoho Mail","wp-mail-smtp"),description:this.$wpms.mailer_options.zoho.description.substr(0,this.$wpms.mailer_options.zoho.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-zoho-mailer-in-wp-mail-smtp/#zoho-account",{content:"Read how to set up Zoho Mail"}),redirect_uri:this.$wpms.mailer_options.zoho.redirect_uri,domain_options:this.$wpms.mailer_options.zoho.domain_options,field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.zoho.domain","settings.zoho.client_id","settings.zoho.client_secret","settings.zoho.access_token","settings.zoho.refresh_token","settings.mail.from_name","settings.mail.from_name_force"]),...(0,ct.vn)("$_wizard",["blocked_step"]),...(0,at.Se)({connected_email_address:"$_settings/zoho_email"}),is_auth_required:function(){return!this.access_token||!this.refresh_token}},watch:{is_auth_required:function(t){this.blocked_step=t}},methods:{areRequiredFieldsValid(){let t=!0;return""===this.domain&&(t=!1,this.field_errors.push("domain")),""===this.client_id&&(t=!1,this.field_errors.push("client_id")),""===this.client_secret&&(t=!1,this.field_errors.push("client_secret")),t},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))}},mounted(){this.is_auth_required&&(this.blocked_step=!0)}},zi=Di,Oi=(0,d.Z)(zi,Ii,Bi,!1,null,null,null),Wi=Oi.exports,Li=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-configure-email-logs"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configure-email-logs-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"wp-mail-smtp-plugin-configure-email-logs"},[e("settings-input-long-checkbox",{attrs:{name:"log_email_content",label:t.text_log_email_content,description:t.text_log_email_content_desc},model:{value:t.log_email_content,callback:function(e){t.log_email_content=e},expression:"log_email_content"}}),e("settings-input-long-checkbox",{attrs:{name:"save_attachments",label:t.text_save_attachments,description:t.text_save_attachments_desc},model:{value:t.save_attachments,callback:function(e){t.save_attachments=e},expression:"save_attachments"}}),e("settings-input-long-checkbox",{attrs:{name:"open_email_tracking",label:t.text_open_email_tracking,description:t.text_open_email_tracking_desc},model:{value:t.open_email_tracking,callback:function(e){t.open_email_tracking=e},expression:"open_email_tracking"}}),e("settings-input-long-checkbox",{attrs:{name:"click_link_tracking",label:t.text_click_link_tracking,description:t.text_click_link_tracking_desc},model:{value:t.click_link_tracking,callback:function(e){t.click_link_tracking=e},expression:"click_link_tracking"}})],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},Ri=[],Qi={name:"WizardStepConfigureEmailLogs",components:{ContentHeader:h,TheWizardStepCounter:X,SettingsInputLongCheckbox:kt},data(){return{text_header_title:(0,l.__)("Configure Email Logs","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Enable these powerful logging features for more control of your WordPress emails.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_log_email_content:(0,l.__)("Store the content for all sent emails","wp-mail-smtp"),text_log_email_content_desc:(0,l.__)("This option must be enabled if you'd like to be able to resend emails. Please be aware that all email content will be stored in your WordPress database. This may include sensitive data, passwords, and personal details.","wp-mail-smtp"),text_save_attachments:(0,l.__)("Save file attachments sent from WordPress","wp-mail-smtp"),text_save_attachments_desc:(0,l.__)("All file attachments sent from your site will be saved to the WordPress Uploads folder. Please note that this may reduce available disk space on your server.","wp-mail-smtp"),text_open_email_tracking:(0,l.__)("Track when an email is opened","wp-mail-smtp"),text_open_email_tracking_desc:(0,l.__)("See which emails were opened by the recipients. Email open tracking works with emails that are sent in HTML format.","wp-mail-smtp"),text_click_link_tracking:(0,l.__)("Track when a link in an email is clicked","wp-mail-smtp"),text_click_link_tracking_desc:(0,l.__)("See which links were clicked in emails sent from your WordPress site. Click tracking works with emails that are sent in HTML format.","wp-mail-smtp")}},computed:{...(0,ct.vn)("$_settings",["settings.logs.log_email_content","settings.logs.save_attachments","settings.logs.open_email_tracking","settings.logs.click_link_tracking"])},methods:{handleSubmit(){this.$store.dispatch("$_app/start_loading");let t={value:{logs:{log_email_content:this.log_email_content,save_attachments:this.save_attachments,open_email_tracking:this.open_email_tracking,click_link_tracking:this.click_link_tracking}}};this.$store.dispatch("$_settings/updateSettings",t).then((t=>{t.success?this.nextStep():this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},previousStep(){this.$previous_step()},nextStep(){this.$next_step()}}},Ni=Qi,Zi=(0,d.Z)(Ni,Li,Ri,!1,null,null,null),Ui=Zi.exports,Hi=new n.ZP({routes:[{path:"*",redirect:"/"},{path:"/",name:"welcome",component:C},{path:"/step",name:"step",component:W,children:[{path:"import",name:"import_step",component:et},{path:"choose_mailer",name:"choose_mailer_step",component:lt},{path:"configure_mailer",name:"configure_mailer_step",component:ht,children:[{path:"smtp",name:"configure_mailer_step_smtp",component:ns},{path:"sendlayer",name:"configure_mailer_step_sendlayer",component:cs},{path:"smtpcom",name:"configure_mailer_step_smtpcom",component:fs},{path:"sendinblue",name:"configure_mailer_step_sendinblue",component:ks},{path:"mailgun",name:"configure_mailer_step_mailgun",component:Es},{path:"sendgrid",name:"configure_mailer_step_sendgrid",component:zs},{path:"sparkpost",name:"configure_mailer_step_sparkpost",component:Ns},{path:"postmark",name:"configure_mailer_step_postmark",component:Vs},{path:"amazoneses",name:"configure_mailer_step_amazonses",component:di},{path:"gmail",name:"configure_mailer_step_gmail",component:Ci},{path:"outlook",name:"configure_mailer_step_outlook",component:Fi},{path:"zoho",name:"configure_mailer_step_zoho",component:Wi}]},{path:"plugin_features",name:"plugin_features_step",component:Pt},{path:"configure_email_logs",name:"configure_email_logs_step",component:Ui},{path:"help_improve",name:"help_improve_step",component:Xt},{path:"license",name:"license_step",component:ne},{path:"check_configuration",name:"check_configuration_step",component:ce},{path:"successful_configuration",name:"check_configuration_step_success",component:Ee},{path:"failed_configuration",name:"check_configuration_step_failure",component:ze}]}],scrollBehavior(){return{x:0,y:0}}}),Gi={name:"SetupWizardApp",router:Hi,computed:{...(0,at.Se)({blocked:"$_app/blocked",loading:"$_app/loading"})}},Yi=Gi,Vi=(0,d.Z)(Yi,i,a,!1,null,null,null),Ki=Vi.exports,Ji=s(144),qi=s(9516);const Xi={install(t){window.wp_mail_smtp_vue&&(t.prototype.$wpms=window.wp_mail_smtp_vue),t.prototype.$isPro=ji,t.prototype.$addQueryArg=$i,t.prototype.$getUTMUrl=ta}};function ji(){return window.wp_mail_smtp_vue.is_pro}function $i(t,e,s){var i=new RegExp("([?&])"+e+"=.*?(&|#|$)","i");if(t.match(i))return t.replace(i,"$1"+e+"="+s+"$2");var a="";-1!==t.indexOf("#")&&(a=t.replace(/.*#/,"#"),t=t.replace(/#.*/,""));var n=-1!==t.indexOf("?")?"&":"?";return t+n+e+"="+s+a}function ta(t,e){e={source:"WordPress",medium:"setup-wizard",campaign:ji()?"plugin":"liteplugin",content:"general",...e};for(const[s,i]of Object.entries(e))t=$i(t,`utm_${s}`,encodeURIComponent(i));return t}var ea=Xi;const sa={install(t){t.prototype.$next_step=function(e=0){const s=t.prototype.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))+1+e;this.$router.push({name:t.prototype.$wizard_steps[s]})},t.prototype.$previous_step=function(e=0){let s="welcome";const i=t.prototype.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))-1-e;i>=0&&(s=t.prototype.$wizard_steps[i]),this.$router.push({name:s})},t.prototype.$swal&&(t.prototype.$wpms_success_toast=function(e){let{animation:s=!1,toast:i=!0,position:a="top-end",showConfirmButton:n=!1,icon:o="success",timer:r=3e3,showCloseButton:m=!0,title:p=(0,l.__)("Settings Updated","wp-mail-smtp"),showCancelButton:c=!1,confirmButtonText:_="",cancelButtonText:d="",text:u=""}=e;return t.prototype.$swal({animation:s,toast:i,position:a,showConfirmButton:n,icon:o,showCloseButton:m,title:p,timer:r,showCancelButton:c,confirmButtonText:_,cancelButtonText:d,text:u})},t.prototype.$wpms_error_toast=function(e){let{animation:s=!1,toast:i=!0,position:a="top-end",showConfirmButton:n=!1,icon:o="error",showCloseButton:r=!0,title:m=(0,l.__)("Could Not Save Changes","wp-mail-smtp"),text:p=""}=e;return t.prototype.$swal({animation:s,toast:i,position:a,showConfirmButton:n,icon:o,showCloseButton:r,title:m,text:p,onOpen:function(){t.prototype.$swal.hideLoading()}})},t.prototype.$wpms_error_modal=function(e){let{position:s="center",width:i=650,showConfirmButton:a=!0,confirmButtonText:n=(0,l.__)("Return to Mailer Settings","wp-mail-smtp"),customClass:o={container:"wp-mail-smtp-swal wp-mail-smtp-swal-error"},showCloseButton:r=!0,title:m=(0,l.__)("Whoops, we found an issue!","wp-mail-smtp"),subtitle:p=(0,l.__)("It looks like something went wrong...","wp-mail-smtp"),detailedError:c=""}=e;return t.prototype.$swal({position:s,width:i,showConfirmButton:a,confirmButtonText:n,customClass:o,showCloseButton:r,title:m,html:`\n\t\t\t\t\t\t

      ${p}

      \n\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t

      ${(0,l.__)("Error Message:","wp-mail-smtp")}

      \n\t\t\t\t\t\t\t
      ${c}
      \n\t\t\t\t\t\t
      \n\t\t\t\t\t`,allowEscapeKey:!1,allowOutsideClick:!1,onOpen:function(){t.prototype.$swal.hideLoading()}})},t.prototype.$required_fields_modal=function(){return t.prototype.$swal({position:"center",width:450,showConfirmButton:!0,confirmButtonText:(0,l.__)("OK","wp-mail-smtp"),customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"},showCloseButton:!0,title:(0,l.__)("Heads up!","wp-mail-smtp"),text:(0,l.__)("Please fill out all the required fields to continue.","wp-mail-smtp"),allowEscapeKey:!1,allowOutsideClick:!1})})}};var ia=sa,aa=s(9669),na=s.n(aa);const oa=function(t,e){return new Promise(((s,i)=>{let a=new FormData;a.append("action","wp_mail_smtp_vue_install_plugin"),a.append("nonce",Ji.ZP.prototype.$wpms.nonce),a.append("slug",e),na().post(Ji.ZP.prototype.$wpms.ajax_url,a).then((e=>{if(e.data.success)t.commit("PLUGIN_INSTALLED",e.data);else{let t="";ee()(e.data,"data[0].message")?t=e.data.data[0].message:ee()(e.data,"data")&&(t=e.data.data),Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like the plugin installation failed!","wp-mail-smtp"),detailedError:t})}s(e.data)})).catch((function(t){if(i(t),t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't install the plugin.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline. Plugin not installed.","wp-mail-smtp")})}))}))},ra=function(t){return new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_partner_plugins_info"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((s=>{s.data.success?t.commit("PLUGINS_FETCHED",s.data):Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Can't fetch plugins information.","wp-mail-smtp")}),e(s.data)})).catch((function(t){if(s(t),t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't fetch plugins information.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline. Plugin information not retrieved.","wp-mail-smtp")})}))}))};var la={installPlugin:oa,fetchPlugins:ra};const ma=function(t,e){return la.installPlugin(t,e)},pa=function(t){return la.fetchPlugins(t)};var ca={installPlugin:ma,getPlugins:pa};const _a=t=>t.plugins,da=t=>t.plugins.filter((t=>"wpforms-lite"!==t.slug)),ua=t=>t.contact_form_plugin_already_installed;var ha={getField:ct.rz,plugins:_a,partner_plugins:da,contact_form_plugin_already_installed:ua};const ga=(t,e)=>{t.plugins.map((s=>(s.slug===e.data.slug&&(s.is_installed=e.data.is_installed,s.is_activated=e.data.is_activated),"wpforms-lite"===e.data.slug&&(t.contact_form_plugin_already_installed=!0),s)))},fa=(t,e)=>{t.plugins=e.data.plugins,t.contact_form_plugin_already_installed=e.data.contact_form_plugin_already_installed};var wa={updateField:ct.L4,PLUGIN_INSTALLED:ga,PLUGINS_FETCHED:fa};const Aa={plugins:[],contact_form_plugin_already_installed:!1,smart_contact_form_setting:!0};var ba={namespaced:!0,state:Aa,actions:ca,getters:ha,mutations:wa};const va=t=>new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_settings"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((t=>{t.data.success?e(t.data):s(t.data)})).catch((function(e){if(t.dispatch("$_app/block",!1,{root:!0}),e.response){const t=e.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load the settings.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),t.status,t.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))})),xa=(t,e)=>new Promise(((t,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_amazon_ses_identities"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==e&&i.append("value",JSON.stringify(e)),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((e=>{e.data.success?t(e.data):s(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't retrieve Amazon SES Identities.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Can't retrieve Amazon SES Identities.","wp-mail-smtp")})}))})),ka=(t,e)=>new Promise(((t,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_amazon_ses_identity_registration"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==e.value&&i.append("value",e.value),!1!==e.value&&i.append("type",e.type),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((e=>{e.data.success?t(e.data):s(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't register the Amazon SES Identity.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Can't register the Amazon SES Identity","wp-mail-smtp")})}))})),ya=(t,e)=>new Promise((t=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_update_settings"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),void 0!==e.overwrite&&s.append("overwrite",e.overwrite),!1!==e.value&&s.append("value",JSON.stringify(e.value)),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((e=>{t(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't save the settings.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Network error encountered. Settings not saved.","wp-mail-smtp")})}))})),Ca=(t,e)=>new Promise((t=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_import_settings"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==e.value&&s.append("value",e.value),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((e=>{t(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't import the plugin settings.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Network error encountered. SMTP plugin import failed!","wp-mail-smtp")})}))})),Sa=function(t,e){return new Promise(((s,i)=>{let a=new FormData;a.append("action","wp_mail_smtp_vue_get_oauth_url"),a.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==t&&a.append("mailer",t),!1!==e&&a.append("settings",JSON.stringify(e)),na().post(Ji.ZP.prototype.$wpms.ajax_url,a).then((t=>{t.data.success?s(t.data):i(t.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load authentication details.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))}))},Pa=function(t){return new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_remove_oauth_connection"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==t&&i.append("mailer",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((t=>{t.data.success?e(t.data):s(t.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't remove OAuth connection.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))}))},Ma=function(t){return new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_connected_data"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==t&&i.append("mailer",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((t=>{t.data.success?e(t.data):s(t.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load oAuth connected data.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))}))},Ea=function(t){return new Promise((e=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_subscribe_to_newsletter"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),s.append("email",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((t=>{e(t.data)}))}))},Ta=function(t){return new Promise((e=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_verify_license_key"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),s.append("license_key",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((t=>{e(t.data)}))}))},Fa=function(t){return new Promise((e=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_upgrade_plugin"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),s.append("license_key",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((t=>{e(t.data)}))}))};var Ia={fetchSettings:va,saveSettings:ya,importOtherPluginSettings:Ca,fetchAmazonSESIdentities:xa,amazonSESRegisterIdentity:ka,getAuthRedirect:Sa,removeAuth:Pa,getConnectedData:Ma,subscribeToNewsletter:Ea,verifyLicense:Ta,upgradePlugin:Fa};const Ba=t=>Ia.fetchSettings(t).then((e=>{t.commit("SETTINGS_UPDATED",e.data)})).catch((t=>{if(t.data)return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load existing settings.","wp-mail-smtp"),detailedError:t.data})})),Da=t=>{const e=t.getters.settings.amazonses;if(0!==Object.keys(e).length)return Ia.fetchAmazonSESIdentities(t,e).then((e=>{t.commit("AMAZONSES_IDENTITIES_UPDATED",e),Ji.ZP.swal.close()})).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't retrieve the Amazon SES Identities.","wp-mail-smtp"),detailedError:t.data?t.data:""})}))},za=(t,e)=>Ia.amazonSESRegisterIdentity(t,e).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't register the Amazon SES Identity.","wp-mail-smtp"),detailedError:t.data})})),Oa=(t,e)=>{t.commit("MAILER_UPDATE",e)},Wa=(t,e)=>new Promise((function(s){t.commit("LOGS_UPDATE",e),s({success:!0})})),La=(t,e)=>new Promise((function(s){t.commit("SUMMARY_REPORT_EMAIL_UPDATE",e),s({success:!0})})),Ra=(t,e)=>{t.commit("SETTINGS_SAVE_START");let s=Ia.saveSettings(t,e);return s.then((function(){t.commit("SETTINGS_SAVE_END")})),s},Qa=t=>{const e=t.getters.settings;t.commit("SETTINGS_SAVE_START");let s=Ia.saveSettings(t,{value:e});return s.then((function(){t.commit("SETTINGS_SAVE_END")})),s},Na=(t,e)=>(t.commit("SETTINGS_SAVE_START"),new Promise((function(s){Ia.importOtherPluginSettings(t,e).then((function(e){t.commit("SETTINGS_SAVE_END"),e.success?Ba(t).then((function(){s(!0)})):s(!1)}))}))),Za=(t,e)=>Ia.getAuthRedirect(e,t.getters.settings[e]).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load oAuth redirect.","wp-mail-smtp"),detailedError:t.data})})),Ua=(t,e)=>Ia.getConnectedData(e).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load oAuth connected data.","wp-mail-smtp"),detailedError:t.data})})),Ha=(t,e)=>Ia.removeAuth(e).then((function(){t.commit("SETTINGS_REMOVE_AUTH",e)})).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't remove oAuth connection.","wp-mail-smtp"),detailedError:t.data})})),Ga=(t,e)=>new Promise((s=>{t.commit("SETTINGS_SAVE_PLUGIN_FEATURES",e),s({success:!0,features:e})})),Ya=(t,e)=>Ia.subscribeToNewsletter(e),Va=(t,e)=>Ia.verifyLicense(e),Ka=(t,e)=>Ia.upgradePlugin(e);var Ja={getSettings:Ba,updateSettings:Ra,importOtherPlugin:Na,setMailer:Oa,setLogs:Wa,setSummaryReportEmail:La,saveCurrentSettings:Qa,getAmazonSESIdentities:Da,amazonSESRegisterIdentity:za,getAuthUrl:Za,removeAuth:Ha,getConnectedData:Ua,savePluginFeatures:Ga,subscribeToNewsletter:Ya,verifyLicense:Va,upgradePlugin:Ka};const qa=t=>t.settings,Xa=t=>t.settings.mail.mailer,ja=t=>t.settings.outlook.user_details?t.settings.outlook.user_details.email:null,$a=t=>t.settings.zoho.user_details?t.settings.zoho.user_details.email:null,tn=t=>t.plugin_features,en=t=>!!t.settings.logs.enabled&&t.settings.logs.enabled,sn=t=>!t.settings.general.summary_report_email_disabled,an=t=>e=>{let s=!1;const i=t.amazonses_identities.data,a=e.split("@").pop();return void 0!==i&&(i.forEach((t=>{("email"===t.type&&t.value===e||"domain"===t.type&&t.value===a)&&(s=!0)})),s)};var nn={getField:ct.rz,settings:qa,mailer:Xa,outlook_email:ja,zoho_email:$a,plugin_features:tn,amazonses_is_email_registered:an,email_log_enabled:en,summary_report_email_enabled:sn},on=s(2378),rn=s.n(on);const ln=(t,e)=>{t.is_saving=!1,t.settings=rn()(t.settings,e)},mn=(t,e)=>{t.amazonses_identities=e.data},pn=(t,e)=>{t.settings.mail.mailer=e},cn=(t,e)=>{t.settings.logs.enabled=e},_n=(t,e)=>{t.settings.general.summary_report_email_disabled=e},dn=t=>{t.is_saving=!0},un=t=>{t.is_saving=!1},hn=(t,e)=>{const s=t.settings[e];t.settings[e]={client_id:s.client_id,client_secret:s.client_secret},"zoho"===e&&(t.settings[e].domain=s.domain)},gn=(t,e)=>{t.plugin_features=e};var fn={updateField:ct.L4,SETTINGS_UPDATED:ln,SETTINGS_SAVE_START:dn,SETTINGS_SAVE_END:un,MAILER_UPDATE:pn,LOGS_UPDATE:cn,SUMMARY_REPORT_EMAIL_UPDATE:_n,AMAZONSES_IDENTITIES_UPDATED:mn,SETTINGS_REMOVE_AUTH:hn,SETTINGS_SAVE_PLUGIN_FEATURES:gn};const wn={settings:{mail:{mailer:"mail",from_email:"",from_name:"",return_path:!1,from_email_force:!0,from_name_force:!1},smtp:{host:"",port:"587",encryption:"tls",autotls:!0,auth:!0,user:"",pass:""},sendlayer:{api_key:""},smtpcom:{api_key:"",channel:""},sendinblue:{api_key:"",domain:""},mailgun:{api_key:"",domain:"",region:"US"},sendgrid:{api_key:"",domain:""},sparkpost:{api_key:"",region:"US"},postmark:{server_api_token:"",message_stream:""},amazonses:{client_id:"",client_secret:"",region:"us-east-1"},gmail:{client_id:"",client_secret:"",access_token:{},refresh_token:""},outlook:{client_id:"",client_secret:"",access_token:{},refresh_token:"",user_details:{email:""}},zoho:{client_id:"",client_secret:"",domain:"com",access_token:{},refresh_token:"",user_details:{email:""}},logs:{enabled:!1,log_email_content:!1,save_attachments:!1,open_email_tracking:!1,click_link_tracking:!1},general:{summary_report_email_disabled:!1},alert_email:{enabled:!1,connections:{}}},amazonses_identities:{},plugin_features:[]};var An={namespaced:!0,state:wn,actions:Ja,getters:nn,mutations:fn};const bn=()=>new Promise((t=>{let e=new FormData;e.append("action","wp_mail_smtp_vue_check_mailer_configuration"),e.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,e).then((e=>{t(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't perform the mailer configuration check.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))})),vn=t=>{let e=new FormData;e.append("action","wp_mail_smtp_vue_send_feedback"),e.append("nonce",Ji.ZP.prototype.$wpms.nonce),e.append("data",JSON.stringify(t)),na().post(Ji.ZP.prototype.$wpms.ajax_url,e).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't send the feedback.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))},xn=()=>{let t=new FormData;t.append("action","wp_mail_smtp_vue_wizard_steps_started"),t.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,t)};var kn={checkMailerConfiguration:bn,sendFeedback:vn,started:xn};const yn=()=>kn.checkMailerConfiguration(),Cn=(t,e)=>{kn.sendFeedback(e)},Sn=()=>{kn.started()};var Pn={checkMailerConfiguration:yn,sendFeedback:Cn,started:Sn};const Mn=t=>t.blocked_step,En=t=>t.current_user_email;var Tn={getField:ct.rz,blocked_step:Mn,current_user_email:En},Fn={updateField:ct.L4};const In={blocked_step:!1,current_user_email:window.wp_mail_smtp_vue.current_user_email};var Bn={namespaced:!0,state:In,actions:Pn,getters:Tn,mutations:Fn};const Dn=t=>{t.commit("INIT")},zn=t=>{t.commit("BLOCK_APP")},On=t=>{t.commit("UNBLOCK_APP")},Wn=t=>{t.commit("APP_LOADING_START")},Ln=t=>{t.commit("APP_LOADING_STOP")};var Rn={init:Dn,block:zn,unblock:On,start_loading:Wn,stop_loading:Ln};const Qn=t=>t.blocked,Nn=t=>t.loading,Zn=t=>t.wpms;var Un={blocked:Qn,loading:Nn,wpms:Zn};const Hn=()=>{},Gn=t=>{t.blocked=!0},Yn=t=>{t.blocked=!1},Vn=t=>{t.loading=!0},Kn=t=>{t.loading=!1};var Jn={INIT:Hn,BLOCK_APP:Gn,UNBLOCK_APP:Yn,APP_LOADING_START:Vn,APP_LOADING_STOP:Kn};const qn={blocked:!1,loading:!1,wpms:window.wp_mail_smtp_vue?window.wp_mail_smtp_vue:{}};var Xn={namespaced:!0,state:qn,actions:Rn,getters:Un,mutations:Jn};const jn=t=>{t.subscribe(((e,s)=>{if("$_app/INIT"===e.type){const e=s["$_app"].wpms.versions;let i="",a="";e.php_version_below_55?(i=(0,l.__)("Yikes! PHP Update Required","wp-mail-smtp"),a=(0,l.gB)((0,l.__)("WP Mail SMTP has detected that your site is running an outdated, insecure version of PHP (%1$s), which could be putting your site at risk for being hacked. WordPress stopped supporting your PHP version in April, 2019. Updating to the recommended version (PHP %2$s) only takes a few minutes and will make your website significantly faster and more secure.","wp-mail-smtp"),e.php_version,"7.4")):e.php_version_below_56?(i=(0,l.__)("Yikes! PHP Update Required","wp-mail-smtp"),a=(0,l.gB)((0,l.__)("WP Mail SMTP has detected that your site is running an outdated, insecure version of PHP (%1$s). Some mailers require at least PHP version 5.6. Updating to the recommended version (PHP %2$s) only takes a few minutes and will make your website significantly faster and more secure.","wp-mail-smtp"),e.php_version,"7.4")):e.wp_version_below_49&&(i=(0,l.__)("Yikes! WordPress Update Required","wp-mail-smtp"),a=(0,l.gB)((0,l.__)("WP Mail SMTP has detected that your site is running an outdated version of WordPress (%s). WP Mail SMTP requires at least WordPress version 4.9.","wp-mail-smtp"),e.wp_version)),Ji.ZP.prototype.$swal&&i.length&&(t.dispatch("$_app/block"),Ji.ZP.prototype.$swal.close(),Ji.ZP.prototype.$swal({title:i,html:`

      ${a}

      ${(0,l.__)("Return to Plugin Settings","wp-mail-smtp")}

      `,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"},allowOutsideClick:!1,allowEscapeKey:!1,allowEnterKey:!1,showConfirmButton:!1,onOpen:function(){Ji.ZP.prototype.$swal.hideLoading()}}))}}))};var $n=jn;Ji.ZP.use(at.ZP);const to=[$n];var eo=new at.ZP.Store({modules:{$_app:Xn,$_plugins:ba,$_settings:An,$_wizard:Bn},plugins:to}),so=s(7575),io=(s(528),s(4952));const ao=document.getElementById("wp-mail-smtp-vue-setup-wizard");Ji.ZP.config.productionTip=!1,s.p=window.wp_mail_smtp_vue.public_url,Ji.ZP.use(io.InlineSvgPlugin),Ji.ZP.use(n.ZP),Ji.ZP.use(qi.Z),Ji.ZP.use(so.ZP,{defaultTemplate:'',defaultArrowSelector:".wp-mail-smtp-tooltip-arrow, .wp-mail-smtp-tooltip__arrow",defaultInnerSelector:".wp-mail-smtp-tooltip-inner, .wp-mail-smtp-tooltip__inner"}),Ji.ZP.use(ea),(0,l.l5)(window.wp_mail_smtp_vue.translations,"wp-mail-smtp");const no={install(t){t.prototype.$wizard_steps=[],t.prototype.$wpms&&t.prototype.$wpms.other_smtp_plugins.length>0&&t.prototype.$wizard_steps.push("import_step"),t.prototype.$wizard_steps.push("choose_mailer_step"),t.prototype.$wizard_steps.push("configure_mailer_step"),t.prototype.$wizard_steps.push("plugin_features_step"),t.prototype.$wpms&&t.prototype.$wpms.is_pro&&t.prototype.$wizard_steps.push("configure_email_logs_step"),t.prototype.$wpms&&!t.prototype.$wpms.is_pro&&t.prototype.$wizard_steps.push("help_improve_step"),t.prototype.$wizard_steps.push("license_step"),t.prototype.$wizard_steps.push("check_configuration_step")}};Ji.ZP.use(no),Ji.ZP.use(ia),new Ji.ZP({store:eo,mounted:()=>{eo.dispatch("$_app/init")},render:t=>t(Ki)}).$mount(ao)},7630:function(t,e,s){var i={"./loading-blue.svg":7064,"./loading-white.svg":9438,"./loading.svg":7061};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=7630},5016:function(t,e,s){var i={"./amazonses.svg":7557,"./gmail.svg":7526,"./mailgun.svg":5567,"./outlook.svg":6703,"./postmark.svg":5699,"./sendgrid.svg":2763,"./sendinblue.svg":4522,"./sendlayer.svg":9857,"./smtp.svg":450,"./smtpcom.svg":7536,"./sparkpost.svg":2091,"./zoho.svg":9349};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=5016},833:function(t,e,s){var i={"./all-in-one-seo-pack@2x.png":5720,"./coming-soon@2x.png":6717,"./google-analytics-for-wordpress@2x.png":4166,"./instagram-feed@2x.png":4545,"./rafflepress@2x.png":3025,"./wp-call-button@2x.png":3277};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=833},8517:function(t,e,s){var i={"./all-in-one-seo-pack.png":4444,"./all-in-one-seo-pack@2x.png":5720,"./coming-soon.png":7289,"./coming-soon@2x.png":6717,"./google-analytics-for-wordpress.png":2598,"./google-analytics-for-wordpress@2x.png":4166,"./instagram-feed.png":9228,"./instagram-feed@2x.png":4545,"./rafflepress.png":6270,"./rafflepress@2x.png":3025,"./wp-call-button.png":7896,"./wp-call-button@2x.png":3277};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=8517},7064:function(t,e,s){"use strict";t.exports=s.p+"img/loading-blue.svg"},9438:function(t,e,s){"use strict";t.exports=s.p+"img/loading-white.svg"},7061:function(t,e,s){"use strict";t.exports=s.p+"img/loading.svg"},969:function(t,e,s){"use strict";t.exports=s.p+"img/loading-pattie.svg"},1122:function(t,e,s){"use strict";t.exports=s.p+"img/arrow.svg"},5561:function(t,e,s){"use strict";t.exports=s.p+"img/check-circle-solid-white.svg"},2546:function(t,e,s){"use strict";t.exports=s.p+"img/check-circle-solid.svg"},7579:function(t,e,s){"use strict";t.exports=s.p+"img/check-solid.svg"},8098:function(t,e,s){"use strict";t.exports=s.p+"img/copy-solid.svg"},4186:function(t,e,s){"use strict";t.exports=s.p+"img/exclamation-circle-solid.svg"},2411:function(t,e,s){"use strict";t.exports=s.p+"img/info-circle-solid.svg"},4523:function(t,e,s){"use strict";t.exports=s.p+"img/lock-solid.svg"},9238:function(t,e,s){"use strict";t.exports=s.p+"img/long-arrow-alt-left-regular.svg"},7706:function(t,e,s){"use strict";t.exports=s.p+"img/long-arrow-alt-right-regular.svg"},1004:function(t,e,s){"use strict";t.exports=s.p+"img/question-circle-solid.svg"},3481:function(t,e,s){"use strict";t.exports=s.p+"img/star-solid.svg"},3531:function(t,e,s){"use strict";t.exports=s.p+"img/times-solid.svg"},6375:function(t,e,s){"use strict";t.exports=s.p+"img/logo.svg"},7557:function(t,e,s){"use strict";t.exports=s.p+"img/amazonses.svg"},7526:function(t,e,s){"use strict";t.exports=s.p+"img/gmail.svg"},5567:function(t,e,s){"use strict";t.exports=s.p+"img/mailgun.svg"},6703:function(t,e,s){"use strict";t.exports=s.p+"img/outlook.svg"},5699:function(t,e,s){"use strict";t.exports=s.p+"img/postmark.svg"},2763:function(t,e,s){"use strict";t.exports=s.p+"img/sendgrid.svg"},4522:function(t,e,s){"use strict";t.exports=s.p+"img/sendinblue.svg"},9857:function(t,e,s){"use strict";t.exports=s.p+"img/sendlayer.svg"},450:function(t,e,s){"use strict";t.exports=s.p+"img/smtp.svg"},7536:function(t,e,s){"use strict";t.exports=s.p+"img/smtpcom.svg"},2091:function(t,e,s){"use strict";t.exports=s.p+"img/sparkpost.svg"},9349:function(t,e,s){"use strict";t.exports=s.p+"img/zoho.svg"},330:function(t,e,s){"use strict";t.exports=s.p+"img/pro-badge.svg"},7764:function(t,e,s){"use strict";t.exports=s.p+"img/working.svg"},4444:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABKdJREFUWIWtl11sFFUUx39ndqf0C0EhiKVluy01ARuoxMRo1CBBIqKRqNV2C4Sg8cGowQcViUFtFOmDCSYaE9SEqN0tluiDIRBBosYHQlBDowbSwu62fNTKh/JRSnd3jg9TdruzMzsN8H+79/zP+f/vzZ17zwgTRfNAGSWZh1FZCtoI3A6YwBRgECGBcghhD6R+oLPh/ETKii9j9dHZpAPrgVVA5QTtXgS2kTG2sH320Wsz0PxnCWZ5O8grQMkEhZ24gmgHZ9Ob2NVwZeIGVg7Mwcp8Ddx5jcJO9GClH6VrzoC/gdbkHRi6F2XmDRK/ipOotYxYXc/4SSOPsioRRvRHT3HlBOiHwBGXaA8q7wP9HgaqEGMXLX017gbWxEvJsAOY7lGgn3SggWh4HYb1ODAyLnaJACuIhTZQWTIXYdDbRPA7lvVOKjSQMt4CFnok2tzumssAfFV3BGUxIq+jvAbWYr6sjQOwtWoYJehZRVjAzcE3ckOASLIO9C9gklceoJRoOdvCI0U40NZ7E2r+V5QDV0DmEQ0ds3dAdb2POKhs9hUH6Gw4j8hmH9YkRNcBCKsGK8iMnAImOxR7QXqBeajEiIU2+IqPR1viXZSngB6ERpS5DsYFSkdmCa3JpxHd7ghmwKonWpd0L368mlEdprvmLGAf4FGrhmh9ryu/JV6LIX1AwLHIFQaG3ueS8runOICmOzDTL2fHo8ZjENjhye8KJ4CegnmRpQYqd7ukNNGWWOtZEEwQM1dITQTTnapCJPEisKAwxIIgaJVLVhDlc1qT1cRC7dnZRRqkKnk/yK2IpokklwBg0YhoBZHkElJl++mecTGbE0m2A296LCQUBKZ5rlM0/y2ojtdjGftAQQG01eZll7QHc/hJ4JtxWY2e9WGaQcHBuE6o431R26oHUgbg1Tgowt58ejDtayBgpPLGhuwCLA/2ZQPkmFsA1UforP04b3bKUD+QcuHnoNqXN+4MfYrqYuwmxQE5YqB6qLAIR4mFdxfMb70rBXQXkf+VhtmHC2Zj4Z9QCjsj0T8MRPcVBmgkEm9ylbCMV4FCERgCfY63Jbfda+KlAETiTQjzCzJUvxfWHp7MSOkgUO4InwZOAnMR/ZaKMyvHdgCaB27BtF4C3YD9DXxEMLOFL+rtXuD5gyYXpkcRngD6gBnAVEf9i6QCM8Zew8RnwLOuK86hi2goApI71W2JUygW0dpZecxIIga0+NT7hGjtC2P9QKYDv8MFLbT1Tfbh2O07POPDGkGCm+BqQxKt70XY4pN0Mq/Xbx4oQ5kCTB0TtWE3LfGilYQP6Kw+njMAYOpGYH+RtFJa+u1ru3mokmCmEygDyjGtGGsP27tjc4rt1EEqTr+T8zIeKxO3YXEAqPZIHgZ2Y7frYUesH/vFewiv5kY5gcgDREPZu8elLT82HzF2FjFxrfgb1UXEwnmfsFFAi9X1kEotBPn5Bor/RoB7nOLuBgC6G/7h3OhSRNuBS9chfBnhPc6l7s12zQ74/5w2x2diykZgNVAxQeF/EaIEMh3Zy8kD/gayRoYqKbm0HIwHQZtQwti3WxrkDOhx0AOI8Qujxs7sP4QP/gdLfYuNd8XCxgAAAABJRU5ErkJggg=="},5720:function(t){"use strict";t.exports="data:image/png;base64,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"},7289:function(t){"use strict";t.exports="data:image/png;base64,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"},6717:function(t){"use strict";t.exports="data:image/png;base64,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"},2598:function(t){"use strict";t.exports="data:image/png;base64,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"},4166:function(t){"use strict";t.exports="data:image/png;base64,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"},9228:function(t){"use strict";t.exports="data:image/png;base64,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"},4545:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAATC0lEQVR4AbVbSY9lV1KON2RmZY2u0VV22+4qm8G0utVN00ICsUAIiV3v+AeskFjDig0/gD0/gQUSWyQWSEDTom2QkNsT7XKVXVXpqhwqyzm9fPke3/dFxLlx38t0tVriuO49MXwRJ+LcM9xzX3rw8MeX55ZlUIhGQ5b0IIjGEw8mxao7PuVGu8B4Hbxklaa74OW6rxucqSu4GuNL8FQP2Y4KmEY0GpKkq2MCJcct9KlOvqs7TM+m2oePU5P3oKCqfoJe9JFBUH4m3mMXFDjvADliSyAa7SylcqZaXGA6bLa7jOswv3LydHFmMuEfVQucdAsoaMmIQYFO6rAZdglDIqHjGp3OUheGqU91a7ThQDRaLTtf7Zu+YivNeCtfaDrHP2+j0BlQ6rJWCP3kaRtTIBxE7u6UzmnN2qteYxQ3+SIOfNOFA/KSha7pgxes0vRf+VNoiOSUtS4JgqYseMGWk6cNOgD3gmt0GqdOdYdNdWuk4TqM+wpe+kpHgJIv0ow9sBF8Ly7ayC4w4iVw+RIfydMXDaUnObBxcxw6VstJhTLbiHoZF84D3musNpxtVD+FHoxXbLC6ZoOVNbOVc6qdPwfe5YNx1MARY/OZzfa2bPr4QzvZ+ZItRKIl+exUteUNjh0ZYBlFJBmQAGBSnPIcAou8fMSNupVVJMMkcNWkgpacSSkR1EwMdvP5idkMOzRrXHMkyCSdn4GEbLJn86MXLmdbq+u2+mu/Z9OvPrXjB+/rQWaYckoMr/IwvAMkpDyI5IVNBj25WpKJoJmcnkpNSDTlq/SARDxwTyqTQAKSk5/a/HBitv/cE6cNY8mmxVMWRMoX+cmBzba/tPGr79hsf8tmWw9o0PmqeNJoo5sCZyQ/evXbtvLmuza6fEO+9ATY+5FUSw4yPaHZ1GYHR2Z72/4Ea7BJK6gILGh0r/uPwJKVUDJXN7nguDWdBADNbfb1pq3c+U07YgdkRy7iI98YAWGcPtgWAKu/8SMb33nH5i+e2cnGZ96YdLyxFLvagCu98YT1fNO0s/3lk+9s1DZZiYqc5PTAhldexRLPTQ7TKDGsdUkgGiMgGOhagWz06ltKfvbsC4jTCcgG75z0Gkgn6ZewZhN00b00+UV/4uGw+Q3nyQcr2BhT8ASjkeCmD4B4ToEsIc8OWXnjXTz5TWjPTv7w8ND29/cxC2Y2Gg3t4uVLmPZotCS4lHwK0N5S8hkLa8YzwvPhAoqFUesMF0gullBON+/jSWPdYFEyUacACyd3kfkJME1PAkU8bvh35iI4unTNTp49dIM0EofGp8f25YNHtr21ZZP9PRuipwcMFo3evH3TXrv7FmIfeUPpgY0OgTl/UTvCMJOJum1rCNqThc8hfdCwlGBH175lRz//50im6JkVMdgxuMNolyCffpJmjYKInFiqNX+gk0FgwBxPJvbJR5/awd6erV65bvf+8Md2cjyxzZ+/ZwdPvrSvNjbt8ODQ3v7eb+VrpnwMzl20c9/9IxusrcNLNhr+0z3rompBp77pBja88Eo/NulwCwx3HL1HkD8jeWLLCOiMiZ9zeLET4MgLPZk9+PyhHewf2Mr5S/b9P/9ru/jaXfgf2P7Tx/be3/6lHe1s2e7OC3v88LG9/uadCAhryo03lHyLkM7cJSkvlc+gl3QDTMq5TTc+6exlh1vaKwFsrxhdTUhd9Rl8jIDO2DHgj7F4jDAEp+wAorFNY7jv7uyKHmKonrt6CyMNWyL+W795xy6+ftcOtzdtCLvNxxt249Y1W1vH+wDMZ3s7vpy4q3QpX7zRh2FqsePn0yN/AKpBYx73ZMcHNselIn+4Nb9BI65uBACZyROnyw0wAsKgYZyfowM4B+fpGeIXz1/gRQUSOJvsPbfJi+e2voYEicGcW79+RzoINFV2nz2zm29+S+rZ8w07+vBfbHjxWj+5kmy/hyIguPYQSAQdZJM3HkTSjJzrCfmUJV06o60B7ckHeH58qBW4NQpigvmvIOFxfnJix+iE8zdvq1PmJzM7ePaoawyY6XQavM/62c4Tmz1/4hEtBsXFEAHr4vYVZ4DZ4a7Ndh4rjKVkKGh+Cg2h1gBOAelDR7okT1prwGLyNOKQG5y70GtgmM4Uztw+/vu/sx/8xd/YCFvTwdYT2/wQ799qEcMZI+X8jdvi02x0E7vD5Vu+yvOMwIQZJJN35/Ksm4zgBh198N4/uNuQ9ZIimAmkjgRpnhs4ApKnbCF5qsanJU+gpgD2dqTihgBfvHzRNp48hXMGNrO9R/dterhno7U1W71wxW59//dt+6P/suOvd2314gW7fP2qDaaHHhDsV+/9jrZLulSBzGs+MQSs+Y/5jpcXLcLgT1581ew7GxgW20bXZLkLcCQRpysMKg1Vbw2oQI4ArGYwhkXYXr5+3dbXH9nh5MSuvv0de+tP/tRWL11Vh4ywvX33z/7Kjp5v2eb//IfZxi9sON3qAoCTyac/scH65VjQ4F+Lmy9w2EuVX7bVe1quiTi6eGpsgig5UKjZoVyo5W/xyRNMN5C3NcCBcuNG3AXw4iJ5Ew/s3nfetfH3/tiu/eAPtANwqKvA4QzvA2N0xJVbd2z69INiy9aQ7zbWCF6g/SIRpXT0UvKJp1GaVDxdJJ967gJj7kAhYFXo/OCiNaAFVBrgEBxgCnQFHvBvbQ0fKx6+b4evXLGV196mV/ilbohdYRvn8A9s/uC/sQ3su2kGlo4UCM1IRKmYlKc68Qoy8ahTT1HaVxl3gZwCiVFNOICB9REgphPSIdcATQEaEU2McBheB8/t6Kf/aEc4ca3evos5i2F8tIdj6I7Nd2POyqz4DDfuJxwtYl6WPJ/HiIsnrlw8+RrORPHSNt38DMMMUynj5LpCHM8DaguqkjxxPgJIZUyscWkNGGANSF3VyxuG/u4GnvpGs9Vm13Agko7GxWeSSoTbHoKP3aAl8oyJIGjoVt/8oQ2xbujLEncLjLRWFvwPL1y1yX2sPxkzOoAdlQciJZ/GtEUsGAElUDl0r+oAHHA86LBylTNph+93Q+7ZfAr8EsQgtfjgPeApEsFUUiLYAYbnkQj1fGpMpPkLIiq+LE1+8e82vnHXxjj0qEjXDIottGl3Dv4zecrYAYhlPnmB9gLESpfz/UWwGudQCjsZIfDVd36kRDQEmTAc+2sOHLMkHuTw0nWbfPJvNr7FRN7o6TpcGFQ7PnGWssD2jAu28wM8Ole89JjGxhHAzpa3TpcCyLtFkJYECqwbnl6sA3EgGt++h6eCRLLIJLCUFZLscP2Sy5jIgo76Jqw60OpcGOTQbbhiUs1FA69RKF/hMHcCNk5R1YnHqbIJKyBoLYR1J0AerQBz1pMXhj44FYBSIs1Qosp1NG1YOJ1Au10KIS9kjybDf5xWQ9iykNcUcF+Od5zoGAU+ESFfAkCk12EthNQjEY4IFvmhUZRCShK8niRovdUtYRO07EPzlZ2QqzchtY1KezDp3RdV6D0/XwSXc+va9hEgnlaloUyYR2J6o44dIJJMlEJK0niMD35PGK24HZVF18M2uaTeBhcvLqAsVV9pD8Yxce/mPB6YXod9FMqHbHFjHX5OmQJUOqi9CwR4jvP6S4e9AnF7klqFc0FNnRRiWiDBBe/zWR0QbVdTx3ZtVNtcP5QgP90vLIw1eeaJR4TCRrKhfNoQ+dsg3wVQqM8pkDzrLGlPYKNB6knG1ElF6rPu+Qghp8AMH0h6O0EBnmqL9mL9cGSdApDQJu0iT4yAlFAJOlnWuQtI3F8DoO1K2lBSafJ8AvixZCmRRZz4Tqj3eNpzHejEEIDp8S4ilAofAc75d8FcFItdybOMgOKVJEBa9HAibMMeQ1mfrty/34tZrzOpZZvaCWIhTGzW6Ud8EYLUGyLq/g5CRRpF3fjUhYAVd4ER3w1SB1mPxqYhhxSysNLlvL4J9L4OQ37WNEgfchR+WHFIsugHCtTuWiLdxBdhkhEovwh5gSJ1aQ2eI4sPana0i1+Fv7DpzueRA0FcA9B+2i0kT4W/ChNLkK5AsypTIHtO6wJefZtT2YYNaZbGgohX3tnhC7xBXnF93oVzsBJhJ2HIM2n98AHcBCfP2T5+Z0QyHA1ciNmZGhlcXLFOdO0BRnfuEkQU7kSYhk2e7aLu3gRTSBvQ3ItzCij58DU72PV3+uCrjiK+fs7xXYBfeGeHz/2EBn+TBz/TL7Z4ZJ4I5za2ufb1hwGyMA7FIk4dMn36cZFBiaeqH2PO4U0TtLY+rfY4f2zfl02LS1shfiA5/todyjdurOkqCXEhzIODtiF+FWKhDmXy2X/iE7f/ZEa9MEqENJ5gJkJw+CPJZKdPIhH5wo1/CMFkmAjWCk+EQxZH2y2eCPF0eSJ847dtuHbZpxMT1nSDvfzIu9/AD8/jRPjwp50QHc71ZA5Xjg+7sI3DUCfM5AXGU9LHygBLxkQefwRnKYRjdhIaGaydR5A8DSIJ1giWw3fGIzP41beQCA86oeufCDNAj314AQepz3+CQ9S3bXzldRe2JiNel/Z0A50IQ8EYeY7RQkhZ2KUf6P28S4Gu0BTaRwE2C6yoKtCNbiIo/BGCJ8tEMcdSyTrckOSucfjBP9noym0bX8XRtnYcAVmKDUU6SEkXB5CmB9HoMC78AN8ZVKIdnQi1E4VdYkPfmwLS8ZZBgtZiwyeMr8DZSat3f4iR4ctHF0x4jsqDoAnetnS85YmwKtmOUF0dLHEcPdTPF98i0yaxC7U6INshllshRpzaStuib6/CkhFQlAogP41V3dLbWXjOBhhUpZFMfz8v+oqTXQg4bOGEi6QXyBexwoc6K27b0XnCt3eBANT8IAIavU3HeRGXNBRc2AZ5IKIORdOiBRNE4wGoNFk8AdnQmCX1WbsU8k6gtYhTi7sFDTpVopdlYe+jgDDEj/OARpPYcJK+gB/KhgIJcUs6g8Gi130cJW7hqcgxb1HkJxnUwOttUImQPxtXrETybwjqR86ePv2ksPCecAqwCGoKBJ/iyC/eBOkFGioFCBQqfxfwN2Y9IarYKZlJQCFoItHiXcmAeqOm2hRcs5MM7jhy2hQo2iX7MMhK0yfwWgNyYQxZJM+qrQG95NmALp8Ci78Q6W0sGwuf2R/J9oazEmGnoSwFvyhIDOScy1wEc8051b4Iw1U35GmKH0jaNkjfDorK14CzkqdrPgH/UxVyKLDUqKhxVzowwuaNifBoy3fzXlk0hFIi3PiPdihtAV2EJ5agopMdecmW14BMnvrTp0Ai6KCuASFvAS00TLYGknwG1FsICVSAQvlNfCfPxUztnYWl5ZKu86H3l7IGZGpuo8NQeKATXeEtaF8D8B6QlpTzlZcloM4kX4RBah8miJ3JgxQNC4wq5xfkPEih6A+d+LqcRbbhgFU5XxCrEyGxAWlmyavGDf+++U0QAC1C9UjM9rgwyUm6zsaKsJDZeTMEN1zHibDq6EI8bzza+vlijuPtdOe+dJNH79v4gCfCcpDCrjKf4eLuwnWChS7Sd9T8sDI72MoQurZC370J1idMOgAatnwTDJ41j7Y8vvbODQ3gQcz5FYjJoLOmTz+V/eQLHG0zEf49EDuSCXB9UCILCyXbZCzQTZ99HDGAp5xFdTCsenIChjgc4VemRz8j0+ELrjsMJSA7QjyQDGzBuX4c/d9/hfNXEDh6H5h8cqKZGM8OpSExTIRH21RA782RYIMote7FEsqqT3DKiv1gvK7kT3Ye2Gz3i/ALYGKj/oYpkMFg7d7HX3itrGMOx19mwQv/1me2+wQO0yPxyw14gyEXNPAUJR8ixq9CvvrVCMR6zZo/1OC3igF/ryDP6Ym1QjrSgZ0f7ujJf1PybOOMKdAPgP8Twtrbv+v/IwL3ZAXYxyjgTKRXg0k8iQh6qNoT6CUDuX5PUIJIDMnNY4rklJmf4M/iMcpy2rCmTjXWBY5CbNbqS7XNG2NgabUT0QEhZaWr8nja2w8wdG/a+OY9jIZNfw9gA+ptBMyzQvS+gm/J8UnFU5EMfrkTZMCkJ/ieJ96TaLqQ+atwSSZHRoS43PFxtmnJAtiwFKKkD5CxBlCYV6DFd86OH7yHL0HPbHz7123Ecz0TjkXO5z8XtEwm/sipJMoVW09G7nGTf7RJ4lSaqtAFrAVOvGQLejhquQmzqIdRA5B+yTbYsBHICUbCyfbDLuAEsLHAMK5G1yAYywIvR7KVkVh1RvURqha4fJQ2Uv8rJE/T7k1wIZlkz0qmF9CZyTNQv745+Q4HynuqJRq85LyhtOBIS9CJgu86knqUJRvKWgdEa6wAbFgSkslDRycg8F1jFR+NnmZPgyYvODUTumiyBUO8ZEE0+xqvAO47yJ5NT+YMl1lhPKDqDPLSSKMX8JLLV8VDkJ1HkqDTfFW7JVoC3txWNZ2gFF8ZjmTZTmIaWETnp8ixkqHI4f9T8tkRih23FjzbDV4xVDqCWsSGOJP9pZKnj7QLsj70WANq40HLsNDZGuWnBS58X6dXZeEjgkb3cX1/Z2BDfHry9EcAStaV7smCier/AMJqTt2MKqTzAAAAAElFTkSuQmCC"},6270:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAFG0lEQVRYCaVXa0xcRRQ+M/exsJTFUgOCpawGLU9taBuB1kdqjRQxwWhMQNPaNqExjTXGgk3sDxOLptb+ayRVafyDRVJfNAImPtpQCdSaKK8mDW1poU2BQq0sLNzde8e5d5m7d+5ddhc9f+acb86c883MnTNzEfwHCbz1dDnM+ZpxwJ/qu3NbE7wFfVKKZ4frva/7lhsOLWcASyyoSiobNzM6zFQQ8kv+XC6RuAgEP9j+Erkx3CQs+D1mNqqonlXgT3sAyK8tVhjE4i3Dck7hTml3wzmuI4IRlYAxY8X/FZeYaBDMzAGx5h1AuRthcnYehMnrILV+DKSnHWDuHzONTkR0iS9G25qIBEhFRnbgobU/ibN3c8xoNLHqLQCx9jBA2moT1gkwwbN3QW7/FEjbcZ5IybZO99nWanQG/ma+rHUQUOoqmvHUWA3GAvMBNTvPkZh1WgkwDFEiLp1IyxEGAVqVoUiPPP5+4oGmQyZIFZOAsdwz09/TtDJz0EQJ8JvHjKVmmL2NRID5GFtzbB+QgW4GAfbm3ZIzsp5l22IQUA+9Ug9X+g+jxVkTjQDZWgNCdZ05UO3rArX3R8AFJSCWVZq4lYD8eyfga4OgFZSCkldm+sgXOgE1vQswMRrC3B4il5bXJtY3fW4QCOxapwoYYWD7fLDZHKwrCwcqQRofASTSxVGDQN4+TomUGj6MgHB1AMT9W8xx6LEKmK//wrR1xdVKt+R06PtAqenznpPDiVjvMJLTVttYDqItebCxDuSpm6HkhrMIcO2irnEizM9wNulth8SOzzhs4WW6orsbDIxMjyfoCg68kLmZeaGsh5kabvu7wvqipkUgAOPXHX7Q84MDI+lrOAyrsryBQ2wGIsSGUJOuiEMmnAQijOSG+Z5JWmdsAYfaDHJ/uBTYujgTI/NAhfFCc3HDmEUjAronJgG8fqtlSEglk2NO7KrzHtK8hQ4/OxCbwLadALZtwEq4+rGAeDZcgg3M7QGFftSxJCYBPYDqzefi4AU/Z+uGZik2Rufzexw+kYC4CBj1n9YIUwR6FH3hsq6XXk702T9Xy0FLGTRSHEIvH3VTFQjdbaazureM7owGrgnniSD0rJOkFNM3mhLXCmiX+0Dt+oaLg+UEEFxuDmMGohVPHBlk5pJtcqfvDBYU5cKSHosdgYZXQdaXPV6hRUn4aEdc3lj69ua5aJ7aHz8vLzkLRknEswoxt0C7eJ6FNFr9ptSvabsIRZsApWVxMB78jbMjGRwBMnrJ6TMywGH4w9MgNPaCakkmV70OSUc6IPkTPqHjdNBIyHZnGASISqdFBZ/vgCDd76jiXmF0E8G5CvZxyFaeE04dBThx0HBDK9OMamZ8WcG01Uel22P7gT5IhJEhUGvXA6raC7hilz0mBPY9SY+YByT97C9+mMp3jaBe6QfNNjttsYKKQ90g0sSEvhkMSUwmUvFTb0DLZf5Jhnx32jAh5tTUlHsB0r0gXFr6oFj/C+xsSWUt4LkZIL+cNLtwdu4tOXMN/yQze6kSepTeoI9S7vOwunB6NAJWR5R6nyI9+sTSj1Krs/4sV9bmn5VmprOteCQ9JgG63GLuhjZ3T9trcT3LrUmMl/KC7xQtVklW3KpHIyAUbR6SVrir2QvYOo7pEV4RrCvc6r9m2ujwCTHgTw6jIS0SAT2xK694z//+NbMni0TESoD+nP5Ff063R5uxPWZcK2AfpG8NmfN9KQTmV/qmxlXhwaKB5SZmMf8F4cLeesegrcIAAAAASUVORK5CYII="},3025:function(t){"use strict";t.exports="data:image/png;base64,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"},7896:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAADyklEQVRYCbVXa0hTURz/nW0+Ssc0zdIQDR+RFoGGFFkolYkUZCJYIfSgiB4U1Kc+mN8qUnp8KAjC3g+KRZRlKZSlZUGZZaa23maumWXTzW262zkrL9vuPdPpdi6Xc87/8fv/7rn3f87/EvxrJPFwVgEBWQQiBPyX+aUjEOxDdvLsfavxIk4+txEWJelI1iUavMgvETmggiDUBvYackhSedZyoiQ3OXZ+FdsFYbuCKJDp1ygewOnyz1cIBEEebESVJkgtjn01IARKlRyYSqFCalQS0qJnIS2G3tGpiJgYjr01h6BtqZJzGbNMQkBJ38nt4grEhU2TgG6euxrXW+5CoJevmsIdKFgVLBuc2U0Pj0Vm3Fx3l3HNJQTMg2bYBTsXtHhOPlc3FoWEAE0NdPf3cLEWxmcgTiN9PVyHERQSAsz+46+vXDeWt/kpy7h6bxWyBF7r27k4A4MWPPvWxNV7q5Al8LSjURany2jA2qs78fjLc1n9WISSNGQgDZSA0dIHdVCoiPnu5yes1+6BwcT/PkRjLwayK2AdsqGy7b4LTPgEDfptZheZLyayBBjwuSatSzpG0p1wa0axL2K6YHAJ6Ho+4057rYvxhrRCpMfMdpGNd8IlwIDL6k/CbBsQYygVShzL24dp6imibLwDjwQ6jXoHCecgkSGTcKagHDEcEjMnJ2JTehGi1VHObtyxMiI3PpdWQ/N4Fq/0rUiOmI7EiDjRRBOsRl5SNhq/v0FXn0GUs5W5UHgUixMWgG3ZMyIT0E2zhj0IpzWPSIA5Pvj4BPNj0zBVPVnECQmcSHfEHATQE72pq4X2AajIL0OsJsZhw3ZMRnpVSi6WJmTCZDWj7ecH0f//oJnQevAwXYFd7hr3OdsTTq08iDlTZ7qrwDaob/Qp02nt4KktrliDjj9dTibCZY/fgJOlY2Nap92Nal2ds9gxZiszUnDLoBX6vm6J76gJME8TzYgdlSXY//A42JngTXutb4PNPihx8YoA82a10OnGa1hxfiNq3teBltcSUDnBi+/NcmJ4TWAY5UtvJ7bdKkHB5S248fYeBmyeV+RFpzyBUWXBcFC53kCLl2q6EmdfavH2hw69FiMILXdDaZawzGDtz4ARBx6dgGXI6g7RLHsauluNZm6iB1WVrtZxD9urA0MQGhTi+ID7rKZhsUuvIgIscPyguch9MjFa+8FuXqP/JEMKWgPW8wz8LbcLaGDPTpKPZF+hfaG/Azrj0+ypE5QdS/4tfikUyWFZhTSjsunrGNWvmjOYN2MBxEaT+anut+EcSt9Y/wKYPTFLjUA+DAAAAABJRU5ErkJggg=="},3277:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAAHYklEQVR4AeVbeVBVVRj/7n1sIqsICIKhIAIKkjCJmgJlKiYuTU4wWZqWMzWauYzmMsVUmk0Gf5SmGU1qizMq2mSbo40RmMjmioiC+JQdHijw4PGW2/kecxF9PO7yFq68M3Pn3nfOd77z/X733HPO953zKDCSgr+YEUjTtJeR4icqW6vTKCvO55TDEdA+bjj1SMbKGPuQcLfVNMWsAqBGP1L2pP9gQKGj4AAoNZ/e2vJvAwunh4CQHdO9KWe7X0nGZLZwcN6ZWo0OkivWnS1AfLQe5GKQUc6yrMEPHtFSI2QU9du4L6f54y89AcHT4pdTQD2LGbaQKAp8GK39Z4hV/wmEZiTkA0XF2gL4hxgZdVcL+FBBaQlO9u5UO2Gl+3N4KDH4nyiYSctcdd42CZ68XtL9XWgtTcsG/6s2jtCs3Z4MpDDaMxBGuo0w3qLESuxMscfJzhEifcfBJL8JEOM/AaL9xoO7kyvoGB2k52bC/sKfTVFvlbqCCPAa4kGARsIkAhavCO+xYC8zVEFTNLw7ZRlklfwBTR0tVgEithFD641oWhmbCmunrgAExyc5yOwhJXI+7L5wkI/4gMnwQuPqMBTWTFnOGzyLJiUqGexp3hyz1ax650WAm6ML2ImYLHyGesHskBlWBSS0MV4EqLRdQvX2yL8W/VLPsxQfeBHQ3qUUbXu0X4R+phCtwMIVeRHQoVGBSmNCL5i4yMIwxKvnRQCqr2vriSEIbi0pNBFwCpVi4k1A1YM60fazU6JoBRasyJuAima5SWbglCjjuYYwqSGBlXkTUNZ4W6DqR8VxSkQ/QWqJNwFX68tMsr2urRHk96tN0mGJyrwJuN5wE9q7OkTZIG+phjeOb4AurVpUfUtW4k2Alnh4hdWXBdtyTl4ELx9+G8oVcsF1rVGBNwFoTHZlviCbDhYfgzdPbIT7qlZB9awpLIiA0+U5wDAMp33Y1bee3gXbs3cD9hwpJ0EE1LTVQ3HNNU48W09/Dkev/c4pJwUBQQSgwcdL/uK0OyEojlNGKgKCCThZ9je0qdr7tT8pNAHCvUP6lZFKoWAClOoOOMLRvTFqtC1+tVQw9muHYAJQ24Hio5xzeuzISFg8fm6/jUuhUBQBNcQz5DPIvT/jHQh085MCTqM2iCIAte3JO8S5MnRxcIaMuR8AeoNSTaIJaFAq4OsLhzhx4b7Bx8+v45QbKAHRBKDB35Ox4FZTJaftC8Nnw+rJSznlBkLAJALUOg1sIYsejc7g6I0BllVxS+GtmFSDfL4ZjjIHvqKC5GQec4I8yImJ9wTV6iWMbi4GOp4JiO6V2/fj1FEx+m2z/Cr+TpWzvRPsSf4Eds7aBElj48neBAW3FHcAyTc1EVWHTSYAjSiovgKxZMsswJ17xI8LfBowOJJzJ19PBheI9KRt8NyYqXqxYc4eEB80GZZELYThzsMA3WxTHC2zEcAAA/9U5pE3lAC4icKVJviGAhKRI88nM4nxkDuOG6lRCwzUOdg5kI3YCHh14kKI8g2Dls4HooItZiMALewkofNceQHMD5sJjsRAruTn6gOLImZDLVlTlDUZhttmBU+HDxPXkJM7+lM8farDsiDPAFgQ9gK8SCLPKCrk8yDy5vkEWOsUHfehqPoqzCXG9LVrzMqxd9xex62zKDJVXqkrJW+yO24wbvgY2Ldgh6D1g+cQ957PQ0sGZT5eq9kJQGDVrd0u8xwyYPEhAevgW3wlMhl8hw4HXF98Ne8j8HL2xCLBCT+PaU/Fkk/yPNS3N/VbHwkwaRo0pj3v3kVY+ctmaFW1GRMxyMfVYmrUfMhK3QsBZjhhMsLF26CNvjIsQgA2dKHqEiw5uhZqSI8YiHSp9jqvZi1GALZe2liuD4gWVl3hZYy5hKoe1HJ2f7YtixKAjTQqm+H1rHWwv+Awr3mfNcyUe1E1d9iO1W9xArAhXCrvyv0Glh5bD3etsDlSSBZmfJNVCGCNwXFh3g8rYF/+T9BlwnY7q8/YvajmqrEig3yrEoCt44Ip/dy3kHRoGZy8ccbsn0UriVfe5OGhskxYnQC24XtkoFr/53bSI5bDieunOENsbD2u+8XaEkGkDhgBLBDcMtt0aickfpcCGecyobL5Hlsk6o4rUSFJMmfYcLbYm/+j/sIDmLhERs8vzDu4X3/gcbBCBkCsKxkCegMpITvReGX8lwm4xsejuBhaCyU+QrDnKPB38+3TTzh/txgKBMQaJEtAbzKaiYN1piJXf7H5eCh7GCEGyXEl7jcexsSjfJdrS4ljzr13yep5IgjobSz7jCDxDLI5ziHTtIr8h8qGE63rtKsnO942SQI51q+kK9POdgLFXLK9TsCoVR3aAnYdsM/WCCBD5TH55pxmPQE3WyCTZOTZDAn4N1qtbiPi7e4BaWc1jFKTTEgoGuwkkBmkQc1oksrXZ99FrD3/GFOckSvd4oIOyhwZJVl6hZMy10FGRhsZ7DPVakip3JB9g8VmLOZMBacnBNO0zp+hZcZkWB2Sv2tVmubb7YpSSLtmcOT9f3LyV1v6G8m6AAAAAElFTkSuQmCC"},9515:function(t){"use strict";t.exports="data:image/png;base64,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"},5529:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA8FBMVEUAAADHFsHHFsHHFsHHFsHHFsHHFsHGFsLHFsHHFsHuuu3////HDMHinODXc9PJHMPJHsPHE8Hut+zuue3+/P778/vrr+rnpuXOScjMQ8fstOvjmeDgpN3diNrck9jaftfRXczPU8rKMMTrx+npqufmouTYdtTUbtDTZc7SYM346vfx1+/nuuThld7cg9jWftLQWcvJK8TJJsPIIsLHD8HHBcH99/389fv57vn25PXz3vLu0O3tzuvov+bks+LendvZe9XUdNDMP8bKNcXy2/Hu1u3v0u3lteLjsOHejdvYidTXg9PLOsXiq9/hqN7gkd0zo4LZAAAACXRSTlMAsajs60tKB6cVFYoAAAACW0lEQVRYw+2XWXPaMBCA7YSErA024rS5be5wX4GQcJW0SZO0/f//ppKMJw4xtmS/9KHfEzOwn7Sr3WFWwFyJlxCAS/FKIEQvIDAXUSzA8SEM+P4QimtBhFCIgl/91NZLFc4TEcCDebX4kJFlDTw4K4hp5dpSJixj/ILJsHeflo/0gE8wb7107+QPMjqHYD7aPmbkT6TfgFGA3su1W/mUzBuwCVB5lZa/cPv8DdgEk8evZ/8okgZgFKxPEn/a7KcIgFnQcV7/fv1q0mAOwcYOXta2Gg3mFNAKLLq/O3BkavAJvqdXz8OEfbSBJ6DLJ2iZYDHTj83Q4xNQkOmYgD23QP/lnIAn4BWUF7KDuzavoCw7WQyBU3D4NIIPI+AVFJ0TYCDgFtSsCVht9irY8DUSntz16/sMbLhT2BpzCIYANv+SAMV8mXkIpoN6SvIj2WijM4JpQ2IiVTkjGEiMJDVXAarj73Ij1ZNEM49/VXIVxGj+qb7H/wHq5CRCwV1gX3AwAXe0wrHG8bOCKq1jVgEXzFKS3PBPxUuQACVLFLnq6VyS5DENAxRvAYytgwo6OGnX6dVaAH4CjF6gpSiZH8nHJUweF8dfQKnm6HlNFQiHn0n7eVgFoDatUnRw8pU8/ThCwCqgmPRYKa5YySs4nE9gJ26VYwzAL6ClJ5AHCSYAdZfHdUAQTEA5kJcPLKD8F/AIZrj1dPCnIkl9VwE0cMc3FT/IaOzcBe2UxEZ27C5AlSRbvAEUl6VLKxXifvR3Y6BEQq99oRfPkKvvDVm+b0LERwXCtRiBAETEaxz8F/cVtnqf0nH2AAAAAElFTkSuQmCC"},6557:function(t){"use strict";t.exports="data:image/png;base64,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"},5543:function(t){"use strict";t.exports="data:image/png;base64,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"},7445:function(t){"use strict";t.exports="data:image/png;base64,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"}},e={};function s(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={id:i,loaded:!1,exports:{}};return t[i].call(n.exports,n,n.exports,s),n.loaded=!0,n.exports}s.m=t,function(){var t=[];s.O=function(e,i,a,n){if(!i){var o=1/0;for(p=0;p=n)&&Object.keys(s.O).every((function(t){return s.O[t](i[l])}))?i.splice(l--,1):(r=!1,n0&&t[p-1][2]>n;p--)t[p]=t[p-1];t[p]=[i,a,n]}}(),function(){s.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return s.d(e,{a:e}),e}}(),function(){s.d=function(t,e){for(var i in e)s.o(e,i)&&!s.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"===typeof window)return window}}()}(),function(){s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(),function(){s.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t}}(),function(){s.p=""}(),function(){var t={32:0};s.O.j=function(e){return 0===t[e]};var e=function(e,i){var a,n,o=i[0],r=i[1],l=i[2],m=0;if(o.some((function(e){return 0!==t[e]}))){for(a in r)s.o(r,a)&&(s.m[a]=r[a]);if(l)var p=l(s)}for(e&&e(i);m0?e("div",{staticClass:"wp-mail-smtp-step-below-content",domProps:{innerHTML:t._s(t.content_below)}}):t._e(),t.display_exit_link?e("p",{staticClass:"wp-mail-smtp-exit-link"},[e("a",{attrs:{href:t.exit_href}},[t._v(t._s(t.text_exit_link))])]):t._e()])])],1)},P=[],M=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-container"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-timeline"},[t._l(t.steps,(function(i,a){return[a>0?e("div",{key:a+"line",class:t.lineClass(a)}):t._e(),e("div",{key:a,class:t.stepClass(a)},[e("inline-svg",{staticClass:"icon icon-success",attrs:{src:s(7579),width:"10",height:"10"}}),e("inline-svg",{staticClass:"icon icon-failed",attrs:{src:s(3531),width:"8",height:"11"}})],1)]}))],2)])},E=[],T={name:"TheWizardTimeline",data(){return{steps:this.$wizard_steps}},methods:{stepClass(t){let e="wp-mail-smtp-setup-wizard-timeline-step";const s=this.steps.findIndex((t=>this.$route.name.includes(t)));return(tthis.$route.name.includes(t)));return t<=s&&(e+=" wp-mail-smtp-setup-wizard-timeline-line-active"),e}}},F=T,I=(0,d.Z)(F,M,E,!1,null,null,null),B=I.exports,D={name:"SetupWizardSteps",components:{TheWizardHeader:v,TheWizardTimeline:B},data(){return{text_exit_link:(0,l.__)("Close and exit the Setup Wizard","wp-mail-smtp"),exit_href:this.$wpms.exit_url,content_below:""}},computed:{display_exit_link:function(){return!this.$route.name.includes("check_configuration_step")}},methods:{displayContentBelow:function(t){this.content_below=t}},mounted(){this.$store.dispatch("$_app/start_loading"),Promise.all([this.$store.dispatch("$_settings/getSettings"),this.$store.dispatch("$_plugins/getPlugins")]).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))}},z=D,O=(0,d.Z)(z,S,P,!1,null,null,null),W=O.exports,L=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-import"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("form",[e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-row"},[e("settings-input-radios-with-icons",{attrs:{name:"import_from_plugin",options:t.options},model:{value:t.selectedImport,callback:function(e){t.selectedImport=e},expression:"selectedImport"}})],1)])])],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"skip_step"},domProps:{textContent:t._s(t.text_skip)},on:{click:function(e){return e.preventDefault(),t.nextStep.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step",disabled:null===t.selectedImport},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},R=[],Q=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-input-radios-with-icons"},t._l(t.options,(function(i){return e("label",{key:i.value,class:t.labelClass(i),attrs:{for:"wp-mail-smtp-settings-radio-"+t.name+"["+i.value+"]"},on:{click:function(e){return t.clicked(i)}}},[e("span",{class:t.titleClass(i.value)},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}})],1),i.logo.length?e("img",{staticClass:"wp-mail-smtp-logo-icon",attrs:{src:i.logo,alt:i.label}}):t._e(),e("input",{directives:[{name:"model",rawName:"v-model",value:t.selectedImport,expression:"selectedImport"}],attrs:{id:"wp-mail-smtp-settings-radio-"+t.name+"["+i.value+"]",type:"radio",name:t.name,autocomplete:"off",disabled:i.disabled||!1},domProps:{value:i.value,checked:t.isChecked(i.value),checked:t._q(t.selectedImport,i.value)},on:{change:function(e){t.selectedImport=i.value}}}),e("span",{staticClass:"wp-mail-smtp-styled-radio-text"},[t._v(t._s(i.label))]),i.is_pro?e("inline-svg",{staticClass:"wp-mail-smtp-pro-badge",attrs:{src:s(330),width:"46",height:"26"}}):t._e()],1)})),0)},N=[],Z={name:"SettingsInputRadiosWithIcons",props:{options:Array,name:String,value:String},data(){return{has_error:!1}},computed:{selectedImport:{get(){return this.value},set(t){this.$emit("input",t)}}},methods:{titleClass(t){let e="wp-mail-smtp-styled-radio";return this.isChecked(t)&&(e+=" wp-mail-smtp-styled-radio-checked"),e},labelClass(t){let e="";return this.isChecked(t.value)&&(e+=" wp-mail-smtp-styled-radio-label-checked"),t.disabled&&(e+=" wp-mail-smtp-styled-radio-label-disabled"),t.readonly&&(e+=" wp-mail-smtp-styled-radio-label-readonly"),e},isChecked(t){return t===this.selectedImport},clicked(t){t.is_pro&&this.$emit("clicked-disabled",t)}}},U=Z,H=(0,d.Z)(U,Q,N,!1,null,"5cf7b21e",null),G=H.exports,Y=function(){var t=this,e=t._self._c;return e("p",{staticClass:"wp-mail-smtp-setup-wizard-step-count"},[t._v(" "+t._s(t.stepValue)+" ")])},V=[],K={name:"TheWizardStepCounter",computed:{stepValue:function(){const t=this.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))+1;return(0,l.gB)((0,l.__)("Step %1$s of %2$s","wp-mail-smtp"),t,this.$wizard_steps.length)}}},J=K,q=(0,d.Z)(J,Y,V,!1,null,"44fd4a93",null),X=q.exports,j={name:"WizardStepImport",components:{SettingsInputRadiosWithIcons:G,ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Import data from your current plugins","wp-mail-smtp"),text_header_subtitle:(0,l.__)("We have detected other SMTP plugins installed on your website. Select which plugin's data you would like to import to WP Mail SMTP.","wp-mail-smtp"),text_save:(0,l.__)("Import Data and Continue","wp-mail-smtp"),text_skip:(0,l.__)("Skip this Step","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),options:[{value:"easy-smtp",label:(0,l.__)("Easy WP SMTP","wp-mail-smtp"),logo:s(9515),disabled:!this.$wpms.other_smtp_plugins.includes("easy-smtp"),readonly:!this.$wpms.other_smtp_plugins.includes("easy-smtp")},{value:"fluent-smtp",label:(0,l.__)("FluentSMTP","wp-mail-smtp"),logo:s(5529),disabled:!this.$wpms.other_smtp_plugins.includes("fluent-smtp"),readonly:!this.$wpms.other_smtp_plugins.includes("fluent-smtp")},{value:"post-smtp-mailer",label:(0,l.__)("Post SMTP Mailer","wp-mail-smtp"),logo:s(6557),disabled:!this.$wpms.other_smtp_plugins.includes("post-smtp-mailer"),readonly:!this.$wpms.other_smtp_plugins.includes("post-smtp-mailer")},{value:"smtp-mailer",label:(0,l.__)("SMTP Mailer","wp-mail-smtp"),logo:s(5543),disabled:!this.$wpms.other_smtp_plugins.includes("smtp-mailer"),readonly:!this.$wpms.other_smtp_plugins.includes("smtp-mailer")},{value:"wp-smtp",label:(0,l.__)("WP SMTP","wp-mail-smtp"),logo:s(7445),disabled:!this.$wpms.other_smtp_plugins.includes("wp-smtp"),readonly:!this.$wpms.other_smtp_plugins.includes("wp-smtp")}],selectedImport:null}},methods:{handleSubmit(){null!==this.selectedImport&&(this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/importOtherPlugin",{value:this.selectedImport}).then((t=>{t?this.nextStep():this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")})))},nextStep(){this.$next_step()},previousStep(){this.$previous_step()}}},$=j,tt=(0,d.Z)($,L,R,!1,null,null,null),et=tt.exports,st=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-choose-mailer"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}}),t.mailer_set_via_constants?e("div",{staticClass:"wp-mail-smtp-notice wp-mail-smtp-notice--info"},[e("p",{domProps:{innerHTML:t._s(t.text_mailer_set_via_constants)}})]):t._e(),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("form",[e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-row wp-mail-smtp-setup-wizard-form-row-highlight"},[e("h3",[t._v(t._s(t.text_recommended_mailers))]),e("settings-input-radios-with-icons",{attrs:{name:"choose_mailer",options:t.recommended_options},model:{value:t.selectedMailer,callback:function(e){t.selectedMailer=e},expression:"selectedMailer"}})],1),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-row"},[e("settings-input-radios-with-icons",{attrs:{name:"choose_mailer",options:t.options},on:{"clicked-disabled":t.clickedDisabledOption},model:{value:t.selectedMailer,callback:function(e){t.selectedMailer=e},expression:"selectedMailer"}})],1)])])],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step",disabled:null===t.selectedMailer||"mail"===t.selectedMailer},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},it=[],at=s(629),nt={name:"WizardStepChooseMailer",components:{SettingsInputRadiosWithIcons:G,ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Choose Your SMTP Mailer","wp-mail-smtp"),text_header_subtitle:(0,l.gB)((0,l.__)("Which mailer would you like to use to send emails? Not sure which mailer to choose? Check out our %1$scomplete mailer guide%2$s for details on each option.","wp-mail-smtp"),'',""),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_recommended_mailers:(0,l.__)("Recommended Mailers","wp-mail-smtp"),text_mailer_set_via_constants:(0,l.__)("Your mailer is already configured in a WP Mail SMTP constant, so the options below have been disabled. To change your mailer, please edit or remove the WPMS_MAILER constant in your wp-config.php file.","wp-mail-smtp"),mailer_set_via_constants:this.$wpms.defined_constants.includes("WPMS_MAILER"),recommended_options:[{value:"sendlayer",label:this.$wpms.mailer_options["sendlayer"].title,logo:s(9857),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"smtpcom",label:this.$wpms.mailer_options["smtpcom"].title,logo:s(7536),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"sendinblue",label:this.$wpms.mailer_options["sendinblue"].title,logo:s(4522),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")}],options:[{value:"amazonses",label:this.$wpms.mailer_options["amazonses"].title,logo:s(7557),is_pro:!this.$wpms.is_pro,notice:this.$wpms.mailer_options["amazonses"].edu_notice,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:!this.$wpms.is_pro||this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"gmail",label:this.$wpms.mailer_options["gmail"].title,logo:s(7526),notice:this.$wpms.mailer_options["gmail"].edu_notice,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"mailgun",label:this.$wpms.mailer_options["mailgun"].title,logo:s(5567),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"outlook",label:this.$wpms.is_pro?(0,l.__)("Microsoft 365 / Outlook","wp-mail-smtp"):this.$wpms.mailer_options["outlook"].title,logo:s(6703),is_pro:!this.$wpms.is_pro,notice:this.$wpms.mailer_options["outlook"].edu_notice,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:!this.$wpms.is_pro||this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"postmark",label:this.$wpms.mailer_options["postmark"].title,logo:s(5699),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"sendgrid",label:this.$wpms.mailer_options["sendgrid"].title,logo:s(2763),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"sparkpost",label:this.$wpms.mailer_options["sparkpost"].title,logo:s(2091),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"zoho",label:this.$wpms.mailer_options["zoho"].title,logo:s(9349),is_pro:!this.$wpms.is_pro,readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:!this.$wpms.is_pro||this.$wpms.defined_constants.includes("WPMS_MAILER")},{value:"smtp",label:this.$wpms.mailer_options["smtp"].title,logo:s(450),readonly:this.$wpms.defined_constants.includes("WPMS_MAILER"),disabled:this.$wpms.defined_constants.includes("WPMS_MAILER")}],selectedMailer:this.currentMailer}},watch:{currentMailer:function(t){this.selectedMailer=t}},computed:{...(0,at.Se)({currentMailer:"$_settings/mailer"}),selectedMailerOptions:function(){return this.recommended_options.concat(this.options).find((t=>t.value===this.selectedMailer))}},methods:{handleSubmit(t,e=!1){null!==this.selectedMailer&&"mail"!==this.selectedMailer&&(void 0===this.selectedMailerOptions.notice||e?(this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/updateSettings",{value:{mail:{mailer:this.selectedMailer}}}).then((t=>{t.success?(this.$store.dispatch("$_settings/setMailer",this.selectedMailer),this.nextStep()):this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))):this.$swal({title:this.selectedMailerOptions.label+" "+(0,l.__)("Mailer","wp-mail-smtp"),html:this.selectedMailerOptions.notice,width:650,showCloseButton:!0,allowOutsideClick:!1,allowEscapeKey:!1,allowEnterKey:!1,customClass:{container:"wp-mail-smtp-swal"},confirmButtonText:(0,l.__)("I Understand, Continue","wp-mail-smtp"),cancelButtonText:(0,l.__)("Choose a Different Mailer","wp-mail-smtp"),showCancelButton:!0,reverseButtons:!0}).then((t=>{t.value?this.handleSubmit(null,!0):void 0===t.dismiss||"cancel"!==t.dismiss||this.$wpms.defined_constants.includes("WPMS_MAILER")||(this.selectedMailer=null)})))},nextStep(){const t=this.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))+1;this.$router.push({name:`${this.$wizard_steps[t]}_${this.selectedMailer}`})},previousStep(){this.$previous_step()},clickedDisabledOption(t){var e=/(\?)/.test(this.$wpms.education.upgrade_url)?"&":"?",i=this.$wpms.education.upgrade_url+e+"utm_content="+encodeURIComponent(t.value);this.$swal({title:t.label+" "+(0,l.__)("is a PRO Feature","wp-mail-smtp"),html:`

      ${this.$wpms.education.upgrade_text.replace("%mailer%",t.label)}

      \n\t\t\t\t\t\t\t

      ${this.$wpms.education.upgrade_button}

      \n\t\t\t\t\t\t\t

      ${this.$wpms.education.upgrade_bonus}

      \n\t\t\t\t\t\t\t

      ${this.$wpms.education.upgrade_doc}

      `,width:550,imageUrl:s(4523),imageWidth:31,imageHeight:35,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-upgrade-popup"},showConfirmButton:!1})}},mounted(){this.selectedMailer=this.currentMailer}},ot=nt,rt=(0,d.Z)(ot,st,it,!1,null,"6ddea424",null),lt=rt.exports,mt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-configure-mailer"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configure-mailer-header"},[e("div",{staticClass:"wp-mail-smtp-configure-mailer-header-container"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("span",{staticClass:"wp-mail-smtp-configure-mailer-logo"},[e("inline-svg",{attrs:{src:t.logo(t.mailer),height:"40"}})],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("router-view",{ref:"mailerConfiguration"})],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step",disabled:null===t.mailer||!0===t.blocked_step},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},pt=[],ct=s(7452),_t={name:"WizardStepConfigureMailer",components:{ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Configure Mailer Settings","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Below, we'll show you all of the settings required to set up this mailer.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp")}},computed:{...(0,at.Se)({mailer:"$_settings/mailer"}),...(0,ct.vn)("$_wizard",["blocked_step"])},methods:{handleSubmit(){return!this.blocked_step&&(this.$refs.mailerConfiguration.areRequiredFieldsValid()?(this.$store.dispatch("$_app/start_loading"),void this.$store.dispatch("$_settings/saveCurrentSettings").then((t=>{t.success?this.$next_step():this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))):(this.$required_fields_modal(),!1))},previousStep(){this.blocked_step=!1,this.$previous_step()},logo(t){return t="mail"===t?"smtp":t,s(5016)(`./${t}.svg`)}}},dt=_t,ut=(0,d.Z)(dt,mt,pt,!1,null,null,null),ht=ut.exports,gt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-plugin-features"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-plugin-features-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"wp-mail-smtp-plugin-features-list"},[e("settings-input-long-checkbox",{attrs:{value:!0,name:"improved_deliverability",label:t.text_improved_email_deliverability,description:t.text_improved_email_deliverability_desc,disabled:""}}),e("settings-input-long-checkbox",{attrs:{value:!0,name:"error_tracking",label:t.text_error_tracking,description:t.text_error_tracking_desc,disabled:""}}),t.contact_form_already_installed?t._e():e("settings-input-long-checkbox",{attrs:{name:"smart_contact_form",label:t.text_smart_contact_form,description:t.text_smart_contact_form_desc},model:{value:t.smart_contact_form,callback:function(e){t.smart_contact_form=e},expression:"smart_contact_form"}}),t.is_pro?t._e():e("settings-input-long-checkbox",{attrs:{name:"summary_report_email",label:t.text_summary_report_email,description:t.text_summary_report_email_desc},model:{value:t.summary_report_email,callback:function(e){t.summary_report_email=e},expression:"summary_report_email"}}),e("settings-input-long-checkbox",{attrs:{name:"email_log",constant:"WPMS_LOGS_ENABLED",label:t.text_email_log,description:t.text_email_log_desc,show_pro:!t.is_pro},on:{input:t.emailLogEnabledChanged},model:{value:t.email_log,callback:function(e){t.email_log=e},expression:"email_log"}}),t.email_log||!t.is_pro?e("settings-input-long-checkbox",{attrs:{value:t.complete_email_report,name:"complete_email_report",label:t.text_complete_email_report,description:t.text_complete_email_report_desc,show_pro:!t.is_pro,disabled:!!t.is_pro},model:{value:t.complete_email_report,callback:function(e){t.complete_email_report=e},expression:"complete_email_report"}}):t._e(),t.is_pro&&t.email_log?e("settings-input-long-checkbox",{attrs:{name:"summary_report_email",constant:"WPMS_SUMMARY_REPORT_EMAIL_DISABLED",label:t.text_summary_report_email,description:t.text_summary_report_email_desc},model:{value:t.summary_report_email,callback:function(e){t.summary_report_email=e},expression:"summary_report_email"}}):t._e(),e("settings-input-long-checkbox",{attrs:{name:"instant_email_alert_input",label:t.text_instant_email_alert,description:t.text_instant_email_alert_desc,constant:"WPMS_ALERT_EMAIL_SEND_TO",show_pro:!t.is_pro},model:{value:t.instant_email_alert,callback:function(e){t.instant_email_alert=e},expression:"instant_email_alert"}}),t.is_pro?t._e():e("settings-input-long-checkbox",{attrs:{name:"manage_notifications",label:t.text_manage_notifications,description:t.text_manage_notifications_desc,show_pro:!t.is_pro},model:{value:t.manage_notifications,callback:function(e){t.manage_notifications=e},expression:"manage_notifications"}}),t.is_multisite&&!t.is_pro?e("settings-input-long-checkbox",{attrs:{name:"network_settings",label:t.text_network_settings,description:t.text_network_settings_desc,show_pro:!t.is_pro},model:{value:t.network_settings,callback:function(e){t.network_settings=e},expression:"network_settings"}}):t._e()],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},ft=[],wt=function(){var t=this,e=t._self._c;return e("label",{staticClass:"settings-input-long-checkbox",class:{"settings-input-long-checkbox-checked":t.value,"settings-input-long-checkbox-disabled":t.disabled||t.is_constant_set},attrs:{for:"wp-mail-smtp-settings-long-checkbox-"+t.name}},[e("div",{staticClass:"settings-input-long-checkbox-header"},[e("span",{staticClass:"title-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.show_pro?e("inline-svg",{staticClass:"wp-mail-smtp-pro-badge",attrs:{src:s(330),width:"46",height:"24"}}):t._e()],1),t.description?e("p",{staticClass:"description"},[t._v(t._s(t.description))]):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()]),e("span",{staticClass:"settings-input-long-checkbox-container"},[e("span",{staticClass:"checkbox",class:{"checkbox-checked":t.value,"checkbox-disabled":t.disabled||t.is_constant_set}},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}})],1),e("input",{attrs:{id:"wp-mail-smtp-settings-long-checkbox-"+t.name,type:"checkbox",name:t.name,disabled:t.disabled||t.is_constant_set},domProps:{checked:t.value},on:{input:function(e){return t.$emit("input",e.target.checked)}}})])])},At=[],bt={name:"SettingsInputLongCheckbox",props:{label:String,name:String,value:Boolean,description:String,constant:String,disabled:Boolean,show_pro:Boolean},computed:{is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}}},vt=bt,xt=(0,d.Z)(vt,wt,At,!1,null,null,null),kt=xt.exports,yt={name:"WizardStepPluginFeatures",components:{ContentHeader:h,TheWizardStepCounter:X,SettingsInputLongCheckbox:kt},data(){return{text_header_title:(0,l.__)("Which email features do you want to enable?","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Make sure you're getting the most out of WP Mail SMTP. Just check all of the features you'd like to use, and we'll go ahead and enable those for you.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_improved_email_deliverability:(0,l.__)("Improved Email Deliverability","wp-mail-smtp"),text_improved_email_deliverability_desc:(0,l.__)("Ensure your emails are sent successfully and reliably.","wp-mail-smtp"),text_error_tracking:(0,l.__)("Email Error Tracking","wp-mail-smtp"),text_error_tracking_desc:(0,l.__)("Easily spot errors causing delivery issues.","wp-mail-smtp"),text_smart_contact_form:(0,l.__)("Smart Contact Form","wp-mail-smtp"),text_smart_contact_form_desc:(0,l.__)("Create beautiful contact forms with just a few clicks.","wp-mail-smtp"),text_email_log:(0,l.__)("Detailed Email Logs","wp-mail-smtp"),text_email_log_desc:(0,l.__)("Keep records of every email that's sent out from your website.","wp-mail-smtp"),text_instant_email_alert:(0,l.__)("Instant Email Alerts","wp-mail-smtp"),text_instant_email_alert_desc:(0,l.__)("Get notifications via email, SMS, Slack, or webhook when emails fail to send.","wp-mail-smtp"),text_complete_email_report:(0,l.__)("Complete Email Reports","wp-mail-smtp"),text_complete_email_report_desc:(0,l.__)("See the delivery status, track opens and clicks, and create deliverability graphs.","wp-mail-smtp"),text_summary_report_email:(0,l.__)("Weekly Email Summary","wp-mail-smtp"),text_summary_report_email_desc:(0,l.__)("Get statistics about emails you've sent.","wp-mail-smtp"),text_manage_notifications:(0,l.__)("Manage Default Notifications","wp-mail-smtp"),text_manage_notifications_desc:(0,l.__)("Control which email notifications your WordPress site sends.","wp-mail-smtp"),text_network_settings:(0,l.__)("Multisite Network Settings","wp-mail-smtp"),text_network_settings_desc:(0,l.__)("Save time with powerful WordPress Multisite controls.","wp-mail-smtp"),is_pro:this.$wpms.is_pro,is_multisite:this.$wpms.is_multisite,email_log:!1,complete_email_report:!!this.$wpms.is_pro,summary_report_email:!1,manage_notifications:!1,network_settings:!1}},computed:{...(0,at.Se)({contact_form_already_installed:"$_plugins/contact_form_plugin_already_installed",email_log_setting:"$_settings/email_log_enabled",summary_report_email_setting:"$_settings/summary_report_email_enabled"}),...(0,ct.vn)("$_plugins",{smart_contact_form:"smart_contact_form_setting"}),...(0,ct.vn)("$_settings",{alert_email_connections:"settings.alert_email.connections",instant_email_alert:"settings.alert_email.enabled"})},watch:{smart_contact_form:function(t){if(this.contact_form_already_installed)return!1;this.showWPFormsPluginInstallFooterNotice(t)},contact_form_already_installed:function(t){t&&this.$emit("displayContentBelow","")},email_log_setting:function(t){this.email_log=t},summary_report_email_setting:function(t){this.summary_report_email=t}},methods:{handleSubmit(){this.$store.dispatch("$_app/start_loading");let t=[],e={value:{general:{summary_report_email_disabled:!this.summary_report_email}}};if(t.push(this.$store.dispatch("$_settings/setSummaryReportEmail",!this.summary_report_email)),this.is_pro){e.value={...e.value,logs:{enabled:this.email_log}},t.push(this.$store.dispatch("$_settings/setLogs",this.email_log));let s={enabled:this.instant_email_alert};this.instant_email_alert&&0===Object.values(this.alert_email_connections).length&&(s.connections=[{send_to:this.$wpms.current_user_email}]),e.value={...e.value,alert_email:s}}if(t.push(this.$store.dispatch("$_settings/updateSettings",e)),this.smart_contact_form&&!this.contact_form_already_installed&&t.push(this.$store.dispatch("$_plugins/installPlugin","wpforms-lite")),!this.is_pro){const e=[];this.email_log&&e.push("email_log"),this.complete_email_report&&e.push("complete_email_report"),this.instant_email_alert&&e.push("instant_email_alert"),this.manage_notifications&&e.push("manage_notifications"),this.network_settings&&e.push("network_settings"),t.push(this.$store.dispatch("$_settings/savePluginFeatures",e))}Promise.all(t).then((t=>{const e=t.filter((t=>t.success));if(e.length===t.length){this.$emit("displayContentBelow","");let t=this.is_pro&&!this.$store.getters["$_settings/email_log_enabled"]?1:0;this.$next_step(t)}})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},previousStep(){this.$emit("displayContentBelow","");const t=this.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))-1;this.$router.push({name:`${this.$wizard_steps[t]}_${this.$store.getters["$_settings/mailer"]}`})},showWPFormsPluginInstallFooterNotice(t){const e=t?`

      ${(0,l.__)("The following plugin will be installed for free: WPForms","wp-mail-smtp")}

      `:"";this.$emit("displayContentBelow",e)},emailLogEnabledChanged(){"0"===this.$wpms.completed_time&&sessionStorage.setItem("wp_mail_smtp_email_log_enabled_changed","true")}},mounted(){if(this.showWPFormsPluginInstallFooterNotice(this.smart_contact_form&&!this.contact_form_already_installed),this.$wpms.is_pro&&"0"===this.$wpms.completed_time&&"true"!==sessionStorage.getItem("wp_mail_smtp_email_log_enabled_changed")?this.email_log=!0:this.email_log=this.$store.getters["$_settings/email_log_enabled"],this.summary_report_email=this.$store.getters["$_settings/summary_report_email_enabled"],!this.$wpms.is_pro){const t=this.$store.getters["$_settings/plugin_features"];t.includes("email_log")&&(this.email_log=!0),t.includes("complete_email_report")&&(this.complete_email_report=!0),t.includes("instant_email_alert")&&(this.instant_email_alert=!0),t.includes("manage_notifications")&&(this.manage_notifications=!0),t.includes("network_settings")&&(this.network_settings=!0)}}},Ct=yt,St=(0,d.Z)(Ct,gt,ft,!1,null,null,null),Pt=St.exports,Mt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-help-improve"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-help-improve-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("settings-input-text",{attrs:{name:"email",type:"email",label:t.text_email_label,description:t.text_email_description},model:{value:t.current_user_email,callback:function(e){t.current_user_email=e},expression:"current_user_email"}}),e("settings-input-checkbox",{attrs:{name:"usage_tracking",label:t.text_usage_tracking_label,description:t.text_usage_tracking_description,tooltip:t.text_usage_tracking_tooltip},model:{value:t.usage_tracking,callback:function(e){t.usage_tracking=e},expression:"usage_tracking"}})],1),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"skip_step"},domProps:{textContent:t._s(t.text_skip)},on:{click:function(e){return e.preventDefault(),t.nextStep.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},Et=[],Tt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-text",class:{"settings-input-text-with-copy":t.copy,"input-error":t.has_errors||t.field_error}},[e("label",{staticClass:"settings-input-label-container",attrs:{for:t.id}},[t.label?e("span",{staticClass:"label",domProps:{innerHTML:t._s(t.label)}}):t._e(),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),e("span",{staticClass:"settings-input-container"},["checkbox"===t.type?e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],ref:"input",attrs:{id:t.id,name:t.name,placeholder:t.placeholder,readonly:t.readonly,disabled:t.disabled||t.is_constant_set,type:"checkbox"},domProps:{checked:Array.isArray(t.currentValue)?t._i(t.currentValue,null)>-1:t.currentValue},on:{change:[function(e){var s=t.currentValue,i=e.target,a=!!i.checked;if(Array.isArray(s)){var n=null,o=t._i(s,n);i.checked?o<0&&(t.currentValue=s.concat([n])):o>-1&&(t.currentValue=s.slice(0,o).concat(s.slice(o+1)))}else t.currentValue=a},t.inputUpdate]}}):"radio"===t.type?e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],ref:"input",attrs:{id:t.id,name:t.name,placeholder:t.placeholder,readonly:t.readonly,disabled:t.disabled||t.is_constant_set,type:"radio"},domProps:{checked:t._q(t.currentValue,null)},on:{change:[function(e){t.currentValue=null},t.inputUpdate]}}):e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],ref:"input",attrs:{id:t.id,name:t.name,placeholder:t.placeholder,readonly:t.readonly,disabled:t.disabled||t.is_constant_set,type:t.type},domProps:{value:t.currentValue},on:{change:t.inputUpdate,input:function(e){e.target.composing||(t.currentValue=e.target.value)}}}),t.copy?e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small",class:{"wp-mail-smtp-button-copied":t.show_copied},attrs:{title:t.text_copy_button},on:{click:function(e){return e.preventDefault(),t.copyValue.apply(null,arguments)}}},[e("span",{staticClass:"copy-button-container"},[e("inline-svg",{staticClass:"icon",class:{active:!t.show_copied},attrs:{src:s(8098),width:"16",height:"16"}}),e("inline-svg",{staticClass:"icon copied",class:{active:t.show_copied},attrs:{src:s(5561),width:"16",height:"16"}})],1)]):t._e()]),t.has_errors?e("p",{staticClass:"error"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(4186),width:"16"}}),e("span",{domProps:{innerHTML:t._s(t.text_error)}})],1):t._e(),t.description?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.description)}}):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},Ft=[],It=function(){var t=this,e=t._self._c;return e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.tooltip_data,expression:"tooltip_data"}],staticClass:"wp-mail-smtp-info",attrs:{tabindex:"0"}},[e("inline-svg",{staticClass:"icon",attrs:{src:s(1004),width:"14",height:"14"}})],1)},Bt=[],Dt={name:"SettingsInfoTooltip",props:{content:String},data(){return{tooltip_data:{content:this.content,autoHide:!1,trigger:"hover focus click"}}}},zt=Dt,Ot=(0,d.Z)(zt,It,Bt,!1,null,"74a4d2ae",null),Wt=Ot.exports,Lt={name:"SettingsInputText",components:{SettingsInfoTooltip:Wt},props:{name:String,value:String,label:String,description:String,constant:String,placeholder:String,type:{type:String,default:"text"},tooltip:String,readonly:Boolean,disabled:Boolean,format:RegExp,error:{type:String,default:""},copy:{type:Boolean,default:!1},is_error:Boolean},data(){return{has_error:!1,id:"input-"+this.name,text_copy_button:(0,l.__)("Copy input value","wp-mail-smtp"),text_copied:(0,l.__)("Copied!","wp-mail-smtp"),show_copied:!1}},computed:{currentValue:{get(){return this.value},set(t){this.$emit("is_error_update",!1),this.$emit("input",t)}},field_error:{get(){return this.is_error},set(t){this.$emit("is_error_update",t)}},has_errors:function(){return this.error.length>0||this.has_error},text_error:function(){return this.error.length>0?this.error:(0,l.__)("The value entered does not match the required format","wp-mail-smtp")},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{inputUpdate:function(t){if(this.disabled)return!1;if(this.has_error=!1,this.format||this.type&&"email"===this.type){const e=this.format?this.format:/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;if(!e.test(t.target.value))return this.has_error=!0,this.$emit("error_detected",this.text_error),!1}},copyValue:function(){const t=this.$refs.input;t.select(),document.execCommand("copy"),this.show_copied=!0;let e=this;setTimeout((function(){e.show_copied=!1}),1e3)}}},Rt=Lt,Qt=(0,d.Z)(Rt,Tt,Ft,!1,null,null,null),Nt=Qt.exports,Zt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-checkbox",class:{"settings-input-checkbox-checked":t.value,"settings-input-checkbox-disabled":t.disabled}},[e("span",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),e("label",{staticClass:"settings-input-checkbox-container",attrs:{for:"wp-mail-smtp-settings-checkbox-"+t.name}},[e("span",{staticClass:"checkbox",class:{"checkbox-checked":t.value,"checkbox-disabled":t.disabled}},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"14",height:"14"}})],1),e("input",{attrs:{id:"wp-mail-smtp-settings-checkbox-"+t.name,type:"checkbox",name:t.name,disabled:t.disabled},domProps:{checked:t.value},on:{input:function(e){return t.$emit("input",e.target.checked)}}}),t.description?e("span",{staticClass:"input-label"},[t._v(t._s(t.description))]):t._e()])])},Ut=[],Ht={name:"SettingsInputCheckbox",components:{SettingsInfoTooltip:Wt},props:{label:String,name:String,value:Boolean,description:String,tooltip:String,disabled:Boolean}},Gt=Ht,Yt=(0,d.Z)(Gt,Zt,Ut,!1,null,null,null),Vt=Yt.exports,Kt={name:"WizardStepHelpImprove",components:{ContentHeader:h,TheWizardStepCounter:X,SettingsInputText:Nt,SettingsInputCheckbox:Vt},data(){return{text_header_title:(0,l.__)("Help Improve WP Mail SMTP + Smart Recommendations","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Get helpful suggestions from WP Mail SMTP on how to optimize your email deliverability and grow your business.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_skip:(0,l.__)("Skip this Step","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_email_label:(0,l.__)("Your Email Address","wp-mail-smtp"),text_email_description:(0,l.__)("Your email is needed, so you can receive recommendations.","wp-mail-smtp"),text_usage_tracking_label:(0,l.__)("Help make WP Mail SMTP better for everyone","wp-mail-smtp"),text_usage_tracking_description:(0,l.__)("Yes, count me in","wp-mail-smtp"),text_usage_tracking_tooltip:(0,l.__)("By allowing us to track usage data we can better help you because we know with which WordPress configurations, themes and plugins we should test.","wp-mail-smtp"),is_pro:this.$wpms.is_pro,usage_tracking:!1}},computed:{...(0,ct.vn)("$_wizard",["current_user_email"])},methods:{handleSubmit(){this.$store.dispatch("$_app/start_loading");let t=[];if(this.current_user_email&&t.push(this.$store.dispatch("$_settings/subscribeToNewsletter",this.current_user_email)),this.usage_tracking){const e={value:{general:{"usage-tracking-enabled":!0}}};t.push(this.$store.dispatch("$_settings/updateSettings",e))}Promise.all(t).then((()=>{this.nextStep()})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},nextStep(){this.$next_step()},previousStep(){this.$previous_step()}}},Jt=Kt,qt=(0,d.Z)(Jt,Mt,Et,!1,null,null,null),Xt=qt.exports,jt=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-license"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-license-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),t.is_pro?t._e():e("div",{staticClass:"upgrade-content"},[e("p",{staticClass:"medium-bold",domProps:{innerHTML:t._s(t.text_upgrade_paragraph)}}),e("div",{staticClass:"checked-item-list"},[e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_email_log))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_complete_email_report))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_instant_email_alert))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_summary_report_email))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_manage_notifications))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_network_settings))])],1)])]),t.verified?e("div",{staticClass:"verified-license"},[e("p",{domProps:{innerHTML:t._s(t.text_verified_license)}})]):e("div",{staticClass:"license-form",class:{"license-form-error":t.license_error}},[e("p",{domProps:{innerHTML:t._s(t.text_license_form)}}),e("div",{staticClass:"license-control"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.license,expression:"license"}],attrs:{name:"license",type:"password",placeholder:t.text_license_input_placeholder,"aria-label":t.text_aria_label_for_license_input},domProps:{value:t.license},on:{input:function(e){e.target.composing||(t.license=e.target.value)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-success wp-mail-smtp-button-small",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.handleLicenseSubmit.apply(null,arguments)}}},[t._v(" "+t._s(t.text_license_button)+" ")])]),t.license_error?e("p",{staticClass:"error-message",domProps:{textContent:t._s(t.text_license_error)}}):t._e()])]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[t.verified?e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)]):e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"skip_step"},domProps:{textContent:t._s(t.text_skip)},on:{click:function(e){return e.preventDefault(),t.nextStep.apply(null,arguments)}}})])])])},$t=[],te=s(8394),ee=s.n(te),se={name:"WizardStepLicense",components:{ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Enter your WP Mail SMTP License Key","wp-mail-smtp"),text_header_subtitle:this.$wpms.is_pro?"":(0,l.gB)((0,l.__)("You're currently using %1$sWP Mail SMTP Lite%2$s - no license needed. Enjoy!","wp-mail-smtp"),'',"")+" 🙂",text_save:(0,l.__)("Continue","wp-mail-smtp"),text_skip:(0,l.__)("Skip this Step","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_upgrade_paragraph:(0,l.gB)((0,l.__)("To unlock selected features, %1$sUpgrade to Pro%2$s and enter your license key below.","wp-mail-smtp"),'',""),text_network_settings:(0,l.__)("Multisite Network Settings","wp-mail-smtp"),text_manage_notifications:(0,l.__)("Manage Default Notifications","wp-mail-smtp"),text_email_log:(0,l.__)("Detailed Email Logs","wp-mail-smtp"),text_summary_report_email:(0,l.__)("Enhanced Weekly Email Summary","wp-mail-smtp"),text_license_form_lite:(0,l.gB)((0,l.__)("Already purchased? Enter your license key below to connect with %1$sWP Mail SMTP Pro%2$s!","wp-mail-smtp"),"",""),text_license_form_pro:(0,l.__)("Enter your license key below to unlock plugin updates!","wp-mail-smtp"),text_license_button:this.$wpms.is_pro?(0,l.__)("Verify License Key","wp-mail-smtp"):(0,l.__)("Connect","wp-mail-smtp"),text_license_error:(0,l.__)("The License Key format is incorrect. Please enter a valid key and try again.","wp-mail-smtp"),text_verified_license:(0,l.__)("Your license was successfully verified! You are ready for the next step.","wp-mail-smtp"),text_email_log_desc:(0,l.__)("Keep records of every email that's sent out from your website.","wp-mail-smtp"),text_manage_notifications_desc:(0,l.__)("Control which email notifications your WordPress site sends.","wp-mail-smtp"),text_network_settings_desc:(0,l.__)("Save time with powerful WordPress Multisite controls.","wp-mail-smtp"),text_instant_email_alert:(0,l.__)("Instant Email Alerts","wp-mail-smtp"),text_instant_email_alert_desc:(0,l.__)("Get notifications via email, SMS, Slack, or webhook when emails fail to send.","wp-mail-smtp"),text_complete_email_report:(0,l.__)("Complete Email Reports","wp-mail-smtp"),text_complete_email_report_desc:(0,l.__)("See the delivery status, track opens and clicks, and create deliverability graphs.","wp-mail-smtp"),text_pro_badge:(0,l.__)("Pro badge","wp-mail-smtp"),text_aria_label_for_license_input:(0,l.__)("License key input","wp-mail-smtp"),text_license_input_placeholder:(0,l.__)("Paste your license key here","wp-mail-smtp"),pro_badge:s(330),is_pro:this.$wpms.is_pro,verified:!1,license:"",license_error:!1}},computed:{text_license_form:function(){return this.is_pro?this.text_license_form_pro:this.text_license_form_lite},...(0,at.Se)({selectedProFeatures:"$_settings/plugin_features"})},methods:{handleLicenseSubmit(){return this.license_error=!1,!(!this.is_pro&&0===this.license.length)&&(this.is_pro&&this.license.length<16?(this.license_error=!0,!1):(this.$store.dispatch("$_app/start_loading"),void(this.is_pro?this.$store.dispatch("$_settings/verifyLicense",this.license).then((t=>{t.success?(this.verified=!0,this.$swal({title:(0,l.__)("Successful Verification!","wp-mail-smtp"),html:t.data.message,width:450,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})):this.$swal({title:(0,l.__)("Verification Error!","wp-mail-smtp"),html:t.data,width:450,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")})):this.$store.dispatch("$_settings/upgradePlugin",this.license).then((t=>{if(t.success&&ee()(t,"data.redirect_url"))return window.location=t.data.redirect_url;this.$store.dispatch("$_app/stop_loading"),this.$swal({title:t.success?(0,l.__)("Successful Upgrade!","wp-mail-smtp"):(0,l.__)("Upgrade Failed!","wp-mail-smtp"),html:t.data,width:450,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})})))))},handleSubmit(){this.nextStep()},nextStep(){this.$next_step()},previousStep(){let t=this.is_pro&&!this.$store.getters["$_settings/email_log_enabled"]?1:0;this.$previous_step(t)},prepareLongCheckbox(t,e){return``},prepareProFeaturesHtml(){let t="
      ";return this.selectedProFeatures.includes("email_log")&&(t+=this.prepareLongCheckbox(this.text_email_log,this.text_email_log_desc)),this.selectedProFeatures.includes("complete_email_report")&&(t+=this.prepareLongCheckbox(this.text_complete_email_report,this.text_complete_email_report_desc)),this.selectedProFeatures.includes("instant_email_alert")&&(t+=this.prepareLongCheckbox(this.text_instant_email_alert,this.text_instant_email_alert_desc)),this.selectedProFeatures.includes("manage_notifications")&&(t+=this.prepareLongCheckbox(this.text_manage_notifications,this.text_manage_notifications_desc)),this.selectedProFeatures.includes("network_settings")&&(t+=this.prepareLongCheckbox(this.text_network_settings,this.text_network_settings_desc)),t+"
      "}},mounted(){if(!this.is_pro&&this.selectedProFeatures.length>0){const t=this.prepareProFeaturesHtml();this.$swal({title:(0,l.__)("Would you like to purchase the following features now?","wp-mail-smtp"),html:`

      ${(0,l.__)("These features are available as part of WP Mail SMTP Pro plan.","wp-mail-smtp")}

      \n\t\t\t\t\t\t\t${t}\n\t\t\t\t\t\t\t

      ${(0,l.gB)((0,l.__)("%1$sBonus:%2$s You can upgrade to the Pro plan and %3$ssave %5$s today%4$s, automatically applied at checkout.","wp-mail-smtp"),"","",'',"","$50")}

      \n\t\t\t\t\t\t`,width:850,showCloseButton:!0,allowOutsideClick:!1,allowEscapeKey:!1,allowEnterKey:!1,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-plugin-upgrade"},confirmButtonText:(0,l.__)("Purchase Now","wp-mail-smtp"),cancelButtonText:(0,l.__)("I'll do it later","wp-mail-smtp"),showCancelButton:!0,reverseButtons:!0}).then((t=>{if(t.value){const t=window.open(this.$wpms.upgrade_link,"_blank");t.focus()}}))}this.verified=this.$wpms.license_exists},created(){const t=new URLSearchParams(window.location.search);this.$wpms.license_exists&&!t.has("upgrade-redirect")&&this.nextStep()}},ie=se,ae=(0,d.Z)(ie,jt,$t,!1,null,null,null),ne=ae.exports,oe=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-check-configuration"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-check-configuration-header"},[e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"check-configuration-loading-image-container"},[e("img",{attrs:{src:s(7764),alt:t.text_image_alt}})])])])},re=[],le={name:"WizardStepCheckConfiguration",components:{ContentHeader:h},data(){return{text_header_title:(0,l.__)("Checking Mailer Configuration","wp-mail-smtp"),text_header_subtitle:(0,l.__)("We're running some tests in the background to make sure everything is set up properly.","wp-mail-smtp"),text_image_alt:(0,l.__)("Checking mailer configuration image","wp-mail-smtp")}},mounted(){this.$store.dispatch("$_wizard/checkMailerConfiguration").then((t=>{t.success?this.$router.push({name:"check_configuration_step_success"}):this.$router.push({name:"check_configuration_step_failure"})}))}},me=le,pe=(0,d.Z)(me,oe,re,!1,null,null,null),ce=pe.exports,_e=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-configuration-success"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configuration-success-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"plugin-item-container"},[e("p",{staticClass:"medium-bold",domProps:{textContent:t._s(t.text_free_plugins_header)}}),e("div",t._l(t.plugins,(function(t,s){return e("plugin-item",{key:s,attrs:{name:t.name,slug:t.slug,is_installed:t.is_installed,is_activated:t.is_activated}})})),1)]),t.is_pro?t._e():e("div",{staticClass:"upgrade-banner-container"},[e("div",{staticClass:"upgrade-banner"},[e("h2",{domProps:{textContent:t._s(t.text_upgrade_title)}}),e("p",{staticClass:"subtitle",domProps:{textContent:t._s(t.text_upgrade_subtitle)}}),e("div",{staticClass:"checked-item-list"},[e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_email_log))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_manage_notifications))])],1),e("span",{staticClass:"checked-item"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(7579),width:"16",height:"16"}}),t._v(" "),e("span",[t._v(t._s(t.text_network_settings))])],1)]),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-success",attrs:{type:"button"},domProps:{textContent:t._s(t.text_upgrade_button)},on:{click:t.openUpgradePage}})]),e("p",{staticClass:"bonus",domProps:{innerHTML:t._s(t.text_bonus)}})])]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"send_test_email"},domProps:{textContent:t._s(t.text_test_email)},on:{click:function(e){return e.preventDefault(),t.handleTestEmail.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"send_feedback"},domProps:{textContent:t._s(t.text_send_feedback)},on:{click:function(e){return e.preventDefault(),t.handleFeedback.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"button",name:"finish_setup"},domProps:{textContent:t._s(t.text_finish)},on:{click:function(e){return e.preventDefault(),t.handleFinish.apply(null,arguments)}}})])])},de=[],ue=function(){var t=this,e=t._self._c;return e("div",{class:`wp-mail-smtp-plugin-item wp-mail-smtp-plugin-${t.slug}`},[e("span",{staticClass:"wp-mail-smtp-plugin-item-title-container"},[t.logo.length?e("img",{staticClass:"wp-mail-smtp-logo-icon",attrs:{src:t.logo2x,srcset:t.logo_srcset,alt:t.name}}):t._e(),e("span",{domProps:{textContent:t._s(t.name)}})]),e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",disabled:t.is_activated||t.is_installed},on:{click:function(e){return e.preventDefault(),t.handleClick.apply(null,arguments)}}},[t.loading?e("spin-loader",{attrs:{color:"white"}}):e("span",[t._v(" "+t._s(t.text_button_label)+" ")])],1)])},he=[],ge=function(){var t=this,e=t._self._c;return e("img",{class:`wp-mail-smtp-loader wp-mail-smtp-loader-${t.size}`,attrs:{src:t.image,alt:t.text_loading}})},fe=[],we={name:"SpinLoader",props:{color:{type:String,default:""},size:{type:String,default:"sm"}},data(){return{image:s(7630)(`./loading${this.color.length?"-"+this.color:""}.svg`),text_loading:(0,l.__)("Loading","wp-mail-smtp")}}},Ae=we,be=(0,d.Z)(Ae,ge,fe,!1,null,null,null),ve=be.exports,xe={name:"PluginItem",components:{SpinLoader:ve},props:{slug:String,name:String,is_installed:Boolean,is_activated:Boolean},data(){return{loading:!1,logo:s(8517)(`./${this.slug}.png`),logo2x:s(833)(`./${this.slug}@2x.png`)}},computed:{text_button_label:function(){let t=(0,l.__)("Install","wp-mail-smtp");return this.is_installed&&!this.is_activated&&(t=(0,l.__)("Installed","wp-mail-smtp")),this.is_activated&&(t=(0,l.__)("Activated","wp-mail-smtp")),t},logo_srcset:function(){return`${this.logo}, ${this.logo2x} 2x`}},methods:{handleClick(){this.loading||(this.loading=!0,this.$store.dispatch("$_plugins/installPlugin",this.slug).then((t=>{t.success&&this.$wpms_success_toast({title:`Plugin: ${this.name} installed!`}),this.loading=!1})))}}},ke=xe,ye=(0,d.Z)(ke,ue,he,!1,null,"2e2edfa6",null),Ce=ye.exports,Se={name:"WizardStepConfigurationSuccess",components:{ContentHeader:h,TheWizardStepCounter:X,PluginItem:Ce},data(){return{text_header_title:(0,l.__)("Congrats, you’ve successfully set up WP Mail SMTP!","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Here’s what to do next:","wp-mail-smtp"),text_free_plugins_header:(0,l.__)("Check out our other free WordPress plugins:","wp-mail-smtp"),text_upgrade_title:(0,l.__)("Upgrade to Unlock Powerful SMTP Features","wp-mail-smtp"),text_upgrade_subtitle:(0,l.__)("Upgrade to WP Mail SMTP Pro to unlock more awesome features and experience why WP Mail SMTP is used by over 3,000,000 websites.","wp-mail-smtp"),text_network_settings:(0,l.__)("Multisite Network Settings","wp-mail-smtp"),text_manage_notifications:(0,l.__)("Manage Default Notifications","wp-mail-smtp"),text_email_log:(0,l.__)("Detailed Email Logs","wp-mail-smtp"),text_upgrade_button:(0,l.__)("Upgrade to Pro Today","wp-mail-smtp"),text_test_email:(0,l.__)("Send a Test Email","wp-mail-smtp"),text_send_feedback:(0,l.__)("Send us Feedback","wp-mail-smtp"),text_finish:(0,l.__)("Finish Setup","wp-mail-smtp"),text_bonus:(0,l.gB)((0,l.__)("%1$sBonus:%2$s You can upgrade to the Pro plan and %3$ssave %5$s today%4$s, automatically applied at checkout.","wp-mail-smtp"),"","",'',"","$50"),star_image_html:`${(0,l.__)(`,is_pro:this.$wpms.is_pro}},computed:{...(0,at.Se)({plugins:"$_plugins/partner_plugins"})},methods:{handleTestEmail(){return window.location=this.$wpms.email_test_tab_url},goodFeedback(){this.$swal({title:(0,l.__)("Thanks for the feedback!","wp-mail-smtp"),html:`${(0,l.gB)((0,l.__)("Help us spread the word %1$sby giving WP Mail SMTP a 5-star rating %3$s(%4$s) on WordPress.org%2$s. Thanks for your support and we look forward to bringing you more awesome features.","wp-mail-smtp"),'',"","
      ",this.star_image_html+""+this.star_image_html+this.star_image_html+this.star_image_html+this.star_image_html)}`,width:650,showCloseButton:!0,allowEnterKey:!1,confirmButtonText:(0,l.__)("Rate on WordPress.org","wp-mail-smtp"),customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-feedback-good"}}).then((t=>{if(t.value){const t=window.open("https://wordpress.org/support/plugin/wp-mail-smtp/reviews/#new-post","_blank");t.focus()}}))},badFeedback(){this.$swal({title:(0,l.__)("What could we do to improve?","wp-mail-smtp"),html:`${(0,l.__)("We're sorry things didn't go smoothly for you, and want to keep improving. Please let us know any specific parts of this process that you think could be better. We really appreciate any details you're willing to share!","wp-mail-smtp")}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`,width:650,showCloseButton:!0,allowEnterKey:!1,allowOutsideClick:!1,allowEscapeKey:!1,confirmButtonText:(0,l.__)("Submit Feedback","wp-mail-smtp"),customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-feedback-bad"},preConfirm:()=>[document.getElementById("feedback").value,document.getElementById("permission").checked]}).then((t=>{if(t.value){const e=t.value[0],s=t.value[1];this.$store.dispatch("$_wizard/sendFeedback",{feedback:e,permission:s})}}))},handleFeedback(){this.$swal({title:(0,l.__)("How was your WP Mail SMTP setup experience?","wp-mail-smtp"),text:(0,l.__)("Our goal is to make your SMTP setup as simple and straightforward as possible. We'd love to know how this process went for you!","wp-mail-smtp"),width:650,showCloseButton:!0,allowEnterKey:!1,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-feedback"},showCancelButton:!0}).then((t=>{t.value?this.goodFeedback():void 0!==t.dismiss&&"cancel"===t.dismiss&&this.badFeedback()}))},handleFinish(){return window.location=this.$wpms.exit_url},openUpgradePage:function(){const t=window.open(this.$wpms.upgrade_link,"_blank");t.focus()}}},Pe=Se,Me=(0,d.Z)(Pe,_e,de,!1,null,null,null),Ee=Me.exports,Te=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-configuration-failure"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configuration-failure-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"start-troubleshooting-arrow-container"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(1122),width:"112",height:"112"}})],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"button",name:"start_troubleshooting"},domProps:{textContent:t._s(t.text_start_troubleshooting)},on:{click:function(e){return e.preventDefault(),t.handleTroubleshooting.apply(null,arguments)}}}),e("button",{staticClass:"wp-mail-smtp-button",attrs:{type:"button",name:"finish_setup"},domProps:{textContent:t._s(t.text_finish)},on:{click:function(e){return e.preventDefault(),t.handleFinish.apply(null,arguments)}}})])])},Fe=[],Ie={name:"WizardStepConfigurationFailure",components:{ContentHeader:h,TheWizardStepCounter:X},data(){return{text_header_title:(0,l.__)("Whoops, looks like things aren’t configured properly.","wp-mail-smtp"),text_header_subtitle:(0,l.__)("We just tried to send a test email, but something prevented that from working. To see more details about the issue we detected, as well as our suggestions to fix it, please start troubleshooting.","wp-mail-smtp"),text_start_troubleshooting:(0,l.__)("Start Troubleshooting","wp-mail-smtp"),text_send_feedback:(0,l.__)("Send us Feedback","wp-mail-smtp"),text_finish:(0,l.__)("Finish Setup","wp-mail-smtp")}},methods:{handleTroubleshooting(){return window.location=`${this.$wpms.email_test_tab_url}&auto-start=1`},handleFinish(){return window.location=this.$wpms.exit_url}}},Be=Ie,De=(0,d.Z)(Be,Te,Fe,!1,null,null,null),ze=De.exports,Oe=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-smtp"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"host",constant:"WPMS_SMTP_HOST",label:t.text_host_label,is_error:t.field_errors.includes("host")},on:{is_error_update:function(e){return t.removeFieldError("host")}},model:{value:t.host,callback:function(e){t.host=e},expression:"host"}}),e("settings-input-radio",{attrs:{name:"encryption",constant:"WPMS_SSL",label:t.text_encryption_label,options:t.encryptionOptions,description:t.text_encryption_description},on:{input:t.encryptionChanged},model:{value:t.encryption,callback:function(e){t.encryption=e},expression:"encryption"}}),e("settings-input-number",{attrs:{name:"port",constant:"WPMS_SMTP_PORT",label:t.text_port_label,is_error:t.field_errors.includes("port")},on:{is_error_update:function(e){return t.removeFieldError("port")}},model:{value:t.port,callback:function(e){t.port=e},expression:"port"}}),e("settings-input-switch",{directives:[{name:"show",rawName:"v-show",value:t.show_autotls,expression:"show_autotls"}],attrs:{name:"autotls",constant:"WPMS_SMTP_AUTOTLS",title:t.text_autotls_title,label:t.text_autotls_label,description:t.text_autotls_description},model:{value:t.autotls,callback:function(e){t.autotls=e},expression:"autotls"}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-switch",{attrs:{name:"auth",constant:"WPMS_SMTP_AUTH",title:t.text_auth_title,label:t.text_auth_label},model:{value:t.auth,callback:function(e){t.auth=e},expression:"auth"}}),e("settings-input-text",{directives:[{name:"show",rawName:"v-show",value:t.auth,expression:"auth"}],attrs:{name:"user",constant:"WPMS_SMTP_USER",label:t.text_user_label,is_error:t.field_errors.includes("user")},on:{is_error_update:function(e){return t.removeFieldError("user")}},model:{value:t.user,callback:function(e){t.user=e},expression:"user"}}),e("settings-input-text",{directives:[{name:"show",rawName:"v-show",value:t.auth,expression:"auth"}],attrs:{name:"pass",constant:"WPMS_SMTP_PASS",type:"password",label:t.text_pass_label,is_error:t.field_errors.includes("pass")},on:{is_error_update:function(e){return t.removeFieldError("pass")}},model:{value:t.pass,callback:function(e){t.pass=e},expression:"pass"}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},We=[],Le=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-radio"},[t.label?e("span",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))])]):t._e(),e("div",{staticClass:"settings-input-radio-container"},t._l(t.options,(function(s){return e("label",{key:s.value,class:t.labelClass(s.value),attrs:{for:"wp-mail-smtp-settings-radio-"+t.name+"["+s.value+"]"}},[e("span",{class:t.titleClass(s.value)}),e("input",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],attrs:{id:"wp-mail-smtp-settings-radio-"+t.name+"["+s.value+"]",type:"radio",name:t.name,autocomplete:"off",readonly:t.disabled,disabled:t.is_constant_set},domProps:{value:s.value,checked:t.isChecked(s.value),checked:t._q(t.selected,s.value)},on:{change:[function(e){t.selected=s.value},t.updateSetting]}}),e("span",{staticClass:"input-label"},[t._v(t._s(s.label))])])})),0),t.description?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.description)}}):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},Re=[],Qe={name:"SettingsInputRadio",props:{options:Array,label:String,name:String,value:String,description:String,constant:String,disabled:Boolean},data(){return{has_error:!1}},computed:{selected:{get(){return this.value},set(t){this.$emit("input",t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{updateSetting:function(){if(this.disabled)return!1},titleClass(t){let e="wp-mail-smtp-styled-radio";return this.isChecked(t)&&(e+=" wp-mail-smtp-styled-radio-checked"),this.is_constant_set&&(e+=" wp-mail-smtp-styled-radio-disabled"),e},labelClass(t){let e="";return this.isChecked(t)&&(e+=" wp-mail-smtp-styled-radio-label-checked"),this.is_constant_set&&(e+=" wp-mail-smtp-styled-radio-label-disabled"),e},isChecked(t){return t===this.selected}}},Ne=Qe,Ze=(0,d.Z)(Ne,Le,Re,!1,null,null,null),Ue=Ze.exports,He=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-number",class:{"settings-input-number-error":t.field_error}},[e("label",{staticClass:"settings-input-label-container",attrs:{for:t.id}},[t.label?e("span",{staticClass:"label"},[t._v(t._s(t.label))]):t._e(),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),e("input",{directives:[{name:"model",rawName:"v-model",value:t.currentValue,expression:"currentValue"}],attrs:{id:t.id,type:"number",name:t.name,placeholder:t.placeholder,min:t.min,max:t.max,step:t.step,readonly:t.disabled,disabled:t.is_constant_set},domProps:{value:t.currentValue},on:{change:t.inputUpdate,input:function(e){e.target.composing||(t.currentValue=e.target.value)}}}),t.has_error?e("p",{staticClass:"error"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(4186),width:"16"}}),e("span",{domProps:{innerHTML:t._s(t.has_error)}})],1):t._e(),t.description?e("p",{staticClass:"description"},[t._v(" "+t._s(t.description)+" ")]):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},Ge=[],Ye={name:"SettingsInputNumber",components:{SettingsInfoTooltip:Wt},props:{name:String,value:[Number,String],label:String,description:String,constant:String,placeholder:String,type:{type:String,default:"text"},tooltip:String,default_value:String,min:Number,max:Number,disabled:Boolean,step:{type:Number,default:1},round:{type:Boolean,default:!1},is_error:Boolean},data(){return{has_error:!1,id:"input-"+this.name,text_error_value:(0,l.gB)((0,l.__)("Please enter a value between %1$s and %2$s","wp-mail-smtp"),""+this.min+"",""+this.max+""),text_error_round:(0,l.__)("Value has to be a round number","wp-mail-smtp")}},computed:{currentValue:{get(){return this.value},set(t){this.$emit("is_error_update",!1),this.$emit("input",parseInt(t,10))}},field_error:{get(){return this.is_error},set(t){this.$emit("is_error_update",t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{inputUpdate:function(t){if(this.disabled)return!1;this.has_error=!1;const e=parseFloat(t.target.value);return this.round&&e%1!==0?(this.has_error=this.text_error_round,!1):e>this.max||e-1:t.currentValue},on:{change:[function(e){var s=t.currentValue,i=e.target,a=!!i.checked;if(Array.isArray(s)){var n=null,o=t._i(s,n);i.checked?o<0&&(t.currentValue=s.concat([n])):o>-1&&(t.currentValue=s.slice(0,o).concat(s.slice(o+1)))}else t.currentValue=a},t.inputUpdate]}}),e("span",{class:{"toggle-switch":!0,"toggle-switch-with-label":t.label}}),t.label?e("span",{staticClass:"label-description",domProps:{innerHTML:t._s(t.label)}}):t._e()])])])},Xe=[],je={name:"SettingsInputSwitch",components:{SettingsInfoTooltip:Wt},props:{name:String,value:Boolean,title:String,label:String,description:String,constant:String,tooltip:String,classname:String,disabled:Boolean},data(){return{has_error:!1,id:"input-"+this.name}},computed:{currentValue:{get(){return this.value},set(t){this.$emit("input",!!t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}},methods:{inputUpdate:function(){if(this.disabled)return!1}}},$e=je,ts=(0,d.Z)($e,qe,Xe,!1,null,null,null),es=ts.exports,ss={name:"WizardStepConfigureMailerSmtp",components:{SettingsInputText:Nt,SettingsInputRadio:Ue,SettingsInputNumber:Je,SettingsInputSwitch:es},data(){return{mailer:"smtp",text_host_label:(0,l.__)("SMTP Host","wp-mail-smtp"),text_encryption_label:(0,l.__)("Encryption","wp-mail-smtp"),text_port_label:(0,l.__)("SMTP Port","wp-mail-smtp"),text_autotls_title:(0,l.__)("Auto TLS","wp-mail-smtp"),text_autotls_label:(0,l.__)("Enable Auto TLS","wp-mail-smtp"),text_autotls_description:(0,l.__)("By default, TLS encryption is automatically used if the server supports it (recommended). In some cases, due to server misconfigurations, this can cause issues and may need to be disabled.","wp-mail-smtp"),text_auth_title:(0,l.__)("Authentication","wp-mail-smtp"),text_auth_label:(0,l.__)("Enable Authentication","wp-mail-smtp"),text_user_label:(0,l.__)("SMTP Username","wp-mail-smtp"),text_pass_label:(0,l.__)("SMTP Password","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_encryption_description:(0,l.__)("For most servers TLS is the recommended option. If your SMTP provider offers both SSL and TLS options, we recommend using TLS.","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),description:this.$wpms.mailer_options.smtp.description,encryptionOptions:[{label:(0,l.__)("None","wp-mail-smtp"),value:"none",default_port:25},{label:(0,l.__)("SSL","wp-mail-smtp"),value:"ssl",default_port:465},{label:(0,l.__)("TLS","wp-mail-smtp"),value:"tls",default_port:587}],show_autotls:!0,show_user_and_pass:!0,field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.smtp.host","settings.smtp.auth","settings.smtp.port","settings.smtp.encryption","settings.smtp.user","settings.smtp.pass","settings.smtp.autotls","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},watch:{encryption:function(t){this.show_autotls="tls"!==t}},methods:{getEncryptionDefaultPort(t){return this.encryptionOptions.find((e=>e.value===t)).default_port},encryptionChanged(t){this.port=this.getEncryptionDefaultPort(t)},areRequiredFieldsValid(){return""===this.host&&this.field_errors.push("host"),(""===this.port||isNaN(this.port))&&this.field_errors.push("port"),this.auth&&(""===this.user&&this.field_errors.push("user"),""===this.pass&&this.field_errors.push("pass")),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}},mounted(){"tls"===this.encryption&&(this.show_autotls=!1)}},is=ss,as=(0,d.Z)(is,Oe,We,!1,null,null,null),ns=as.exports,os=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sendlayer"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small wp-mail-smtp-button-secondary",attrs:{href:t.get_started_button_url,target:"_blank",rel:"noopener noreferrer"}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_get_started_button)),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"23"}})],1)]),e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SENDLAYER_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},rs=[],ls={name:"WizardStepConfigureMailerSendlayer",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"sendlayer",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for SendLayer.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_get_started_button:(0,l.__)("Get Started with SendLayer","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up SendLayer","wp-mail-smtp"),description:this.$wpms.mailer_options.sendlayer.description.substr(0,this.$wpms.mailer_options.sendlayer.description.lastIndexOf("

      ")),get_started_button_url:this.$getUTMUrl("https://sendlayer.com/wp-mail-smtp/",{source:"wpmailsmtpplugin",medium:"WordPress",content:"Setup Wizard - Mailer Button"}),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sendlayer-mailer-in-wp-mail-smtp/",{content:"Read how to set up SendLayer"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sendlayer.api_key","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},ms=ls,ps=(0,d.Z)(ms,os,rs,!1,null,null,null),cs=ps.exports,_s=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-smtpcom"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small wp-mail-smtp-button-secondary",attrs:{href:"https://wpmailsmtp.com/go/smtp/",target:"_blank",rel:"noopener noreferrer"}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_get_started_button)),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"23"}})],1)]),e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))]),e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.disclosure_tooltip_data,expression:"disclosure_tooltip_data"}],staticClass:"mailer-offer-link-disclosure"},[t._v(t._s(t.text_disclosure))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SMTPCOM_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"channel",constant:"WPMS_SMTPCOM_CHANNEL",label:t.text_channel_label,description:t.text_channel_description,is_error:t.field_errors.includes("channel")},on:{is_error_update:function(e){return t.removeFieldError("channel")}},model:{value:t.channel,callback:function(e){t.channel=e},expression:"channel"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},ds=[],us={name:"WizardStepConfigureMailerSmtpCom",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"smtpcom",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_channel_label:(0,l.__)("Sender Name","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for SMTP.com.","wp-mail-smtp"),'',""),text_channel_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Sender Name for SMTP.com.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_get_started_button:(0,l.__)("Get Started with SMTP.com","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up SMTP.com","wp-mail-smtp"),text_disclosure:(0,l.__)("Transparency and Disclosure","wp-mail-smtp"),disclosure_tooltip_data:{content:(0,l.__)("We believe in full transparency. The SMTP.com links above are tracking links as part of our partnership with SMTP (j2 Global). We can recommend just about any SMTP service, but we only recommend products that we believe will add value to our users.","wp-mail-smtp"),autoHide:!0,trigger:"hover"},description:this.$wpms.mailer_options.smtpcom.description.substr(0,this.$wpms.mailer_options.smtpcom.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-smtp-com-mailer-in-wp-mail-smtp",{content:"Read how to set up SMTP.com"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.smtpcom.api_key","settings.smtpcom.channel","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.channel&&this.field_errors.push("channel"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},hs=us,gs=(0,d.Z)(hs,_s,ds,!1,null,null,null),fs=gs.exports,ws=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sendinblue"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-small wp-mail-smtp-button-secondary",attrs:{href:"https://wpmailsmtp.com/go/sendinblue/",target:"_blank",rel:"noopener noreferrer"}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_get_started_button)),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"23"}})],1)]),e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))]),e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.disclosure_tooltip_data,expression:"disclosure_tooltip_data"}],staticClass:"mailer-offer-link-disclosure"},[t._v(t._s(t.text_disclosure))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SENDINBLUE_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"domain",constant:"WPMS_SENDINBLUE_DOMAIN",label:t.text_domain_label,description:t.text_domain_description},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},As=[],bs={name:"WizardStepConfigureMailerSendinblue",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"sendinblue",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_domain_label:(0,l.__)("Sending Domain","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for Sendinblue.","wp-mail-smtp"),'',""),text_domain_description:(0,l.gB)((0,l.__)("Please input the sending domain/subdomain you configured in your Sendinblue dashboard. More information can be found in our %1$sSendinblue documentation%2$s","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_get_started_button:(0,l.__)("Get Started with Sendinblue","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Sendinblue","wp-mail-smtp"),text_disclosure:(0,l.__)("Transparency and Disclosure","wp-mail-smtp"),disclosure_tooltip_data:{content:(0,l.__)("We believe in full transparency. The Sendinblue links above are tracking links as part of our partnership with Sendinblue. We can recommend just about any SMTP service, but we only recommend products that we believe will add value to our users.","wp-mail-smtp"),autoHide:!0,trigger:"hover"},description:this.$wpms.mailer_options.sendinblue.description.substr(0,this.$wpms.mailer_options.sendinblue.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sendinblue-mailer-in-wp-mail-smtp",{content:"Read how to set up Sendinblue"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sendinblue.api_key","settings.sendinblue.domain","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},vs=bs,xs=(0,d.Z)(vs,ws,As,!1,null,null,null),ks=xs.exports,ys=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-mailgun"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_MAILGUN_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"domain",constant:"WPMS_MAILGUN_DOMAIN",label:t.text_domain_label,description:t.text_domain_description,is_error:t.field_errors.includes("domain")},on:{is_error_update:function(e){return t.removeFieldError("domain")}},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-radio",{attrs:{name:"region",constant:"WPMS_MAILGUN_REGION",label:t.text_region_label,options:t.regionOptions,description:t.text_region_description},model:{value:t.region,callback:function(e){t.region=e},expression:"region"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Cs=[],Ss={name:"WizardStepConfigureMailerMailgun",components:{SettingsInputText:Nt,SettingsInputRadio:Ue,SettingsInputSwitch:es},data(){return{mailer:"mailgun",text_api_key_label:(0,l.__)("Private API Key","wp-mail-smtp"),text_domain_label:(0,l.__)("Domain Name","wp-mail-smtp"),text_region_label:(0,l.__)("Region","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Private API Key from Mailgun.","wp-mail-smtp"),'',""),text_domain_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Domain Name from Mailgun.","wp-mail-smtp"),'',""),text_region_description:(0,l.gB)((0,l.__)("Define which endpoint you want to use for sending messages. If you are operating under EU laws, you may be required to use EU region. %1$sMore information%2$s on Mailgun.com.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Mailgun","wp-mail-smtp"),description:this.$wpms.mailer_options.mailgun.description.substr(0,this.$wpms.mailer_options.mailgun.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-mailgun-mailer-in-wp-mail-smtp/",{content:"Read how to set up Mailgun"}),regionOptions:[{label:(0,l.__)("US","wp-mail-smtp"),value:"US"},{label:(0,l.__)("EU","wp-mail-smtp"),value:"EU"}],field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.mailgun.api_key","settings.mailgun.domain","settings.mailgun.region","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.domain&&this.field_errors.push("domain"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Ps=Ss,Ms=(0,d.Z)(Ps,ys,Cs,!1,null,null,null),Es=Ms.exports,Ts=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sendgrid"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SENDGRID_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-text",{attrs:{name:"domain",constant:"WPMS_SENDGRID_DOMAIN",label:t.text_domain_label,description:t.text_domain_description},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Fs=[],Is={name:"WizardStepConfigureMailerSendgrid",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"sendgrid",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_domain_label:(0,l.__)("Sending Domain","wp-mail-smtp"),text_api_key_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for Sendgrid.","wp-mail-smtp"),'',"")+"
      "+(0,l.gB)((0,l.__)("To send emails you will need only a %1$sMail Send%2$s access level for this API key.","wp-mail-smtp"),"",""),text_domain_description:(0,l.gB)((0,l.__)("Please input the sending domain/subdomain you configured in your SendGrid dashboard. More information can be found in our %1$sSendGrid documentation%2$s","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Sendgrid","wp-mail-smtp"),description:this.$wpms.mailer_options.sendgrid.description.substr(0,this.$wpms.mailer_options.sendgrid.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sendgrid-mailer-in-wp-mail-smtp/",{content:"Read how to set up Sendgrid"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sendgrid.api_key","settings.sendgrid.domain","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Bs=Is,Ds=(0,d.Z)(Bs,Ts,Fs,!1,null,null,null),zs=Ds.exports,Os=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-sparkpost"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"api_key",type:"password",constant:"WPMS_SPARKPOST_API_KEY",label:t.text_api_key_label,description:t.text_api_key_description,is_error:t.field_errors.includes("api_key")},on:{is_error_update:function(e){return t.removeFieldError("api_key")}},model:{value:t.api_key,callback:function(e){t.api_key=e},expression:"api_key"}}),e("settings-input-radio",{attrs:{name:"region",constant:"WPMS_SPARKPOST_REGION",label:t.text_region_label,options:t.regionOptions,description:t.text_region_description},model:{value:t.region,callback:function(e){t.region=e},expression:"region"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Ws=[],Ls={name:"WizardStepConfigureMailerSparkPost",components:{SettingsInputText:Nt,SettingsInputRadio:Ue,SettingsInputSwitch:es},data(){return{mailer:"sparkpost",text_api_key_label:(0,l.__)("API Key","wp-mail-smtp"),text_region_label:(0,l.__)("Region","wp-mail-smtp"),text_region_description:(0,l.gB)((0,l.__)("Select your SparkPost account region. %1$sMore information%2$s on SparkPost.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up SparkPost","wp-mail-smtp"),description:this.$wpms.mailer_options.sparkpost.description.substr(0,this.$wpms.mailer_options.sparkpost.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-sparkpost-mailer-in-wp-mail-smtp/",{content:"Read how to set up SparkPost"}),regionOptions:[{label:(0,l.__)("US","wp-mail-smtp"),value:"US"},{label:(0,l.__)("EU","wp-mail-smtp"),value:"EU"}],field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.sparkpost.api_key","settings.sparkpost.region","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"]),text_api_key_description:function(){let t="EU"===this.region?"eu.":"";return(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get an API Key for SparkPost.","wp-mail-smtp"),'',"")}},methods:{areRequiredFieldsValid(){return""===this.api_key&&this.field_errors.push("api_key"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Rs=Ls,Qs=(0,d.Z)(Rs,Os,Ws,!1,null,null,null),Ns=Qs.exports,Zs=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-postmark"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link wp-mail-smtp-link-docs",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"server_api_token",type:"password",constant:"WPMS_POSTMARK_SERVER_API_TOKEN",label:t.text_server_api_token_label,description:t.text_server_api_token_description,is_error:t.field_errors.includes("server_api_token")},on:{is_error_update:function(e){return t.removeFieldError("server_api_token")}},model:{value:t.server_api_token,callback:function(e){t.server_api_token=e},expression:"server_api_token"}}),e("settings-input-text",{attrs:{name:"message_stream",constant:"WPMS_POSTMARK_MESSAGE_STREAM",label:t.text_message_stream_label,description:t.text_message_stream_description},model:{value:t.message_stream,callback:function(e){t.message_stream=e},expression:"message_stream"}}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)])},Us=[],Hs={name:"WizardStepConfigureMailerPostmark",components:{SettingsInputText:Nt,SettingsInputSwitch:es},data(){return{mailer:"postmark",text_server_api_token_label:(0,l.__)("Server API Token","wp-mail-smtp"),text_message_stream_label:(0,l.__)("Message Stream ID","wp-mail-smtp"),text_server_api_token_description:(0,l.gB)((0,l.__)("%1$sFollow this link%2$s to get a Server API Token for Postmark.","wp-mail-smtp"),'',""),text_message_stream_description:(0,l.gB)((0,l.__)("Message Stream ID is optional. By default outbound (Default Transactional Stream) will be used. More information can be found in our %1$sPostmark documentation%2$s.","wp-mail-smtp"),'',""),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Postmark","wp-mail-smtp"),description:this.$wpms.mailer_options.postmark.description.substr(0,this.$wpms.mailer_options.postmark.description.lastIndexOf("

      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-postmark-mailer-in-wp-mail-smtp/",{content:"Read how to set up Postmark"}),field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.postmark.server_api_token","settings.postmark.message_stream","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"])},methods:{areRequiredFieldsValid(){return""===this.server_api_token&&this.field_errors.push("server_api_token"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}}},Gs=Hs,Ys=(0,d.Z)(Gs,Zs,Us,!1,null,null,null),Vs=Ys.exports,Ks=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-amazonses"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("b",[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])])]),t.is_ssl?e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_AMAZONSES_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",type:"password",constant:"WPMS_AMAZONSES_CLIENT_SECRET",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-select",{attrs:{name:"region",constant:"WPMS_AMAZONSES_REGION",label:t.text_region_label,options:t.regionOptions,description:t.text_region_description,is_error:t.field_errors.includes("region")},on:{is_error_update:function(e){return t.removeFieldError("region")}},model:{value:t.region,callback:function(e){t.region=e},expression:"region"}}),t.is_api_auth_missing?t._e():e("div",[e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-amazon-s-e-s-identities",{attrs:{options:t.identities,label:t.text_identities_label,columns:t.identities_columns}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)],1):e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("div",{staticClass:"wp-mail-smtp-notice wp-mail-smtp-notice--error"},[e("p",[e("span",[t._v(t._s(t.text_no_ssl))]),t._v(" "),e("a",{attrs:{href:"https://www.wpbeginner.com/wp-tutorials/how-to-add-ssl-and-https-in-wordpress/",target:"_blank",rel:"noopener"}},[t._v(t._s(t.text_no_ssl_link_text))]),t._v(".")]),e("p",[t._v(t._s(t.text_no_ssl_diff_mailer))])])])])},Js=[],qs=s(1296),Xs=s.n(qs),js=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-input-select",class:{"settings-input-select-error":t.field_error}},[e("label",{staticClass:"settings-input-label-container",attrs:{for:`wp-mail-smtp-settings-select-${t.name}`}},[e("span",{staticClass:"label"},[t._v(t._s(t.label))])]),e("div",{staticClass:"settings-input-select-container"},[e("select",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],attrs:{id:`wp-mail-smtp-settings-select-${t.name}`,name:t.name,readonly:t.disabled,disabled:t.is_constant_set},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.selected=e.target.multiple?s:s[0]}}},t._l(t.options,(function(s){return e("option",{key:s.value,domProps:{value:s.value}},[t._v(" "+t._s(s.label)+" ")])})),0)]),t.description?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.description)}}):t._e(),t.is_constant_set?e("p",{staticClass:"description description--constant",domProps:{innerHTML:t._s(t.text_constant)}}):t._e()])},$s=[],ti={name:"SettingsInputSelect",props:{options:Array,label:String,name:String,value:String,description:String,constant:String,disabled:Boolean,is_error:Boolean},computed:{selected:{get(){return this.value},set(t){this.$emit("is_error_update",!1),this.$emit("input",t)}},field_error:{get(){return this.is_error},set(t){this.$emit("is_error_update",t)}},is_constant_set:function(){return this.$wpms.defined_constants.includes(this.constant)},text_constant:function(){return(0,l.__)("This setting is already configured with the WP Mail SMTP constant. To change it, please edit or remove the "+this.constant+" constant in your wp-config.php file.","wp-mail-smtp")}}},ei=ti,si=(0,d.Z)(ei,js,$s,!1,null,null,null),ii=si.exports,ai=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-amazon-ses-identities"},[e("label",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),t.options?e("div",[t.options&&0!==t.options.length?e("p",{staticClass:"description"},[t._v(" "+t._s(t.text_identities_table_description)+" ")]):e("p",{staticClass:"description"},[e("strong",[t._v(t._s(t.text_no_registered_identities_title))]),t._v(" "+t._s(t.text_no_registered_identities_content)+" ")]),e("div",{staticClass:"ses-identities-container"},[t.options&&t.options.length>0?e("div",{staticClass:"ses-identities-table-container"},[e("table",[t.columns?e("tr",{staticClass:"ses-identity-columns"},t._l(t.filtered_columns,(function(s){return e("th",{key:s.key,class:`ses-identity-column ses-identity-column-${s.key}`},[t._v(" "+t._s(s.label)+" ")])})),0):t._e(),t._l(t.options,(function(s,i){return e("tr",{key:i},[e("td",[t._v(" "+t._s(s.value)+" ")]),e("td",[t._v(" "+t._s(s.type)+" ")]),e("td",[t._v(" "+t._s(s.status)+" ")])])})),t.show_identity_form?t._e():e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main wp-mail-smtp-button-small",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.addNewIdentity.apply(null,arguments)}}},[t._v(" "+t._s(t.text_add_new_identity)+" ")])],2)]):t._e(),t.show_identity_form||!t.options||0===t.options.length?e("div",{staticClass:"wp-mail-smtp-amazonses-identity-form"},[t.options&&0!==t.options.length?t._e():e("h3",[t._v(" "+t._s(t.text_verify_identity)+" ")]),e("div",{directives:[{name:"show",rawName:"v-show",value:1===t.verify_identity_step,expression:"verify_identity_step === 1"}],staticClass:"amazonses-identity-form-step"},[e("settings-input-radio",{attrs:{name:"identity_type",options:t.identity_type_options},model:{value:t.identity_type,callback:function(e){t.identity_type=e},expression:"identity_type"}}),e("p",{domProps:{textContent:t._s(t.verify_identity_text)}}),e("settings-input-text",{attrs:{name:"identity_value",placeholder:t.identity_value_placeholder},model:{value:t.identity_value,callback:function(e){t.identity_value=e},expression:"identity_value"}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main wp-mail-smtp-button-small wp-mail-smtp-button-verify",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.verifyIdentity.apply(null,arguments)}}},[t.loading_verify_identity?e("spin-loader",{attrs:{color:"white"}}):e("span",[t._v(t._s(t.text_verify))])],1)],1),e("div",{directives:[{name:"show",rawName:"v-show",value:2===t.verify_identity_step&&"domain"===t.verify_identity_result.type,expression:"verify_identity_step === 2 && verify_identity_result.type === 'domain'"}],staticClass:"amazonses-identity-form-step amazonses-identity-form-step-domain"},[e("p",{domProps:{innerHTML:t._s(t.text_verify_identity_step2_domain_text)}}),e("div",{staticClass:"amazonses-dns-records"},[e("div",{staticClass:"amazonses-dns-records__row amazonses-dns-records__row--heading"},[e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--heading"},[t._v(" "+t._s(t.text_name)+" ")]),e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--heading"},[t._v(" "+t._s(t.text_value)+" ")])]),t._l(t.verify_identity_result.domain_dkim_dns_records,(function(t,s){return e("div",{key:t.value,staticClass:"amazonses-dns-records__row amazonses-dns-records__row--record"},[e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--record"},[e("settings-input-text",{attrs:{name:`dns_record_name[${s}]`,value:t.name,readonly:"",copy:""}})],1),e("div",{staticClass:"amazonses-dns-records__col amazonses-dns-records__col--record"},[e("settings-input-text",{attrs:{name:`dns_record_value[${s}]`,value:t.value,readonly:"",copy:""}})],1)])}))],2)]),e("div",{directives:[{name:"show",rawName:"v-show",value:2===t.verify_identity_step&&"email"===t.verify_identity_result.type,expression:"verify_identity_step === 2 && verify_identity_result.type === 'email'"}],staticClass:"amazonses-identity-form-step"},[e("p",{staticClass:"ses-identities-email-success-notice"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(2411),width:"16",height:"16"}}),t._v(" "),e("span",{domProps:{innerHTML:t._s(t.text_verify_identity_step2_email_text)}})],1)])]):t._e()])]):e("spin-loader",{attrs:{size:"md"}})],1)},ni=[],oi={name:"SettingsAmazonSESIdentities",components:{SettingsInfoTooltip:Wt,SettingsInputRadio:Ue,SettingsInputText:Nt,SpinLoader:ve},props:{options:Array,columns:Array,label:String,tooltip:String},computed:{filtered_columns:function(){return this.columns.filter((t=>"action"!==t.key))},identity_value_placeholder:function(){return"domain"===this.identity_type?(0,l.__)("Please enter a domain","wp-mail-smtp"):(0,l.__)("Please enter a valid email address","wp-mail-smtp")},verify_identity_text:function(){return"domain"===this.identity_type?(0,l.__)("Enter the domain name to verify it on Amazon SES and generate the required DNS CNAME records.","wp-mail-smtp"):(0,l.__)("Enter a valid email address. A verification email will be sent to the email address you entered.","wp-mail-smtp")},text_verify_identity_step2_email_text:function(){return(0,l.gB)((0,l.__)("Please check the inbox of %s for a confirmation email.","wp-mail-smtp"),this.verify_identity_result.value)},text_verify:function(){return"domain"===this.identity_type?(0,l.__)("Verify Domain","wp-mail-smtp"):(0,l.__)("Verify Email","wp-mail-smtp")}},data(){return{text_no_registered_identities_title:(0,l.__)("No registered domains or emails.","wp-mail-smtp"),text_no_registered_identities_content:(0,l.__)("You will not be able to send emails until you verify at least one domain or email address for the selected Amazon SES Region.","wp-mail-smtp"),text_view_dns:(0,l.__)("View DNS","wp-mail-smtp"),text_resend:(0,l.__)("Resend","wp-mail-smtp"),text_identities_table_description:(0,l.__)("Here are the domains and email addresses that have been verified and can be used as the From Email.","wp-mail-smtp"),text_verify_identity:(0,l.__)("Verify SES Identity","wp-mail-smtp"),text_add_new_identity:(0,l.__)("Add New SES Identity","wp-mail-smtp"),text_name:(0,l.__)("Name","wp-mail-smtp"),text_value:(0,l.__)("Value","wp-mail-smtp"),text_verify_identity_step2_domain_text:(0,l.gB)((0,l.__)("Please add these CNAME records to your domain's DNS settings. For information on how to add CNAME DNS records, please refer to the %1$sAmazon SES documentation%2$s.","wp-mail-smtp"),'',""),show_identity_form:!1,identity_type:"domain",identity_type_options:[{label:(0,l.__)("Verify Domain","wp-mail-smtp"),value:"domain"},{label:(0,l.__)("Verify Email Address","wp-mail-smtp"),value:"email"}],identity_value:"",verify_identity_step:1,verify_identity_result:{},loading_verify_identity:!1}},methods:{verifyIdentity:function(){if(this.loading_verify_identity)return;this.loading_verify_identity=!0;const t=this;this.$store.dispatch("$_settings/amazonSESRegisterIdentity",{value:this.identity_value,type:this.identity_type}).then((function(e){t.loading_verify_identity=!1,e.success&&e.data&&(t.verify_identity_result=e.data,t.verify_identity_step=2)}))},addNewIdentity:function(){this.show_identity_form=!0}}},ri=oi,li=(0,d.Z)(ri,ai,ni,!1,null,null,null),mi=li.exports,pi={name:"WizardStepConfigureMailerAmazonSES",components:{SettingsInputText:Nt,SettingsInputSelect:ii,SettingsInputSwitch:es,SettingsAmazonSESIdentities:mi},data(){return{mailer:"amazonses",text_client_id_label:(0,l.__)("Access Key ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Secret Access Key",{NODE_ENV:"production",VUE_APP_TEXTDOMAIN:"wp-mail-smtp",VUE_APP_PRODUCT_NAME:"WPMailSMTP",BASE_URL:""}.VUE_APP_TEXTclient_id),text_region_label:(0,l.__)("Region","wp-mail-smtp"),text_identities_label:(0,l.__)("SES Identities","wp-mail-smtp"),text_region_description:(0,l.__)("Please select the Amazon SES API region which is the closest to where your website is hosted. This can help to decrease network latency between your site and Amazon SES, which will speed up email sending.","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Amazon SES","wp-mail-smtp"),text_no_ssl:(0,l.__)("Amazon SES requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out ","wp-mail-smtp"),text_no_ssl_link_text:(0,l.__)("WPBeginner's tutorial on how to set up SSL","wp-mail-smtp"),text_no_ssl_diff_mailer:(0,l.__)("If you'd prefer not to set up SSL, or need an SMTP solution in the meantime, please go back and select a different mailer option.","wp-mail-smtp"),description:this.$wpms.mailer_options.amazonses.description.substr(0,this.$wpms.mailer_options.amazonses.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-amazon-ses-mailer-in-wp-mail-smtp/",{content:"Read how to set up Amazon SES"}),regionOptions:this.$wpms.mailer_options.amazonses.region_options||[],fetching_identities:!1,is_ssl:this.$wpms.is_ssl,field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.amazonses.client_id","settings.amazonses.client_secret","settings.amazonses.region","settings.mail.from_email","settings.mail.from_name","settings.mail.from_email_force","settings.mail.from_name_force"]),...(0,ct.vn)("$_settings",{identities_columns:"amazonses_identities.columns",identities:"amazonses_identities.data"}),...(0,ct.vn)("$_wizard",["blocked_step"]),is_api_auth_missing:function(){return!this.client_id||!this.client_secret||!this.region}},watch:{client_id:function(){this.getIdentitiesDelayed()},client_secret:function(){this.getIdentitiesDelayed()},region:function(){this.getIdentities()}},methods:{getIdentities:function(){this.fetching_identities||this.client_id.length<20||this.client_secret.length<40||!this.region||(this.fetching_identities=!0,this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/getAmazonSESIdentities").then((()=>{this.fetching_identities=!1})).finally((()=>{this.$store.dispatch("$_app/stop_loading")})))},getIdentitiesDelayed:Xs()((function(){this.getIdentities()}),500),areRequiredFieldsValid(){return""===this.client_id&&this.field_errors.push("client_id"),""===this.client_secret&&this.field_errors.push("client_secret"),""===this.region&&this.field_errors.push("region"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}},mounted(){this.getIdentities(),this.$wpms.is_ssl||(this.blocked_step=!0)}},ci=pi,_i=(0,d.Z)(ci,Ks,Js,!1,null,"06bea086",null),di=_i.exports,ui=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-gmail"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("b",[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_GMAIL_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",type:"password",constant:"WPMS_GMAIL_CLIENT_SECRET",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-text",{attrs:{value:t.redirect_uri,name:"redirect_uri",label:t.text_redirect_uri_label,copy:"",readonly:""}}),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-o-auth-connection",{attrs:{label:t.text_authorization_label,mailer:t.mailer,connected_email:t.connected_email_address,is_auth_required:t.is_auth_required,client_id:t.client_id,client_secret:t.client_secret}}),t.is_auth_required?t._e():e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-general-settings"},[e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}}),e("settings-input-select",{attrs:{name:"from_email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,options:t.possible_send_as_emails,description:t.text_from_email_description},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}})],1)],1)])},hi=[],gi=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-oauth-connection"},[e("label",{staticClass:"settings-input-label-container"},[e("span",{staticClass:"label"},[t._v(t._s(t.label))]),t.tooltip?e("settings-info-tooltip",{attrs:{content:t.tooltip}}):t._e()],1),t.is_auth_required?e("div",{staticClass:"add-authorization-container"},[e("p",{staticClass:"description",domProps:{textContent:t._s(t.text_authorization_button_description)}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main wp-mail-smtp-button-small",attrs:{type:"button",disabled:!t.are_client_details_ready},on:{click:function(e){return e.preventDefault(),t.authorize.apply(null,arguments)}}},[t._v(" "+t._s(t.text_authorization_button)+" ")])]):e("div",{staticClass:"remove-authorization-container"},[t.connected_email?e("p",{staticClass:"description connected-as"},[e("span",{domProps:{innerHTML:t._s(t.text_connected_as_with_email)}}),t._v(" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(2546),width:"16",height:"16"}})],1):t._e(),"gmail"===t.mailer?e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.text_remove_authorization_button_description_google)}}):t._e(),e("p",{staticClass:"description",domProps:{innerHTML:t._s(t.text_remove_authorization_button_description)}}),e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-red wp-mail-smtp-button-small",attrs:{type:"button"},on:{click:function(e){return e.preventDefault(),t.removeAuthorization.apply(null,arguments)}}},[t._v(" "+t._s(t.text_remove_authorization_button)+" ")])])])},fi=[],wi={name:"SettingsOAuthConnection",components:{SettingsInfoTooltip:Wt},props:{label:String,mailer:String,connected_email:String,is_auth_required:Boolean,client_id:String,client_secret:String,tooltip:String,disabled:Boolean},data(){return{text_allow_button:(0,l.__)("Connect to %s","wp-mail-smtp"),text_authorization_button_description_general:(0,l.__)("Before continuing, you'll need to allow this plugin to send emails using your %s account.","wp-mail-smtp"),text_remove_authorization_button:(0,l.__)("Remove OAuth Connection","wp-mail-smtp"),text_remove_authorization_button_description_google:(0,l.gB)((0,l.__)("If you want to use a different From Email address you can setup a Google email alias. %1$sFollow these instructions%2$s, then select the alias in the From Email section below.","wp-mail-smtp"),'',""),text_remove_authorization_button_desc_template:(0,l.__)("Removing this OAuth connection will give you the ability to redo the OAuth connection or connect to different %s account.","wp-mail-smtp"),text_connected_as:(0,l.__)("Connected as","wp-mail-smtp")}},computed:{are_client_details_ready:function(){return!!this.client_id&&!!this.client_secret},mailer_name:function(){let t="Google";return"outlook"===this.mailer?t="Microsoft Outlook":"zoho"===this.mailer&&(t="Zoho Mail"),t},text_authorization_button:function(){return(0,l.gB)(this.text_allow_button,this.mailer_name)},text_authorization_button_description:function(){return(0,l.gB)(this.text_authorization_button_description_general,this.mailer_name)},text_remove_authorization_button_description:function(){return(0,l.gB)(this.text_remove_authorization_button_desc_template,this.mailer_name)},text_connected_as_with_email:function(){return`${this.text_connected_as} ${this.connected_email}`}},methods:{authorize:function(){this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/getAuthUrl",this.mailer).then((function(t){t.success&&t.data.oauth_url&&(window.location.href=t.data.oauth_url)})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},removeAuthorization:function(){this.$store.dispatch("$_app/start_loading"),this.$store.dispatch("$_settings/removeAuth",this.mailer).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},removeUrlParam:function(t,e,s){e.delete(s),t.search=e.toString(),window.history.replaceState({},document.title,t.toString())},catchAuthNotice:function(){const t=new URL(window.location.href),e=new URLSearchParams(t.search);let s="",i="",a=!1;switch(e.has("success")?(s=e.get("success"),a=!0,this.removeUrlParam(t,e,"success")):e.has("error")&&(s=e.get("error"),this.removeUrlParam(t,e,"error")),s){case"oauth_invalid_state":i=(0,l.__)("There was an error while processing the authentication request. The state key is invalid. Please try again.","wp-mail-smtp");break;case"google_no_code_scope":case"google_access_denied":case"zoho_access_denied":i=(0,l.__)("There was an error while processing the authentication request. Please try again.","wp-mail-smtp");break;case"google_no_clients":case"zoho_no_clients":case"microsoft_unsuccessful_oauth":case"google_unsuccessful_oauth":i=(0,l.__)("There was an error while processing the authentication request. Please recheck your Client ID and Client Secret and try again.","wp-mail-smtp");break;case"google_invalid_nonce":case"microsoft_invalid_nonce":case"zoho_invalid_nonce":i=(0,l.__)("There was an error while processing the authentication request. The nonce is invalid. Please try again.","wp-mail-smtp");break;case"microsoft_no_code":case"zoho_no_code":i=(0,l.__)("There was an error while processing the authentication request. The authorization code is missing. Please try again.","wp-mail-smtp");break;case"zoho_unsuccessful_oauth":i=(0,l.__)("There was an error while processing the authentication request. Please recheck your Region, Client ID and Client Secret and try again.","wp-mail-smtp");break;case"google_site_linked":i=(0,l.__)("You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail.","wp-mail-smtp");break;case"microsoft_site_linked":i=(0,l.__)("You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook.","wp-mail-smtp");break;case"zoho_site_linked":i=(0,l.__)("You have successfully linked the current site with your Zoho Mail API project. Now you can start sending emails through Zoho Mail.","wp-mail-smtp");break}i.length>0&&this.$swal({title:a?(0,l.__)("Successful Authorization","wp-mail-smtp"):(0,l.__)("Authorization Error!","wp-mail-smtp"),text:i,width:550,showCloseButton:!0,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"}})}},mounted(){this.catchAuthNotice()}},Ai=wi,bi=(0,d.Z)(Ai,gi,fi,!1,null,null,null),vi=bi.exports,xi={name:"WizardStepConfigureMailerGmail",components:{SettingsInputText:Nt,SettingsInputSwitch:es,SettingsOAuthConnection:vi,SettingsInputSelect:ii},data(){return{mailer:"gmail",text_client_id_label:(0,l.__)("Client ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Client Secret","wp-mail-smtp"),text_redirect_uri_label:(0,l.__)("Authorized Redirect URI","wp-mail-smtp"),text_authorization_label:(0,l.__)("Authorization","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_from_email_description:(0,l.__)("Select which email address you would like to send your emails from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up the Gmail mailer","wp-mail-smtp"),description:this.$wpms.mailer_options.gmail.description.substr(0,this.$wpms.mailer_options.gmail.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-gmail-mailer-in-wp-mail-smtp/#create-app",{content:"Read how to set up the Gmail mailer"}),redirect_uri:this.$wpms.mailer_options.gmail.redirect_uri,connected_email_address:null,possible_send_as_emails:[],field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.gmail.client_id","settings.gmail.client_secret","settings.gmail.access_token","settings.gmail.refresh_token","settings.mail.from_email","settings.mail.from_name","settings.mail.from_name_force"]),...(0,ct.vn)("$_wizard",["blocked_step"]),is_auth_required:function(){return!this.access_token||!this.refresh_token}},watch:{is_auth_required:function(t){this.blocked_step=t}},methods:{getConnectedData:function(){const t=this;this.$store.dispatch("$_settings/getConnectedData",this.mailer).then((function(e){e.success&&e.data&&(t.connected_email_address=e.data.connected_email||null,t.possible_send_as_emails=e.data.possible_send_from_addresses||[],t.isEmailInPosibleAddresses(t.from_email)||(t.from_email=t.connected_email_address))}))},isEmailInPosibleAddresses(t){return this.possible_send_as_emails.find((e=>e.value===t))},areRequiredFieldsValid(){let t=!0;return""===this.client_id&&(t=!1,this.field_errors.push("client_id")),""===this.client_secret&&(t=!1,this.field_errors.push("client_secret")),t},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))}},mounted(){this.getConnectedData(),this.is_auth_required&&(this.blocked_step=!0)}},ki=xi,yi=(0,d.Z)(ki,ui,hi,!1,null,null,null),Ci=yi.exports,Si=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-outlook"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),t.is_ssl?e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_OUTLOOK_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",type:"password",constant:"WPMS_OUTLOOK_CLIENT_SECRET",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-text",{attrs:{value:t.redirect_uri,name:"redirect_uri",label:t.text_redirect_uri_label,copy:"",readonly:""}}),e("settings-o-auth-connection",{attrs:{label:t.text_authorization_label,mailer:t.mailer,connected_email:t.connected_email_address,is_auth_required:t.is_auth_required,client_id:t.client_id,client_secret:t.client_secret}}),t.is_auth_required?t._e():e("div",{staticClass:"wp-mail-smtp-setup-wizard-form-general-settings"},[e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-big-margin"}),e("settings-input-text",{attrs:{name:"from_email",type:"email",constant:"WPMS_MAIL_FROM",label:t.text_from_email_label,description:t.text_from_email_description,is_error:t.field_errors.includes("from_email")},on:{is_error_update:function(e){return t.removeFieldError("from_email")},error_detected:e=>t.errorDetected(e,"from_email")},model:{value:t.from_email,callback:function(e){t.from_email=e},expression:"from_email"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_email_force",constant:"WPMS_MAIL_FROM_FORCE",title:t.text_force_from_email_title,label:t.text_force_from_email_label},model:{value:t.from_email_force,callback:function(e){t.from_email_force=e},expression:"from_email_force"}})],1)],1):e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("div",{staticClass:"wp-mail-smtp-notice wp-mail-smtp-notice--error"},[e("p",[e("span",[t._v(t._s(t.text_no_ssl))]),t._v(" "),e("a",{attrs:{href:"https://www.wpbeginner.com/wp-tutorials/how-to-add-ssl-and-https-in-wordpress/",target:"_blank",rel:"noopener"}},[t._v(t._s(t.text_no_ssl_link_text))]),t._v(".")]),e("p",[t._v(t._s(t.text_no_ssl_diff_mailer))])])])])},Pi=[],Mi={name:"WizardStepConfigureMailerOutlook",components:{SettingsInputText:Nt,SettingsInputSwitch:es,SettingsOAuthConnection:vi},data(){return{mailer:"outlook",text_client_id_label:(0,l.__)("Application ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Application Password","wp-mail-smtp"),text_redirect_uri_label:(0,l.__)("Redirect URI","wp-mail-smtp"),text_authorization_label:(0,l.__)("Authorization","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Microsoft Outlook / 365","wp-mail-smtp"),text_no_ssl:(0,l.__)("Outlook / 365 requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out ","wp-mail-smtp"),text_no_ssl_link_text:(0,l.__)("WPBeginner's tutorial on how to set up SSL","wp-mail-smtp"),text_no_ssl_diff_mailer:(0,l.__)("If you'd prefer not to set up SSL, or need an SMTP solution in the meantime, please go back and select a different mailer option.","wp-mail-smtp"),text_from_email_label:(0,l.__)("From Email","wp-mail-smtp"),text_from_email_description:(0,l.__)("The email address that emails are sent from.","wp-mail-smtp"),text_force_from_email_title:(0,l.__)("Force From Email","wp-mail-smtp"),text_force_from_email_label:(0,l.__)("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),description:this.$wpms.mailer_options.outlook.description.substr(0,this.$wpms.mailer_options.outlook.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-outlook-mailer-in-wp-mail-smtp/#microsoft-setup",{content:"Read how to set up Microsoft Outlook / 365"}),redirect_uri:this.$wpms.mailer_options.outlook.redirect_uri,field_errors:[],is_ssl:this.$wpms.is_ssl}},computed:{...(0,ct.vn)("$_settings",["settings.outlook.client_id","settings.outlook.client_secret","settings.outlook.access_token","settings.outlook.refresh_token","settings.mail.from_email","settings.mail.from_email_force"]),...(0,ct.vn)("$_wizard",["blocked_step"]),...(0,at.Se)({connected_email_address:"$_settings/outlook_email"}),is_auth_required:function(){return!this.access_token||!this.refresh_token}},watch:{is_auth_required:function(t){this.blocked_step=t}},methods:{areRequiredFieldsValid(){return""===this.client_id&&this.field_errors.push("client_id"),""===this.client_secret&&this.field_errors.push("client_secret"),""===this.from_email&&this.field_errors.push("from_email"),0===this.field_errors.length},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))},errorDetected(t,e){this.field_errors.push(e)}},mounted(){this.is_auth_required&&(this.blocked_step=!0),this.$wpms.is_ssl||(this.blocked_step=!0)}},Ei=Mi,Ti=(0,d.Z)(Ei,Si,Pi,!1,null,"1230186a",null),Fi=Ti.exports,Ii=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-configure-mailer-settings wp-mail-smtp-setup-wizard-step-configure-mailer-settings-zoho"},[e("p",{staticClass:"mailer-description",domProps:{innerHTML:t._s(t.description)}}),e("p",{staticClass:"mailer-description mailer-description-links"},[e("a",{staticClass:"wp-mail-smtp-link",attrs:{href:t.documentation_link_url,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.text_documentation_link))])]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-form"},[e("settings-input-select",{attrs:{name:"domain",constant:"WPMS_ZOHO_DOMAIN",label:t.text_domain_label,options:t.domain_options,description:t.text_domain_description,is_error:t.field_errors.includes("domain")},on:{is_error_update:function(e){return t.removeFieldError("domain")}},model:{value:t.domain,callback:function(e){t.domain=e},expression:"domain"}}),e("settings-input-text",{attrs:{name:"client_id",constant:"WPMS_ZOHO_CLIENT_ID",label:t.text_client_id_label,is_error:t.field_errors.includes("client_id")},on:{is_error_update:function(e){return t.removeFieldError("client_id")}},model:{value:t.client_id,callback:function(e){t.client_id=e},expression:"client_id"}}),e("settings-input-text",{attrs:{name:"client_secret",constant:"WPMS_ZOHO_CLIENT_SECRET",type:"password",label:t.text_client_secret_label,is_error:t.field_errors.includes("client_secret")},on:{is_error_update:function(e){return t.removeFieldError("client_secret")}},model:{value:t.client_secret,callback:function(e){t.client_secret=e},expression:"client_secret"}}),e("settings-input-text",{attrs:{value:t.redirect_uri,name:"redirect_uri",label:t.text_redirect_uri_label,copy:"",readonly:""}}),e("settings-o-auth-connection",{attrs:{label:t.text_authorization_label,mailer:t.mailer,connected_email:t.connected_email_address,is_auth_required:t.is_auth_required,client_id:t.client_id,client_secret:t.client_secret}}),t.is_auth_required?t._e():e("div",[e("settings-input-text",{attrs:{name:"from_name",constant:"WPMS_MAIL_FROM_NAME",label:t.text_from_name_label,description:t.text_from_name_description},model:{value:t.from_name,callback:function(e){t.from_name=e},expression:"from_name"}}),e("settings-input-switch",{attrs:{classname:"sub_setting",name:"from_name_force",constant:"WPMS_MAIL_FROM_NAME_FORCE",title:t.text_force_from_name_title,label:t.text_force_from_name_label},model:{value:t.from_name_force,callback:function(e){t.from_name_force=e},expression:"from_name_force"}})],1)],1)])},Bi=[],Di={name:"WizardStepConfigureMailerZoho",components:{SettingsInputText:Nt,SettingsInputSwitch:es,SettingsInputSelect:ii,SettingsOAuthConnection:vi},data(){return{mailer:"zoho",text_domain_label:(0,l.__)("Region","wp-mail-smtp"),text_domain_description:(0,l.__)("The data center location used by your Zoho account.","wp-mail-smtp"),text_client_id_label:(0,l.__)("Client ID","wp-mail-smtp"),text_client_secret_label:(0,l.__)("Client Secret","wp-mail-smtp"),text_redirect_uri_label:(0,l.__)("Redirect URI","wp-mail-smtp"),text_authorization_label:(0,l.__)("Authorization","wp-mail-smtp"),text_from_name_label:(0,l.__)("From Name","wp-mail-smtp"),text_force_from_name_title:(0,l.__)("Force From Name","wp-mail-smtp"),text_force_from_name_label:(0,l.__)("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.","wp-mail-smtp"),text_from_name_description:(0,l.__)("The name that emails are sent from.","wp-mail-smtp"),text_documentation_link:(0,l.__)("Read how to set up Zoho Mail","wp-mail-smtp"),description:this.$wpms.mailer_options.zoho.description.substr(0,this.$wpms.mailer_options.zoho.description.indexOf("
      ")),documentation_link_url:this.$getUTMUrl("https://wpmailsmtp.com/docs/how-to-set-up-the-zoho-mailer-in-wp-mail-smtp/#zoho-account",{content:"Read how to set up Zoho Mail"}),redirect_uri:this.$wpms.mailer_options.zoho.redirect_uri,domain_options:this.$wpms.mailer_options.zoho.domain_options,field_errors:[]}},computed:{...(0,ct.vn)("$_settings",["settings.zoho.domain","settings.zoho.client_id","settings.zoho.client_secret","settings.zoho.access_token","settings.zoho.refresh_token","settings.mail.from_name","settings.mail.from_name_force"]),...(0,ct.vn)("$_wizard",["blocked_step"]),...(0,at.Se)({connected_email_address:"$_settings/zoho_email"}),is_auth_required:function(){return!this.access_token||!this.refresh_token}},watch:{is_auth_required:function(t){this.blocked_step=t}},methods:{areRequiredFieldsValid(){let t=!0;return""===this.domain&&(t=!1,this.field_errors.push("domain")),""===this.client_id&&(t=!1,this.field_errors.push("client_id")),""===this.client_secret&&(t=!1,this.field_errors.push("client_secret")),t},removeFieldError(t){this.field_errors=this.field_errors.filter((e=>e!==t))}},mounted(){this.is_auth_required&&(this.blocked_step=!0)}},zi=Di,Oi=(0,d.Z)(zi,Ii,Bi,!1,null,null,null),Wi=Oi.exports,Li=function(){var t=this,e=t._self._c;return e("div",{staticClass:"wp-mail-smtp-setup-wizard-step wp-mail-smtp-setup-wizard-step-configure-email-logs"},[e("div",{staticClass:"wp-mail-smtp-setup-wizard-content-container"},[e("div",{staticClass:"wp-mail-smtp-configure-email-logs-header"},[e("the-wizard-step-counter"),e("content-header",{attrs:{title:t.text_header_title,subtitle:t.text_header_subtitle}})],1),e("div",{staticClass:"wp-mail-smtp-plugin-configure-email-logs"},[e("settings-input-long-checkbox",{attrs:{name:"log_email_content",label:t.text_log_email_content,description:t.text_log_email_content_desc},model:{value:t.log_email_content,callback:function(e){t.log_email_content=e},expression:"log_email_content"}}),e("settings-input-long-checkbox",{attrs:{name:"save_attachments",label:t.text_save_attachments,description:t.text_save_attachments_desc},model:{value:t.save_attachments,callback:function(e){t.save_attachments=e},expression:"save_attachments"}}),e("settings-input-long-checkbox",{attrs:{name:"open_email_tracking",label:t.text_open_email_tracking,description:t.text_open_email_tracking_desc},model:{value:t.open_email_tracking,callback:function(e){t.open_email_tracking=e},expression:"open_email_tracking"}}),e("settings-input-long-checkbox",{attrs:{name:"click_link_tracking",label:t.text_click_link_tracking,description:t.text_click_link_tracking_desc},model:{value:t.click_link_tracking,callback:function(e){t.click_link_tracking=e},expression:"click_link_tracking"}})],1)]),e("div",{staticClass:"wp-mail-smtp-separator wp-mail-smtp-separator-no-margin"}),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer"},[e("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.previousStep.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-left"},[e("inline-svg",{staticClass:"icon",attrs:{src:s(9238),width:"16",height:"18"}}),t._v(t._s(t.text_previous_step)+" ")],1)]),e("div",{staticClass:"wp-mail-smtp-setup-wizard-step-footer-buttons"},[e("button",{staticClass:"wp-mail-smtp-button wp-mail-smtp-button-main",attrs:{type:"submit",name:"next_step"},on:{click:function(e){return e.preventDefault(),t.handleSubmit.apply(null,arguments)}}},[e("span",{staticClass:"text-with-arrow text-with-arrow-right"},[t._v(" "+t._s(t.text_save)+" "),e("inline-svg",{staticClass:"icon",attrs:{src:s(7706),width:"16",height:"19"}})],1)])])])])},Ri=[],Qi={name:"WizardStepConfigureEmailLogs",components:{ContentHeader:h,TheWizardStepCounter:X,SettingsInputLongCheckbox:kt},data(){return{text_header_title:(0,l.__)("Configure Email Logs","wp-mail-smtp"),text_header_subtitle:(0,l.__)("Enable these powerful logging features for more control of your WordPress emails.","wp-mail-smtp"),text_save:(0,l.__)("Save and Continue","wp-mail-smtp"),text_previous_step:(0,l.__)("Previous Step","wp-mail-smtp"),text_log_email_content:(0,l.__)("Store the content for all sent emails","wp-mail-smtp"),text_log_email_content_desc:(0,l.__)("This option must be enabled if you'd like to be able to resend emails. Please be aware that all email content will be stored in your WordPress database. This may include sensitive data, passwords, and personal details.","wp-mail-smtp"),text_save_attachments:(0,l.__)("Save file attachments sent from WordPress","wp-mail-smtp"),text_save_attachments_desc:(0,l.__)("All file attachments sent from your site will be saved to the WordPress Uploads folder. Please note that this may reduce available disk space on your server.","wp-mail-smtp"),text_open_email_tracking:(0,l.__)("Track when an email is opened","wp-mail-smtp"),text_open_email_tracking_desc:(0,l.__)("See which emails were opened by the recipients. Email open tracking works with emails that are sent in HTML format.","wp-mail-smtp"),text_click_link_tracking:(0,l.__)("Track when a link in an email is clicked","wp-mail-smtp"),text_click_link_tracking_desc:(0,l.__)("See which links were clicked in emails sent from your WordPress site. Click tracking works with emails that are sent in HTML format.","wp-mail-smtp")}},computed:{...(0,ct.vn)("$_settings",["settings.logs.log_email_content","settings.logs.save_attachments","settings.logs.open_email_tracking","settings.logs.click_link_tracking"])},methods:{handleSubmit(){this.$store.dispatch("$_app/start_loading");let t={value:{logs:{log_email_content:this.log_email_content,save_attachments:this.save_attachments,open_email_tracking:this.open_email_tracking,click_link_tracking:this.click_link_tracking}}};this.$store.dispatch("$_settings/updateSettings",t).then((t=>{t.success?this.nextStep():this.$wpms_error_toast({})})).finally((()=>{this.$store.dispatch("$_app/stop_loading")}))},previousStep(){this.$previous_step()},nextStep(){this.$next_step()}}},Ni=Qi,Zi=(0,d.Z)(Ni,Li,Ri,!1,null,null,null),Ui=Zi.exports,Hi=new n.ZP({routes:[{path:"*",redirect:"/"},{path:"/",name:"welcome",component:C},{path:"/step",name:"step",component:W,children:[{path:"import",name:"import_step",component:et},{path:"choose_mailer",name:"choose_mailer_step",component:lt},{path:"configure_mailer",name:"configure_mailer_step",component:ht,children:[{path:"smtp",name:"configure_mailer_step_smtp",component:ns},{path:"sendlayer",name:"configure_mailer_step_sendlayer",component:cs},{path:"smtpcom",name:"configure_mailer_step_smtpcom",component:fs},{path:"sendinblue",name:"configure_mailer_step_sendinblue",component:ks},{path:"mailgun",name:"configure_mailer_step_mailgun",component:Es},{path:"sendgrid",name:"configure_mailer_step_sendgrid",component:zs},{path:"sparkpost",name:"configure_mailer_step_sparkpost",component:Ns},{path:"postmark",name:"configure_mailer_step_postmark",component:Vs},{path:"amazoneses",name:"configure_mailer_step_amazonses",component:di},{path:"gmail",name:"configure_mailer_step_gmail",component:Ci},{path:"outlook",name:"configure_mailer_step_outlook",component:Fi},{path:"zoho",name:"configure_mailer_step_zoho",component:Wi}]},{path:"plugin_features",name:"plugin_features_step",component:Pt},{path:"configure_email_logs",name:"configure_email_logs_step",component:Ui},{path:"help_improve",name:"help_improve_step",component:Xt},{path:"license",name:"license_step",component:ne},{path:"check_configuration",name:"check_configuration_step",component:ce},{path:"successful_configuration",name:"check_configuration_step_success",component:Ee},{path:"failed_configuration",name:"check_configuration_step_failure",component:ze}]}],scrollBehavior(){return{x:0,y:0}}}),Gi={name:"SetupWizardApp",router:Hi,computed:{...(0,at.Se)({blocked:"$_app/blocked",loading:"$_app/loading"})}},Yi=Gi,Vi=(0,d.Z)(Yi,i,a,!1,null,null,null),Ki=Vi.exports,Ji=s(144),qi=s(9516);const Xi={install(t){window.wp_mail_smtp_vue&&(t.prototype.$wpms=window.wp_mail_smtp_vue),t.prototype.$isPro=ji,t.prototype.$addQueryArg=$i,t.prototype.$getUTMUrl=ta}};function ji(){return window.wp_mail_smtp_vue.is_pro}function $i(t,e,s){var i=new RegExp("([?&])"+e+"=.*?(&|#|$)","i");if(t.match(i))return t.replace(i,"$1"+e+"="+s+"$2");var a="";-1!==t.indexOf("#")&&(a=t.replace(/.*#/,"#"),t=t.replace(/#.*/,""));var n=-1!==t.indexOf("?")?"&":"?";return t+n+e+"="+s+a}function ta(t,e){e={source:"WordPress",medium:"setup-wizard",campaign:ji()?"plugin":"liteplugin",content:"general",...e};for(const[s,i]of Object.entries(e))t=$i(t,`utm_${s}`,encodeURIComponent(i));return t}var ea=Xi;const sa={install(t){t.prototype.$next_step=function(e=0){const s=t.prototype.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))+1+e;this.$router.push({name:t.prototype.$wizard_steps[s]})},t.prototype.$previous_step=function(e=0){let s="welcome";const i=t.prototype.$wizard_steps.findIndex((t=>this.$route.name.includes(t)))-1-e;i>=0&&(s=t.prototype.$wizard_steps[i]),this.$router.push({name:s})},t.prototype.$swal&&(t.prototype.$wpms_success_toast=function(e){let{animation:s=!1,toast:i=!0,position:a="top-end",showConfirmButton:n=!1,icon:o="success",timer:r=3e3,showCloseButton:m=!0,title:p=(0,l.__)("Settings Updated","wp-mail-smtp"),showCancelButton:c=!1,confirmButtonText:_="",cancelButtonText:d="",text:u=""}=e;return t.prototype.$swal({animation:s,toast:i,position:a,showConfirmButton:n,icon:o,showCloseButton:m,title:p,timer:r,showCancelButton:c,confirmButtonText:_,cancelButtonText:d,text:u})},t.prototype.$wpms_error_toast=function(e){let{animation:s=!1,toast:i=!0,position:a="top-end",showConfirmButton:n=!1,icon:o="error",showCloseButton:r=!0,title:m=(0,l.__)("Could Not Save Changes","wp-mail-smtp"),text:p=""}=e;return t.prototype.$swal({animation:s,toast:i,position:a,showConfirmButton:n,icon:o,showCloseButton:r,title:m,text:p,onOpen:function(){t.prototype.$swal.hideLoading()}})},t.prototype.$wpms_error_modal=function(e){let{position:s="center",width:i=650,showConfirmButton:a=!0,confirmButtonText:n=(0,l.__)("Return to Mailer Settings","wp-mail-smtp"),customClass:o={container:"wp-mail-smtp-swal wp-mail-smtp-swal-error"},showCloseButton:r=!0,title:m=(0,l.__)("Whoops, we found an issue!","wp-mail-smtp"),subtitle:p=(0,l.__)("It looks like something went wrong...","wp-mail-smtp"),detailedError:c=""}=e;return t.prototype.$swal({position:s,width:i,showConfirmButton:a,confirmButtonText:n,customClass:o,showCloseButton:r,title:m,html:`\n\t\t\t\t\t\t

      ${p}

      \n\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t

      ${(0,l.__)("Error Message:","wp-mail-smtp")}

      \n\t\t\t\t\t\t\t
      ${c}
      \n\t\t\t\t\t\t
      \n\t\t\t\t\t`,allowEscapeKey:!1,allowOutsideClick:!1,onOpen:function(){t.prototype.$swal.hideLoading()}})},t.prototype.$required_fields_modal=function(){return t.prototype.$swal({position:"center",width:450,showConfirmButton:!0,confirmButtonText:(0,l.__)("OK","wp-mail-smtp"),customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"},showCloseButton:!0,title:(0,l.__)("Heads up!","wp-mail-smtp"),text:(0,l.__)("Please fill out all the required fields to continue.","wp-mail-smtp"),allowEscapeKey:!1,allowOutsideClick:!1})})}};var ia=sa,aa=s(9669),na=s.n(aa);const oa=function(t,e){return new Promise(((s,i)=>{let a=new FormData;a.append("action","wp_mail_smtp_vue_install_plugin"),a.append("nonce",Ji.ZP.prototype.$wpms.nonce),a.append("slug",e),na().post(Ji.ZP.prototype.$wpms.ajax_url,a).then((e=>{if(e.data.success)t.commit("PLUGIN_INSTALLED",e.data);else{let t="";ee()(e.data,"data[0].message")?t=e.data.data[0].message:ee()(e.data,"data")&&(t=e.data.data),Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like the plugin installation failed!","wp-mail-smtp"),detailedError:t})}s(e.data)})).catch((function(t){if(i(t),t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't install the plugin.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline. Plugin not installed.","wp-mail-smtp")})}))}))},ra=function(t){return new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_partner_plugins_info"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((s=>{s.data.success?t.commit("PLUGINS_FETCHED",s.data):Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Can't fetch plugins information.","wp-mail-smtp")}),e(s.data)})).catch((function(t){if(s(t),t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't fetch plugins information.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline. Plugin information not retrieved.","wp-mail-smtp")})}))}))};var la={installPlugin:oa,fetchPlugins:ra};const ma=function(t,e){return la.installPlugin(t,e)},pa=function(t){return la.fetchPlugins(t)};var ca={installPlugin:ma,getPlugins:pa};const _a=t=>t.plugins,da=t=>t.plugins.filter((t=>"wpforms-lite"!==t.slug)),ua=t=>t.contact_form_plugin_already_installed;var ha={getField:ct.rz,plugins:_a,partner_plugins:da,contact_form_plugin_already_installed:ua};const ga=(t,e)=>{t.plugins.map((s=>(s.slug===e.data.slug&&(s.is_installed=e.data.is_installed,s.is_activated=e.data.is_activated),"wpforms-lite"===e.data.slug&&(t.contact_form_plugin_already_installed=!0),s)))},fa=(t,e)=>{t.plugins=e.data.plugins,t.contact_form_plugin_already_installed=e.data.contact_form_plugin_already_installed};var wa={updateField:ct.L4,PLUGIN_INSTALLED:ga,PLUGINS_FETCHED:fa};const Aa={plugins:[],contact_form_plugin_already_installed:!1,smart_contact_form_setting:!0};var ba={namespaced:!0,state:Aa,actions:ca,getters:ha,mutations:wa};const va=t=>new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_settings"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((t=>{t.data.success?e(t.data):s(t.data)})).catch((function(e){if(t.dispatch("$_app/block",!1,{root:!0}),e.response){const t=e.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load the settings.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),t.status,t.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))})),xa=(t,e)=>new Promise(((t,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_amazon_ses_identities"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==e&&i.append("value",JSON.stringify(e)),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((e=>{e.data.success?t(e.data):s(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't retrieve Amazon SES Identities.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Can't retrieve Amazon SES Identities.","wp-mail-smtp")})}))})),ka=(t,e)=>new Promise(((t,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_amazon_ses_identity_registration"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==e.value&&i.append("value",e.value),!1!==e.value&&i.append("type",e.type),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((e=>{e.data.success?t(e.data):s(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't register the Amazon SES Identity.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Can't register the Amazon SES Identity","wp-mail-smtp")})}))})),ya=(t,e)=>new Promise((t=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_update_settings"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),void 0!==e.overwrite&&s.append("overwrite",e.overwrite),!1!==e.value&&s.append("value",JSON.stringify(e.value)),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((e=>{t(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't save the settings.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Network error encountered. Settings not saved.","wp-mail-smtp")})}))})),Ca=(t,e)=>new Promise((t=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_import_settings"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==e.value&&s.append("value",e.value),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((e=>{t(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't import the plugin settings.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("Network error encountered. SMTP plugin import failed!","wp-mail-smtp")})}))})),Sa=function(t,e){return new Promise(((s,i)=>{let a=new FormData;a.append("action","wp_mail_smtp_vue_get_oauth_url"),a.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==t&&a.append("mailer",t),!1!==e&&a.append("settings",JSON.stringify(e)),na().post(Ji.ZP.prototype.$wpms.ajax_url,a).then((t=>{t.data.success?s(t.data):i(t.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load authentication details.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))}))},Pa=function(t){return new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_remove_oauth_connection"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==t&&i.append("mailer",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((t=>{t.data.success?e(t.data):s(t.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't remove OAuth connection.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))}))},Ma=function(t){return new Promise(((e,s)=>{let i=new FormData;i.append("action","wp_mail_smtp_vue_get_connected_data"),i.append("nonce",Ji.ZP.prototype.$wpms.nonce),!1!==t&&i.append("mailer",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,i).then((t=>{t.data.success?e(t.data):s(t.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load oAuth connected data.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))}))},Ea=function(t){return new Promise((e=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_subscribe_to_newsletter"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),s.append("email",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((t=>{e(t.data)}))}))},Ta=function(t){return new Promise((e=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_verify_license_key"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),s.append("license_key",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((t=>{e(t.data)}))}))},Fa=function(t){return new Promise((e=>{let s=new FormData;s.append("action","wp_mail_smtp_vue_upgrade_plugin"),s.append("nonce",Ji.ZP.prototype.$wpms.nonce),s.append("license_key",t),na().post(Ji.ZP.prototype.$wpms.ajax_url,s).then((t=>{e(t.data)}))}))};var Ia={fetchSettings:va,saveSettings:ya,importOtherPluginSettings:Ca,fetchAmazonSESIdentities:xa,amazonSESRegisterIdentity:ka,getAuthRedirect:Sa,removeAuth:Pa,getConnectedData:Ma,subscribeToNewsletter:Ea,verifyLicense:Ta,upgradePlugin:Fa};const Ba=t=>Ia.fetchSettings(t).then((e=>{t.commit("SETTINGS_UPDATED",e.data)})).catch((t=>{if(t.data)return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load existing settings.","wp-mail-smtp"),detailedError:t.data})})),Da=t=>{const e=t.getters.settings.amazonses;if(0!==Object.keys(e).length)return Ia.fetchAmazonSESIdentities(t,e).then((e=>{t.commit("AMAZONSES_IDENTITIES_UPDATED",e),Ji.ZP.swal.close()})).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't retrieve the Amazon SES Identities.","wp-mail-smtp"),detailedError:t.data?t.data:""})}))},za=(t,e)=>Ia.amazonSESRegisterIdentity(t,e).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't register the Amazon SES Identity.","wp-mail-smtp"),detailedError:t.data})})),Oa=(t,e)=>{t.commit("MAILER_UPDATE",e)},Wa=(t,e)=>new Promise((function(s){t.commit("LOGS_UPDATE",e),s({success:!0})})),La=(t,e)=>new Promise((function(s){t.commit("SUMMARY_REPORT_EMAIL_UPDATE",e),s({success:!0})})),Ra=(t,e)=>{t.commit("SETTINGS_SAVE_START");let s=Ia.saveSettings(t,e);return s.then((function(){t.commit("SETTINGS_SAVE_END")})),s},Qa=t=>{const e=t.getters.settings;t.commit("SETTINGS_SAVE_START");let s=Ia.saveSettings(t,{value:e});return s.then((function(){t.commit("SETTINGS_SAVE_END")})),s},Na=(t,e)=>(t.commit("SETTINGS_SAVE_START"),new Promise((function(s){Ia.importOtherPluginSettings(t,e).then((function(e){t.commit("SETTINGS_SAVE_END"),e.success?Ba(t).then((function(){s(!0)})):s(!1)}))}))),Za=(t,e)=>Ia.getAuthRedirect(e,t.getters.settings[e]).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load oAuth redirect.","wp-mail-smtp"),detailedError:t.data})})),Ua=(t,e)=>Ia.getConnectedData(e).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't load oAuth connected data.","wp-mail-smtp"),detailedError:t.data})})),Ha=(t,e)=>Ia.removeAuth(e).then((function(){t.commit("SETTINGS_REMOVE_AUTH",e)})).catch((t=>{Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't remove oAuth connection.","wp-mail-smtp"),detailedError:t.data})})),Ga=(t,e)=>new Promise((s=>{t.commit("SETTINGS_SAVE_PLUGIN_FEATURES",e),s({success:!0,features:e})})),Ya=(t,e)=>Ia.subscribeToNewsletter(e),Va=(t,e)=>Ia.verifyLicense(e),Ka=(t,e)=>Ia.upgradePlugin(e);var Ja={getSettings:Ba,updateSettings:Ra,importOtherPlugin:Na,setMailer:Oa,setLogs:Wa,setSummaryReportEmail:La,saveCurrentSettings:Qa,getAmazonSESIdentities:Da,amazonSESRegisterIdentity:za,getAuthUrl:Za,removeAuth:Ha,getConnectedData:Ua,savePluginFeatures:Ga,subscribeToNewsletter:Ya,verifyLicense:Va,upgradePlugin:Ka};const qa=t=>t.settings,Xa=t=>t.settings.mail.mailer,ja=t=>t.settings.outlook.user_details?t.settings.outlook.user_details.email:null,$a=t=>t.settings.zoho.user_details?t.settings.zoho.user_details.email:null,tn=t=>t.plugin_features,en=t=>!!t.settings.logs.enabled&&t.settings.logs.enabled,sn=t=>!t.settings.general.summary_report_email_disabled,an=t=>e=>{let s=!1;const i=t.amazonses_identities.data,a=e.split("@").pop();return void 0!==i&&(i.forEach((t=>{("email"===t.type&&t.value===e||"domain"===t.type&&t.value===a)&&(s=!0)})),s)};var nn={getField:ct.rz,settings:qa,mailer:Xa,outlook_email:ja,zoho_email:$a,plugin_features:tn,amazonses_is_email_registered:an,email_log_enabled:en,summary_report_email_enabled:sn},on=s(2378),rn=s.n(on);const ln=(t,e)=>{t.is_saving=!1,t.settings=rn()(t.settings,e)},mn=(t,e)=>{t.amazonses_identities=e.data},pn=(t,e)=>{t.settings.mail.mailer=e},cn=(t,e)=>{t.settings.logs.enabled=e},_n=(t,e)=>{t.settings.general.summary_report_email_disabled=e},dn=t=>{t.is_saving=!0},un=t=>{t.is_saving=!1},hn=(t,e)=>{const s=t.settings[e];t.settings[e]={client_id:s.client_id,client_secret:s.client_secret},"zoho"===e&&(t.settings[e].domain=s.domain)},gn=(t,e)=>{t.plugin_features=e};var fn={updateField:ct.L4,SETTINGS_UPDATED:ln,SETTINGS_SAVE_START:dn,SETTINGS_SAVE_END:un,MAILER_UPDATE:pn,LOGS_UPDATE:cn,SUMMARY_REPORT_EMAIL_UPDATE:_n,AMAZONSES_IDENTITIES_UPDATED:mn,SETTINGS_REMOVE_AUTH:hn,SETTINGS_SAVE_PLUGIN_FEATURES:gn};const wn={settings:{mail:{mailer:"mail",from_email:"",from_name:"",return_path:!1,from_email_force:!0,from_name_force:!1},smtp:{host:"",port:"587",encryption:"tls",autotls:!0,auth:!0,user:"",pass:""},sendlayer:{api_key:""},smtpcom:{api_key:"",channel:""},sendinblue:{api_key:"",domain:""},mailgun:{api_key:"",domain:"",region:"US"},sendgrid:{api_key:"",domain:""},sparkpost:{api_key:"",region:"US"},postmark:{server_api_token:"",message_stream:""},amazonses:{client_id:"",client_secret:"",region:"us-east-1"},gmail:{client_id:"",client_secret:"",access_token:{},refresh_token:""},outlook:{client_id:"",client_secret:"",access_token:{},refresh_token:"",user_details:{email:""}},zoho:{client_id:"",client_secret:"",domain:"com",access_token:{},refresh_token:"",user_details:{email:""}},logs:{enabled:!1,log_email_content:!1,save_attachments:!1,open_email_tracking:!1,click_link_tracking:!1},general:{summary_report_email_disabled:!1},alert_email:{enabled:!1,connections:{}}},amazonses_identities:{},plugin_features:[]};var An={namespaced:!0,state:wn,actions:Ja,getters:nn,mutations:fn};const bn=()=>new Promise((t=>{let e=new FormData;e.append("action","wp_mail_smtp_vue_check_mailer_configuration"),e.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,e).then((e=>{t(e.data)})).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't perform the mailer configuration check.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))})),vn=t=>{let e=new FormData;e.append("action","wp_mail_smtp_vue_send_feedback"),e.append("nonce",Ji.ZP.prototype.$wpms.nonce),e.append("data",JSON.stringify(t)),na().post(Ji.ZP.prototype.$wpms.ajax_url,e).catch((function(t){if(t.response){const e=t.response;return Ji.ZP.prototype.$wpms_error_modal({subtitle:(0,l.__)("It looks like we can't send the feedback.","wp-mail-smtp"),detailedError:(0,l.gB)((0,l.__)("%1$s, %2$s","wp-mail-smtp"),e.status,e.statusText)})}Ji.ZP.prototype.$wpms_error_toast({title:(0,l.__)("You appear to be offline.","wp-mail-smtp")})}))},xn=()=>{let t=new FormData;t.append("action","wp_mail_smtp_vue_wizard_steps_started"),t.append("nonce",Ji.ZP.prototype.$wpms.nonce),na().post(Ji.ZP.prototype.$wpms.ajax_url,t)};var kn={checkMailerConfiguration:bn,sendFeedback:vn,started:xn};const yn=()=>kn.checkMailerConfiguration(),Cn=(t,e)=>{kn.sendFeedback(e)},Sn=()=>{kn.started()};var Pn={checkMailerConfiguration:yn,sendFeedback:Cn,started:Sn};const Mn=t=>t.blocked_step,En=t=>t.current_user_email;var Tn={getField:ct.rz,blocked_step:Mn,current_user_email:En},Fn={updateField:ct.L4};const In={blocked_step:!1,current_user_email:window.wp_mail_smtp_vue.current_user_email};var Bn={namespaced:!0,state:In,actions:Pn,getters:Tn,mutations:Fn};const Dn=t=>{t.commit("INIT")},zn=t=>{t.commit("BLOCK_APP")},On=t=>{t.commit("UNBLOCK_APP")},Wn=t=>{t.commit("APP_LOADING_START")},Ln=t=>{t.commit("APP_LOADING_STOP")};var Rn={init:Dn,block:zn,unblock:On,start_loading:Wn,stop_loading:Ln};const Qn=t=>t.blocked,Nn=t=>t.loading,Zn=t=>t.wpms;var Un={blocked:Qn,loading:Nn,wpms:Zn};const Hn=()=>{},Gn=t=>{t.blocked=!0},Yn=t=>{t.blocked=!1},Vn=t=>{t.loading=!0},Kn=t=>{t.loading=!1};var Jn={INIT:Hn,BLOCK_APP:Gn,UNBLOCK_APP:Yn,APP_LOADING_START:Vn,APP_LOADING_STOP:Kn};const qn={blocked:!1,loading:!1,wpms:window.wp_mail_smtp_vue?window.wp_mail_smtp_vue:{}};var Xn={namespaced:!0,state:qn,actions:Rn,getters:Un,mutations:Jn};const jn=t=>{t.subscribe(((e,s)=>{if("$_app/INIT"===e.type){const e=s["$_app"].wpms.versions;let i="",a="";e.php_version_below_55?(i=(0,l.__)("Yikes! PHP Update Required","wp-mail-smtp"),a=(0,l.gB)((0,l.__)("WP Mail SMTP has detected that your site is running an outdated, insecure version of PHP (%1$s), which could be putting your site at risk for being hacked. WordPress stopped supporting your PHP version in April, 2019. Updating to the recommended version (PHP %2$s) only takes a few minutes and will make your website significantly faster and more secure.","wp-mail-smtp"),e.php_version,"7.4")):e.php_version_below_56?(i=(0,l.__)("Yikes! PHP Update Required","wp-mail-smtp"),a=(0,l.gB)((0,l.__)("WP Mail SMTP has detected that your site is running an outdated, insecure version of PHP (%1$s). Some mailers require at least PHP version 5.6. Updating to the recommended version (PHP %2$s) only takes a few minutes and will make your website significantly faster and more secure.","wp-mail-smtp"),e.php_version,"7.4")):e.wp_version_below_49&&(i=(0,l.__)("Yikes! WordPress Update Required","wp-mail-smtp"),a=(0,l.gB)((0,l.__)("WP Mail SMTP has detected that your site is running an outdated version of WordPress (%s). WP Mail SMTP requires at least WordPress version 4.9.","wp-mail-smtp"),e.wp_version)),Ji.ZP.prototype.$swal&&i.length&&(t.dispatch("$_app/block"),Ji.ZP.prototype.$swal.close(),Ji.ZP.prototype.$swal({title:i,html:`

      ${a}

      ${(0,l.__)("Return to Plugin Settings","wp-mail-smtp")}

      `,customClass:{container:"wp-mail-smtp-swal wp-mail-smtp-swal-alert"},allowOutsideClick:!1,allowEscapeKey:!1,allowEnterKey:!1,showConfirmButton:!1,onOpen:function(){Ji.ZP.prototype.$swal.hideLoading()}}))}}))};var $n=jn;Ji.ZP.use(at.ZP);const to=[$n];var eo=new at.ZP.Store({modules:{$_app:Xn,$_plugins:ba,$_settings:An,$_wizard:Bn},plugins:to}),so=s(7575),io=(s(528),s(4952));const ao=document.getElementById("wp-mail-smtp-vue-setup-wizard");Ji.ZP.config.productionTip=!1,s.p=window.wp_mail_smtp_vue.public_url,Ji.ZP.use(io.InlineSvgPlugin),Ji.ZP.use(n.ZP),Ji.ZP.use(qi.Z),Ji.ZP.use(so.ZP,{defaultTemplate:'',defaultArrowSelector:".wp-mail-smtp-tooltip-arrow, .wp-mail-smtp-tooltip__arrow",defaultInnerSelector:".wp-mail-smtp-tooltip-inner, .wp-mail-smtp-tooltip__inner"}),Ji.ZP.use(ea),(0,l.l5)(window.wp_mail_smtp_vue.translations,"wp-mail-smtp");const no={install(t){t.prototype.$wizard_steps=[],t.prototype.$wpms&&t.prototype.$wpms.other_smtp_plugins.length>0&&t.prototype.$wizard_steps.push("import_step"),t.prototype.$wizard_steps.push("choose_mailer_step"),t.prototype.$wizard_steps.push("configure_mailer_step"),t.prototype.$wizard_steps.push("plugin_features_step"),t.prototype.$wpms&&t.prototype.$wpms.is_pro&&t.prototype.$wizard_steps.push("configure_email_logs_step"),t.prototype.$wpms&&!t.prototype.$wpms.is_pro&&t.prototype.$wizard_steps.push("help_improve_step"),t.prototype.$wizard_steps.push("license_step"),t.prototype.$wizard_steps.push("check_configuration_step")}};Ji.ZP.use(no),Ji.ZP.use(ia),new Ji.ZP({store:eo,mounted:()=>{eo.dispatch("$_app/init")},render:t=>t(Ki)}).$mount(ao)},7630:function(t,e,s){var i={"./loading-blue.svg":7064,"./loading-white.svg":9438,"./loading.svg":7061};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=7630},5016:function(t,e,s){var i={"./amazonses.svg":7557,"./gmail.svg":7526,"./mailgun.svg":5567,"./outlook.svg":6703,"./postmark.svg":5699,"./sendgrid.svg":2763,"./sendinblue.svg":4522,"./sendlayer.svg":9857,"./smtp.svg":450,"./smtpcom.svg":7536,"./sparkpost.svg":2091,"./zoho.svg":9349};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=5016},833:function(t,e,s){var i={"./all-in-one-seo-pack@2x.png":5720,"./coming-soon@2x.png":6717,"./google-analytics-for-wordpress@2x.png":4166,"./instagram-feed@2x.png":4545,"./rafflepress@2x.png":3025,"./wp-call-button@2x.png":3277};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=833},8517:function(t,e,s){var i={"./all-in-one-seo-pack.png":4444,"./all-in-one-seo-pack@2x.png":5720,"./coming-soon.png":7289,"./coming-soon@2x.png":6717,"./google-analytics-for-wordpress.png":2598,"./google-analytics-for-wordpress@2x.png":4166,"./instagram-feed.png":9228,"./instagram-feed@2x.png":4545,"./rafflepress.png":6270,"./rafflepress@2x.png":3025,"./wp-call-button.png":7896,"./wp-call-button@2x.png":3277};function a(t){var e=n(t);return s(e)}function n(t){if(!s.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}a.keys=function(){return Object.keys(i)},a.resolve=n,t.exports=a,a.id=8517},7064:function(t,e,s){"use strict";t.exports=s.p+"img/loading-blue.svg"},9438:function(t,e,s){"use strict";t.exports=s.p+"img/loading-white.svg"},7061:function(t,e,s){"use strict";t.exports=s.p+"img/loading.svg"},969:function(t,e,s){"use strict";t.exports=s.p+"img/loading-pattie.svg"},1122:function(t,e,s){"use strict";t.exports=s.p+"img/arrow.svg"},5561:function(t,e,s){"use strict";t.exports=s.p+"img/check-circle-solid-white.svg"},2546:function(t,e,s){"use strict";t.exports=s.p+"img/check-circle-solid.svg"},7579:function(t,e,s){"use strict";t.exports=s.p+"img/check-solid.svg"},8098:function(t,e,s){"use strict";t.exports=s.p+"img/copy-solid.svg"},4186:function(t,e,s){"use strict";t.exports=s.p+"img/exclamation-circle-solid.svg"},2411:function(t,e,s){"use strict";t.exports=s.p+"img/info-circle-solid.svg"},4523:function(t,e,s){"use strict";t.exports=s.p+"img/lock-solid.svg"},9238:function(t,e,s){"use strict";t.exports=s.p+"img/long-arrow-alt-left-regular.svg"},7706:function(t,e,s){"use strict";t.exports=s.p+"img/long-arrow-alt-right-regular.svg"},1004:function(t,e,s){"use strict";t.exports=s.p+"img/question-circle-solid.svg"},3481:function(t,e,s){"use strict";t.exports=s.p+"img/star-solid.svg"},3531:function(t,e,s){"use strict";t.exports=s.p+"img/times-solid.svg"},6375:function(t,e,s){"use strict";t.exports=s.p+"img/logo.svg"},7557:function(t,e,s){"use strict";t.exports=s.p+"img/amazonses.svg"},7526:function(t,e,s){"use strict";t.exports=s.p+"img/gmail.svg"},5567:function(t,e,s){"use strict";t.exports=s.p+"img/mailgun.svg"},6703:function(t,e,s){"use strict";t.exports=s.p+"img/outlook.svg"},5699:function(t,e,s){"use strict";t.exports=s.p+"img/postmark.svg"},2763:function(t,e,s){"use strict";t.exports=s.p+"img/sendgrid.svg"},4522:function(t,e,s){"use strict";t.exports=s.p+"img/sendinblue.svg"},9857:function(t,e,s){"use strict";t.exports=s.p+"img/sendlayer.svg"},450:function(t,e,s){"use strict";t.exports=s.p+"img/smtp.svg"},7536:function(t,e,s){"use strict";t.exports=s.p+"img/smtpcom.svg"},2091:function(t,e,s){"use strict";t.exports=s.p+"img/sparkpost.svg"},9349:function(t,e,s){"use strict";t.exports=s.p+"img/zoho.svg"},330:function(t,e,s){"use strict";t.exports=s.p+"img/pro-badge.svg"},7764:function(t,e,s){"use strict";t.exports=s.p+"img/working.svg"},4444:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABKdJREFUWIWtl11sFFUUx39ndqf0C0EhiKVluy01ARuoxMRo1CBBIqKRqNV2C4Sg8cGowQcViUFtFOmDCSYaE9SEqN0tluiDIRBBosYHQlBDowbSwu62fNTKh/JRSnd3jg9TdruzMzsN8H+79/zP+f/vzZ17zwgTRfNAGSWZh1FZCtoI3A6YwBRgECGBcghhD6R+oLPh/ETKii9j9dHZpAPrgVVA5QTtXgS2kTG2sH320Wsz0PxnCWZ5O8grQMkEhZ24gmgHZ9Ob2NVwZeIGVg7Mwcp8Ddx5jcJO9GClH6VrzoC/gdbkHRi6F2XmDRK/ipOotYxYXc/4SSOPsioRRvRHT3HlBOiHwBGXaA8q7wP9HgaqEGMXLX017gbWxEvJsAOY7lGgn3SggWh4HYb1ODAyLnaJACuIhTZQWTIXYdDbRPA7lvVOKjSQMt4CFnok2tzumssAfFV3BGUxIq+jvAbWYr6sjQOwtWoYJehZRVjAzcE3ckOASLIO9C9gklceoJRoOdvCI0U40NZ7E2r+V5QDV0DmEQ0ds3dAdb2POKhs9hUH6Gw4j8hmH9YkRNcBCKsGK8iMnAImOxR7QXqBeajEiIU2+IqPR1viXZSngB6ERpS5DsYFSkdmCa3JpxHd7ghmwKonWpd0L368mlEdprvmLGAf4FGrhmh9ryu/JV6LIX1AwLHIFQaG3ueS8runOICmOzDTL2fHo8ZjENjhye8KJ4CegnmRpQYqd7ukNNGWWOtZEEwQM1dITQTTnapCJPEisKAwxIIgaJVLVhDlc1qT1cRC7dnZRRqkKnk/yK2IpokklwBg0YhoBZHkElJl++mecTGbE0m2A296LCQUBKZ5rlM0/y2ojtdjGftAQQG01eZll7QHc/hJ4JtxWY2e9WGaQcHBuE6o431R26oHUgbg1Tgowt58ejDtayBgpPLGhuwCLA/2ZQPkmFsA1UforP04b3bKUD+QcuHnoNqXN+4MfYrqYuwmxQE5YqB6qLAIR4mFdxfMb70rBXQXkf+VhtmHC2Zj4Z9QCjsj0T8MRPcVBmgkEm9ylbCMV4FCERgCfY63Jbfda+KlAETiTQjzCzJUvxfWHp7MSOkgUO4InwZOAnMR/ZaKMyvHdgCaB27BtF4C3YD9DXxEMLOFL+rtXuD5gyYXpkcRngD6gBnAVEf9i6QCM8Zew8RnwLOuK86hi2goApI71W2JUygW0dpZecxIIga0+NT7hGjtC2P9QKYDv8MFLbT1Tfbh2O07POPDGkGCm+BqQxKt70XY4pN0Mq/Xbx4oQ5kCTB0TtWE3LfGilYQP6Kw+njMAYOpGYH+RtFJa+u1ru3mokmCmEygDyjGtGGsP27tjc4rt1EEqTr+T8zIeKxO3YXEAqPZIHgZ2Y7frYUesH/vFewiv5kY5gcgDREPZu8elLT82HzF2FjFxrfgb1UXEwnmfsFFAi9X1kEotBPn5Bor/RoB7nOLuBgC6G/7h3OhSRNuBS9chfBnhPc6l7s12zQ74/5w2x2diykZgNVAxQeF/EaIEMh3Zy8kD/gayRoYqKbm0HIwHQZtQwti3WxrkDOhx0AOI8Qujxs7sP4QP/gdLfYuNd8XCxgAAAABJRU5ErkJggg=="},5720:function(t){"use strict";t.exports="data:image/png;base64,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"},7289:function(t){"use strict";t.exports="data:image/png;base64,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"},6717:function(t){"use strict";t.exports="data:image/png;base64,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"},2598:function(t){"use strict";t.exports="data:image/png;base64,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"},4166:function(t){"use strict";t.exports="data:image/png;base64,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"},9228:function(t){"use strict";t.exports="data:image/png;base64,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"},4545:function(t){"use strict";t.exports="data:image/png;base64,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"},6270:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAFG0lEQVRYCaVXa0xcRRQ+M/exsJTFUgOCpawGLU9taBuB1kdqjRQxwWhMQNPaNqExjTXGgk3sDxOLptb+ayRVafyDRVJfNAImPtpQCdSaKK8mDW1poU2BQq0sLNzde8e5d5m7d+5ddhc9f+acb86c883MnTNzEfwHCbz1dDnM+ZpxwJ/qu3NbE7wFfVKKZ4frva/7lhsOLWcASyyoSiobNzM6zFQQ8kv+XC6RuAgEP9j+Erkx3CQs+D1mNqqonlXgT3sAyK8tVhjE4i3Dck7hTml3wzmuI4IRlYAxY8X/FZeYaBDMzAGx5h1AuRthcnYehMnrILV+DKSnHWDuHzONTkR0iS9G25qIBEhFRnbgobU/ibN3c8xoNLHqLQCx9jBA2moT1gkwwbN3QW7/FEjbcZ5IybZO99nWanQG/ma+rHUQUOoqmvHUWA3GAvMBNTvPkZh1WgkwDFEiLp1IyxEGAVqVoUiPPP5+4oGmQyZIFZOAsdwz09/TtDJz0EQJ8JvHjKVmmL2NRID5GFtzbB+QgW4GAfbm3ZIzsp5l22IQUA+9Ug9X+g+jxVkTjQDZWgNCdZ05UO3rArX3R8AFJSCWVZq4lYD8eyfga4OgFZSCkldm+sgXOgE1vQswMRrC3B4il5bXJtY3fW4QCOxapwoYYWD7fLDZHKwrCwcqQRofASTSxVGDQN4+TomUGj6MgHB1AMT9W8xx6LEKmK//wrR1xdVKt+R06PtAqenznpPDiVjvMJLTVttYDqItebCxDuSpm6HkhrMIcO2irnEizM9wNulth8SOzzhs4WW6orsbDIxMjyfoCg68kLmZeaGsh5kabvu7wvqipkUgAOPXHX7Q84MDI+lrOAyrsryBQ2wGIsSGUJOuiEMmnAQijOSG+Z5JWmdsAYfaDHJ/uBTYujgTI/NAhfFCc3HDmEUjAronJgG8fqtlSEglk2NO7KrzHtK8hQ4/OxCbwLadALZtwEq4+rGAeDZcgg3M7QGFftSxJCYBPYDqzefi4AU/Z+uGZik2Rufzexw+kYC4CBj1n9YIUwR6FH3hsq6XXk702T9Xy0FLGTRSHEIvH3VTFQjdbaazureM7owGrgnniSD0rJOkFNM3mhLXCmiX+0Dt+oaLg+UEEFxuDmMGohVPHBlk5pJtcqfvDBYU5cKSHosdgYZXQdaXPV6hRUn4aEdc3lj69ua5aJ7aHz8vLzkLRknEswoxt0C7eJ6FNFr9ptSvabsIRZsApWVxMB78jbMjGRwBMnrJ6TMywGH4w9MgNPaCakkmV70OSUc6IPkTPqHjdNBIyHZnGASISqdFBZ/vgCDd76jiXmF0E8G5CvZxyFaeE04dBThx0HBDK9OMamZ8WcG01Uel22P7gT5IhJEhUGvXA6raC7hilz0mBPY9SY+YByT97C9+mMp3jaBe6QfNNjttsYKKQ90g0sSEvhkMSUwmUvFTb0DLZf5Jhnx32jAh5tTUlHsB0r0gXFr6oFj/C+xsSWUt4LkZIL+cNLtwdu4tOXMN/yQze6kSepTeoI9S7vOwunB6NAJWR5R6nyI9+sTSj1Krs/4sV9bmn5VmprOteCQ9JgG63GLuhjZ3T9trcT3LrUmMl/KC7xQtVklW3KpHIyAUbR6SVrir2QvYOo7pEV4RrCvc6r9m2ujwCTHgTw6jIS0SAT2xK694z//+NbMni0TESoD+nP5Ff063R5uxPWZcK2AfpG8NmfN9KQTmV/qmxlXhwaKB5SZmMf8F4cLeesegrcIAAAAASUVORK5CYII="},3025:function(t){"use strict";t.exports="data:image/png;base64,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"},7896:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAADyklEQVRYCbVXa0hTURz/nW0+Ssc0zdIQDR+RFoGGFFkolYkUZCJYIfSgiB4U1Kc+mN8qUnp8KAjC3g+KRZRlKZSlZUGZZaa23maumWXTzW262zkrL9vuPdPpdi6Xc87/8fv/7rn3f87/EvxrJPFwVgEBWQQiBPyX+aUjEOxDdvLsfavxIk4+txEWJelI1iUavMgvETmggiDUBvYackhSedZyoiQ3OXZ+FdsFYbuCKJDp1ygewOnyz1cIBEEebESVJkgtjn01IARKlRyYSqFCalQS0qJnIS2G3tGpiJgYjr01h6BtqZJzGbNMQkBJ38nt4grEhU2TgG6euxrXW+5CoJevmsIdKFgVLBuc2U0Pj0Vm3Fx3l3HNJQTMg2bYBTsXtHhOPlc3FoWEAE0NdPf3cLEWxmcgTiN9PVyHERQSAsz+46+vXDeWt/kpy7h6bxWyBF7r27k4A4MWPPvWxNV7q5Al8LSjURany2jA2qs78fjLc1n9WISSNGQgDZSA0dIHdVCoiPnu5yes1+6BwcT/PkRjLwayK2AdsqGy7b4LTPgEDfptZheZLyayBBjwuSatSzpG0p1wa0axL2K6YHAJ6Ho+4057rYvxhrRCpMfMdpGNd8IlwIDL6k/CbBsQYygVShzL24dp6imibLwDjwQ6jXoHCecgkSGTcKagHDEcEjMnJ2JTehGi1VHObtyxMiI3PpdWQ/N4Fq/0rUiOmI7EiDjRRBOsRl5SNhq/v0FXn0GUs5W5UHgUixMWgG3ZMyIT0E2zhj0IpzWPSIA5Pvj4BPNj0zBVPVnECQmcSHfEHATQE72pq4X2AajIL0OsJsZhw3ZMRnpVSi6WJmTCZDWj7ecH0f//oJnQevAwXYFd7hr3OdsTTq08iDlTZ7qrwDaob/Qp02nt4KktrliDjj9dTibCZY/fgJOlY2Nap92Nal2ds9gxZiszUnDLoBX6vm6J76gJME8TzYgdlSXY//A42JngTXutb4PNPihx8YoA82a10OnGa1hxfiNq3teBltcSUDnBi+/NcmJ4TWAY5UtvJ7bdKkHB5S248fYeBmyeV+RFpzyBUWXBcFC53kCLl2q6EmdfavH2hw69FiMILXdDaZawzGDtz4ARBx6dgGXI6g7RLHsauluNZm6iB1WVrtZxD9urA0MQGhTi+ID7rKZhsUuvIgIscPyguch9MjFa+8FuXqP/JEMKWgPW8wz8LbcLaGDPTpKPZF+hfaG/Azrj0+ypE5QdS/4tfikUyWFZhTSjsunrGNWvmjOYN2MBxEaT+anut+EcSt9Y/wKYPTFLjUA+DAAAAABJRU5ErkJggg=="},3277:function(t){"use strict";t.exports="data:image/png;base64,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"},9515:function(t){"use strict";t.exports="data:image/png;base64,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"},5529:function(t){"use strict";t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA8FBMVEUAAADHFsHHFsHHFsHHFsHHFsHHFsHGFsLHFsHHFsHuuu3////HDMHinODXc9PJHMPJHsPHE8Hut+zuue3+/P778/vrr+rnpuXOScjMQ8fstOvjmeDgpN3diNrck9jaftfRXczPU8rKMMTrx+npqufmouTYdtTUbtDTZc7SYM346vfx1+/nuuThld7cg9jWftLQWcvJK8TJJsPIIsLHD8HHBcH99/389fv57vn25PXz3vLu0O3tzuvov+bks+LendvZe9XUdNDMP8bKNcXy2/Hu1u3v0u3lteLjsOHejdvYidTXg9PLOsXiq9/hqN7gkd0zo4LZAAAACXRSTlMAsajs60tKB6cVFYoAAAACW0lEQVRYw+2XWXPaMBCA7YSErA024rS5be5wX4GQcJW0SZO0/f//ppKMJw4xtmS/9KHfEzOwn7Sr3WFWwFyJlxCAS/FKIEQvIDAXUSzA8SEM+P4QimtBhFCIgl/91NZLFc4TEcCDebX4kJFlDTw4K4hp5dpSJixj/ILJsHeflo/0gE8wb7107+QPMjqHYD7aPmbkT6TfgFGA3su1W/mUzBuwCVB5lZa/cPv8DdgEk8evZ/8okgZgFKxPEn/a7KcIgFnQcV7/fv1q0mAOwcYOXta2Gg3mFNAKLLq/O3BkavAJvqdXz8OEfbSBJ6DLJ2iZYDHTj83Q4xNQkOmYgD23QP/lnIAn4BWUF7KDuzavoCw7WQyBU3D4NIIPI+AVFJ0TYCDgFtSsCVht9irY8DUSntz16/sMbLhT2BpzCIYANv+SAMV8mXkIpoN6SvIj2WijM4JpQ2IiVTkjGEiMJDVXAarj73Ij1ZNEM49/VXIVxGj+qb7H/wHq5CRCwV1gX3AwAXe0wrHG8bOCKq1jVgEXzFKS3PBPxUuQACVLFLnq6VyS5DENAxRvAYytgwo6OGnX6dVaAH4CjF6gpSiZH8nHJUweF8dfQKnm6HlNFQiHn0n7eVgFoDatUnRw8pU8/ThCwCqgmPRYKa5YySs4nE9gJ26VYwzAL6ClJ5AHCSYAdZfHdUAQTEA5kJcPLKD8F/AIZrj1dPCnIkl9VwE0cMc3FT/IaOzcBe2UxEZ27C5AlSRbvAEUl6VLKxXifvR3Y6BEQq99oRfPkKvvDVm+b0LERwXCtRiBAETEaxz8F/cVtnqf0nH2AAAAAElFTkSuQmCC"},6557:function(t){"use strict";t.exports="data:image/png;base64,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"},5543:function(t){"use strict";t.exports="data:image/png;base64,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"},7445:function(t){"use strict";t.exports="data:image/png;base64,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"}},e={};function s(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={id:i,loaded:!1,exports:{}};return t[i].call(n.exports,n,n.exports,s),n.loaded=!0,n.exports}s.m=t,function(){var t=[];s.O=function(e,i,a,n){if(!i){var o=1/0;for(p=0;p=n)&&Object.keys(s.O).every((function(t){return s.O[t](i[l])}))?i.splice(l--,1):(r=!1,n0&&t[p-1][2]>n;p--)t[p]=t[p-1];t[p]=[i,a,n]}}(),function(){s.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return s.d(e,{a:e}),e}}(),function(){s.d=function(t,e){for(var i in e)s.o(e,i)&&!s.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"===typeof window)return window}}()}(),function(){s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(),function(){s.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t}}(),function(){s.p=""}(),function(){var t={32:0};s.O.j=function(e){return 0===t[e]};var e=function(e,i){var a,n,o=i[0],r=i[1],l=i[2],m=0;if(o.some((function(e){return 0!==t[e]}))){for(a in r)s.o(r,a)&&(s.m[a]=r[a]);if(l)var p=l(s)}for(e&&e(i);m=5.6.20", + "php": ">=7.2", "composer-plugin-api": "^1.0", "composer/installers": "~1.0", - "google/apiclient": "2.12.1", + "google/apiclient": "2.13.2", "phpseclib/phpseclib": "^3.0.7", "paragonie/constant_time_encoding": "^1", - "guzzlehttp/guzzle": "^6.5", + "guzzlehttp/guzzle": "7.4.5", "monolog/monolog": "^1.0", - "sendinblue/api-v3-sdk": "7.4.4", + "sendinblue/api-v3-sdk": "8.4.2", "symfony/polyfill-intl-idn": "1.17.1", "symfony/polyfill-mbstring": "1.19.0", "symfony/polyfill-php72": "1.19.0", "wikimedia/composer-merge-plugin": "1.4.1", - "woocommerce/action-scheduler": "3.4.2" + "woocommerce/action-scheduler": "3.5.4" }, "autoload": { "psr-4": { @@ -49,11 +49,11 @@ "files": [ "vendor_prefixed/mtdowling/jmespath.php/src/JmesPath.php", "vendor_prefixed/aws/aws-sdk-php/src/functions.php", - "vendor_prefixed/guzzlehttp/psr7/src/functions_include.php", "vendor_prefixed/guzzlehttp/promises/src/functions_include.php", "vendor_prefixed/symfony/polyfill-mbstring/bootstrap.php", "vendor_prefixed/symfony/polyfill-php72/bootstrap.php", "vendor_prefixed/symfony/polyfill-intl-idn/bootstrap.php", + "vendor_prefixed/symfony/deprecation-contracts/function.php", "vendor_prefixed/guzzlehttp/guzzle/src/functions_include.php", "vendor_prefixed/phpseclib/phpseclib/phpseclib/bootstrap.php" ] @@ -68,10 +68,10 @@ }, "scripts": { "php-compatibility-lite" : [ - "vendor/bin/phpcs -p ./*.php ./src/* --ignore='./src/Pro/' --standard=PHPCompatibility --runtime-set ignore_warnings_on_exit true --runtime-set testVersion 5.6-" + "vendor/bin/phpcs -p ./*.php ./src/* --ignore='./src/Pro/' --standard=PHPCompatibility --runtime-set ignore_warnings_on_exit true --runtime-set testVersion 7.2-" ], "php-compatibility-pro" : [ - "vendor/bin/phpcs -p ./*.php ./src/* --standard=PHPCompatibility --runtime-set ignore_warnings_on_exit true --runtime-set testVersion 5.6-" + "vendor/bin/phpcs -p ./*.php ./src/* --standard=PHPCompatibility --runtime-set ignore_warnings_on_exit true --runtime-set testVersion 7.2-" ], "php-compatibility" : [ "@php-compatibility-lite", @@ -105,6 +105,7 @@ "@composer dump-autoload --no-plugins -o -a" ], "install-tests": [ + "@composer --no-scripts --dev --prefer-dist require phpunit/phpunit:9.6.0", "@composer --no-scripts --dev --prefer-dist require codeception/codeception:4.1.22", "@composer --no-scripts --dev --prefer-dist require lucatume/wp-browser:3.0.17", "@composer --no-scripts --dev --prefer-dist require codeception/module-asserts:^1.3", @@ -132,18 +133,24 @@ "composer update --root-reqs --no-dev --no-suggest -o -a", "@prefix-dependencies-optimize" ], - "php-less-than-7-0-check": "@php php-scoper/php-less-than-7-0-check.php", - "php-more-than-7-3-check": "@php php-scoper/php-more-than-7-3-check.php", - "build-lite-php5": [ - "@php-less-than-7-0-check", + "check-plugin-php-version": "@php php-scoper/check-plugin-php-version.php", + "check-build-php-version": "@php php-scoper/check-build-php-version.php", + "build-lite-step-1": [ + "@check-plugin-php-version", "npm run gulp composer:delete_lock_and_vendor", "composer update --root-reqs --no-dev --no-suggest --no-plugins -o -a", "@composer dump-autoload --no-plugins -o -a" ], - "build-pro-php5": [ - "@php-less-than-7-0-check", + "build-lite-step-2": [ + "npm run gulp build:lite_no_composer" + ], + "build-pro-step-1": [ + "@check-plugin-php-version", "npm run gulp composer:delete_lock_and_vendor", "composer update --root-reqs --no-dev --no-suggest -o -a" + ], + "build-pro-step-2": [ + "npm run gulp build:pro_no_composer" ] }, "extra": { diff --git a/gulpfile.js b/gulpfile.js index 1b59879..6e25550 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -328,11 +328,14 @@ gulp.task( 'composer:delete_prefixed_vendor_libraries', function () { 'vendor/phpseclib', 'vendor/psr/cache', 'vendor/psr/http-message', + 'vendor/psr/http-client', + 'vendor/psr/http-factory', 'vendor/psr/log', 'vendor/sendinblue', 'vendor/symfony/polyfill-mbstring', 'vendor/symfony/polyfill-php72', 'vendor/symfony/polyfill-intl-idn', + 'vendor/symfony/deprecation-contracts', 'vendor/mk-j', ], { allowEmpty: true, read: false } @@ -474,9 +477,9 @@ gulp.task( 'prefix_outside_files', function () { /** * PHP version check, if at least PHP 7.3 is in use. */ -gulp.task( 'php:min73', function ( cb ) { +gulp.task( 'php:check-build-version', function ( cb ) { exec( - 'composer php-more-than-7-3-check', + 'composer check-build-php-version', function ( err, stdout, stderr ) { console.log( stdout ); console.log( stderr ); @@ -531,9 +534,9 @@ gulp.task( 'build', gulp.series( gulp.parallel( 'css', 'js', 'img', 'vue' ), 're // Build tasks without PHP composer install step // The composer install should be done on PHP 5.6 before running below commands: -// `composer build-lite-php5` or `composer build-pro-php5`. -gulp.task( 'build:lite_no_composer', gulp.series( 'php:min73', gulp.parallel( 'css', 'js', 'img', 'vue' ), 'replace_ver', 'rename:lite', 'pot:lite', 'composer:prefix_lite', 'zip:lite' ) ); -gulp.task( 'build:pro_no_composer', gulp.series( 'php:min73', 'rename:pro', 'build:assets', 'composer:prefix', 'zip:pro' ) ); +// `composer build-lite-step-1` or `composer build-pro-step-1`. +gulp.task( 'build:lite_no_composer', gulp.series( 'php:check-build-version', gulp.parallel( 'css', 'js', 'img', 'vue' ), 'replace_ver', 'rename:lite', 'pot:lite', 'composer:prefix_lite', 'zip:lite' ) ); +gulp.task( 'build:pro_no_composer', gulp.series( 'php:check-build-version', 'rename:pro', 'build:assets', 'composer:prefix', 'zip:pro' ) ); /** * Look out for relevant sass/js changes. diff --git a/libs/sodium_compat/LICENSE b/libs/sodium_compat/LICENSE deleted file mode 100644 index ce41e50..0000000 --- a/libs/sodium_compat/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -/* - * ISC License - * - * Copyright (c) 2016-2019 - * Paragon Initiative Enterprises - * - * Copyright (c) 2013-2019 - * Frank Denis - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ \ No newline at end of file diff --git a/libs/sodium_compat/autoload-php7.php b/libs/sodium_compat/autoload-php7.php deleted file mode 100644 index 4824860..0000000 --- a/libs/sodium_compat/autoload-php7.php +++ /dev/null @@ -1,31 +0,0 @@ -= 50300) { - // Namespaces didn't exist before 5.3.0, so don't even try to use this - // unless PHP >= 5.3.0 - require_once dirname(__FILE__) . '/lib/namespaced.php'; - require_once dirname(__FILE__) . '/lib/sodium_compat.php'; -} else { - require_once dirname(__FILE__) . '/src/PHP52/SplFixedArray.php'; -} -if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) { - if (PHP_VERSION_ID >= 50300 && !defined('SODIUM_CRYPTO_SCALARMULT_BYTES')) { - require_once dirname(__FILE__) . '/lib/php72compat_const.php'; - } - if (PHP_VERSION_ID >= 70000) { - assert(class_exists('ParagonIE_Sodium_Compat'), 'Possible filesystem/autoloader bug?'); - } else { - assert(class_exists('ParagonIE_Sodium_Compat')); - } - require_once (dirname(__FILE__) . '/lib/php72compat.php'); -} diff --git a/libs/sodium_compat/composer.json b/libs/sodium_compat/composer.json deleted file mode 100644 index cf55d79..0000000 --- a/libs/sodium_compat/composer.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "paragonie/sodium_compat", - "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", - "keywords": [ - "PHP", - "cryptography", - "elliptic curve", - "elliptic curve cryptography", - "Pure-PHP cryptography", - "side-channel resistant", - "Curve25519", - "X25519", - "ECDH", - "Elliptic Curve Diffie-Hellman", - "Ed25519", - "RFC 7748", - "RFC 8032", - "EdDSA", - "Edwards-curve Digital Signature Algorithm", - "ChaCha20", - "Salsa20", - "Xchacha20", - "Xsalsa20", - "Poly1305", - "BLAKE2b", - "public-key cryptography", - "secret-key cryptography", - "AEAD", - "Chapoly", - "Salpoly", - "ChaCha20-Poly1305", - "XSalsa20-Poly1305", - "XChaCha20-Poly1305", - "encryption", - "authentication", - "libsodium" - ], - "license": "ISC", - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com" - }, - { - "name": "Frank Denis", - "email": "jedisct1@pureftpd.org" - } - ], - "autoload": { - "files": ["autoload.php"] - }, - "require": { - "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8", - "paragonie/random_compat": ">=1" - }, - "require-dev": { - "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9" - }, - "suggest": { - "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", - "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." - } -} diff --git a/libs/sodium_compat/lib/constants.php b/libs/sodium_compat/lib/constants.php deleted file mode 100644 index b6a120e..0000000 --- a/libs/sodium_compat/lib/constants.php +++ /dev/null @@ -1,52 +0,0 @@ -getMessage() === 'Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.') { - throw $ex; - } - return false; - } - } -} -if (!is_callable('sodium_crypto_box_secretkey')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_box_secretkey() - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_box_secretkey($keypair) - { - return ParagonIE_Sodium_Compat::crypto_box_secretkey($keypair); - } -} -if (!is_callable('sodium_crypto_box_seed_keypair')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_box_seed_keypair() - * @param string $seed - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_box_seed_keypair($seed) - { - return ParagonIE_Sodium_Compat::crypto_box_seed_keypair($seed); - } -} -if (!is_callable('sodium_crypto_generichash')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_generichash() - * @param string $message - * @param string|null $key - * @param int $outLen - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_generichash($message, $key = null, $outLen = 32) - { - return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $outLen); - } -} -if (!is_callable('sodium_crypto_generichash_final')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_generichash_final() - * @param string|null $ctx - * @param int $outputLength - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_generichash_final(&$ctx, $outputLength = 32) - { - return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength); - } -} -if (!is_callable('sodium_crypto_generichash_init')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_generichash_init() - * @param string|null $key - * @param int $outLen - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_generichash_init($key = null, $outLen = 32) - { - return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outLen); - } -} -if (!is_callable('sodium_crypto_generichash_keygen')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_generichash_keygen() - * @return string - * @throws Exception - */ - function sodium_crypto_generichash_keygen() - { - return ParagonIE_Sodium_Compat::crypto_generichash_keygen(); - } -} -if (!is_callable('sodium_crypto_generichash_update')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_generichash_update() - * @param string|null $ctx - * @param string $message - * @return void - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_generichash_update(&$ctx, $message = '') - { - ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $message); - } -} -if (!is_callable('sodium_crypto_kdf_keygen')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_kdf_keygen() - * @return string - * @throws Exception - */ - function sodium_crypto_kdf_keygen() - { - return ParagonIE_Sodium_Compat::crypto_kdf_keygen(); - } -} -if (!is_callable('sodium_crypto_kdf_derive_from_key')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key() - * @param int $subkey_len - * @param int $subkey_id - * @param string $context - * @param string $key - * @return string - * @throws Exception - */ - function sodium_crypto_kdf_derive_from_key($subkey_len, $subkey_id, $context, $key) - { - return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key( - $subkey_len, - $subkey_id, - $context, - $key - ); - } -} -if (!is_callable('sodium_crypto_kx')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_kx() - * @param string $my_secret - * @param string $their_public - * @param string $client_public - * @param string $server_public - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_kx($my_secret, $their_public, $client_public, $server_public) - { - return ParagonIE_Sodium_Compat::crypto_kx( - $my_secret, - $their_public, - $client_public, - $server_public - ); - } -} -if (!is_callable('sodium_crypto_kx_seed_keypair')) { - /** - * @param string $seed - * @return string - * @throws Exception - */ - function sodium_crypto_kx_seed_keypair($seed) - { - return ParagonIE_Sodium_Compat::crypto_kx_seed_keypair($seed); - } -} -if (!is_callable('sodium_crypto_kx_keypair')) { - /** - * @return string - * @throws Exception - */ - function sodium_crypto_kx_keypair() - { - return ParagonIE_Sodium_Compat::crypto_kx_keypair(); - } -} -if (!is_callable('sodium_crypto_kx_client_session_keys')) { - /** - * @param string $keypair - * @param string $serverPublicKey - * @return array{0: string, 1: string} - * @throws SodiumException - */ - function sodium_crypto_kx_client_session_keys($keypair, $serverPublicKey) - { - return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($keypair, $serverPublicKey); - } -} -if (!is_callable('sodium_crypto_kx_server_session_keys')) { - /** - * @param string $keypair - * @param string $clientPublicKey - * @return array{0: string, 1: string} - * @throws SodiumException - */ - function sodium_crypto_kx_server_session_keys($keypair, $clientPublicKey) - { - return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($keypair, $clientPublicKey); - } -} -if (!is_callable('sodium_crypto_kx_secretkey')) { - /** - * @param string $keypair - * @return string - * @throws Exception - */ - function sodium_crypto_kx_secretkey($keypair) - { - return ParagonIE_Sodium_Compat::crypto_kx_secretkey($keypair); - } -} -if (!is_callable('sodium_crypto_kx_publickey')) { - /** - * @param string $keypair - * @return string - * @throws Exception - */ - function sodium_crypto_kx_publickey($keypair) - { - return ParagonIE_Sodium_Compat::crypto_kx_publickey($keypair); - } -} -if (!is_callable('sodium_crypto_pwhash')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_pwhash() - * @param int $outlen - * @param string $passwd - * @param string $salt - * @param int $opslimit - * @param int $memlimit - * @param int|null $algo - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $algo = null) - { - return ParagonIE_Sodium_Compat::crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $algo); - } -} -if (!is_callable('sodium_crypto_pwhash_str')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_pwhash_str() - * @param string $passwd - * @param int $opslimit - * @param int $memlimit - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit) - { - return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit); - } -} -if (!is_callable('sodium_crypto_pwhash_str_needs_rehash')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash() - * @param string $hash - * @param int $opslimit - * @param int $memlimit - * @return bool - * - * @throws SodiumException - */ - function sodium_crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit) - { - return ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit); - } -} -if (!is_callable('sodium_crypto_pwhash_str_verify')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_verify() - * @param string $passwd - * @param string $hash - * @return bool - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_pwhash_str_verify($passwd, $hash) - { - return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash); - } -} -if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256() - * @param int $outlen - * @param string $passwd - * @param string $salt - * @param int $opslimit - * @param int $memlimit - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit) - { - return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit); - } -} -if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str() - * @param string $passwd - * @param int $opslimit - * @param int $memlimit - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit) - { - return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit); - } -} -if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str_verify')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify() - * @param string $passwd - * @param string $hash - * @return bool - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash) - { - return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash); - } -} -if (!is_callable('sodium_crypto_scalarmult')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_scalarmult() - * @param string $n - * @param string $p - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_scalarmult($n, $p) - { - return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p); - } -} -if (!is_callable('sodium_crypto_scalarmult_base')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_scalarmult_base() - * @param string $n - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_scalarmult_base($n) - { - return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n); - } -} -if (!is_callable('sodium_crypto_secretbox')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_secretbox() - * @param string $message - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_secretbox($message, $nonce, $key) - { - return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key); - } -} -if (!is_callable('sodium_crypto_secretbox_keygen')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_secretbox_keygen() - * @return string - * @throws Exception - */ - function sodium_crypto_secretbox_keygen() - { - return ParagonIE_Sodium_Compat::crypto_secretbox_keygen(); - } -} -if (!is_callable('sodium_crypto_secretbox_open')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_secretbox_open() - * @param string $message - * @param string $nonce - * @param string $key - * @return string|bool - */ - function sodium_crypto_secretbox_open($message, $nonce, $key) - { - try { - return ParagonIE_Sodium_Compat::crypto_secretbox_open($message, $nonce, $key); - } catch (Error $ex) { - return false; - } catch (Exception $ex) { - return false; - } - } -} -if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) { - /** - * @param string $key - * @return array - * @throws SodiumException - */ - function sodium_crypto_secretstream_xchacha20poly1305_init_push($key) - { - return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_push($key); - } -} -if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) { - /** - * @param string $state - * @param string $msg - * @param string $aad - * @param int $tag - * @return string - * @throws SodiumException - */ - function sodium_crypto_secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) - { - return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push($state, $msg, $aad, $tag); - } -} -if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) { - /** - * @param string $header - * @param string $key - * @return string - * @throws Exception - */ - function sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $key) - { - return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_pull($header, $key); - } -} -if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) { - /** - * @param string $state - * @param string $cipher - * @param string $aad - * @return bool|array{0: string, 1: int} - * @throws SodiumException - */ - function sodium_crypto_secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') - { - return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull($state, $cipher, $aad); - } -} -if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) { - /** - * @param string $state - * @return void - * @throws SodiumException - */ - function sodium_crypto_secretstream_xchacha20poly1305_rekey(&$state) - { - ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_rekey($state); - } -} -if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_keygen')) { - /** - * @return string - * @throws Exception - */ - function sodium_crypto_secretstream_xchacha20poly1305_keygen() - { - return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_keygen(); - } -} -if (!is_callable('sodium_crypto_shorthash')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_shorthash() - * @param string $message - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_shorthash($message, $key = '') - { - return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key); - } -} -if (!is_callable('sodium_crypto_shorthash_keygen')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_shorthash_keygen() - * @return string - * @throws Exception - */ - function sodium_crypto_shorthash_keygen() - { - return ParagonIE_Sodium_Compat::crypto_shorthash_keygen(); - } -} -if (!is_callable('sodium_crypto_sign')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign() - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign($message, $sk) - { - return ParagonIE_Sodium_Compat::crypto_sign($message, $sk); - } -} -if (!is_callable('sodium_crypto_sign_detached')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_detached() - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_detached($message, $sk) - { - return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $sk); - } -} -if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey() - * @param string $sk - * @param string $pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk) - { - return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk); - } -} -if (!is_callable('sodium_crypto_sign_keypair')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_keypair() - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_keypair() - { - return ParagonIE_Sodium_Compat::crypto_sign_keypair(); - } -} -if (!is_callable('sodium_crypto_sign_open')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_open() - * @param string $signedMessage - * @param string $pk - * @return string|bool - */ - function sodium_crypto_sign_open($signedMessage, $pk) - { - try { - return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $pk); - } catch (Error $ex) { - return false; - } catch (Exception $ex) { - return false; - } - } -} -if (!is_callable('sodium_crypto_sign_publickey')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_publickey() - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_publickey($keypair) - { - return ParagonIE_Sodium_Compat::crypto_sign_publickey($keypair); - } -} -if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey() - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_publickey_from_secretkey($sk) - { - return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($sk); - } -} -if (!is_callable('sodium_crypto_sign_secretkey')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_secretkey() - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_secretkey($keypair) - { - return ParagonIE_Sodium_Compat::crypto_sign_secretkey($keypair); - } -} -if (!is_callable('sodium_crypto_sign_seed_keypair')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_seed_keypair() - * @param string $seed - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_seed_keypair($seed) - { - return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed); - } -} -if (!is_callable('sodium_crypto_sign_verify_detached')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached() - * @param string $signature - * @param string $message - * @param string $pk - * @return bool - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_verify_detached($signature, $message, $pk) - { - return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $pk); - } -} -if (!is_callable('sodium_crypto_sign_ed25519_pk_to_curve25519')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519() - * @param string $pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_ed25519_pk_to_curve25519($pk) - { - return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($pk); - } -} -if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519() - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_sign_ed25519_sk_to_curve25519($sk) - { - return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($sk); - } -} -if (!is_callable('sodium_crypto_stream')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_stream() - * @param int $len - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_stream($len, $nonce, $key) - { - return ParagonIE_Sodium_Compat::crypto_stream($len, $nonce, $key); - } -} -if (!is_callable('sodium_crypto_stream_keygen')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_stream_keygen() - * @return string - * @throws Exception - */ - function sodium_crypto_stream_keygen() - { - return ParagonIE_Sodium_Compat::crypto_stream_keygen(); - } -} -if (!is_callable('sodium_crypto_stream_xor')) { - /** - * @see ParagonIE_Sodium_Compat::crypto_stream_xor() - * @param string $message - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_crypto_stream_xor($message, $nonce, $key) - { - return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key); - } -} -if (!is_callable('sodium_hex2bin')) { - /** - * @see ParagonIE_Sodium_Compat::hex2bin() - * @param string $string - * @return string - * @throws SodiumException - * @throws TypeError - */ - function sodium_hex2bin($string) - { - return ParagonIE_Sodium_Compat::hex2bin($string); - } -} -if (!is_callable('sodium_increment')) { - /** - * @see ParagonIE_Sodium_Compat::increment() - * @param string $string - * @return void - * @throws SodiumException - * @throws TypeError - */ - function sodium_increment(&$string) - { - ParagonIE_Sodium_Compat::increment($string); - } -} -if (!is_callable('sodium_library_version_major')) { - /** - * @see ParagonIE_Sodium_Compat::library_version_major() - * @return int - */ - function sodium_library_version_major() - { - return ParagonIE_Sodium_Compat::library_version_major(); - } -} -if (!is_callable('sodium_library_version_minor')) { - /** - * @see ParagonIE_Sodium_Compat::library_version_minor() - * @return int - */ - function sodium_library_version_minor() - { - return ParagonIE_Sodium_Compat::library_version_minor(); - } -} -if (!is_callable('sodium_version_string')) { - /** - * @see ParagonIE_Sodium_Compat::version_string() - * @return string - */ - function sodium_version_string() - { - return ParagonIE_Sodium_Compat::version_string(); - } -} -if (!is_callable('sodium_memcmp')) { - /** - * @see ParagonIE_Sodium_Compat::memcmp() - * @param string $a - * @param string $b - * @return int - * @throws SodiumException - * @throws TypeError - */ - function sodium_memcmp($a, $b) - { - return ParagonIE_Sodium_Compat::memcmp($a, $b); - } -} -if (!is_callable('sodium_memzero')) { - /** - * @see ParagonIE_Sodium_Compat::memzero() - * @param string $str - * @return void - * @throws SodiumException - * @throws TypeError - */ - function sodium_memzero(&$str) - { - ParagonIE_Sodium_Compat::memzero($str); - } -} -if (!is_callable('sodium_pad')) { - /** - * @see ParagonIE_Sodium_Compat::pad() - * @param string $unpadded - * @param int $blockSize - * @return int - * @throws SodiumException - * @throws TypeError - */ - function sodium_pad($unpadded, $blockSize) - { - return ParagonIE_Sodium_Compat::pad($unpadded, $blockSize, true); - } -} -if (!is_callable('sodium_unpad')) { - /** - * @see ParagonIE_Sodium_Compat::pad() - * @param string $padded - * @param int $blockSize - * @return int - * @throws SodiumException - * @throws TypeError - */ - function sodium_unpad($padded, $blockSize) - { - return ParagonIE_Sodium_Compat::unpad($padded, $blockSize, true); - } -} -if (!is_callable('sodium_randombytes_buf')) { - /** - * @see ParagonIE_Sodium_Compat::randombytes_buf() - * @param int $amount - * @return string - * @throws Exception - */ - function sodium_randombytes_buf($amount) - { - return ParagonIE_Sodium_Compat::randombytes_buf($amount); - } -} - -if (!is_callable('sodium_randombytes_uniform')) { - /** - * @see ParagonIE_Sodium_Compat::randombytes_uniform() - * @param int $upperLimit - * @return int - * @throws Exception - */ - function sodium_randombytes_uniform($upperLimit) - { - return ParagonIE_Sodium_Compat::randombytes_uniform($upperLimit); - } -} - -if (!is_callable('sodium_randombytes_random16')) { - /** - * @see ParagonIE_Sodium_Compat::randombytes_random16() - * @return int - * @throws Exception - */ - function sodium_randombytes_random16() - { - return ParagonIE_Sodium_Compat::randombytes_random16(); - } -} diff --git a/libs/sodium_compat/lib/php72compat_const.php b/libs/sodium_compat/lib/php72compat_const.php deleted file mode 100644 index 6a4247a..0000000 --- a/libs/sodium_compat/lib/php72compat_const.php +++ /dev/null @@ -1,90 +0,0 @@ ->= 8; - } - $val = ParagonIE_Sodium_Core_Util::intArrayToString($A); - } - - /** - * @param string $encoded - * @param int $variant - * @param string $ignore - * @return string - * @throws SodiumException - */ - public static function base642bin($encoded, $variant, $ignore = '') - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($encoded, 'string', 1); - - /** @var string $encoded */ - $encoded = (string) $encoded; - if (ParagonIE_Sodium_Core_Util::strlen($encoded) === 0) { - return ''; - } - - // Just strip before decoding - if (!empty($ignore)) { - $encoded = str_replace($ignore, '', $encoded); - } - - try { - switch ($variant) { - case self::BASE64_VARIANT_ORIGINAL: - return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, true); - case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: - return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, false); - case self::BASE64_VARIANT_URLSAFE: - return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, true); - case self::BASE64_VARIANT_URLSAFE_NO_PADDING: - return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, false); - default: - throw new SodiumException('invalid base64 variant identifier'); - } - } catch (Exception $ex) { - if ($ex instanceof SodiumException) { - throw $ex; - } - throw new SodiumException('invalid base64 string'); - } - } - - /** - * @param string $decoded - * @param int $variant - * @return string - * @throws SodiumException - */ - public static function bin2base64($decoded, $variant) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($decoded, 'string', 1); - /** @var string $decoded */ - $decoded = (string) $decoded; - if (ParagonIE_Sodium_Core_Util::strlen($decoded) === 0) { - return ''; - } - - switch ($variant) { - case self::BASE64_VARIANT_ORIGINAL: - return ParagonIE_Sodium_Core_Base64_Original::encode($decoded); - case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: - return ParagonIE_Sodium_Core_Base64_Original::encodeUnpadded($decoded); - case self::BASE64_VARIANT_URLSAFE: - return ParagonIE_Sodium_Core_Base64_UrlSafe::encode($decoded); - case self::BASE64_VARIANT_URLSAFE_NO_PADDING: - return ParagonIE_Sodium_Core_Base64_UrlSafe::encodeUnpadded($decoded); - default: - throw new SodiumException('invalid base64 variant identifier'); - } - } - - /** - * Cache-timing-safe implementation of bin2hex(). - * - * @param string $string A string (probably raw binary) - * @return string A hexadecimal-encoded string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function bin2hex($string) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); - - if (self::useNewSodiumAPI()) { - return (string) sodium_bin2hex($string); - } - if (self::use_fallback('bin2hex')) { - return (string) call_user_func('\\Sodium\\bin2hex', $string); - } - return ParagonIE_Sodium_Core_Util::bin2hex($string); - } - - /** - * Compare two strings, in constant-time. - * Compared to memcmp(), compare() is more useful for sorting. - * - * @param string $left The left operand; must be a string - * @param string $right The right operand; must be a string - * @return int If < 0 if the left operand is less than the right - * If = 0 if both strings are equal - * If > 0 if the right operand is less than the left - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function compare($left, $right) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); - - if (self::useNewSodiumAPI()) { - return (int) sodium_compare($left, $right); - } - if (self::use_fallback('compare')) { - return (int) call_user_func('\\Sodium\\compare', $left, $right); - } - return ParagonIE_Sodium_Core_Util::compare($left, $right); - } - - /** - * Is AES-256-GCM even available to use? - * - * @return bool - * @psalm-suppress UndefinedFunction - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_aead_aes256gcm_is_available() - { - if (self::useNewSodiumAPI()) { - return sodium_crypto_aead_aes256gcm_is_available(); - } - if (self::use_fallback('crypto_aead_aes256gcm_is_available')) { - return call_user_func('\\Sodium\\crypto_aead_aes256gcm_is_available'); - } - if (PHP_VERSION_ID < 70100) { - // OpenSSL doesn't support AEAD before 7.1.0 - return false; - } - if (!is_callable('openssl_encrypt') || !is_callable('openssl_decrypt')) { - // OpenSSL isn't installed - return false; - } - return (bool) in_array('aes-256-gcm', openssl_get_cipher_methods()); - } - - /** - * Authenticated Encryption with Associated Data: Decryption - * - * Algorithm: - * AES-256-GCM - * - * This mode uses a 64-bit random nonce with a 64-bit counter. - * IETF mode uses a 96-bit random nonce with a 32-bit counter. - * - * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 8 bytes - * @param string $key Encryption key - * - * @return string|bool The original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_aead_aes256gcm_decrypt( - $ciphertext = '', - $assocData = '', - $nonce = '', - $key = '' - ) { - if (!self::crypto_aead_aes256gcm_is_available()) { - throw new SodiumException('AES-256-GCM is not available'); - } - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_AES256GCM_ABYTES) { - throw new SodiumException('Message must be at least CRYPTO_AEAD_AES256GCM_ABYTES long'); - } - if (!is_callable('openssl_decrypt')) { - throw new SodiumException('The OpenSSL extension is not installed, or openssl_decrypt() is not available'); - } - - /** @var string $ctext */ - $ctext = ParagonIE_Sodium_Core_Util::substr($ciphertext, 0, -self::CRYPTO_AEAD_AES256GCM_ABYTES); - /** @var string $authTag */ - $authTag = ParagonIE_Sodium_Core_Util::substr($ciphertext, -self::CRYPTO_AEAD_AES256GCM_ABYTES, 16); - return openssl_decrypt( - $ctext, - 'aes-256-gcm', - $key, - OPENSSL_RAW_DATA, - $nonce, - $authTag, - $assocData - ); - } - - /** - * Authenticated Encryption with Associated Data: Encryption - * - * Algorithm: - * AES-256-GCM - * - * @param string $plaintext Message to be encrypted - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 8 bytes - * @param string $key Encryption key - * - * @return string Ciphertext with a 16-byte GCM message - * authentication code appended - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_aead_aes256gcm_encrypt( - $plaintext = '', - $assocData = '', - $nonce = '', - $key = '' - ) { - if (!self::crypto_aead_aes256gcm_is_available()) { - throw new SodiumException('AES-256-GCM is not available'); - } - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); - } - - if (!is_callable('openssl_encrypt')) { - throw new SodiumException('The OpenSSL extension is not installed, or openssl_encrypt() is not available'); - } - - $authTag = ''; - $ciphertext = openssl_encrypt( - $plaintext, - 'aes-256-gcm', - $key, - OPENSSL_RAW_DATA, - $nonce, - $authTag, - $assocData - ); - return $ciphertext . $authTag; - } - - /** - * Return a secure random key for use with the AES-256-GCM - * symmetric AEAD interface. - * - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_aead_aes256gcm_keygen() - { - return random_bytes(self::CRYPTO_AEAD_AES256GCM_KEYBYTES); - } - - /** - * Authenticated Encryption with Associated Data: Decryption - * - * Algorithm: - * ChaCha20-Poly1305 - * - * This mode uses a 64-bit random nonce with a 64-bit counter. - * IETF mode uses a 96-bit random nonce with a 32-bit counter. - * - * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 8 bytes - * @param string $key Encryption key - * - * @return string The original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_aead_chacha20poly1305_decrypt( - $ciphertext = '', - $assocData = '', - $nonce = '', - $key = '' - ) { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { - throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); - } - - if (self::useNewSodiumAPI()) { - /** - * @psalm-suppress InvalidReturnStatement - * @psalm-suppress FalsableReturnStatement - */ - return sodium_crypto_aead_chacha20poly1305_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - if (self::use_fallback('crypto_aead_chacha20poly1305_decrypt')) { - return call_user_func( - '\\Sodium\\crypto_aead_chacha20poly1305_decrypt', - $ciphertext, - $assocData, - $nonce, - $key - ); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - - /** - * Authenticated Encryption with Associated Data - * - * Algorithm: - * ChaCha20-Poly1305 - * - * This mode uses a 64-bit random nonce with a 64-bit counter. - * IETF mode uses a 96-bit random nonce with a 32-bit counter. - * - * @param string $plaintext Message to be encrypted - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 8 bytes - * @param string $key Encryption key - * - * @return string Ciphertext with a 16-byte Poly1305 message - * authentication code appended - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_aead_chacha20poly1305_encrypt( - $plaintext = '', - $assocData = '', - $nonce = '', - $key = '' - ) { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_aead_chacha20poly1305_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - if (self::use_fallback('crypto_aead_chacha20poly1305_encrypt')) { - return (string) call_user_func( - '\\Sodium\\crypto_aead_chacha20poly1305_encrypt', - $plaintext, - $assocData, - $nonce, - $key - ); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - - /** - * Authenticated Encryption with Associated Data: Decryption - * - * Algorithm: - * ChaCha20-Poly1305 - * - * IETF mode uses a 96-bit random nonce with a 32-bit counter. - * Regular mode uses a 64-bit random nonce with a 64-bit counter. - * - * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 12 bytes - * @param string $key Encryption key - * - * @return string The original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_aead_chacha20poly1305_ietf_decrypt( - $ciphertext = '', - $assocData = '', - $nonce = '', - $key = '' - ) { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { - throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); - } - - if (self::useNewSodiumAPI()) { - /** - * @psalm-suppress InvalidReturnStatement - * @psalm-suppress FalsableReturnStatement - */ - return sodium_crypto_aead_chacha20poly1305_ietf_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_decrypt')) { - return call_user_func( - '\\Sodium\\crypto_aead_chacha20poly1305_ietf_decrypt', - $ciphertext, - $assocData, - $nonce, - $key - ); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - - /** - * Return a secure random key for use with the ChaCha20-Poly1305 - * symmetric AEAD interface. - * - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_aead_chacha20poly1305_keygen() - { - return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES); - } - - /** - * Authenticated Encryption with Associated Data - * - * Algorithm: - * ChaCha20-Poly1305 - * - * IETF mode uses a 96-bit random nonce with a 32-bit counter. - * Regular mode uses a 64-bit random nonce with a 64-bit counter. - * - * @param string $plaintext Message to be encrypted - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 8 bytes - * @param string $key Encryption key - * - * @return string Ciphertext with a 16-byte Poly1305 message - * authentication code appended - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_aead_chacha20poly1305_ietf_encrypt( - $plaintext = '', - $assocData = '', - $nonce = '', - $key = '' - ) { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_aead_chacha20poly1305_ietf_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_encrypt')) { - return (string) call_user_func( - '\\Sodium\\crypto_aead_chacha20poly1305_ietf_encrypt', - $plaintext, - $assocData, - $nonce, - $key - ); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - - /** - * Return a secure random key for use with the ChaCha20-Poly1305 - * symmetric AEAD interface. (IETF version) - * - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_aead_chacha20poly1305_ietf_keygen() - { - return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES); - } - - /** - * Authenticated Encryption with Associated Data: Decryption - * - * Algorithm: - * XChaCha20-Poly1305 - * - * This mode uses a 64-bit random nonce with a 64-bit counter. - * IETF mode uses a 96-bit random nonce with a 32-bit counter. - * - * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 8 bytes - * @param string $key Encryption key - * @param bool $dontFallback Don't fallback to ext/sodium - * - * @return string|bool The original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_aead_xchacha20poly1305_ietf_decrypt( - $ciphertext = '', - $assocData = '', - $nonce = '', - $key = '', - $dontFallback = false - ) { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES) { - throw new SodiumException('Message must be at least CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES long'); - } - if (self::useNewSodiumAPI() && !$dontFallback) { - if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { - return sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - } - - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_decrypt( - $ciphertext, - $assocData, - $nonce, - $key - ); - } - - /** - * Authenticated Encryption with Associated Data - * - * Algorithm: - * XChaCha20-Poly1305 - * - * This mode uses a 64-bit random nonce with a 64-bit counter. - * IETF mode uses a 96-bit random nonce with a 32-bit counter. - * - * @param string $plaintext Message to be encrypted - * @param string $assocData Authenticated Associated Data (unencrypted) - * @param string $nonce Number to be used only Once; must be 8 bytes - * @param string $key Encryption key - * @param bool $dontFallback Don't fallback to ext/sodium - * - * @return string Ciphertext with a 16-byte Poly1305 message - * authentication code appended - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_aead_xchacha20poly1305_ietf_encrypt( - $plaintext = '', - $assocData = '', - $nonce = '', - $key = '', - $dontFallback = false - ) { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { - throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_NPUBBYTES long'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { - throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_KEYBYTES long'); - } - if (self::useNewSodiumAPI() && !$dontFallback) { - if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { - return sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - } - - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_encrypt( - $plaintext, - $assocData, - $nonce, - $key - ); - } - - /** - * Return a secure random key for use with the XChaCha20-Poly1305 - * symmetric AEAD interface. - * - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_aead_xchacha20poly1305_ietf_keygen() - { - return random_bytes(self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES); - } - - /** - * Authenticate a message. Uses symmetric-key cryptography. - * - * Algorithm: - * HMAC-SHA512-256. Which is HMAC-SHA-512 truncated to 256 bits. - * Not to be confused with HMAC-SHA-512/256 which would use the - * SHA-512/256 hash function (uses different initial parameters - * but still truncates to 256 bits to sidestep length-extension - * attacks). - * - * @param string $message Message to be authenticated - * @param string $key Symmetric authentication key - * @return string Message authentication code - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_auth($message, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_AUTH_KEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_auth($message, $key); - } - if (self::use_fallback('crypto_auth')) { - return (string) call_user_func('\\Sodium\\crypto_auth', $message, $key); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::auth($message, $key); - } - return ParagonIE_Sodium_Crypto::auth($message, $key); - } - - /** - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_auth_keygen() - { - return random_bytes(self::CRYPTO_AUTH_KEYBYTES); - } - - /** - * Verify the MAC of a message previously authenticated with crypto_auth. - * - * @param string $mac Message authentication code - * @param string $message Message whose authenticity you are attempting to - * verify (with a given MAC and key) - * @param string $key Symmetric authentication key - * @return bool TRUE if authenticated, FALSE otherwise - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_auth_verify($mac, $message, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($mac, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($mac) !== self::CRYPTO_AUTH_BYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_AUTH_BYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_AUTH_KEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (bool) sodium_crypto_auth_verify($mac, $message, $key); - } - if (self::use_fallback('crypto_auth_verify')) { - return (bool) call_user_func('\\Sodium\\crypto_auth_verify', $mac, $message, $key); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::auth_verify($mac, $message, $key); - } - return ParagonIE_Sodium_Crypto::auth_verify($mac, $message, $key); - } - - /** - * Authenticated asymmetric-key encryption. Both the sender and recipient - * may decrypt messages. - * - * Algorithm: X25519-XSalsa20-Poly1305. - * X25519: Elliptic-Curve Diffie Hellman over Curve25519. - * XSalsa20: Extended-nonce variant of salsa20. - * Poyl1305: Polynomial MAC for one-time message authentication. - * - * @param string $plaintext The message to be encrypted - * @param string $nonce A Number to only be used Once; must be 24 bytes - * @param string $keypair Your secret key and your recipient's public key - * @return string Ciphertext with 16-byte Poly1305 MAC - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_box($plaintext, $nonce, $keypair) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box($plaintext, $nonce, $keypair); - } - if (self::use_fallback('crypto_box')) { - return (string) call_user_func('\\Sodium\\crypto_box', $plaintext, $nonce, $keypair); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box($plaintext, $nonce, $keypair); - } - return ParagonIE_Sodium_Crypto::box($plaintext, $nonce, $keypair); - } - - /** - * Anonymous public-key encryption. Only the recipient may decrypt messages. - * - * Algorithm: X25519-XSalsa20-Poly1305, as with crypto_box. - * The sender's X25519 keypair is ephemeral. - * Nonce is generated from the BLAKE2b hash of both public keys. - * - * This provides ciphertext integrity. - * - * @param string $plaintext Message to be sealed - * @param string $publicKey Your recipient's public key - * @return string Sealed message that only your recipient can - * decrypt - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_box_seal($plaintext, $publicKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box_seal($plaintext, $publicKey); - } - if (self::use_fallback('crypto_box_seal')) { - return (string) call_user_func('\\Sodium\\crypto_box_seal', $plaintext, $publicKey); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_seal($plaintext, $publicKey); - } - return ParagonIE_Sodium_Crypto::box_seal($plaintext, $publicKey); - } - - /** - * Opens a message encrypted with crypto_box_seal(). Requires - * the recipient's keypair (sk || pk) to decrypt successfully. - * - * This validates ciphertext integrity. - * - * @param string $ciphertext Sealed message to be opened - * @param string $keypair Your crypto_box keypair - * @return string The original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_box_seal_open($ciphertext, $keypair) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - /** - * @psalm-suppress InvalidReturnStatement - * @psalm-suppress FalsableReturnStatement - */ - return sodium_crypto_box_seal_open($ciphertext, $keypair); - } - if (self::use_fallback('crypto_box_seal_open')) { - return call_user_func('\\Sodium\\crypto_box_seal_open', $ciphertext, $keypair); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_seal_open($ciphertext, $keypair); - } - return ParagonIE_Sodium_Crypto::box_seal_open($ciphertext, $keypair); - } - - /** - * Generate a new random X25519 keypair. - * - * @return string A 64-byte string; the first 32 are your secret key, while - * the last 32 are your public key. crypto_box_secretkey() - * and crypto_box_publickey() exist to separate them so you - * don't accidentally get them mixed up! - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_box_keypair() - { - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box_keypair(); - } - if (self::use_fallback('crypto_box_keypair')) { - return (string) call_user_func('\\Sodium\\crypto_box_keypair'); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_keypair(); - } - return ParagonIE_Sodium_Crypto::box_keypair(); - } - - /** - * Combine two keys into a keypair for use in library methods that expect - * a keypair. This doesn't necessarily have to be the same person's keys. - * - * @param string $secretKey Secret key - * @param string $publicKey Public key - * @return string Keypair - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); - } - if (self::use_fallback('crypto_box_keypair_from_secretkey_and_publickey')) { - return (string) call_user_func('\\Sodium\\crypto_box_keypair_from_secretkey_and_publickey', $secretKey, $publicKey); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); - } - return ParagonIE_Sodium_Crypto::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); - } - - /** - * Decrypt a message previously encrypted with crypto_box(). - * - * @param string $ciphertext Encrypted message - * @param string $nonce Number to only be used Once; must be 24 bytes - * @param string $keypair Your secret key and the sender's public key - * @return string The original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_box_open($ciphertext, $nonce, $keypair) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_BOX_MACBYTES) { - throw new SodiumException('Argument 1 must be at least CRYPTO_BOX_MACBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - /** - * @psalm-suppress InvalidReturnStatement - * @psalm-suppress FalsableReturnStatement - */ - return sodium_crypto_box_open($ciphertext, $nonce, $keypair); - } - if (self::use_fallback('crypto_box_open')) { - return call_user_func('\\Sodium\\crypto_box_open', $ciphertext, $nonce, $keypair); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_open($ciphertext, $nonce, $keypair); - } - return ParagonIE_Sodium_Crypto::box_open($ciphertext, $nonce, $keypair); - } - - /** - * Extract the public key from a crypto_box keypair. - * - * @param string $keypair Keypair containing secret and public key - * @return string Your crypto_box public key - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_box_publickey($keypair) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box_publickey($keypair); - } - if (self::use_fallback('crypto_box_publickey')) { - return (string) call_user_func('\\Sodium\\crypto_box_publickey', $keypair); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_publickey($keypair); - } - return ParagonIE_Sodium_Crypto::box_publickey($keypair); - } - - /** - * Calculate the X25519 public key from a given X25519 secret key. - * - * @param string $secretKey Any X25519 secret key - * @return string The corresponding X25519 public key - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_box_publickey_from_secretkey($secretKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box_publickey_from_secretkey($secretKey); - } - if (self::use_fallback('crypto_box_publickey_from_secretkey')) { - return (string) call_user_func('\\Sodium\\crypto_box_publickey_from_secretkey', $secretKey); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_publickey_from_secretkey($secretKey); - } - return ParagonIE_Sodium_Crypto::box_publickey_from_secretkey($secretKey); - } - - /** - * Extract the secret key from a crypto_box keypair. - * - * @param string $keypair - * @return string Your crypto_box secret key - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_box_secretkey($keypair) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box_secretkey($keypair); - } - if (self::use_fallback('crypto_box_secretkey')) { - return (string) call_user_func('\\Sodium\\crypto_box_secretkey', $keypair); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_secretkey($keypair); - } - return ParagonIE_Sodium_Crypto::box_secretkey($keypair); - } - - /** - * Generate an X25519 keypair from a seed. - * - * @param string $seed - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress UndefinedFunction - */ - public static function crypto_box_seed_keypair($seed) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_box_seed_keypair($seed); - } - if (self::use_fallback('crypto_box_seed_keypair')) { - return (string) call_user_func('\\Sodium\\crypto_box_seed_keypair', $seed); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::box_seed_keypair($seed); - } - return ParagonIE_Sodium_Crypto::box_seed_keypair($seed); - } - - /** - * Calculates a BLAKE2b hash, with an optional key. - * - * @param string $message The message to be hashed - * @param string|null $key If specified, must be a string between 16 - * and 64 bytes long - * @param int $length Output length in bytes; must be between 16 - * and 64 (default = 32) - * @return string Raw binary - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_generichash($message, $key = '', $length = self::CRYPTO_GENERICHASH_BYTES) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); - if (is_null($key)) { - $key = ''; - } - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 3); - - /* Input validation: */ - if (!empty($key)) { - if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { - throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { - throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); - } - } - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_generichash($message, $key, $length); - } - if (self::use_fallback('crypto_generichash')) { - return (string) call_user_func('\\Sodium\\crypto_generichash', $message, $key, $length); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::generichash($message, $key, $length); - } - return ParagonIE_Sodium_Crypto::generichash($message, $key, $length); - } - - /** - * Get the final BLAKE2b hash output for a given context. - * - * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). - * @param int $length Hash output size. - * @return string Final BLAKE2b hash. - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress ReferenceConstraintViolation - * @psalm-suppress ConflictingReferenceConstraint - */ - public static function crypto_generichash_final(&$ctx, $length = self::CRYPTO_GENERICHASH_BYTES) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); - - if (self::useNewSodiumAPI()) { - return sodium_crypto_generichash_final($ctx, $length); - } - if (self::use_fallback('crypto_generichash_final')) { - $func = '\\Sodium\\crypto_generichash_final'; - return (string) $func($ctx, $length); - } - if ($length < 1) { - try { - self::memzero($ctx); - } catch (SodiumException $ex) { - unset($ctx); - } - return ''; - } - if (PHP_INT_SIZE === 4) { - $result = ParagonIE_Sodium_Crypto32::generichash_final($ctx, $length); - } else { - $result = ParagonIE_Sodium_Crypto::generichash_final($ctx, $length); - } - try { - self::memzero($ctx); - } catch (SodiumException $ex) { - unset($ctx); - } - return $result; - } - - /** - * Initialize a BLAKE2b hashing context, for use in a streaming interface. - * - * @param string|null $key If specified must be a string between 16 and 64 bytes - * @param int $length The size of the desired hash output - * @return string A BLAKE2 hashing context, encoded as a string - * (To be 100% compatible with ext/libsodium) - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_generichash_init($key = '', $length = self::CRYPTO_GENERICHASH_BYTES) - { - /* Type checks: */ - if (is_null($key)) { - $key = ''; - } - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); - - /* Input validation: */ - if (!empty($key)) { - if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { - throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { - throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); - } - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_generichash_init($key, $length); - } - if (self::use_fallback('crypto_generichash_init')) { - return (string) call_user_func('\\Sodium\\crypto_generichash_init', $key, $length); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::generichash_init($key, $length); - } - return ParagonIE_Sodium_Crypto::generichash_init($key, $length); - } - - /** - * Initialize a BLAKE2b hashing context, for use in a streaming interface. - * - * @param string|null $key If specified must be a string between 16 and 64 bytes - * @param int $length The size of the desired hash output - * @param string $salt Salt (up to 16 bytes) - * @param string $personal Personalization string (up to 16 bytes) - * @return string A BLAKE2 hashing context, encoded as a string - * (To be 100% compatible with ext/libsodium) - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_generichash_init_salt_personal( - $key = '', - $length = self::CRYPTO_GENERICHASH_BYTES, - $salt = '', - $personal = '' - ) { - /* Type checks: */ - if (is_null($key)) { - $key = ''; - } - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($personal, 'string', 4); - $salt = str_pad($salt, 16, "\0", STR_PAD_RIGHT); - $personal = str_pad($personal, 16, "\0", STR_PAD_RIGHT); - - /* Input validation: */ - if (!empty($key)) { - /* - if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { - throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); - } - */ - if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { - throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); - } - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::generichash_init_salt_personal($key, $length, $salt, $personal); - } - return ParagonIE_Sodium_Crypto::generichash_init_salt_personal($key, $length, $salt, $personal); - } - - /** - * Update a BLAKE2b hashing context with additional data. - * - * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). - * $ctx is passed by reference and gets updated in-place. - * @param-out string $ctx - * @param string $message The message to append to the existing hash state. - * @return void - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress ReferenceConstraintViolation - */ - public static function crypto_generichash_update(&$ctx, $message) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); - - if (self::useNewSodiumAPI()) { - sodium_crypto_generichash_update($ctx, $message); - return; - } - if (self::use_fallback('crypto_generichash_update')) { - $func = '\\Sodium\\crypto_generichash_update'; - $func($ctx, $message); - return; - } - if (PHP_INT_SIZE === 4) { - $ctx = ParagonIE_Sodium_Crypto32::generichash_update($ctx, $message); - } else { - $ctx = ParagonIE_Sodium_Crypto::generichash_update($ctx, $message); - } - } - - /** - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_generichash_keygen() - { - return random_bytes(self::CRYPTO_GENERICHASH_KEYBYTES); - } - - /** - * @param int $subkey_len - * @param int $subkey_id - * @param string $context - * @param string $key - * @return string - * @throws SodiumException - */ - public static function crypto_kdf_derive_from_key( - $subkey_len, - $subkey_id, - $context, - $key - ) { - ParagonIE_Sodium_Core_Util::declareScalarType($subkey_len, 'int', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($subkey_id, 'int', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($context, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); - $subkey_id = (int) $subkey_id; - $subkey_len = (int) $subkey_len; - $context = (string) $context; - $key = (string) $key; - - if ($subkey_len < self::CRYPTO_KDF_BYTES_MIN) { - throw new SodiumException('subkey cannot be smaller than SODIUM_CRYPTO_KDF_BYTES_MIN'); - } - if ($subkey_len > self::CRYPTO_KDF_BYTES_MAX) { - throw new SodiumException('subkey cannot be larger than SODIUM_CRYPTO_KDF_BYTES_MAX'); - } - if ($subkey_id < 0) { - throw new SodiumException('subkey_id cannot be negative'); - } - if (ParagonIE_Sodium_Core_Util::strlen($context) !== self::CRYPTO_KDF_CONTEXTBYTES) { - throw new SodiumException('context should be SODIUM_CRYPTO_KDF_CONTEXTBYTES bytes'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_KDF_KEYBYTES) { - throw new SodiumException('key should be SODIUM_CRYPTO_KDF_KEYBYTES bytes'); - } - - $salt = ParagonIE_Sodium_Core_Util::store64_le($subkey_id); - $state = self::crypto_generichash_init_salt_personal( - $key, - $subkey_len, - $salt, - $context - ); - return self::crypto_generichash_final($state, $subkey_len); - } - - /** - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_kdf_keygen() - { - return random_bytes(self::CRYPTO_KDF_KEYBYTES); - } - - /** - * Perform a key exchange, between a designated client and a server. - * - * Typically, you would designate one machine to be the client and the - * other to be the server. The first two keys are what you'd expect for - * scalarmult() below, but the latter two public keys don't swap places. - * - * | ALICE | BOB | - * | Client | Server | - * |--------------------------------|-------------------------------------| - * | shared = crypto_kx( | shared = crypto_kx( | - * | alice_sk, | bob_sk, | <- contextual - * | bob_pk, | alice_pk, | <- contextual - * | alice_pk, | alice_pk, | <----- static - * | bob_pk | bob_pk | <----- static - * | ) | ) | - * - * They are used along with the scalarmult product to generate a 256-bit - * BLAKE2b hash unique to the client and server keys. - * - * @param string $my_secret - * @param string $their_public - * @param string $client_public - * @param string $server_public - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_kx($my_secret, $their_public, $client_public, $server_public) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($my_secret, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($their_public, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($client_public, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($server_public, 'string', 4); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($my_secret) !== self::CRYPTO_BOX_SECRETKEYBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($their_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($client_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($server_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { - throw new SodiumException('Argument 4 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - if (is_callable('sodium_crypto_kx')) { - return (string) sodium_crypto_kx( - $my_secret, - $their_public, - $client_public, - $server_public - ); - } - } - if (self::use_fallback('crypto_kx')) { - return (string) call_user_func( - '\\Sodium\\crypto_kx', - $my_secret, - $their_public, - $client_public, - $server_public - ); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::keyExchange( - $my_secret, - $their_public, - $client_public, - $server_public - ); - } - return ParagonIE_Sodium_Crypto::keyExchange( - $my_secret, - $their_public, - $client_public, - $server_public - ); - } - - /** - * @param string $seed - * @return string - * @throws SodiumException - */ - public static function crypto_kx_seed_keypair($seed) - { - ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); - - $seed = (string) $seed; - - if (ParagonIE_Sodium_Core_Util::strlen($seed) !== self::CRYPTO_KX_SEEDBYTES) { - throw new SodiumException('seed must be SODIUM_CRYPTO_KX_SEEDBYTES bytes'); - } - - $sk = self::crypto_generichash($seed, '', self::CRYPTO_KX_SECRETKEYBYTES); - $pk = self::crypto_scalarmult_base($sk); - return $sk . $pk; - } - - /** - * @return string - * @throws Exception - */ - public static function crypto_kx_keypair() - { - $sk = self::randombytes_buf(self::CRYPTO_KX_SECRETKEYBYTES); - $pk = self::crypto_scalarmult_base($sk); - return $sk . $pk; - } - - /** - * @param string $keypair - * @param string $serverPublicKey - * @return array{0: string, 1: string} - * @throws SodiumException - */ - public static function crypto_kx_client_session_keys($keypair, $serverPublicKey) - { - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($serverPublicKey, 'string', 2); - - $keypair = (string) $keypair; - $serverPublicKey = (string) $serverPublicKey; - - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { - throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); - } - if (ParagonIE_Sodium_Core_Util::strlen($serverPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { - throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); - } - - $sk = self::crypto_kx_secretkey($keypair); - $pk = self::crypto_kx_publickey($keypair); - $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); - self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $serverPublicKey)); - self::crypto_generichash_update($h, $pk); - self::crypto_generichash_update($h, $serverPublicKey); - $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); - return array( - ParagonIE_Sodium_Core_Util::substr( - $sessionKeys, - 0, - self::CRYPTO_KX_SESSIONKEYBYTES - ), - ParagonIE_Sodium_Core_Util::substr( - $sessionKeys, - self::CRYPTO_KX_SESSIONKEYBYTES, - self::CRYPTO_KX_SESSIONKEYBYTES - ) - ); - } - - /** - * @param string $keypair - * @param string $clientPublicKey - * @return array{0: string, 1: string} - * @throws SodiumException - */ - public static function crypto_kx_server_session_keys($keypair, $clientPublicKey) - { - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($clientPublicKey, 'string', 2); - - $keypair = (string) $keypair; - $clientPublicKey = (string) $clientPublicKey; - - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { - throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); - } - if (ParagonIE_Sodium_Core_Util::strlen($clientPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { - throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); - } - - $sk = self::crypto_kx_secretkey($keypair); - $pk = self::crypto_kx_publickey($keypair); - $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); - self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $clientPublicKey)); - self::crypto_generichash_update($h, $clientPublicKey); - self::crypto_generichash_update($h, $pk); - $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); - return array( - ParagonIE_Sodium_Core_Util::substr( - $sessionKeys, - self::CRYPTO_KX_SESSIONKEYBYTES, - self::CRYPTO_KX_SESSIONKEYBYTES - ), - ParagonIE_Sodium_Core_Util::substr( - $sessionKeys, - 0, - self::CRYPTO_KX_SESSIONKEYBYTES - ) - ); - } - - /** - * @param string $kp - * @return string - * @throws SodiumException - */ - public static function crypto_kx_secretkey($kp) - { - return ParagonIE_Sodium_Core_Util::substr( - $kp, - 0, - self::CRYPTO_KX_SECRETKEYBYTES - ); - } - - /** - * @param string $kp - * @return string - * @throws SodiumException - */ - public static function crypto_kx_publickey($kp) - { - return ParagonIE_Sodium_Core_Util::substr( - $kp, - self::CRYPTO_KX_SECRETKEYBYTES, - self::CRYPTO_KX_PUBLICKEYBYTES - ); - } - - /** - * @param int $outlen - * @param string $passwd - * @param string $salt - * @param int $opslimit - * @param int $memlimit - * @param int|null $alg - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg = null) - { - ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); - ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); - - if (self::useNewSodiumAPI()) { - if (!is_null($alg)) { - ParagonIE_Sodium_Core_Util::declareScalarType($alg, 'int', 6); - return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg); - } - return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit); - } - if (self::use_fallback('crypto_pwhash')) { - return (string) call_user_func('\\Sodium\\crypto_pwhash', $outlen, $passwd, $salt, $opslimit, $memlimit); - } - // This is the best we can do. - throw new SodiumException( - 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' - ); - } - - /** - * !Exclusive to sodium_compat! - * - * This returns TRUE if the native crypto_pwhash API is available by libsodium. - * This returns FALSE if only sodium_compat is available. - * - * @return bool - */ - public static function crypto_pwhash_is_available() - { - if (self::useNewSodiumAPI()) { - return true; - } - if (self::use_fallback('crypto_pwhash')) { - return true; - } - return false; - } - - /** - * @param string $passwd - * @param int $opslimit - * @param int $memlimit - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_pwhash_str($passwd, $opslimit, $memlimit) - { - ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); - - if (self::useNewSodiumAPI()) { - return sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit); - } - if (self::use_fallback('crypto_pwhash_str')) { - return (string) call_user_func('\\Sodium\\crypto_pwhash_str', $passwd, $opslimit, $memlimit); - } - // This is the best we can do. - throw new SodiumException( - 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' - ); - } - - /** - * Do we need to rehash this password? - * - * @param string $hash - * @param int $opslimit - * @param int $memlimit - * @return bool - * @throws SodiumException - */ - public static function crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit) - { - ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); - - // Just grab the first 4 pieces. - $pieces = explode('$', (string) $hash); - $prefix = implode('$', array_slice($pieces, 0, 4)); - - // Rebuild the expected header. - /** @var int $ops */ - $ops = (int) $opslimit; - /** @var int $mem */ - $mem = (int) $memlimit >> 10; - $encoded = self::CRYPTO_PWHASH_STRPREFIX . 'v=19$m=' . $mem . ',t=' . $ops . ',p=1'; - - // Do they match? If so, we don't need to rehash, so return false. - return !ParagonIE_Sodium_Core_Util::hashEquals($encoded, $prefix); - } - - /** - * @param string $passwd - * @param string $hash - * @return bool - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_pwhash_str_verify($passwd, $hash) - { - ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); - - if (self::useNewSodiumAPI()) { - return (bool) sodium_crypto_pwhash_str_verify($passwd, $hash); - } - if (self::use_fallback('crypto_pwhash_str_verify')) { - return (bool) call_user_func('\\Sodium\\crypto_pwhash_str_verify', $passwd, $hash); - } - // This is the best we can do. - throw new SodiumException( - 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' - ); - } - - /** - * @param int $outlen - * @param string $passwd - * @param string $salt - * @param int $opslimit - * @param int $memlimit - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit) - { - ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); - ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); - ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_pwhash_scryptsalsa208sha256( - (int) $outlen, - (string) $passwd, - (string) $salt, - (int) $opslimit, - (int) $memlimit - ); - } - if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { - return (string) call_user_func( - '\\Sodium\\crypto_pwhash_scryptsalsa208sha256', - (int) $outlen, - (string) $passwd, - (string) $salt, - (int) $opslimit, - (int) $memlimit - ); - } - // This is the best we can do. - throw new SodiumException( - 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' - ); - } - - /** - * !Exclusive to sodium_compat! - * - * This returns TRUE if the native crypto_pwhash API is available by libsodium. - * This returns FALSE if only sodium_compat is available. - * - * @return bool - */ - public static function crypto_pwhash_scryptsalsa208sha256_is_available() - { - if (self::useNewSodiumAPI()) { - return true; - } - if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { - return true; - } - return false; - } - - /** - * @param string $passwd - * @param int $opslimit - * @param int $memlimit - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit) - { - ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); - - if (self::useNewSodiumAPI()) { - return (string) sodium_crypto_pwhash_scryptsalsa208sha256_str( - (string) $passwd, - (int) $opslimit, - (int) $memlimit - ); - } - if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str')) { - return (string) call_user_func( - '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str', - (string) $passwd, - (int) $opslimit, - (int) $memlimit - ); - } - // This is the best we can do. - throw new SodiumException( - 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' - ); - } - - /** - * @param string $passwd - * @param string $hash - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash) - { - ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); - - if (self::useNewSodiumAPI()) { - return (bool) sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( - (string) $passwd, - (string) $hash - ); - } - if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str_verify')) { - return (bool) call_user_func( - '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify', - (string) $passwd, - (string) $hash - ); - } - // This is the best we can do. - throw new SodiumException( - 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' - ); - } - - /** - * Calculate the shared secret between your secret key and your - * recipient's public key. - * - * Algorithm: X25519 (ECDH over Curve25519) - * - * @param string $secretKey - * @param string $publicKey - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_scalarmult($secretKey, $publicKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_scalarmult($secretKey, $publicKey); - } - if (self::use_fallback('crypto_scalarmult')) { - return (string) call_user_func('\\Sodium\\crypto_scalarmult', $secretKey, $publicKey); - } - - /* Output validation: Forbid all-zero keys */ - if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { - throw new SodiumException('Zero secret key is not allowed'); - } - if (ParagonIE_Sodium_Core_Util::hashEquals($publicKey, str_repeat("\0", self::CRYPTO_BOX_PUBLICKEYBYTES))) { - throw new SodiumException('Zero public key is not allowed'); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::scalarmult($secretKey, $publicKey); - } - return ParagonIE_Sodium_Crypto::scalarmult($secretKey, $publicKey); - } - - /** - * Calculate an X25519 public key from an X25519 secret key. - * - * @param string $secretKey - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress TooFewArguments - * @psalm-suppress MixedArgument - */ - public static function crypto_scalarmult_base($secretKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_scalarmult_base($secretKey); - } - if (self::use_fallback('crypto_scalarmult_base')) { - return (string) call_user_func('\\Sodium\\crypto_scalarmult_base', $secretKey); - } - if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { - throw new SodiumException('Zero secret key is not allowed'); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::scalarmult_base($secretKey); - } - return ParagonIE_Sodium_Crypto::scalarmult_base($secretKey); - } - - /** - * Authenticated symmetric-key encryption. - * - * Algorithm: XSalsa20-Poly1305 - * - * @param string $plaintext The message you're encrypting - * @param string $nonce A Number to be used Once; must be 24 bytes - * @param string $key Symmetric encryption key - * @return string Ciphertext with Poly1305 MAC - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_secretbox($plaintext, $nonce, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_secretbox($plaintext, $nonce, $key); - } - if (self::use_fallback('crypto_secretbox')) { - return (string) call_user_func('\\Sodium\\crypto_secretbox', $plaintext, $nonce, $key); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretbox($plaintext, $nonce, $key); - } - return ParagonIE_Sodium_Crypto::secretbox($plaintext, $nonce, $key); - } - - /** - * Decrypts a message previously encrypted with crypto_secretbox(). - * - * @param string $ciphertext Ciphertext with Poly1305 MAC - * @param string $nonce A Number to be used Once; must be 24 bytes - * @param string $key Symmetric encryption key - * @return string Original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_secretbox_open($ciphertext, $nonce, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - /** - * @psalm-suppress InvalidReturnStatement - * @psalm-suppress FalsableReturnStatement - */ - return sodium_crypto_secretbox_open($ciphertext, $nonce, $key); - } - if (self::use_fallback('crypto_secretbox_open')) { - return call_user_func('\\Sodium\\crypto_secretbox_open', $ciphertext, $nonce, $key); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretbox_open($ciphertext, $nonce, $key); - } - return ParagonIE_Sodium_Crypto::secretbox_open($ciphertext, $nonce, $key); - } - - /** - * Return a secure random key for use with crypto_secretbox - * - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_secretbox_keygen() - { - return random_bytes(self::CRYPTO_SECRETBOX_KEYBYTES); - } - - /** - * Authenticated symmetric-key encryption. - * - * Algorithm: XChaCha20-Poly1305 - * - * @param string $plaintext The message you're encrypting - * @param string $nonce A Number to be used Once; must be 24 bytes - * @param string $key Symmetric encryption key - * @return string Ciphertext with Poly1305 MAC - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_secretbox_xchacha20poly1305($plaintext, $nonce, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305($plaintext, $nonce, $key); - } - return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305($plaintext, $nonce, $key); - } - /** - * Decrypts a message previously encrypted with crypto_secretbox_xchacha20poly1305(). - * - * @param string $ciphertext Ciphertext with Poly1305 MAC - * @param string $nonce A Number to be used Once; must be 24 bytes - * @param string $key Symmetric encryption key - * @return string Original plaintext message - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); - } - - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); - } - return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); - } - - /** - * @param string $key - * @return array Returns a state and a header. - * @throws Exception - * @throws SodiumException - */ - public static function crypto_secretstream_xchacha20poly1305_init_push($key) - { - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_push($key); - } - return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_push($key); - } - - /** - * @param string $header - * @param string $key - * @return string Returns a state. - * @throws Exception - */ - public static function crypto_secretstream_xchacha20poly1305_init_pull($header, $key) - { - if (ParagonIE_Sodium_Core_Util::strlen($header) < self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES) { - throw new SodiumException( - 'header size should be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES bytes' - ); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_pull($key, $header); - } - return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_pull($key, $header); - } - - /** - * @param string $state - * @param string $msg - * @param string $aad - * @param int $tag - * @return string - * @throws SodiumException - */ - public static function crypto_secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) - { - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_push( - $state, - $msg, - $aad, - $tag - ); - } - return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_push( - $state, - $msg, - $aad, - $tag - ); - } - - /** - * @param string $state - * @param string $msg - * @param string $aad - * @return bool|array{0: string, 1: int} - * @throws SodiumException - */ - public static function crypto_secretstream_xchacha20poly1305_pull(&$state, $msg, $aad = '') - { - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_pull( - $state, - $msg, - $aad - ); - } - return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_pull( - $state, - $msg, - $aad - ); - } - - /** - * @return string - * @throws Exception - */ - public static function crypto_secretstream_xchacha20poly1305_keygen() - { - return random_bytes(self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES); - } - - /** - * @param string $state - * @return void - * @throws SodiumException - */ - public static function crypto_secretstream_xchacha20poly1305_rekey(&$state) - { - if (PHP_INT_SIZE === 4) { - ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_rekey($state); - } else { - ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_rekey($state); - } - } - - /** - * Calculates a SipHash-2-4 hash of a message for a given key. - * - * @param string $message Input message - * @param string $key SipHash-2-4 key - * @return string Hash - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_shorthash($message, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SHORTHASH_KEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SHORTHASH_KEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_shorthash($message, $key); - } - if (self::use_fallback('crypto_shorthash')) { - return (string) call_user_func('\\Sodium\\crypto_shorthash', $message, $key); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_SipHash::sipHash24($message, $key); - } - return ParagonIE_Sodium_Core_SipHash::sipHash24($message, $key); - } - - /** - * Return a secure random key for use with crypto_shorthash - * - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_shorthash_keygen() - { - return random_bytes(self::CRYPTO_SHORTHASH_KEYBYTES); - } - - /** - * Returns a signed message. You probably want crypto_sign_detached() - * instead, which only returns the signature. - * - * Algorithm: Ed25519 (EdDSA over Curve25519) - * - * @param string $message Message to be signed. - * @param string $secretKey Secret signing key. - * @return string Signed message (signature is prefixed). - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_sign($message, $secretKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign($message, $secretKey); - } - if (self::use_fallback('crypto_sign')) { - return (string) call_user_func('\\Sodium\\crypto_sign', $message, $secretKey); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::sign($message, $secretKey); - } - return ParagonIE_Sodium_Crypto::sign($message, $secretKey); - } - - /** - * Validates a signed message then returns the message. - * - * @param string $signedMessage A signed message - * @param string $publicKey A public key - * @return string The original message (if the signature is - * valid for this public key) - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public static function crypto_sign_open($signedMessage, $publicKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($signedMessage, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($signedMessage) < self::CRYPTO_SIGN_BYTES) { - throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_BYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - /** - * @psalm-suppress InvalidReturnStatement - * @psalm-suppress FalsableReturnStatement - */ - return sodium_crypto_sign_open($signedMessage, $publicKey); - } - if (self::use_fallback('crypto_sign_open')) { - return call_user_func('\\Sodium\\crypto_sign_open', $signedMessage, $publicKey); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::sign_open($signedMessage, $publicKey); - } - return ParagonIE_Sodium_Crypto::sign_open($signedMessage, $publicKey); - } - - /** - * Generate a new random Ed25519 keypair. - * - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_sign_keypair() - { - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_keypair(); - } - if (self::use_fallback('crypto_sign_keypair')) { - return (string) call_user_func('\\Sodium\\crypto_sign_keypair'); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_Ed25519::keypair(); - } - return ParagonIE_Sodium_Core_Ed25519::keypair(); - } - - /** - * @param string $sk - * @param string $pk - * @return string - * @throws SodiumException - */ - public static function crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk) - { - ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); - $sk = (string) $sk; - $pk = (string) $pk; - - if (ParagonIE_Sodium_Core_Util::strlen($sk) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { - throw new SodiumException('secretkey should be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes'); - } - if (ParagonIE_Sodium_Core_Util::strlen($pk) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { - throw new SodiumException('publickey should be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk); - } - return $sk . $pk; - } - - /** - * Generate an Ed25519 keypair from a seed. - * - * @param string $seed Input seed - * @return string Keypair - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_seed_keypair($seed) - { - ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_seed_keypair($seed); - } - if (self::use_fallback('crypto_sign_keypair')) { - return (string) call_user_func('\\Sodium\\crypto_sign_seed_keypair', $seed); - } - $publicKey = ''; - $secretKey = ''; - if (PHP_INT_SIZE === 4) { - ParagonIE_Sodium_Core32_Ed25519::seed_keypair($publicKey, $secretKey, $seed); - } else { - ParagonIE_Sodium_Core_Ed25519::seed_keypair($publicKey, $secretKey, $seed); - } - return $secretKey . $publicKey; - } - - /** - * Extract an Ed25519 public key from an Ed25519 keypair. - * - * @param string $keypair Keypair - * @return string Public key - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_publickey($keypair) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_publickey($keypair); - } - if (self::use_fallback('crypto_sign_publickey')) { - return (string) call_user_func('\\Sodium\\crypto_sign_publickey', $keypair); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_Ed25519::publickey($keypair); - } - return ParagonIE_Sodium_Core_Ed25519::publickey($keypair); - } - - /** - * Calculate an Ed25519 public key from an Ed25519 secret key. - * - * @param string $secretKey Your Ed25519 secret key - * @return string The corresponding Ed25519 public key - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_publickey_from_secretkey($secretKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_publickey_from_secretkey($secretKey); - } - if (self::use_fallback('crypto_sign_publickey_from_secretkey')) { - return (string) call_user_func('\\Sodium\\crypto_sign_publickey_from_secretkey', $secretKey); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_Ed25519::publickey_from_secretkey($secretKey); - } - return ParagonIE_Sodium_Core_Ed25519::publickey_from_secretkey($secretKey); - } - - /** - * Extract an Ed25519 secret key from an Ed25519 keypair. - * - * @param string $keypair Keypair - * @return string Secret key - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_secretkey($keypair) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_secretkey($keypair); - } - if (self::use_fallback('crypto_sign_secretkey')) { - return (string) call_user_func('\\Sodium\\crypto_sign_secretkey', $keypair); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_Ed25519::secretkey($keypair); - } - return ParagonIE_Sodium_Core_Ed25519::secretkey($keypair); - } - - /** - * Calculate the Ed25519 signature of a message and return ONLY the signature. - * - * Algorithm: Ed25519 (EdDSA over Curve25519) - * - * @param string $message Message to be signed - * @param string $secretKey Secret signing key - * @return string Digital signature - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_detached($message, $secretKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_detached($message, $secretKey); - } - if (self::use_fallback('crypto_sign_detached')) { - return (string) call_user_func('\\Sodium\\crypto_sign_detached', $message, $secretKey); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::sign_detached($message, $secretKey); - } - return ParagonIE_Sodium_Crypto::sign_detached($message, $secretKey); - } - - /** - * Verify the Ed25519 signature of a message. - * - * @param string $signature Digital sginature - * @param string $message Message to be verified - * @param string $publicKey Public key - * @return bool TRUE if this signature is good for this public key; - * FALSE otherwise - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_verify_detached($signature, $message, $publicKey) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($signature, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($signature) !== self::CRYPTO_SIGN_BYTES) { - throw new SodiumException('Argument 1 must be CRYPTO_SIGN_BYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_sign_verify_detached($signature, $message, $publicKey); - } - if (self::use_fallback('crypto_sign_verify_detached')) { - return (bool) call_user_func( - '\\Sodium\\crypto_sign_verify_detached', - $signature, - $message, - $publicKey - ); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Crypto32::sign_verify_detached($signature, $message, $publicKey); - } - return ParagonIE_Sodium_Crypto::sign_verify_detached($signature, $message, $publicKey); - } - - /** - * Convert an Ed25519 public key to a Curve25519 public key - * - * @param string $pk - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_ed25519_pk_to_curve25519($pk) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($pk) < self::CRYPTO_SIGN_PUBLICKEYBYTES) { - throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_PUBLICKEYBYTES long.'); - } - if (self::useNewSodiumAPI()) { - if (is_callable('crypto_sign_ed25519_pk_to_curve25519')) { - return (string) sodium_crypto_sign_ed25519_pk_to_curve25519($pk); - } - } - if (self::use_fallback('crypto_sign_ed25519_pk_to_curve25519')) { - return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_pk_to_curve25519', $pk); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_Ed25519::pk_to_curve25519($pk); - } - return ParagonIE_Sodium_Core_Ed25519::pk_to_curve25519($pk); - } - - /** - * Convert an Ed25519 secret key to a Curve25519 secret key - * - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_sign_ed25519_sk_to_curve25519($sk) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($sk) < self::CRYPTO_SIGN_SEEDBYTES) { - throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_SEEDBYTES long.'); - } - if (self::useNewSodiumAPI()) { - if (is_callable('crypto_sign_ed25519_sk_to_curve25519')) { - return sodium_crypto_sign_ed25519_sk_to_curve25519($sk); - } - } - if (self::use_fallback('crypto_sign_ed25519_sk_to_curve25519')) { - return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_sk_to_curve25519', $sk); - } - - $h = hash('sha512', ParagonIE_Sodium_Core_Util::substr($sk, 0, 32), true); - $h[0] = ParagonIE_Sodium_Core_Util::intToChr( - ParagonIE_Sodium_Core_Util::chrToInt($h[0]) & 248 - ); - $h[31] = ParagonIE_Sodium_Core_Util::intToChr( - (ParagonIE_Sodium_Core_Util::chrToInt($h[31]) & 127) | 64 - ); - return ParagonIE_Sodium_Core_Util::substr($h, 0, 32); - } - - /** - * Expand a key and nonce into a keystream of pseudorandom bytes. - * - * @param int $len Number of bytes desired - * @param string $nonce Number to be used Once; must be 24 bytes - * @param string $key XSalsa20 key - * @return string Pseudorandom stream that can be XORed with messages - * to provide encryption (but not authentication; see - * Poly1305 or crypto_auth() for that, which is not - * optional for security) - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_stream($len, $nonce, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_STREAM_KEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_stream($len, $nonce, $key); - } - if (self::use_fallback('crypto_stream')) { - return (string) call_user_func('\\Sodium\\crypto_stream', $len, $nonce, $key); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20($len, $nonce, $key); - } - return ParagonIE_Sodium_Core_XSalsa20::xsalsa20($len, $nonce, $key); - } - - /** - * DANGER! UNAUTHENTICATED ENCRYPTION! - * - * Unless you are following expert advice, do not used this feature. - * - * Algorithm: XSalsa20 - * - * This DOES NOT provide ciphertext integrity. - * - * @param string $message Plaintext message - * @param string $nonce Number to be used Once; must be 24 bytes - * @param string $key Encryption key - * @return string Encrypted text which is vulnerable to chosen- - * ciphertext attacks unless you implement some - * other mitigation to the ciphertext (i.e. - * Encrypt then MAC) - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function crypto_stream_xor($message, $nonce, $key) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); - ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); - - /* Input validation: */ - if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { - throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); - } - if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { - throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); - } - - if (self::useNewSodiumAPI()) { - return sodium_crypto_stream_xor($message, $nonce, $key); - } - if (self::use_fallback('crypto_stream_xor')) { - return (string) call_user_func('\\Sodium\\crypto_stream_xor', $message, $nonce, $key); - } - if (PHP_INT_SIZE === 4) { - return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20_xor($message, $nonce, $key); - } - return ParagonIE_Sodium_Core_XSalsa20::xsalsa20_xor($message, $nonce, $key); - } - - /** - * Return a secure random key for use with crypto_stream - * - * @return string - * @throws Exception - * @throws Error - */ - public static function crypto_stream_keygen() - { - return random_bytes(self::CRYPTO_STREAM_KEYBYTES); - } - - /** - * Cache-timing-safe implementation of hex2bin(). - * - * @param string $string Hexadecimal string - * @return string Raw binary string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress TooFewArguments - * @psalm-suppress MixedArgument - */ - public static function hex2bin($string) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); - - if (self::useNewSodiumAPI()) { - if (is_callable('sodium_hex2bin')) { - return (string) sodium_hex2bin($string); - } - } - if (self::use_fallback('hex2bin')) { - return (string) call_user_func('\\Sodium\\hex2bin', $string); - } - return ParagonIE_Sodium_Core_Util::hex2bin($string); - } - - /** - * Increase a string (little endian) - * - * @param string $var - * - * @return void - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function increment(&$var) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); - - if (self::useNewSodiumAPI()) { - sodium_increment($var); - return; - } - if (self::use_fallback('increment')) { - $func = '\\Sodium\\increment'; - $func($var); - return; - } - - $len = ParagonIE_Sodium_Core_Util::strlen($var); - $c = 1; - $copy = ''; - for ($i = 0; $i < $len; ++$i) { - $c += ParagonIE_Sodium_Core_Util::chrToInt( - ParagonIE_Sodium_Core_Util::substr($var, $i, 1) - ); - $copy .= ParagonIE_Sodium_Core_Util::intToChr($c); - $c >>= 8; - } - $var = $copy; - } - - /** - * The equivalent to the libsodium minor version we aim to be compatible - * with (sans pwhash and memzero). - * - * @return int - */ - public static function library_version_major() - { - if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MAJOR_VERSION')) { - return SODIUM_LIBRARY_MAJOR_VERSION; - } - if (self::use_fallback('library_version_major')) { - /** @psalm-suppress UndefinedFunction */ - return (int) call_user_func('\\Sodium\\library_version_major'); - } - return self::LIBRARY_VERSION_MAJOR; - } - - /** - * The equivalent to the libsodium minor version we aim to be compatible - * with (sans pwhash and memzero). - * - * @return int - */ - public static function library_version_minor() - { - if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MINOR_VERSION')) { - return SODIUM_LIBRARY_MINOR_VERSION; - } - if (self::use_fallback('library_version_minor')) { - /** @psalm-suppress UndefinedFunction */ - return (int) call_user_func('\\Sodium\\library_version_minor'); - } - return self::LIBRARY_VERSION_MINOR; - } - - /** - * Compare two strings. - * - * @param string $left - * @param string $right - * @return int - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - */ - public static function memcmp($left, $right) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); - - if (self::useNewSodiumAPI()) { - return sodium_memcmp($left, $right); - } - if (self::use_fallback('memcmp')) { - return (int) call_user_func('\\Sodium\\memcmp', $left, $right); - } - /** @var string $left */ - /** @var string $right */ - return ParagonIE_Sodium_Core_Util::memcmp($left, $right); - } - - /** - * It's actually not possible to zero memory buffers in PHP. You need the - * native library for that. - * - * @param string|null $var - * @param-out string|null $var - * - * @return void - * @throws SodiumException (Unless libsodium is installed) - * @throws TypeError - * @psalm-suppress TooFewArguments - */ - public static function memzero(&$var) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); - - if (self::useNewSodiumAPI()) { - /** @psalm-suppress MixedArgument */ - sodium_memzero($var); - return; - } - if (self::use_fallback('memzero')) { - $func = '\\Sodium\\memzero'; - $func($var); - if ($var === null) { - return; - } - } - // This is the best we can do. - throw new SodiumException( - 'This is not implemented in sodium_compat, as it is not possible to securely wipe memory from PHP. ' . - 'To fix this error, make sure libsodium is installed and the PHP extension is enabled.' - ); - } - - /** - * @param string $unpadded - * @param int $blockSize - * @param bool $dontFallback - * @return string - * @throws SodiumException - */ - public static function pad($unpadded, $blockSize, $dontFallback = false) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($unpadded, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); - - $unpadded = (string) $unpadded; - $blockSize = (int) $blockSize; - - if (self::useNewSodiumAPI() && !$dontFallback) { - return (string) sodium_pad($unpadded, $blockSize); - } - - if ($blockSize <= 0) { - throw new SodiumException( - 'block size cannot be less than 1' - ); - } - $unpadded_len = ParagonIE_Sodium_Core_Util::strlen($unpadded); - $xpadlen = ($blockSize - 1); - if (($blockSize & ($blockSize - 1)) === 0) { - $xpadlen -= $unpadded_len & ($blockSize - 1); - } else { - $xpadlen -= $unpadded_len % $blockSize; - } - - $xpadded_len = $unpadded_len + $xpadlen; - $padded = str_repeat("\0", $xpadded_len - 1); - if ($unpadded_len > 0) { - $st = 1; - $i = 0; - $k = $unpadded_len; - for ($j = 0; $j <= $xpadded_len; ++$j) { - $i = (int) $i; - $k = (int) $k; - $st = (int) $st; - if ($j >= $unpadded_len) { - $padded[$j] = "\0"; - } else { - $padded[$j] = $unpadded[$j]; - } - /** @var int $k */ - $k -= $st; - $st = (int) (~( - ( - ( - ($k >> 48) - | - ($k >> 32) - | - ($k >> 16) - | - $k - ) - 1 - ) >> 16 - ) - ) & 1; - $i += $st; - } - } - - $mask = 0; - $tail = $xpadded_len; - for ($i = 0; $i < $blockSize; ++$i) { - # barrier_mask = (unsigned char) - # (((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT)); - $barrier_mask = (($i ^ $xpadlen) -1) >> ((PHP_INT_SIZE << 3) - 1); - # tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask); - $padded[$tail - $i] = ParagonIE_Sodium_Core_Util::intToChr( - (ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]) & $mask) - | - (0x80 & $barrier_mask) - ); - # mask |= barrier_mask; - $mask |= $barrier_mask; - } - return $padded; - } - - /** - * @param string $padded - * @param int $blockSize - * @param bool $dontFallback - * @return string - * @throws SodiumException - */ - public static function unpad($padded, $blockSize, $dontFallback = false) - { - /* Type checks: */ - ParagonIE_Sodium_Core_Util::declareScalarType($padded, 'string', 1); - ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); - - $padded = (string) $padded; - $blockSize = (int) $blockSize; - - if (self::useNewSodiumAPI() && !$dontFallback) { - return (string) sodium_unpad($padded, $blockSize); - } - if ($blockSize <= 0) { - throw new SodiumException('block size cannot be less than 1'); - } - $padded_len = ParagonIE_Sodium_Core_Util::strlen($padded); - if ($padded_len < $blockSize) { - throw new SodiumException('invalid padding'); - } - - # tail = &padded[padded_len - 1U]; - $tail = $padded_len - 1; - - $acc = 0; - $valid = 0; - $pad_len = 0; - - $found = 0; - for ($i = 0; $i < $blockSize; ++$i) { - # c = tail[-i]; - $c = ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]); - - # is_barrier = - # (( (acc - 1U) & (pad_len - 1U) & ((c ^ 0x80) - 1U) ) >> 8) & 1U; - $is_barrier = ( - ( - ($acc - 1) & ($pad_len - 1) & (($c ^ 80) - 1) - ) >> 7 - ) & 1; - $is_barrier &= ~$found; - $found |= $is_barrier; - - # acc |= c; - $acc |= $c; - - # pad_len |= i & (1U + ~is_barrier); - $pad_len |= $i & (1 + ~$is_barrier); - - # valid |= (unsigned char) is_barrier; - $valid |= ($is_barrier & 0xff); - } - # unpadded_len = padded_len - 1U - pad_len; - $unpadded_len = $padded_len - 1 - $pad_len; - if ($valid !== 1) { - throw new SodiumException('invalid padding'); - } - return ParagonIE_Sodium_Core_Util::substr($padded, 0, $unpadded_len); - } - - /** - * Will sodium_compat run fast on the current hardware and PHP configuration? - * - * @return bool - */ - public static function polyfill_is_fast() - { - if (extension_loaded('sodium')) { - return true; - } - if (extension_loaded('libsodium')) { - return true; - } - return PHP_INT_SIZE === 8; - } - - /** - * Generate a string of bytes from the kernel's CSPRNG. - * Proudly uses /dev/urandom (if getrandom(2) is not available). - * - * @param int $numBytes - * @return string - * @throws Exception - * @throws TypeError - */ - public static function randombytes_buf($numBytes) - { - /* Type checks: */ - if (!is_int($numBytes)) { - if (is_numeric($numBytes)) { - $numBytes = (int) $numBytes; - } else { - throw new TypeError( - 'Argument 1 must be an integer, ' . gettype($numBytes) . ' given.' - ); - } - } - if (self::use_fallback('randombytes_buf')) { - return (string) call_user_func('\\Sodium\\randombytes_buf', $numBytes); - } - return random_bytes($numBytes); - } - - /** - * Generate an integer between 0 and $range (non-inclusive). - * - * @param int $range - * @return int - * @throws Exception - * @throws Error - * @throws TypeError - */ - public static function randombytes_uniform($range) - { - /* Type checks: */ - if (!is_int($range)) { - if (is_numeric($range)) { - $range = (int) $range; - } else { - throw new TypeError( - 'Argument 1 must be an integer, ' . gettype($range) . ' given.' - ); - } - } - if (self::use_fallback('randombytes_uniform')) { - return (int) call_user_func('\\Sodium\\randombytes_uniform', $range); - } - return random_int(0, $range - 1); - } - - /** - * Generate a random 16-bit integer. - * - * @return int - * @throws Exception - * @throws Error - * @throws TypeError - */ - public static function randombytes_random16() - { - if (self::use_fallback('randombytes_random16')) { - return (int) call_user_func('\\Sodium\\randombytes_random16'); - } - return random_int(0, 65535); - } - - /** - * Runtime testing method for 32-bit platforms. - * - * Usage: If runtime_speed_test() returns FALSE, then our 32-bit - * implementation is to slow to use safely without risking timeouts. - * If this happens, install sodium from PECL to get acceptable - * performance. - * - * @param int $iterations Number of multiplications to attempt - * @param int $maxTimeout Milliseconds - * @return bool TRUE if we're fast enough, FALSE is not - * @throws SodiumException - */ - public static function runtime_speed_test($iterations, $maxTimeout) - { - if (self::polyfill_is_fast()) { - return true; - } - /** @var float $end */ - $end = 0.0; - /** @var float $start */ - $start = microtime(true); - /** @var ParagonIE_Sodium_Core32_Int64 $a */ - $a = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); - for ($i = 0; $i < $iterations; ++$i) { - /** @var ParagonIE_Sodium_Core32_Int64 $b */ - $b = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); - $a->mulInt64($b); - } - /** @var float $end */ - $end = microtime(true); - /** @var int $diff */ - $diff = (int) ceil(($end - $start) * 1000); - return $diff < $maxTimeout; - } - - /** - * This emulates libsodium's version_string() function, except ours is - * prefixed with 'polyfill-'. - * - * @return string - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress UndefinedFunction - */ - public static function version_string() - { - if (self::useNewSodiumAPI()) { - return (string) sodium_version_string(); - } - if (self::use_fallback('version_string')) { - return (string) call_user_func('\\Sodium\\version_string'); - } - return (string) self::VERSION_STRING; - } - - /** - * Should we use the libsodium core function instead? - * This is always a good idea, if it's available. (Unless we're in the - * middle of running our unit test suite.) - * - * If ext/libsodium is available, use it. Return TRUE. - * Otherwise, we have to use the code provided herein. Return FALSE. - * - * @param string $sodium_func_name - * - * @return bool - */ - protected static function use_fallback($sodium_func_name = '') - { - static $res = null; - if ($res === null) { - $res = extension_loaded('libsodium') && PHP_VERSION_ID >= 50300; - } - if ($res === false) { - // No libsodium installed - return false; - } - if (self::$disableFallbackForUnitTests) { - // Don't fallback. Use the PHP implementation. - return false; - } - if (!empty($sodium_func_name)) { - return is_callable('\\Sodium\\' . $sodium_func_name); - } - return true; - } - - /** - * Libsodium as implemented in PHP 7.2 - * and/or ext/sodium (via PECL) - * - * @ref https://wiki.php.net/rfc/libsodium - * @return bool - */ - protected static function useNewSodiumAPI() - { - static $res = null; - if ($res === null) { - $res = PHP_VERSION_ID >= 70000 && extension_loaded('sodium'); - } - if (self::$disableFallbackForUnitTests) { - // Don't fallback. Use the PHP implementation. - return false; - } - return (bool) $res; - } -} diff --git a/libs/sodium_compat/src/Core/BLAKE2b.php b/libs/sodium_compat/src/Core/BLAKE2b.php deleted file mode 100644 index 930a0ed..0000000 --- a/libs/sodium_compat/src/Core/BLAKE2b.php +++ /dev/null @@ -1,789 +0,0 @@ -> - */ - protected static $sigma = array( - array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), - array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), - array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), - array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), - array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), - array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), - array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), - array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), - array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), - array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), - array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), - array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) - ); - - const BLOCKBYTES = 128; - const OUTBYTES = 64; - const KEYBYTES = 64; - - /** - * Turn two 32-bit integers into a fixed array representing a 64-bit integer. - * - * @internal You should not use this directly from another application - * - * @param int $high - * @param int $low - * @return SplFixedArray - * @psalm-suppress MixedAssignment - */ - public static function new64($high, $low) - { - $i64 = new SplFixedArray(2); - $i64[0] = $high & 0xffffffff; - $i64[1] = $low & 0xffffffff; - return $i64; - } - - /** - * Convert an arbitrary number into an SplFixedArray of two 32-bit integers - * that represents a 64-bit integer. - * - * @internal You should not use this directly from another application - * - * @param int $num - * @return SplFixedArray - */ - protected static function to64($num) - { - list($hi, $lo) = self::numericTo64BitInteger($num); - return self::new64($hi, $lo); - } - - /** - * Adds two 64-bit integers together, returning their sum as a SplFixedArray - * containing two 32-bit integers (representing a 64-bit integer). - * - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param SplFixedArray $y - * @return SplFixedArray - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedOperand - */ - protected static function add64($x, $y) - { - $l = ($x[1] + $y[1]) & 0xffffffff; - return self::new64( - (int) ($x[0] + $y[0] + ( - ($l < $x[1]) ? 1 : 0 - )), - (int) $l - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param SplFixedArray $y - * @param SplFixedArray $z - * @return SplFixedArray - */ - protected static function add364($x, $y, $z) - { - return self::add64($x, self::add64($y, $z)); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param SplFixedArray $y - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - */ - protected static function xor64(SplFixedArray $x, SplFixedArray $y) - { - if (!is_numeric($x[0])) { - throw new SodiumException('x[0] is not an integer'); - } - if (!is_numeric($x[1])) { - throw new SodiumException('x[1] is not an integer'); - } - if (!is_numeric($y[0])) { - throw new SodiumException('y[0] is not an integer'); - } - if (!is_numeric($y[1])) { - throw new SodiumException('y[1] is not an integer'); - } - return self::new64( - (int) (($x[0] ^ $y[0]) & 0xffffffff), - (int) (($x[1] ^ $y[1]) & 0xffffffff) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param int $c - * @return SplFixedArray - * @psalm-suppress MixedAssignment - */ - public static function rotr64($x, $c) - { - if ($c >= 64) { - $c %= 64; - } - if ($c >= 32) { - /** @var int $tmp */ - $tmp = $x[0]; - $x[0] = $x[1]; - $x[1] = $tmp; - $c -= 32; - } - if ($c === 0) { - return $x; - } - - $l0 = 0; - $c = 64 - $c; - - if ($c < 32) { - /** @var int $h0 */ - $h0 = ((int) ($x[0]) << $c) | ( - ( - (int) ($x[1]) & ((1 << $c) - 1) - << - (32 - $c) - ) >> (32 - $c) - ); - /** @var int $l0 */ - $l0 = (int) ($x[1]) << $c; - } else { - /** @var int $h0 */ - $h0 = (int) ($x[1]) << ($c - 32); - } - - $h1 = 0; - $c1 = 64 - $c; - - if ($c1 < 32) { - /** @var int $h1 */ - $h1 = (int) ($x[0]) >> $c1; - /** @var int $l1 */ - $l1 = ((int) ($x[1]) >> $c1) | ((int) ($x[0]) & ((1 << $c1) - 1)) << (32 - $c1); - } else { - /** @var int $l1 */ - $l1 = (int) ($x[0]) >> ($c1 - 32); - } - - return self::new64($h0 | $h1, $l0 | $l1); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @return int - * @psalm-suppress MixedOperand - */ - protected static function flatten64($x) - { - return (int) ($x[0] * 4294967296 + $x[1]); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param int $i - * @return SplFixedArray - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayOffset - */ - protected static function load64(SplFixedArray $x, $i) - { - /** @var int $l */ - $l = (int) ($x[$i]) - | ((int) ($x[$i+1]) << 8) - | ((int) ($x[$i+2]) << 16) - | ((int) ($x[$i+3]) << 24); - /** @var int $h */ - $h = (int) ($x[$i+4]) - | ((int) ($x[$i+5]) << 8) - | ((int) ($x[$i+6]) << 16) - | ((int) ($x[$i+7]) << 24); - return self::new64($h, $l); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param int $i - * @param SplFixedArray $u - * @return void - * @psalm-suppress MixedAssignment - */ - protected static function store64(SplFixedArray $x, $i, SplFixedArray $u) - { - $maxLength = $x->getSize() - 1; - for ($j = 0; $j < 8; ++$j) { - /* - [0, 1, 2, 3, 4, 5, 6, 7] - ... becomes ... - [0, 0, 0, 0, 1, 1, 1, 1] - */ - /** @var int $uIdx */ - $uIdx = ((7 - $j) & 4) >> 2; - $x[$i] = ((int) ($u[$uIdx]) & 0xff); - if (++$i > $maxLength) { - return; - } - /** @psalm-suppress MixedOperand */ - $u[$uIdx] >>= 8; - } - } - - /** - * This just sets the $iv static variable. - * - * @internal You should not use this directly from another application - * - * @return void - */ - public static function pseudoConstructor() - { - static $called = false; - if ($called) { - return; - } - self::$iv = new SplFixedArray(8); - self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); - self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); - self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); - self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); - self::$iv[4] = self::new64(0x510e527f, 0xade682d1); - self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); - self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); - self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); - - $called = true; - } - - /** - * Returns a fresh BLAKE2 context. - * - * @internal You should not use this directly from another application - * - * @return SplFixedArray - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - */ - protected static function context() - { - $ctx = new SplFixedArray(6); - $ctx[0] = new SplFixedArray(8); // h - $ctx[1] = new SplFixedArray(2); // t - $ctx[2] = new SplFixedArray(2); // f - $ctx[3] = new SplFixedArray(256); // buf - $ctx[4] = 0; // buflen - $ctx[5] = 0; // last_node (uint8_t) - - for ($i = 8; $i--;) { - $ctx[0][$i] = self::$iv[$i]; - } - for ($i = 256; $i--;) { - $ctx[3][$i] = 0; - } - - $zero = self::new64(0, 0); - $ctx[1][0] = $zero; - $ctx[1][1] = $zero; - $ctx[2][0] = $zero; - $ctx[2][1] = $zero; - - return $ctx; - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param SplFixedArray $buf - * @return void - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - */ - protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) - { - $m = new SplFixedArray(16); - $v = new SplFixedArray(16); - - for ($i = 16; $i--;) { - $m[$i] = self::load64($buf, $i << 3); - } - - for ($i = 8; $i--;) { - $v[$i] = $ctx[0][$i]; - } - - $v[ 8] = self::$iv[0]; - $v[ 9] = self::$iv[1]; - $v[10] = self::$iv[2]; - $v[11] = self::$iv[3]; - - $v[12] = self::xor64($ctx[1][0], self::$iv[4]); - $v[13] = self::xor64($ctx[1][1], self::$iv[5]); - $v[14] = self::xor64($ctx[2][0], self::$iv[6]); - $v[15] = self::xor64($ctx[2][1], self::$iv[7]); - - for ($r = 0; $r < 12; ++$r) { - $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); - $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); - $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); - $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); - $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); - $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); - $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); - $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); - } - - for ($i = 8; $i--;) { - $ctx[0][$i] = self::xor64( - $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) - ); - } - } - - /** - * @internal You should not use this directly from another application - * - * @param int $r - * @param int $i - * @param int $a - * @param int $b - * @param int $c - * @param int $d - * @param SplFixedArray $v - * @param SplFixedArray $m - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayOffset - */ - public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) - { - $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); - $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); - $v[$c] = self::add64($v[$c], $v[$d]); - $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); - $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); - $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); - $v[$c] = self::add64($v[$c], $v[$d]); - $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); - return $v; - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param int $inc - * @return void - * @throws SodiumException - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - */ - public static function increment_counter($ctx, $inc) - { - if ($inc < 0) { - throw new SodiumException('Increasing by a negative number makes no sense.'); - } - $t = self::to64($inc); - # S->t is $ctx[1] in our implementation - - # S->t[0] = ( uint64_t )( t >> 0 ); - $ctx[1][0] = self::add64($ctx[1][0], $t); - - # S->t[1] += ( S->t[0] < inc ); - if (self::flatten64($ctx[1][0]) < $inc) { - $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); - } - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param SplFixedArray $p - * @param int $plen - * @return void - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - * @psalm-suppress MixedOperand - */ - public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) - { - self::pseudoConstructor(); - - $offset = 0; - while ($plen > 0) { - $left = $ctx[4]; - $fill = 256 - $left; - - if ($plen > $fill) { - # memcpy( S->buf + left, in, fill ); /* Fill buffer */ - for ($i = $fill; $i--;) { - $ctx[3][$i + $left] = $p[$i + $offset]; - } - - # S->buflen += fill; - $ctx[4] += $fill; - - # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); - self::increment_counter($ctx, 128); - - # blake2b_compress( S, S->buf ); /* Compress */ - self::compress($ctx, $ctx[3]); - - # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ - for ($i = 128; $i--;) { - $ctx[3][$i] = $ctx[3][$i + 128]; - } - - # S->buflen -= BLAKE2B_BLOCKBYTES; - $ctx[4] -= 128; - - # in += fill; - $offset += $fill; - - # inlen -= fill; - $plen -= $fill; - } else { - for ($i = $plen; $i--;) { - $ctx[3][$i + $left] = $p[$i + $offset]; - } - $ctx[4] += $plen; - $offset += $plen; - $plen -= $plen; - } - } - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param SplFixedArray $out - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - * @psalm-suppress MixedOperand - */ - public static function finish(SplFixedArray $ctx, SplFixedArray $out) - { - self::pseudoConstructor(); - if ($ctx[4] > 128) { - self::increment_counter($ctx, 128); - self::compress($ctx, $ctx[3]); - $ctx[4] -= 128; - if ($ctx[4] > 128) { - throw new SodiumException('Failed to assert that buflen <= 128 bytes'); - } - for ($i = $ctx[4]; $i--;) { - $ctx[3][$i] = $ctx[3][$i + 128]; - } - } - - self::increment_counter($ctx, $ctx[4]); - $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); - - for ($i = 256 - $ctx[4]; $i--;) { - $ctx[3][$i+$ctx[4]] = 0; - } - - self::compress($ctx, $ctx[3]); - - $i = (int) (($out->getSize() - 1) / 8); - for (; $i >= 0; --$i) { - self::store64($out, $i << 3, $ctx[0][$i]); - } - return $out; - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray|null $key - * @param int $outlen - * @param SplFixedArray|null $salt - * @param SplFixedArray|null $personal - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - */ - public static function init( - $key = null, - $outlen = 64, - $salt = null, - $personal = null - ) { - self::pseudoConstructor(); - $klen = 0; - - if ($key !== null) { - if (count($key) > 64) { - throw new SodiumException('Invalid key size'); - } - $klen = count($key); - } - - if ($outlen > 64) { - throw new SodiumException('Invalid output size'); - } - - $ctx = self::context(); - - $p = new SplFixedArray(64); - // Zero our param buffer... - for ($i = 64; --$i;) { - $p[$i] = 0; - } - - $p[0] = $outlen; // digest_length - $p[1] = $klen; // key_length - $p[2] = 1; // fanout - $p[3] = 1; // depth - - if ($salt instanceof SplFixedArray) { - // salt: [32] through [47] - for ($i = 0; $i < 16; ++$i) { - $p[32 + $i] = (int) $salt[$i]; - } - } - if ($personal instanceof SplFixedArray) { - // personal: [48] through [63] - for ($i = 0; $i < 16; ++$i) { - $p[48 + $i] = (int) $personal[$i]; - } - } - - $ctx[0][0] = self::xor64( - $ctx[0][0], - self::load64($p, 0) - ); - if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { - // We need to do what blake2b_init_param() does: - for ($i = 1; $i < 8; ++$i) { - $ctx[0][$i] = self::xor64( - $ctx[0][$i], - self::load64($p, $i << 3) - ); - } - } - - if ($klen > 0 && $key instanceof SplFixedArray) { - $block = new SplFixedArray(128); - for ($i = 128; $i--;) { - $block[$i] = 0; - } - for ($i = $klen; $i--;) { - $block[$i] = $key[$i]; - } - self::update($ctx, $block, 128); - $ctx[4] = 128; - } - - return $ctx; - } - - /** - * Convert a string into an SplFixedArray of integers - * - * @internal You should not use this directly from another application - * - * @param string $str - * @return SplFixedArray - */ - public static function stringToSplFixedArray($str = '') - { - $values = unpack('C*', $str); - return SplFixedArray::fromArray(array_values($values)); - } - - /** - * Convert an SplFixedArray of integers into a string - * - * @internal You should not use this directly from another application - * - * @param SplFixedArray $a - * @return string - * @throws TypeError - */ - public static function SplFixedArrayToString(SplFixedArray $a) - { - /** - * @var array $arr - */ - $arr = $a->toArray(); - $c = $a->count(); - array_unshift($arr, str_repeat('C', $c)); - return (string) (call_user_func_array('pack', $arr)); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @return string - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - * @psalm-suppress MixedMethodCall - */ - public static function contextToString(SplFixedArray $ctx) - { - $str = ''; - /** @var array> $ctxA */ - $ctxA = $ctx[0]->toArray(); - - # uint64_t h[8]; - for ($i = 0; $i < 8; ++$i) { - $str .= self::store32_le($ctxA[$i][1]); - $str .= self::store32_le($ctxA[$i][0]); - } - - # uint64_t t[2]; - # uint64_t f[2]; - for ($i = 1; $i < 3; ++$i) { - $ctxA = $ctx[$i]->toArray(); - $str .= self::store32_le($ctxA[0][1]); - $str .= self::store32_le($ctxA[0][0]); - $str .= self::store32_le($ctxA[1][1]); - $str .= self::store32_le($ctxA[1][0]); - } - - # uint8_t buf[2 * 128]; - $str .= self::SplFixedArrayToString($ctx[3]); - - /** @var int $ctx4 */ - $ctx4 = (int) $ctx[4]; - - # size_t buflen; - $str .= implode('', array( - self::intToChr($ctx4 & 0xff), - self::intToChr(($ctx4 >> 8) & 0xff), - self::intToChr(($ctx4 >> 16) & 0xff), - self::intToChr(($ctx4 >> 24) & 0xff), - self::intToChr(($ctx4 >> 32) & 0xff), - self::intToChr(($ctx4 >> 40) & 0xff), - self::intToChr(($ctx4 >> 48) & 0xff), - self::intToChr(($ctx4 >> 56) & 0xff) - )); - # uint8_t last_node; - return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); - } - - /** - * Creates an SplFixedArray containing other SplFixedArray elements, from - * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) - * - * @internal You should not use this directly from another application - * - * @param string $string - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAssignment - */ - public static function stringToContext($string) - { - $ctx = self::context(); - - # uint64_t h[8]; - for ($i = 0; $i < 8; ++$i) { - $ctx[0][$i] = SplFixedArray::fromArray( - array( - self::load_4( - self::substr($string, (($i << 3) + 4), 4) - ), - self::load_4( - self::substr($string, (($i << 3) + 0), 4) - ) - ) - ); - } - - # uint64_t t[2]; - # uint64_t f[2]; - for ($i = 1; $i < 3; ++$i) { - $ctx[$i][1] = SplFixedArray::fromArray( - array( - self::load_4(self::substr($string, 76 + (($i - 1) << 4), 4)), - self::load_4(self::substr($string, 72 + (($i - 1) << 4), 4)) - ) - ); - $ctx[$i][0] = SplFixedArray::fromArray( - array( - self::load_4(self::substr($string, 68 + (($i - 1) << 4), 4)), - self::load_4(self::substr($string, 64 + (($i - 1) << 4), 4)) - ) - ); - } - - # uint8_t buf[2 * 128]; - $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); - - # uint8_t buf[2 * 128]; - $int = 0; - for ($i = 0; $i < 8; ++$i) { - $int |= self::chrToInt($string[352 + $i]) << ($i << 3); - } - $ctx[4] = $int; - - return $ctx; - } -} diff --git a/libs/sodium_compat/src/Core/Base64/Common.php b/libs/sodium_compat/src/Core/Base64/Common.php deleted file mode 100644 index 94b2e8f..0000000 --- a/libs/sodium_compat/src/Core/Base64/Common.php +++ /dev/null @@ -1,213 +0,0 @@ - $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); - $b0 = $chunk[1]; - $b1 = $chunk[2]; - $b2 = $chunk[3]; - - $dest .= - self::encode6Bits( $b0 >> 2 ) . - self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . - self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . - self::encode6Bits( $b2 & 63); - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); - $b0 = $chunk[1]; - if ($i + 1 < $srcLen) { - $b1 = $chunk[2]; - $dest .= - self::encode6Bits($b0 >> 2) . - self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . - self::encode6Bits(($b1 << 2) & 63); - if ($pad) { - $dest .= '='; - } - } else { - $dest .= - self::encode6Bits( $b0 >> 2) . - self::encode6Bits(($b0 << 4) & 63); - if ($pad) { - $dest .= '=='; - } - } - } - return $dest; - } - - /** - * decode from base64 into binary - * - * Base64 character set "./[A-Z][a-z][0-9]" - * - * @param string $src - * @param bool $strictPadding - * @return string - * @throws RangeException - * @throws TypeError - * @psalm-suppress RedundantCondition - */ - public static function decode($src, $strictPadding = false) - { - // Remove padding - $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); - if ($srcLen === 0) { - return ''; - } - - if ($strictPadding) { - if (($srcLen & 3) === 0) { - if ($src[$srcLen - 1] === '=') { - $srcLen--; - if ($src[$srcLen - 1] === '=') { - $srcLen--; - } - } - } - if (($srcLen & 3) === 1) { - throw new RangeException( - 'Incorrect padding' - ); - } - if ($src[$srcLen - 1] === '=') { - throw new RangeException( - 'Incorrect padding' - ); - } - } else { - $src = rtrim($src, '='); - $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); - } - - $err = 0; - $dest = ''; - // Main loop (no padding): - for ($i = 0; $i + 4 <= $srcLen; $i += 4) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); - $c0 = self::decode6Bits($chunk[1]); - $c1 = self::decode6Bits($chunk[2]); - $c2 = self::decode6Bits($chunk[3]); - $c3 = self::decode6Bits($chunk[4]); - - $dest .= pack( - 'CCC', - ((($c0 << 2) | ($c1 >> 4)) & 0xff), - ((($c1 << 4) | ($c2 >> 2)) & 0xff), - ((($c2 << 6) | $c3 ) & 0xff) - ); - $err |= ($c0 | $c1 | $c2 | $c3) >> 8; - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); - $c0 = self::decode6Bits($chunk[1]); - - if ($i + 2 < $srcLen) { - $c1 = self::decode6Bits($chunk[2]); - $c2 = self::decode6Bits($chunk[3]); - $dest .= pack( - 'CC', - ((($c0 << 2) | ($c1 >> 4)) & 0xff), - ((($c1 << 4) | ($c2 >> 2)) & 0xff) - ); - $err |= ($c0 | $c1 | $c2) >> 8; - } elseif ($i + 1 < $srcLen) { - $c1 = self::decode6Bits($chunk[2]); - $dest .= pack( - 'C', - ((($c0 << 2) | ($c1 >> 4)) & 0xff) - ); - $err |= ($c0 | $c1) >> 8; - } elseif ($i < $srcLen && $strictPadding) { - $err |= 1; - } - } - /** @var bool $check */ - $check = ($err === 0); - if (!$check) { - throw new RangeException( - 'Base64::decode() only expects characters in the correct base64 alphabet' - ); - } - return $dest; - } - - /** - * Uses bitwise operators instead of table-lookups to turn 6-bit integers - * into 8-bit integers. - * - * Base64 character set: - * [A-Z] [a-z] [0-9] + / - * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f - * - * @param int $src - * @return int - */ - abstract protected static function decode6Bits($src); - - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - abstract protected static function encode6Bits($src); -} diff --git a/libs/sodium_compat/src/Core/Base64/Original.php b/libs/sodium_compat/src/Core/Base64/Original.php deleted file mode 100644 index dc939ee..0000000 --- a/libs/sodium_compat/src/Core/Base64/Original.php +++ /dev/null @@ -1,248 +0,0 @@ - $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); - $b0 = $chunk[1]; - $b1 = $chunk[2]; - $b2 = $chunk[3]; - - $dest .= - self::encode6Bits( $b0 >> 2 ) . - self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . - self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . - self::encode6Bits( $b2 & 63); - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); - $b0 = $chunk[1]; - if ($i + 1 < $srcLen) { - $b1 = $chunk[2]; - $dest .= - self::encode6Bits($b0 >> 2) . - self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . - self::encode6Bits(($b1 << 2) & 63); - if ($pad) { - $dest .= '='; - } - } else { - $dest .= - self::encode6Bits( $b0 >> 2) . - self::encode6Bits(($b0 << 4) & 63); - if ($pad) { - $dest .= '=='; - } - } - } - return $dest; - } - - /** - * decode from base64 into binary - * - * Base64 character set "./[A-Z][a-z][0-9]" - * - * @param string $src - * @param bool $strictPadding - * @return string - * @throws RangeException - * @throws TypeError - * @psalm-suppress RedundantCondition - */ - public static function decode($src, $strictPadding = false) - { - // Remove padding - $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); - if ($srcLen === 0) { - return ''; - } - - if ($strictPadding) { - if (($srcLen & 3) === 0) { - if ($src[$srcLen - 1] === '=') { - $srcLen--; - if ($src[$srcLen - 1] === '=') { - $srcLen--; - } - } - } - if (($srcLen & 3) === 1) { - throw new RangeException( - 'Incorrect padding' - ); - } - if ($src[$srcLen - 1] === '=') { - throw new RangeException( - 'Incorrect padding' - ); - } - } else { - $src = rtrim($src, '='); - $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); - } - - $err = 0; - $dest = ''; - // Main loop (no padding): - for ($i = 0; $i + 4 <= $srcLen; $i += 4) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); - $c0 = self::decode6Bits($chunk[1]); - $c1 = self::decode6Bits($chunk[2]); - $c2 = self::decode6Bits($chunk[3]); - $c3 = self::decode6Bits($chunk[4]); - - $dest .= pack( - 'CCC', - ((($c0 << 2) | ($c1 >> 4)) & 0xff), - ((($c1 << 4) | ($c2 >> 2)) & 0xff), - ((($c2 << 6) | $c3) & 0xff) - ); - $err |= ($c0 | $c1 | $c2 | $c3) >> 8; - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); - $c0 = self::decode6Bits($chunk[1]); - - if ($i + 2 < $srcLen) { - $c1 = self::decode6Bits($chunk[2]); - $c2 = self::decode6Bits($chunk[3]); - $dest .= pack( - 'CC', - ((($c0 << 2) | ($c1 >> 4)) & 0xff), - ((($c1 << 4) | ($c2 >> 2)) & 0xff) - ); - $err |= ($c0 | $c1 | $c2) >> 8; - } elseif ($i + 1 < $srcLen) { - $c1 = self::decode6Bits($chunk[2]); - $dest .= pack( - 'C', - ((($c0 << 2) | ($c1 >> 4)) & 0xff) - ); - $err |= ($c0 | $c1) >> 8; - } elseif ($i < $srcLen && $strictPadding) { - $err |= 1; - } - } - /** @var bool $check */ - $check = ($err === 0); - if (!$check) { - throw new RangeException( - 'Base64::decode() only expects characters in the correct base64 alphabet' - ); - } - return $dest; - } - // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE - - /** - * Uses bitwise operators instead of table-lookups to turn 6-bit integers - * into 8-bit integers. - * - * Base64 character set: - * [A-Z] [a-z] [0-9] + / - * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f - * - * @param int $src - * @return int - */ - protected static function decode6Bits($src) - { - $ret = -1; - - // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 - $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); - - // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 - $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); - - // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 - $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); - - // if ($src == 0x2b) $ret += 62 + 1; - $ret += (((0x2a - $src) & ($src - 0x2c)) >> 8) & 63; - - // if ($src == 0x2f) ret += 63 + 1; - $ret += (((0x2e - $src) & ($src - 0x30)) >> 8) & 64; - - return $ret; - } - - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode6Bits($src) - { - $diff = 0x41; - - // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 - $diff += ((25 - $src) >> 8) & 6; - - // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 - $diff -= ((51 - $src) >> 8) & 75; - - // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15 - $diff -= ((61 - $src) >> 8) & 15; - - // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3 - $diff += ((62 - $src) >> 8) & 3; - - return pack('C', $src + $diff); - } -} diff --git a/libs/sodium_compat/src/Core/Base64/UrlSafe.php b/libs/sodium_compat/src/Core/Base64/UrlSafe.php deleted file mode 100644 index 64bf53b..0000000 --- a/libs/sodium_compat/src/Core/Base64/UrlSafe.php +++ /dev/null @@ -1,247 +0,0 @@ - $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); - $b0 = $chunk[1]; - $b1 = $chunk[2]; - $b2 = $chunk[3]; - - $dest .= - self::encode6Bits( $b0 >> 2 ) . - self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . - self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . - self::encode6Bits( $b2 & 63); - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); - $b0 = $chunk[1]; - if ($i + 1 < $srcLen) { - $b1 = $chunk[2]; - $dest .= - self::encode6Bits($b0 >> 2) . - self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . - self::encode6Bits(($b1 << 2) & 63); - if ($pad) { - $dest .= '='; - } - } else { - $dest .= - self::encode6Bits( $b0 >> 2) . - self::encode6Bits(($b0 << 4) & 63); - if ($pad) { - $dest .= '=='; - } - } - } - return $dest; - } - - /** - * decode from base64 into binary - * - * Base64 character set "./[A-Z][a-z][0-9]" - * - * @param string $src - * @param bool $strictPadding - * @return string - * @throws RangeException - * @throws TypeError - * @psalm-suppress RedundantCondition - */ - public static function decode($src, $strictPadding = false) - { - // Remove padding - $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); - if ($srcLen === 0) { - return ''; - } - - if ($strictPadding) { - if (($srcLen & 3) === 0) { - if ($src[$srcLen - 1] === '=') { - $srcLen--; - if ($src[$srcLen - 1] === '=') { - $srcLen--; - } - } - } - if (($srcLen & 3) === 1) { - throw new RangeException( - 'Incorrect padding' - ); - } - if ($src[$srcLen - 1] === '=') { - throw new RangeException( - 'Incorrect padding' - ); - } - } else { - $src = rtrim($src, '='); - $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); - } - - $err = 0; - $dest = ''; - // Main loop (no padding): - for ($i = 0; $i + 4 <= $srcLen; $i += 4) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); - $c0 = self::decode6Bits($chunk[1]); - $c1 = self::decode6Bits($chunk[2]); - $c2 = self::decode6Bits($chunk[3]); - $c3 = self::decode6Bits($chunk[4]); - - $dest .= pack( - 'CCC', - ((($c0 << 2) | ($c1 >> 4)) & 0xff), - ((($c1 << 4) | ($c2 >> 2)) & 0xff), - ((($c2 << 6) | $c3) & 0xff) - ); - $err |= ($c0 | $c1 | $c2 | $c3) >> 8; - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); - $c0 = self::decode6Bits($chunk[1]); - - if ($i + 2 < $srcLen) { - $c1 = self::decode6Bits($chunk[2]); - $c2 = self::decode6Bits($chunk[3]); - $dest .= pack( - 'CC', - ((($c0 << 2) | ($c1 >> 4)) & 0xff), - ((($c1 << 4) | ($c2 >> 2)) & 0xff) - ); - $err |= ($c0 | $c1 | $c2) >> 8; - } elseif ($i + 1 < $srcLen) { - $c1 = self::decode6Bits($chunk[2]); - $dest .= pack( - 'C', - ((($c0 << 2) | ($c1 >> 4)) & 0xff) - ); - $err |= ($c0 | $c1) >> 8; - } elseif ($i < $srcLen && $strictPadding) { - $err |= 1; - } - } - /** @var bool $check */ - $check = ($err === 0); - if (!$check) { - throw new RangeException( - 'Base64::decode() only expects characters in the correct base64 alphabet' - ); - } - return $dest; - } - // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE - /** - * Uses bitwise operators instead of table-lookups to turn 6-bit integers - * into 8-bit integers. - * - * Base64 character set: - * [A-Z] [a-z] [0-9] + / - * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f - * - * @param int $src - * @return int - */ - protected static function decode6Bits($src) - { - $ret = -1; - - // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 - $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); - - // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 - $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); - - // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 - $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); - - // if ($src == 0x2c) $ret += 62 + 1; - $ret += (((0x2c - $src) & ($src - 0x2e)) >> 8) & 63; - - // if ($src == 0x5f) ret += 63 + 1; - $ret += (((0x5e - $src) & ($src - 0x60)) >> 8) & 64; - - return $ret; - } - - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode6Bits($src) - { - $diff = 0x41; - - // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 - $diff += ((25 - $src) >> 8) & 6; - - // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 - $diff -= ((51 - $src) >> 8) & 75; - - // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13 - $diff -= ((61 - $src) >> 8) & 13; - - // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3 - $diff += ((62 - $src) >> 8) & 49; - - return pack('C', $src + $diff); - } -} diff --git a/libs/sodium_compat/src/Core/ChaCha20.php b/libs/sodium_compat/src/Core/ChaCha20.php deleted file mode 100644 index 806010c..0000000 --- a/libs/sodium_compat/src/Core/ChaCha20.php +++ /dev/null @@ -1,395 +0,0 @@ -> (32 - $n)) - ) - ); - } - - /** - * The ChaCha20 quarter round function. Works on four 32-bit integers. - * - * @internal You should not use this directly from another application - * - * @param int $a - * @param int $b - * @param int $c - * @param int $d - * @return array - */ - protected static function quarterRound($a, $b, $c, $d) - { - # a = PLUS(a,b); d = ROTATE(XOR(d,a),16); - /** @var int $a */ - $a = ($a + $b) & 0xffffffff; - $d = self::rotate($d ^ $a, 16); - - # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); - /** @var int $c */ - $c = ($c + $d) & 0xffffffff; - $b = self::rotate($b ^ $c, 12); - - # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); - /** @var int $a */ - $a = ($a + $b) & 0xffffffff; - $d = self::rotate($d ^ $a, 8); - - # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); - /** @var int $c */ - $c = ($c + $d) & 0xffffffff; - $b = self::rotate($b ^ $c, 7); - return array((int) $a, (int) $b, (int) $c, (int) $d); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx - * @param string $message - * - * @return string - * @throws TypeError - * @throws SodiumException - */ - public static function encryptBytes( - ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx, - $message = '' - ) { - $bytes = self::strlen($message); - - /* - j0 = ctx->input[0]; - j1 = ctx->input[1]; - j2 = ctx->input[2]; - j3 = ctx->input[3]; - j4 = ctx->input[4]; - j5 = ctx->input[5]; - j6 = ctx->input[6]; - j7 = ctx->input[7]; - j8 = ctx->input[8]; - j9 = ctx->input[9]; - j10 = ctx->input[10]; - j11 = ctx->input[11]; - j12 = ctx->input[12]; - j13 = ctx->input[13]; - j14 = ctx->input[14]; - j15 = ctx->input[15]; - */ - $j0 = (int) $ctx[0]; - $j1 = (int) $ctx[1]; - $j2 = (int) $ctx[2]; - $j3 = (int) $ctx[3]; - $j4 = (int) $ctx[4]; - $j5 = (int) $ctx[5]; - $j6 = (int) $ctx[6]; - $j7 = (int) $ctx[7]; - $j8 = (int) $ctx[8]; - $j9 = (int) $ctx[9]; - $j10 = (int) $ctx[10]; - $j11 = (int) $ctx[11]; - $j12 = (int) $ctx[12]; - $j13 = (int) $ctx[13]; - $j14 = (int) $ctx[14]; - $j15 = (int) $ctx[15]; - - $c = ''; - for (;;) { - if ($bytes < 64) { - $message .= str_repeat("\x00", 64 - $bytes); - } - - $x0 = (int) $j0; - $x1 = (int) $j1; - $x2 = (int) $j2; - $x3 = (int) $j3; - $x4 = (int) $j4; - $x5 = (int) $j5; - $x6 = (int) $j6; - $x7 = (int) $j7; - $x8 = (int) $j8; - $x9 = (int) $j9; - $x10 = (int) $j10; - $x11 = (int) $j11; - $x12 = (int) $j12; - $x13 = (int) $j13; - $x14 = (int) $j14; - $x15 = (int) $j15; - - # for (i = 20; i > 0; i -= 2) { - for ($i = 20; $i > 0; $i -= 2) { - # QUARTERROUND( x0, x4, x8, x12) - list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12); - - # QUARTERROUND( x1, x5, x9, x13) - list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13); - - # QUARTERROUND( x2, x6, x10, x14) - list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14); - - # QUARTERROUND( x3, x7, x11, x15) - list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15); - - # QUARTERROUND( x0, x5, x10, x15) - list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15); - - # QUARTERROUND( x1, x6, x11, x12) - list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12); - - # QUARTERROUND( x2, x7, x8, x13) - list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13); - - # QUARTERROUND( x3, x4, x9, x14) - list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14); - } - /* - x0 = PLUS(x0, j0); - x1 = PLUS(x1, j1); - x2 = PLUS(x2, j2); - x3 = PLUS(x3, j3); - x4 = PLUS(x4, j4); - x5 = PLUS(x5, j5); - x6 = PLUS(x6, j6); - x7 = PLUS(x7, j7); - x8 = PLUS(x8, j8); - x9 = PLUS(x9, j9); - x10 = PLUS(x10, j10); - x11 = PLUS(x11, j11); - x12 = PLUS(x12, j12); - x13 = PLUS(x13, j13); - x14 = PLUS(x14, j14); - x15 = PLUS(x15, j15); - */ - /** @var int $x0 */ - $x0 = ($x0 & 0xffffffff) + $j0; - /** @var int $x1 */ - $x1 = ($x1 & 0xffffffff) + $j1; - /** @var int $x2 */ - $x2 = ($x2 & 0xffffffff) + $j2; - /** @var int $x3 */ - $x3 = ($x3 & 0xffffffff) + $j3; - /** @var int $x4 */ - $x4 = ($x4 & 0xffffffff) + $j4; - /** @var int $x5 */ - $x5 = ($x5 & 0xffffffff) + $j5; - /** @var int $x6 */ - $x6 = ($x6 & 0xffffffff) + $j6; - /** @var int $x7 */ - $x7 = ($x7 & 0xffffffff) + $j7; - /** @var int $x8 */ - $x8 = ($x8 & 0xffffffff) + $j8; - /** @var int $x9 */ - $x9 = ($x9 & 0xffffffff) + $j9; - /** @var int $x10 */ - $x10 = ($x10 & 0xffffffff) + $j10; - /** @var int $x11 */ - $x11 = ($x11 & 0xffffffff) + $j11; - /** @var int $x12 */ - $x12 = ($x12 & 0xffffffff) + $j12; - /** @var int $x13 */ - $x13 = ($x13 & 0xffffffff) + $j13; - /** @var int $x14 */ - $x14 = ($x14 & 0xffffffff) + $j14; - /** @var int $x15 */ - $x15 = ($x15 & 0xffffffff) + $j15; - - /* - x0 = XOR(x0, LOAD32_LE(m + 0)); - x1 = XOR(x1, LOAD32_LE(m + 4)); - x2 = XOR(x2, LOAD32_LE(m + 8)); - x3 = XOR(x3, LOAD32_LE(m + 12)); - x4 = XOR(x4, LOAD32_LE(m + 16)); - x5 = XOR(x5, LOAD32_LE(m + 20)); - x6 = XOR(x6, LOAD32_LE(m + 24)); - x7 = XOR(x7, LOAD32_LE(m + 28)); - x8 = XOR(x8, LOAD32_LE(m + 32)); - x9 = XOR(x9, LOAD32_LE(m + 36)); - x10 = XOR(x10, LOAD32_LE(m + 40)); - x11 = XOR(x11, LOAD32_LE(m + 44)); - x12 = XOR(x12, LOAD32_LE(m + 48)); - x13 = XOR(x13, LOAD32_LE(m + 52)); - x14 = XOR(x14, LOAD32_LE(m + 56)); - x15 = XOR(x15, LOAD32_LE(m + 60)); - */ - $x0 ^= self::load_4(self::substr($message, 0, 4)); - $x1 ^= self::load_4(self::substr($message, 4, 4)); - $x2 ^= self::load_4(self::substr($message, 8, 4)); - $x3 ^= self::load_4(self::substr($message, 12, 4)); - $x4 ^= self::load_4(self::substr($message, 16, 4)); - $x5 ^= self::load_4(self::substr($message, 20, 4)); - $x6 ^= self::load_4(self::substr($message, 24, 4)); - $x7 ^= self::load_4(self::substr($message, 28, 4)); - $x8 ^= self::load_4(self::substr($message, 32, 4)); - $x9 ^= self::load_4(self::substr($message, 36, 4)); - $x10 ^= self::load_4(self::substr($message, 40, 4)); - $x11 ^= self::load_4(self::substr($message, 44, 4)); - $x12 ^= self::load_4(self::substr($message, 48, 4)); - $x13 ^= self::load_4(self::substr($message, 52, 4)); - $x14 ^= self::load_4(self::substr($message, 56, 4)); - $x15 ^= self::load_4(self::substr($message, 60, 4)); - - /* - j12 = PLUSONE(j12); - if (!j12) { - j13 = PLUSONE(j13); - } - */ - ++$j12; - if ($j12 & 0xf0000000) { - throw new SodiumException('Overflow'); - } - - /* - STORE32_LE(c + 0, x0); - STORE32_LE(c + 4, x1); - STORE32_LE(c + 8, x2); - STORE32_LE(c + 12, x3); - STORE32_LE(c + 16, x4); - STORE32_LE(c + 20, x5); - STORE32_LE(c + 24, x6); - STORE32_LE(c + 28, x7); - STORE32_LE(c + 32, x8); - STORE32_LE(c + 36, x9); - STORE32_LE(c + 40, x10); - STORE32_LE(c + 44, x11); - STORE32_LE(c + 48, x12); - STORE32_LE(c + 52, x13); - STORE32_LE(c + 56, x14); - STORE32_LE(c + 60, x15); - */ - $block = self::store32_le((int) ($x0 & 0xffffffff)) . - self::store32_le((int) ($x1 & 0xffffffff)) . - self::store32_le((int) ($x2 & 0xffffffff)) . - self::store32_le((int) ($x3 & 0xffffffff)) . - self::store32_le((int) ($x4 & 0xffffffff)) . - self::store32_le((int) ($x5 & 0xffffffff)) . - self::store32_le((int) ($x6 & 0xffffffff)) . - self::store32_le((int) ($x7 & 0xffffffff)) . - self::store32_le((int) ($x8 & 0xffffffff)) . - self::store32_le((int) ($x9 & 0xffffffff)) . - self::store32_le((int) ($x10 & 0xffffffff)) . - self::store32_le((int) ($x11 & 0xffffffff)) . - self::store32_le((int) ($x12 & 0xffffffff)) . - self::store32_le((int) ($x13 & 0xffffffff)) . - self::store32_le((int) ($x14 & 0xffffffff)) . - self::store32_le((int) ($x15 & 0xffffffff)); - - /* Partial block */ - if ($bytes < 64) { - $c .= self::substr($block, 0, $bytes); - break; - } - - /* Full block */ - $c .= $block; - $bytes -= 64; - if ($bytes <= 0) { - break; - } - $message = self::substr($message, 64); - } - /* end for(;;) loop */ - - $ctx[12] = $j12; - $ctx[13] = $j13; - return $c; - } - - /** - * @internal You should not use this directly from another application - * - * @param int $len - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function stream($len = 64, $nonce = '', $key = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce), - str_repeat("\x00", $len) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $len - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ietfStream($len, $nonce = '', $key = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce), - str_repeat("\x00", $len) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $nonce - * @param string $key - * @param string $ic - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce, $ic), - $message - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $nonce - * @param string $key - * @param string $ic - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function streamXorIc($message, $nonce = '', $key = '', $ic = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce, $ic), - $message - ); - } -} diff --git a/libs/sodium_compat/src/Core/ChaCha20/Ctx.php b/libs/sodium_compat/src/Core/ChaCha20/Ctx.php deleted file mode 100644 index 47a42b7..0000000 --- a/libs/sodium_compat/src/Core/ChaCha20/Ctx.php +++ /dev/null @@ -1,119 +0,0 @@ - - */ - protected $container; - - /** - * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. - * - * @internal You should not use this directly from another application - * - * @param string $key ChaCha20 key. - * @param string $iv Initialization Vector (a.k.a. nonce). - * @param string $counter The initial counter value. - * Defaults to 8 0x00 bytes. - * @throws InvalidArgumentException - * @throws TypeError - */ - public function __construct($key = '', $iv = '', $counter = '') - { - if (self::strlen($key) !== 32) { - throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); - } - if (self::strlen($iv) !== 8) { - throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); - } - $this->container = new SplFixedArray(16); - - /* "expand 32-byte k" as per ChaCha20 spec */ - $this->container[0] = 0x61707865; - $this->container[1] = 0x3320646e; - $this->container[2] = 0x79622d32; - $this->container[3] = 0x6b206574; - $this->container[4] = self::load_4(self::substr($key, 0, 4)); - $this->container[5] = self::load_4(self::substr($key, 4, 4)); - $this->container[6] = self::load_4(self::substr($key, 8, 4)); - $this->container[7] = self::load_4(self::substr($key, 12, 4)); - $this->container[8] = self::load_4(self::substr($key, 16, 4)); - $this->container[9] = self::load_4(self::substr($key, 20, 4)); - $this->container[10] = self::load_4(self::substr($key, 24, 4)); - $this->container[11] = self::load_4(self::substr($key, 28, 4)); - - if (empty($counter)) { - $this->container[12] = 0; - $this->container[13] = 0; - } else { - $this->container[12] = self::load_4(self::substr($counter, 0, 4)); - $this->container[13] = self::load_4(self::substr($counter, 4, 4)); - } - $this->container[14] = self::load_4(self::substr($iv, 0, 4)); - $this->container[15] = self::load_4(self::substr($iv, 4, 4)); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @param int $value - * @return void - * @psalm-suppress MixedArrayOffset - */ - public function offsetSet($offset, $value) - { - if (!is_int($offset)) { - throw new InvalidArgumentException('Expected an integer'); - } - if (!is_int($value)) { - throw new InvalidArgumentException('Expected an integer'); - } - $this->container[$offset] = $value; - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) - { - return isset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return void - * @psalm-suppress MixedArrayOffset - */ - public function offsetUnset($offset) - { - unset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return mixed|null - * @psalm-suppress MixedArrayOffset - */ - public function offsetGet($offset) - { - return isset($this->container[$offset]) - ? $this->container[$offset] - : null; - } -} diff --git a/libs/sodium_compat/src/Core/ChaCha20/IetfCtx.php b/libs/sodium_compat/src/Core/ChaCha20/IetfCtx.php deleted file mode 100644 index 4d63b90..0000000 --- a/libs/sodium_compat/src/Core/ChaCha20/IetfCtx.php +++ /dev/null @@ -1,38 +0,0 @@ -container[12] = self::load_4(self::substr($counter, 0, 4)); - } - $this->container[13] = self::load_4(self::substr($iv, 0, 4)); - $this->container[14] = self::load_4(self::substr($iv, 4, 4)); - $this->container[15] = self::load_4(self::substr($iv, 8, 4)); - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519.php b/libs/sodium_compat/src/Core/Curve25519.php deleted file mode 100644 index 4402f91..0000000 --- a/libs/sodium_compat/src/Core/Curve25519.php +++ /dev/null @@ -1,3002 +0,0 @@ - $arr */ - $arr = array(); - for ($i = 0; $i < 10; ++$i) { - $arr[$i] = (int) ($f[$i] + $g[$i]); - } - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($arr); - } - - /** - * Constant-time conditional move. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @param ParagonIE_Sodium_Core_Curve25519_Fe $g - * @param int $b - * @return ParagonIE_Sodium_Core_Curve25519_Fe - * @psalm-suppress MixedAssignment - */ - public static function fe_cmov( - ParagonIE_Sodium_Core_Curve25519_Fe $f, - ParagonIE_Sodium_Core_Curve25519_Fe $g, - $b = 0 - ) { - /** @var array $h */ - $h = array(); - $b *= -1; - for ($i = 0; $i < 10; ++$i) { - /** @var int $x */ - $x = (($f[$i] ^ $g[$i]) & $b); - $h[$i] = (int) ((int) ($f[$i]) ^ $x); - } - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h); - } - - /** - * Create a copy of a field element. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core_Curve25519_Fe - */ - public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f) - { - $h = clone $f; - return $h; - } - - /** - * Give: 32-byte string. - * Receive: A field element object to use for internal calculations. - * - * @internal You should not use this directly from another application - * - * @param string $s - * @return ParagonIE_Sodium_Core_Curve25519_Fe - * @throws RangeException - * @throws TypeError - */ - public static function fe_frombytes($s) - { - if (self::strlen($s) !== 32) { - throw new RangeException('Expected a 32-byte string.'); - } - /** @var int $h0 */ - $h0 = self::load_4($s); - /** @var int $h1 */ - $h1 = self::load_3(self::substr($s, 4, 3)) << 6; - /** @var int $h2 */ - $h2 = self::load_3(self::substr($s, 7, 3)) << 5; - /** @var int $h3 */ - $h3 = self::load_3(self::substr($s, 10, 3)) << 3; - /** @var int $h4 */ - $h4 = self::load_3(self::substr($s, 13, 3)) << 2; - /** @var int $h5 */ - $h5 = self::load_4(self::substr($s, 16, 4)); - /** @var int $h6 */ - $h6 = self::load_3(self::substr($s, 20, 3)) << 7; - /** @var int $h7 */ - $h7 = self::load_3(self::substr($s, 23, 3)) << 5; - /** @var int $h8 */ - $h8 = self::load_3(self::substr($s, 26, 3)) << 4; - /** @var int $h9 */ - $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2; - - /** @var int $carry9 */ - $carry9 = ($h9 + (1 << 24)) >> 25; - $h0 += self::mul($carry9, 19, 5); - $h9 -= $carry9 << 25; - /** @var int $carry1 */ - $carry1 = ($h1 + (1 << 24)) >> 25; - $h2 += $carry1; - $h1 -= $carry1 << 25; - /** @var int $carry3 */ - $carry3 = ($h3 + (1 << 24)) >> 25; - $h4 += $carry3; - $h3 -= $carry3 << 25; - /** @var int $carry5 */ - $carry5 = ($h5 + (1 << 24)) >> 25; - $h6 += $carry5; - $h5 -= $carry5 << 25; - /** @var int $carry7 */ - $carry7 = ($h7 + (1 << 24)) >> 25; - $h8 += $carry7; - $h7 -= $carry7 << 25; - - /** @var int $carry0 */ - $carry0 = ($h0 + (1 << 25)) >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - /** @var int $carry2 */ - $carry2 = ($h2 + (1 << 25)) >> 26; - $h3 += $carry2; - $h2 -= $carry2 << 26; - /** @var int $carry4 */ - $carry4 = ($h4 + (1 << 25)) >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - /** @var int $carry6 */ - $carry6 = ($h6 + (1 << 25)) >> 26; - $h7 += $carry6; - $h6 -= $carry6 << 26; - /** @var int $carry8 */ - $carry8 = ($h8 + (1 << 25)) >> 26; - $h9 += $carry8; - $h8 -= $carry8 << 26; - - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( - array( - (int) $h0, - (int) $h1, - (int) $h2, - (int) $h3, - (int) $h4, - (int) $h5, - (int) $h6, - (int) $h7, - (int) $h8, - (int) $h9 - ) - ); - } - - /** - * Convert a field element to a byte string. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $h - * @return string - */ - public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h) - { - /** @var int $h0 */ - $h0 = (int) $h[0]; - /** @var int $h1 */ - $h1 = (int) $h[1]; - /** @var int $h2 */ - $h2 = (int) $h[2]; - /** @var int $h3 */ - $h3 = (int) $h[3]; - /** @var int $h4 */ - $h4 = (int) $h[4]; - /** @var int $h5 */ - $h5 = (int) $h[5]; - /** @var int $h6 */ - $h6 = (int) $h[6]; - /** @var int $h7 */ - $h7 = (int) $h[7]; - /** @var int $h8 */ - $h8 = (int) $h[8]; - /** @var int $h9 */ - $h9 = (int) $h[9]; - - /** @var int $q */ - $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25; - /** @var int $q */ - $q = ($h0 + $q) >> 26; - /** @var int $q */ - $q = ($h1 + $q) >> 25; - /** @var int $q */ - $q = ($h2 + $q) >> 26; - /** @var int $q */ - $q = ($h3 + $q) >> 25; - /** @var int $q */ - $q = ($h4 + $q) >> 26; - /** @var int $q */ - $q = ($h5 + $q) >> 25; - /** @var int $q */ - $q = ($h6 + $q) >> 26; - /** @var int $q */ - $q = ($h7 + $q) >> 25; - /** @var int $q */ - $q = ($h8 + $q) >> 26; - /** @var int $q */ - $q = ($h9 + $q) >> 25; - - $h0 += self::mul($q, 19, 5); - - /** @var int $carry0 */ - $carry0 = $h0 >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - /** @var int $carry1 */ - $carry1 = $h1 >> 25; - $h2 += $carry1; - $h1 -= $carry1 << 25; - /** @var int $carry2 */ - $carry2 = $h2 >> 26; - $h3 += $carry2; - $h2 -= $carry2 << 26; - /** @var int $carry3 */ - $carry3 = $h3 >> 25; - $h4 += $carry3; - $h3 -= $carry3 << 25; - /** @var int $carry4 */ - $carry4 = $h4 >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - /** @var int $carry5 */ - $carry5 = $h5 >> 25; - $h6 += $carry5; - $h5 -= $carry5 << 25; - /** @var int $carry6 */ - $carry6 = $h6 >> 26; - $h7 += $carry6; - $h6 -= $carry6 << 26; - /** @var int $carry7 */ - $carry7 = $h7 >> 25; - $h8 += $carry7; - $h7 -= $carry7 << 25; - /** @var int $carry8 */ - $carry8 = $h8 >> 26; - $h9 += $carry8; - $h8 -= $carry8 << 26; - /** @var int $carry9 */ - $carry9 = $h9 >> 25; - $h9 -= $carry9 << 25; - - /** - * @var array - */ - $s = array( - (int) (($h0 >> 0) & 0xff), - (int) (($h0 >> 8) & 0xff), - (int) (($h0 >> 16) & 0xff), - (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff), - (int) (($h1 >> 6) & 0xff), - (int) (($h1 >> 14) & 0xff), - (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff), - (int) (($h2 >> 5) & 0xff), - (int) (($h2 >> 13) & 0xff), - (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff), - (int) (($h3 >> 3) & 0xff), - (int) (($h3 >> 11) & 0xff), - (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff), - (int) (($h4 >> 2) & 0xff), - (int) (($h4 >> 10) & 0xff), - (int) (($h4 >> 18) & 0xff), - (int) (($h5 >> 0) & 0xff), - (int) (($h5 >> 8) & 0xff), - (int) (($h5 >> 16) & 0xff), - (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff), - (int) (($h6 >> 7) & 0xff), - (int) (($h6 >> 15) & 0xff), - (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff), - (int) (($h7 >> 5) & 0xff), - (int) (($h7 >> 13) & 0xff), - (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff), - (int) (($h8 >> 4) & 0xff), - (int) (($h8 >> 12) & 0xff), - (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff), - (int) (($h9 >> 2) & 0xff), - (int) (($h9 >> 10) & 0xff), - (int) (($h9 >> 18) & 0xff) - ); - return self::intArrayToString($s); - } - - /** - * Is a field element negative? (1 = yes, 0 = no. Used in calculations.) - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @return int - * @throws SodiumException - * @throws TypeError - */ - public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f) - { - $str = self::fe_tobytes($f); - return (int) (self::chrToInt($str[0]) & 1); - } - - /** - * Returns 0 if this field element results in all NUL bytes. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f) - { - static $zero; - if ($zero === null) { - $zero = str_repeat("\x00", 32); - } - /** @var string $zero */ - /** @var string $str */ - $str = self::fe_tobytes($f); - return !self::verify_32($str, (string) $zero); - } - - /** - * Multiply two field elements - * - * h = f * g - * - * @internal You should not use this directly from another application - * - * @security Is multiplication a source of timing leaks? If so, can we do - * anything to prevent that from happening? - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @param ParagonIE_Sodium_Core_Curve25519_Fe $g - * @return ParagonIE_Sodium_Core_Curve25519_Fe - */ - public static function fe_mul( - ParagonIE_Sodium_Core_Curve25519_Fe $f, - ParagonIE_Sodium_Core_Curve25519_Fe $g - ) { - /** @var int $f0 */ - $f0 = $f[0]; - /** @var int $f1 */ - $f1 = $f[1]; - /** @var int $f2 */ - $f2 = $f[2]; - /** @var int $f3 */ - $f3 = $f[3]; - /** @var int $f4 */ - $f4 = $f[4]; - /** @var int $f5 */ - $f5 = $f[5]; - /** @var int $f6 */ - $f6 = $f[6]; - /** @var int $f7 */ - $f7 = $f[7]; - /** @var int $f8 */ - $f8 = $f[8]; - /** @var int $f9 */ - $f9 = $f[9]; - /** @var int $g0 */ - $g0 = $g[0]; - /** @var int $g1 */ - $g1 = $g[1]; - /** @var int $g2 */ - $g2 = $g[2]; - /** @var int $g3 */ - $g3 = $g[3]; - /** @var int $g4 */ - $g4 = $g[4]; - /** @var int $g5 */ - $g5 = $g[5]; - /** @var int $g6 */ - $g6 = $g[6]; - /** @var int $g7 */ - $g7 = $g[7]; - /** @var int $g8 */ - $g8 = $g[8]; - /** @var int $g9 */ - $g9 = $g[9]; - $g1_19 = self::mul($g1, 19, 5); - $g2_19 = self::mul($g2, 19, 5); - $g3_19 = self::mul($g3, 19, 5); - $g4_19 = self::mul($g4, 19, 5); - $g5_19 = self::mul($g5, 19, 5); - $g6_19 = self::mul($g6, 19, 5); - $g7_19 = self::mul($g7, 19, 5); - $g8_19 = self::mul($g8, 19, 5); - $g9_19 = self::mul($g9, 19, 5); - /** @var int $f1_2 */ - $f1_2 = $f1 << 1; - /** @var int $f3_2 */ - $f3_2 = $f3 << 1; - /** @var int $f5_2 */ - $f5_2 = $f5 << 1; - /** @var int $f7_2 */ - $f7_2 = $f7 << 1; - /** @var int $f9_2 */ - $f9_2 = $f9 << 1; - $f0g0 = self::mul($f0, $g0, 26); - $f0g1 = self::mul($f0, $g1, 25); - $f0g2 = self::mul($f0, $g2, 26); - $f0g3 = self::mul($f0, $g3, 25); - $f0g4 = self::mul($f0, $g4, 26); - $f0g5 = self::mul($f0, $g5, 25); - $f0g6 = self::mul($f0, $g6, 26); - $f0g7 = self::mul($f0, $g7, 25); - $f0g8 = self::mul($f0, $g8, 26); - $f0g9 = self::mul($f0, $g9, 26); - $f1g0 = self::mul($f1, $g0, 26); - $f1g1_2 = self::mul($f1_2, $g1, 25); - $f1g2 = self::mul($f1, $g2, 26); - $f1g3_2 = self::mul($f1_2, $g3, 25); - $f1g4 = self::mul($f1, $g4, 26); - $f1g5_2 = self::mul($f1_2, $g5, 25); - $f1g6 = self::mul($f1, $g6, 26); - $f1g7_2 = self::mul($f1_2, $g7, 25); - $f1g8 = self::mul($f1, $g8, 26); - $f1g9_38 = self::mul($g9_19, $f1_2, 26); - $f2g0 = self::mul($f2, $g0, 26); - $f2g1 = self::mul($f2, $g1, 25); - $f2g2 = self::mul($f2, $g2, 26); - $f2g3 = self::mul($f2, $g3, 25); - $f2g4 = self::mul($f2, $g4, 26); - $f2g5 = self::mul($f2, $g5, 25); - $f2g6 = self::mul($f2, $g6, 26); - $f2g7 = self::mul($f2, $g7, 25); - $f2g8_19 = self::mul($g8_19, $f2, 26); - $f2g9_19 = self::mul($g9_19, $f2, 26); - $f3g0 = self::mul($f3, $g0, 26); - $f3g1_2 = self::mul($f3_2, $g1, 25); - $f3g2 = self::mul($f3, $g2, 26); - $f3g3_2 = self::mul($f3_2, $g3, 25); - $f3g4 = self::mul($f3, $g4, 26); - $f3g5_2 = self::mul($f3_2, $g5, 25); - $f3g6 = self::mul($f3, $g6, 26); - $f3g7_38 = self::mul($g7_19, $f3_2, 26); - $f3g8_19 = self::mul($g8_19, $f3, 25); - $f3g9_38 = self::mul($g9_19, $f3_2, 26); - $f4g0 = self::mul($f4, $g0, 26); - $f4g1 = self::mul($f4, $g1, 25); - $f4g2 = self::mul($f4, $g2, 26); - $f4g3 = self::mul($f4, $g3, 25); - $f4g4 = self::mul($f4, $g4, 26); - $f4g5 = self::mul($f4, $g5, 25); - $f4g6_19 = self::mul($g6_19, $f4, 26); - $f4g7_19 = self::mul($g7_19, $f4, 26); - $f4g8_19 = self::mul($g8_19, $f4, 26); - $f4g9_19 = self::mul($g9_19, $f4, 26); - $f5g0 = self::mul($f5, $g0, 26); - $f5g1_2 = self::mul($f5_2, $g1, 25); - $f5g2 = self::mul($f5, $g2, 26); - $f5g3_2 = self::mul($f5_2, $g3, 25); - $f5g4 = self::mul($f5, $g4, 26); - $f5g5_38 = self::mul($g5_19, $f5_2, 26); - $f5g6_19 = self::mul($g6_19, $f5, 25); - $f5g7_38 = self::mul($g7_19, $f5_2, 26); - $f5g8_19 = self::mul($g8_19, $f5, 25); - $f5g9_38 = self::mul($g9_19, $f5_2, 26); - $f6g0 = self::mul($f6, $g0, 26); - $f6g1 = self::mul($f6, $g1, 25); - $f6g2 = self::mul($f6, $g2, 26); - $f6g3 = self::mul($f6, $g3, 25); - $f6g4_19 = self::mul($g4_19, $f6, 26); - $f6g5_19 = self::mul($g5_19, $f6, 26); - $f6g6_19 = self::mul($g6_19, $f6, 26); - $f6g7_19 = self::mul($g7_19, $f6, 26); - $f6g8_19 = self::mul($g8_19, $f6, 26); - $f6g9_19 = self::mul($g9_19, $f6, 26); - $f7g0 = self::mul($f7, $g0, 26); - $f7g1_2 = self::mul($f7_2, $g1, 25); - $f7g2 = self::mul($f7, $g2, 26); - $f7g3_38 = self::mul($g3_19, $f7_2, 26); - $f7g4_19 = self::mul($g4_19, $f7, 26); - $f7g5_38 = self::mul($g5_19, $f7_2, 26); - $f7g6_19 = self::mul($g6_19, $f7, 25); - $f7g7_38 = self::mul($g7_19, $f7_2, 26); - $f7g8_19 = self::mul($g8_19, $f7, 25); - $f7g9_38 = self::mul($g9_19,$f7_2, 26); - $f8g0 = self::mul($f8, $g0, 26); - $f8g1 = self::mul($f8, $g1, 25); - $f8g2_19 = self::mul($g2_19, $f8, 26); - $f8g3_19 = self::mul($g3_19, $f8, 26); - $f8g4_19 = self::mul($g4_19, $f8, 26); - $f8g5_19 = self::mul($g5_19, $f8, 26); - $f8g6_19 = self::mul($g6_19, $f8, 26); - $f8g7_19 = self::mul($g7_19, $f8, 26); - $f8g8_19 = self::mul($g8_19, $f8, 26); - $f8g9_19 = self::mul($g9_19, $f8, 26); - $f9g0 = self::mul($f9, $g0, 26); - $f9g1_38 = self::mul($g1_19, $f9_2, 26); - $f9g2_19 = self::mul($g2_19, $f9, 25); - $f9g3_38 = self::mul($g3_19, $f9_2, 26); - $f9g4_19 = self::mul($g4_19, $f9, 25); - $f9g5_38 = self::mul($g5_19, $f9_2, 26); - $f9g6_19 = self::mul($g6_19, $f9, 25); - $f9g7_38 = self::mul($g7_19, $f9_2, 26); - $f9g8_19 = self::mul($g8_19, $f9, 25); - $f9g9_38 = self::mul($g9_19, $f9_2, 26); - $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38; - $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19; - $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38; - $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19; - $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38; - $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19; - $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; - $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; - $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; - $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; - - /** @var int $carry0 */ - $carry0 = ($h0 + (1 << 25)) >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - /** @var int $carry4 */ - $carry4 = ($h4 + (1 << 25)) >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - - /** @var int $carry1 */ - $carry1 = ($h1 + (1 << 24)) >> 25; - $h2 += $carry1; - $h1 -= $carry1 << 25; - /** @var int $carry5 */ - $carry5 = ($h5 + (1 << 24)) >> 25; - $h6 += $carry5; - $h5 -= $carry5 << 25; - - /** @var int $carry2 */ - $carry2 = ($h2 + (1 << 25)) >> 26; - $h3 += $carry2; - $h2 -= $carry2 << 26; - /** @var int $carry6 */ - $carry6 = ($h6 + (1 << 25)) >> 26; - $h7 += $carry6; - $h6 -= $carry6 << 26; - - /** @var int $carry3 */ - $carry3 = ($h3 + (1 << 24)) >> 25; - $h4 += $carry3; - $h3 -= $carry3 << 25; - /** @var int $carry7 */ - $carry7 = ($h7 + (1 << 24)) >> 25; - $h8 += $carry7; - $h7 -= $carry7 << 25; - - /** @var int $carry4 */ - $carry4 = ($h4 + (1 << 25)) >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - /** @var int $carry8 */ - $carry8 = ($h8 + (1 << 25)) >> 26; - $h9 += $carry8; - $h8 -= $carry8 << 26; - - /** @var int $carry9 */ - $carry9 = ($h9 + (1 << 24)) >> 25; - $h0 += self::mul($carry9, 19, 5); - $h9 -= $carry9 << 25; - - /** @var int $carry0 */ - $carry0 = ($h0 + (1 << 25)) >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( - array( - (int) $h0, - (int) $h1, - (int) $h2, - (int) $h3, - (int) $h4, - (int) $h5, - (int) $h6, - (int) $h7, - (int) $h8, - (int) $h9 - ) - ); - } - - /** - * Get the negative values for each piece of the field element. - * - * h = -f - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core_Curve25519_Fe - * @psalm-suppress MixedAssignment - */ - public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f) - { - $h = new ParagonIE_Sodium_Core_Curve25519_Fe(); - for ($i = 0; $i < 10; ++$i) { - $h[$i] = -$f[$i]; - } - return $h; - } - - /** - * Square a field element - * - * h = f * f - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core_Curve25519_Fe - */ - public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f) - { - $f0 = (int) $f[0]; - $f1 = (int) $f[1]; - $f2 = (int) $f[2]; - $f3 = (int) $f[3]; - $f4 = (int) $f[4]; - $f5 = (int) $f[5]; - $f6 = (int) $f[6]; - $f7 = (int) $f[7]; - $f8 = (int) $f[8]; - $f9 = (int) $f[9]; - - /** @var int $f0_2 */ - $f0_2 = $f0 << 1; - /** @var int $f1_2 */ - $f1_2 = $f1 << 1; - /** @var int $f2_2 */ - $f2_2 = $f2 << 1; - /** @var int $f3_2 */ - $f3_2 = $f3 << 1; - /** @var int $f4_2 */ - $f4_2 = $f4 << 1; - /** @var int $f5_2 */ - $f5_2 = $f5 << 1; - /** @var int $f6_2 */ - $f6_2 = $f6 << 1; - /** @var int $f7_2 */ - $f7_2 = $f7 << 1; - $f5_38 = self::mul($f5, 38, 6); - $f6_19 = self::mul($f6, 19, 5); - $f7_38 = self::mul($f7, 38, 6); - $f8_19 = self::mul($f8, 19, 5); - $f9_38 = self::mul($f9, 38, 6); - $f0f0 = self::mul($f0, $f0, 25); - $f0f1_2 = self::mul($f0_2, $f1, 24); - $f0f2_2 = self::mul($f0_2, $f2, 25); - $f0f3_2 = self::mul($f0_2, $f3, 24); - $f0f4_2 = self::mul($f0_2, $f4, 25); - $f0f5_2 = self::mul($f0_2, $f5, 25); - $f0f6_2 = self::mul($f0_2, $f6, 25); - $f0f7_2 = self::mul($f0_2, $f7, 24); - $f0f8_2 = self::mul($f0_2, $f8, 25); - $f0f9_2 = self::mul($f0_2, $f9, 25); - $f1f1_2 = self::mul($f1_2, $f1, 24); - $f1f2_2 = self::mul($f1_2, $f2, 25); - $f1f3_4 = self::mul($f1_2, $f3_2, 25); - $f1f4_2 = self::mul($f1_2, $f4, 25); - $f1f5_4 = self::mul($f1_2, $f5_2, 26); - $f1f6_2 = self::mul($f1_2, $f6, 25); - $f1f7_4 = self::mul($f1_2, $f7_2, 25); - $f1f8_2 = self::mul($f1_2, $f8, 25); - $f1f9_76 = self::mul($f9_38, $f1_2, 25); - $f2f2 = self::mul($f2, $f2, 25); - $f2f3_2 = self::mul($f2_2, $f3, 24); - $f2f4_2 = self::mul($f2_2, $f4, 25); - $f2f5_2 = self::mul($f2_2, $f5, 25); - $f2f6_2 = self::mul($f2_2, $f6, 25); - $f2f7_2 = self::mul($f2_2, $f7, 24); - $f2f8_38 = self::mul($f8_19, $f2_2, 26); - $f2f9_38 = self::mul($f9_38, $f2, 25); - $f3f3_2 = self::mul($f3_2, $f3, 24); - $f3f4_2 = self::mul($f3_2, $f4, 25); - $f3f5_4 = self::mul($f3_2, $f5_2, 26); - $f3f6_2 = self::mul($f3_2, $f6, 25); - $f3f7_76 = self::mul($f7_38, $f3_2, 25); - $f3f8_38 = self::mul($f8_19, $f3_2, 25); - $f3f9_76 = self::mul($f9_38, $f3_2, 25); - $f4f4 = self::mul($f4, $f4, 25); - $f4f5_2 = self::mul($f4_2, $f5, 25); - $f4f6_38 = self::mul($f6_19, $f4_2, 26); - $f4f7_38 = self::mul($f7_38, $f4, 25); - $f4f8_38 = self::mul($f8_19, $f4_2, 26); - $f4f9_38 = self::mul($f9_38, $f4, 25); - $f5f5_38 = self::mul($f5_38, $f5, 25); - $f5f6_38 = self::mul($f6_19, $f5_2, 26); - $f5f7_76 = self::mul($f7_38, $f5_2, 26); - $f5f8_38 = self::mul($f8_19, $f5_2, 26); - $f5f9_76 = self::mul($f9_38, $f5_2, 26); - $f6f6_19 = self::mul($f6_19, $f6, 25); - $f6f7_38 = self::mul($f7_38, $f6, 25); - $f6f8_38 = self::mul($f8_19, $f6_2, 26); - $f6f9_38 = self::mul($f9_38, $f6, 25); - $f7f7_38 = self::mul($f7_38, $f7, 24); - $f7f8_38 = self::mul($f8_19, $f7_2, 25); - $f7f9_76 = self::mul($f9_38, $f7_2, 25); - $f8f8_19 = self::mul($f8_19, $f8, 25); - $f8f9_38 = self::mul($f9_38, $f8, 25); - $f9f9_38 = self::mul($f9_38, $f9, 25); - $h0 = $f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38; - $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38; - $h2 = $f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19; - $h3 = $f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38; - $h4 = $f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38; - $h5 = $f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38; - $h6 = $f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19; - $h7 = $f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38; - $h8 = $f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38; - $h9 = $f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2; - - /** @var int $carry0 */ - $carry0 = ($h0 + (1 << 25)) >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - /** @var int $carry4 */ - $carry4 = ($h4 + (1 << 25)) >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - - /** @var int $carry1 */ - $carry1 = ($h1 + (1 << 24)) >> 25; - $h2 += $carry1; - $h1 -= $carry1 << 25; - /** @var int $carry5 */ - $carry5 = ($h5 + (1 << 24)) >> 25; - $h6 += $carry5; - $h5 -= $carry5 << 25; - - /** @var int $carry2 */ - $carry2 = ($h2 + (1 << 25)) >> 26; - $h3 += $carry2; - $h2 -= $carry2 << 26; - /** @var int $carry6 */ - $carry6 = ($h6 + (1 << 25)) >> 26; - $h7 += $carry6; - $h6 -= $carry6 << 26; - - /** @var int $carry3 */ - $carry3 = ($h3 + (1 << 24)) >> 25; - $h4 += $carry3; - $h3 -= $carry3 << 25; - /** @var int $carry7 */ - $carry7 = ($h7 + (1 << 24)) >> 25; - $h8 += $carry7; - $h7 -= $carry7 << 25; - - /** @var int $carry4 */ - $carry4 = ($h4 + (1 << 25)) >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - /** @var int $carry8 */ - $carry8 = ($h8 + (1 << 25)) >> 26; - $h9 += $carry8; - $h8 -= $carry8 << 26; - - /** @var int $carry9 */ - $carry9 = ($h9 + (1 << 24)) >> 25; - $h0 += self::mul($carry9, 19, 5); - $h9 -= $carry9 << 25; - - /** @var int $carry0 */ - $carry0 = ($h0 + (1 << 25)) >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( - array( - (int) $h0, - (int) $h1, - (int) $h2, - (int) $h3, - (int) $h4, - (int) $h5, - (int) $h6, - (int) $h7, - (int) $h8, - (int) $h9 - ) - ); - } - - - /** - * Square and double a field element - * - * h = 2 * f * f - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core_Curve25519_Fe - */ - public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f) - { - $f0 = (int) $f[0]; - $f1 = (int) $f[1]; - $f2 = (int) $f[2]; - $f3 = (int) $f[3]; - $f4 = (int) $f[4]; - $f5 = (int) $f[5]; - $f6 = (int) $f[6]; - $f7 = (int) $f[7]; - $f8 = (int) $f[8]; - $f9 = (int) $f[9]; - - /** @var int $f0_2 */ - $f0_2 = $f0 << 1; - /** @var int $f1_2 */ - $f1_2 = $f1 << 1; - /** @var int $f2_2 */ - $f2_2 = $f2 << 1; - /** @var int $f3_2 */ - $f3_2 = $f3 << 1; - /** @var int $f4_2 */ - $f4_2 = $f4 << 1; - /** @var int $f5_2 */ - $f5_2 = $f5 << 1; - /** @var int $f6_2 */ - $f6_2 = $f6 << 1; - /** @var int $f7_2 */ - $f7_2 = $f7 << 1; - $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */ - $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */ - $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */ - $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */ - $f9_38 = self::mul($f9, 38, 6); /* 1.959375*2^30 */ - $f0f0 = self::mul($f0, $f0, 24); - $f0f1_2 = self::mul($f0_2, $f1, 24); - $f0f2_2 = self::mul($f0_2, $f2, 24); - $f0f3_2 = self::mul($f0_2, $f3, 24); - $f0f4_2 = self::mul($f0_2, $f4, 24); - $f0f5_2 = self::mul($f0_2, $f5, 24); - $f0f6_2 = self::mul($f0_2, $f6, 24); - $f0f7_2 = self::mul($f0_2, $f7, 24); - $f0f8_2 = self::mul($f0_2, $f8, 24); - $f0f9_2 = self::mul($f0_2, $f9, 24); - $f1f1_2 = self::mul($f1_2, $f1, 24); - $f1f2_2 = self::mul($f1_2, $f2, 24); - $f1f3_4 = self::mul($f1_2, $f3_2, 24); - $f1f4_2 = self::mul($f1_2, $f4, 24); - $f1f5_4 = self::mul($f1_2, $f5_2, 24); - $f1f6_2 = self::mul($f1_2, $f6, 24); - $f1f7_4 = self::mul($f1_2, $f7_2, 24); - $f1f8_2 = self::mul($f1_2, $f8, 24); - $f1f9_76 = self::mul($f9_38, $f1_2, 24); - $f2f2 = self::mul($f2, $f2, 24); - $f2f3_2 = self::mul($f2_2, $f3, 24); - $f2f4_2 = self::mul($f2_2, $f4, 24); - $f2f5_2 = self::mul($f2_2, $f5, 24); - $f2f6_2 = self::mul($f2_2, $f6, 24); - $f2f7_2 = self::mul($f2_2, $f7, 24); - $f2f8_38 = self::mul($f8_19, $f2_2, 25); - $f2f9_38 = self::mul($f9_38, $f2, 24); - $f3f3_2 = self::mul($f3_2, $f3, 24); - $f3f4_2 = self::mul($f3_2, $f4, 24); - $f3f5_4 = self::mul($f3_2, $f5_2, 24); - $f3f6_2 = self::mul($f3_2, $f6, 24); - $f3f7_76 = self::mul($f7_38, $f3_2, 24); - $f3f8_38 = self::mul($f8_19, $f3_2, 24); - $f3f9_76 = self::mul($f9_38, $f3_2, 24); - $f4f4 = self::mul($f4, $f4, 24); - $f4f5_2 = self::mul($f4_2, $f5, 24); - $f4f6_38 = self::mul($f6_19, $f4_2, 25); - $f4f7_38 = self::mul($f7_38, $f4, 24); - $f4f8_38 = self::mul($f8_19, $f4_2, 25); - $f4f9_38 = self::mul($f9_38, $f4, 24); - $f5f5_38 = self::mul($f5_38, $f5, 24); - $f5f6_38 = self::mul($f6_19, $f5_2, 24); - $f5f7_76 = self::mul($f7_38, $f5_2, 24); - $f5f8_38 = self::mul($f8_19, $f5_2, 24); - $f5f9_76 = self::mul($f9_38, $f5_2, 24); - $f6f6_19 = self::mul($f6_19, $f6, 24); - $f6f7_38 = self::mul($f7_38, $f6, 24); - $f6f8_38 = self::mul($f8_19, $f6_2, 25); - $f6f9_38 = self::mul($f9_38, $f6, 24); - $f7f7_38 = self::mul($f7_38, $f7, 24); - $f7f8_38 = self::mul($f8_19, $f7_2, 24); - $f7f9_76 = self::mul($f9_38, $f7_2, 24); - $f8f8_19 = self::mul($f8_19, $f8, 24); - $f8f9_38 = self::mul($f9_38, $f8, 24); - $f9f9_38 = self::mul($f9_38, $f9, 24); - - /** @var int $h0 */ - $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1; - /** @var int $h1 */ - $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1; - /** @var int $h2 */ - $h2 = (int) ($f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1; - /** @var int $h3 */ - $h3 = (int) ($f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1; - /** @var int $h4 */ - $h4 = (int) ($f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1; - /** @var int $h5 */ - $h5 = (int) ($f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38) << 1; - /** @var int $h6 */ - $h6 = (int) ($f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19) << 1; - /** @var int $h7 */ - $h7 = (int) ($f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38) << 1; - /** @var int $h8 */ - $h8 = (int) ($f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38) << 1; - /** @var int $h9 */ - $h9 = (int) ($f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2) << 1; - - /** @var int $carry0 */ - $carry0 = ($h0 + (1 << 25)) >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - /** @var int $carry4 */ - $carry4 = ($h4 + (1 << 25)) >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - - /** @var int $carry1 */ - $carry1 = ($h1 + (1 << 24)) >> 25; - $h2 += $carry1; - $h1 -= $carry1 << 25; - /** @var int $carry5 */ - $carry5 = ($h5 + (1 << 24)) >> 25; - $h6 += $carry5; - $h5 -= $carry5 << 25; - - /** @var int $carry2 */ - $carry2 = ($h2 + (1 << 25)) >> 26; - $h3 += $carry2; - $h2 -= $carry2 << 26; - /** @var int $carry6 */ - $carry6 = ($h6 + (1 << 25)) >> 26; - $h7 += $carry6; - $h6 -= $carry6 << 26; - - /** @var int $carry3 */ - $carry3 = ($h3 + (1 << 24)) >> 25; - $h4 += $carry3; - $h3 -= $carry3 << 25; - /** @var int $carry7 */ - $carry7 = ($h7 + (1 << 24)) >> 25; - $h8 += $carry7; - $h7 -= $carry7 << 25; - - /** @var int $carry4 */ - $carry4 = ($h4 + (1 << 25)) >> 26; - $h5 += $carry4; - $h4 -= $carry4 << 26; - /** @var int $carry8 */ - $carry8 = ($h8 + (1 << 25)) >> 26; - $h9 += $carry8; - $h8 -= $carry8 << 26; - - /** @var int $carry9 */ - $carry9 = ($h9 + (1 << 24)) >> 25; - $h0 += self::mul($carry9, 19, 5); - $h9 -= $carry9 << 25; - - /** @var int $carry0 */ - $carry0 = ($h0 + (1 << 25)) >> 26; - $h1 += $carry0; - $h0 -= $carry0 << 26; - - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( - array( - (int) $h0, - (int) $h1, - (int) $h2, - (int) $h3, - (int) $h4, - (int) $h5, - (int) $h6, - (int) $h7, - (int) $h8, - (int) $h9 - ) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z - * @return ParagonIE_Sodium_Core_Curve25519_Fe - */ - public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z) - { - $z = clone $Z; - $t0 = self::fe_sq($z); - $t1 = self::fe_sq($t0); - $t1 = self::fe_sq($t1); - $t1 = self::fe_mul($z, $t1); - $t0 = self::fe_mul($t0, $t1); - $t2 = self::fe_sq($t0); - $t1 = self::fe_mul($t1, $t2); - $t2 = self::fe_sq($t1); - for ($i = 1; $i < 5; ++$i) { - $t2 = self::fe_sq($t2); - } - $t1 = self::fe_mul($t2, $t1); - $t2 = self::fe_sq($t1); - for ($i = 1; $i < 10; ++$i) { - $t2 = self::fe_sq($t2); - } - $t2 = self::fe_mul($t2, $t1); - $t3 = self::fe_sq($t2); - for ($i = 1; $i < 20; ++$i) { - $t3 = self::fe_sq($t3); - } - $t2 = self::fe_mul($t3, $t2); - $t2 = self::fe_sq($t2); - for ($i = 1; $i < 10; ++$i) { - $t2 = self::fe_sq($t2); - } - $t1 = self::fe_mul($t2, $t1); - $t2 = self::fe_sq($t1); - for ($i = 1; $i < 50; ++$i) { - $t2 = self::fe_sq($t2); - } - $t2 = self::fe_mul($t2, $t1); - $t3 = self::fe_sq($t2); - for ($i = 1; $i < 100; ++$i) { - $t3 = self::fe_sq($t3); - } - $t2 = self::fe_mul($t3, $t2); - $t2 = self::fe_sq($t2); - for ($i = 1; $i < 50; ++$i) { - $t2 = self::fe_sq($t2); - } - $t1 = self::fe_mul($t2, $t1); - $t1 = self::fe_sq($t1); - for ($i = 1; $i < 5; ++$i) { - $t1 = self::fe_sq($t1); - } - return self::fe_mul($t1, $t0); - } - - /** - * @internal You should not use this directly from another application - * - * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106 - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $z - * @return ParagonIE_Sodium_Core_Curve25519_Fe - */ - public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z) - { - # fe_sq(t0, z); - # fe_sq(t1, t0); - # fe_sq(t1, t1); - # fe_mul(t1, z, t1); - # fe_mul(t0, t0, t1); - # fe_sq(t0, t0); - # fe_mul(t0, t1, t0); - # fe_sq(t1, t0); - $t0 = self::fe_sq($z); - $t1 = self::fe_sq($t0); - $t1 = self::fe_sq($t1); - $t1 = self::fe_mul($z, $t1); - $t0 = self::fe_mul($t0, $t1); - $t0 = self::fe_sq($t0); - $t0 = self::fe_mul($t1, $t0); - $t1 = self::fe_sq($t0); - - # for (i = 1; i < 5; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 5; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t0, t1, t0); - # fe_sq(t1, t0); - $t0 = self::fe_mul($t1, $t0); - $t1 = self::fe_sq($t0); - - # for (i = 1; i < 10; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 10; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t1, t1, t0); - # fe_sq(t2, t1); - $t1 = self::fe_mul($t1, $t0); - $t2 = self::fe_sq($t1); - - # for (i = 1; i < 20; ++i) { - # fe_sq(t2, t2); - # } - for ($i = 1; $i < 20; ++$i) { - $t2 = self::fe_sq($t2); - } - - # fe_mul(t1, t2, t1); - # fe_sq(t1, t1); - $t1 = self::fe_mul($t2, $t1); - $t1 = self::fe_sq($t1); - - # for (i = 1; i < 10; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 10; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t0, t1, t0); - # fe_sq(t1, t0); - $t0 = self::fe_mul($t1, $t0); - $t1 = self::fe_sq($t0); - - # for (i = 1; i < 50; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 50; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t1, t1, t0); - # fe_sq(t2, t1); - $t1 = self::fe_mul($t1, $t0); - $t2 = self::fe_sq($t1); - - # for (i = 1; i < 100; ++i) { - # fe_sq(t2, t2); - # } - for ($i = 1; $i < 100; ++$i) { - $t2 = self::fe_sq($t2); - } - - # fe_mul(t1, t2, t1); - # fe_sq(t1, t1); - $t1 = self::fe_mul($t2, $t1); - $t1 = self::fe_sq($t1); - - # for (i = 1; i < 50; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 50; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t0, t1, t0); - # fe_sq(t0, t0); - # fe_sq(t0, t0); - # fe_mul(out, t0, z); - $t0 = self::fe_mul($t1, $t0); - $t0 = self::fe_sq($t0); - $t0 = self::fe_sq($t0); - return self::fe_mul($t0, $z); - } - - /** - * Subtract two field elements. - * - * h = f - g - * - * Preconditions: - * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - * - * Postconditions: - * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $f - * @param ParagonIE_Sodium_Core_Curve25519_Fe $g - * @return ParagonIE_Sodium_Core_Curve25519_Fe - * @psalm-suppress MixedOperand - */ - public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g) - { - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( - array( - (int) ($f[0] - $g[0]), - (int) ($f[1] - $g[1]), - (int) ($f[2] - $g[2]), - (int) ($f[3] - $g[3]), - (int) ($f[4] - $g[4]), - (int) ($f[5] - $g[5]), - (int) ($f[6] - $g[6]), - (int) ($f[7] - $g[7]), - (int) ($f[8] - $g[8]), - (int) ($f[9] - $g[9]) - ) - ); - } - - /** - * Add two group elements. - * - * r = p + q - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 - */ - public static function ge_add( - ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q - ) { - $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->YplusX); - $r->Y = self::fe_mul($r->Y, $q->YminusX); - $r->T = self::fe_mul($q->T2d, $p->T); - $r->X = self::fe_mul($p->Z, $q->Z); - $t0 = self::fe_add($r->X, $r->X); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_add($t0, $r->T); - $r->T = self::fe_sub($t0, $r->T); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215 - * @param string $a - * @return array - * @throws SodiumException - * @throws TypeError - */ - public static function slide($a) - { - if (self::strlen($a) < 256) { - if (self::strlen($a) < 16) { - $a = str_pad($a, 256, '0', STR_PAD_RIGHT); - } - } - /** @var array $r */ - $r = array(); - - /** @var int $i */ - for ($i = 0; $i < 256; ++$i) { - $r[$i] = (int) ( - 1 & ( - self::chrToInt($a[(int) ($i >> 3)]) - >> - ($i & 7) - ) - ); - } - - for ($i = 0;$i < 256;++$i) { - if ($r[$i]) { - for ($b = 1;$b <= 6 && $i + $b < 256;++$b) { - if ($r[$i + $b]) { - if ($r[$i] + ($r[$i + $b] << $b) <= 15) { - $r[$i] += $r[$i + $b] << $b; - $r[$i + $b] = 0; - } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) { - $r[$i] -= $r[$i + $b] << $b; - for ($k = $i + $b; $k < 256; ++$k) { - if (!$r[$k]) { - $r[$k] = 1; - break; - } - $r[$k] = 0; - } - } else { - break; - } - } - } - } - } - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $s - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_frombytes_negate_vartime($s) - { - static $d = null; - if (!$d) { - $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d); - } - - # fe_frombytes(h->Y,s); - # fe_1(h->Z); - $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3( - self::fe_0(), - self::fe_frombytes($s), - self::fe_1() - ); - - # fe_sq(u,h->Y); - # fe_mul(v,u,d); - # fe_sub(u,u,h->Z); /* u = y^2-1 */ - # fe_add(v,v,h->Z); /* v = dy^2+1 */ - $u = self::fe_sq($h->Y); - /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d */ - $v = self::fe_mul($u, $d); - $u = self::fe_sub($u, $h->Z); /* u = y^2 - 1 */ - $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */ - - # fe_sq(v3,v); - # fe_mul(v3,v3,v); /* v3 = v^3 */ - # fe_sq(h->X,v3); - # fe_mul(h->X,h->X,v); - # fe_mul(h->X,h->X,u); /* x = uv^7 */ - $v3 = self::fe_sq($v); - $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */ - $h->X = self::fe_sq($v3); - $h->X = self::fe_mul($h->X, $v); - $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */ - - # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ - # fe_mul(h->X,h->X,v3); - # fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ - $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */ - $h->X = self::fe_mul($h->X, $v3); - $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */ - - # fe_sq(vxx,h->X); - # fe_mul(vxx,vxx,v); - # fe_sub(check,vxx,u); /* vx^2-u */ - $vxx = self::fe_sq($h->X); - $vxx = self::fe_mul($vxx, $v); - $check = self::fe_sub($vxx, $u); /* vx^2 - u */ - - # if (fe_isnonzero(check)) { - # fe_add(check,vxx,u); /* vx^2+u */ - # if (fe_isnonzero(check)) { - # return -1; - # } - # fe_mul(h->X,h->X,sqrtm1); - # } - if (self::fe_isnonzero($check)) { - $check = self::fe_add($vxx, $u); /* vx^2 + u */ - if (self::fe_isnonzero($check)) { - throw new RangeException('Internal check failed.'); - } - $h->X = self::fe_mul( - $h->X, - ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1) - ); - } - - # if (fe_isnegative(h->X) == (s[31] >> 7)) { - # fe_neg(h->X,h->X); - # } - $i = self::chrToInt($s[31]); - if (self::fe_isnegative($h->X) === ($i >> 7)) { - $h->X = self::fe_neg($h->X); - } - - # fe_mul(h->T,h->X,h->Y); - $h->T = self::fe_mul($h->X, $h->Y); - return $h; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 - */ - public static function ge_madd( - ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R, - ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q - ) { - $r = clone $R; - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->yplusx); - $r->Y = self::fe_mul($r->Y, $q->yminusx); - $r->T = self::fe_mul($q->xy2d, $p->T); - $t0 = self::fe_add(clone $p->Z, clone $p->Z); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_add($t0, $r->T); - $r->T = self::fe_sub($t0, $r->T); - - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 - */ - public static function ge_msub( - ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R, - ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q - ) { - $r = clone $R; - - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->yminusx); - $r->Y = self::fe_mul($r->Y, $q->yplusx); - $r->T = self::fe_mul($q->xy2d, $p->T); - $t0 = self::fe_add($p->Z, $p->Z); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_sub($t0, $r->T); - $r->T = self::fe_add($t0, $r->T); - - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 - */ - public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) - { - $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2(); - $r->X = self::fe_mul($p->X, $p->T); - $r->Y = self::fe_mul($p->Y, $p->Z); - $r->Z = self::fe_mul($p->Z, $p->T); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 - */ - public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) - { - $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(); - $r->X = self::fe_mul($p->X, $p->T); - $r->Y = self::fe_mul($p->Y, $p->Z); - $r->Z = self::fe_mul($p->Z, $p->T); - $r->T = self::fe_mul($p->X, $p->Y); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 - */ - public static function ge_p2_0() - { - return new ParagonIE_Sodium_Core_Curve25519_Ge_P2( - self::fe_0(), - self::fe_1(), - self::fe_1() - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 - */ - public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p) - { - $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); - - $r->X = self::fe_sq($p->X); - $r->Z = self::fe_sq($p->Y); - $r->T = self::fe_sq2($p->Z); - $r->Y = self::fe_add($p->X, $p->Y); - $t0 = self::fe_sq($r->Y); - $r->Y = self::fe_add($r->Z, $r->X); - $r->Z = self::fe_sub($r->Z, $r->X); - $r->X = self::fe_sub($t0, $r->Y); - $r->T = self::fe_sub($r->T, $r->Z); - - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 - */ - public static function ge_p3_0() - { - return new ParagonIE_Sodium_Core_Curve25519_Ge_P3( - self::fe_0(), - self::fe_1(), - self::fe_1(), - self::fe_0() - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p - * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached - */ - public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) - { - static $d2 = null; - if ($d2 === null) { - $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2); - } - /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d2 */ - $r = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(); - $r->YplusX = self::fe_add($p->Y, $p->X); - $r->YminusX = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_copy($p->Z); - $r->T2d = self::fe_mul($p->T, $d2); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 - */ - public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) - { - return new ParagonIE_Sodium_Core_Curve25519_Ge_P2( - $p->X, - $p->Y, - $p->Z - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h) - { - $recip = self::fe_invert($h->Z); - $x = self::fe_mul($h->X, $recip); - $y = self::fe_mul($h->Y, $recip); - $s = self::fe_tobytes($y); - $s[31] = self::intToChr( - self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) - ); - return $s; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 - */ - public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) - { - $q = self::ge_p3_to_p2($p); - return self::ge_p2_dbl($q); - } - - /** - * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp - */ - public static function ge_precomp_0() - { - return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( - self::fe_1(), - self::fe_1(), - self::fe_0() - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $b - * @param int $c - * @return int - */ - public static function equal($b, $c) - { - return (int) ((($b ^ $c) - 1 & 0xffffffff) >> 31); - } - - /** - * @internal You should not use this directly from another application - * - * @param int|string $char - * @return int (1 = yes, 0 = no) - * @throws SodiumException - * @throws TypeError - */ - public static function negative($char) - { - if (is_int($char)) { - return $char < 0 ? 1 : 0; - } - $x = self::chrToInt(self::substr($char, 0, 1)); - return (int) ($x >> 63); - } - - /** - * Conditional move - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t - * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u - * @param int $b - * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp - */ - public static function cmov( - ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t, - ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u, - $b - ) { - if (!is_int($b)) { - throw new InvalidArgumentException('Expected an integer.'); - } - return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( - self::fe_cmov($t->yplusx, $u->yplusx, $b), - self::fe_cmov($t->yminusx, $u->yminusx, $b), - self::fe_cmov($t->xy2d, $u->xy2d, $b) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $pos - * @param int $b - * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayOffset - */ - public static function ge_select($pos = 0, $b = 0) - { - static $base = null; - if ($base === null) { - $base = array(); - /** @var int $i */ - foreach (self::$base as $i => $bas) { - for ($j = 0; $j < 8; ++$j) { - $base[$i][$j] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( - ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][0]), - ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][1]), - ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][2]) - ); - } - } - } - /** @var array> $base */ - if (!is_int($pos)) { - throw new InvalidArgumentException('Position must be an integer'); - } - if ($pos < 0 || $pos > 31) { - throw new RangeException('Position is out of range [0, 31]'); - } - - /** @var int $bnegative */ - $bnegative = self::negative($b); - /** @var int $babs */ - $babs = $b - (((-$bnegative) & $b) << 1); - - $t = self::ge_precomp_0(); - for ($i = 0; $i < 8; ++$i) { - $t = self::cmov( - $t, - $base[$pos][$i], - self::equal($babs, $i + 1) - ); - } - $minusT = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( - self::fe_copy($t->yminusx), - self::fe_copy($t->yplusx), - self::fe_neg($t->xy2d) - ); - return self::cmov($t, $minusT, $bnegative); - } - - /** - * Subtract two group elements. - * - * r = p - q - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 - */ - public static function ge_sub( - ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q - ) { - $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); - - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->YminusX); - $r->Y = self::fe_mul($r->Y, $q->YplusX); - $r->T = self::fe_mul($q->T2d, $p->T); - $r->X = self::fe_mul($p->Z, $q->Z); - $t0 = self::fe_add($r->X, $r->X); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_sub($t0, $r->T); - $r->T = self::fe_add($t0, $r->T); - - return $r; - } - - /** - * Convert a group element to a byte string. - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h) - { - $recip = self::fe_invert($h->Z); - $x = self::fe_mul($h->X, $recip); - $y = self::fe_mul($h->Y, $recip); - $s = self::fe_tobytes($y); - $s[31] = self::intToChr( - self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) - ); - return $s; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $a - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A - * @param string $b - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayAccess - */ - public static function ge_double_scalarmult_vartime( - $a, - ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A, - $b - ) { - /** @var array $Ai */ - $Ai = array(); - - /** @var array $Bi */ - static $Bi = array(); - if (!$Bi) { - for ($i = 0; $i < 8; ++$i) { - $Bi[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( - ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][0]), - ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][1]), - ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][2]) - ); - } - } - for ($i = 0; $i < 8; ++$i) { - $Ai[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached( - self::fe_0(), - self::fe_0(), - self::fe_0(), - self::fe_0() - ); - } - - # slide(aslide,a); - # slide(bslide,b); - /** @var array $aslide */ - $aslide = self::slide($a); - /** @var array $bslide */ - $bslide = self::slide($b); - - # ge_p3_to_cached(&Ai[0],A); - # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); - $Ai[0] = self::ge_p3_to_cached($A); - $t = self::ge_p3_dbl($A); - $A2 = self::ge_p1p1_to_p3($t); - - # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); - # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); - # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); - # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); - # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); - # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); - # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); - for ($i = 0; $i < 7; ++$i) { - $t = self::ge_add($A2, $Ai[$i]); - $u = self::ge_p1p1_to_p3($t); - $Ai[$i + 1] = self::ge_p3_to_cached($u); - } - - # ge_p2_0(r); - $r = self::ge_p2_0(); - - # for (i = 255;i >= 0;--i) { - # if (aslide[i] || bslide[i]) break; - # } - $i = 255; - for (; $i >= 0; --$i) { - if ($aslide[$i] || $bslide[$i]) { - break; - } - } - - # for (;i >= 0;--i) { - for (; $i >= 0; --$i) { - # ge_p2_dbl(&t,r); - $t = self::ge_p2_dbl($r); - - # if (aslide[i] > 0) { - if ($aslide[$i] > 0) { - # ge_p1p1_to_p3(&u,&t); - # ge_add(&t,&u,&Ai[aslide[i]/2]); - $u = self::ge_p1p1_to_p3($t); - $t = self::ge_add( - $u, - $Ai[(int) floor($aslide[$i] / 2)] - ); - # } else if (aslide[i] < 0) { - } elseif ($aslide[$i] < 0) { - # ge_p1p1_to_p3(&u,&t); - # ge_sub(&t,&u,&Ai[(-aslide[i])/2]); - $u = self::ge_p1p1_to_p3($t); - $t = self::ge_sub( - $u, - $Ai[(int) floor(-$aslide[$i] / 2)] - ); - } - - # if (bslide[i] > 0) { - if ($bslide[$i] > 0) { - /** @var int $index */ - $index = (int) floor($bslide[$i] / 2); - # ge_p1p1_to_p3(&u,&t); - # ge_madd(&t,&u,&Bi[bslide[i]/2]); - $u = self::ge_p1p1_to_p3($t); - $t = self::ge_madd($t, $u, $Bi[$index]); - # } else if (bslide[i] < 0) { - } elseif ($bslide[$i] < 0) { - /** @var int $index */ - $index = (int) floor(-$bslide[$i] / 2); - # ge_p1p1_to_p3(&u,&t); - # ge_msub(&t,&u,&Bi[(-bslide[i])/2]); - $u = self::ge_p1p1_to_p3($t); - $t = self::ge_msub($t, $u, $Bi[$index]); - } - # ge_p1p1_to_p2(r,&t); - $r = self::ge_p1p1_to_p2($t); - } - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $a - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedOperand - */ - public static function ge_scalarmult_base($a) - { - /** @var array $e */ - $e = array(); - $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); - - for ($i = 0; $i < 32; ++$i) { - /** @var int $dbl */ - $dbl = (int) $i << 1; - $e[$dbl] = (int) self::chrToInt($a[$i]) & 15; - $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15; - } - - /** @var int $carry */ - $carry = 0; - for ($i = 0; $i < 63; ++$i) { - $e[$i] += $carry; - /** @var int $carry */ - $carry = $e[$i] + 8; - /** @var int $carry */ - $carry >>= 4; - $e[$i] -= $carry << 4; - } - /** @var array $e */ - $e[63] += (int) $carry; - - $h = self::ge_p3_0(); - - for ($i = 1; $i < 64; $i += 2) { - $t = self::ge_select((int) floor($i / 2), (int) $e[$i]); - $r = self::ge_madd($r, $h, $t); - $h = self::ge_p1p1_to_p3($r); - } - - $r = self::ge_p3_dbl($h); - - $s = self::ge_p1p1_to_p2($r); - $r = self::ge_p2_dbl($s); - $s = self::ge_p1p1_to_p2($r); - $r = self::ge_p2_dbl($s); - $s = self::ge_p1p1_to_p2($r); - $r = self::ge_p2_dbl($s); - - $h = self::ge_p1p1_to_p3($r); - - for ($i = 0; $i < 64; $i += 2) { - $t = self::ge_select($i >> 1, (int) $e[$i]); - $r = self::ge_madd($r, $h, $t); - $h = self::ge_p1p1_to_p3($r); - } - return $h; - } - - /** - * Calculates (ab + c) mod l - * where l = 2^252 + 27742317777372353535851937790883648493 - * - * @internal You should not use this directly from another application - * - * @param string $a - * @param string $b - * @param string $c - * @return string - * @throws TypeError - */ - public static function sc_muladd($a, $b, $c) - { - /** @var int $a0 */ - $a0 = 2097151 & self::load_3(self::substr($a, 0, 3)); - /** @var int $a1 */ - $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5); - /** @var int $a2 */ - $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2); - /** @var int $a3 */ - $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7); - /** @var int $a4 */ - $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4); - /** @var int $a5 */ - $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1); - /** @var int $a6 */ - $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6); - /** @var int $a7 */ - $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3); - /** @var int $a8 */ - $a8 = 2097151 & self::load_3(self::substr($a, 21, 3)); - /** @var int $a9 */ - $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5); - /** @var int $a10 */ - $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2); - /** @var int $a11 */ - $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7); - - /** @var int $b0 */ - $b0 = 2097151 & self::load_3(self::substr($b, 0, 3)); - /** @var int $b1 */ - $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5); - /** @var int $b2 */ - $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2); - /** @var int $b3 */ - $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7); - /** @var int $b4 */ - $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4); - /** @var int $b5 */ - $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1); - /** @var int $b6 */ - $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6); - /** @var int $b7 */ - $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3); - /** @var int $b8 */ - $b8 = 2097151 & self::load_3(self::substr($b, 21, 3)); - /** @var int $b9 */ - $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5); - /** @var int $b10 */ - $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2); - /** @var int $b11 */ - $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7); - - /** @var int $c0 */ - $c0 = 2097151 & self::load_3(self::substr($c, 0, 3)); - /** @var int $c1 */ - $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5); - /** @var int $c2 */ - $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2); - /** @var int $c3 */ - $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7); - /** @var int $c4 */ - $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4); - /** @var int $c5 */ - $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1); - /** @var int $c6 */ - $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6); - /** @var int $c7 */ - $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3); - /** @var int $c8 */ - $c8 = 2097151 & self::load_3(self::substr($c, 21, 3)); - /** @var int $c9 */ - $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5); - /** @var int $c10 */ - $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2); - /** @var int $c11 */ - $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7); - - /* Can't really avoid the pyramid here: */ - $s0 = $c0 + self::mul($a0, $b0, 24); - $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24); - $s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24); - $s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24); - $s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) + - self::mul($a4, $b0, 24); - $s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) + - self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24); - $s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) + - self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24); - $s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) + - self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24); - $s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) + - self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) + - self::mul($a8, $b0, 24); - $s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) + - self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) + - self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24); - $s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) + - self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) + - self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24); - $s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) + - self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) + - self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24); - $s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) + - self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) + - self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24); - $s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) + - self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) + - self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24); - $s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) + - self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) + - self::mul($a11, $b3, 24); - $s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) + - self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24); - $s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) + - self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24); - $s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) + - self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24); - $s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) + - self::mul($a11, $b7, 24); - $s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24); - $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24); - $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24); - $s22 = self::mul($a11, $b11, 24); - $s23 = 0; - - /** @var int $carry0 */ - $carry0 = ($s0 + (1 << 20)) >> 21; - $s1 += $carry0; - $s0 -= $carry0 << 21; - /** @var int $carry2 */ - $carry2 = ($s2 + (1 << 20)) >> 21; - $s3 += $carry2; - $s2 -= $carry2 << 21; - /** @var int $carry4 */ - $carry4 = ($s4 + (1 << 20)) >> 21; - $s5 += $carry4; - $s4 -= $carry4 << 21; - /** @var int $carry6 */ - $carry6 = ($s6 + (1 << 20)) >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry8 */ - $carry8 = ($s8 + (1 << 20)) >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry10 */ - $carry10 = ($s10 + (1 << 20)) >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - /** @var int $carry12 */ - $carry12 = ($s12 + (1 << 20)) >> 21; - $s13 += $carry12; - $s12 -= $carry12 << 21; - /** @var int $carry14 */ - $carry14 = ($s14 + (1 << 20)) >> 21; - $s15 += $carry14; - $s14 -= $carry14 << 21; - /** @var int $carry16 */ - $carry16 = ($s16 + (1 << 20)) >> 21; - $s17 += $carry16; - $s16 -= $carry16 << 21; - /** @var int $carry18 */ - $carry18 = ($s18 + (1 << 20)) >> 21; - $s19 += $carry18; - $s18 -= $carry18 << 21; - /** @var int $carry20 */ - $carry20 = ($s20 + (1 << 20)) >> 21; - $s21 += $carry20; - $s20 -= $carry20 << 21; - /** @var int $carry22 */ - $carry22 = ($s22 + (1 << 20)) >> 21; - $s23 += $carry22; - $s22 -= $carry22 << 21; - - /** @var int $carry1 */ - $carry1 = ($s1 + (1 << 20)) >> 21; - $s2 += $carry1; - $s1 -= $carry1 << 21; - /** @var int $carry3 */ - $carry3 = ($s3 + (1 << 20)) >> 21; - $s4 += $carry3; - $s3 -= $carry3 << 21; - /** @var int $carry5 */ - $carry5 = ($s5 + (1 << 20)) >> 21; - $s6 += $carry5; - $s5 -= $carry5 << 21; - /** @var int $carry7 */ - $carry7 = ($s7 + (1 << 20)) >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry9 */ - $carry9 = ($s9 + (1 << 20)) >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry11 */ - $carry11 = ($s11 + (1 << 20)) >> 21; - $s12 += $carry11; - $s11 -= $carry11 << 21; - /** @var int $carry13 */ - $carry13 = ($s13 + (1 << 20)) >> 21; - $s14 += $carry13; - $s13 -= $carry13 << 21; - /** @var int $carry15 */ - $carry15 = ($s15 + (1 << 20)) >> 21; - $s16 += $carry15; - $s15 -= $carry15 << 21; - /** @var int $carry17 */ - $carry17 = ($s17 + (1 << 20)) >> 21; - $s18 += $carry17; - $s17 -= $carry17 << 21; - /** @var int $carry19 */ - $carry19 = ($s19 + (1 << 20)) >> 21; - $s20 += $carry19; - $s19 -= $carry19 << 21; - /** @var int $carry21 */ - $carry21 = ($s21 + (1 << 20)) >> 21; - $s22 += $carry21; - $s21 -= $carry21 << 21; - - $s11 += self::mul($s23, 666643, 20); - $s12 += self::mul($s23, 470296, 19); - $s13 += self::mul($s23, 654183, 20); - $s14 -= self::mul($s23, 997805, 20); - $s15 += self::mul($s23, 136657, 18); - $s16 -= self::mul($s23, 683901, 20); - - $s10 += self::mul($s22, 666643, 20); - $s11 += self::mul($s22, 470296, 19); - $s12 += self::mul($s22, 654183, 20); - $s13 -= self::mul($s22, 997805, 20); - $s14 += self::mul($s22, 136657, 18); - $s15 -= self::mul($s22, 683901, 20); - - $s9 += self::mul($s21, 666643, 20); - $s10 += self::mul($s21, 470296, 19); - $s11 += self::mul($s21, 654183, 20); - $s12 -= self::mul($s21, 997805, 20); - $s13 += self::mul($s21, 136657, 18); - $s14 -= self::mul($s21, 683901, 20); - - $s8 += self::mul($s20, 666643, 20); - $s9 += self::mul($s20, 470296, 19); - $s10 += self::mul($s20, 654183, 20); - $s11 -= self::mul($s20, 997805, 20); - $s12 += self::mul($s20, 136657, 18); - $s13 -= self::mul($s20, 683901, 20); - - $s7 += self::mul($s19, 666643, 20); - $s8 += self::mul($s19, 470296, 19); - $s9 += self::mul($s19, 654183, 20); - $s10 -= self::mul($s19, 997805, 20); - $s11 += self::mul($s19, 136657, 18); - $s12 -= self::mul($s19, 683901, 20); - - $s6 += self::mul($s18, 666643, 20); - $s7 += self::mul($s18, 470296, 19); - $s8 += self::mul($s18, 654183, 20); - $s9 -= self::mul($s18, 997805, 20); - $s10 += self::mul($s18, 136657, 18); - $s11 -= self::mul($s18, 683901, 20); - - /** @var int $carry6 */ - $carry6 = ($s6 + (1 << 20)) >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry8 */ - $carry8 = ($s8 + (1 << 20)) >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry10 */ - $carry10 = ($s10 + (1 << 20)) >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - /** @var int $carry12 */ - $carry12 = ($s12 + (1 << 20)) >> 21; - $s13 += $carry12; - $s12 -= $carry12 << 21; - /** @var int $carry14 */ - $carry14 = ($s14 + (1 << 20)) >> 21; - $s15 += $carry14; - $s14 -= $carry14 << 21; - /** @var int $carry16 */ - $carry16 = ($s16 + (1 << 20)) >> 21; - $s17 += $carry16; - $s16 -= $carry16 << 21; - - /** @var int $carry7 */ - $carry7 = ($s7 + (1 << 20)) >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry9 */ - $carry9 = ($s9 + (1 << 20)) >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry11 */ - $carry11 = ($s11 + (1 << 20)) >> 21; - $s12 += $carry11; - $s11 -= $carry11 << 21; - /** @var int $carry13 */ - $carry13 = ($s13 + (1 << 20)) >> 21; - $s14 += $carry13; - $s13 -= $carry13 << 21; - /** @var int $carry15 */ - $carry15 = ($s15 + (1 << 20)) >> 21; - $s16 += $carry15; - $s15 -= $carry15 << 21; - - $s5 += self::mul($s17, 666643, 20); - $s6 += self::mul($s17, 470296, 19); - $s7 += self::mul($s17, 654183, 20); - $s8 -= self::mul($s17, 997805, 20); - $s9 += self::mul($s17, 136657, 18); - $s10 -= self::mul($s17, 683901, 20); - - $s4 += self::mul($s16, 666643, 20); - $s5 += self::mul($s16, 470296, 19); - $s6 += self::mul($s16, 654183, 20); - $s7 -= self::mul($s16, 997805, 20); - $s8 += self::mul($s16, 136657, 18); - $s9 -= self::mul($s16, 683901, 20); - - $s3 += self::mul($s15, 666643, 20); - $s4 += self::mul($s15, 470296, 19); - $s5 += self::mul($s15, 654183, 20); - $s6 -= self::mul($s15, 997805, 20); - $s7 += self::mul($s15, 136657, 18); - $s8 -= self::mul($s15, 683901, 20); - - $s2 += self::mul($s14, 666643, 20); - $s3 += self::mul($s14, 470296, 19); - $s4 += self::mul($s14, 654183, 20); - $s5 -= self::mul($s14, 997805, 20); - $s6 += self::mul($s14, 136657, 18); - $s7 -= self::mul($s14, 683901, 20); - - $s1 += self::mul($s13, 666643, 20); - $s2 += self::mul($s13, 470296, 19); - $s3 += self::mul($s13, 654183, 20); - $s4 -= self::mul($s13, 997805, 20); - $s5 += self::mul($s13, 136657, 18); - $s6 -= self::mul($s13, 683901, 20); - - $s0 += self::mul($s12, 666643, 20); - $s1 += self::mul($s12, 470296, 19); - $s2 += self::mul($s12, 654183, 20); - $s3 -= self::mul($s12, 997805, 20); - $s4 += self::mul($s12, 136657, 18); - $s5 -= self::mul($s12, 683901, 20); - $s12 = 0; - - /** @var int $carry0 */ - $carry0 = ($s0 + (1 << 20)) >> 21; - $s1 += $carry0; - $s0 -= $carry0 << 21; - /** @var int $carry2 */ - $carry2 = ($s2 + (1 << 20)) >> 21; - $s3 += $carry2; - $s2 -= $carry2 << 21; - /** @var int $carry4 */ - $carry4 = ($s4 + (1 << 20)) >> 21; - $s5 += $carry4; - $s4 -= $carry4 << 21; - /** @var int $carry6 */ - $carry6 = ($s6 + (1 << 20)) >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry8 */ - $carry8 = ($s8 + (1 << 20)) >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry10 */ - $carry10 = ($s10 + (1 << 20)) >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - - /** @var int $carry1 */ - $carry1 = ($s1 + (1 << 20)) >> 21; - $s2 += $carry1; - $s1 -= $carry1 << 21; - /** @var int $carry3 */ - $carry3 = ($s3 + (1 << 20)) >> 21; - $s4 += $carry3; - $s3 -= $carry3 << 21; - /** @var int $carry5 */ - $carry5 = ($s5 + (1 << 20)) >> 21; - $s6 += $carry5; - $s5 -= $carry5 << 21; - /** @var int $carry7 */ - $carry7 = ($s7 + (1 << 20)) >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry9 */ - $carry9 = ($s9 + (1 << 20)) >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry11 */ - $carry11 = ($s11 + (1 << 20)) >> 21; - $s12 += $carry11; - $s11 -= $carry11 << 21; - - $s0 += self::mul($s12, 666643, 20); - $s1 += self::mul($s12, 470296, 19); - $s2 += self::mul($s12, 654183, 20); - $s3 -= self::mul($s12, 997805, 20); - $s4 += self::mul($s12, 136657, 18); - $s5 -= self::mul($s12, 683901, 20); - $s12 = 0; - - /** @var int $carry0 */ - $carry0 = $s0 >> 21; - $s1 += $carry0; - $s0 -= $carry0 << 21; - /** @var int $carry1 */ - $carry1 = $s1 >> 21; - $s2 += $carry1; - $s1 -= $carry1 << 21; - /** @var int $carry2 */ - $carry2 = $s2 >> 21; - $s3 += $carry2; - $s2 -= $carry2 << 21; - /** @var int $carry3 */ - $carry3 = $s3 >> 21; - $s4 += $carry3; - $s3 -= $carry3 << 21; - /** @var int $carry4 */ - $carry4 = $s4 >> 21; - $s5 += $carry4; - $s4 -= $carry4 << 21; - /** @var int $carry5 */ - $carry5 = $s5 >> 21; - $s6 += $carry5; - $s5 -= $carry5 << 21; - /** @var int $carry6 */ - $carry6 = $s6 >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry7 */ - $carry7 = $s7 >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry8 */ - $carry8 = $s8 >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry9 */ - $carry9 = $s9 >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry10 */ - $carry10 = $s10 >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - /** @var int $carry11 */ - $carry11 = $s11 >> 21; - $s12 += $carry11; - $s11 -= $carry11 << 21; - - $s0 += self::mul($s12, 666643, 20); - $s1 += self::mul($s12, 470296, 19); - $s2 += self::mul($s12, 654183, 20); - $s3 -= self::mul($s12, 997805, 20); - $s4 += self::mul($s12, 136657, 18); - $s5 -= self::mul($s12, 683901, 20); - - /** @var int $carry0 */ - $carry0 = $s0 >> 21; - $s1 += $carry0; - $s0 -= $carry0 << 21; - /** @var int $carry1 */ - $carry1 = $s1 >> 21; - $s2 += $carry1; - $s1 -= $carry1 << 21; - /** @var int $carry2 */ - $carry2 = $s2 >> 21; - $s3 += $carry2; - $s2 -= $carry2 << 21; - /** @var int $carry3 */ - $carry3 = $s3 >> 21; - $s4 += $carry3; - $s3 -= $carry3 << 21; - /** @var int $carry4 */ - $carry4 = $s4 >> 21; - $s5 += $carry4; - $s4 -= $carry4 << 21; - /** @var int $carry5 */ - $carry5 = $s5 >> 21; - $s6 += $carry5; - $s5 -= $carry5 << 21; - /** @var int $carry6 */ - $carry6 = $s6 >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry7 */ - $carry7 = $s7 >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry8 */ - $carry8 = $s8 >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry9 */ - $carry9 = $s9 >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry10 */ - $carry10 = $s10 >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - - /** - * @var array - */ - $arr = array( - (int) (0xff & ($s0 >> 0)), - (int) (0xff & ($s0 >> 8)), - (int) (0xff & (($s0 >> 16) | $s1 << 5)), - (int) (0xff & ($s1 >> 3)), - (int) (0xff & ($s1 >> 11)), - (int) (0xff & (($s1 >> 19) | $s2 << 2)), - (int) (0xff & ($s2 >> 6)), - (int) (0xff & (($s2 >> 14) | $s3 << 7)), - (int) (0xff & ($s3 >> 1)), - (int) (0xff & ($s3 >> 9)), - (int) (0xff & (($s3 >> 17) | $s4 << 4)), - (int) (0xff & ($s4 >> 4)), - (int) (0xff & ($s4 >> 12)), - (int) (0xff & (($s4 >> 20) | $s5 << 1)), - (int) (0xff & ($s5 >> 7)), - (int) (0xff & (($s5 >> 15) | $s6 << 6)), - (int) (0xff & ($s6 >> 2)), - (int) (0xff & ($s6 >> 10)), - (int) (0xff & (($s6 >> 18) | $s7 << 3)), - (int) (0xff & ($s7 >> 5)), - (int) (0xff & ($s7 >> 13)), - (int) (0xff & ($s8 >> 0)), - (int) (0xff & ($s8 >> 8)), - (int) (0xff & (($s8 >> 16) | $s9 << 5)), - (int) (0xff & ($s9 >> 3)), - (int) (0xff & ($s9 >> 11)), - (int) (0xff & (($s9 >> 19) | $s10 << 2)), - (int) (0xff & ($s10 >> 6)), - (int) (0xff & (($s10 >> 14) | $s11 << 7)), - (int) (0xff & ($s11 >> 1)), - (int) (0xff & ($s11 >> 9)), - 0xff & ($s11 >> 17) - ); - return self::intArrayToString($arr); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $s - * @return string - * @throws TypeError - */ - public static function sc_reduce($s) - { - /** @var int $s0 */ - $s0 = 2097151 & self::load_3(self::substr($s, 0, 3)); - /** @var int $s1 */ - $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5); - /** @var int $s2 */ - $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2); - /** @var int $s3 */ - $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7); - /** @var int $s4 */ - $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4); - /** @var int $s5 */ - $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1); - /** @var int $s6 */ - $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6); - /** @var int $s7 */ - $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3); - /** @var int $s8 */ - $s8 = 2097151 & self::load_3(self::substr($s, 21, 3)); - /** @var int $s9 */ - $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5); - /** @var int $s10 */ - $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2); - /** @var int $s11 */ - $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7); - /** @var int $s12 */ - $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4); - /** @var int $s13 */ - $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1); - /** @var int $s14 */ - $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6); - /** @var int $s15 */ - $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3); - /** @var int $s16 */ - $s16 = 2097151 & self::load_3(self::substr($s, 42, 3)); - /** @var int $s17 */ - $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5); - /** @var int $s18 */ - $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2); - /** @var int $s19 */ - $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7); - /** @var int $s20 */ - $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4); - /** @var int $s21 */ - $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1); - /** @var int $s22 */ - $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6); - /** @var int $s23 */ - $s23 = (self::load_4(self::substr($s, 60, 4)) >> 3); - - $s11 += self::mul($s23, 666643, 20); - $s12 += self::mul($s23, 470296, 19); - $s13 += self::mul($s23, 654183, 20); - $s14 -= self::mul($s23, 997805, 20); - $s15 += self::mul($s23, 136657, 18); - $s16 -= self::mul($s23, 683901, 20); - - $s10 += self::mul($s22, 666643, 20); - $s11 += self::mul($s22, 470296, 19); - $s12 += self::mul($s22, 654183, 20); - $s13 -= self::mul($s22, 997805, 20); - $s14 += self::mul($s22, 136657, 18); - $s15 -= self::mul($s22, 683901, 20); - - $s9 += self::mul($s21, 666643, 20); - $s10 += self::mul($s21, 470296, 19); - $s11 += self::mul($s21, 654183, 20); - $s12 -= self::mul($s21, 997805, 20); - $s13 += self::mul($s21, 136657, 18); - $s14 -= self::mul($s21, 683901, 20); - - $s8 += self::mul($s20, 666643, 20); - $s9 += self::mul($s20, 470296, 19); - $s10 += self::mul($s20, 654183, 20); - $s11 -= self::mul($s20, 997805, 20); - $s12 += self::mul($s20, 136657, 18); - $s13 -= self::mul($s20, 683901, 20); - - $s7 += self::mul($s19, 666643, 20); - $s8 += self::mul($s19, 470296, 19); - $s9 += self::mul($s19, 654183, 20); - $s10 -= self::mul($s19, 997805, 20); - $s11 += self::mul($s19, 136657, 18); - $s12 -= self::mul($s19, 683901, 20); - - $s6 += self::mul($s18, 666643, 20); - $s7 += self::mul($s18, 470296, 19); - $s8 += self::mul($s18, 654183, 20); - $s9 -= self::mul($s18, 997805, 20); - $s10 += self::mul($s18, 136657, 18); - $s11 -= self::mul($s18, 683901, 20); - - /** @var int $carry6 */ - $carry6 = ($s6 + (1 << 20)) >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry8 */ - $carry8 = ($s8 + (1 << 20)) >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry10 */ - $carry10 = ($s10 + (1 << 20)) >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - /** @var int $carry12 */ - $carry12 = ($s12 + (1 << 20)) >> 21; - $s13 += $carry12; - $s12 -= $carry12 << 21; - /** @var int $carry14 */ - $carry14 = ($s14 + (1 << 20)) >> 21; - $s15 += $carry14; - $s14 -= $carry14 << 21; - /** @var int $carry16 */ - $carry16 = ($s16 + (1 << 20)) >> 21; - $s17 += $carry16; - $s16 -= $carry16 << 21; - - /** @var int $carry7 */ - $carry7 = ($s7 + (1 << 20)) >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry9 */ - $carry9 = ($s9 + (1 << 20)) >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry11 */ - $carry11 = ($s11 + (1 << 20)) >> 21; - $s12 += $carry11; - $s11 -= $carry11 << 21; - /** @var int $carry13 */ - $carry13 = ($s13 + (1 << 20)) >> 21; - $s14 += $carry13; - $s13 -= $carry13 << 21; - /** @var int $carry15 */ - $carry15 = ($s15 + (1 << 20)) >> 21; - $s16 += $carry15; - $s15 -= $carry15 << 21; - - $s5 += self::mul($s17, 666643, 20); - $s6 += self::mul($s17, 470296, 19); - $s7 += self::mul($s17, 654183, 20); - $s8 -= self::mul($s17, 997805, 20); - $s9 += self::mul($s17, 136657, 18); - $s10 -= self::mul($s17, 683901, 20); - - $s4 += self::mul($s16, 666643, 20); - $s5 += self::mul($s16, 470296, 19); - $s6 += self::mul($s16, 654183, 20); - $s7 -= self::mul($s16, 997805, 20); - $s8 += self::mul($s16, 136657, 18); - $s9 -= self::mul($s16, 683901, 20); - - $s3 += self::mul($s15, 666643, 20); - $s4 += self::mul($s15, 470296, 19); - $s5 += self::mul($s15, 654183, 20); - $s6 -= self::mul($s15, 997805, 20); - $s7 += self::mul($s15, 136657, 18); - $s8 -= self::mul($s15, 683901, 20); - - $s2 += self::mul($s14, 666643, 20); - $s3 += self::mul($s14, 470296, 19); - $s4 += self::mul($s14, 654183, 20); - $s5 -= self::mul($s14, 997805, 20); - $s6 += self::mul($s14, 136657, 18); - $s7 -= self::mul($s14, 683901, 20); - - $s1 += self::mul($s13, 666643, 20); - $s2 += self::mul($s13, 470296, 19); - $s3 += self::mul($s13, 654183, 20); - $s4 -= self::mul($s13, 997805, 20); - $s5 += self::mul($s13, 136657, 18); - $s6 -= self::mul($s13, 683901, 20); - - $s0 += self::mul($s12, 666643, 20); - $s1 += self::mul($s12, 470296, 19); - $s2 += self::mul($s12, 654183, 20); - $s3 -= self::mul($s12, 997805, 20); - $s4 += self::mul($s12, 136657, 18); - $s5 -= self::mul($s12, 683901, 20); - $s12 = 0; - - /** @var int $carry0 */ - $carry0 = ($s0 + (1 << 20)) >> 21; - $s1 += $carry0; - $s0 -= $carry0 << 21; - /** @var int $carry2 */ - $carry2 = ($s2 + (1 << 20)) >> 21; - $s3 += $carry2; - $s2 -= $carry2 << 21; - /** @var int $carry4 */ - $carry4 = ($s4 + (1 << 20)) >> 21; - $s5 += $carry4; - $s4 -= $carry4 << 21; - /** @var int $carry6 */ - $carry6 = ($s6 + (1 << 20)) >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry8 */ - $carry8 = ($s8 + (1 << 20)) >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry10 */ - $carry10 = ($s10 + (1 << 20)) >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - - /** @var int $carry1 */ - $carry1 = ($s1 + (1 << 20)) >> 21; - $s2 += $carry1; - $s1 -= $carry1 << 21; - /** @var int $carry3 */ - $carry3 = ($s3 + (1 << 20)) >> 21; - $s4 += $carry3; - $s3 -= $carry3 << 21; - /** @var int $carry5 */ - $carry5 = ($s5 + (1 << 20)) >> 21; - $s6 += $carry5; - $s5 -= $carry5 << 21; - /** @var int $carry7 */ - $carry7 = ($s7 + (1 << 20)) >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry9 */ - $carry9 = ($s9 + (1 << 20)) >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry11 */ - $carry11 = ($s11 + (1 << 20)) >> 21; - $s12 += $carry11; - $s11 -= $carry11 << 21; - - $s0 += self::mul($s12, 666643, 20); - $s1 += self::mul($s12, 470296, 19); - $s2 += self::mul($s12, 654183, 20); - $s3 -= self::mul($s12, 997805, 20); - $s4 += self::mul($s12, 136657, 18); - $s5 -= self::mul($s12, 683901, 20); - $s12 = 0; - - /** @var int $carry0 */ - $carry0 = $s0 >> 21; - $s1 += $carry0; - $s0 -= $carry0 << 21; - /** @var int $carry1 */ - $carry1 = $s1 >> 21; - $s2 += $carry1; - $s1 -= $carry1 << 21; - /** @var int $carry2 */ - $carry2 = $s2 >> 21; - $s3 += $carry2; - $s2 -= $carry2 << 21; - /** @var int $carry3 */ - $carry3 = $s3 >> 21; - $s4 += $carry3; - $s3 -= $carry3 << 21; - /** @var int $carry4 */ - $carry4 = $s4 >> 21; - $s5 += $carry4; - $s4 -= $carry4 << 21; - /** @var int $carry5 */ - $carry5 = $s5 >> 21; - $s6 += $carry5; - $s5 -= $carry5 << 21; - /** @var int $carry6 */ - $carry6 = $s6 >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry7 */ - $carry7 = $s7 >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry8 */ - $carry8 = $s8 >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry9 */ - $carry9 = $s9 >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry10 */ - $carry10 = $s10 >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - /** @var int $carry11 */ - $carry11 = $s11 >> 21; - $s12 += $carry11; - $s11 -= $carry11 << 21; - - $s0 += self::mul($s12, 666643, 20); - $s1 += self::mul($s12, 470296, 19); - $s2 += self::mul($s12, 654183, 20); - $s3 -= self::mul($s12, 997805, 20); - $s4 += self::mul($s12, 136657, 18); - $s5 -= self::mul($s12, 683901, 20); - - /** @var int $carry0 */ - $carry0 = $s0 >> 21; - $s1 += $carry0; - $s0 -= $carry0 << 21; - /** @var int $carry1 */ - $carry1 = $s1 >> 21; - $s2 += $carry1; - $s1 -= $carry1 << 21; - /** @var int $carry2 */ - $carry2 = $s2 >> 21; - $s3 += $carry2; - $s2 -= $carry2 << 21; - /** @var int $carry3 */ - $carry3 = $s3 >> 21; - $s4 += $carry3; - $s3 -= $carry3 << 21; - /** @var int $carry4 */ - $carry4 = $s4 >> 21; - $s5 += $carry4; - $s4 -= $carry4 << 21; - /** @var int $carry5 */ - $carry5 = $s5 >> 21; - $s6 += $carry5; - $s5 -= $carry5 << 21; - /** @var int $carry6 */ - $carry6 = $s6 >> 21; - $s7 += $carry6; - $s6 -= $carry6 << 21; - /** @var int $carry7 */ - $carry7 = $s7 >> 21; - $s8 += $carry7; - $s7 -= $carry7 << 21; - /** @var int $carry8 */ - $carry8 = $s8 >> 21; - $s9 += $carry8; - $s8 -= $carry8 << 21; - /** @var int $carry9 */ - $carry9 = $s9 >> 21; - $s10 += $carry9; - $s9 -= $carry9 << 21; - /** @var int $carry10 */ - $carry10 = $s10 >> 21; - $s11 += $carry10; - $s10 -= $carry10 << 21; - - /** - * @var array - */ - $arr = array( - (int) ($s0 >> 0), - (int) ($s0 >> 8), - (int) (($s0 >> 16) | $s1 << 5), - (int) ($s1 >> 3), - (int) ($s1 >> 11), - (int) (($s1 >> 19) | $s2 << 2), - (int) ($s2 >> 6), - (int) (($s2 >> 14) | $s3 << 7), - (int) ($s3 >> 1), - (int) ($s3 >> 9), - (int) (($s3 >> 17) | $s4 << 4), - (int) ($s4 >> 4), - (int) ($s4 >> 12), - (int) (($s4 >> 20) | $s5 << 1), - (int) ($s5 >> 7), - (int) (($s5 >> 15) | $s6 << 6), - (int) ($s6 >> 2), - (int) ($s6 >> 10), - (int) (($s6 >> 18) | $s7 << 3), - (int) ($s7 >> 5), - (int) ($s7 >> 13), - (int) ($s8 >> 0), - (int) ($s8 >> 8), - (int) (($s8 >> 16) | $s9 << 5), - (int) ($s9 >> 3), - (int) ($s9 >> 11), - (int) (($s9 >> 19) | $s10 << 2), - (int) ($s10 >> 6), - (int) (($s10 >> 14) | $s11 << 7), - (int) ($s11 >> 1), - (int) ($s11 >> 9), - (int) $s11 >> 17 - ); - return self::intArrayToString($arr); - } - - /** - * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493 - * - * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A - * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 - */ - public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A) - { - /** @var array $aslide */ - $aslide = array( - 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, - 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, - 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 - ); - - /** @var array $Ai size 8 */ - $Ai = array(); - - # ge_p3_to_cached(&Ai[0], A); - $Ai[0] = self::ge_p3_to_cached($A); - # ge_p3_dbl(&t, A); - $t = self::ge_p3_dbl($A); - # ge_p1p1_to_p3(&A2, &t); - $A2 = self::ge_p1p1_to_p3($t); - - for ($i = 1; $i < 8; ++$i) { - # ge_add(&t, &A2, &Ai[0]); - $t = self::ge_add($A2, $Ai[$i - 1]); - # ge_p1p1_to_p3(&u, &t); - $u = self::ge_p1p1_to_p3($t); - # ge_p3_to_cached(&Ai[i], &u); - $Ai[$i] = self::ge_p3_to_cached($u); - } - - $r = self::ge_p3_0(); - for ($i = 252; $i >= 0; --$i) { - $t = self::ge_p3_dbl($r); - if ($aslide[$i] > 0) { - # ge_p1p1_to_p3(&u, &t); - $u = self::ge_p1p1_to_p3($t); - # ge_add(&t, &u, &Ai[aslide[i] / 2]); - $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]); - } elseif ($aslide[$i] < 0) { - # ge_p1p1_to_p3(&u, &t); - $u = self::ge_p1p1_to_p3($t); - # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); - $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]); - } - } - - # ge_p1p1_to_p3(r, &t); - return self::ge_p1p1_to_p3($t); - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519/Fe.php b/libs/sodium_compat/src/Core/Curve25519/Fe.php deleted file mode 100644 index 64c489a..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/Fe.php +++ /dev/null @@ -1,123 +0,0 @@ - - */ - protected $container = array(); - - /** - * @var int - */ - protected $size = 10; - - /** - * @internal You should not use this directly from another application - * - * @param array $array - * @param bool $save_indexes - * @return self - */ - public static function fromArray($array, $save_indexes = null) - { - $count = count($array); - if ($save_indexes) { - $keys = array_keys($array); - } else { - $keys = range(0, $count - 1); - } - $array = array_values($array); - /** @var array $keys */ - - $obj = new ParagonIE_Sodium_Core_Curve25519_Fe(); - if ($save_indexes) { - for ($i = 0; $i < $count; ++$i) { - $obj->offsetSet($keys[$i], $array[$i]); - } - } else { - for ($i = 0; $i < $count; ++$i) { - $obj->offsetSet($i, $array[$i]); - } - } - return $obj; - } - - /** - * @internal You should not use this directly from another application - * - * @param int|null $offset - * @param int $value - * @return void - * @psalm-suppress MixedArrayOffset - */ - public function offsetSet($offset, $value) - { - if (!is_int($value)) { - throw new InvalidArgumentException('Expected an integer'); - } - if (is_null($offset)) { - $this->container[] = $value; - } else { - $this->container[$offset] = $value; - } - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return bool - * @psalm-suppress MixedArrayOffset - */ - public function offsetExists($offset) - { - return isset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return void - * @psalm-suppress MixedArrayOffset - */ - public function offsetUnset($offset) - { - unset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return int - * @psalm-suppress MixedArrayOffset - */ - public function offsetGet($offset) - { - if (!isset($this->container[$offset])) { - $this->container[$offset] = 0; - } - return (int) ($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @return array - */ - public function __debugInfo() - { - return array(implode(', ', $this->container)); - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519/Ge/Cached.php b/libs/sodium_compat/src/Core/Curve25519/Ge/Cached.php deleted file mode 100644 index 39bf897..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/Ge/Cached.php +++ /dev/null @@ -1,65 +0,0 @@ -YplusX = $YplusX; - if ($YminusX === null) { - $YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->YminusX = $YminusX; - if ($Z === null) { - $Z = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->Z = $Z; - if ($T2d === null) { - $T2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->T2d = $T2d; - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519/Ge/P1p1.php b/libs/sodium_compat/src/Core/Curve25519/Ge/P1p1.php deleted file mode 100644 index a63d6ab..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/Ge/P1p1.php +++ /dev/null @@ -1,64 +0,0 @@ -X = $x; - if ($y === null) { - $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->Y = $y; - if ($z === null) { - $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->Z = $z; - if ($t === null) { - $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->T = $t; - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519/Ge/P2.php b/libs/sodium_compat/src/Core/Curve25519/Ge/P2.php deleted file mode 100644 index aee4000..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/Ge/P2.php +++ /dev/null @@ -1,54 +0,0 @@ -X = $x; - if ($y === null) { - $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->Y = $y; - if ($z === null) { - $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->Z = $z; - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519/Ge/P3.php b/libs/sodium_compat/src/Core/Curve25519/Ge/P3.php deleted file mode 100644 index 00f5b27..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/Ge/P3.php +++ /dev/null @@ -1,65 +0,0 @@ -X = $x; - if ($y === null) { - $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->Y = $y; - if ($z === null) { - $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->Z = $z; - if ($t === null) { - $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->T = $t; - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519/Ge/Precomp.php b/libs/sodium_compat/src/Core/Curve25519/Ge/Precomp.php deleted file mode 100644 index 59611c1..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/Ge/Precomp.php +++ /dev/null @@ -1,54 +0,0 @@ -yplusx = $yplusx; - if ($yminusx === null) { - $yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->yminusx = $yminusx; - if ($xy2d === null) { - $xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); - } - $this->xy2d = $xy2d; - } -} diff --git a/libs/sodium_compat/src/Core/Curve25519/H.php b/libs/sodium_compat/src/Core/Curve25519/H.php deleted file mode 100644 index 37ad497..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/H.php +++ /dev/null @@ -1,1467 +0,0 @@ ->>> Basically, int[32][8][3][10] - */ - protected static $base = array( - array( - array( - array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), - array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), - array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), - ), - array( - array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303), - array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081), - array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697), - ), - array( - array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), - array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), - array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), - ), - array( - array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540), - array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397), - array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325), - ), - array( - array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), - array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), - array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), - ), - array( - array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777), - array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737), - array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652), - ), - array( - array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), - array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), - array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), - ), - array( - array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726), - array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955), - array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425), - ), - ), - array( - array( - array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171), - array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510), - array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660), - ), - array( - array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639), - array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963), - array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950), - ), - array( - array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568), - array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335), - array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628), - ), - array( - array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007), - array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772), - array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653), - ), - array( - array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567), - array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686), - array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372), - ), - array( - array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887), - array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954), - array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953), - ), - array( - array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833), - array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532), - array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876), - ), - array( - array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268), - array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214), - array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038), - ), - ), - array( - array( - array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800), - array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645), - array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664), - ), - array( - array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933), - array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182), - array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222), - ), - array( - array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991), - array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880), - array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092), - ), - array( - array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295), - array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788), - array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553), - ), - array( - array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026), - array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347), - array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033), - ), - array( - array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395), - array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278), - array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890), - ), - array( - array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995), - array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596), - array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891), - ), - array( - array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060), - array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608), - array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606), - ), - ), - array( - array( - array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389), - array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016), - array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341), - ), - array( - array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505), - array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553), - array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655), - ), - array( - array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220), - array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631), - array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099), - ), - array( - array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556), - array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749), - array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930), - ), - array( - array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391), - array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253), - array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066), - ), - array( - array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958), - array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082), - array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383), - ), - array( - array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521), - array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807), - array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948), - ), - array( - array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134), - array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455), - array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629), - ), - ), - array( - array( - array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069), - array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746), - array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919), - ), - array( - array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837), - array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906), - array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771), - ), - array( - array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817), - array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098), - array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409), - ), - array( - array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504), - array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727), - array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420), - ), - array( - array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003), - array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605), - array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384), - ), - array( - array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701), - array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683), - array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708), - ), - array( - array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563), - array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260), - array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387), - ), - array( - array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672), - array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686), - array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665), - ), - ), - array( - array( - array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182), - array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277), - array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628), - ), - array( - array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474), - array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539), - array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822), - ), - array( - array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970), - array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756), - array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508), - ), - array( - array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683), - array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655), - array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158), - ), - array( - array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125), - array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839), - array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664), - ), - array( - array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294), - array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899), - array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070), - ), - array( - array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294), - array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949), - array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083), - ), - array( - array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420), - array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940), - array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396), - ), - ), - array( - array( - array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567), - array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127), - array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294), - ), - array( - array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887), - array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964), - array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195), - ), - array( - array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244), - array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999), - array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762), - ), - array( - array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274), - array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236), - array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605), - ), - array( - array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761), - array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884), - array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482), - ), - array( - array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638), - array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490), - array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170), - ), - array( - array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736), - array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124), - array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392), - ), - array( - array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029), - array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048), - array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958), - ), - ), - array( - array( - array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593), - array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071), - array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692), - ), - array( - array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687), - array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441), - array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001), - ), - array( - array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460), - array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007), - array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762), - ), - array( - array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005), - array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674), - array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035), - ), - array( - array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590), - array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957), - array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812), - ), - array( - array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740), - array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122), - array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158), - ), - array( - array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885), - array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140), - array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857), - ), - array( - array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155), - array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260), - array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483), - ), - ), - array( - array( - array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677), - array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815), - array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751), - ), - array( - array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203), - array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208), - array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230), - ), - array( - array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850), - array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389), - array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968), - ), - array( - array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689), - array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880), - array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304), - ), - array( - array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632), - array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412), - array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566), - ), - array( - array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038), - array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232), - array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943), - ), - array( - array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856), - array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738), - array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971), - ), - array( - array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718), - array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697), - array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883), - ), - ), - array( - array( - array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912), - array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358), - array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849), - ), - array( - array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307), - array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977), - array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335), - ), - array( - array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644), - array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616), - array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735), - ), - array( - array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099), - array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341), - array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336), - ), - array( - array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646), - array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425), - array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388), - ), - array( - array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743), - array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822), - array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462), - ), - array( - array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985), - array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702), - array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797), - ), - array( - array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293), - array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100), - array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688), - ), - ), - array( - array( - array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186), - array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610), - array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707), - ), - array( - array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220), - array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025), - array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044), - ), - array( - array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992), - array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027), - array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197), - ), - array( - array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901), - array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952), - array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878), - ), - array( - array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390), - array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730), - array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730), - ), - array( - array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180), - array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272), - array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715), - ), - array( - array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970), - array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772), - array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865), - ), - array( - array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750), - array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373), - array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348), - ), - ), - array( - array( - array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144), - array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195), - array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086), - ), - array( - array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684), - array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518), - array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233), - ), - array( - array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793), - array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794), - array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435), - ), - array( - array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921), - array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518), - array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563), - ), - array( - array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278), - array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024), - array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030), - ), - array( - array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783), - array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717), - array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844), - ), - array( - array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333), - array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048), - array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760), - ), - array( - array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760), - array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757), - array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112), - ), - ), - array( - array( - array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468), - array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184), - array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289), - ), - array( - array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066), - array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882), - array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226), - ), - array( - array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101), - array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279), - array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811), - ), - array( - array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709), - array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714), - array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121), - ), - array( - array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464), - array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847), - array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400), - ), - array( - array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414), - array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158), - array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045), - ), - array( - array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415), - array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459), - array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079), - ), - array( - array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412), - array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743), - array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836), - ), - ), - array( - array( - array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022), - array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429), - array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065), - ), - array( - array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861), - array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000), - array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101), - ), - array( - array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815), - array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642), - array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966), - ), - array( - array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574), - array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742), - array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689), - ), - array( - array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020), - array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772), - array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982), - ), - array( - array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953), - array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218), - array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265), - ), - array( - array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073), - array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325), - array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798), - ), - array( - array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870), - array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863), - array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927), - ), - ), - array( - array( - array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267), - array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663), - array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862), - ), - array( - array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673), - array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943), - array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020), - ), - array( - array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238), - array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064), - array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795), - ), - array( - array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052), - array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904), - array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531), - ), - array( - array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979), - array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841), - array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431), - ), - array( - array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324), - array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940), - array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320), - ), - array( - array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184), - array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114), - array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878), - ), - array( - array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784), - array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091), - array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585), - ), - ), - array( - array( - array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208), - array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864), - array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661), - ), - array( - array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233), - array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212), - array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525), - ), - array( - array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068), - array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397), - array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988), - ), - array( - array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889), - array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038), - array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697), - ), - array( - array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875), - array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905), - array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656), - ), - array( - array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818), - array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714), - array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203), - ), - array( - array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931), - array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024), - array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084), - ), - array( - array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204), - array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817), - array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667), - ), - ), - array( - array( - array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504), - array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768), - array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255), - ), - array( - array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790), - array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438), - array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333), - ), - array( - array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971), - array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905), - array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409), - ), - array( - array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409), - array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499), - array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363), - ), - array( - array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664), - array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324), - array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940), - ), - array( - array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990), - array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914), - array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290), - ), - array( - array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257), - array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433), - array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236), - ), - array( - array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045), - array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093), - array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347), - ), - ), - array( - array( - array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191), - array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507), - array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906), - ), - array( - array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018), - array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109), - array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926), - ), - array( - array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528), - array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625), - array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286), - ), - array( - array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033), - array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866), - array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896), - ), - array( - array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075), - array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347), - array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437), - ), - array( - array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165), - array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588), - array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193), - ), - array( - array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017), - array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883), - array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961), - ), - array( - array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043), - array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663), - array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362), - ), - ), - array( - array( - array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860), - array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466), - array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063), - ), - array( - array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997), - array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295), - array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369), - ), - array( - array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385), - array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109), - array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906), - ), - array( - array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424), - array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185), - array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962), - ), - array( - array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325), - array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593), - array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404), - ), - array( - array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644), - array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801), - array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804), - ), - array( - array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884), - array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577), - array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849), - ), - array( - array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473), - array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644), - array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319), - ), - ), - array( - array( - array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599), - array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768), - array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084), - ), - array( - array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328), - array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369), - array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920), - ), - array( - array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815), - array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025), - array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397), - ), - array( - array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448), - array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981), - array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165), - ), - array( - array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501), - array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073), - array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861), - ), - array( - array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845), - array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211), - array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870), - ), - array( - array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096), - array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803), - array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168), - ), - array( - array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965), - array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505), - array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598), - ), - ), - array( - array( - array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782), - array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900), - array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479), - ), - array( - array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208), - array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232), - array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719), - ), - array( - array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271), - array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326), - array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132), - ), - array( - array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300), - array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570), - array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670), - ), - array( - array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994), - array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913), - array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317), - ), - array( - array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730), - array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096), - array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078), - ), - array( - array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411), - array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905), - array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654), - ), - array( - array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870), - array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498), - array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579), - ), - ), - array( - array( - array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677), - array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647), - array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743), - ), - array( - array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468), - array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375), - array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155), - ), - array( - array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725), - array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612), - array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943), - ), - array( - array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944), - array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928), - array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406), - ), - array( - array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139), - array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963), - array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693), - ), - array( - array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734), - array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680), - array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410), - ), - array( - array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931), - array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654), - array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710), - ), - array( - array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180), - array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684), - array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895), - ), - ), - array( - array( - array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501), - array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413), - array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880), - ), - array( - array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874), - array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962), - array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899), - ), - array( - array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152), - array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063), - array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080), - ), - array( - array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146), - array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183), - array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133), - ), - array( - array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421), - array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622), - array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197), - ), - array( - array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663), - array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753), - array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755), - ), - array( - array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862), - array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118), - array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171), - ), - array( - array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380), - array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824), - array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270), - ), - ), - array( - array( - array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438), - array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584), - array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562), - ), - array( - array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471), - array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610), - array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269), - ), - array( - array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650), - array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369), - array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461), - ), - array( - array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462), - array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793), - array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218), - ), - array( - array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226), - array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019), - array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037), - ), - array( - array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171), - array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132), - array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841), - ), - array( - array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181), - array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210), - array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040), - ), - array( - array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935), - array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105), - array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814), - ), - ), - array( - array( - array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852), - array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581), - array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646), - ), - array( - array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844), - array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025), - array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453), - ), - array( - array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068), - array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192), - array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921), - ), - array( - array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259), - array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426), - array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072), - ), - array( - array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305), - array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832), - array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943), - ), - array( - array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011), - array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447), - array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494), - ), - array( - array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245), - array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859), - array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915), - ), - array( - array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707), - array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848), - array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224), - ), - ), - array( - array( - array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391), - array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215), - array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101), - ), - array( - array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713), - array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849), - array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930), - ), - array( - array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940), - array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031), - array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404), - ), - array( - array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243), - array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116), - array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525), - ), - array( - array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509), - array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883), - array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865), - ), - array( - array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660), - array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273), - array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138), - ), - array( - array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560), - array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135), - array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941), - ), - array( - array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739), - array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756), - array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819), - ), - ), - array( - array( - array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347), - array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028), - array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075), - ), - array( - array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799), - array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609), - array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817), - ), - array( - array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989), - array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523), - array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278), - ), - array( - array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045), - array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377), - array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480), - ), - array( - array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016), - array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426), - array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525), - ), - array( - array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396), - array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080), - array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892), - ), - array( - array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275), - array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074), - array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140), - ), - array( - array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717), - array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101), - array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127), - ), - ), - array( - array( - array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632), - array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415), - array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160), - ), - array( - array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876), - array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625), - array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478), - ), - array( - array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164), - array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595), - array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248), - ), - array( - array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858), - array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193), - array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184), - ), - array( - array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942), - array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635), - array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948), - ), - array( - array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935), - array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415), - array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416), - ), - array( - array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018), - array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778), - array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659), - ), - array( - array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385), - array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503), - array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329), - ), - ), - array( - array( - array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056), - array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838), - array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948), - ), - array( - array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691), - array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118), - array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517), - ), - array( - array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269), - array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904), - array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589), - ), - array( - array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193), - array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910), - array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930), - ), - array( - array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667), - array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481), - array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876), - ), - array( - array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640), - array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278), - array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112), - ), - array( - array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272), - array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012), - array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221), - ), - array( - array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046), - array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345), - array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310), - ), - ), - array( - array( - array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937), - array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636), - array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008), - ), - array( - array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429), - array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576), - array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066), - ), - array( - array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490), - array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104), - array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053), - ), - array( - array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275), - array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511), - array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095), - ), - array( - array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439), - array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939), - array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424), - ), - array( - array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310), - array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608), - array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079), - ), - array( - array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101), - array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418), - array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576), - ), - array( - array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356), - array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996), - array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099), - ), - ), - array( - array( - array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728), - array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658), - array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242), - ), - array( - array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001), - array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766), - array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373), - ), - array( - array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458), - array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628), - array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657), - ), - array( - array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062), - array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616), - array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014), - ), - array( - array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383), - array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814), - array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718), - ), - array( - array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417), - array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222), - array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444), - ), - array( - array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597), - array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970), - array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799), - ), - array( - array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647), - array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511), - array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032), - ), - ), - array( - array( - array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834), - array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461), - array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062), - ), - array( - array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516), - array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547), - array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240), - ), - array( - array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038), - array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741), - array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103), - ), - array( - array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747), - array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323), - array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016), - ), - array( - array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373), - array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228), - array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141), - ), - array( - array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399), - array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831), - array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376), - ), - array( - array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313), - array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958), - array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577), - ), - array( - array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743), - array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684), - array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476), - ), - ) - ); - - /** - * See: libsodium's crypto_core/curve25519/ref10/base2.h - * - * @var array basically int[8][3] - */ - protected static $base2 = array( - array( - array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), - array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), - array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), - ), - array( - array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), - array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), - array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), - ), - array( - array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), - array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), - array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), - ), - array( - array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), - array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), - array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), - ), - array( - array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877), - array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951), - array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784), - ), - array( - array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436), - array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918), - array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877), - ), - array( - array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800), - array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305), - array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300), - ), - array( - array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876), - array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619), - array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683), - ) - ); - - /** - * 37095705934669439343138083508754565189542113879843219016388785533085940283555 - * - * @var array - */ - protected static $d = array( - -10913610, - 13857413, - -15372611, - 6949391, - 114729, - -8787816, - -6275908, - -3247719, - -18696448, - -12055116 - ); - - /** - * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161 - * - * @var array - */ - protected static $d2 = array( - -21827239, - -5839606, - -30745221, - 13898782, - 229458, - 15978800, - -12551817, - -6495438, - 29715968, - 9444199 - ); - - /** - * sqrt(-1) - * - * @var array - */ - protected static $sqrtm1 = array( - -32595792, - -7943725, - 9377950, - 3500415, - 12389472, - -272473, - -25146209, - -2005654, - 326686, - 11406482 - ); -} diff --git a/libs/sodium_compat/src/Core/Curve25519/README.md b/libs/sodium_compat/src/Core/Curve25519/README.md deleted file mode 100644 index e8097fa..0000000 --- a/libs/sodium_compat/src/Core/Curve25519/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Curve25519 Data Structures - -These are PHP implementation of the [structs used in the ref10 curve25519 code](https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/private/curve25519_ref10.h). diff --git a/libs/sodium_compat/src/Core/Ed25519.php b/libs/sodium_compat/src/Core/Ed25519.php deleted file mode 100644 index 16ae1d2..0000000 --- a/libs/sodium_compat/src/Core/Ed25519.php +++ /dev/null @@ -1,480 +0,0 @@ -X)) { - throw new SodiumException('Unexpected zero result'); - } - - # fe_1(one_minus_y); - # fe_sub(one_minus_y, one_minus_y, A.Y); - # fe_invert(one_minus_y, one_minus_y); - $one_minux_y = self::fe_invert( - self::fe_sub( - self::fe_1(), - $A->Y - ) - ); - - # fe_1(x); - # fe_add(x, x, A.Y); - # fe_mul(x, x, one_minus_y); - $x = self::fe_mul( - self::fe_add(self::fe_1(), $A->Y), - $one_minux_y - ); - - # fe_tobytes(curve25519_pk, x); - return self::fe_tobytes($x); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sk_to_pk($sk) - { - return self::ge_p3_tobytes( - self::ge_scalarmult_base( - self::substr($sk, 0, 32) - ) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign($message, $sk) - { - /** @var string $signature */ - $signature = self::sign_detached($message, $sk); - return $signature . $message; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message A signed message - * @param string $pk Public key - * @return string Message (without signature) - * @throws SodiumException - * @throws TypeError - */ - public static function sign_open($message, $pk) - { - /** @var string $signature */ - $signature = self::substr($message, 0, 64); - - /** @var string $message */ - $message = self::substr($message, 64); - - if (self::verify_detached($signature, $message, $pk)) { - return $message; - } - throw new SodiumException('Invalid signature'); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign_detached($message, $sk) - { - # crypto_hash_sha512(az, sk, 32); - $az = hash('sha512', self::substr($sk, 0, 32), true); - - # az[0] &= 248; - # az[31] &= 63; - # az[31] |= 64; - $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); - $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); - - # crypto_hash_sha512_init(&hs); - # crypto_hash_sha512_update(&hs, az + 32, 32); - # crypto_hash_sha512_update(&hs, m, mlen); - # crypto_hash_sha512_final(&hs, nonce); - $hs = hash_init('sha512'); - hash_update($hs, self::substr($az, 32, 32)); - hash_update($hs, $message); - $nonceHash = hash_final($hs, true); - - # memmove(sig + 32, sk + 32, 32); - $pk = self::substr($sk, 32, 32); - - # sc_reduce(nonce); - # ge_scalarmult_base(&R, nonce); - # ge_p3_tobytes(sig, &R); - $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32); - $sig = self::ge_p3_tobytes( - self::ge_scalarmult_base($nonce) - ); - - # crypto_hash_sha512_init(&hs); - # crypto_hash_sha512_update(&hs, sig, 64); - # crypto_hash_sha512_update(&hs, m, mlen); - # crypto_hash_sha512_final(&hs, hram); - $hs = hash_init('sha512'); - hash_update($hs, self::substr($sig, 0, 32)); - hash_update($hs, self::substr($pk, 0, 32)); - hash_update($hs, $message); - $hramHash = hash_final($hs, true); - - # sc_reduce(hram); - # sc_muladd(sig + 32, hram, az, nonce); - $hram = self::sc_reduce($hramHash); - $sigAfter = self::sc_muladd($hram, $az, $nonce); - $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); - - try { - ParagonIE_Sodium_Compat::memzero($az); - } catch (SodiumException $ex) { - $az = null; - } - return $sig; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $sig - * @param string $message - * @param string $pk - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function verify_detached($sig, $message, $pk) - { - if (self::strlen($sig) < 64) { - throw new SodiumException('Signature is too short'); - } - if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) { - throw new SodiumException('S < L - Invalid signature'); - } - if (self::small_order($sig)) { - throw new SodiumException('Signature is on too small of an order'); - } - if ((self::chrToInt($sig[63]) & 224) !== 0) { - throw new SodiumException('Invalid signature'); - } - $d = 0; - for ($i = 0; $i < 32; ++$i) { - $d |= self::chrToInt($pk[$i]); - } - if ($d === 0) { - throw new SodiumException('All zero public key'); - } - - /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ - $orig = ParagonIE_Sodium_Compat::$fastMult; - - // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. - ParagonIE_Sodium_Compat::$fastMult = true; - - /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ - $A = self::ge_frombytes_negate_vartime($pk); - - /** @var string $hDigest */ - $hDigest = hash( - 'sha512', - self::substr($sig, 0, 32) . - self::substr($pk, 0, 32) . - $message, - true - ); - - /** @var string $h */ - $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32); - - /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ - $R = self::ge_double_scalarmult_vartime( - $h, - $A, - self::substr($sig, 32) - ); - - /** @var string $rcheck */ - $rcheck = self::ge_tobytes($R); - - // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. - ParagonIE_Sodium_Compat::$fastMult = $orig; - - return self::verify_32($rcheck, self::substr($sig, 0, 32)); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $S - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function check_S_lt_L($S) - { - if (self::strlen($S) < 32) { - throw new SodiumException('Signature must be 32 bytes'); - } - $L = array( - 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, - 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 - ); - $c = 0; - $n = 1; - $i = 32; - - /** @var array $L */ - do { - --$i; - $x = self::chrToInt($S[$i]); - $c |= ( - (($x - $L[$i]) >> 8) & $n - ); - $n &= ( - (($x ^ $L[$i]) - 1) >> 8 - ); - } while ($i !== 0); - - return $c === 0; - } - - /** - * @param string $R - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function small_order($R) - { - /** @var array> $blocklist */ - $blocklist = array( - /* 0 (order 4) */ - array( - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ), - /* 1 (order 1) */ - array( - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ), - /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ - array( - 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, - 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, - 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, - 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 - ), - /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ - array( - 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, - 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, - 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, - 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a - ), - /* p-1 (order 2) */ - array( - 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, - 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, - 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, - 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 - ), - /* p (order 4) */ - array( - 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, - 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, - 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, - 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa - ), - /* p+1 (order 1) */ - array( - 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f - ), - /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ - array( - 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f - ), - /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ - array( - 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f - ), - /* 2p-1 (order 2) */ - array( - 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - ), - /* 2p (order 4) */ - array( - 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - ), - /* 2p+1 (order 1) */ - array( - 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - ) - ); - /** @var int $countBlocklist */ - $countBlocklist = count($blocklist); - - for ($i = 0; $i < $countBlocklist; ++$i) { - $c = 0; - for ($j = 0; $j < 32; ++$j) { - $c |= self::chrToInt($R[$j]) ^ (int) $blocklist[$i][$j]; - } - if ($c === 0) { - return true; - } - } - return false; - } -} diff --git a/libs/sodium_compat/src/Core/HChaCha20.php b/libs/sodium_compat/src/Core/HChaCha20.php deleted file mode 100644 index 947df10..0000000 --- a/libs/sodium_compat/src/Core/HChaCha20.php +++ /dev/null @@ -1,108 +0,0 @@ - 0; $i -= 2) { - $x4 ^= self::rotate($x0 + $x12, 7); - $x8 ^= self::rotate($x4 + $x0, 9); - $x12 ^= self::rotate($x8 + $x4, 13); - $x0 ^= self::rotate($x12 + $x8, 18); - $x9 ^= self::rotate($x5 + $x1, 7); - $x13 ^= self::rotate($x9 + $x5, 9); - $x1 ^= self::rotate($x13 + $x9, 13); - $x5 ^= self::rotate($x1 + $x13, 18); - $x14 ^= self::rotate($x10 + $x6, 7); - $x2 ^= self::rotate($x14 + $x10, 9); - $x6 ^= self::rotate($x2 + $x14, 13); - $x10 ^= self::rotate($x6 + $x2, 18); - $x3 ^= self::rotate($x15 + $x11, 7); - $x7 ^= self::rotate($x3 + $x15, 9); - $x11 ^= self::rotate($x7 + $x3, 13); - $x15 ^= self::rotate($x11 + $x7, 18); - $x1 ^= self::rotate($x0 + $x3, 7); - $x2 ^= self::rotate($x1 + $x0, 9); - $x3 ^= self::rotate($x2 + $x1, 13); - $x0 ^= self::rotate($x3 + $x2, 18); - $x6 ^= self::rotate($x5 + $x4, 7); - $x7 ^= self::rotate($x6 + $x5, 9); - $x4 ^= self::rotate($x7 + $x6, 13); - $x5 ^= self::rotate($x4 + $x7, 18); - $x11 ^= self::rotate($x10 + $x9, 7); - $x8 ^= self::rotate($x11 + $x10, 9); - $x9 ^= self::rotate($x8 + $x11, 13); - $x10 ^= self::rotate($x9 + $x8, 18); - $x12 ^= self::rotate($x15 + $x14, 7); - $x13 ^= self::rotate($x12 + $x15, 9); - $x14 ^= self::rotate($x13 + $x12, 13); - $x15 ^= self::rotate($x14 + $x13, 18); - } - - return self::store32_le($x0) . - self::store32_le($x5) . - self::store32_le($x10) . - self::store32_le($x15) . - self::store32_le($x6) . - self::store32_le($x7) . - self::store32_le($x8) . - self::store32_le($x9); - } -} diff --git a/libs/sodium_compat/src/Core/Poly1305.php b/libs/sodium_compat/src/Core/Poly1305.php deleted file mode 100644 index 3301821..0000000 --- a/libs/sodium_compat/src/Core/Poly1305.php +++ /dev/null @@ -1,63 +0,0 @@ -update($m) - ->finish(); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $mac - * @param string $m - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function onetimeauth_verify($mac, $m, $key) - { - if (self::strlen($key) < 32) { - throw new InvalidArgumentException( - 'Key must be 32 bytes long.' - ); - } - $state = new ParagonIE_Sodium_Core_Poly1305_State( - self::substr($key, 0, 32) - ); - $calc = $state - ->update($m) - ->finish(); - return self::verify_16($calc, $mac); - } -} diff --git a/libs/sodium_compat/src/Core/Poly1305/State.php b/libs/sodium_compat/src/Core/Poly1305/State.php deleted file mode 100644 index 4b64e04..0000000 --- a/libs/sodium_compat/src/Core/Poly1305/State.php +++ /dev/null @@ -1,445 +0,0 @@ - - */ - protected $buffer = array(); - - /** - * @var bool - */ - protected $final = false; - - /** - * @var array - */ - public $h; - - /** - * @var int - */ - protected $leftover = 0; - - /** - * @var int[] - */ - public $r; - - /** - * @var int[] - */ - public $pad; - - /** - * ParagonIE_Sodium_Core_Poly1305_State constructor. - * - * @internal You should not use this directly from another application - * - * @param string $key - * @throws InvalidArgumentException - * @throws TypeError - */ - public function __construct($key = '') - { - if (self::strlen($key) < 32) { - throw new InvalidArgumentException( - 'Poly1305 requires a 32-byte key' - ); - } - /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ - $this->r = array( - (int) ((self::load_4(self::substr($key, 0, 4))) & 0x3ffffff), - (int) ((self::load_4(self::substr($key, 3, 4)) >> 2) & 0x3ffff03), - (int) ((self::load_4(self::substr($key, 6, 4)) >> 4) & 0x3ffc0ff), - (int) ((self::load_4(self::substr($key, 9, 4)) >> 6) & 0x3f03fff), - (int) ((self::load_4(self::substr($key, 12, 4)) >> 8) & 0x00fffff) - ); - - /* h = 0 */ - $this->h = array(0, 0, 0, 0, 0); - - /* save pad for later */ - $this->pad = array( - self::load_4(self::substr($key, 16, 4)), - self::load_4(self::substr($key, 20, 4)), - self::load_4(self::substr($key, 24, 4)), - self::load_4(self::substr($key, 28, 4)), - ); - - $this->leftover = 0; - $this->final = false; - } - - /** - * Zero internal buffer upon destruction - */ - public function __destruct() - { - $this->r[0] ^= $this->r[0]; - $this->r[1] ^= $this->r[1]; - $this->r[2] ^= $this->r[2]; - $this->r[3] ^= $this->r[3]; - $this->r[4] ^= $this->r[4]; - $this->h[0] ^= $this->h[0]; - $this->h[1] ^= $this->h[1]; - $this->h[2] ^= $this->h[2]; - $this->h[3] ^= $this->h[3]; - $this->h[4] ^= $this->h[4]; - $this->pad[0] ^= $this->pad[0]; - $this->pad[1] ^= $this->pad[1]; - $this->pad[2] ^= $this->pad[2]; - $this->pad[3] ^= $this->pad[3]; - $this->leftover = 0; - $this->final = true; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @return self - * @throws SodiumException - * @throws TypeError - */ - public function update($message = '') - { - $bytes = self::strlen($message); - if ($bytes < 1) { - return $this; - } - - /* handle leftover */ - if ($this->leftover) { - $want = ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - $this->leftover; - if ($want > $bytes) { - $want = $bytes; - } - for ($i = 0; $i < $want; ++$i) { - $mi = self::chrToInt($message[$i]); - $this->buffer[$this->leftover + $i] = $mi; - } - // We snip off the leftmost bytes. - $message = self::substr($message, $want); - $bytes = self::strlen($message); - $this->leftover += $want; - if ($this->leftover < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { - // We still don't have enough to run $this->blocks() - return $this; - } - - $this->blocks( - self::intArrayToString($this->buffer), - ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - ); - $this->leftover = 0; - } - - /* process full blocks */ - if ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { - /** @var int $want */ - $want = $bytes & ~(ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - 1); - if ($want >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { - $block = self::substr($message, 0, $want); - if (self::strlen($block) >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { - $this->blocks($block, $want); - $message = self::substr($message, $want); - $bytes = self::strlen($message); - } - } - } - - /* store leftover */ - if ($bytes) { - for ($i = 0; $i < $bytes; ++$i) { - $mi = self::chrToInt($message[$i]); - $this->buffer[$this->leftover + $i] = $mi; - } - $this->leftover = (int) $this->leftover + $bytes; - } - return $this; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param int $bytes - * @return self - * @throws TypeError - */ - public function blocks($message, $bytes) - { - if (self::strlen($message) < 16) { - $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT); - } - /** @var int $hibit */ - $hibit = $this->final ? 0 : 1 << 24; /* 1 << 128 */ - $r0 = (int) $this->r[0]; - $r1 = (int) $this->r[1]; - $r2 = (int) $this->r[2]; - $r3 = (int) $this->r[3]; - $r4 = (int) $this->r[4]; - - $s1 = self::mul($r1, 5, 3); - $s2 = self::mul($r2, 5, 3); - $s3 = self::mul($r3, 5, 3); - $s4 = self::mul($r4, 5, 3); - - $h0 = $this->h[0]; - $h1 = $this->h[1]; - $h2 = $this->h[2]; - $h3 = $this->h[3]; - $h4 = $this->h[4]; - - while ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { - /* h += m[i] */ - $h0 += self::load_4(self::substr($message, 0, 4)) & 0x3ffffff; - $h1 += (self::load_4(self::substr($message, 3, 4)) >> 2) & 0x3ffffff; - $h2 += (self::load_4(self::substr($message, 6, 4)) >> 4) & 0x3ffffff; - $h3 += (self::load_4(self::substr($message, 9, 4)) >> 6) & 0x3ffffff; - $h4 += (self::load_4(self::substr($message, 12, 4)) >> 8) | $hibit; - - /* h *= r */ - $d0 = ( - self::mul($h0, $r0, 25) + - self::mul($s4, $h1, 26) + - self::mul($s3, $h2, 26) + - self::mul($s2, $h3, 26) + - self::mul($s1, $h4, 26) - ); - - $d1 = ( - self::mul($h0, $r1, 25) + - self::mul($h1, $r0, 25) + - self::mul($s4, $h2, 26) + - self::mul($s3, $h3, 26) + - self::mul($s2, $h4, 26) - ); - - $d2 = ( - self::mul($h0, $r2, 25) + - self::mul($h1, $r1, 25) + - self::mul($h2, $r0, 25) + - self::mul($s4, $h3, 26) + - self::mul($s3, $h4, 26) - ); - - $d3 = ( - self::mul($h0, $r3, 25) + - self::mul($h1, $r2, 25) + - self::mul($h2, $r1, 25) + - self::mul($h3, $r0, 25) + - self::mul($s4, $h4, 26) - ); - - $d4 = ( - self::mul($h0, $r4, 25) + - self::mul($h1, $r3, 25) + - self::mul($h2, $r2, 25) + - self::mul($h3, $r1, 25) + - self::mul($h4, $r0, 25) - ); - - /* (partial) h %= p */ - /** @var int $c */ - $c = $d0 >> 26; - /** @var int $h0 */ - $h0 = $d0 & 0x3ffffff; - $d1 += $c; - - /** @var int $c */ - $c = $d1 >> 26; - /** @var int $h1 */ - $h1 = $d1 & 0x3ffffff; - $d2 += $c; - - /** @var int $c */ - $c = $d2 >> 26; - /** @var int $h2 */ - $h2 = $d2 & 0x3ffffff; - $d3 += $c; - - /** @var int $c */ - $c = $d3 >> 26; - /** @var int $h3 */ - $h3 = $d3 & 0x3ffffff; - $d4 += $c; - - /** @var int $c */ - $c = $d4 >> 26; - /** @var int $h4 */ - $h4 = $d4 & 0x3ffffff; - $h0 += (int) self::mul($c, 5, 3); - - /** @var int $c */ - $c = $h0 >> 26; - /** @var int $h0 */ - $h0 &= 0x3ffffff; - $h1 += $c; - - // Chop off the left 32 bytes. - $message = self::substr( - $message, - ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - ); - $bytes -= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; - } - - $this->h = array( - (int) ($h0 & 0xffffffff), - (int) ($h1 & 0xffffffff), - (int) ($h2 & 0xffffffff), - (int) ($h3 & 0xffffffff), - (int) ($h4 & 0xffffffff) - ); - return $this; - } - - /** - * @internal You should not use this directly from another application - * - * @return string - * @throws TypeError - */ - public function finish() - { - /* process the remaining block */ - if ($this->leftover) { - $i = $this->leftover; - $this->buffer[$i++] = 1; - for (; $i < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; ++$i) { - $this->buffer[$i] = 0; - } - $this->final = true; - $this->blocks( - self::substr( - self::intArrayToString($this->buffer), - 0, - ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - ), - ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - ); - } - - $h0 = (int) $this->h[0]; - $h1 = (int) $this->h[1]; - $h2 = (int) $this->h[2]; - $h3 = (int) $this->h[3]; - $h4 = (int) $this->h[4]; - - /** @var int $c */ - $c = $h1 >> 26; - /** @var int $h1 */ - $h1 &= 0x3ffffff; - /** @var int $h2 */ - $h2 += $c; - /** @var int $c */ - $c = $h2 >> 26; - /** @var int $h2 */ - $h2 &= 0x3ffffff; - $h3 += $c; - /** @var int $c */ - $c = $h3 >> 26; - $h3 &= 0x3ffffff; - $h4 += $c; - /** @var int $c */ - $c = $h4 >> 26; - $h4 &= 0x3ffffff; - /** @var int $h0 */ - $h0 += self::mul($c, 5, 3); - /** @var int $c */ - $c = $h0 >> 26; - /** @var int $h0 */ - $h0 &= 0x3ffffff; - /** @var int $h1 */ - $h1 += $c; - - /* compute h + -p */ - /** @var int $g0 */ - $g0 = $h0 + 5; - /** @var int $c */ - $c = $g0 >> 26; - /** @var int $g0 */ - $g0 &= 0x3ffffff; - - /** @var int $g1 */ - $g1 = $h1 + $c; - /** @var int $c */ - $c = $g1 >> 26; - $g1 &= 0x3ffffff; - - /** @var int $g2 */ - $g2 = $h2 + $c; - /** @var int $c */ - $c = $g2 >> 26; - /** @var int $g2 */ - $g2 &= 0x3ffffff; - - /** @var int $g3 */ - $g3 = $h3 + $c; - /** @var int $c */ - $c = $g3 >> 26; - /** @var int $g3 */ - $g3 &= 0x3ffffff; - - /** @var int $g4 */ - $g4 = ($h4 + $c - (1 << 26)) & 0xffffffff; - - /* select h if h < p, or h + -p if h >= p */ - /** @var int $mask */ - $mask = ($g4 >> 31) - 1; - - $g0 &= $mask; - $g1 &= $mask; - $g2 &= $mask; - $g3 &= $mask; - $g4 &= $mask; - - /** @var int $mask */ - $mask = ~$mask & 0xffffffff; - /** @var int $h0 */ - $h0 = ($h0 & $mask) | $g0; - /** @var int $h1 */ - $h1 = ($h1 & $mask) | $g1; - /** @var int $h2 */ - $h2 = ($h2 & $mask) | $g2; - /** @var int $h3 */ - $h3 = ($h3 & $mask) | $g3; - /** @var int $h4 */ - $h4 = ($h4 & $mask) | $g4; - - /* h = h % (2^128) */ - /** @var int $h0 */ - $h0 = (($h0) | ($h1 << 26)) & 0xffffffff; - /** @var int $h1 */ - $h1 = (($h1 >> 6) | ($h2 << 20)) & 0xffffffff; - /** @var int $h2 */ - $h2 = (($h2 >> 12) | ($h3 << 14)) & 0xffffffff; - /** @var int $h3 */ - $h3 = (($h3 >> 18) | ($h4 << 8)) & 0xffffffff; - - /* mac = (h + pad) % (2^128) */ - $f = (int) ($h0 + $this->pad[0]); - $h0 = (int) $f; - $f = (int) ($h1 + $this->pad[1] + ($f >> 32)); - $h1 = (int) $f; - $f = (int) ($h2 + $this->pad[2] + ($f >> 32)); - $h2 = (int) $f; - $f = (int) ($h3 + $this->pad[3] + ($f >> 32)); - $h3 = (int) $f; - - return self::store32_le($h0 & 0xffffffff) . - self::store32_le($h1 & 0xffffffff) . - self::store32_le($h2 & 0xffffffff) . - self::store32_le($h3 & 0xffffffff); - } -} diff --git a/libs/sodium_compat/src/Core/Salsa20.php b/libs/sodium_compat/src/Core/Salsa20.php deleted file mode 100644 index 515ccad..0000000 --- a/libs/sodium_compat/src/Core/Salsa20.php +++ /dev/null @@ -1,273 +0,0 @@ - 0; $i -= 2) { - $x4 ^= self::rotate($x0 + $x12, 7); - $x8 ^= self::rotate($x4 + $x0, 9); - $x12 ^= self::rotate($x8 + $x4, 13); - $x0 ^= self::rotate($x12 + $x8, 18); - - $x9 ^= self::rotate($x5 + $x1, 7); - $x13 ^= self::rotate($x9 + $x5, 9); - $x1 ^= self::rotate($x13 + $x9, 13); - $x5 ^= self::rotate($x1 + $x13, 18); - - $x14 ^= self::rotate($x10 + $x6, 7); - $x2 ^= self::rotate($x14 + $x10, 9); - $x6 ^= self::rotate($x2 + $x14, 13); - $x10 ^= self::rotate($x6 + $x2, 18); - - $x3 ^= self::rotate($x15 + $x11, 7); - $x7 ^= self::rotate($x3 + $x15, 9); - $x11 ^= self::rotate($x7 + $x3, 13); - $x15 ^= self::rotate($x11 + $x7, 18); - - $x1 ^= self::rotate($x0 + $x3, 7); - $x2 ^= self::rotate($x1 + $x0, 9); - $x3 ^= self::rotate($x2 + $x1, 13); - $x0 ^= self::rotate($x3 + $x2, 18); - - $x6 ^= self::rotate($x5 + $x4, 7); - $x7 ^= self::rotate($x6 + $x5, 9); - $x4 ^= self::rotate($x7 + $x6, 13); - $x5 ^= self::rotate($x4 + $x7, 18); - - $x11 ^= self::rotate($x10 + $x9, 7); - $x8 ^= self::rotate($x11 + $x10, 9); - $x9 ^= self::rotate($x8 + $x11, 13); - $x10 ^= self::rotate($x9 + $x8, 18); - - $x12 ^= self::rotate($x15 + $x14, 7); - $x13 ^= self::rotate($x12 + $x15, 9); - $x14 ^= self::rotate($x13 + $x12, 13); - $x15 ^= self::rotate($x14 + $x13, 18); - } - - $x0 += $j0; - $x1 += $j1; - $x2 += $j2; - $x3 += $j3; - $x4 += $j4; - $x5 += $j5; - $x6 += $j6; - $x7 += $j7; - $x8 += $j8; - $x9 += $j9; - $x10 += $j10; - $x11 += $j11; - $x12 += $j12; - $x13 += $j13; - $x14 += $j14; - $x15 += $j15; - - return self::store32_le($x0) . - self::store32_le($x1) . - self::store32_le($x2) . - self::store32_le($x3) . - self::store32_le($x4) . - self::store32_le($x5) . - self::store32_le($x6) . - self::store32_le($x7) . - self::store32_le($x8) . - self::store32_le($x9) . - self::store32_le($x10) . - self::store32_le($x11) . - self::store32_le($x12) . - self::store32_le($x13) . - self::store32_le($x14) . - self::store32_le($x15); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $len - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function salsa20($len, $nonce, $key) - { - if (self::strlen($key) !== 32) { - throw new RangeException('Key must be 32 bytes long'); - } - $kcopy = '' . $key; - $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8); - $c = ''; - while ($len >= 64) { - $c .= self::core_salsa20($in, $kcopy, null); - $u = 1; - // Internal counter. - for ($i = 8; $i < 16; ++$i) { - $u += self::chrToInt($in[$i]); - $in[$i] = self::intToChr($u & 0xff); - $u >>= 8; - } - $len -= 64; - } - if ($len > 0) { - $c .= self::substr( - self::core_salsa20($in, $kcopy, null), - 0, - $len - ); - } - try { - ParagonIE_Sodium_Compat::memzero($kcopy); - } catch (SodiumException $ex) { - $kcopy = null; - } - return $c; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $m - * @param string $n - * @param int $ic - * @param string $k - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function salsa20_xor_ic($m, $n, $ic, $k) - { - $mlen = self::strlen($m); - if ($mlen < 1) { - return ''; - } - $kcopy = self::substr($k, 0, 32); - $in = self::substr($n, 0, 8); - // Initialize the counter - $in .= ParagonIE_Sodium_Core_Util::store64_le($ic); - - $c = ''; - while ($mlen >= 64) { - $block = self::core_salsa20($in, $kcopy, null); - $c .= self::xorStrings( - self::substr($m, 0, 64), - self::substr($block, 0, 64) - ); - $u = 1; - for ($i = 8; $i < 16; ++$i) { - $u += self::chrToInt($in[$i]); - $in[$i] = self::intToChr($u & 0xff); - $u >>= 8; - } - - $mlen -= 64; - $m = self::substr($m, 64); - } - - if ($mlen) { - $block = self::core_salsa20($in, $kcopy, null); - $c .= self::xorStrings( - self::substr($m, 0, $mlen), - self::substr($block, 0, $mlen) - ); - } - try { - ParagonIE_Sodium_Compat::memzero($block); - ParagonIE_Sodium_Compat::memzero($kcopy); - } catch (SodiumException $ex) { - $block = null; - $kcopy = null; - } - - return $c; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function salsa20_xor($message, $nonce, $key) - { - return self::xorStrings( - $message, - self::salsa20( - self::strlen($message), - $nonce, - $key - ) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $u - * @param int $c - * @return int - */ - public static function rotate($u, $c) - { - $u &= 0xffffffff; - $c %= 32; - return (int) (0xffffffff & ( - ($u << $c) - | - ($u >> (32 - $c)) - ) - ); - } -} diff --git a/libs/sodium_compat/src/Core/SecretStream/State.php b/libs/sodium_compat/src/Core/SecretStream/State.php deleted file mode 100644 index 2412f65..0000000 --- a/libs/sodium_compat/src/Core/SecretStream/State.php +++ /dev/null @@ -1,163 +0,0 @@ -key = $key; - $this->counter = 1; - if (is_null($nonce)) { - $nonce = str_repeat("\0", 12); - } - $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);; - $this->_pad = str_repeat("\0", 4); - } - - /** - * @return self - */ - public function counterReset() - { - $this->counter = 1; - $this->_pad = str_repeat("\0", 4); - return $this; - } - - /** - * @return string - */ - public function getKey() - { - return $this->key; - } - - /** - * @return string - */ - public function getCounter() - { - return ParagonIE_Sodium_Core_Util::store32_le($this->counter); - } - - /** - * @return string - */ - public function getNonce() - { - if (!is_string($this->nonce)) { - $this->nonce = str_repeat("\0", 12); - } - if (ParagonIE_Sodium_Core_Util::strlen($this->nonce) !== 12) { - $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT); - } - return $this->nonce; - } - - /** - * @return string - */ - public function getCombinedNonce() - { - return $this->getCounter() . - ParagonIE_Sodium_Core_Util::substr($this->getNonce(), 0, 8); - } - - /** - * @return self - */ - public function incrementCounter() - { - ++$this->counter; - return $this; - } - - /** - * @return bool - */ - public function needsRekey() - { - return ($this->counter & 0xffff) === 0; - } - - /** - * @param string $newKeyAndNonce - * @return self - */ - public function rekey($newKeyAndNonce) - { - $this->key = ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 0, 32); - $this->nonce = str_pad( - ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 32), - 12, - "\0", - STR_PAD_RIGHT - ); - return $this; - } - - /** - * @param string $str - * @return self - */ - public function xorNonce($str) - { - $this->nonce = ParagonIE_Sodium_Core_Util::xorStrings( - $this->getNonce(), - str_pad( - ParagonIE_Sodium_Core_Util::substr($str, 0, 8), - 12, - "\0", - STR_PAD_RIGHT - ) - ); - return $this; - } - - /** - * @param string $string - * @return self - */ - public static function fromString($string) - { - $state = new ParagonIE_Sodium_Core_SecretStream_State( - ParagonIE_Sodium_Core_Util::substr($string, 0, 32) - ); - $state->counter = ParagonIE_Sodium_Core_Util::load_4( - ParagonIE_Sodium_Core_Util::substr($string, 32, 4) - ); - $state->nonce = ParagonIE_Sodium_Core_Util::substr($string, 36, 12); - $state->_pad = ParagonIE_Sodium_Core_Util::substr($string, 48, 8); - return $state; - } - - /** - * @return string - */ - public function toString() - { - return $this->key . - $this->getCounter() . - $this->nonce . - $this->_pad; - } -} diff --git a/libs/sodium_compat/src/Core/SipHash.php b/libs/sodium_compat/src/Core/SipHash.php deleted file mode 100644 index 542b4cc..0000000 --- a/libs/sodium_compat/src/Core/SipHash.php +++ /dev/null @@ -1,306 +0,0 @@ - $v - * @return array - * - */ - public static function sipRound(array $v) - { - # v0 += v1; - list($v[0], $v[1]) = self::add( - array($v[0], $v[1]), - array($v[2], $v[3]) - ); - - # v1=ROTL(v1,13); - list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 13); - - # v1 ^= v0; - $v[2] = (int) $v[2] ^ (int) $v[0]; - $v[3] = (int) $v[3] ^ (int) $v[1]; - - # v0=ROTL(v0,32); - list($v[0], $v[1]) = self::rotl_64((int) $v[0], (int) $v[1], 32); - - # v2 += v3; - list($v[4], $v[5]) = self::add( - array((int) $v[4], (int) $v[5]), - array((int) $v[6], (int) $v[7]) - ); - - # v3=ROTL(v3,16); - list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 16); - - # v3 ^= v2; - $v[6] = (int) $v[6] ^ (int) $v[4]; - $v[7] = (int) $v[7] ^ (int) $v[5]; - - # v0 += v3; - list($v[0], $v[1]) = self::add( - array((int) $v[0], (int) $v[1]), - array((int) $v[6], (int) $v[7]) - ); - - # v3=ROTL(v3,21); - list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 21); - - # v3 ^= v0; - $v[6] = (int) $v[6] ^ (int) $v[0]; - $v[7] = (int) $v[7] ^ (int) $v[1]; - - # v2 += v1; - list($v[4], $v[5]) = self::add( - array((int) $v[4], (int) $v[5]), - array((int) $v[2], (int) $v[3]) - ); - - # v1=ROTL(v1,17); - list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 17); - - # v1 ^= v2;; - $v[2] = (int) $v[2] ^ (int) $v[4]; - $v[3] = (int) $v[3] ^ (int) $v[5]; - - # v2=ROTL(v2,32) - list($v[4], $v[5]) = self::rotl_64((int) $v[4], (int) $v[5], 32); - - return $v; - } - - /** - * Add two 32 bit integers representing a 64-bit integer. - * - * @internal You should not use this directly from another application - * - * @param int[] $a - * @param int[] $b - * @return array - */ - public static function add(array $a, array $b) - { - /** @var int $x1 */ - $x1 = $a[1] + $b[1]; - /** @var int $c */ - $c = $x1 >> 32; // Carry if ($a + $b) > 0xffffffff - /** @var int $x0 */ - $x0 = $a[0] + $b[0] + $c; - return array( - $x0 & 0xffffffff, - $x1 & 0xffffffff - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $int0 - * @param int $int1 - * @param int $c - * @return array - */ - public static function rotl_64($int0, $int1, $c) - { - $int0 &= 0xffffffff; - $int1 &= 0xffffffff; - $c &= 63; - if ($c === 32) { - return array($int1, $int0); - } - if ($c > 31) { - $tmp = $int1; - $int1 = $int0; - $int0 = $tmp; - $c &= 31; - } - if ($c === 0) { - return array($int0, $int1); - } - return array( - 0xffffffff & ( - ($int0 << $c) - | - ($int1 >> (32 - $c)) - ), - 0xffffffff & ( - ($int1 << $c) - | - ($int0 >> (32 - $c)) - ), - ); - } - - /** - * Implements Siphash-2-4 using only 32-bit numbers. - * - * When we split an int into two, the higher bits go to the lower index. - * e.g. 0xDEADBEEFAB10C92D becomes [ - * 0 => 0xDEADBEEF, - * 1 => 0xAB10C92D - * ]. - * - * @internal You should not use this directly from another application - * - * @param string $in - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sipHash24($in, $key) - { - $inlen = self::strlen($in); - - # /* "somepseudorandomlygeneratedbytes" */ - # u64 v0 = 0x736f6d6570736575ULL; - # u64 v1 = 0x646f72616e646f6dULL; - # u64 v2 = 0x6c7967656e657261ULL; - # u64 v3 = 0x7465646279746573ULL; - $v = array( - 0x736f6d65, // 0 - 0x70736575, // 1 - 0x646f7261, // 2 - 0x6e646f6d, // 3 - 0x6c796765, // 4 - 0x6e657261, // 5 - 0x74656462, // 6 - 0x79746573 // 7 - ); - // v0 => $v[0], $v[1] - // v1 => $v[2], $v[3] - // v2 => $v[4], $v[5] - // v3 => $v[6], $v[7] - - # u64 k0 = LOAD64_LE( k ); - # u64 k1 = LOAD64_LE( k + 8 ); - $k = array( - self::load_4(self::substr($key, 4, 4)), - self::load_4(self::substr($key, 0, 4)), - self::load_4(self::substr($key, 12, 4)), - self::load_4(self::substr($key, 8, 4)) - ); - // k0 => $k[0], $k[1] - // k1 => $k[2], $k[3] - - # b = ( ( u64 )inlen ) << 56; - $b = array( - $inlen << 24, - 0 - ); - // See docblock for why the 0th index gets the higher bits. - - # v3 ^= k1; - $v[6] ^= $k[2]; - $v[7] ^= $k[3]; - # v2 ^= k0; - $v[4] ^= $k[0]; - $v[5] ^= $k[1]; - # v1 ^= k1; - $v[2] ^= $k[2]; - $v[3] ^= $k[3]; - # v0 ^= k0; - $v[0] ^= $k[0]; - $v[1] ^= $k[1]; - - $left = $inlen; - # for ( ; in != end; in += 8 ) - while ($left >= 8) { - # m = LOAD64_LE( in ); - $m = array( - self::load_4(self::substr($in, 4, 4)), - self::load_4(self::substr($in, 0, 4)) - ); - - # v3 ^= m; - $v[6] ^= $m[0]; - $v[7] ^= $m[1]; - - # SIPROUND; - # SIPROUND; - $v = self::sipRound($v); - $v = self::sipRound($v); - - # v0 ^= m; - $v[0] ^= $m[0]; - $v[1] ^= $m[1]; - - $in = self::substr($in, 8); - $left -= 8; - } - - # switch( left ) - # { - # case 7: b |= ( ( u64 )in[ 6] ) << 48; - # case 6: b |= ( ( u64 )in[ 5] ) << 40; - # case 5: b |= ( ( u64 )in[ 4] ) << 32; - # case 4: b |= ( ( u64 )in[ 3] ) << 24; - # case 3: b |= ( ( u64 )in[ 2] ) << 16; - # case 2: b |= ( ( u64 )in[ 1] ) << 8; - # case 1: b |= ( ( u64 )in[ 0] ); break; - # case 0: break; - # } - switch ($left) { - case 7: - $b[0] |= self::chrToInt($in[6]) << 16; - case 6: - $b[0] |= self::chrToInt($in[5]) << 8; - case 5: - $b[0] |= self::chrToInt($in[4]); - case 4: - $b[1] |= self::chrToInt($in[3]) << 24; - case 3: - $b[1] |= self::chrToInt($in[2]) << 16; - case 2: - $b[1] |= self::chrToInt($in[1]) << 8; - case 1: - $b[1] |= self::chrToInt($in[0]); - case 0: - break; - } - // See docblock for why the 0th index gets the higher bits. - - # v3 ^= b; - $v[6] ^= $b[0]; - $v[7] ^= $b[1]; - - # SIPROUND; - # SIPROUND; - $v = self::sipRound($v); - $v = self::sipRound($v); - - # v0 ^= b; - $v[0] ^= $b[0]; - $v[1] ^= $b[1]; - - // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation - # v2 ^= 0xff; - $v[5] ^= 0xff; - - # SIPROUND; - # SIPROUND; - # SIPROUND; - # SIPROUND; - $v = self::sipRound($v); - $v = self::sipRound($v); - $v = self::sipRound($v); - $v = self::sipRound($v); - - # b = v0 ^ v1 ^ v2 ^ v3; - # STORE64_LE( out, b ); - return self::store32_le($v[1] ^ $v[3] ^ $v[5] ^ $v[7]) . - self::store32_le($v[0] ^ $v[2] ^ $v[4] ^ $v[6]); - } -} diff --git a/libs/sodium_compat/src/Core/Util.php b/libs/sodium_compat/src/Core/Util.php deleted file mode 100644 index 3bb4daf..0000000 --- a/libs/sodium_compat/src/Core/Util.php +++ /dev/null @@ -1,926 +0,0 @@ -> $size) & 1); - return (int) ( - ($integer ^ $negative) - + - (($negative >> $realSize) & 1) - ); - } - - /** - * Convert a binary string into a hexadecimal string without cache-timing - * leaks - * - * @internal You should not use this directly from another application - * - * @param string $binaryString (raw binary) - * @return string - * @throws TypeError - */ - public static function bin2hex($binaryString) - { - /* Type checks: */ - if (!is_string($binaryString)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($binaryString) . ' given.'); - } - - $hex = ''; - $len = self::strlen($binaryString); - for ($i = 0; $i < $len; ++$i) { - /** @var array $chunk */ - $chunk = unpack('C', $binaryString[$i]); - /** @var int $c */ - $c = $chunk[1] & 0xf; - /** @var int $b */ - $b = $chunk[1] >> 4; - $hex .= pack( - 'CC', - (87 + $b + ((($b - 10) >> 8) & ~38)), - (87 + $c + ((($c - 10) >> 8) & ~38)) - ); - } - return $hex; - } - - /** - * Convert a binary string into a hexadecimal string without cache-timing - * leaks, returning uppercase letters (as per RFC 4648) - * - * @internal You should not use this directly from another application - * - * @param string $bin_string (raw binary) - * @return string - * @throws TypeError - */ - public static function bin2hexUpper($bin_string) - { - $hex = ''; - $len = self::strlen($bin_string); - for ($i = 0; $i < $len; ++$i) { - /** @var array $chunk */ - $chunk = unpack('C', $bin_string[$i]); - /** - * Lower 16 bits - * - * @var int $c - */ - $c = $chunk[1] & 0xf; - - /** - * Upper 16 bits - * @var int $b - */ - $b = $chunk[1] >> 4; - - /** - * Use pack() and binary operators to turn the two integers - * into hexadecimal characters. We don't use chr() here, because - * it uses a lookup table internally and we want to avoid - * cache-timing side-channels. - */ - $hex .= pack( - 'CC', - (55 + $b + ((($b - 10) >> 8) & ~6)), - (55 + $c + ((($c - 10) >> 8) & ~6)) - ); - } - return $hex; - } - - /** - * Cache-timing-safe variant of ord() - * - * @internal You should not use this directly from another application - * - * @param string $chr - * @return int - * @throws SodiumException - * @throws TypeError - */ - public static function chrToInt($chr) - { - /* Type checks: */ - if (!is_string($chr)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($chr) . ' given.'); - } - if (self::strlen($chr) !== 1) { - throw new SodiumException('chrToInt() expects a string that is exactly 1 character long'); - } - /** @var array $chunk */ - $chunk = unpack('C', $chr); - return (int) ($chunk[1]); - } - - /** - * Compares two strings. - * - * @internal You should not use this directly from another application - * - * @param string $left - * @param string $right - * @param int $len - * @return int - * @throws SodiumException - * @throws TypeError - */ - public static function compare($left, $right, $len = null) - { - $leftLen = self::strlen($left); - $rightLen = self::strlen($right); - if ($len === null) { - $len = max($leftLen, $rightLen); - $left = str_pad($left, $len, "\x00", STR_PAD_RIGHT); - $right = str_pad($right, $len, "\x00", STR_PAD_RIGHT); - } - - $gt = 0; - $eq = 1; - $i = $len; - while ($i !== 0) { - --$i; - $gt |= ((self::chrToInt($right[$i]) - self::chrToInt($left[$i])) >> 8) & $eq; - $eq &= ((self::chrToInt($right[$i]) ^ self::chrToInt($left[$i])) - 1) >> 8; - } - return ($gt + $gt + $eq) - 1; - } - - /** - * If a variable does not match a given type, throw a TypeError. - * - * @param mixed $mixedVar - * @param string $type - * @param int $argumentIndex - * @throws TypeError - * @throws SodiumException - * @return void - */ - public static function declareScalarType(&$mixedVar = null, $type = 'void', $argumentIndex = 0) - { - if (func_num_args() === 0) { - /* Tautology, by default */ - return; - } - if (func_num_args() === 1) { - throw new TypeError('Declared void, but passed a variable'); - } - $realType = strtolower(gettype($mixedVar)); - $type = strtolower($type); - switch ($type) { - case 'null': - if ($mixedVar !== null) { - throw new TypeError('Argument ' . $argumentIndex . ' must be null, ' . $realType . ' given.'); - } - break; - case 'integer': - case 'int': - $allow = array('int', 'integer'); - if (!in_array($type, $allow)) { - throw new TypeError('Argument ' . $argumentIndex . ' must be an integer, ' . $realType . ' given.'); - } - $mixedVar = (int) $mixedVar; - break; - case 'boolean': - case 'bool': - $allow = array('bool', 'boolean'); - if (!in_array($type, $allow)) { - throw new TypeError('Argument ' . $argumentIndex . ' must be a boolean, ' . $realType . ' given.'); - } - $mixedVar = (bool) $mixedVar; - break; - case 'string': - if (!is_string($mixedVar)) { - throw new TypeError('Argument ' . $argumentIndex . ' must be a string, ' . $realType . ' given.'); - } - $mixedVar = (string) $mixedVar; - break; - case 'decimal': - case 'double': - case 'float': - $allow = array('decimal', 'double', 'float'); - if (!in_array($type, $allow)) { - throw new TypeError('Argument ' . $argumentIndex . ' must be a float, ' . $realType . ' given.'); - } - $mixedVar = (float) $mixedVar; - break; - case 'object': - if (!is_object($mixedVar)) { - throw new TypeError('Argument ' . $argumentIndex . ' must be an object, ' . $realType . ' given.'); - } - break; - case 'array': - if (!is_array($mixedVar)) { - if (is_object($mixedVar)) { - if ($mixedVar instanceof ArrayAccess) { - return; - } - } - throw new TypeError('Argument ' . $argumentIndex . ' must be an array, ' . $realType . ' given.'); - } - break; - default: - throw new SodiumException('Unknown type (' . $realType .') does not match expect type (' . $type . ')'); - } - } - - /** - * Evaluate whether or not two strings are equal (in constant-time) - * - * @param string $left - * @param string $right - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function hashEquals($left, $right) - { - /* Type checks: */ - if (!is_string($left)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($left) . ' given.'); - } - if (!is_string($right)) { - throw new TypeError('Argument 2 must be a string, ' . gettype($right) . ' given.'); - } - - if (is_callable('hash_equals')) { - return hash_equals($left, $right); - } - $d = 0; - /** @var int $len */ - $len = self::strlen($left); - if ($len !== self::strlen($right)) { - return false; - } - for ($i = 0; $i < $len; ++$i) { - $d |= self::chrToInt($left[$i]) ^ self::chrToInt($right[$i]); - } - - if ($d !== 0) { - return false; - } - return $left === $right; - } - - /** - * Convert a hexadecimal string into a binary string without cache-timing - * leaks - * - * @internal You should not use this directly from another application - * - * @param string $hexString - * @param bool $strictPadding - * @return string (raw binary) - * @throws RangeException - * @throws TypeError - */ - public static function hex2bin($hexString, $strictPadding = false) - { - /* Type checks: */ - if (!is_string($hexString)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($hexString) . ' given.'); - } - - /** @var int $hex_pos */ - $hex_pos = 0; - /** @var string $bin */ - $bin = ''; - /** @var int $c_acc */ - $c_acc = 0; - /** @var int $hex_len */ - $hex_len = self::strlen($hexString); - /** @var int $state */ - $state = 0; - if (($hex_len & 1) !== 0) { - if ($strictPadding) { - throw new RangeException( - 'Expected an even number of hexadecimal characters' - ); - } else { - $hexString = '0' . $hexString; - ++$hex_len; - } - } - - $chunk = unpack('C*', $hexString); - while ($hex_pos < $hex_len) { - ++$hex_pos; - /** @var int $c */ - $c = $chunk[$hex_pos]; - /** @var int $c_num */ - $c_num = $c ^ 48; - /** @var int $c_num0 */ - $c_num0 = ($c_num - 10) >> 8; - /** @var int $c_alpha */ - $c_alpha = ($c & ~32) - 55; - /** @var int $c_alpha0 */ - $c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8; - if (($c_num0 | $c_alpha0) === 0) { - throw new RangeException( - 'hex2bin() only expects hexadecimal characters' - ); - } - /** @var int $c_val */ - $c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0); - if ($state === 0) { - $c_acc = $c_val * 16; - } else { - $bin .= pack('C', $c_acc | $c_val); - } - $state ^= 1; - } - return $bin; - } - - /** - * Turn an array of integers into a string - * - * @internal You should not use this directly from another application - * - * @param array $ints - * @return string - */ - public static function intArrayToString(array $ints) - { - /** @var array $args */ - $args = $ints; - foreach ($args as $i => $v) { - $args[$i] = (int) ($v & 0xff); - } - array_unshift($args, str_repeat('C', count($ints))); - return (string) (call_user_func_array('pack', $args)); - } - - /** - * Cache-timing-safe variant of ord() - * - * @internal You should not use this directly from another application - * - * @param int $int - * @return string - * @throws TypeError - */ - public static function intToChr($int) - { - return pack('C', $int); - } - - /** - * Load a 3 character substring into an integer - * - * @internal You should not use this directly from another application - * - * @param string $string - * @return int - * @throws RangeException - * @throws TypeError - */ - public static function load_3($string) - { - /* Type checks: */ - if (!is_string($string)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); - } - - /* Input validation: */ - if (self::strlen($string) < 3) { - throw new RangeException( - 'String must be 3 bytes or more; ' . self::strlen($string) . ' given.' - ); - } - /** @var array $unpacked */ - $unpacked = unpack('V', $string . "\0"); - return (int) ($unpacked[1] & 0xffffff); - } - - /** - * Load a 4 character substring into an integer - * - * @internal You should not use this directly from another application - * - * @param string $string - * @return int - * @throws RangeException - * @throws TypeError - */ - public static function load_4($string) - { - /* Type checks: */ - if (!is_string($string)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); - } - - /* Input validation: */ - if (self::strlen($string) < 4) { - throw new RangeException( - 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' - ); - } - /** @var array $unpacked */ - $unpacked = unpack('V', $string); - return (int) ($unpacked[1] & 0xffffffff); - } - - /** - * Load a 8 character substring into an integer - * - * @internal You should not use this directly from another application - * - * @param string $string - * @return int - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function load64_le($string) - { - /* Type checks: */ - if (!is_string($string)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); - } - - /* Input validation: */ - if (self::strlen($string) < 4) { - throw new RangeException( - 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' - ); - } - if (PHP_VERSION_ID >= 50603 && PHP_INT_SIZE === 8) { - /** @var array $unpacked */ - $unpacked = unpack('P', $string); - return (int) $unpacked[1]; - } - - /** @var int $result */ - $result = (self::chrToInt($string[0]) & 0xff); - $result |= (self::chrToInt($string[1]) & 0xff) << 8; - $result |= (self::chrToInt($string[2]) & 0xff) << 16; - $result |= (self::chrToInt($string[3]) & 0xff) << 24; - $result |= (self::chrToInt($string[4]) & 0xff) << 32; - $result |= (self::chrToInt($string[5]) & 0xff) << 40; - $result |= (self::chrToInt($string[6]) & 0xff) << 48; - $result |= (self::chrToInt($string[7]) & 0xff) << 56; - return (int) $result; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $left - * @param string $right - * @return int - * @throws SodiumException - * @throws TypeError - */ - public static function memcmp($left, $right) - { - if (self::hashEquals($left, $right)) { - return 0; - } - return -1; - } - - /** - * Multiply two integers in constant-time - * - * Micro-architecture timing side-channels caused by how your CPU - * implements multiplication are best prevented by never using the - * multiplication operators and ensuring that our code always takes - * the same number of operations to complete, regardless of the values - * of $a and $b. - * - * @internal You should not use this directly from another application - * - * @param int $a - * @param int $b - * @param int $size Limits the number of operations (useful for small, - * constant operands) - * @return int - */ - public static function mul($a, $b, $size = 0) - { - if (ParagonIE_Sodium_Compat::$fastMult) { - return (int) ($a * $b); - } - - static $defaultSize = null; - /** @var int $defaultSize */ - if (!$defaultSize) { - /** @var int $defaultSize */ - $defaultSize = (PHP_INT_SIZE << 3) - 1; - } - if ($size < 1) { - /** @var int $size */ - $size = $defaultSize; - } - /** @var int $size */ - - $c = 0; - - /** - * Mask is either -1 or 0. - * - * -1 in binary looks like 0x1111 ... 1111 - * 0 in binary looks like 0x0000 ... 0000 - * - * @var int - */ - $mask = -(($b >> ((int) $defaultSize)) & 1); - - /** - * Ensure $b is a positive integer, without creating - * a branching side-channel - * - * @var int $b - */ - $b = ($b & ~$mask) | ($mask & -$b); - - /** - * Unless $size is provided: - * - * This loop always runs 32 times when PHP_INT_SIZE is 4. - * This loop always runs 64 times when PHP_INT_SIZE is 8. - */ - for ($i = $size; $i >= 0; --$i) { - $c += (int) ($a & -($b & 1)); - $a <<= 1; - $b >>= 1; - } - - /** - * If $b was negative, we then apply the same value to $c here. - * It doesn't matter much if $a was negative; the $c += above would - * have produced a negative integer to begin with. But a negative $b - * makes $b >>= 1 never return 0, so we would end up with incorrect - * results. - * - * The end result is what we'd expect from integer multiplication. - */ - return (int) (($c & ~$mask) | ($mask & -$c)); - } - - /** - * Convert any arbitrary numbers into two 32-bit integers that represent - * a 64-bit integer. - * - * @internal You should not use this directly from another application - * - * @param int|float $num - * @return array - */ - public static function numericTo64BitInteger($num) - { - $high = 0; - /** @var int $low */ - $low = $num & 0xffffffff; - - if ((+(abs($num))) >= 1) { - if ($num > 0) { - /** @var int $high */ - $high = min((+(floor($num/4294967296))), 4294967295); - } else { - /** @var int $high */ - $high = ~~((+(ceil(($num - (+((~~($num)))))/4294967296)))); - } - } - return array((int) $high, (int) $low); - } - - /** - * Store a 24-bit integer into a string, treating it as big-endian. - * - * @internal You should not use this directly from another application - * - * @param int $int - * @return string - * @throws TypeError - */ - public static function store_3($int) - { - /* Type checks: */ - if (!is_int($int)) { - if (is_numeric($int)) { - $int = (int) $int; - } else { - throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); - } - } - /** @var string $packed */ - $packed = pack('N', $int); - return self::substr($packed, 1, 3); - } - - /** - * Store a 32-bit integer into a string, treating it as little-endian. - * - * @internal You should not use this directly from another application - * - * @param int $int - * @return string - * @throws TypeError - */ - public static function store32_le($int) - { - /* Type checks: */ - if (!is_int($int)) { - if (is_numeric($int)) { - $int = (int) $int; - } else { - throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); - } - } - - /** @var string $packed */ - $packed = pack('V', $int); - return $packed; - } - - /** - * Store a 32-bit integer into a string, treating it as big-endian. - * - * @internal You should not use this directly from another application - * - * @param int $int - * @return string - * @throws TypeError - */ - public static function store_4($int) - { - /* Type checks: */ - if (!is_int($int)) { - if (is_numeric($int)) { - $int = (int) $int; - } else { - throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); - } - } - - /** @var string $packed */ - $packed = pack('N', $int); - return $packed; - } - - /** - * Stores a 64-bit integer as an string, treating it as little-endian. - * - * @internal You should not use this directly from another application - * - * @param int $int - * @return string - * @throws TypeError - */ - public static function store64_le($int) - { - /* Type checks: */ - if (!is_int($int)) { - if (is_numeric($int)) { - $int = (int) $int; - } else { - throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); - } - } - - if (PHP_INT_SIZE === 8) { - if (PHP_VERSION_ID >= 50603) { - /** @var string $packed */ - $packed = pack('P', $int); - return $packed; - } - return self::intToChr($int & 0xff) . - self::intToChr(($int >> 8) & 0xff) . - self::intToChr(($int >> 16) & 0xff) . - self::intToChr(($int >> 24) & 0xff) . - self::intToChr(($int >> 32) & 0xff) . - self::intToChr(($int >> 40) & 0xff) . - self::intToChr(($int >> 48) & 0xff) . - self::intToChr(($int >> 56) & 0xff); - } - if ($int > PHP_INT_MAX) { - list($hiB, $int) = self::numericTo64BitInteger($int); - } else { - $hiB = 0; - } - return - self::intToChr(($int ) & 0xff) . - self::intToChr(($int >> 8) & 0xff) . - self::intToChr(($int >> 16) & 0xff) . - self::intToChr(($int >> 24) & 0xff) . - self::intToChr($hiB & 0xff) . - self::intToChr(($hiB >> 8) & 0xff) . - self::intToChr(($hiB >> 16) & 0xff) . - self::intToChr(($hiB >> 24) & 0xff); - } - - /** - * Safe string length - * - * @internal You should not use this directly from another application - * - * @ref mbstring.func_overload - * - * @param string $str - * @return int - * @throws TypeError - */ - public static function strlen($str) - { - /* Type checks: */ - if (!is_string($str)) { - throw new TypeError('String expected'); - } - - return (int) ( - self::isMbStringOverride() - ? mb_strlen($str, '8bit') - : strlen($str) - ); - } - - /** - * Turn a string into an array of integers - * - * @internal You should not use this directly from another application - * - * @param string $string - * @return array - * @throws TypeError - */ - public static function stringToIntArray($string) - { - if (!is_string($string)) { - throw new TypeError('String expected'); - } - /** - * @var array - */ - $values = array_values( - unpack('C*', $string) - ); - return $values; - } - - /** - * Safe substring - * - * @internal You should not use this directly from another application - * - * @ref mbstring.func_overload - * - * @param string $str - * @param int $start - * @param int $length - * @return string - * @throws TypeError - */ - public static function substr($str, $start = 0, $length = null) - { - /* Type checks: */ - if (!is_string($str)) { - throw new TypeError('String expected'); - } - - if ($length === 0) { - return ''; - } - - if (self::isMbStringOverride()) { - if (PHP_VERSION_ID < 50400 && $length === null) { - $length = self::strlen($str); - } - $sub = (string) mb_substr($str, $start, $length, '8bit'); - } elseif ($length === null) { - $sub = (string) substr($str, $start); - } else { - $sub = (string) substr($str, $start, $length); - } - if ($sub !== '') { - return $sub; - } - return ''; - } - - /** - * Compare a 16-character byte string in constant time. - * - * @internal You should not use this directly from another application - * - * @param string $a - * @param string $b - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function verify_16($a, $b) - { - /* Type checks: */ - if (!is_string($a)) { - throw new TypeError('String expected'); - } - if (!is_string($b)) { - throw new TypeError('String expected'); - } - return self::hashEquals( - self::substr($a, 0, 16), - self::substr($b, 0, 16) - ); - } - - /** - * Compare a 32-character byte string in constant time. - * - * @internal You should not use this directly from another application - * - * @param string $a - * @param string $b - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function verify_32($a, $b) - { - /* Type checks: */ - if (!is_string($a)) { - throw new TypeError('String expected'); - } - if (!is_string($b)) { - throw new TypeError('String expected'); - } - return self::hashEquals( - self::substr($a, 0, 32), - self::substr($b, 0, 32) - ); - } - - /** - * Calculate $a ^ $b for two strings. - * - * @internal You should not use this directly from another application - * - * @param string $a - * @param string $b - * @return string - * @throws TypeError - */ - public static function xorStrings($a, $b) - { - /* Type checks: */ - if (!is_string($a)) { - throw new TypeError('Argument 1 must be a string'); - } - if (!is_string($b)) { - throw new TypeError('Argument 2 must be a string'); - } - - return (string) ($a ^ $b); - } - - /** - * Returns whether or not mbstring.func_overload is in effect. - * - * @internal You should not use this directly from another application - * - * Note: MB_OVERLOAD_STRING === 2, but we don't reference the constant - * (for nuisance-free PHP 8 support) - * - * @return bool - */ - protected static function isMbStringOverride() - { - static $mbstring = null; - - if ($mbstring === null) { - $mbstring = extension_loaded('mbstring') - && defined('MB_OVERLOAD_STRING') - && - ((int) (ini_get('mbstring.func_overload')) & 2); - // MB_OVERLOAD_STRING === 2 - } - /** @var bool $mbstring */ - - return $mbstring; - } -} diff --git a/libs/sodium_compat/src/Core/X25519.php b/libs/sodium_compat/src/Core/X25519.php deleted file mode 100644 index 732bb65..0000000 --- a/libs/sodium_compat/src/Core/X25519.php +++ /dev/null @@ -1,327 +0,0 @@ -> 25; - $h[0] += self::mul($carry9, 19, 5); - $h[9] -= $carry9 << 25; - /** @var int $carry1 */ - $carry1 = ($h[1] + (1 << 24)) >> 25; - $h[2] += $carry1; - $h[1] -= $carry1 << 25; - /** @var int $carry3 */ - $carry3 = ($h[3] + (1 << 24)) >> 25; - $h[4] += $carry3; - $h[3] -= $carry3 << 25; - /** @var int $carry5 */ - $carry5 = ($h[5] + (1 << 24)) >> 25; - $h[6] += $carry5; - $h[5] -= $carry5 << 25; - /** @var int $carry7 */ - $carry7 = ($h[7] + (1 << 24)) >> 25; - $h[8] += $carry7; - $h[7] -= $carry7 << 25; - - /** @var int $carry0 */ - $carry0 = ($h[0] + (1 << 25)) >> 26; - $h[1] += $carry0; - $h[0] -= $carry0 << 26; - /** @var int $carry2 */ - $carry2 = ($h[2] + (1 << 25)) >> 26; - $h[3] += $carry2; - $h[2] -= $carry2 << 26; - /** @var int $carry4 */ - $carry4 = ($h[4] + (1 << 25)) >> 26; - $h[5] += $carry4; - $h[4] -= $carry4 << 26; - /** @var int $carry6 */ - $carry6 = ($h[6] + (1 << 25)) >> 26; - $h[7] += $carry6; - $h[6] -= $carry6 << 26; - /** @var int $carry8 */ - $carry8 = ($h[8] + (1 << 25)) >> 26; - $h[9] += $carry8; - $h[8] -= $carry8 << 26; - - foreach ($h as $i => $value) { - $h[$i] = (int) $value; - } - return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h); - } - - /** - * @internal You should not use this directly from another application - * - * Inline comments preceded by # are from libsodium's ref10 code. - * - * @param string $n - * @param string $p - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_scalarmult_curve25519_ref10($n, $p) - { - # for (i = 0;i < 32;++i) e[i] = n[i]; - $e = '' . $n; - # e[0] &= 248; - $e[0] = self::intToChr( - self::chrToInt($e[0]) & 248 - ); - # e[31] &= 127; - # e[31] |= 64; - $e[31] = self::intToChr( - (self::chrToInt($e[31]) & 127) | 64 - ); - # fe_frombytes(x1,p); - $x1 = self::fe_frombytes($p); - # fe_1(x2); - $x2 = self::fe_1(); - # fe_0(z2); - $z2 = self::fe_0(); - # fe_copy(x3,x1); - $x3 = self::fe_copy($x1); - # fe_1(z3); - $z3 = self::fe_1(); - - # swap = 0; - /** @var int $swap */ - $swap = 0; - - # for (pos = 254;pos >= 0;--pos) { - for ($pos = 254; $pos >= 0; --$pos) { - # b = e[pos / 8] >> (pos & 7); - /** @var int $b */ - $b = self::chrToInt( - $e[(int) floor($pos / 8)] - ) >> ($pos & 7); - # b &= 1; - $b &= 1; - # swap ^= b; - $swap ^= $b; - # fe_cswap(x2,x3,swap); - self::fe_cswap($x2, $x3, $swap); - # fe_cswap(z2,z3,swap); - self::fe_cswap($z2, $z3, $swap); - # swap = b; - $swap = $b; - # fe_sub(tmp0,x3,z3); - $tmp0 = self::fe_sub($x3, $z3); - # fe_sub(tmp1,x2,z2); - $tmp1 = self::fe_sub($x2, $z2); - - # fe_add(x2,x2,z2); - $x2 = self::fe_add($x2, $z2); - - # fe_add(z2,x3,z3); - $z2 = self::fe_add($x3, $z3); - - # fe_mul(z3,tmp0,x2); - $z3 = self::fe_mul($tmp0, $x2); - - # fe_mul(z2,z2,tmp1); - $z2 = self::fe_mul($z2, $tmp1); - - # fe_sq(tmp0,tmp1); - $tmp0 = self::fe_sq($tmp1); - - # fe_sq(tmp1,x2); - $tmp1 = self::fe_sq($x2); - - # fe_add(x3,z3,z2); - $x3 = self::fe_add($z3, $z2); - - # fe_sub(z2,z3,z2); - $z2 = self::fe_sub($z3, $z2); - - # fe_mul(x2,tmp1,tmp0); - $x2 = self::fe_mul($tmp1, $tmp0); - - # fe_sub(tmp1,tmp1,tmp0); - $tmp1 = self::fe_sub($tmp1, $tmp0); - - # fe_sq(z2,z2); - $z2 = self::fe_sq($z2); - - # fe_mul121666(z3,tmp1); - $z3 = self::fe_mul121666($tmp1); - - # fe_sq(x3,x3); - $x3 = self::fe_sq($x3); - - # fe_add(tmp0,tmp0,z3); - $tmp0 = self::fe_add($tmp0, $z3); - - # fe_mul(z3,x1,z2); - $z3 = self::fe_mul($x1, $z2); - - # fe_mul(z2,tmp1,tmp0); - $z2 = self::fe_mul($tmp1, $tmp0); - } - - # fe_cswap(x2,x3,swap); - self::fe_cswap($x2, $x3, $swap); - - # fe_cswap(z2,z3,swap); - self::fe_cswap($z2, $z3, $swap); - - # fe_invert(z2,z2); - $z2 = self::fe_invert($z2); - - # fe_mul(x2,x2,z2); - $x2 = self::fe_mul($x2, $z2); - # fe_tobytes(q,x2); - return self::fe_tobytes($x2); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY - * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ - * @return ParagonIE_Sodium_Core_Curve25519_Fe - */ - public static function edwards_to_montgomery( - ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY, - ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ - ) { - $tempX = self::fe_add($edwardsZ, $edwardsY); - $tempZ = self::fe_sub($edwardsZ, $edwardsY); - $tempZ = self::fe_invert($tempZ); - return self::fe_mul($tempX, $tempZ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $n - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_scalarmult_curve25519_ref10_base($n) - { - # for (i = 0;i < 32;++i) e[i] = n[i]; - $e = '' . $n; - - # e[0] &= 248; - $e[0] = self::intToChr( - self::chrToInt($e[0]) & 248 - ); - - # e[31] &= 127; - # e[31] |= 64; - $e[31] = self::intToChr( - (self::chrToInt($e[31]) & 127) | 64 - ); - - $A = self::ge_scalarmult_base($e); - if ( - !($A->Y instanceof ParagonIE_Sodium_Core_Curve25519_Fe) - || - !($A->Z instanceof ParagonIE_Sodium_Core_Curve25519_Fe) - ) { - throw new TypeError('Null points encountered'); - } - $pk = self::edwards_to_montgomery($A->Y, $A->Z); - return self::fe_tobytes($pk); - } -} diff --git a/libs/sodium_compat/src/Core/XChaCha20.php b/libs/sodium_compat/src/Core/XChaCha20.php deleted file mode 100644 index 39e717b..0000000 --- a/libs/sodium_compat/src/Core/XChaCha20.php +++ /dev/null @@ -1,117 +0,0 @@ -> - */ - public static $sigma = array( - array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), - array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), - array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), - array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), - array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), - array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), - array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), - array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), - array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), - array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), - array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), - array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) - ); - - const BLOCKBYTES = 128; - const OUTBYTES = 64; - const KEYBYTES = 64; - - /** - * Turn two 32-bit integers into a fixed array representing a 64-bit integer. - * - * @internal You should not use this directly from another application - * - * @param int $high - * @param int $low - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - public static function new64($high, $low) - { - return ParagonIE_Sodium_Core32_Int64::fromInts($low, $high); - } - - /** - * Convert an arbitrary number into an SplFixedArray of two 32-bit integers - * that represents a 64-bit integer. - * - * @internal You should not use this directly from another application - * - * @param int $num - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - protected static function to64($num) - { - list($hi, $lo) = self::numericTo64BitInteger($num); - return self::new64($hi, $lo); - } - - /** - * Adds two 64-bit integers together, returning their sum as a SplFixedArray - * containing two 32-bit integers (representing a 64-bit integer). - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Int64 $x - * @param ParagonIE_Sodium_Core32_Int64 $y - * @return ParagonIE_Sodium_Core32_Int64 - */ - protected static function add64($x, $y) - { - return $x->addInt64($y); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Int64 $x - * @param ParagonIE_Sodium_Core32_Int64 $y - * @param ParagonIE_Sodium_Core32_Int64 $z - * @return ParagonIE_Sodium_Core32_Int64 - */ - public static function add364($x, $y, $z) - { - return $x->addInt64($y)->addInt64($z); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Int64 $x - * @param ParagonIE_Sodium_Core32_Int64 $y - * @return ParagonIE_Sodium_Core32_Int64 - * @throws TypeError - */ - public static function xor64(ParagonIE_Sodium_Core32_Int64 $x, ParagonIE_Sodium_Core32_Int64 $y) - { - return $x->xorInt64($y); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Int64 $x - * @param int $c - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - public static function rotr64(ParagonIE_Sodium_Core32_Int64 $x, $c) - { - return $x->rotateRight($c); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param int $i - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - public static function load64($x, $i) - { - /** @var int $l */ - $l = (int) ($x[$i]) - | ((int) ($x[$i+1]) << 8) - | ((int) ($x[$i+2]) << 16) - | ((int) ($x[$i+3]) << 24); - /** @var int $h */ - $h = (int) ($x[$i+4]) - | ((int) ($x[$i+5]) << 8) - | ((int) ($x[$i+6]) << 16) - | ((int) ($x[$i+7]) << 24); - return self::new64($h, $l); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $x - * @param int $i - * @param ParagonIE_Sodium_Core32_Int64 $u - * @return void - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - */ - public static function store64(SplFixedArray $x, $i, ParagonIE_Sodium_Core32_Int64 $u) - { - $v = clone $u; - $maxLength = $x->getSize() - 1; - for ($j = 0; $j < 8; ++$j) { - $k = 3 - ($j >> 1); - $x[$i] = $v->limbs[$k] & 0xff; - if (++$i > $maxLength) { - return; - } - $v->limbs[$k] >>= 8; - } - } - - /** - * This just sets the $iv static variable. - * - * @internal You should not use this directly from another application - * - * @return void - * @throws SodiumException - * @throws TypeError - */ - public static function pseudoConstructor() - { - static $called = false; - if ($called) { - return; - } - self::$iv = new SplFixedArray(8); - self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); - self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); - self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); - self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); - self::$iv[4] = self::new64(0x510e527f, 0xade682d1); - self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); - self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); - self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); - - $called = true; - } - - /** - * Returns a fresh BLAKE2 context. - * - * @internal You should not use this directly from another application - * - * @return SplFixedArray - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - * @throws SodiumException - * @throws TypeError - */ - protected static function context() - { - $ctx = new SplFixedArray(6); - $ctx[0] = new SplFixedArray(8); // h - $ctx[1] = new SplFixedArray(2); // t - $ctx[2] = new SplFixedArray(2); // f - $ctx[3] = new SplFixedArray(256); // buf - $ctx[4] = 0; // buflen - $ctx[5] = 0; // last_node (uint8_t) - - for ($i = 8; $i--;) { - $ctx[0][$i] = self::$iv[$i]; - } - for ($i = 256; $i--;) { - $ctx[3][$i] = 0; - } - - $zero = self::new64(0, 0); - $ctx[1][0] = $zero; - $ctx[1][1] = $zero; - $ctx[2][0] = $zero; - $ctx[2][1] = $zero; - - return $ctx; - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param SplFixedArray $buf - * @return void - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedAssignment - */ - protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) - { - $m = new SplFixedArray(16); - $v = new SplFixedArray(16); - - for ($i = 16; $i--;) { - $m[$i] = self::load64($buf, $i << 3); - } - - for ($i = 8; $i--;) { - $v[$i] = $ctx[0][$i]; - } - - $v[ 8] = self::$iv[0]; - $v[ 9] = self::$iv[1]; - $v[10] = self::$iv[2]; - $v[11] = self::$iv[3]; - - $v[12] = self::xor64($ctx[1][0], self::$iv[4]); - $v[13] = self::xor64($ctx[1][1], self::$iv[5]); - $v[14] = self::xor64($ctx[2][0], self::$iv[6]); - $v[15] = self::xor64($ctx[2][1], self::$iv[7]); - - for ($r = 0; $r < 12; ++$r) { - $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); - $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); - $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); - $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); - $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); - $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); - $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); - $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); - } - - for ($i = 8; $i--;) { - $ctx[0][$i] = self::xor64( - $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) - ); - } - } - - /** - * @internal You should not use this directly from another application - * - * @param int $r - * @param int $i - * @param int $a - * @param int $b - * @param int $c - * @param int $d - * @param SplFixedArray $v - * @param SplFixedArray $m - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayOffset - */ - public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) - { - $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); - $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); - $v[$c] = self::add64($v[$c], $v[$d]); - $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); - $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); - $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); - $v[$c] = self::add64($v[$c], $v[$d]); - $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); - return $v; - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param int $inc - * @return void - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - */ - public static function increment_counter($ctx, $inc) - { - if ($inc < 0) { - throw new SodiumException('Increasing by a negative number makes no sense.'); - } - $t = self::to64($inc); - # S->t is $ctx[1] in our implementation - - # S->t[0] = ( uint64_t )( t >> 0 ); - $ctx[1][0] = self::add64($ctx[1][0], $t); - - # S->t[1] += ( S->t[0] < inc ); - if (!($ctx[1][0] instanceof ParagonIE_Sodium_Core32_Int64)) { - throw new TypeError('Not an int64'); - } - /** @var ParagonIE_Sodium_Core32_Int64 $c*/ - $c = $ctx[1][0]; - if ($c->isLessThanInt($inc)) { - $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); - } - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param SplFixedArray $p - * @param int $plen - * @return void - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - * @psalm-suppress MixedMethodCall - * @psalm-suppress MixedOperand - */ - public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) - { - self::pseudoConstructor(); - - $offset = 0; - while ($plen > 0) { - $left = $ctx[4]; - $fill = 256 - $left; - - if ($plen > $fill) { - # memcpy( S->buf + left, in, fill ); /* Fill buffer */ - for ($i = $fill; $i--;) { - $ctx[3][$i + $left] = $p[$i + $offset]; - } - - # S->buflen += fill; - $ctx[4] += $fill; - - # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); - self::increment_counter($ctx, 128); - - # blake2b_compress( S, S->buf ); /* Compress */ - self::compress($ctx, $ctx[3]); - - # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ - for ($i = 128; $i--;) { - $ctx[3][$i] = $ctx[3][$i + 128]; - } - - # S->buflen -= BLAKE2B_BLOCKBYTES; - $ctx[4] -= 128; - - # in += fill; - $offset += $fill; - - # inlen -= fill; - $plen -= $fill; - } else { - for ($i = $plen; $i--;) { - $ctx[3][$i + $left] = $p[$i + $offset]; - } - $ctx[4] += $plen; - $offset += $plen; - $plen -= $plen; - } - } - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @param SplFixedArray $out - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedArrayOffset - * @psalm-suppress MixedMethodCall - * @psalm-suppress MixedOperand - */ - public static function finish(SplFixedArray $ctx, SplFixedArray $out) - { - self::pseudoConstructor(); - if ($ctx[4] > 128) { - self::increment_counter($ctx, 128); - self::compress($ctx, $ctx[3]); - $ctx[4] -= 128; - if ($ctx[4] > 128) { - throw new SodiumException('Failed to assert that buflen <= 128 bytes'); - } - for ($i = $ctx[4]; $i--;) { - $ctx[3][$i] = $ctx[3][$i + 128]; - } - } - - self::increment_counter($ctx, $ctx[4]); - $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); - - for ($i = 256 - $ctx[4]; $i--;) { - /** @var int $i */ - $ctx[3][$i + $ctx[4]] = 0; - } - - self::compress($ctx, $ctx[3]); - - $i = (int) (($out->getSize() - 1) / 8); - for (; $i >= 0; --$i) { - self::store64($out, $i << 3, $ctx[0][$i]); - } - return $out; - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray|null $key - * @param int $outlen - * @param SplFixedArray|null $salt - * @param SplFixedArray|null $personal - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedMethodCall - */ - public static function init( - $key = null, - $outlen = 64, - $salt = null, - $personal = null - ) { - self::pseudoConstructor(); - $klen = 0; - - if ($key !== null) { - if (count($key) > 64) { - throw new SodiumException('Invalid key size'); - } - $klen = count($key); - } - - if ($outlen > 64) { - throw new SodiumException('Invalid output size'); - } - - $ctx = self::context(); - - $p = new SplFixedArray(64); - // Zero our param buffer... - for ($i = 64; --$i;) { - $p[$i] = 0; - } - - $p[0] = $outlen; // digest_length - $p[1] = $klen; // key_length - $p[2] = 1; // fanout - $p[3] = 1; // depth - - if ($salt instanceof SplFixedArray) { - // salt: [32] through [47] - for ($i = 0; $i < 16; ++$i) { - $p[32 + $i] = (int) $salt[$i]; - } - } - if ($personal instanceof SplFixedArray) { - // personal: [48] through [63] - for ($i = 0; $i < 16; ++$i) { - $p[48 + $i] = (int) $personal[$i]; - } - } - - $ctx[0][0] = self::xor64( - $ctx[0][0], - self::load64($p, 0) - ); - - if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { - // We need to do what blake2b_init_param() does: - for ($i = 1; $i < 8; ++$i) { - $ctx[0][$i] = self::xor64( - $ctx[0][$i], - self::load64($p, $i << 3) - ); - } - } - - if ($klen > 0 && $key instanceof SplFixedArray) { - $block = new SplFixedArray(128); - for ($i = 128; $i--;) { - $block[$i] = 0; - } - for ($i = $klen; $i--;) { - $block[$i] = $key[$i]; - } - self::update($ctx, $block, 128); - $ctx[4] = 128; - } - - return $ctx; - } - - /** - * Convert a string into an SplFixedArray of integers - * - * @internal You should not use this directly from another application - * - * @param string $str - * @return SplFixedArray - */ - public static function stringToSplFixedArray($str = '') - { - $values = unpack('C*', $str); - return SplFixedArray::fromArray(array_values($values)); - } - - /** - * Convert an SplFixedArray of integers into a string - * - * @internal You should not use this directly from another application - * - * @param SplFixedArray $a - * @return string - */ - public static function SplFixedArrayToString(SplFixedArray $a) - { - /** - * @var array - */ - $arr = $a->toArray(); - $c = $a->count(); - array_unshift($arr, str_repeat('C', $c)); - return (string) (call_user_func_array('pack', $arr)); - } - - /** - * @internal You should not use this directly from another application - * - * @param SplFixedArray $ctx - * @return string - * @throws TypeError - * @psalm-suppress MixedArgument - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - * @psalm-suppress MixedMethodCall - */ - public static function contextToString(SplFixedArray $ctx) - { - $str = ''; - /** @var array $ctxA */ - $ctxA = $ctx[0]->toArray(); - - # uint64_t h[8]; - for ($i = 0; $i < 8; ++$i) { - if (!($ctxA[$i] instanceof ParagonIE_Sodium_Core32_Int64)) { - throw new TypeError('Not an instance of Int64'); - } - /** @var ParagonIE_Sodium_Core32_Int64 $ctxAi */ - $ctxAi = $ctxA[$i]; - $str .= $ctxAi->toReverseString(); - } - - # uint64_t t[2]; - # uint64_t f[2]; - for ($i = 1; $i < 3; ++$i) { - /** @var array $ctxA */ - $ctxA = $ctx[$i]->toArray(); - /** @var ParagonIE_Sodium_Core32_Int64 $ctxA1 */ - $ctxA1 = $ctxA[0]; - /** @var ParagonIE_Sodium_Core32_Int64 $ctxA2 */ - $ctxA2 = $ctxA[1]; - - $str .= $ctxA1->toReverseString(); - $str .= $ctxA2->toReverseString(); - } - - # uint8_t buf[2 * 128]; - $str .= self::SplFixedArrayToString($ctx[3]); - - /** @var int $ctx4 */ - $ctx4 = $ctx[4]; - - # size_t buflen; - $str .= implode('', array( - self::intToChr($ctx4 & 0xff), - self::intToChr(($ctx4 >> 8) & 0xff), - self::intToChr(($ctx4 >> 16) & 0xff), - self::intToChr(($ctx4 >> 24) & 0xff), - "\x00\x00\x00\x00" - /* - self::intToChr(($ctx4 >> 32) & 0xff), - self::intToChr(($ctx4 >> 40) & 0xff), - self::intToChr(($ctx4 >> 48) & 0xff), - self::intToChr(($ctx4 >> 56) & 0xff) - */ - )); - # uint8_t last_node; - return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); - } - - /** - * Creates an SplFixedArray containing other SplFixedArray elements, from - * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) - * - * @internal You should not use this directly from another application - * - * @param string $string - * @return SplFixedArray - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayAssignment - */ - public static function stringToContext($string) - { - $ctx = self::context(); - - # uint64_t h[8]; - for ($i = 0; $i < 8; ++$i) { - $ctx[0][$i] = ParagonIE_Sodium_Core32_Int64::fromReverseString( - self::substr($string, (($i << 3) + 0), 8) - ); - } - - # uint64_t t[2]; - # uint64_t f[2]; - for ($i = 1; $i < 3; ++$i) { - $ctx[$i][1] = ParagonIE_Sodium_Core32_Int64::fromReverseString( - self::substr($string, 72 + (($i - 1) << 4), 8) - ); - $ctx[$i][0] = ParagonIE_Sodium_Core32_Int64::fromReverseString( - self::substr($string, 64 + (($i - 1) << 4), 8) - ); - } - - # uint8_t buf[2 * 128]; - $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); - - # uint8_t buf[2 * 128]; - $int = 0; - for ($i = 0; $i < 8; ++$i) { - $int |= self::chrToInt($string[352 + $i]) << ($i << 3); - } - $ctx[4] = $int; - - return $ctx; - } -} diff --git a/libs/sodium_compat/src/Core32/ChaCha20.php b/libs/sodium_compat/src/Core32/ChaCha20.php deleted file mode 100644 index 6f8c0bf..0000000 --- a/libs/sodium_compat/src/Core32/ChaCha20.php +++ /dev/null @@ -1,400 +0,0 @@ - - * @throws SodiumException - * @throws TypeError - */ - protected static function quarterRound( - ParagonIE_Sodium_Core32_Int32 $a, - ParagonIE_Sodium_Core32_Int32 $b, - ParagonIE_Sodium_Core32_Int32 $c, - ParagonIE_Sodium_Core32_Int32 $d - ) { - /** @var ParagonIE_Sodium_Core32_Int32 $a */ - /** @var ParagonIE_Sodium_Core32_Int32 $b */ - /** @var ParagonIE_Sodium_Core32_Int32 $c */ - /** @var ParagonIE_Sodium_Core32_Int32 $d */ - - # a = PLUS(a,b); d = ROTATE(XOR(d,a),16); - $a = $a->addInt32($b); - $d = $d->xorInt32($a)->rotateLeft(16); - - # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); - $c = $c->addInt32($d); - $b = $b->xorInt32($c)->rotateLeft(12); - - # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); - $a = $a->addInt32($b); - $d = $d->xorInt32($a)->rotateLeft(8); - - # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); - $c = $c->addInt32($d); - $b = $b->xorInt32($c)->rotateLeft(7); - - return array($a, $b, $c, $d); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx - * @param string $message - * - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function encryptBytes( - ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx, - $message = '' - ) { - $bytes = self::strlen($message); - - /** @var ParagonIE_Sodium_Core32_Int32 $x0 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x1 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x2 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x3 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x4 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x5 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x6 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x7 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x8 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x9 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x10 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x11 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x12 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x13 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x14 */ - /** @var ParagonIE_Sodium_Core32_Int32 $x15 */ - - /* - j0 = ctx->input[0]; - j1 = ctx->input[1]; - j2 = ctx->input[2]; - j3 = ctx->input[3]; - j4 = ctx->input[4]; - j5 = ctx->input[5]; - j6 = ctx->input[6]; - j7 = ctx->input[7]; - j8 = ctx->input[8]; - j9 = ctx->input[9]; - j10 = ctx->input[10]; - j11 = ctx->input[11]; - j12 = ctx->input[12]; - j13 = ctx->input[13]; - j14 = ctx->input[14]; - j15 = ctx->input[15]; - */ - /** @var ParagonIE_Sodium_Core32_Int32 $j0 */ - $j0 = $ctx[0]; - /** @var ParagonIE_Sodium_Core32_Int32 $j1 */ - $j1 = $ctx[1]; - /** @var ParagonIE_Sodium_Core32_Int32 $j2 */ - $j2 = $ctx[2]; - /** @var ParagonIE_Sodium_Core32_Int32 $j3 */ - $j3 = $ctx[3]; - /** @var ParagonIE_Sodium_Core32_Int32 $j4 */ - $j4 = $ctx[4]; - /** @var ParagonIE_Sodium_Core32_Int32 $j5 */ - $j5 = $ctx[5]; - /** @var ParagonIE_Sodium_Core32_Int32 $j6 */ - $j6 = $ctx[6]; - /** @var ParagonIE_Sodium_Core32_Int32 $j7 */ - $j7 = $ctx[7]; - /** @var ParagonIE_Sodium_Core32_Int32 $j8 */ - $j8 = $ctx[8]; - /** @var ParagonIE_Sodium_Core32_Int32 $j9 */ - $j9 = $ctx[9]; - /** @var ParagonIE_Sodium_Core32_Int32 $j10 */ - $j10 = $ctx[10]; - /** @var ParagonIE_Sodium_Core32_Int32 $j11 */ - $j11 = $ctx[11]; - /** @var ParagonIE_Sodium_Core32_Int32 $j12 */ - $j12 = $ctx[12]; - /** @var ParagonIE_Sodium_Core32_Int32 $j13 */ - $j13 = $ctx[13]; - /** @var ParagonIE_Sodium_Core32_Int32 $j14 */ - $j14 = $ctx[14]; - /** @var ParagonIE_Sodium_Core32_Int32 $j15 */ - $j15 = $ctx[15]; - - $c = ''; - for (;;) { - if ($bytes < 64) { - $message .= str_repeat("\x00", 64 - $bytes); - } - - $x0 = clone $j0; - $x1 = clone $j1; - $x2 = clone $j2; - $x3 = clone $j3; - $x4 = clone $j4; - $x5 = clone $j5; - $x6 = clone $j6; - $x7 = clone $j7; - $x8 = clone $j8; - $x9 = clone $j9; - $x10 = clone $j10; - $x11 = clone $j11; - $x12 = clone $j12; - $x13 = clone $j13; - $x14 = clone $j14; - $x15 = clone $j15; - - # for (i = 20; i > 0; i -= 2) { - for ($i = 20; $i > 0; $i -= 2) { - # QUARTERROUND( x0, x4, x8, x12) - list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12); - - # QUARTERROUND( x1, x5, x9, x13) - list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13); - - # QUARTERROUND( x2, x6, x10, x14) - list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14); - - # QUARTERROUND( x3, x7, x11, x15) - list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15); - - # QUARTERROUND( x0, x5, x10, x15) - list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15); - - # QUARTERROUND( x1, x6, x11, x12) - list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12); - - # QUARTERROUND( x2, x7, x8, x13) - list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13); - - # QUARTERROUND( x3, x4, x9, x14) - list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14); - } - /* - x0 = PLUS(x0, j0); - x1 = PLUS(x1, j1); - x2 = PLUS(x2, j2); - x3 = PLUS(x3, j3); - x4 = PLUS(x4, j4); - x5 = PLUS(x5, j5); - x6 = PLUS(x6, j6); - x7 = PLUS(x7, j7); - x8 = PLUS(x8, j8); - x9 = PLUS(x9, j9); - x10 = PLUS(x10, j10); - x11 = PLUS(x11, j11); - x12 = PLUS(x12, j12); - x13 = PLUS(x13, j13); - x14 = PLUS(x14, j14); - x15 = PLUS(x15, j15); - */ - $x0 = $x0->addInt32($j0); - $x1 = $x1->addInt32($j1); - $x2 = $x2->addInt32($j2); - $x3 = $x3->addInt32($j3); - $x4 = $x4->addInt32($j4); - $x5 = $x5->addInt32($j5); - $x6 = $x6->addInt32($j6); - $x7 = $x7->addInt32($j7); - $x8 = $x8->addInt32($j8); - $x9 = $x9->addInt32($j9); - $x10 = $x10->addInt32($j10); - $x11 = $x11->addInt32($j11); - $x12 = $x12->addInt32($j12); - $x13 = $x13->addInt32($j13); - $x14 = $x14->addInt32($j14); - $x15 = $x15->addInt32($j15); - - /* - x0 = XOR(x0, LOAD32_LE(m + 0)); - x1 = XOR(x1, LOAD32_LE(m + 4)); - x2 = XOR(x2, LOAD32_LE(m + 8)); - x3 = XOR(x3, LOAD32_LE(m + 12)); - x4 = XOR(x4, LOAD32_LE(m + 16)); - x5 = XOR(x5, LOAD32_LE(m + 20)); - x6 = XOR(x6, LOAD32_LE(m + 24)); - x7 = XOR(x7, LOAD32_LE(m + 28)); - x8 = XOR(x8, LOAD32_LE(m + 32)); - x9 = XOR(x9, LOAD32_LE(m + 36)); - x10 = XOR(x10, LOAD32_LE(m + 40)); - x11 = XOR(x11, LOAD32_LE(m + 44)); - x12 = XOR(x12, LOAD32_LE(m + 48)); - x13 = XOR(x13, LOAD32_LE(m + 52)); - x14 = XOR(x14, LOAD32_LE(m + 56)); - x15 = XOR(x15, LOAD32_LE(m + 60)); - */ - $x0 = $x0->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4))); - $x1 = $x1->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 4, 4))); - $x2 = $x2->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 8, 4))); - $x3 = $x3->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4))); - $x4 = $x4->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 16, 4))); - $x5 = $x5->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 20, 4))); - $x6 = $x6->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 24, 4))); - $x7 = $x7->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 28, 4))); - $x8 = $x8->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 32, 4))); - $x9 = $x9->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 36, 4))); - $x10 = $x10->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 40, 4))); - $x11 = $x11->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 44, 4))); - $x12 = $x12->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 48, 4))); - $x13 = $x13->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 52, 4))); - $x14 = $x14->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 56, 4))); - $x15 = $x15->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 60, 4))); - - /* - j12 = PLUSONE(j12); - if (!j12) { - j13 = PLUSONE(j13); - } - */ - /** @var ParagonIE_Sodium_Core32_Int32 $j12 */ - $j12 = $j12->addInt(1); - if ($j12->limbs[0] === 0 && $j12->limbs[1] === 0) { - $j13 = $j13->addInt(1); - } - - /* - STORE32_LE(c + 0, x0); - STORE32_LE(c + 4, x1); - STORE32_LE(c + 8, x2); - STORE32_LE(c + 12, x3); - STORE32_LE(c + 16, x4); - STORE32_LE(c + 20, x5); - STORE32_LE(c + 24, x6); - STORE32_LE(c + 28, x7); - STORE32_LE(c + 32, x8); - STORE32_LE(c + 36, x9); - STORE32_LE(c + 40, x10); - STORE32_LE(c + 44, x11); - STORE32_LE(c + 48, x12); - STORE32_LE(c + 52, x13); - STORE32_LE(c + 56, x14); - STORE32_LE(c + 60, x15); - */ - - $block = $x0->toReverseString() . - $x1->toReverseString() . - $x2->toReverseString() . - $x3->toReverseString() . - $x4->toReverseString() . - $x5->toReverseString() . - $x6->toReverseString() . - $x7->toReverseString() . - $x8->toReverseString() . - $x9->toReverseString() . - $x10->toReverseString() . - $x11->toReverseString() . - $x12->toReverseString() . - $x13->toReverseString() . - $x14->toReverseString() . - $x15->toReverseString(); - - /* Partial block */ - if ($bytes < 64) { - $c .= self::substr($block, 0, $bytes); - break; - } - - /* Full block */ - $c .= $block; - $bytes -= 64; - if ($bytes <= 0) { - break; - } - $message = self::substr($message, 64); - } - /* end for(;;) loop */ - - $ctx[12] = $j12; - $ctx[13] = $j13; - return $c; - } - - /** - * @internal You should not use this directly from another application - * - * @param int $len - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function stream($len = 64, $nonce = '', $key = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce), - str_repeat("\x00", $len) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $len - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ietfStream($len, $nonce = '', $key = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce), - str_repeat("\x00", $len) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $nonce - * @param string $key - * @param string $ic - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce, $ic), - $message - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $nonce - * @param string $key - * @param string $ic - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function streamXorIc($message, $nonce = '', $key = '', $ic = '') - { - return self::encryptBytes( - new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce, $ic), - $message - ); - } -} diff --git a/libs/sodium_compat/src/Core32/ChaCha20/Ctx.php b/libs/sodium_compat/src/Core32/ChaCha20/Ctx.php deleted file mode 100644 index 3f47d03..0000000 --- a/libs/sodium_compat/src/Core32/ChaCha20/Ctx.php +++ /dev/null @@ -1,126 +0,0 @@ - - */ - protected $container; - - /** - * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. - * - * @internal You should not use this directly from another application - * - * @param string $key ChaCha20 key. - * @param string $iv Initialization Vector (a.k.a. nonce). - * @param string $counter The initial counter value. - * Defaults to 8 0x00 bytes. - * @throws InvalidArgumentException - * @throws SodiumException - * @throws TypeError - */ - public function __construct($key = '', $iv = '', $counter = '') - { - if (self::strlen($key) !== 32) { - throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); - } - if (self::strlen($iv) !== 8) { - throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); - } - $this->container = new SplFixedArray(16); - - /* "expand 32-byte k" as per ChaCha20 spec */ - $this->container[0] = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865)); - $this->container[1] = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e)); - $this->container[2] = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32)); - $this->container[3] = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574)); - - $this->container[4] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4)); - $this->container[5] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 4, 4)); - $this->container[6] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 8, 4)); - $this->container[7] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4)); - $this->container[8] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4)); - $this->container[9] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4)); - $this->container[10] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4)); - $this->container[11] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4)); - - if (empty($counter)) { - $this->container[12] = new ParagonIE_Sodium_Core32_Int32(); - $this->container[13] = new ParagonIE_Sodium_Core32_Int32(); - } else { - $this->container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4)); - $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 4, 4)); - } - $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4)); - $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4)); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @param int|ParagonIE_Sodium_Core32_Int32 $value - * @return void - */ - public function offsetSet($offset, $value) - { - if (!is_int($offset)) { - throw new InvalidArgumentException('Expected an integer'); - } - if ($value instanceof ParagonIE_Sodium_Core32_Int32) { - /* - } elseif (is_int($value)) { - $value = ParagonIE_Sodium_Core32_Int32::fromInt($value); - */ - } else { - throw new InvalidArgumentException('Expected an integer'); - } - $this->container[$offset] = $value; - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return bool - * @psalm-suppress MixedArrayOffset - */ - public function offsetExists($offset) - { - return isset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return void - * @psalm-suppress MixedArrayOffset - */ - public function offsetUnset($offset) - { - unset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $offset - * @return mixed|null - * @psalm-suppress MixedArrayOffset - */ - public function offsetGet($offset) - { - return isset($this->container[$offset]) - ? $this->container[$offset] - : null; - } -} diff --git a/libs/sodium_compat/src/Core32/ChaCha20/IetfCtx.php b/libs/sodium_compat/src/Core32/ChaCha20/IetfCtx.php deleted file mode 100644 index eea08de..0000000 --- a/libs/sodium_compat/src/Core32/ChaCha20/IetfCtx.php +++ /dev/null @@ -1,39 +0,0 @@ -container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4)); - } - $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4)); - $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4)); - $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 8, 4)); - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519.php b/libs/sodium_compat/src/Core32/Curve25519.php deleted file mode 100644 index d6d700e..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519.php +++ /dev/null @@ -1,3196 +0,0 @@ -addInt32($g[$i]); - } - /** @var array $arr */ - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($arr); - } - - /** - * Constant-time conditional move. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g - * @param int $b - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedMethodCall - */ - public static function fe_cmov( - ParagonIE_Sodium_Core32_Curve25519_Fe $f, - ParagonIE_Sodium_Core32_Curve25519_Fe $g, - $b = 0 - ) { - /** @var array $h */ - $h = array(); - for ($i = 0; $i < 10; ++$i) { - if (!($f[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { - throw new TypeError('Expected Int32'); - } - if (!($g[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { - throw new TypeError('Expected Int32'); - } - $h[$i] = $f[$i]->xorInt32( - $f[$i]->xorInt32($g[$i])->mask($b) - ); - } - /** @var array $h */ - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h); - } - - /** - * Create a copy of a field element. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - */ - public static function fe_copy(ParagonIE_Sodium_Core32_Curve25519_Fe $f) - { - $h = clone $f; - return $h; - } - - /** - * Give: 32-byte string. - * Receive: A field element object to use for internal calculations. - * - * @internal You should not use this directly from another application - * - * @param string $s - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws RangeException - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedMethodCall - */ - public static function fe_frombytes($s) - { - if (self::strlen($s) !== 32) { - throw new RangeException('Expected a 32-byte string.'); - } - /** @var ParagonIE_Sodium_Core32_Int32 $h0 */ - $h0 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_4($s) - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h1 */ - $h1 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_3(self::substr($s, 4, 3)) << 6 - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h2 */ - $h2 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_3(self::substr($s, 7, 3)) << 5 - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h3 */ - $h3 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_3(self::substr($s, 10, 3)) << 3 - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h4 */ - $h4 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_3(self::substr($s, 13, 3)) << 2 - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h5 */ - $h5 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_4(self::substr($s, 16, 4)) - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h6 */ - $h6 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_3(self::substr($s, 20, 3)) << 7 - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h7 */ - $h7 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_3(self::substr($s, 23, 3)) << 5 - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h8 */ - $h8 = ParagonIE_Sodium_Core32_Int32::fromInt( - self::load_3(self::substr($s, 26, 3)) << 4 - ); - /** @var ParagonIE_Sodium_Core32_Int32 $h9 */ - $h9 = ParagonIE_Sodium_Core32_Int32::fromInt( - (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2 - ); - - $carry9 = $h9->addInt(1 << 24)->shiftRight(25); - $h0 = $h0->addInt32($carry9->mulInt(19, 5)); - $h9 = $h9->subInt32($carry9->shiftLeft(25)); - - $carry1 = $h1->addInt(1 << 24)->shiftRight(25); - $h2 = $h2->addInt32($carry1); - $h1 = $h1->subInt32($carry1->shiftLeft(25)); - - $carry3 = $h3->addInt(1 << 24)->shiftRight(25); - $h4 = $h4->addInt32($carry3); - $h3 = $h3->subInt32($carry3->shiftLeft(25)); - - $carry5 = $h5->addInt(1 << 24)->shiftRight(25); - $h6 = $h6->addInt32($carry5); - $h5 = $h5->subInt32($carry5->shiftLeft(25)); - - $carry7 = $h7->addInt(1 << 24)->shiftRight(25); - $h8 = $h8->addInt32($carry7); - $h7 = $h7->subInt32($carry7->shiftLeft(25)); - - $carry0 = $h0->addInt(1 << 25)->shiftRight(26); - $h1 = $h1->addInt32($carry0); - $h0 = $h0->subInt32($carry0->shiftLeft(26)); - - $carry2 = $h2->addInt(1 << 25)->shiftRight(26); - $h3 = $h3->addInt32($carry2); - $h2 = $h2->subInt32($carry2->shiftLeft(26)); - - $carry4 = $h4->addInt(1 << 25)->shiftRight(26); - $h5 = $h5->addInt32($carry4); - $h4 = $h4->subInt32($carry4->shiftLeft(26)); - - $carry6 = $h6->addInt(1 << 25)->shiftRight(26); - $h7 = $h7->addInt32($carry6); - $h6 = $h6->subInt32($carry6->shiftLeft(26)); - - $carry8 = $h8->addInt(1 << 25)->shiftRight(26); - $h9 = $h9->addInt32($carry8); - $h8 = $h8->subInt32($carry8->shiftLeft(26)); - - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array($h0, $h1, $h2,$h3, $h4, $h5, $h6, $h7, $h8, $h9) - ); - } - - /** - * Convert a field element to a byte string. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $h - * @return string - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedMethodCall - */ - public static function fe_tobytes(ParagonIE_Sodium_Core32_Curve25519_Fe $h) - { - /** - * @var ParagonIE_Sodium_Core32_Int64[] $f - * @var ParagonIE_Sodium_Core32_Int64 $q - */ - $f = array(); - - for ($i = 0; $i < 10; ++$i) { - $f[$i] = $h[$i]->toInt64(); - } - - $q = $f[9]->mulInt(19, 5)->addInt(1 << 14)->shiftRight(25) - ->addInt64($f[0])->shiftRight(26) - ->addInt64($f[1])->shiftRight(25) - ->addInt64($f[2])->shiftRight(26) - ->addInt64($f[3])->shiftRight(25) - ->addInt64($f[4])->shiftRight(26) - ->addInt64($f[5])->shiftRight(25) - ->addInt64($f[6])->shiftRight(26) - ->addInt64($f[7])->shiftRight(25) - ->addInt64($f[8])->shiftRight(26) - ->addInt64($f[9])->shiftRight(25); - - $f[0] = $f[0]->addInt64($q->mulInt(19, 5)); - - $carry0 = $f[0]->shiftRight(26); - $f[1] = $f[1]->addInt64($carry0); - $f[0] = $f[0]->subInt64($carry0->shiftLeft(26)); - - $carry1 = $f[1]->shiftRight(25); - $f[2] = $f[2]->addInt64($carry1); - $f[1] = $f[1]->subInt64($carry1->shiftLeft(25)); - - $carry2 = $f[2]->shiftRight(26); - $f[3] = $f[3]->addInt64($carry2); - $f[2] = $f[2]->subInt64($carry2->shiftLeft(26)); - - $carry3 = $f[3]->shiftRight(25); - $f[4] = $f[4]->addInt64($carry3); - $f[3] = $f[3]->subInt64($carry3->shiftLeft(25)); - - $carry4 = $f[4]->shiftRight(26); - $f[5] = $f[5]->addInt64($carry4); - $f[4] = $f[4]->subInt64($carry4->shiftLeft(26)); - - $carry5 = $f[5]->shiftRight(25); - $f[6] = $f[6]->addInt64($carry5); - $f[5] = $f[5]->subInt64($carry5->shiftLeft(25)); - - $carry6 = $f[6]->shiftRight(26); - $f[7] = $f[7]->addInt64($carry6); - $f[6] = $f[6]->subInt64($carry6->shiftLeft(26)); - - $carry7 = $f[7]->shiftRight(25); - $f[8] = $f[8]->addInt64($carry7); - $f[7] = $f[7]->subInt64($carry7->shiftLeft(25)); - - $carry8 = $f[8]->shiftRight(26); - $f[9] = $f[9]->addInt64($carry8); - $f[8] = $f[8]->subInt64($carry8->shiftLeft(26)); - - $carry9 = $f[9]->shiftRight(25); - $f[9] = $f[9]->subInt64($carry9->shiftLeft(25)); - - /** @var int $h0 */ - $h0 = $f[0]->toInt32()->toInt(); - /** @var int $h1 */ - $h1 = $f[1]->toInt32()->toInt(); - /** @var int $h2 */ - $h2 = $f[2]->toInt32()->toInt(); - /** @var int $h3 */ - $h3 = $f[3]->toInt32()->toInt(); - /** @var int $h4 */ - $h4 = $f[4]->toInt32()->toInt(); - /** @var int $h5 */ - $h5 = $f[5]->toInt32()->toInt(); - /** @var int $h6 */ - $h6 = $f[6]->toInt32()->toInt(); - /** @var int $h7 */ - $h7 = $f[7]->toInt32()->toInt(); - /** @var int $h8 */ - $h8 = $f[8]->toInt32()->toInt(); - /** @var int $h9 */ - $h9 = $f[9]->toInt32()->toInt(); - - /** - * @var array - */ - $s = array( - (int) (($h0 >> 0) & 0xff), - (int) (($h0 >> 8) & 0xff), - (int) (($h0 >> 16) & 0xff), - (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff), - (int) (($h1 >> 6) & 0xff), - (int) (($h1 >> 14) & 0xff), - (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff), - (int) (($h2 >> 5) & 0xff), - (int) (($h2 >> 13) & 0xff), - (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff), - (int) (($h3 >> 3) & 0xff), - (int) (($h3 >> 11) & 0xff), - (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff), - (int) (($h4 >> 2) & 0xff), - (int) (($h4 >> 10) & 0xff), - (int) (($h4 >> 18) & 0xff), - (int) (($h5 >> 0) & 0xff), - (int) (($h5 >> 8) & 0xff), - (int) (($h5 >> 16) & 0xff), - (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff), - (int) (($h6 >> 7) & 0xff), - (int) (($h6 >> 15) & 0xff), - (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff), - (int) (($h7 >> 5) & 0xff), - (int) (($h7 >> 13) & 0xff), - (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff), - (int) (($h8 >> 4) & 0xff), - (int) (($h8 >> 12) & 0xff), - (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff), - (int) (($h9 >> 2) & 0xff), - (int) (($h9 >> 10) & 0xff), - (int) (($h9 >> 18) & 0xff) - ); - return self::intArrayToString($s); - } - - /** - * Is a field element negative? (1 = yes, 0 = no. Used in calculations.) - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @return int - * @throws SodiumException - * @throws TypeError - */ - public static function fe_isnegative(ParagonIE_Sodium_Core32_Curve25519_Fe $f) - { - $str = self::fe_tobytes($f); - return (int) (self::chrToInt($str[0]) & 1); - } - - /** - * Returns 0 if this field element results in all NUL bytes. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function fe_isnonzero(ParagonIE_Sodium_Core32_Curve25519_Fe $f) - { - static $zero; - if ($zero === null) { - $zero = str_repeat("\x00", 32); - } - /** @var string $str */ - $str = self::fe_tobytes($f); - /** @var string $zero */ - return !self::verify_32($str, $zero); - } - - /** - * Multiply two field elements - * - * h = f * g - * - * @internal You should not use this directly from another application - * - * @security Is multiplication a source of timing leaks? If so, can we do - * anything to prevent that from happening? - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - */ - public static function fe_mul( - ParagonIE_Sodium_Core32_Curve25519_Fe $f, - ParagonIE_Sodium_Core32_Curve25519_Fe $g - ) { - /** - * @var ParagonIE_Sodium_Core32_Int32[] $f - * @var ParagonIE_Sodium_Core32_Int32[] $g - * @var ParagonIE_Sodium_Core32_Int64 $f0 - * @var ParagonIE_Sodium_Core32_Int64 $f1 - * @var ParagonIE_Sodium_Core32_Int64 $f2 - * @var ParagonIE_Sodium_Core32_Int64 $f3 - * @var ParagonIE_Sodium_Core32_Int64 $f4 - * @var ParagonIE_Sodium_Core32_Int64 $f5 - * @var ParagonIE_Sodium_Core32_Int64 $f6 - * @var ParagonIE_Sodium_Core32_Int64 $f7 - * @var ParagonIE_Sodium_Core32_Int64 $f8 - * @var ParagonIE_Sodium_Core32_Int64 $f9 - * @var ParagonIE_Sodium_Core32_Int64 $g0 - * @var ParagonIE_Sodium_Core32_Int64 $g1 - * @var ParagonIE_Sodium_Core32_Int64 $g2 - * @var ParagonIE_Sodium_Core32_Int64 $g3 - * @var ParagonIE_Sodium_Core32_Int64 $g4 - * @var ParagonIE_Sodium_Core32_Int64 $g5 - * @var ParagonIE_Sodium_Core32_Int64 $g6 - * @var ParagonIE_Sodium_Core32_Int64 $g7 - * @var ParagonIE_Sodium_Core32_Int64 $g8 - * @var ParagonIE_Sodium_Core32_Int64 $g9 - */ - $f0 = $f[0]->toInt64(); - $f1 = $f[1]->toInt64(); - $f2 = $f[2]->toInt64(); - $f3 = $f[3]->toInt64(); - $f4 = $f[4]->toInt64(); - $f5 = $f[5]->toInt64(); - $f6 = $f[6]->toInt64(); - $f7 = $f[7]->toInt64(); - $f8 = $f[8]->toInt64(); - $f9 = $f[9]->toInt64(); - $g0 = $g[0]->toInt64(); - $g1 = $g[1]->toInt64(); - $g2 = $g[2]->toInt64(); - $g3 = $g[3]->toInt64(); - $g4 = $g[4]->toInt64(); - $g5 = $g[5]->toInt64(); - $g6 = $g[6]->toInt64(); - $g7 = $g[7]->toInt64(); - $g8 = $g[8]->toInt64(); - $g9 = $g[9]->toInt64(); - $g1_19 = $g1->mulInt(19, 5); /* 2^4 <= 19 <= 2^5, but we only want 5 bits */ - $g2_19 = $g2->mulInt(19, 5); - $g3_19 = $g3->mulInt(19, 5); - $g4_19 = $g4->mulInt(19, 5); - $g5_19 = $g5->mulInt(19, 5); - $g6_19 = $g6->mulInt(19, 5); - $g7_19 = $g7->mulInt(19, 5); - $g8_19 = $g8->mulInt(19, 5); - $g9_19 = $g9->mulInt(19, 5); - /** @var ParagonIE_Sodium_Core32_Int64 $f1_2 */ - $f1_2 = $f1->shiftLeft(1); - /** @var ParagonIE_Sodium_Core32_Int64 $f3_2 */ - $f3_2 = $f3->shiftLeft(1); - /** @var ParagonIE_Sodium_Core32_Int64 $f5_2 */ - $f5_2 = $f5->shiftLeft(1); - /** @var ParagonIE_Sodium_Core32_Int64 $f7_2 */ - $f7_2 = $f7->shiftLeft(1); - /** @var ParagonIE_Sodium_Core32_Int64 $f9_2 */ - $f9_2 = $f9->shiftLeft(1); - $f0g0 = $f0->mulInt64($g0, 27); - $f0g1 = $f0->mulInt64($g1, 27); - $f0g2 = $f0->mulInt64($g2, 27); - $f0g3 = $f0->mulInt64($g3, 27); - $f0g4 = $f0->mulInt64($g4, 27); - $f0g5 = $f0->mulInt64($g5, 27); - $f0g6 = $f0->mulInt64($g6, 27); - $f0g7 = $f0->mulInt64($g7, 27); - $f0g8 = $f0->mulInt64($g8, 27); - $f0g9 = $f0->mulInt64($g9, 27); - $f1g0 = $f1->mulInt64($g0, 27); - $f1g1_2 = $f1_2->mulInt64($g1, 27); - $f1g2 = $f1->mulInt64($g2, 27); - $f1g3_2 = $f1_2->mulInt64($g3, 27); - $f1g4 = $f1->mulInt64($g4, 30); - $f1g5_2 = $f1_2->mulInt64($g5, 30); - $f1g6 = $f1->mulInt64($g6, 30); - $f1g7_2 = $f1_2->mulInt64($g7, 30); - $f1g8 = $f1->mulInt64($g8, 30); - $f1g9_38 = $g9_19->mulInt64($f1_2, 30); - $f2g0 = $f2->mulInt64($g0, 30); - $f2g1 = $f2->mulInt64($g1, 29); - $f2g2 = $f2->mulInt64($g2, 30); - $f2g3 = $f2->mulInt64($g3, 29); - $f2g4 = $f2->mulInt64($g4, 30); - $f2g5 = $f2->mulInt64($g5, 29); - $f2g6 = $f2->mulInt64($g6, 30); - $f2g7 = $f2->mulInt64($g7, 29); - $f2g8_19 = $g8_19->mulInt64($f2, 30); - $f2g9_19 = $g9_19->mulInt64($f2, 30); - $f3g0 = $f3->mulInt64($g0, 30); - $f3g1_2 = $f3_2->mulInt64($g1, 30); - $f3g2 = $f3->mulInt64($g2, 30); - $f3g3_2 = $f3_2->mulInt64($g3, 30); - $f3g4 = $f3->mulInt64($g4, 30); - $f3g5_2 = $f3_2->mulInt64($g5, 30); - $f3g6 = $f3->mulInt64($g6, 30); - $f3g7_38 = $g7_19->mulInt64($f3_2, 30); - $f3g8_19 = $g8_19->mulInt64($f3, 30); - $f3g9_38 = $g9_19->mulInt64($f3_2, 30); - $f4g0 = $f4->mulInt64($g0, 30); - $f4g1 = $f4->mulInt64($g1, 30); - $f4g2 = $f4->mulInt64($g2, 30); - $f4g3 = $f4->mulInt64($g3, 30); - $f4g4 = $f4->mulInt64($g4, 30); - $f4g5 = $f4->mulInt64($g5, 30); - $f4g6_19 = $g6_19->mulInt64($f4, 30); - $f4g7_19 = $g7_19->mulInt64($f4, 30); - $f4g8_19 = $g8_19->mulInt64($f4, 30); - $f4g9_19 = $g9_19->mulInt64($f4, 30); - $f5g0 = $f5->mulInt64($g0, 30); - $f5g1_2 = $f5_2->mulInt64($g1, 30); - $f5g2 = $f5->mulInt64($g2, 30); - $f5g3_2 = $f5_2->mulInt64($g3, 30); - $f5g4 = $f5->mulInt64($g4, 30); - $f5g5_38 = $g5_19->mulInt64($f5_2, 30); - $f5g6_19 = $g6_19->mulInt64($f5, 30); - $f5g7_38 = $g7_19->mulInt64($f5_2, 30); - $f5g8_19 = $g8_19->mulInt64($f5, 30); - $f5g9_38 = $g9_19->mulInt64($f5_2, 30); - $f6g0 = $f6->mulInt64($g0, 30); - $f6g1 = $f6->mulInt64($g1, 30); - $f6g2 = $f6->mulInt64($g2, 30); - $f6g3 = $f6->mulInt64($g3, 30); - $f6g4_19 = $g4_19->mulInt64($f6, 30); - $f6g5_19 = $g5_19->mulInt64($f6, 30); - $f6g6_19 = $g6_19->mulInt64($f6, 30); - $f6g7_19 = $g7_19->mulInt64($f6, 30); - $f6g8_19 = $g8_19->mulInt64($f6, 30); - $f6g9_19 = $g9_19->mulInt64($f6, 30); - $f7g0 = $f7->mulInt64($g0, 30); - $f7g1_2 = $g1->mulInt64($f7_2, 30); - $f7g2 = $f7->mulInt64($g2, 30); - $f7g3_38 = $g3_19->mulInt64($f7_2, 30); - $f7g4_19 = $g4_19->mulInt64($f7, 30); - $f7g5_38 = $g5_19->mulInt64($f7_2, 30); - $f7g6_19 = $g6_19->mulInt64($f7, 30); - $f7g7_38 = $g7_19->mulInt64($f7_2, 30); - $f7g8_19 = $g8_19->mulInt64($f7, 30); - $f7g9_38 = $g9_19->mulInt64($f7_2, 30); - $f8g0 = $f8->mulInt64($g0, 30); - $f8g1 = $f8->mulInt64($g1, 29); - $f8g2_19 = $g2_19->mulInt64($f8, 30); - $f8g3_19 = $g3_19->mulInt64($f8, 30); - $f8g4_19 = $g4_19->mulInt64($f8, 30); - $f8g5_19 = $g5_19->mulInt64($f8, 30); - $f8g6_19 = $g6_19->mulInt64($f8, 30); - $f8g7_19 = $g7_19->mulInt64($f8, 30); - $f8g8_19 = $g8_19->mulInt64($f8, 30); - $f8g9_19 = $g9_19->mulInt64($f8, 30); - $f9g0 = $f9->mulInt64($g0, 30); - $f9g1_38 = $g1_19->mulInt64($f9_2, 30); - $f9g2_19 = $g2_19->mulInt64($f9, 30); - $f9g3_38 = $g3_19->mulInt64($f9_2, 30); - $f9g4_19 = $g4_19->mulInt64($f9, 30); - $f9g5_38 = $g5_19->mulInt64($f9_2, 30); - $f9g6_19 = $g6_19->mulInt64($f9, 30); - $f9g7_38 = $g7_19->mulInt64($f9_2, 30); - $f9g8_19 = $g8_19->mulInt64($f9, 30); - $f9g9_38 = $g9_19->mulInt64($f9_2, 30); - - // $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38; - $h0 = $f0g0->addInt64($f1g9_38)->addInt64($f2g8_19)->addInt64($f3g7_38) - ->addInt64($f4g6_19)->addInt64($f5g5_38)->addInt64($f6g4_19) - ->addInt64($f7g3_38)->addInt64($f8g2_19)->addInt64($f9g1_38); - - // $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19; - $h1 = $f0g1->addInt64($f1g0)->addInt64($f2g9_19)->addInt64($f3g8_19) - ->addInt64($f4g7_19)->addInt64($f5g6_19)->addInt64($f6g5_19) - ->addInt64($f7g4_19)->addInt64($f8g3_19)->addInt64($f9g2_19); - - // $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38; - $h2 = $f0g2->addInt64($f1g1_2)->addInt64($f2g0)->addInt64($f3g9_38) - ->addInt64($f4g8_19)->addInt64($f5g7_38)->addInt64($f6g6_19) - ->addInt64($f7g5_38)->addInt64($f8g4_19)->addInt64($f9g3_38); - - // $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19; - $h3 = $f0g3->addInt64($f1g2)->addInt64($f2g1)->addInt64($f3g0) - ->addInt64($f4g9_19)->addInt64($f5g8_19)->addInt64($f6g7_19) - ->addInt64($f7g6_19)->addInt64($f8g5_19)->addInt64($f9g4_19); - - // $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38; - $h4 = $f0g4->addInt64($f1g3_2)->addInt64($f2g2)->addInt64($f3g1_2) - ->addInt64($f4g0)->addInt64($f5g9_38)->addInt64($f6g8_19) - ->addInt64($f7g7_38)->addInt64($f8g6_19)->addInt64($f9g5_38); - - // $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19; - $h5 = $f0g5->addInt64($f1g4)->addInt64($f2g3)->addInt64($f3g2) - ->addInt64($f4g1)->addInt64($f5g0)->addInt64($f6g9_19) - ->addInt64($f7g8_19)->addInt64($f8g7_19)->addInt64($f9g6_19); - - // $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; - $h6 = $f0g6->addInt64($f1g5_2)->addInt64($f2g4)->addInt64($f3g3_2) - ->addInt64($f4g2)->addInt64($f5g1_2)->addInt64($f6g0) - ->addInt64($f7g9_38)->addInt64($f8g8_19)->addInt64($f9g7_38); - - // $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; - $h7 = $f0g7->addInt64($f1g6)->addInt64($f2g5)->addInt64($f3g4) - ->addInt64($f4g3)->addInt64($f5g2)->addInt64($f6g1) - ->addInt64($f7g0)->addInt64($f8g9_19)->addInt64($f9g8_19); - - // $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; - $h8 = $f0g8->addInt64($f1g7_2)->addInt64($f2g6)->addInt64($f3g5_2) - ->addInt64($f4g4)->addInt64($f5g3_2)->addInt64($f6g2) - ->addInt64($f7g1_2)->addInt64($f8g0)->addInt64($f9g9_38); - - // $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; - $h9 = $f0g9->addInt64($f1g8)->addInt64($f2g7)->addInt64($f3g6) - ->addInt64($f4g5)->addInt64($f5g4)->addInt64($f6g3) - ->addInt64($f7g2)->addInt64($f8g1)->addInt64($f9g0); - - /** - * @var ParagonIE_Sodium_Core32_Int64 $h0 - * @var ParagonIE_Sodium_Core32_Int64 $h1 - * @var ParagonIE_Sodium_Core32_Int64 $h2 - * @var ParagonIE_Sodium_Core32_Int64 $h3 - * @var ParagonIE_Sodium_Core32_Int64 $h4 - * @var ParagonIE_Sodium_Core32_Int64 $h5 - * @var ParagonIE_Sodium_Core32_Int64 $h6 - * @var ParagonIE_Sodium_Core32_Int64 $h7 - * @var ParagonIE_Sodium_Core32_Int64 $h8 - * @var ParagonIE_Sodium_Core32_Int64 $h9 - * @var ParagonIE_Sodium_Core32_Int64 $carry0 - * @var ParagonIE_Sodium_Core32_Int64 $carry1 - * @var ParagonIE_Sodium_Core32_Int64 $carry2 - * @var ParagonIE_Sodium_Core32_Int64 $carry3 - * @var ParagonIE_Sodium_Core32_Int64 $carry4 - * @var ParagonIE_Sodium_Core32_Int64 $carry5 - * @var ParagonIE_Sodium_Core32_Int64 $carry6 - * @var ParagonIE_Sodium_Core32_Int64 $carry7 - * @var ParagonIE_Sodium_Core32_Int64 $carry8 - * @var ParagonIE_Sodium_Core32_Int64 $carry9 - */ - $carry0 = $h0->addInt(1 << 25)->shiftRight(26); - $h1 = $h1->addInt64($carry0); - $h0 = $h0->subInt64($carry0->shiftLeft(26)); - $carry4 = $h4->addInt(1 << 25)->shiftRight(26); - $h5 = $h5->addInt64($carry4); - $h4 = $h4->subInt64($carry4->shiftLeft(26)); - - $carry1 = $h1->addInt(1 << 24)->shiftRight(25); - $h2 = $h2->addInt64($carry1); - $h1 = $h1->subInt64($carry1->shiftLeft(25)); - $carry5 = $h5->addInt(1 << 24)->shiftRight(25); - $h6 = $h6->addInt64($carry5); - $h5 = $h5->subInt64($carry5->shiftLeft(25)); - - $carry2 = $h2->addInt(1 << 25)->shiftRight(26); - $h3 = $h3->addInt64($carry2); - $h2 = $h2->subInt64($carry2->shiftLeft(26)); - $carry6 = $h6->addInt(1 << 25)->shiftRight(26); - $h7 = $h7->addInt64($carry6); - $h6 = $h6->subInt64($carry6->shiftLeft(26)); - - $carry3 = $h3->addInt(1 << 24)->shiftRight(25); - $h4 = $h4->addInt64($carry3); - $h3 = $h3->subInt64($carry3->shiftLeft(25)); - $carry7 = $h7->addInt(1 << 24)->shiftRight(25); - $h8 = $h8->addInt64($carry7); - $h7 = $h7->subInt64($carry7->shiftLeft(25)); - - $carry4 = $h4->addInt(1 << 25)->shiftRight(26); - $h5 = $h5->addInt64($carry4); - $h4 = $h4->subInt64($carry4->shiftLeft(26)); - $carry8 = $h8->addInt(1 << 25)->shiftRight(26); - $h9 = $h9->addInt64($carry8); - $h8 = $h8->subInt64($carry8->shiftLeft(26)); - - $carry9 = $h9->addInt(1 << 24)->shiftRight(25); - $h0 = $h0->addInt64($carry9->mulInt(19, 5)); - $h9 = $h9->subInt64($carry9->shiftLeft(25)); - - $carry0 = $h0->addInt(1 << 25)->shiftRight(26); - $h1 = $h1->addInt64($carry0); - $h0 = $h0->subInt64($carry0->shiftLeft(26)); - - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - $h0->toInt32(), - $h1->toInt32(), - $h2->toInt32(), - $h3->toInt32(), - $h4->toInt32(), - $h5->toInt32(), - $h6->toInt32(), - $h7->toInt32(), - $h8->toInt32(), - $h9->toInt32() - ) - ); - } - - /** - * Get the negative values for each piece of the field element. - * - * h = -f - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedMethodCall - */ - public static function fe_neg(ParagonIE_Sodium_Core32_Curve25519_Fe $f) - { - $h = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - for ($i = 0; $i < 10; ++$i) { - $h[$i] = $h[$i]->subInt32($f[$i]); - } - return $h; - } - - /** - * Square a field element - * - * h = f * f - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedMethodCall - */ - public static function fe_sq(ParagonIE_Sodium_Core32_Curve25519_Fe $f) - { - /** @var ParagonIE_Sodium_Core32_Int64 $f0 */ - $f0 = $f[0]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f1 */ - $f1 = $f[1]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f2 */ - $f2 = $f[2]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f3 */ - $f3 = $f[3]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f4 */ - $f4 = $f[4]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f5 */ - $f5 = $f[5]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f6 */ - $f6 = $f[6]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f7 */ - $f7 = $f[7]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f8 */ - $f8 = $f[8]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f9 */ - $f9 = $f[9]->toInt64(); - - /** @var ParagonIE_Sodium_Core32_Int64 $f0_2 */ - $f0_2 = $f0->shiftLeft(1); - $f1_2 = $f1->shiftLeft(1); - $f2_2 = $f2->shiftLeft(1); - $f3_2 = $f3->shiftLeft(1); - $f4_2 = $f4->shiftLeft(1); - $f5_2 = $f5->shiftLeft(1); - $f6_2 = $f6->shiftLeft(1); - $f7_2 = $f7->shiftLeft(1); - $f5_38 = $f5->mulInt(38, 6); - $f6_19 = $f6->mulInt(19, 5); - $f7_38 = $f7->mulInt(38, 6); - $f8_19 = $f8->mulInt(19, 5); - $f9_38 = $f9->mulInt(38, 6); - /** @var ParagonIE_Sodium_Core32_Int64 $f0f0*/ - $f0f0 = $f0->mulInt64($f0, 28); - $f0f1_2 = $f0_2->mulInt64($f1, 28); - $f0f2_2 = $f0_2->mulInt64($f2, 28); - $f0f3_2 = $f0_2->mulInt64($f3, 28); - $f0f4_2 = $f0_2->mulInt64($f4, 28); - $f0f5_2 = $f0_2->mulInt64($f5, 28); - $f0f6_2 = $f0_2->mulInt64($f6, 28); - $f0f7_2 = $f0_2->mulInt64($f7, 28); - $f0f8_2 = $f0_2->mulInt64($f8, 28); - $f0f9_2 = $f0_2->mulInt64($f9, 28); - - $f1f1_2 = $f1_2->mulInt64($f1, 28); - $f1f2_2 = $f1_2->mulInt64($f2, 28); - $f1f3_4 = $f1_2->mulInt64($f3_2, 28); - $f1f4_2 = $f1_2->mulInt64($f4, 28); - $f1f5_4 = $f1_2->mulInt64($f5_2, 30); - $f1f6_2 = $f1_2->mulInt64($f6, 28); - $f1f7_4 = $f1_2->mulInt64($f7_2, 28); - $f1f8_2 = $f1_2->mulInt64($f8, 28); - $f1f9_76 = $f9_38->mulInt64($f1_2, 30); - - $f2f2 = $f2->mulInt64($f2, 28); - $f2f3_2 = $f2_2->mulInt64($f3, 28); - $f2f4_2 = $f2_2->mulInt64($f4, 28); - $f2f5_2 = $f2_2->mulInt64($f5, 28); - $f2f6_2 = $f2_2->mulInt64($f6, 28); - $f2f7_2 = $f2_2->mulInt64($f7, 28); - $f2f8_38 = $f8_19->mulInt64($f2_2, 30); - $f2f9_38 = $f9_38->mulInt64($f2, 30); - - $f3f3_2 = $f3_2->mulInt64($f3, 28); - $f3f4_2 = $f3_2->mulInt64($f4, 28); - $f3f5_4 = $f3_2->mulInt64($f5_2, 30); - $f3f6_2 = $f3_2->mulInt64($f6, 28); - $f3f7_76 = $f7_38->mulInt64($f3_2, 30); - $f3f8_38 = $f8_19->mulInt64($f3_2, 30); - $f3f9_76 = $f9_38->mulInt64($f3_2, 30); - - $f4f4 = $f4->mulInt64($f4, 28); - $f4f5_2 = $f4_2->mulInt64($f5, 28); - $f4f6_38 = $f6_19->mulInt64($f4_2, 30); - $f4f7_38 = $f7_38->mulInt64($f4, 30); - $f4f8_38 = $f8_19->mulInt64($f4_2, 30); - $f4f9_38 = $f9_38->mulInt64($f4, 30); - - $f5f5_38 = $f5_38->mulInt64($f5, 30); - $f5f6_38 = $f6_19->mulInt64($f5_2, 30); - $f5f7_76 = $f7_38->mulInt64($f5_2, 30); - $f5f8_38 = $f8_19->mulInt64($f5_2, 30); - $f5f9_76 = $f9_38->mulInt64($f5_2, 30); - - $f6f6_19 = $f6_19->mulInt64($f6, 30); - $f6f7_38 = $f7_38->mulInt64($f6, 30); - $f6f8_38 = $f8_19->mulInt64($f6_2, 30); - $f6f9_38 = $f9_38->mulInt64($f6, 30); - - $f7f7_38 = $f7_38->mulInt64($f7, 28); - $f7f8_38 = $f8_19->mulInt64($f7_2, 30); - $f7f9_76 = $f9_38->mulInt64($f7_2, 30); - - $f8f8_19 = $f8_19->mulInt64($f8, 30); - $f8f9_38 = $f9_38->mulInt64($f8, 30); - - $f9f9_38 = $f9_38->mulInt64($f9, 28); - - $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38); - $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38); - $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19); - $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38); - $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38); - $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38); - $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19); - $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38); - $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38); - $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2); - - /** - * @var ParagonIE_Sodium_Core32_Int64 $h0 - * @var ParagonIE_Sodium_Core32_Int64 $h1 - * @var ParagonIE_Sodium_Core32_Int64 $h2 - * @var ParagonIE_Sodium_Core32_Int64 $h3 - * @var ParagonIE_Sodium_Core32_Int64 $h4 - * @var ParagonIE_Sodium_Core32_Int64 $h5 - * @var ParagonIE_Sodium_Core32_Int64 $h6 - * @var ParagonIE_Sodium_Core32_Int64 $h7 - * @var ParagonIE_Sodium_Core32_Int64 $h8 - * @var ParagonIE_Sodium_Core32_Int64 $h9 - */ - - $carry0 = $h0->addInt(1 << 25)->shiftRight(26); - $h1 = $h1->addInt64($carry0); - $h0 = $h0->subInt64($carry0->shiftLeft(26)); - - $carry4 = $h4->addInt(1 << 25)->shiftRight(26); - $h5 = $h5->addInt64($carry4); - $h4 = $h4->subInt64($carry4->shiftLeft(26)); - - $carry1 = $h1->addInt(1 << 24)->shiftRight(25); - $h2 = $h2->addInt64($carry1); - $h1 = $h1->subInt64($carry1->shiftLeft(25)); - - $carry5 = $h5->addInt(1 << 24)->shiftRight(25); - $h6 = $h6->addInt64($carry5); - $h5 = $h5->subInt64($carry5->shiftLeft(25)); - - $carry2 = $h2->addInt(1 << 25)->shiftRight(26); - $h3 = $h3->addInt64($carry2); - $h2 = $h2->subInt64($carry2->shiftLeft(26)); - - $carry6 = $h6->addInt(1 << 25)->shiftRight(26); - $h7 = $h7->addInt64($carry6); - $h6 = $h6->subInt64($carry6->shiftLeft(26)); - - $carry3 = $h3->addInt(1 << 24)->shiftRight(25); - $h4 = $h4->addInt64($carry3); - $h3 = $h3->subInt64($carry3->shiftLeft(25)); - - $carry7 = $h7->addInt(1 << 24)->shiftRight(25); - $h8 = $h8->addInt64($carry7); - $h7 = $h7->subInt64($carry7->shiftLeft(25)); - - $carry4 = $h4->addInt(1 << 25)->shiftRight(26); - $h5 = $h5->addInt64($carry4); - $h4 = $h4->subInt64($carry4->shiftLeft(26)); - - $carry8 = $h8->addInt(1 << 25)->shiftRight(26); - $h9 = $h9->addInt64($carry8); - $h8 = $h8->subInt64($carry8->shiftLeft(26)); - - $carry9 = $h9->addInt(1 << 24)->shiftRight(25); - $h0 = $h0->addInt64($carry9->mulInt(19, 5)); - $h9 = $h9->subInt64($carry9->shiftLeft(25)); - - $carry0 = $h0->addInt(1 << 25)->shiftRight(26); - $h1 = $h1->addInt64($carry0); - $h0 = $h0->subInt64($carry0->shiftLeft(26)); - - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - $h0->toInt32(), - $h1->toInt32(), - $h2->toInt32(), - $h3->toInt32(), - $h4->toInt32(), - $h5->toInt32(), - $h6->toInt32(), - $h7->toInt32(), - $h8->toInt32(), - $h9->toInt32() - ) - ); - } - - /** - * Square and double a field element - * - * h = 2 * f * f - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedMethodCall - */ - public static function fe_sq2(ParagonIE_Sodium_Core32_Curve25519_Fe $f) - { - /** @var ParagonIE_Sodium_Core32_Int64 $f0 */ - $f0 = $f[0]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f1 */ - $f1 = $f[1]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f2 */ - $f2 = $f[2]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f3 */ - $f3 = $f[3]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f4 */ - $f4 = $f[4]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f5 */ - $f5 = $f[5]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f6 */ - $f6 = $f[6]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f7 */ - $f7 = $f[7]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f8 */ - $f8 = $f[8]->toInt64(); - /** @var ParagonIE_Sodium_Core32_Int64 $f9 */ - $f9 = $f[9]->toInt64(); - - $f0_2 = $f0->shiftLeft(1); - $f1_2 = $f1->shiftLeft(1); - $f2_2 = $f2->shiftLeft(1); - $f3_2 = $f3->shiftLeft(1); - $f4_2 = $f4->shiftLeft(1); - $f5_2 = $f5->shiftLeft(1); - $f6_2 = $f6->shiftLeft(1); - $f7_2 = $f7->shiftLeft(1); - $f5_38 = $f5->mulInt(38, 6); /* 1.959375*2^30 */ - $f6_19 = $f6->mulInt(19, 5); /* 1.959375*2^30 */ - $f7_38 = $f7->mulInt(38, 6); /* 1.959375*2^30 */ - $f8_19 = $f8->mulInt(19, 5); /* 1.959375*2^30 */ - $f9_38 = $f9->mulInt(38, 6); /* 1.959375*2^30 */ - $f0f0 = $f0->mulInt64($f0, 28); - $f0f1_2 = $f0_2->mulInt64($f1, 28); - $f0f2_2 = $f0_2->mulInt64($f2, 28); - $f0f3_2 = $f0_2->mulInt64($f3, 28); - $f0f4_2 = $f0_2->mulInt64($f4, 28); - $f0f5_2 = $f0_2->mulInt64($f5, 28); - $f0f6_2 = $f0_2->mulInt64($f6, 28); - $f0f7_2 = $f0_2->mulInt64($f7, 28); - $f0f8_2 = $f0_2->mulInt64($f8, 28); - $f0f9_2 = $f0_2->mulInt64($f9, 28); - $f1f1_2 = $f1_2->mulInt64($f1, 28); - $f1f2_2 = $f1_2->mulInt64($f2, 28); - $f1f3_4 = $f1_2->mulInt64($f3_2, 29); - $f1f4_2 = $f1_2->mulInt64($f4, 28); - $f1f5_4 = $f1_2->mulInt64($f5_2, 29); - $f1f6_2 = $f1_2->mulInt64($f6, 28); - $f1f7_4 = $f1_2->mulInt64($f7_2, 29); - $f1f8_2 = $f1_2->mulInt64($f8, 28); - $f1f9_76 = $f9_38->mulInt64($f1_2, 29); - $f2f2 = $f2->mulInt64($f2, 28); - $f2f3_2 = $f2_2->mulInt64($f3, 28); - $f2f4_2 = $f2_2->mulInt64($f4, 28); - $f2f5_2 = $f2_2->mulInt64($f5, 28); - $f2f6_2 = $f2_2->mulInt64($f6, 28); - $f2f7_2 = $f2_2->mulInt64($f7, 28); - $f2f8_38 = $f8_19->mulInt64($f2_2, 29); - $f2f9_38 = $f9_38->mulInt64($f2, 29); - $f3f3_2 = $f3_2->mulInt64($f3, 28); - $f3f4_2 = $f3_2->mulInt64($f4, 28); - $f3f5_4 = $f3_2->mulInt64($f5_2, 28); - $f3f6_2 = $f3_2->mulInt64($f6, 28); - $f3f7_76 = $f7_38->mulInt64($f3_2, 29); - $f3f8_38 = $f8_19->mulInt64($f3_2, 29); - $f3f9_76 = $f9_38->mulInt64($f3_2, 29); - $f4f4 = $f4->mulInt64($f4, 28); - $f4f5_2 = $f4_2->mulInt64($f5, 28); - $f4f6_38 = $f6_19->mulInt64($f4_2, 29); - $f4f7_38 = $f7_38->mulInt64($f4, 29); - $f4f8_38 = $f8_19->mulInt64($f4_2, 29); - $f4f9_38 = $f9_38->mulInt64($f4, 29); - $f5f5_38 = $f5_38->mulInt64($f5, 29); - $f5f6_38 = $f6_19->mulInt64($f5_2, 29); - $f5f7_76 = $f7_38->mulInt64($f5_2, 29); - $f5f8_38 = $f8_19->mulInt64($f5_2, 29); - $f5f9_76 = $f9_38->mulInt64($f5_2, 29); - $f6f6_19 = $f6_19->mulInt64($f6, 29); - $f6f7_38 = $f7_38->mulInt64($f6, 29); - $f6f8_38 = $f8_19->mulInt64($f6_2, 29); - $f6f9_38 = $f9_38->mulInt64($f6, 29); - $f7f7_38 = $f7_38->mulInt64($f7, 29); - $f7f8_38 = $f8_19->mulInt64($f7_2, 29); - $f7f9_76 = $f9_38->mulInt64($f7_2, 29); - $f8f8_19 = $f8_19->mulInt64($f8, 29); - $f8f9_38 = $f9_38->mulInt64($f8, 29); - $f9f9_38 = $f9_38->mulInt64($f9, 29); - - $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38); - $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38); - $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19); - $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38); - $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38); - $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38); - $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19); - $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38); - $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38); - $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2); - - /** - * @var ParagonIE_Sodium_Core32_Int64 $h0 - * @var ParagonIE_Sodium_Core32_Int64 $h1 - * @var ParagonIE_Sodium_Core32_Int64 $h2 - * @var ParagonIE_Sodium_Core32_Int64 $h3 - * @var ParagonIE_Sodium_Core32_Int64 $h4 - * @var ParagonIE_Sodium_Core32_Int64 $h5 - * @var ParagonIE_Sodium_Core32_Int64 $h6 - * @var ParagonIE_Sodium_Core32_Int64 $h7 - * @var ParagonIE_Sodium_Core32_Int64 $h8 - * @var ParagonIE_Sodium_Core32_Int64 $h9 - */ - $h0 = $h0->shiftLeft(1); - $h1 = $h1->shiftLeft(1); - $h2 = $h2->shiftLeft(1); - $h3 = $h3->shiftLeft(1); - $h4 = $h4->shiftLeft(1); - $h5 = $h5->shiftLeft(1); - $h6 = $h6->shiftLeft(1); - $h7 = $h7->shiftLeft(1); - $h8 = $h8->shiftLeft(1); - $h9 = $h9->shiftLeft(1); - - $carry0 = $h0->addInt(1 << 25)->shiftRight(26); - $h1 = $h1->addInt64($carry0); - $h0 = $h0->subInt64($carry0->shiftLeft(26)); - $carry4 = $h4->addInt(1 << 25)->shiftRight(26); - $h5 = $h5->addInt64($carry4); - $h4 = $h4->subInt64($carry4->shiftLeft(26)); - - $carry1 = $h1->addInt(1 << 24)->shiftRight(25); - $h2 = $h2->addInt64($carry1); - $h1 = $h1->subInt64($carry1->shiftLeft(25)); - $carry5 = $h5->addInt(1 << 24)->shiftRight(25); - $h6 = $h6->addInt64($carry5); - $h5 = $h5->subInt64($carry5->shiftLeft(25)); - - $carry2 = $h2->addInt(1 << 25)->shiftRight(26); - $h3 = $h3->addInt64($carry2); - $h2 = $h2->subInt64($carry2->shiftLeft(26)); - $carry6 = $h6->addInt(1 << 25)->shiftRight(26); - $h7 = $h7->addInt64($carry6); - $h6 = $h6->subInt64($carry6->shiftLeft(26)); - - $carry3 = $h3->addInt(1 << 24)->shiftRight(25); - $h4 = $h4->addInt64($carry3); - $h3 = $h3->subInt64($carry3->shiftLeft(25)); - $carry7 = $h7->addInt(1 << 24)->shiftRight(25); - $h8 = $h8->addInt64($carry7); - $h7 = $h7->subInt64($carry7->shiftLeft(25)); - - $carry4 = $h4->addInt(1 << 25)->shiftRight(26); - $h5 = $h5->addInt64($carry4); - $h4 = $h4->subInt64($carry4->shiftLeft(26)); - $carry8 = $h8->addInt(1 << 25)->shiftRight(26); - $h9 = $h9->addInt64($carry8); - $h8 = $h8->subInt64($carry8->shiftLeft(26)); - - $carry9 = $h9->addInt(1 << 24)->shiftRight(25); - $h0 = $h0->addInt64($carry9->mulInt(19, 5)); - $h9 = $h9->subInt64($carry9->shiftLeft(25)); - - $carry0 = $h0->addInt(1 << 25)->shiftRight(26); - $h1 = $h1->addInt64($carry0); - $h0 = $h0->subInt64($carry0->shiftLeft(26)); - - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - $h0->toInt32(), - $h1->toInt32(), - $h2->toInt32(), - $h3->toInt32(), - $h4->toInt32(), - $h5->toInt32(), - $h6->toInt32(), - $h7->toInt32(), - $h8->toInt32(), - $h9->toInt32() - ) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $Z - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - */ - public static function fe_invert(ParagonIE_Sodium_Core32_Curve25519_Fe $Z) - { - $z = clone $Z; - $t0 = self::fe_sq($z); - $t1 = self::fe_sq($t0); - $t1 = self::fe_sq($t1); - $t1 = self::fe_mul($z, $t1); - $t0 = self::fe_mul($t0, $t1); - $t2 = self::fe_sq($t0); - $t1 = self::fe_mul($t1, $t2); - $t2 = self::fe_sq($t1); - for ($i = 1; $i < 5; ++$i) { - $t2 = self::fe_sq($t2); - } - $t1 = self::fe_mul($t2, $t1); - $t2 = self::fe_sq($t1); - for ($i = 1; $i < 10; ++$i) { - $t2 = self::fe_sq($t2); - } - $t2 = self::fe_mul($t2, $t1); - $t3 = self::fe_sq($t2); - for ($i = 1; $i < 20; ++$i) { - $t3 = self::fe_sq($t3); - } - $t2 = self::fe_mul($t3, $t2); - $t2 = self::fe_sq($t2); - for ($i = 1; $i < 10; ++$i) { - $t2 = self::fe_sq($t2); - } - $t1 = self::fe_mul($t2, $t1); - $t2 = self::fe_sq($t1); - for ($i = 1; $i < 50; ++$i) { - $t2 = self::fe_sq($t2); - } - $t2 = self::fe_mul($t2, $t1); - $t3 = self::fe_sq($t2); - for ($i = 1; $i < 100; ++$i) { - $t3 = self::fe_sq($t3); - } - $t2 = self::fe_mul($t3, $t2); - $t2 = self::fe_sq($t2); - for ($i = 1; $i < 50; ++$i) { - $t2 = self::fe_sq($t2); - } - $t1 = self::fe_mul($t2, $t1); - $t1 = self::fe_sq($t1); - for ($i = 1; $i < 5; ++$i) { - $t1 = self::fe_sq($t1); - } - return self::fe_mul($t1, $t0); - } - - /** - * @internal You should not use this directly from another application - * - * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106 - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $z - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - */ - public static function fe_pow22523(ParagonIE_Sodium_Core32_Curve25519_Fe $z) - { - # fe_sq(t0, z); - # fe_sq(t1, t0); - # fe_sq(t1, t1); - # fe_mul(t1, z, t1); - # fe_mul(t0, t0, t1); - # fe_sq(t0, t0); - # fe_mul(t0, t1, t0); - # fe_sq(t1, t0); - $t0 = self::fe_sq($z); - $t1 = self::fe_sq($t0); - $t1 = self::fe_sq($t1); - $t1 = self::fe_mul($z, $t1); - $t0 = self::fe_mul($t0, $t1); - $t0 = self::fe_sq($t0); - $t0 = self::fe_mul($t1, $t0); - $t1 = self::fe_sq($t0); - - # for (i = 1; i < 5; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 5; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t0, t1, t0); - # fe_sq(t1, t0); - $t0 = self::fe_mul($t1, $t0); - $t1 = self::fe_sq($t0); - - # for (i = 1; i < 10; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 10; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t1, t1, t0); - # fe_sq(t2, t1); - $t1 = self::fe_mul($t1, $t0); - $t2 = self::fe_sq($t1); - - # for (i = 1; i < 20; ++i) { - # fe_sq(t2, t2); - # } - for ($i = 1; $i < 20; ++$i) { - $t2 = self::fe_sq($t2); - } - - # fe_mul(t1, t2, t1); - # fe_sq(t1, t1); - $t1 = self::fe_mul($t2, $t1); - $t1 = self::fe_sq($t1); - - # for (i = 1; i < 10; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 10; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t0, t1, t0); - # fe_sq(t1, t0); - $t0 = self::fe_mul($t1, $t0); - $t1 = self::fe_sq($t0); - - # for (i = 1; i < 50; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 50; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t1, t1, t0); - # fe_sq(t2, t1); - $t1 = self::fe_mul($t1, $t0); - $t2 = self::fe_sq($t1); - - # for (i = 1; i < 100; ++i) { - # fe_sq(t2, t2); - # } - for ($i = 1; $i < 100; ++$i) { - $t2 = self::fe_sq($t2); - } - - # fe_mul(t1, t2, t1); - # fe_sq(t1, t1); - $t1 = self::fe_mul($t2, $t1); - $t1 = self::fe_sq($t1); - - # for (i = 1; i < 50; ++i) { - # fe_sq(t1, t1); - # } - for ($i = 1; $i < 50; ++$i) { - $t1 = self::fe_sq($t1); - } - - # fe_mul(t0, t1, t0); - # fe_sq(t0, t0); - # fe_sq(t0, t0); - # fe_mul(out, t0, z); - $t0 = self::fe_mul($t1, $t0); - $t0 = self::fe_sq($t0); - $t0 = self::fe_sq($t0); - return self::fe_mul($t0, $z); - } - - /** - * Subtract two field elements. - * - * h = f - g - * - * Preconditions: - * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - * - * Postconditions: - * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedMethodCall - * @psalm-suppress MixedTypeCoercion - */ - public static function fe_sub(ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g) - { - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - $f[0]->subInt32($g[0]), - $f[1]->subInt32($g[1]), - $f[2]->subInt32($g[2]), - $f[3]->subInt32($g[3]), - $f[4]->subInt32($g[4]), - $f[5]->subInt32($g[5]), - $f[6]->subInt32($g[6]), - $f[7]->subInt32($g[7]), - $f[8]->subInt32($g[8]), - $f[9]->subInt32($g[9]) - ) - ); - } - - /** - * Add two group elements. - * - * r = p + q - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_add( - ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q - ) { - $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->YplusX); - $r->Y = self::fe_mul($r->Y, $q->YminusX); - $r->T = self::fe_mul($q->T2d, $p->T); - $r->X = self::fe_mul($p->Z, $q->Z); - $t0 = self::fe_add($r->X, $r->X); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_add($t0, $r->T); - $r->T = self::fe_sub($t0, $r->T); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215 - * @param string $a - * @return array - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayOffset - */ - public static function slide($a) - { - if (self::strlen($a) < 256) { - if (self::strlen($a) < 16) { - $a = str_pad($a, 256, '0', STR_PAD_RIGHT); - } - } - /** @var array $r */ - $r = array(); - for ($i = 0; $i < 256; ++$i) { - $r[$i] = (int) (1 & - ( - self::chrToInt($a[$i >> 3]) - >> - ($i & 7) - ) - ); - } - - for ($i = 0;$i < 256;++$i) { - if ($r[$i]) { - for ($b = 1;$b <= 6 && $i + $b < 256;++$b) { - if ($r[$i + $b]) { - if ($r[$i] + ($r[$i + $b] << $b) <= 15) { - $r[$i] += $r[$i + $b] << $b; - $r[$i + $b] = 0; - } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) { - $r[$i] -= $r[$i + $b] << $b; - for ($k = $i + $b; $k < 256; ++$k) { - if (!$r[$k]) { - $r[$k] = 1; - break; - } - $r[$k] = 0; - } - } else { - break; - } - } - } - } - } - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $s - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_frombytes_negate_vartime($s) - { - static $d = null; - if (!$d) { - /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */ - $d = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[0]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[1]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[2]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[3]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[4]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[5]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[6]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[7]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[8]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[9]) - ) - ); - } - - # fe_frombytes(h->Y,s); - # fe_1(h->Z); - $h = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3( - self::fe_0(), - self::fe_frombytes($s), - self::fe_1() - ); - - # fe_sq(u,h->Y); - # fe_mul(v,u,d); - # fe_sub(u,u,h->Z); /* u = y^2-1 */ - # fe_add(v,v,h->Z); /* v = dy^2+1 */ - $u = self::fe_sq($h->Y); - /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */ - $v = self::fe_mul($u, $d); - $u = self::fe_sub($u, $h->Z); /* u = y^2 - 1 */ - $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */ - - # fe_sq(v3,v); - # fe_mul(v3,v3,v); /* v3 = v^3 */ - # fe_sq(h->X,v3); - # fe_mul(h->X,h->X,v); - # fe_mul(h->X,h->X,u); /* x = uv^7 */ - $v3 = self::fe_sq($v); - $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */ - $h->X = self::fe_sq($v3); - $h->X = self::fe_mul($h->X, $v); - $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */ - - # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ - # fe_mul(h->X,h->X,v3); - # fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ - $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */ - $h->X = self::fe_mul($h->X, $v3); - $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */ - - # fe_sq(vxx,h->X); - # fe_mul(vxx,vxx,v); - # fe_sub(check,vxx,u); /* vx^2-u */ - $vxx = self::fe_sq($h->X); - $vxx = self::fe_mul($vxx, $v); - $check = self::fe_sub($vxx, $u); /* vx^2 - u */ - - # if (fe_isnonzero(check)) { - # fe_add(check,vxx,u); /* vx^2+u */ - # if (fe_isnonzero(check)) { - # return -1; - # } - # fe_mul(h->X,h->X,sqrtm1); - # } - if (self::fe_isnonzero($check)) { - $check = self::fe_add($vxx, $u); /* vx^2 + u */ - if (self::fe_isnonzero($check)) { - throw new RangeException('Internal check failed.'); - } - $h->X = self::fe_mul( - $h->X, - ParagonIE_Sodium_Core32_Curve25519_Fe::fromIntArray(self::$sqrtm1) - ); - } - - # if (fe_isnegative(h->X) == (s[31] >> 7)) { - # fe_neg(h->X,h->X); - # } - $i = self::chrToInt($s[31]); - if (self::fe_isnegative($h->X) === ($i >> 7)) { - $h->X = self::fe_neg($h->X); - } - - # fe_mul(h->T,h->X,h->Y); - $h->T = self::fe_mul($h->X, $h->Y); - return $h; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_madd( - ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R, - ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q - ) { - $r = clone $R; - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->yplusx); - $r->Y = self::fe_mul($r->Y, $q->yminusx); - $r->T = self::fe_mul($q->xy2d, $p->T); - $t0 = self::fe_add(clone $p->Z, clone $p->Z); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_add($t0, $r->T); - $r->T = self::fe_sub($t0, $r->T); - - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_msub( - ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R, - ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q - ) { - $r = clone $R; - - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->yminusx); - $r->Y = self::fe_mul($r->Y, $q->yplusx); - $r->T = self::fe_mul($q->xy2d, $p->T); - $t0 = self::fe_add($p->Z, $p->Z); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_sub($t0, $r->T); - $r->T = self::fe_add($t0, $r->T); - - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p) - { - $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P2(); - $r->X = self::fe_mul($p->X, $p->T); - $r->Y = self::fe_mul($p->Y, $p->Z); - $r->Z = self::fe_mul($p->Z, $p->T); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p) - { - $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3(); - $r->X = self::fe_mul($p->X, $p->T); - $r->Y = self::fe_mul($p->Y, $p->Z); - $r->Z = self::fe_mul($p->Z, $p->T); - $r->T = self::fe_mul($p->X, $p->Y); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p2_0() - { - return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2( - self::fe_0(), - self::fe_1(), - self::fe_1() - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p2_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p) - { - $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); - - $r->X = self::fe_sq($p->X); - $r->Z = self::fe_sq($p->Y); - $r->T = self::fe_sq2($p->Z); - $r->Y = self::fe_add($p->X, $p->Y); - $t0 = self::fe_sq($r->Y); - $r->Y = self::fe_add($r->Z, $r->X); - $r->Z = self::fe_sub($r->Z, $r->X); - $r->X = self::fe_sub($t0, $r->Y); - $r->T = self::fe_sub($r->T, $r->Z); - - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p3_0() - { - return new ParagonIE_Sodium_Core32_Curve25519_Ge_P3( - self::fe_0(), - self::fe_1(), - self::fe_1(), - self::fe_0() - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Cached - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p3_to_cached(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) - { - static $d2 = null; - if ($d2 === null) { - $d2 = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[0]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[1]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[2]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[3]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[4]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[5]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[6]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[7]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[8]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[9]) - ) - ); - } - /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d2 */ - $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached(); - $r->YplusX = self::fe_add($p->Y, $p->X); - $r->YminusX = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_copy($p->Z); - $r->T2d = self::fe_mul($p->T, $d2); - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 - */ - public static function ge_p3_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) - { - return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2( - $p->X, - $p->Y, - $p->Z - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p3_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h) - { - $recip = self::fe_invert($h->Z); - $x = self::fe_mul($h->X, $recip); - $y = self::fe_mul($h->Y, $recip); - $s = self::fe_tobytes($y); - $s[31] = self::intToChr( - self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) - ); - return $s; - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_p3_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) - { - $q = self::ge_p3_to_p2($p); - return self::ge_p2_dbl($q); - } - - /** - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp - * @throws SodiumException - * @throws TypeError - */ - public static function ge_precomp_0() - { - return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( - self::fe_1(), - self::fe_1(), - self::fe_0() - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $b - * @param int $c - * @return int - * @psalm-suppress MixedReturnStatement - */ - public static function equal($b, $c) - { - return (int) ((($b ^ $c) - 1 & 0xffffffff) >> 31); - } - - /** - * @internal You should not use this directly from another application - * - * @param string|int $char - * @return int (1 = yes, 0 = no) - * @throws SodiumException - * @throws TypeError - */ - public static function negative($char) - { - if (is_int($char)) { - return $char < 0 ? 1 : 0; - } - /** @var string $char */ - /** @var int $x */ - $x = self::chrToInt(self::substr($char, 0, 1)); - return (int) ($x >> 31); - } - - /** - * Conditional move - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u - * @param int $b - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp - * @throws SodiumException - * @throws TypeError - */ - public static function cmov( - ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t, - ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u, - $b - ) { - if (!is_int($b)) { - throw new InvalidArgumentException('Expected an integer.'); - } - return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( - self::fe_cmov($t->yplusx, $u->yplusx, $b), - self::fe_cmov($t->yminusx, $u->yminusx, $b), - self::fe_cmov($t->xy2d, $u->xy2d, $b) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $pos - * @param int $b - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAccess - * @psalm-suppress MixedArrayOffset - * @psalm-suppress MixedArgument - */ - public static function ge_select($pos = 0, $b = 0) - { - static $base = null; - if ($base === null) { - $base = array(); - foreach (self::$base as $i => $bas) { - for ($j = 0; $j < 8; ++$j) { - $base[$i][$j] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( - ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][0]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][1]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][2]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][3]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][4]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][5]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][6]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][7]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][8]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][9]) - ) - ), - ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][0]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][1]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][2]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][3]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][4]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][5]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][6]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][7]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][8]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][9]) - ) - ), - ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][0]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][1]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][2]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][3]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][4]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][5]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][6]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][7]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][8]), - ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][9]) - ) - ) - ); - } - } - } - if (!is_int($pos)) { - throw new InvalidArgumentException('Position must be an integer'); - } - if ($pos < 0 || $pos > 31) { - throw new RangeException('Position is out of range [0, 31]'); - } - - $bnegative = self::negative($b); - /** @var int $babs */ - $babs = $b - (((-$bnegative) & $b) << 1); - - $t = self::ge_precomp_0(); - for ($i = 0; $i < 8; ++$i) { - $t = self::cmov( - $t, - $base[$pos][$i], - self::equal($babs, $i + 1) - ); - } - $minusT = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( - self::fe_copy($t->yminusx), - self::fe_copy($t->yplusx), - self::fe_neg($t->xy2d) - ); - return self::cmov($t, $minusT, -$bnegative); - } - - /** - * Subtract two group elements. - * - * r = p - q - * - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_sub( - ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, - ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q - ) { - $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); - - $r->X = self::fe_add($p->Y, $p->X); - $r->Y = self::fe_sub($p->Y, $p->X); - $r->Z = self::fe_mul($r->X, $q->YminusX); - $r->Y = self::fe_mul($r->Y, $q->YplusX); - $r->T = self::fe_mul($q->T2d, $p->T); - $r->X = self::fe_mul($p->Z, $q->Z); - $t0 = self::fe_add($r->X, $r->X); - $r->X = self::fe_sub($r->Z, $r->Y); - $r->Y = self::fe_add($r->Z, $r->Y); - $r->Z = self::fe_sub($t0, $r->T); - $r->T = self::fe_add($t0, $r->T); - - return $r; - } - - /** - * Convert a group element to a byte string. - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function ge_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h) - { - $recip = self::fe_invert($h->Z); - $x = self::fe_mul($h->X, $recip); - $y = self::fe_mul($h->Y, $recip); - $s = self::fe_tobytes($y); - $s[31] = self::intToChr( - self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) - ); - return $s; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $a - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A - * @param string $b - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAccess - */ - public static function ge_double_scalarmult_vartime( - $a, - ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A, - $b - ) { - /** @var array $Ai */ - $Ai = array(); - - static $Bi = array(); - /** @var array $Bi */ - if (!$Bi) { - for ($i = 0; $i < 8; ++$i) { - $Bi[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( - ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][0]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][1]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][2]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][3]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][4]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][5]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][6]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][7]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][8]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][9]) - ) - ), - ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][0]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][1]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][2]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][3]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][4]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][5]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][6]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][7]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][8]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][9]) - ) - ), - ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( - array( - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][0]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][1]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][2]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][3]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][4]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][5]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][6]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][7]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][8]), - ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][9]) - ) - ) - ); - } - } - - for ($i = 0; $i < 8; ++$i) { - $Ai[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached( - self::fe_0(), - self::fe_0(), - self::fe_0(), - self::fe_0() - ); - } - /** @var array $Ai */ - - # slide(aslide,a); - # slide(bslide,b); - /** @var array $aslide */ - $aslide = self::slide($a); - /** @var array $bslide */ - $bslide = self::slide($b); - - # ge_p3_to_cached(&Ai[0],A); - # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); - $Ai[0] = self::ge_p3_to_cached($A); - $t = self::ge_p3_dbl($A); - $A2 = self::ge_p1p1_to_p3($t); - - # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); - # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); - # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); - # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); - # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); - # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); - # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); - for ($i = 0; $i < 7; ++$i) { - $t = self::ge_add($A2, $Ai[$i]); - $u = self::ge_p1p1_to_p3($t); - $Ai[$i + 1] = self::ge_p3_to_cached($u); - } - - # ge_p2_0(r); - $r = self::ge_p2_0(); - - # for (i = 255;i >= 0;--i) { - # if (aslide[i] || bslide[i]) break; - # } - $i = 255; - for (; $i >= 0; --$i) { - if ($aslide[$i] || $bslide[$i]) { - break; - } - } - - # for (;i >= 0;--i) { - for (; $i >= 0; --$i) { - # ge_p2_dbl(&t,r); - $t = self::ge_p2_dbl($r); - - # if (aslide[i] > 0) { - if ($aslide[$i] > 0) { - # ge_p1p1_to_p3(&u,&t); - # ge_add(&t,&u,&Ai[aslide[i]/2]); - $u = self::ge_p1p1_to_p3($t); - $t = self::ge_add( - $u, - $Ai[(int) floor($aslide[$i] / 2)] - ); - # } else if (aslide[i] < 0) { - } elseif ($aslide[$i] < 0) { - # ge_p1p1_to_p3(&u,&t); - # ge_sub(&t,&u,&Ai[(-aslide[i])/2]); - $u = self::ge_p1p1_to_p3($t); - $t = self::ge_sub( - $u, - $Ai[(int) floor(-$aslide[$i] / 2)] - ); - } - /** @var array $Bi */ - - # if (bslide[i] > 0) { - if ($bslide[$i] > 0) { - # ge_p1p1_to_p3(&u,&t); - # ge_madd(&t,&u,&Bi[bslide[i]/2]); - $u = self::ge_p1p1_to_p3($t); - /** @var int $index */ - $index = (int) floor($bslide[$i] / 2); - /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */ - $thisB = $Bi[$index]; - $t = self::ge_madd($t, $u, $thisB); - # } else if (bslide[i] < 0) { - } elseif ($bslide[$i] < 0) { - # ge_p1p1_to_p3(&u,&t); - # ge_msub(&t,&u,&Bi[(-bslide[i])/2]); - $u = self::ge_p1p1_to_p3($t); - - /** @var int $index */ - $index = (int) floor(-$bslide[$i] / 2); - - /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */ - $thisB = $Bi[$index]; - $t = self::ge_msub($t, $u, $thisB); - } - # ge_p1p1_to_p2(r,&t); - $r = self::ge_p1p1_to_p2($t); - } - return $r; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $a - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedOperand - * @throws SodiumException - * @throws TypeError - */ - public static function ge_scalarmult_base($a) - { - /** @var array $e */ - $e = array(); - $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); - - for ($i = 0; $i < 32; ++$i) { - /** @var int $dbl */ - $dbl = (int) $i << 1; - $e[$dbl] = (int) self::chrToInt($a[$i]) & 15; - $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15; - } - - /** @var int $carry */ - $carry = 0; - for ($i = 0; $i < 63; ++$i) { - $e[$i] += $carry; - /** @var int $carry */ - $carry = $e[$i] + 8; - /** @var int $carry */ - $carry >>= 4; - $e[$i] -= $carry << 4; - } - - /** @var array $e */ - $e[63] += (int) $carry; - - $h = self::ge_p3_0(); - - for ($i = 1; $i < 64; $i += 2) { - $t = self::ge_select((int) floor($i / 2), (int) $e[$i]); - $r = self::ge_madd($r, $h, $t); - $h = self::ge_p1p1_to_p3($r); - } - - $r = self::ge_p3_dbl($h); - - $s = self::ge_p1p1_to_p2($r); - $r = self::ge_p2_dbl($s); - $s = self::ge_p1p1_to_p2($r); - $r = self::ge_p2_dbl($s); - $s = self::ge_p1p1_to_p2($r); - $r = self::ge_p2_dbl($s); - - $h = self::ge_p1p1_to_p3($r); - - for ($i = 0; $i < 64; $i += 2) { - $t = self::ge_select($i >> 1, (int) $e[$i]); - $r = self::ge_madd($r, $h, $t); - $h = self::ge_p1p1_to_p3($r); - } - return $h; - } - - /** - * Calculates (ab + c) mod l - * where l = 2^252 + 27742317777372353535851937790883648493 - * - * @internal You should not use this directly from another application - * - * @param string $a - * @param string $b - * @param string $c - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sc_muladd($a, $b, $c) - { - $a0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 0, 3))); - $a1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5)); - $a2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2)); - $a3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7)); - $a4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4)); - $a5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1)); - $a6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6)); - $a7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3)); - $a8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 21, 3))); - $a9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5)); - $a10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2)); - $a11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($a, 28, 4)) >> 7)); - $b0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 0, 3))); - $b1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5)); - $b2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2)); - $b3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7)); - $b4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4)); - $b5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1)); - $b6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6)); - $b7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3)); - $b8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 21, 3))); - $b9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5)); - $b10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2)); - $b11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($b, 28, 4)) >> 7)); - $c0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 0, 3))); - $c1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5)); - $c2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2)); - $c3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7)); - $c4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4)); - $c5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1)); - $c6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6)); - $c7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3)); - $c8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 21, 3))); - $c9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5)); - $c10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2)); - $c11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($c, 28, 4)) >> 7)); - - /* Can't really avoid the pyramid here: */ - /** - * @var ParagonIE_Sodium_Core32_Int64 $s0 - * @var ParagonIE_Sodium_Core32_Int64 $s1 - * @var ParagonIE_Sodium_Core32_Int64 $s2 - * @var ParagonIE_Sodium_Core32_Int64 $s3 - * @var ParagonIE_Sodium_Core32_Int64 $s4 - * @var ParagonIE_Sodium_Core32_Int64 $s5 - * @var ParagonIE_Sodium_Core32_Int64 $s6 - * @var ParagonIE_Sodium_Core32_Int64 $s7 - * @var ParagonIE_Sodium_Core32_Int64 $s8 - * @var ParagonIE_Sodium_Core32_Int64 $s9 - * @var ParagonIE_Sodium_Core32_Int64 $s10 - * @var ParagonIE_Sodium_Core32_Int64 $s11 - * @var ParagonIE_Sodium_Core32_Int64 $s12 - * @var ParagonIE_Sodium_Core32_Int64 $s13 - * @var ParagonIE_Sodium_Core32_Int64 $s14 - * @var ParagonIE_Sodium_Core32_Int64 $s15 - * @var ParagonIE_Sodium_Core32_Int64 $s16 - * @var ParagonIE_Sodium_Core32_Int64 $s17 - * @var ParagonIE_Sodium_Core32_Int64 $s18 - * @var ParagonIE_Sodium_Core32_Int64 $s19 - * @var ParagonIE_Sodium_Core32_Int64 $s20 - * @var ParagonIE_Sodium_Core32_Int64 $s21 - * @var ParagonIE_Sodium_Core32_Int64 $s22 - * @var ParagonIE_Sodium_Core32_Int64 $s23 - */ - - $s0 = $c0->addInt64($a0->mulInt64($b0, 24)); - $s1 = $c1->addInt64($a0->mulInt64($b1, 24))->addInt64($a1->mulInt64($b0, 24)); - $s2 = $c2->addInt64($a0->mulInt64($b2, 24))->addInt64($a1->mulInt64($b1, 24))->addInt64($a2->mulInt64($b0, 24)); - $s3 = $c3->addInt64($a0->mulInt64($b3, 24))->addInt64($a1->mulInt64($b2, 24))->addInt64($a2->mulInt64($b1, 24)) - ->addInt64($a3->mulInt64($b0, 24)); - $s4 = $c4->addInt64($a0->mulInt64($b4, 24))->addInt64($a1->mulInt64($b3, 24))->addInt64($a2->mulInt64($b2, 24)) - ->addInt64($a3->mulInt64($b1, 24))->addInt64($a4->mulInt64($b0, 24)); - $s5 = $c5->addInt64($a0->mulInt64($b5, 24))->addInt64($a1->mulInt64($b4, 24))->addInt64($a2->mulInt64($b3, 24)) - ->addInt64($a3->mulInt64($b2, 24))->addInt64($a4->mulInt64($b1, 24))->addInt64($a5->mulInt64($b0, 24)); - $s6 = $c6->addInt64($a0->mulInt64($b6, 24))->addInt64($a1->mulInt64($b5, 24))->addInt64($a2->mulInt64($b4, 24)) - ->addInt64($a3->mulInt64($b3, 24))->addInt64($a4->mulInt64($b2, 24))->addInt64($a5->mulInt64($b1, 24)) - ->addInt64($a6->mulInt64($b0, 24)); - $s7 = $c7->addInt64($a0->mulInt64($b7, 24))->addInt64($a1->mulInt64($b6, 24))->addInt64($a2->mulInt64($b5, 24)) - ->addInt64($a3->mulInt64($b4, 24))->addInt64($a4->mulInt64($b3, 24))->addInt64($a5->mulInt64($b2, 24)) - ->addInt64($a6->mulInt64($b1, 24))->addInt64($a7->mulInt64($b0, 24)); - $s8 = $c8->addInt64($a0->mulInt64($b8, 24))->addInt64($a1->mulInt64($b7, 24))->addInt64($a2->mulInt64($b6, 24)) - ->addInt64($a3->mulInt64($b5, 24))->addInt64($a4->mulInt64($b4, 24))->addInt64($a5->mulInt64($b3, 24)) - ->addInt64($a6->mulInt64($b2, 24))->addInt64($a7->mulInt64($b1, 24))->addInt64($a8->mulInt64($b0, 24)); - $s9 = $c9->addInt64($a0->mulInt64($b9, 24))->addInt64($a1->mulInt64($b8, 24))->addInt64($a2->mulInt64($b7, 24)) - ->addInt64($a3->mulInt64($b6, 24))->addInt64($a4->mulInt64($b5, 24))->addInt64($a5->mulInt64($b4, 24)) - ->addInt64($a6->mulInt64($b3, 24))->addInt64($a7->mulInt64($b2, 24))->addInt64($a8->mulInt64($b1, 24)) - ->addInt64($a9->mulInt64($b0, 24)); - $s10 = $c10->addInt64($a0->mulInt64($b10, 24))->addInt64($a1->mulInt64($b9, 24))->addInt64($a2->mulInt64($b8, 24)) - ->addInt64($a3->mulInt64($b7, 24))->addInt64($a4->mulInt64($b6, 24))->addInt64($a5->mulInt64($b5, 24)) - ->addInt64($a6->mulInt64($b4, 24))->addInt64($a7->mulInt64($b3, 24))->addInt64($a8->mulInt64($b2, 24)) - ->addInt64($a9->mulInt64($b1, 24))->addInt64($a10->mulInt64($b0, 24)); - $s11 = $c11->addInt64($a0->mulInt64($b11, 24))->addInt64($a1->mulInt64($b10, 24))->addInt64($a2->mulInt64($b9, 24)) - ->addInt64($a3->mulInt64($b8, 24))->addInt64($a4->mulInt64($b7, 24))->addInt64($a5->mulInt64($b6, 24)) - ->addInt64($a6->mulInt64($b5, 24))->addInt64($a7->mulInt64($b4, 24))->addInt64($a8->mulInt64($b3, 24)) - ->addInt64($a9->mulInt64($b2, 24))->addInt64($a10->mulInt64($b1, 24))->addInt64($a11->mulInt64($b0, 24)); - $s12 = $a1->mulInt64($b11, 24)->addInt64($a2->mulInt64($b10, 24))->addInt64($a3->mulInt64($b9, 24)) - ->addInt64($a4->mulInt64($b8, 24))->addInt64($a5->mulInt64($b7, 24))->addInt64($a6->mulInt64($b6, 24)) - ->addInt64($a7->mulInt64($b5, 24))->addInt64($a8->mulInt64($b4, 24))->addInt64($a9->mulInt64($b3, 24)) - ->addInt64($a10->mulInt64($b2, 24))->addInt64($a11->mulInt64($b1, 24)); - $s13 = $a2->mulInt64($b11, 24)->addInt64($a3->mulInt64($b10, 24))->addInt64($a4->mulInt64($b9, 24)) - ->addInt64($a5->mulInt64($b8, 24))->addInt64($a6->mulInt64($b7, 24))->addInt64($a7->mulInt64($b6, 24)) - ->addInt64($a8->mulInt64($b5, 24))->addInt64($a9->mulInt64($b4, 24))->addInt64($a10->mulInt64($b3, 24)) - ->addInt64($a11->mulInt64($b2, 24)); - $s14 = $a3->mulInt64($b11, 24)->addInt64($a4->mulInt64($b10, 24))->addInt64($a5->mulInt64($b9, 24)) - ->addInt64($a6->mulInt64($b8, 24))->addInt64($a7->mulInt64($b7, 24))->addInt64($a8->mulInt64($b6, 24)) - ->addInt64($a9->mulInt64($b5, 24))->addInt64($a10->mulInt64($b4, 24))->addInt64($a11->mulInt64($b3, 24)); - $s15 = $a4->mulInt64($b11, 24)->addInt64($a5->mulInt64($b10, 24))->addInt64($a6->mulInt64($b9, 24)) - ->addInt64($a7->mulInt64($b8, 24))->addInt64($a8->mulInt64($b7, 24))->addInt64($a9->mulInt64($b6, 24)) - ->addInt64($a10->mulInt64($b5, 24))->addInt64($a11->mulInt64($b4, 24)); - $s16 = $a5->mulInt64($b11, 24)->addInt64($a6->mulInt64($b10, 24))->addInt64($a7->mulInt64($b9, 24)) - ->addInt64($a8->mulInt64($b8, 24))->addInt64($a9->mulInt64($b7, 24))->addInt64($a10->mulInt64($b6, 24)) - ->addInt64($a11->mulInt64($b5, 24)); - $s17 = $a6->mulInt64($b11, 24)->addInt64($a7->mulInt64($b10, 24))->addInt64($a8->mulInt64($b9, 24)) - ->addInt64($a9->mulInt64($b8, 24))->addInt64($a10->mulInt64($b7, 24))->addInt64($a11->mulInt64($b6, 24)); - $s18 = $a7->mulInt64($b11, 24)->addInt64($a8->mulInt64($b10, 24))->addInt64($a9->mulInt64($b9, 24)) - ->addInt64($a10->mulInt64($b8, 24))->addInt64($a11->mulInt64($b7, 24)); - $s19 = $a8->mulInt64($b11, 24)->addInt64($a9->mulInt64($b10, 24))->addInt64($a10->mulInt64($b9, 24)) - ->addInt64($a11->mulInt64($b8, 24)); - $s20 = $a9->mulInt64($b11, 24)->addInt64($a10->mulInt64($b10, 24))->addInt64($a11->mulInt64($b9, 24)); - $s21 = $a10->mulInt64($b11, 24)->addInt64($a11->mulInt64($b10, 24)); - $s22 = $a11->mulInt64($b11, 24); - $s23 = new ParagonIE_Sodium_Core32_Int64(); - - $carry0 = $s0->addInt(1 << 20)->shiftRight(21); - $s1 = $s1->addInt64($carry0); - $s0 = $s0->subInt64($carry0->shiftLeft(21)); - $carry2 = $s2->addInt(1 << 20)->shiftRight(21); - $s3 = $s3->addInt64($carry2); - $s2 = $s2->subInt64($carry2->shiftLeft(21)); - $carry4 = $s4->addInt(1 << 20)->shiftRight(21); - $s5 = $s5->addInt64($carry4); - $s4 = $s4->subInt64($carry4->shiftLeft(21)); - $carry6 = $s6->addInt(1 << 20)->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry8 = $s8->addInt(1 << 20)->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry10 = $s10->addInt(1 << 20)->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - $carry12 = $s12->addInt(1 << 20)->shiftRight(21); - $s13 = $s13->addInt64($carry12); - $s12 = $s12->subInt64($carry12->shiftLeft(21)); - $carry14 = $s14->addInt(1 << 20)->shiftRight(21); - $s15 = $s15->addInt64($carry14); - $s14 = $s14->subInt64($carry14->shiftLeft(21)); - $carry16 = $s16->addInt(1 << 20)->shiftRight(21); - $s17 = $s17->addInt64($carry16); - $s16 = $s16->subInt64($carry16->shiftLeft(21)); - $carry18 = $s18->addInt(1 << 20)->shiftRight(21); - $s19 = $s19->addInt64($carry18); - $s18 = $s18->subInt64($carry18->shiftLeft(21)); - $carry20 = $s20->addInt(1 << 20)->shiftRight(21); - $s21 = $s21->addInt64($carry20); - $s20 = $s20->subInt64($carry20->shiftLeft(21)); - $carry22 = $s22->addInt(1 << 20)->shiftRight(21); - $s23 = $s23->addInt64($carry22); - $s22 = $s22->subInt64($carry22->shiftLeft(21)); - - $carry1 = $s1->addInt(1 << 20)->shiftRight(21); - $s2 = $s2->addInt64($carry1); - $s1 = $s1->subInt64($carry1->shiftLeft(21)); - $carry3 = $s3->addInt(1 << 20)->shiftRight(21); - $s4 = $s4->addInt64($carry3); - $s3 = $s3->subInt64($carry3->shiftLeft(21)); - $carry5 = $s5->addInt(1 << 20)->shiftRight(21); - $s6 = $s6->addInt64($carry5); - $s5 = $s5->subInt64($carry5->shiftLeft(21)); - $carry7 = $s7->addInt(1 << 20)->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry9 = $s9->addInt(1 << 20)->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry11 = $s11->addInt(1 << 20)->shiftRight(21); - $s12 = $s12->addInt64($carry11); - $s11 = $s11->subInt64($carry11->shiftLeft(21)); - $carry13 = $s13->addInt(1 << 20)->shiftRight(21); - $s14 = $s14->addInt64($carry13); - $s13 = $s13->subInt64($carry13->shiftLeft(21)); - $carry15 = $s15->addInt(1 << 20)->shiftRight(21); - $s16 = $s16->addInt64($carry15); - $s15 = $s15->subInt64($carry15->shiftLeft(21)); - $carry17 = $s17->addInt(1 << 20)->shiftRight(21); - $s18 = $s18->addInt64($carry17); - $s17 = $s17->subInt64($carry17->shiftLeft(21)); - $carry19 = $s19->addInt(1 << 20)->shiftRight(21); - $s20 = $s20->addInt64($carry19); - $s19 = $s19->subInt64($carry19->shiftLeft(21)); - $carry21 = $s21->addInt(1 << 20)->shiftRight(21); - $s22 = $s22->addInt64($carry21); - $s21 = $s21->subInt64($carry21->shiftLeft(21)); - - $s11 = $s11->addInt64($s23->mulInt(666643, 20)); - $s12 = $s12->addInt64($s23->mulInt(470296, 19)); - $s13 = $s13->addInt64($s23->mulInt(654183, 20)); - $s14 = $s14->subInt64($s23->mulInt(997805, 20)); - $s15 = $s15->addInt64($s23->mulInt(136657, 18)); - $s16 = $s16->subInt64($s23->mulInt(683901, 20)); - - $s10 = $s10->addInt64($s22->mulInt(666643, 20)); - $s11 = $s11->addInt64($s22->mulInt(470296, 19)); - $s12 = $s12->addInt64($s22->mulInt(654183, 20)); - $s13 = $s13->subInt64($s22->mulInt(997805, 20)); - $s14 = $s14->addInt64($s22->mulInt(136657, 18)); - $s15 = $s15->subInt64($s22->mulInt(683901, 20)); - - $s9 = $s9->addInt64($s21->mulInt(666643, 20)); - $s10 = $s10->addInt64($s21->mulInt(470296, 19)); - $s11 = $s11->addInt64($s21->mulInt(654183, 20)); - $s12 = $s12->subInt64($s21->mulInt(997805, 20)); - $s13 = $s13->addInt64($s21->mulInt(136657, 18)); - $s14 = $s14->subInt64($s21->mulInt(683901, 20)); - - $s8 = $s8->addInt64($s20->mulInt(666643, 20)); - $s9 = $s9->addInt64($s20->mulInt(470296, 19)); - $s10 = $s10->addInt64($s20->mulInt(654183, 20)); - $s11 = $s11->subInt64($s20->mulInt(997805, 20)); - $s12 = $s12->addInt64($s20->mulInt(136657, 18)); - $s13 = $s13->subInt64($s20->mulInt(683901, 20)); - - $s7 = $s7->addInt64($s19->mulInt(666643, 20)); - $s8 = $s8->addInt64($s19->mulInt(470296, 19)); - $s9 = $s9->addInt64($s19->mulInt(654183, 20)); - $s10 = $s10->subInt64($s19->mulInt(997805, 20)); - $s11 = $s11->addInt64($s19->mulInt(136657, 18)); - $s12 = $s12->subInt64($s19->mulInt(683901, 20)); - - $s6 = $s6->addInt64($s18->mulInt(666643, 20)); - $s7 = $s7->addInt64($s18->mulInt(470296, 19)); - $s8 = $s8->addInt64($s18->mulInt(654183, 20)); - $s9 = $s9->subInt64($s18->mulInt(997805, 20)); - $s10 = $s10->addInt64($s18->mulInt(136657, 18)); - $s11 = $s11->subInt64($s18->mulInt(683901, 20)); - - $carry6 = $s6->addInt(1 << 20)->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry8 = $s8->addInt(1 << 20)->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry10 = $s10->addInt(1 << 20)->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - $carry12 = $s12->addInt(1 << 20)->shiftRight(21); - $s13 = $s13->addInt64($carry12); - $s12 = $s12->subInt64($carry12->shiftLeft(21)); - $carry14 = $s14->addInt(1 << 20)->shiftRight(21); - $s15 = $s15->addInt64($carry14); - $s14 = $s14->subInt64($carry14->shiftLeft(21)); - $carry16 = $s16->addInt(1 << 20)->shiftRight(21); - $s17 = $s17->addInt64($carry16); - $s16 = $s16->subInt64($carry16->shiftLeft(21)); - - $carry7 = $s7->addInt(1 << 20)->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry9 = $s9->addInt(1 << 20)->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry11 = $s11->addInt(1 << 20)->shiftRight(21); - $s12 = $s12->addInt64($carry11); - $s11 = $s11->subInt64($carry11->shiftLeft(21)); - $carry13 = $s13->addInt(1 << 20)->shiftRight(21); - $s14 = $s14->addInt64($carry13); - $s13 = $s13->subInt64($carry13->shiftLeft(21)); - $carry15 = $s15->addInt(1 << 20)->shiftRight(21); - $s16 = $s16->addInt64($carry15); - $s15 = $s15->subInt64($carry15->shiftLeft(21)); - - $s5 = $s5->addInt64($s17->mulInt(666643, 20)); - $s6 = $s6->addInt64($s17->mulInt(470296, 19)); - $s7 = $s7->addInt64($s17->mulInt(654183, 20)); - $s8 = $s8->subInt64($s17->mulInt(997805, 20)); - $s9 = $s9->addInt64($s17->mulInt(136657, 18)); - $s10 = $s10->subInt64($s17->mulInt(683901, 20)); - - $s4 = $s4->addInt64($s16->mulInt(666643, 20)); - $s5 = $s5->addInt64($s16->mulInt(470296, 19)); - $s6 = $s6->addInt64($s16->mulInt(654183, 20)); - $s7 = $s7->subInt64($s16->mulInt(997805, 20)); - $s8 = $s8->addInt64($s16->mulInt(136657, 18)); - $s9 = $s9->subInt64($s16->mulInt(683901, 20)); - - $s3 = $s3->addInt64($s15->mulInt(666643, 20)); - $s4 = $s4->addInt64($s15->mulInt(470296, 19)); - $s5 = $s5->addInt64($s15->mulInt(654183, 20)); - $s6 = $s6->subInt64($s15->mulInt(997805, 20)); - $s7 = $s7->addInt64($s15->mulInt(136657, 18)); - $s8 = $s8->subInt64($s15->mulInt(683901, 20)); - - $s2 = $s2->addInt64($s14->mulInt(666643, 20)); - $s3 = $s3->addInt64($s14->mulInt(470296, 19)); - $s4 = $s4->addInt64($s14->mulInt(654183, 20)); - $s5 = $s5->subInt64($s14->mulInt(997805, 20)); - $s6 = $s6->addInt64($s14->mulInt(136657, 18)); - $s7 = $s7->subInt64($s14->mulInt(683901, 20)); - - $s1 = $s1->addInt64($s13->mulInt(666643, 20)); - $s2 = $s2->addInt64($s13->mulInt(470296, 19)); - $s3 = $s3->addInt64($s13->mulInt(654183, 20)); - $s4 = $s4->subInt64($s13->mulInt(997805, 20)); - $s5 = $s5->addInt64($s13->mulInt(136657, 18)); - $s6 = $s6->subInt64($s13->mulInt(683901, 20)); - - $s0 = $s0->addInt64($s12->mulInt(666643, 20)); - $s1 = $s1->addInt64($s12->mulInt(470296, 19)); - $s2 = $s2->addInt64($s12->mulInt(654183, 20)); - $s3 = $s3->subInt64($s12->mulInt(997805, 20)); - $s4 = $s4->addInt64($s12->mulInt(136657, 18)); - $s5 = $s5->subInt64($s12->mulInt(683901, 20)); - $s12 = new ParagonIE_Sodium_Core32_Int64(); - - $carry0 = $s0->addInt(1 << 20)->shiftRight(21); - $s1 = $s1->addInt64($carry0); - $s0 = $s0->subInt64($carry0->shiftLeft(21)); - $carry2 = $s2->addInt(1 << 20)->shiftRight(21); - $s3 = $s3->addInt64($carry2); - $s2 = $s2->subInt64($carry2->shiftLeft(21)); - $carry4 = $s4->addInt(1 << 20)->shiftRight(21); - $s5 = $s5->addInt64($carry4); - $s4 = $s4->subInt64($carry4->shiftLeft(21)); - $carry6 = $s6->addInt(1 << 20)->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry8 = $s8->addInt(1 << 20)->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry10 = $s10->addInt(1 << 20)->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - - $carry1 = $s1->addInt(1 << 20)->shiftRight(21); - $s2 = $s2->addInt64($carry1); - $s1 = $s1->subInt64($carry1->shiftLeft(21)); - $carry3 = $s3->addInt(1 << 20)->shiftRight(21); - $s4 = $s4->addInt64($carry3); - $s3 = $s3->subInt64($carry3->shiftLeft(21)); - $carry5 = $s5->addInt(1 << 20)->shiftRight(21); - $s6 = $s6->addInt64($carry5); - $s5 = $s5->subInt64($carry5->shiftLeft(21)); - $carry7 = $s7->addInt(1 << 20)->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry9 = $s9->addInt(1 << 20)->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry11 = $s11->addInt(1 << 20)->shiftRight(21); - $s12 = $s12->addInt64($carry11); - $s11 = $s11->subInt64($carry11->shiftLeft(21)); - - $s0 = $s0->addInt64($s12->mulInt(666643, 20)); - $s1 = $s1->addInt64($s12->mulInt(470296, 19)); - $s2 = $s2->addInt64($s12->mulInt(654183, 20)); - $s3 = $s3->subInt64($s12->mulInt(997805, 20)); - $s4 = $s4->addInt64($s12->mulInt(136657, 18)); - $s5 = $s5->subInt64($s12->mulInt(683901, 20)); - $s12 = new ParagonIE_Sodium_Core32_Int64(); - - $carry0 = $s0->shiftRight(21); - $s1 = $s1->addInt64($carry0); - $s0 = $s0->subInt64($carry0->shiftLeft(21)); - $carry1 = $s1->shiftRight(21); - $s2 = $s2->addInt64($carry1); - $s1 = $s1->subInt64($carry1->shiftLeft(21)); - $carry2 = $s2->shiftRight(21); - $s3 = $s3->addInt64($carry2); - $s2 = $s2->subInt64($carry2->shiftLeft(21)); - $carry3 = $s3->shiftRight(21); - $s4 = $s4->addInt64($carry3); - $s3 = $s3->subInt64($carry3->shiftLeft(21)); - $carry4 = $s4->shiftRight(21); - $s5 = $s5->addInt64($carry4); - $s4 = $s4->subInt64($carry4->shiftLeft(21)); - $carry5 = $s5->shiftRight(21); - $s6 = $s6->addInt64($carry5); - $s5 = $s5->subInt64($carry5->shiftLeft(21)); - $carry6 = $s6->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry7 = $s7->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry8 = $s8->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry9 = $s9->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry10 = $s10->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - $carry11 = $s11->shiftRight(21); - $s12 = $s12->addInt64($carry11); - $s11 = $s11->subInt64($carry11->shiftLeft(21)); - - $s0 = $s0->addInt64($s12->mulInt(666643, 20)); - $s1 = $s1->addInt64($s12->mulInt(470296, 19)); - $s2 = $s2->addInt64($s12->mulInt(654183, 20)); - $s3 = $s3->subInt64($s12->mulInt(997805, 20)); - $s4 = $s4->addInt64($s12->mulInt(136657, 18)); - $s5 = $s5->subInt64($s12->mulInt(683901, 20)); - - $carry0 = $s0->shiftRight(21); - $s1 = $s1->addInt64($carry0); - $s0 = $s0->subInt64($carry0->shiftLeft(21)); - $carry1 = $s1->shiftRight(21); - $s2 = $s2->addInt64($carry1); - $s1 = $s1->subInt64($carry1->shiftLeft(21)); - $carry2 = $s2->shiftRight(21); - $s3 = $s3->addInt64($carry2); - $s2 = $s2->subInt64($carry2->shiftLeft(21)); - $carry3 = $s3->shiftRight(21); - $s4 = $s4->addInt64($carry3); - $s3 = $s3->subInt64($carry3->shiftLeft(21)); - $carry4 = $s4->shiftRight(21); - $s5 = $s5->addInt64($carry4); - $s4 = $s4->subInt64($carry4->shiftLeft(21)); - $carry5 = $s5->shiftRight(21); - $s6 = $s6->addInt64($carry5); - $s5 = $s5->subInt64($carry5->shiftLeft(21)); - $carry6 = $s6->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry7 = $s7->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry8 = $s10->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry9 = $s9->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry10 = $s10->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - - $S0 = $s0->toInt(); - $S1 = $s1->toInt(); - $S2 = $s2->toInt(); - $S3 = $s3->toInt(); - $S4 = $s4->toInt(); - $S5 = $s5->toInt(); - $S6 = $s6->toInt(); - $S7 = $s7->toInt(); - $S8 = $s8->toInt(); - $S9 = $s9->toInt(); - $S10 = $s10->toInt(); - $S11 = $s11->toInt(); - - /** - * @var array - */ - $arr = array( - (int) (0xff & ($S0 >> 0)), - (int) (0xff & ($S0 >> 8)), - (int) (0xff & (($S0 >> 16) | ($S1 << 5))), - (int) (0xff & ($S1 >> 3)), - (int) (0xff & ($S1 >> 11)), - (int) (0xff & (($S1 >> 19) | ($S2 << 2))), - (int) (0xff & ($S2 >> 6)), - (int) (0xff & (($S2 >> 14) | ($S3 << 7))), - (int) (0xff & ($S3 >> 1)), - (int) (0xff & ($S3 >> 9)), - (int) (0xff & (($S3 >> 17) | ($S4 << 4))), - (int) (0xff & ($S4 >> 4)), - (int) (0xff & ($S4 >> 12)), - (int) (0xff & (($S4 >> 20) | ($S5 << 1))), - (int) (0xff & ($S5 >> 7)), - (int) (0xff & (($S5 >> 15) | ($S6 << 6))), - (int) (0xff & ($S6 >> 2)), - (int) (0xff & ($S6 >> 10)), - (int) (0xff & (($S6 >> 18) | ($S7 << 3))), - (int) (0xff & ($S7 >> 5)), - (int) (0xff & ($S7 >> 13)), - (int) (0xff & ($S8 >> 0)), - (int) (0xff & ($S8 >> 8)), - (int) (0xff & (($S8 >> 16) | ($S9 << 5))), - (int) (0xff & ($S9 >> 3)), - (int) (0xff & ($S9 >> 11)), - (int) (0xff & (($S9 >> 19) | ($S10 << 2))), - (int) (0xff & ($S10 >> 6)), - (int) (0xff & (($S10 >> 14) | ($S11 << 7))), - (int) (0xff & ($S11 >> 1)), - (int) (0xff & ($S11 >> 9)), - (int) (0xff & ($S11 >> 17)) - ); - return self::intArrayToString($arr); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $s - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sc_reduce($s) - { - /** - * @var ParagonIE_Sodium_Core32_Int64 $s0 - * @var ParagonIE_Sodium_Core32_Int64 $s1 - * @var ParagonIE_Sodium_Core32_Int64 $s2 - * @var ParagonIE_Sodium_Core32_Int64 $s3 - * @var ParagonIE_Sodium_Core32_Int64 $s4 - * @var ParagonIE_Sodium_Core32_Int64 $s5 - * @var ParagonIE_Sodium_Core32_Int64 $s6 - * @var ParagonIE_Sodium_Core32_Int64 $s7 - * @var ParagonIE_Sodium_Core32_Int64 $s8 - * @var ParagonIE_Sodium_Core32_Int64 $s9 - * @var ParagonIE_Sodium_Core32_Int64 $s10 - * @var ParagonIE_Sodium_Core32_Int64 $s11 - * @var ParagonIE_Sodium_Core32_Int64 $s12 - * @var ParagonIE_Sodium_Core32_Int64 $s13 - * @var ParagonIE_Sodium_Core32_Int64 $s14 - * @var ParagonIE_Sodium_Core32_Int64 $s15 - * @var ParagonIE_Sodium_Core32_Int64 $s16 - * @var ParagonIE_Sodium_Core32_Int64 $s17 - * @var ParagonIE_Sodium_Core32_Int64 $s18 - * @var ParagonIE_Sodium_Core32_Int64 $s19 - * @var ParagonIE_Sodium_Core32_Int64 $s20 - * @var ParagonIE_Sodium_Core32_Int64 $s21 - * @var ParagonIE_Sodium_Core32_Int64 $s22 - * @var ParagonIE_Sodium_Core32_Int64 $s23 - */ - $s0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 0, 3))); - $s1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5)); - $s2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2)); - $s3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7)); - $s4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4)); - $s5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1)); - $s6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6)); - $s7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3)); - $s8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 21, 3))); - $s9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5)); - $s10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2)); - $s11 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7)); - $s12 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4)); - $s13 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1)); - $s14 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6)); - $s15 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3)); - $s16 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 42, 3))); - $s17 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5)); - $s18 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2)); - $s19 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7)); - $s20 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4)); - $s21 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1)); - $s22 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6)); - $s23 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3)); - - $s11 = $s11->addInt64($s23->mulInt(666643, 20)); - $s12 = $s12->addInt64($s23->mulInt(470296, 19)); - $s13 = $s13->addInt64($s23->mulInt(654183, 20)); - $s14 = $s14->subInt64($s23->mulInt(997805, 20)); - $s15 = $s15->addInt64($s23->mulInt(136657, 18)); - $s16 = $s16->subInt64($s23->mulInt(683901, 20)); - - $s10 = $s10->addInt64($s22->mulInt(666643, 20)); - $s11 = $s11->addInt64($s22->mulInt(470296, 19)); - $s12 = $s12->addInt64($s22->mulInt(654183, 20)); - $s13 = $s13->subInt64($s22->mulInt(997805, 20)); - $s14 = $s14->addInt64($s22->mulInt(136657, 18)); - $s15 = $s15->subInt64($s22->mulInt(683901, 20)); - - $s9 = $s9->addInt64($s21->mulInt(666643, 20)); - $s10 = $s10->addInt64($s21->mulInt(470296, 19)); - $s11 = $s11->addInt64($s21->mulInt(654183, 20)); - $s12 = $s12->subInt64($s21->mulInt(997805, 20)); - $s13 = $s13->addInt64($s21->mulInt(136657, 18)); - $s14 = $s14->subInt64($s21->mulInt(683901, 20)); - - $s8 = $s8->addInt64($s20->mulInt(666643, 20)); - $s9 = $s9->addInt64($s20->mulInt(470296, 19)); - $s10 = $s10->addInt64($s20->mulInt(654183, 20)); - $s11 = $s11->subInt64($s20->mulInt(997805, 20)); - $s12 = $s12->addInt64($s20->mulInt(136657, 18)); - $s13 = $s13->subInt64($s20->mulInt(683901, 20)); - - $s7 = $s7->addInt64($s19->mulInt(666643, 20)); - $s8 = $s8->addInt64($s19->mulInt(470296, 19)); - $s9 = $s9->addInt64($s19->mulInt(654183, 20)); - $s10 = $s10->subInt64($s19->mulInt(997805, 20)); - $s11 = $s11->addInt64($s19->mulInt(136657, 18)); - $s12 = $s12->subInt64($s19->mulInt(683901, 20)); - - $s6 = $s6->addInt64($s18->mulInt(666643, 20)); - $s7 = $s7->addInt64($s18->mulInt(470296, 19)); - $s8 = $s8->addInt64($s18->mulInt(654183, 20)); - $s9 = $s9->subInt64($s18->mulInt(997805, 20)); - $s10 = $s10->addInt64($s18->mulInt(136657, 18)); - $s11 = $s11->subInt64($s18->mulInt(683901, 20)); - - $carry6 = $s6->addInt(1 << 20)->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry8 = $s8->addInt(1 << 20)->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry10 = $s10->addInt(1 << 20)->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - $carry12 = $s12->addInt(1 << 20)->shiftRight(21); - $s13 = $s13->addInt64($carry12); - $s12 = $s12->subInt64($carry12->shiftLeft(21)); - $carry14 = $s14->addInt(1 << 20)->shiftRight(21); - $s15 = $s15->addInt64($carry14); - $s14 = $s14->subInt64($carry14->shiftLeft(21)); - $carry16 = $s16->addInt(1 << 20)->shiftRight(21); - $s17 = $s17->addInt64($carry16); - $s16 = $s16->subInt64($carry16->shiftLeft(21)); - - $carry7 = $s7->addInt(1 << 20)->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry9 = $s9->addInt(1 << 20)->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry11 = $s11->addInt(1 << 20)->shiftRight(21); - $s12 = $s12->addInt64($carry11); - $s11 = $s11->subInt64($carry11->shiftLeft(21)); - $carry13 = $s13->addInt(1 << 20)->shiftRight(21); - $s14 = $s14->addInt64($carry13); - $s13 = $s13->subInt64($carry13->shiftLeft(21)); - $carry15 = $s15->addInt(1 << 20)->shiftRight(21); - $s16 = $s16->addInt64($carry15); - $s15 = $s15->subInt64($carry15->shiftLeft(21)); - - $s5 = $s5->addInt64($s17->mulInt(666643, 20)); - $s6 = $s6->addInt64($s17->mulInt(470296, 19)); - $s7 = $s7->addInt64($s17->mulInt(654183, 20)); - $s8 = $s8->subInt64($s17->mulInt(997805, 20)); - $s9 = $s9->addInt64($s17->mulInt(136657, 18)); - $s10 = $s10->subInt64($s17->mulInt(683901, 20)); - - $s4 = $s4->addInt64($s16->mulInt(666643, 20)); - $s5 = $s5->addInt64($s16->mulInt(470296, 19)); - $s6 = $s6->addInt64($s16->mulInt(654183, 20)); - $s7 = $s7->subInt64($s16->mulInt(997805, 20)); - $s8 = $s8->addInt64($s16->mulInt(136657, 18)); - $s9 = $s9->subInt64($s16->mulInt(683901, 20)); - - $s3 = $s3->addInt64($s15->mulInt(666643, 20)); - $s4 = $s4->addInt64($s15->mulInt(470296, 19)); - $s5 = $s5->addInt64($s15->mulInt(654183, 20)); - $s6 = $s6->subInt64($s15->mulInt(997805, 20)); - $s7 = $s7->addInt64($s15->mulInt(136657, 18)); - $s8 = $s8->subInt64($s15->mulInt(683901, 20)); - - $s2 = $s2->addInt64($s14->mulInt(666643, 20)); - $s3 = $s3->addInt64($s14->mulInt(470296, 19)); - $s4 = $s4->addInt64($s14->mulInt(654183, 20)); - $s5 = $s5->subInt64($s14->mulInt(997805, 20)); - $s6 = $s6->addInt64($s14->mulInt(136657, 18)); - $s7 = $s7->subInt64($s14->mulInt(683901, 20)); - - $s1 = $s1->addInt64($s13->mulInt(666643, 20)); - $s2 = $s2->addInt64($s13->mulInt(470296, 19)); - $s3 = $s3->addInt64($s13->mulInt(654183, 20)); - $s4 = $s4->subInt64($s13->mulInt(997805, 20)); - $s5 = $s5->addInt64($s13->mulInt(136657, 18)); - $s6 = $s6->subInt64($s13->mulInt(683901, 20)); - - $s0 = $s0->addInt64($s12->mulInt(666643, 20)); - $s1 = $s1->addInt64($s12->mulInt(470296, 19)); - $s2 = $s2->addInt64($s12->mulInt(654183, 20)); - $s3 = $s3->subInt64($s12->mulInt(997805, 20)); - $s4 = $s4->addInt64($s12->mulInt(136657, 18)); - $s5 = $s5->subInt64($s12->mulInt(683901, 20)); - $s12 = new ParagonIE_Sodium_Core32_Int64(); - - $carry0 = $s0->addInt(1 << 20)->shiftRight(21); - $s1 = $s1->addInt64($carry0); - $s0 = $s0->subInt64($carry0->shiftLeft(21)); - $carry2 = $s2->addInt(1 << 20)->shiftRight(21); - $s3 = $s3->addInt64($carry2); - $s2 = $s2->subInt64($carry2->shiftLeft(21)); - $carry4 = $s4->addInt(1 << 20)->shiftRight(21); - $s5 = $s5->addInt64($carry4); - $s4 = $s4->subInt64($carry4->shiftLeft(21)); - $carry6 = $s6->addInt(1 << 20)->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry8 = $s8->addInt(1 << 20)->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry10 = $s10->addInt(1 << 20)->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - $carry1 = $s1->addInt(1 << 20)->shiftRight(21); - $s2 = $s2->addInt64($carry1); - $s1 = $s1->subInt64($carry1->shiftLeft(21)); - $carry3 = $s3->addInt(1 << 20)->shiftRight(21); - $s4 = $s4->addInt64($carry3); - $s3 = $s3->subInt64($carry3->shiftLeft(21)); - $carry5 = $s5->addInt(1 << 20)->shiftRight(21); - $s6 = $s6->addInt64($carry5); - $s5 = $s5->subInt64($carry5->shiftLeft(21)); - $carry7 = $s7->addInt(1 << 20)->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry9 = $s9->addInt(1 << 20)->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry11 = $s11->addInt(1 << 20)->shiftRight(21); - $s12 = $s12->addInt64($carry11); - $s11 = $s11->subInt64($carry11->shiftLeft(21)); - - $s0 = $s0->addInt64($s12->mulInt(666643, 20)); - $s1 = $s1->addInt64($s12->mulInt(470296, 19)); - $s2 = $s2->addInt64($s12->mulInt(654183, 20)); - $s3 = $s3->subInt64($s12->mulInt(997805, 20)); - $s4 = $s4->addInt64($s12->mulInt(136657, 18)); - $s5 = $s5->subInt64($s12->mulInt(683901, 20)); - $s12 = new ParagonIE_Sodium_Core32_Int64(); - - $carry0 = $s0->shiftRight(21); - $s1 = $s1->addInt64($carry0); - $s0 = $s0->subInt64($carry0->shiftLeft(21)); - $carry1 = $s1->shiftRight(21); - $s2 = $s2->addInt64($carry1); - $s1 = $s1->subInt64($carry1->shiftLeft(21)); - $carry2 = $s2->shiftRight(21); - $s3 = $s3->addInt64($carry2); - $s2 = $s2->subInt64($carry2->shiftLeft(21)); - $carry3 = $s3->shiftRight(21); - $s4 = $s4->addInt64($carry3); - $s3 = $s3->subInt64($carry3->shiftLeft(21)); - $carry4 = $s4->shiftRight(21); - $s5 = $s5->addInt64($carry4); - $s4 = $s4->subInt64($carry4->shiftLeft(21)); - $carry5 = $s5->shiftRight(21); - $s6 = $s6->addInt64($carry5); - $s5 = $s5->subInt64($carry5->shiftLeft(21)); - $carry6 = $s6->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry7 = $s7->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry8 = $s8->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry9 = $s9->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry10 = $s10->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - $carry11 = $s11->shiftRight(21); - $s12 = $s12->addInt64($carry11); - $s11 = $s11->subInt64($carry11->shiftLeft(21)); - - $s0 = $s0->addInt64($s12->mulInt(666643, 20)); - $s1 = $s1->addInt64($s12->mulInt(470296, 19)); - $s2 = $s2->addInt64($s12->mulInt(654183, 20)); - $s3 = $s3->subInt64($s12->mulInt(997805, 20)); - $s4 = $s4->addInt64($s12->mulInt(136657, 18)); - $s5 = $s5->subInt64($s12->mulInt(683901, 20)); - - $carry0 = $s0->shiftRight(21); - $s1 = $s1->addInt64($carry0); - $s0 = $s0->subInt64($carry0->shiftLeft(21)); - $carry1 = $s1->shiftRight(21); - $s2 = $s2->addInt64($carry1); - $s1 = $s1->subInt64($carry1->shiftLeft(21)); - $carry2 = $s2->shiftRight(21); - $s3 = $s3->addInt64($carry2); - $s2 = $s2->subInt64($carry2->shiftLeft(21)); - $carry3 = $s3->shiftRight(21); - $s4 = $s4->addInt64($carry3); - $s3 = $s3->subInt64($carry3->shiftLeft(21)); - $carry4 = $s4->shiftRight(21); - $s5 = $s5->addInt64($carry4); - $s4 = $s4->subInt64($carry4->shiftLeft(21)); - $carry5 = $s5->shiftRight(21); - $s6 = $s6->addInt64($carry5); - $s5 = $s5->subInt64($carry5->shiftLeft(21)); - $carry6 = $s6->shiftRight(21); - $s7 = $s7->addInt64($carry6); - $s6 = $s6->subInt64($carry6->shiftLeft(21)); - $carry7 = $s7->shiftRight(21); - $s8 = $s8->addInt64($carry7); - $s7 = $s7->subInt64($carry7->shiftLeft(21)); - $carry8 = $s8->shiftRight(21); - $s9 = $s9->addInt64($carry8); - $s8 = $s8->subInt64($carry8->shiftLeft(21)); - $carry9 = $s9->shiftRight(21); - $s10 = $s10->addInt64($carry9); - $s9 = $s9->subInt64($carry9->shiftLeft(21)); - $carry10 = $s10->shiftRight(21); - $s11 = $s11->addInt64($carry10); - $s10 = $s10->subInt64($carry10->shiftLeft(21)); - - $S0 = $s0->toInt32()->toInt(); - $S1 = $s1->toInt32()->toInt(); - $S2 = $s2->toInt32()->toInt(); - $S3 = $s3->toInt32()->toInt(); - $S4 = $s4->toInt32()->toInt(); - $S5 = $s5->toInt32()->toInt(); - $S6 = $s6->toInt32()->toInt(); - $S7 = $s7->toInt32()->toInt(); - $S8 = $s8->toInt32()->toInt(); - $S9 = $s9->toInt32()->toInt(); - $S10 = $s10->toInt32()->toInt(); - $S11 = $s11->toInt32()->toInt(); - - /** - * @var array - */ - $arr = array( - (int) ($S0 >> 0), - (int) ($S0 >> 8), - (int) (($S0 >> 16) | ($S1 << 5)), - (int) ($S1 >> 3), - (int) ($S1 >> 11), - (int) (($S1 >> 19) | ($S2 << 2)), - (int) ($S2 >> 6), - (int) (($S2 >> 14) | ($S3 << 7)), - (int) ($S3 >> 1), - (int) ($S3 >> 9), - (int) (($S3 >> 17) | ($S4 << 4)), - (int) ($S4 >> 4), - (int) ($S4 >> 12), - (int) (($S4 >> 20) | ($S5 << 1)), - (int) ($S5 >> 7), - (int) (($S5 >> 15) | ($S6 << 6)), - (int) ($S6 >> 2), - (int) ($S6 >> 10), - (int) (($S6 >> 18) | ($S7 << 3)), - (int) ($S7 >> 5), - (int) ($S7 >> 13), - (int) ($S8 >> 0), - (int) ($S8 >> 8), - (int) (($S8 >> 16) | ($S9 << 5)), - (int) ($S9 >> 3), - (int) ($S9 >> 11), - (int) (($S9 >> 19) | ($S10 << 2)), - (int) ($S10 >> 6), - (int) (($S10 >> 14) | ($S11 << 7)), - (int) ($S11 >> 1), - (int) ($S11 >> 9), - (int) $S11 >> 17 - ); - return self::intArrayToString($arr); - } - - /** - * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493 - * - * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A - * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 - * @throws SodiumException - * @throws TypeError - */ - public static function ge_mul_l(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A) - { - /** @var array $aslide */ - $aslide = array( - 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, - 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, - 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 - ); - - /** @var array $Ai size 8 */ - $Ai = array(); - - # ge_p3_to_cached(&Ai[0], A); - $Ai[0] = self::ge_p3_to_cached($A); - # ge_p3_dbl(&t, A); - $t = self::ge_p3_dbl($A); - # ge_p1p1_to_p3(&A2, &t); - $A2 = self::ge_p1p1_to_p3($t); - - for ($i = 1; $i < 8; ++$i) { - # ge_add(&t, &A2, &Ai[0]); - $t = self::ge_add($A2, $Ai[$i - 1]); - # ge_p1p1_to_p3(&u, &t); - $u = self::ge_p1p1_to_p3($t); - # ge_p3_to_cached(&Ai[i], &u); - $Ai[$i] = self::ge_p3_to_cached($u); - } - - $r = self::ge_p3_0(); - for ($i = 252; $i >= 0; --$i) { - $t = self::ge_p3_dbl($r); - if ($aslide[$i] > 0) { - # ge_p1p1_to_p3(&u, &t); - $u = self::ge_p1p1_to_p3($t); - # ge_add(&t, &u, &Ai[aslide[i] / 2]); - $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]); - } elseif ($aslide[$i] < 0) { - # ge_p1p1_to_p3(&u, &t); - $u = self::ge_p1p1_to_p3($t); - # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); - $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]); - } - } - # ge_p1p1_to_p3(r, &t); - return self::ge_p1p1_to_p3($t); - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/Fe.php b/libs/sodium_compat/src/Core32/Curve25519/Fe.php deleted file mode 100644 index 5fe10f7..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/Fe.php +++ /dev/null @@ -1,185 +0,0 @@ - - */ - protected $container = array(); - - /** - * @var int - */ - protected $size = 10; - - /** - * @internal You should not use this directly from another application - * - * @param array $array - * @param bool $save_indexes - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromArray($array, $save_indexes = null) - { - $count = count($array); - if ($save_indexes) { - $keys = array_keys($array); - } else { - $keys = range(0, $count - 1); - } - $array = array_values($array); - - $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - if ($save_indexes) { - for ($i = 0; $i < $count; ++$i) { - $array[$i]->overflow = 0; - $obj->offsetSet($keys[$i], $array[$i]); - } - } else { - for ($i = 0; $i < $count; ++$i) { - $array[$i]->overflow = 0; - $obj->offsetSet($i, $array[$i]); - } - } - return $obj; - } - - /** - * @internal You should not use this directly from another application - * - * @param array $array - * @param bool $save_indexes - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromIntArray($array, $save_indexes = null) - { - $count = count($array); - if ($save_indexes) { - $keys = array_keys($array); - } else { - $keys = range(0, $count - 1); - } - $array = array_values($array); - $set = array(); - /** @var int $i */ - /** @var int $v */ - foreach ($array as $i => $v) { - $set[$i] = ParagonIE_Sodium_Core32_Int32::fromInt($v); - } - - $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - if ($save_indexes) { - for ($i = 0; $i < $count; ++$i) { - $set[$i]->overflow = 0; - $obj->offsetSet($keys[$i], $set[$i]); - } - } else { - for ($i = 0; $i < $count; ++$i) { - $set[$i]->overflow = 0; - $obj->offsetSet($i, $set[$i]); - } - } - return $obj; - } - - /** - * @internal You should not use this directly from another application - * - * @param mixed $offset - * @param mixed $value - * @return void - * @throws SodiumException - * @throws TypeError - */ - public function offsetSet($offset, $value) - { - if (!($value instanceof ParagonIE_Sodium_Core32_Int32)) { - throw new InvalidArgumentException('Expected an instance of ParagonIE_Sodium_Core32_Int32'); - } - if (is_null($offset)) { - $this->container[] = $value; - } else { - ParagonIE_Sodium_Core32_Util::declareScalarType($offset, 'int', 1); - $this->container[(int) $offset] = $value; - } - } - - /** - * @internal You should not use this directly from another application - * - * @param mixed $offset - * @return bool - * @psalm-suppress MixedArrayOffset - */ - public function offsetExists($offset) - { - return isset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param mixed $offset - * @return void - * @psalm-suppress MixedArrayOffset - */ - public function offsetUnset($offset) - { - unset($this->container[$offset]); - } - - /** - * @internal You should not use this directly from another application - * - * @param mixed $offset - * @return ParagonIE_Sodium_Core32_Int32 - * @psalm-suppress MixedArrayOffset - */ - public function offsetGet($offset) - { - if (!isset($this->container[$offset])) { - $this->container[(int) $offset] = new ParagonIE_Sodium_Core32_Int32(); - } - /** @var ParagonIE_Sodium_Core32_Int32 $get */ - $get = $this->container[$offset]; - return $get; - } - - /** - * @internal You should not use this directly from another application - * - * @return array - */ - public function __debugInfo() - { - if (empty($this->container)) { - return array(); - } - $c = array( - (int) ($this->container[0]->toInt()), - (int) ($this->container[1]->toInt()), - (int) ($this->container[2]->toInt()), - (int) ($this->container[3]->toInt()), - (int) ($this->container[4]->toInt()), - (int) ($this->container[5]->toInt()), - (int) ($this->container[6]->toInt()), - (int) ($this->container[7]->toInt()), - (int) ($this->container[8]->toInt()), - (int) ($this->container[9]->toInt()) - ); - return array(implode(', ', $c)); - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/Ge/Cached.php b/libs/sodium_compat/src/Core32/Curve25519/Ge/Cached.php deleted file mode 100644 index 970481f..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/Ge/Cached.php +++ /dev/null @@ -1,65 +0,0 @@ -YplusX = $YplusX; - if ($YminusX === null) { - $YminusX = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->YminusX = $YminusX; - if ($Z === null) { - $Z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->Z = $Z; - if ($T2d === null) { - $T2d = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->T2d = $T2d; - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/Ge/P1p1.php b/libs/sodium_compat/src/Core32/Curve25519/Ge/P1p1.php deleted file mode 100644 index ff10b1d..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/Ge/P1p1.php +++ /dev/null @@ -1,67 +0,0 @@ -X = $x; - if ($y === null) { - $y = ParagonIE_Sodium_Core32_Curve25519::fe_0(); - } - $this->Y = $y; - if ($z === null) { - $z = ParagonIE_Sodium_Core32_Curve25519::fe_0(); - } - $this->Z = $z; - if ($t === null) { - $t = ParagonIE_Sodium_Core32_Curve25519::fe_0(); - } - $this->T = $t; - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/Ge/P2.php b/libs/sodium_compat/src/Core32/Curve25519/Ge/P2.php deleted file mode 100644 index 8a45a91..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/Ge/P2.php +++ /dev/null @@ -1,54 +0,0 @@ -X = $x; - if ($y === null) { - $y = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->Y = $y; - if ($z === null) { - $z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->Z = $z; - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/Ge/P3.php b/libs/sodium_compat/src/Core32/Curve25519/Ge/P3.php deleted file mode 100644 index c9e4b16..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/Ge/P3.php +++ /dev/null @@ -1,65 +0,0 @@ -X = $x; - if ($y === null) { - $y = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->Y = $y; - if ($z === null) { - $z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->Z = $z; - if ($t === null) { - $t = new ParagonIE_Sodium_Core32_Curve25519_Fe(); - } - $this->T = $t; - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/Ge/Precomp.php b/libs/sodium_compat/src/Core32/Curve25519/Ge/Precomp.php deleted file mode 100644 index b590b75..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/Ge/Precomp.php +++ /dev/null @@ -1,56 +0,0 @@ -yplusx = $yplusx; - if ($yminusx === null) { - $yminusx = ParagonIE_Sodium_Core32_Curve25519::fe_0(); - } - $this->yminusx = $yminusx; - if ($xy2d === null) { - $xy2d = ParagonIE_Sodium_Core32_Curve25519::fe_0(); - } - $this->xy2d = $xy2d; - } -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/H.php b/libs/sodium_compat/src/Core32/Curve25519/H.php deleted file mode 100644 index 48c999a..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/H.php +++ /dev/null @@ -1,1467 +0,0 @@ ->>> Basically, int[32][8][3][10] - */ - protected static $base = array( - array( - array( - array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), - array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), - array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), - ), - array( - array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303), - array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081), - array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697), - ), - array( - array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), - array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), - array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), - ), - array( - array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540), - array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397), - array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325), - ), - array( - array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), - array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), - array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), - ), - array( - array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777), - array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737), - array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652), - ), - array( - array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), - array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), - array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), - ), - array( - array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726), - array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955), - array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425), - ), - ), - array( - array( - array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171), - array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510), - array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660), - ), - array( - array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639), - array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963), - array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950), - ), - array( - array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568), - array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335), - array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628), - ), - array( - array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007), - array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772), - array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653), - ), - array( - array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567), - array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686), - array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372), - ), - array( - array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887), - array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954), - array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953), - ), - array( - array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833), - array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532), - array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876), - ), - array( - array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268), - array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214), - array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038), - ), - ), - array( - array( - array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800), - array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645), - array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664), - ), - array( - array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933), - array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182), - array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222), - ), - array( - array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991), - array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880), - array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092), - ), - array( - array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295), - array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788), - array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553), - ), - array( - array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026), - array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347), - array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033), - ), - array( - array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395), - array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278), - array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890), - ), - array( - array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995), - array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596), - array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891), - ), - array( - array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060), - array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608), - array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606), - ), - ), - array( - array( - array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389), - array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016), - array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341), - ), - array( - array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505), - array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553), - array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655), - ), - array( - array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220), - array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631), - array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099), - ), - array( - array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556), - array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749), - array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930), - ), - array( - array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391), - array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253), - array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066), - ), - array( - array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958), - array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082), - array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383), - ), - array( - array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521), - array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807), - array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948), - ), - array( - array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134), - array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455), - array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629), - ), - ), - array( - array( - array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069), - array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746), - array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919), - ), - array( - array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837), - array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906), - array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771), - ), - array( - array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817), - array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098), - array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409), - ), - array( - array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504), - array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727), - array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420), - ), - array( - array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003), - array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605), - array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384), - ), - array( - array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701), - array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683), - array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708), - ), - array( - array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563), - array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260), - array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387), - ), - array( - array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672), - array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686), - array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665), - ), - ), - array( - array( - array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182), - array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277), - array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628), - ), - array( - array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474), - array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539), - array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822), - ), - array( - array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970), - array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756), - array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508), - ), - array( - array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683), - array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655), - array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158), - ), - array( - array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125), - array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839), - array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664), - ), - array( - array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294), - array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899), - array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070), - ), - array( - array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294), - array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949), - array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083), - ), - array( - array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420), - array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940), - array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396), - ), - ), - array( - array( - array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567), - array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127), - array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294), - ), - array( - array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887), - array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964), - array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195), - ), - array( - array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244), - array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999), - array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762), - ), - array( - array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274), - array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236), - array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605), - ), - array( - array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761), - array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884), - array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482), - ), - array( - array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638), - array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490), - array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170), - ), - array( - array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736), - array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124), - array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392), - ), - array( - array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029), - array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048), - array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958), - ), - ), - array( - array( - array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593), - array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071), - array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692), - ), - array( - array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687), - array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441), - array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001), - ), - array( - array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460), - array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007), - array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762), - ), - array( - array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005), - array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674), - array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035), - ), - array( - array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590), - array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957), - array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812), - ), - array( - array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740), - array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122), - array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158), - ), - array( - array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885), - array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140), - array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857), - ), - array( - array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155), - array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260), - array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483), - ), - ), - array( - array( - array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677), - array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815), - array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751), - ), - array( - array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203), - array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208), - array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230), - ), - array( - array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850), - array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389), - array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968), - ), - array( - array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689), - array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880), - array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304), - ), - array( - array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632), - array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412), - array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566), - ), - array( - array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038), - array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232), - array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943), - ), - array( - array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856), - array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738), - array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971), - ), - array( - array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718), - array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697), - array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883), - ), - ), - array( - array( - array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912), - array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358), - array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849), - ), - array( - array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307), - array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977), - array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335), - ), - array( - array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644), - array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616), - array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735), - ), - array( - array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099), - array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341), - array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336), - ), - array( - array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646), - array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425), - array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388), - ), - array( - array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743), - array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822), - array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462), - ), - array( - array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985), - array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702), - array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797), - ), - array( - array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293), - array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100), - array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688), - ), - ), - array( - array( - array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186), - array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610), - array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707), - ), - array( - array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220), - array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025), - array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044), - ), - array( - array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992), - array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027), - array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197), - ), - array( - array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901), - array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952), - array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878), - ), - array( - array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390), - array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730), - array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730), - ), - array( - array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180), - array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272), - array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715), - ), - array( - array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970), - array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772), - array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865), - ), - array( - array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750), - array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373), - array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348), - ), - ), - array( - array( - array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144), - array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195), - array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086), - ), - array( - array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684), - array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518), - array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233), - ), - array( - array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793), - array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794), - array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435), - ), - array( - array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921), - array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518), - array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563), - ), - array( - array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278), - array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024), - array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030), - ), - array( - array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783), - array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717), - array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844), - ), - array( - array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333), - array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048), - array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760), - ), - array( - array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760), - array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757), - array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112), - ), - ), - array( - array( - array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468), - array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184), - array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289), - ), - array( - array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066), - array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882), - array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226), - ), - array( - array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101), - array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279), - array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811), - ), - array( - array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709), - array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714), - array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121), - ), - array( - array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464), - array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847), - array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400), - ), - array( - array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414), - array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158), - array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045), - ), - array( - array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415), - array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459), - array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079), - ), - array( - array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412), - array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743), - array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836), - ), - ), - array( - array( - array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022), - array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429), - array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065), - ), - array( - array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861), - array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000), - array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101), - ), - array( - array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815), - array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642), - array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966), - ), - array( - array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574), - array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742), - array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689), - ), - array( - array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020), - array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772), - array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982), - ), - array( - array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953), - array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218), - array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265), - ), - array( - array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073), - array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325), - array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798), - ), - array( - array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870), - array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863), - array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927), - ), - ), - array( - array( - array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267), - array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663), - array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862), - ), - array( - array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673), - array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943), - array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020), - ), - array( - array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238), - array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064), - array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795), - ), - array( - array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052), - array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904), - array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531), - ), - array( - array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979), - array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841), - array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431), - ), - array( - array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324), - array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940), - array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320), - ), - array( - array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184), - array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114), - array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878), - ), - array( - array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784), - array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091), - array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585), - ), - ), - array( - array( - array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208), - array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864), - array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661), - ), - array( - array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233), - array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212), - array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525), - ), - array( - array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068), - array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397), - array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988), - ), - array( - array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889), - array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038), - array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697), - ), - array( - array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875), - array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905), - array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656), - ), - array( - array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818), - array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714), - array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203), - ), - array( - array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931), - array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024), - array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084), - ), - array( - array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204), - array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817), - array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667), - ), - ), - array( - array( - array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504), - array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768), - array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255), - ), - array( - array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790), - array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438), - array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333), - ), - array( - array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971), - array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905), - array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409), - ), - array( - array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409), - array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499), - array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363), - ), - array( - array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664), - array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324), - array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940), - ), - array( - array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990), - array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914), - array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290), - ), - array( - array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257), - array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433), - array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236), - ), - array( - array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045), - array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093), - array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347), - ), - ), - array( - array( - array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191), - array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507), - array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906), - ), - array( - array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018), - array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109), - array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926), - ), - array( - array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528), - array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625), - array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286), - ), - array( - array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033), - array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866), - array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896), - ), - array( - array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075), - array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347), - array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437), - ), - array( - array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165), - array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588), - array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193), - ), - array( - array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017), - array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883), - array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961), - ), - array( - array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043), - array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663), - array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362), - ), - ), - array( - array( - array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860), - array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466), - array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063), - ), - array( - array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997), - array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295), - array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369), - ), - array( - array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385), - array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109), - array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906), - ), - array( - array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424), - array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185), - array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962), - ), - array( - array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325), - array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593), - array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404), - ), - array( - array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644), - array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801), - array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804), - ), - array( - array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884), - array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577), - array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849), - ), - array( - array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473), - array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644), - array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319), - ), - ), - array( - array( - array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599), - array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768), - array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084), - ), - array( - array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328), - array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369), - array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920), - ), - array( - array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815), - array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025), - array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397), - ), - array( - array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448), - array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981), - array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165), - ), - array( - array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501), - array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073), - array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861), - ), - array( - array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845), - array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211), - array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870), - ), - array( - array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096), - array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803), - array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168), - ), - array( - array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965), - array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505), - array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598), - ), - ), - array( - array( - array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782), - array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900), - array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479), - ), - array( - array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208), - array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232), - array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719), - ), - array( - array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271), - array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326), - array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132), - ), - array( - array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300), - array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570), - array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670), - ), - array( - array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994), - array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913), - array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317), - ), - array( - array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730), - array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096), - array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078), - ), - array( - array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411), - array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905), - array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654), - ), - array( - array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870), - array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498), - array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579), - ), - ), - array( - array( - array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677), - array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647), - array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743), - ), - array( - array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468), - array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375), - array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155), - ), - array( - array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725), - array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612), - array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943), - ), - array( - array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944), - array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928), - array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406), - ), - array( - array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139), - array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963), - array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693), - ), - array( - array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734), - array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680), - array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410), - ), - array( - array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931), - array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654), - array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710), - ), - array( - array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180), - array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684), - array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895), - ), - ), - array( - array( - array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501), - array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413), - array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880), - ), - array( - array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874), - array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962), - array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899), - ), - array( - array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152), - array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063), - array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080), - ), - array( - array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146), - array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183), - array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133), - ), - array( - array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421), - array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622), - array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197), - ), - array( - array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663), - array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753), - array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755), - ), - array( - array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862), - array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118), - array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171), - ), - array( - array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380), - array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824), - array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270), - ), - ), - array( - array( - array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438), - array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584), - array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562), - ), - array( - array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471), - array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610), - array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269), - ), - array( - array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650), - array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369), - array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461), - ), - array( - array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462), - array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793), - array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218), - ), - array( - array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226), - array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019), - array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037), - ), - array( - array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171), - array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132), - array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841), - ), - array( - array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181), - array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210), - array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040), - ), - array( - array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935), - array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105), - array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814), - ), - ), - array( - array( - array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852), - array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581), - array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646), - ), - array( - array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844), - array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025), - array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453), - ), - array( - array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068), - array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192), - array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921), - ), - array( - array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259), - array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426), - array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072), - ), - array( - array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305), - array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832), - array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943), - ), - array( - array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011), - array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447), - array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494), - ), - array( - array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245), - array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859), - array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915), - ), - array( - array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707), - array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848), - array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224), - ), - ), - array( - array( - array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391), - array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215), - array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101), - ), - array( - array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713), - array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849), - array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930), - ), - array( - array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940), - array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031), - array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404), - ), - array( - array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243), - array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116), - array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525), - ), - array( - array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509), - array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883), - array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865), - ), - array( - array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660), - array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273), - array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138), - ), - array( - array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560), - array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135), - array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941), - ), - array( - array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739), - array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756), - array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819), - ), - ), - array( - array( - array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347), - array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028), - array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075), - ), - array( - array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799), - array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609), - array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817), - ), - array( - array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989), - array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523), - array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278), - ), - array( - array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045), - array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377), - array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480), - ), - array( - array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016), - array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426), - array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525), - ), - array( - array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396), - array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080), - array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892), - ), - array( - array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275), - array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074), - array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140), - ), - array( - array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717), - array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101), - array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127), - ), - ), - array( - array( - array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632), - array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415), - array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160), - ), - array( - array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876), - array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625), - array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478), - ), - array( - array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164), - array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595), - array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248), - ), - array( - array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858), - array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193), - array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184), - ), - array( - array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942), - array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635), - array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948), - ), - array( - array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935), - array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415), - array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416), - ), - array( - array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018), - array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778), - array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659), - ), - array( - array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385), - array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503), - array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329), - ), - ), - array( - array( - array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056), - array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838), - array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948), - ), - array( - array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691), - array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118), - array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517), - ), - array( - array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269), - array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904), - array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589), - ), - array( - array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193), - array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910), - array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930), - ), - array( - array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667), - array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481), - array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876), - ), - array( - array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640), - array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278), - array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112), - ), - array( - array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272), - array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012), - array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221), - ), - array( - array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046), - array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345), - array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310), - ), - ), - array( - array( - array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937), - array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636), - array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008), - ), - array( - array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429), - array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576), - array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066), - ), - array( - array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490), - array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104), - array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053), - ), - array( - array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275), - array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511), - array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095), - ), - array( - array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439), - array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939), - array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424), - ), - array( - array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310), - array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608), - array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079), - ), - array( - array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101), - array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418), - array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576), - ), - array( - array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356), - array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996), - array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099), - ), - ), - array( - array( - array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728), - array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658), - array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242), - ), - array( - array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001), - array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766), - array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373), - ), - array( - array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458), - array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628), - array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657), - ), - array( - array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062), - array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616), - array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014), - ), - array( - array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383), - array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814), - array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718), - ), - array( - array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417), - array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222), - array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444), - ), - array( - array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597), - array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970), - array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799), - ), - array( - array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647), - array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511), - array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032), - ), - ), - array( - array( - array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834), - array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461), - array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062), - ), - array( - array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516), - array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547), - array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240), - ), - array( - array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038), - array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741), - array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103), - ), - array( - array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747), - array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323), - array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016), - ), - array( - array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373), - array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228), - array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141), - ), - array( - array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399), - array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831), - array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376), - ), - array( - array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313), - array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958), - array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577), - ), - array( - array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743), - array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684), - array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476), - ), - ) - ); - - /** - * See: libsodium's crypto_core/curve25519/ref10/base2.h - * - * @var array>> basically int[8][3] - */ - protected static $base2 = array( - array( - array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), - array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), - array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), - ), - array( - array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), - array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), - array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), - ), - array( - array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), - array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), - array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), - ), - array( - array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), - array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), - array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), - ), - array( - array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877), - array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951), - array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784), - ), - array( - array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436), - array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918), - array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877), - ), - array( - array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800), - array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305), - array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300), - ), - array( - array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876), - array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619), - array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683), - ) - ); - - /** - * 37095705934669439343138083508754565189542113879843219016388785533085940283555 - * - * @var array - */ - protected static $d = array( - -10913610, - 13857413, - -15372611, - 6949391, - 114729, - -8787816, - -6275908, - -3247719, - -18696448, - -12055116 - ); - - /** - * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161 - * - * @var array - */ - protected static $d2 = array( - -21827239, - -5839606, - -30745221, - 13898782, - 229458, - 15978800, - -12551817, - -6495438, - 29715968, - 9444199 - ); - - /** - * sqrt(-1) - * - * @var array - */ - protected static $sqrtm1 = array( - -32595792, - -7943725, - 9377950, - 3500415, - 12389472, - -272473, - -25146209, - -2005654, - 326686, - 11406482 - ); -} diff --git a/libs/sodium_compat/src/Core32/Curve25519/README.md b/libs/sodium_compat/src/Core32/Curve25519/README.md deleted file mode 100644 index e8097fa..0000000 --- a/libs/sodium_compat/src/Core32/Curve25519/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Curve25519 Data Structures - -These are PHP implementation of the [structs used in the ref10 curve25519 code](https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/private/curve25519_ref10.h). diff --git a/libs/sodium_compat/src/Core32/Ed25519.php b/libs/sodium_compat/src/Core32/Ed25519.php deleted file mode 100644 index 927d11e..0000000 --- a/libs/sodium_compat/src/Core32/Ed25519.php +++ /dev/null @@ -1,481 +0,0 @@ -X)) { - throw new SodiumException('Unexpected zero result'); - } - - # fe_1(one_minus_y); - # fe_sub(one_minus_y, one_minus_y, A.Y); - # fe_invert(one_minus_y, one_minus_y); - $one_minux_y = self::fe_invert( - self::fe_sub( - self::fe_1(), - $A->Y - ) - ); - - - # fe_1(x); - # fe_add(x, x, A.Y); - # fe_mul(x, x, one_minus_y); - $x = self::fe_mul( - self::fe_add(self::fe_1(), $A->Y), - $one_minux_y - ); - - # fe_tobytes(curve25519_pk, x); - return self::fe_tobytes($x); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sk_to_pk($sk) - { - return self::ge_p3_tobytes( - self::ge_scalarmult_base( - self::substr($sk, 0, 32) - ) - ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign($message, $sk) - { - /** @var string $signature */ - $signature = self::sign_detached($message, $sk); - return $signature . $message; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message A signed message - * @param string $pk Public key - * @return string Message (without signature) - * @throws SodiumException - * @throws TypeError - */ - public static function sign_open($message, $pk) - { - /** @var string $signature */ - $signature = self::substr($message, 0, 64); - - /** @var string $message */ - $message = self::substr($message, 64); - - if (self::verify_detached($signature, $message, $pk)) { - return $message; - } - throw new SodiumException('Invalid signature'); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign_detached($message, $sk) - { - # crypto_hash_sha512(az, sk, 32); - $az = hash('sha512', self::substr($sk, 0, 32), true); - - # az[0] &= 248; - # az[31] &= 63; - # az[31] |= 64; - $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); - $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); - - # crypto_hash_sha512_init(&hs); - # crypto_hash_sha512_update(&hs, az + 32, 32); - # crypto_hash_sha512_update(&hs, m, mlen); - # crypto_hash_sha512_final(&hs, nonce); - $hs = hash_init('sha512'); - hash_update($hs, self::substr($az, 32, 32)); - hash_update($hs, $message); - $nonceHash = hash_final($hs, true); - - # memmove(sig + 32, sk + 32, 32); - $pk = self::substr($sk, 32, 32); - - # sc_reduce(nonce); - # ge_scalarmult_base(&R, nonce); - # ge_p3_tobytes(sig, &R); - $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32); - $sig = self::ge_p3_tobytes( - self::ge_scalarmult_base($nonce) - ); - - # crypto_hash_sha512_init(&hs); - # crypto_hash_sha512_update(&hs, sig, 64); - # crypto_hash_sha512_update(&hs, m, mlen); - # crypto_hash_sha512_final(&hs, hram); - $hs = hash_init('sha512'); - hash_update($hs, self::substr($sig, 0, 32)); - hash_update($hs, self::substr($pk, 0, 32)); - hash_update($hs, $message); - $hramHash = hash_final($hs, true); - - # sc_reduce(hram); - # sc_muladd(sig + 32, hram, az, nonce); - $hram = self::sc_reduce($hramHash); - $sigAfter = self::sc_muladd($hram, $az, $nonce); - $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); - - try { - ParagonIE_Sodium_Compat::memzero($az); - } catch (SodiumException $ex) { - $az = null; - } - return $sig; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $sig - * @param string $message - * @param string $pk - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function verify_detached($sig, $message, $pk) - { - if (self::strlen($sig) < 64) { - throw new SodiumException('Signature is too short'); - } - if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) { - throw new SodiumException('S < L - Invalid signature'); - } - if (self::small_order($sig)) { - throw new SodiumException('Signature is on too small of an order'); - } - if ((self::chrToInt($sig[63]) & 224) !== 0) { - throw new SodiumException('Invalid signature'); - } - $d = 0; - for ($i = 0; $i < 32; ++$i) { - $d |= self::chrToInt($pk[$i]); - } - if ($d === 0) { - throw new SodiumException('All zero public key'); - } - - /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ - $orig = ParagonIE_Sodium_Compat::$fastMult; - - // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. - ParagonIE_Sodium_Compat::$fastMult = true; - - /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */ - $A = self::ge_frombytes_negate_vartime($pk); - - /** @var string $hDigest */ - $hDigest = hash( - 'sha512', - self::substr($sig, 0, 32) . - self::substr($pk, 0, 32) . - $message, - true - ); - - /** @var string $h */ - $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32); - - /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */ - $R = self::ge_double_scalarmult_vartime( - $h, - $A, - self::substr($sig, 32) - ); - - /** @var string $rcheck */ - $rcheck = self::ge_tobytes($R); - - // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. - ParagonIE_Sodium_Compat::$fastMult = $orig; - - return self::verify_32($rcheck, self::substr($sig, 0, 32)); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $S - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function check_S_lt_L($S) - { - if (self::strlen($S) < 32) { - throw new SodiumException('Signature must be 32 bytes'); - } - static $L = array( - 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, - 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 - ); - /** @var array $L */ - $c = 0; - $n = 1; - $i = 32; - - do { - --$i; - $x = self::chrToInt($S[$i]); - $c |= ( - (($x - $L[$i]) >> 8) & $n - ); - $n &= ( - (($x ^ $L[$i]) - 1) >> 8 - ); - } while ($i !== 0); - - return $c === 0; - } - - /** - * @param string $R - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function small_order($R) - { - static $blocklist = array( - /* 0 (order 4) */ - array( - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ), - /* 1 (order 1) */ - array( - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ), - /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ - array( - 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, - 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, - 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, - 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 - ), - /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ - array( - 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, - 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, - 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, - 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a - ), - /* p-1 (order 2) */ - array( - 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, - 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, - 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, - 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 - ), - /* p (order 4) */ - array( - 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, - 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, - 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, - 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa - ), - /* p+1 (order 1) */ - array( - 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f - ), - /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ - array( - 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f - ), - /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ - array( - 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f - ), - /* 2p-1 (order 2) */ - array( - 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - ), - /* 2p (order 4) */ - array( - 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - ), - /* 2p+1 (order 1) */ - array( - 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - ) - ); - /** @var array> $blocklist */ - $countBlocklist = count($blocklist); - - for ($i = 0; $i < $countBlocklist; ++$i) { - $c = 0; - for ($j = 0; $j < 32; ++$j) { - $c |= self::chrToInt($R[$j]) ^ $blocklist[$i][$j]; - } - if ($c === 0) { - return true; - } - } - return false; - } -} diff --git a/libs/sodium_compat/src/Core32/HChaCha20.php b/libs/sodium_compat/src/Core32/HChaCha20.php deleted file mode 100644 index 551d995..0000000 --- a/libs/sodium_compat/src/Core32/HChaCha20.php +++ /dev/null @@ -1,127 +0,0 @@ -toReverseString() . - $x1->toReverseString() . - $x2->toReverseString() . - $x3->toReverseString() . - $x12->toReverseString() . - $x13->toReverseString() . - $x14->toReverseString() . - $x15->toReverseString(); - } -} diff --git a/libs/sodium_compat/src/Core32/HSalsa20.php b/libs/sodium_compat/src/Core32/HSalsa20.php deleted file mode 100644 index 39287f2..0000000 --- a/libs/sodium_compat/src/Core32/HSalsa20.php +++ /dev/null @@ -1,141 +0,0 @@ - 0; $i -= 2) { - $x4 = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7)); - $x8 = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9)); - $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13)); - $x0 = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18)); - - $x9 = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7)); - $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9)); - $x1 = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13)); - $x5 = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18)); - - $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7)); - $x2 = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9)); - $x6 = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13)); - $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18)); - - $x3 = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7)); - $x7 = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9)); - $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13)); - $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18)); - - $x1 = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7)); - $x2 = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9)); - $x3 = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13)); - $x0 = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18)); - - $x6 = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7)); - $x7 = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9)); - $x4 = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13)); - $x5 = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18)); - - $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7)); - $x8 = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9)); - $x9 = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13)); - $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18)); - - $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7)); - $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9)); - $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13)); - $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18)); - } - - return $x0->toReverseString() . - $x5->toReverseString() . - $x10->toReverseString() . - $x15->toReverseString() . - $x6->toReverseString() . - $x7->toReverseString() . - $x8->toReverseString() . - $x9->toReverseString(); - } -} diff --git a/libs/sodium_compat/src/Core32/Int32.php b/libs/sodium_compat/src/Core32/Int32.php deleted file mode 100644 index c3a1790..0000000 --- a/libs/sodium_compat/src/Core32/Int32.php +++ /dev/null @@ -1,871 +0,0 @@ - - two 16-bit integers - * - * 0 is the higher 16 bits - * 1 is the lower 16 bits - */ - public $limbs = array(0, 0); - - /** - * @var int - */ - public $overflow = 0; - - /** - * @var bool - */ - public $unsignedInt = false; - - /** - * ParagonIE_Sodium_Core32_Int32 constructor. - * @param array $array - * @param bool $unsignedInt - */ - public function __construct($array = array(0, 0), $unsignedInt = false) - { - $this->limbs = array( - (int) $array[0], - (int) $array[1] - ); - $this->overflow = 0; - $this->unsignedInt = $unsignedInt; - } - - /** - * Adds two int32 objects - * - * @param ParagonIE_Sodium_Core32_Int32 $addend - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function addInt32(ParagonIE_Sodium_Core32_Int32 $addend) - { - $i0 = $this->limbs[0]; - $i1 = $this->limbs[1]; - $j0 = $addend->limbs[0]; - $j1 = $addend->limbs[1]; - - $r1 = $i1 + ($j1 & 0xffff); - $carry = $r1 >> 16; - - $r0 = $i0 + ($j0 & 0xffff) + $carry; - $carry = $r0 >> 16; - - $r0 &= 0xffff; - $r1 &= 0xffff; - - $return = new ParagonIE_Sodium_Core32_Int32( - array($r0, $r1) - ); - $return->overflow = $carry; - $return->unsignedInt = $this->unsignedInt; - return $return; - } - - /** - * Adds a normal integer to an int32 object - * - * @param int $int - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - */ - public function addInt($int) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); - /** @var int $int */ - $int = (int) $int; - - $int = (int) $int; - - $i0 = $this->limbs[0]; - $i1 = $this->limbs[1]; - - $r1 = $i1 + ($int & 0xffff); - $carry = $r1 >> 16; - - $r0 = $i0 + (($int >> 16) & 0xffff) + $carry; - $carry = $r0 >> 16; - $r0 &= 0xffff; - $r1 &= 0xffff; - $return = new ParagonIE_Sodium_Core32_Int32( - array($r0, $r1) - ); - $return->overflow = $carry; - $return->unsignedInt = $this->unsignedInt; - return $return; - } - - /** - * @param int $b - * @return int - */ - public function compareInt($b = 0) - { - $gt = 0; - $eq = 1; - - $i = 2; - $j = 0; - while ($i > 0) { - --$i; - /** @var int $x1 */ - $x1 = $this->limbs[$i]; - /** @var int $x2 */ - $x2 = ($b >> ($j << 4)) & 0xffff; - /** @var int $gt */ - $gt |= (($x2 - $x1) >> 8) & $eq; - /** @var int $eq */ - $eq &= (($x2 ^ $x1) - 1) >> 8; - } - return ($gt + $gt - $eq) + 1; - } - - /** - * @param int $m - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function mask($m = 0) - { - /** @var int $hi */ - $hi = ($m >> 16) & 0xffff; - /** @var int $lo */ - $lo = ($m & 0xffff); - return new ParagonIE_Sodium_Core32_Int32( - array( - (int) ($this->limbs[0] & $hi), - (int) ($this->limbs[1] & $lo) - ), - $this->unsignedInt - ); - } - - /** - * @param array $a - * @param array $b - * @param int $baseLog2 - * @return array - */ - public function multiplyLong(array $a, array $b, $baseLog2 = 16) - { - $a_l = count($a); - $b_l = count($b); - /** @var array $r */ - $r = array_fill(0, $a_l + $b_l + 1, 0); - $base = 1 << $baseLog2; - for ($i = 0; $i < $a_l; ++$i) { - $a_i = $a[$i]; - for ($j = 0; $j < $a_l; ++$j) { - $b_j = $b[$j]; - $product = ($a_i * $b_j) + $r[$i + $j]; - $carry = ($product >> $baseLog2 & 0xffff); - $r[$i + $j] = ($product - (int) ($carry * $base)) & 0xffff; - $r[$i + $j + 1] += $carry; - } - } - return array_slice($r, 0, 5); - } - - /** - * @param int $int - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function mulIntFast($int) - { - // Handle negative numbers - $aNeg = ($this->limbs[0] >> 15) & 1; - $bNeg = ($int >> 31) & 1; - $a = array_reverse($this->limbs); - $b = array( - $int & 0xffff, - ($int >> 16) & 0xffff - ); - if ($aNeg) { - for ($i = 0; $i < 2; ++$i) { - $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; - } - ++$a[0]; - } - if ($bNeg) { - for ($i = 0; $i < 2; ++$i) { - $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; - } - ++$b[0]; - } - // Multiply - $res = $this->multiplyLong($a, $b); - - // Re-apply negation to results - if ($aNeg !== $bNeg) { - for ($i = 0; $i < 2; ++$i) { - $res[$i] = (0xffff ^ $res[$i]) & 0xffff; - } - // Handle integer overflow - $c = 1; - for ($i = 0; $i < 2; ++$i) { - $res[$i] += $c; - $c = $res[$i] >> 16; - $res[$i] &= 0xffff; - } - } - - // Return our values - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->limbs = array( - $res[1] & 0xffff, - $res[0] & 0xffff - ); - if (count($res) > 2) { - $return->overflow = $res[2] & 0xffff; - } - $return->unsignedInt = $this->unsignedInt; - return $return; - } - - /** - * @param ParagonIE_Sodium_Core32_Int32 $right - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function mulInt32Fast(ParagonIE_Sodium_Core32_Int32 $right) - { - $aNeg = ($this->limbs[0] >> 15) & 1; - $bNeg = ($right->limbs[0] >> 15) & 1; - - $a = array_reverse($this->limbs); - $b = array_reverse($right->limbs); - if ($aNeg) { - for ($i = 0; $i < 2; ++$i) { - $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; - } - ++$a[0]; - } - if ($bNeg) { - for ($i = 0; $i < 2; ++$i) { - $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; - } - ++$b[0]; - } - $res = $this->multiplyLong($a, $b); - if ($aNeg !== $bNeg) { - if ($aNeg !== $bNeg) { - for ($i = 0; $i < 2; ++$i) { - $res[$i] = ($res[$i] ^ 0xffff) & 0xffff; - } - $c = 1; - for ($i = 0; $i < 2; ++$i) { - $res[$i] += $c; - $c = $res[$i] >> 16; - $res[$i] &= 0xffff; - } - } - } - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->limbs = array( - $res[1] & 0xffff, - $res[0] & 0xffff - ); - if (count($res) > 2) { - $return->overflow = $res[2]; - } - return $return; - } - - /** - * @param int $int - * @param int $size - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - */ - public function mulInt($int = 0, $size = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); - ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); - if (ParagonIE_Sodium_Compat::$fastMult) { - return $this->mulIntFast((int) $int); - } - /** @var int $int */ - $int = (int) $int; - /** @var int $size */ - $size = (int) $size; - - if (!$size) { - $size = 31; - } - /** @var int $size */ - - $a = clone $this; - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - - // Initialize: - $ret0 = 0; - $ret1 = 0; - $a0 = $a->limbs[0]; - $a1 = $a->limbs[1]; - - /** @var int $size */ - /** @var int $i */ - for ($i = $size; $i >= 0; --$i) { - $m = (int) (-($int & 1)); - $x0 = $a0 & $m; - $x1 = $a1 & $m; - - $ret1 += $x1; - $c = $ret1 >> 16; - - $ret0 += $x0 + $c; - - $ret0 &= 0xffff; - $ret1 &= 0xffff; - - $a1 = ($a1 << 1); - $x1 = $a1 >> 16; - $a0 = ($a0 << 1) | $x1; - $a0 &= 0xffff; - $a1 &= 0xffff; - $int >>= 1; - } - $return->limbs[0] = $ret0; - $return->limbs[1] = $ret1; - return $return; - } - - /** - * @param ParagonIE_Sodium_Core32_Int32 $int - * @param int $size - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - */ - public function mulInt32(ParagonIE_Sodium_Core32_Int32 $int, $size = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); - if (ParagonIE_Sodium_Compat::$fastMult) { - return $this->mulInt32Fast($int); - } - if (!$size) { - $size = 31; - } - /** @var int $size */ - - $a = clone $this; - $b = clone $int; - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - - // Initialize: - $ret0 = 0; - $ret1 = 0; - $a0 = $a->limbs[0]; - $a1 = $a->limbs[1]; - $b0 = $b->limbs[0]; - $b1 = $b->limbs[1]; - - /** @var int $size */ - /** @var int $i */ - for ($i = $size; $i >= 0; --$i) { - $m = (int) (-($b1 & 1)); - $x0 = $a0 & $m; - $x1 = $a1 & $m; - - $ret1 += $x1; - $c = $ret1 >> 16; - - $ret0 += $x0 + $c; - - $ret0 &= 0xffff; - $ret1 &= 0xffff; - - $a1 = ($a1 << 1); - $x1 = $a1 >> 16; - $a0 = ($a0 << 1) | $x1; - $a0 &= 0xffff; - $a1 &= 0xffff; - - $x0 = ($b0 & 1) << 16; - $b0 = ($b0 >> 1); - $b1 = (($b1 | $x0) >> 1); - - $b0 &= 0xffff; - $b1 &= 0xffff; - - } - $return->limbs[0] = $ret0; - $return->limbs[1] = $ret1; - - return $return; - } - - /** - * OR this 32-bit integer with another. - * - * @param ParagonIE_Sodium_Core32_Int32 $b - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function orInt32(ParagonIE_Sodium_Core32_Int32 $b) - { - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - $return->limbs = array( - (int) ($this->limbs[0] | $b->limbs[0]), - (int) ($this->limbs[1] | $b->limbs[1]) - ); - /** @var int overflow */ - $return->overflow = $this->overflow | $b->overflow; - return $return; - } - - /** - * @param int $b - * @return bool - */ - public function isGreaterThan($b = 0) - { - return $this->compareInt($b) > 0; - } - - /** - * @param int $b - * @return bool - */ - public function isLessThanInt($b = 0) - { - return $this->compareInt($b) < 0; - } - - /** - * @param int $c - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAccess - */ - public function rotateLeft($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - /** @var int $c */ - $c = (int) $c; - - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - $c &= 31; - if ($c === 0) { - // NOP, but we want a copy. - $return->limbs = $this->limbs; - } else { - /** @var int $c */ - - /** @var int $idx_shift */ - $idx_shift = ($c >> 4) & 1; - - /** @var int $sub_shift */ - $sub_shift = $c & 15; - - /** @var array $limbs */ - $limbs =& $return->limbs; - - /** @var array $myLimbs */ - $myLimbs =& $this->limbs; - - for ($i = 1; $i >= 0; --$i) { - /** @var int $j */ - $j = ($i + $idx_shift) & 1; - /** @var int $k */ - $k = ($i + $idx_shift + 1) & 1; - $limbs[$i] = (int) ( - ( - ((int) ($myLimbs[$j]) << $sub_shift) - | - ((int) ($myLimbs[$k]) >> (16 - $sub_shift)) - ) & 0xffff - ); - } - } - return $return; - } - - /** - * Rotate to the right - * - * @param int $c - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAccess - */ - public function rotateRight($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - /** @var int $c */ - $c = (int) $c; - - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - $c &= 31; - /** @var int $c */ - if ($c === 0) { - // NOP, but we want a copy. - $return->limbs = $this->limbs; - } else { - /** @var int $c */ - - /** @var int $idx_shift */ - $idx_shift = ($c >> 4) & 1; - - /** @var int $sub_shift */ - $sub_shift = $c & 15; - - /** @var array $limbs */ - $limbs =& $return->limbs; - - /** @var array $myLimbs */ - $myLimbs =& $this->limbs; - - for ($i = 1; $i >= 0; --$i) { - /** @var int $j */ - $j = ($i - $idx_shift) & 1; - /** @var int $k */ - $k = ($i - $idx_shift - 1) & 1; - $limbs[$i] = (int) ( - ( - ((int) ($myLimbs[$j]) >> (int) ($sub_shift)) - | - ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift))) - ) & 0xffff - ); - } - } - return $return; - } - - /** - * @param bool $bool - * @return self - */ - public function setUnsignedInt($bool = false) - { - $this->unsignedInt = !empty($bool); - return $this; - } - - /** - * @param int $c - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - */ - public function shiftLeft($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - /** @var int $c */ - $c = (int) $c; - - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - $c &= 63; - /** @var int $c */ - if ($c === 0) { - $return->limbs = $this->limbs; - } elseif ($c < 0) { - /** @var int $c */ - return $this->shiftRight(-$c); - } else { - /** @var int $c */ - /** @var int $tmp */ - $tmp = $this->limbs[1] << $c; - $return->limbs[1] = (int)($tmp & 0xffff); - /** @var int $carry */ - $carry = $tmp >> 16; - - /** @var int $tmp */ - $tmp = ($this->limbs[0] << $c) | ($carry & 0xffff); - $return->limbs[0] = (int) ($tmp & 0xffff); - } - return $return; - } - - /** - * @param int $c - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedOperand - */ - public function shiftRight($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - /** @var int $c */ - $c = (int) $c; - - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - $c &= 63; - /** @var int $c */ - if ($c >= 16) { - $return->limbs = array( - (int) ($this->overflow & 0xffff), - (int) ($this->limbs[0]) - ); - $return->overflow = $this->overflow >> 16; - return $return->shiftRight($c & 15); - } - if ($c === 0) { - $return->limbs = $this->limbs; - } elseif ($c < 0) { - /** @var int $c */ - return $this->shiftLeft(-$c); - } else { - if (!is_int($c)) { - throw new TypeError(); - } - /** @var int $c */ - // $return->limbs[0] = (int) (($this->limbs[0] >> $c) & 0xffff); - $carryLeft = (int) ($this->overflow & ((1 << ($c + 1)) - 1)); - $return->limbs[0] = (int) ((($this->limbs[0] >> $c) | ($carryLeft << (16 - $c))) & 0xffff); - $carryRight = (int) ($this->limbs[0] & ((1 << ($c + 1)) - 1)); - $return->limbs[1] = (int) ((($this->limbs[1] >> $c) | ($carryRight << (16 - $c))) & 0xffff); - $return->overflow >>= $c; - } - return $return; - } - - /** - * Subtract a normal integer from an int32 object. - * - * @param int $int - * @return ParagonIE_Sodium_Core32_Int32 - * @throws SodiumException - * @throws TypeError - */ - public function subInt($int) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); - /** @var int $int */ - $int = (int) $int; - - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - - /** @var int $tmp */ - $tmp = $this->limbs[1] - ($int & 0xffff); - /** @var int $carry */ - $carry = $tmp >> 16; - $return->limbs[1] = (int) ($tmp & 0xffff); - - /** @var int $tmp */ - $tmp = $this->limbs[0] - (($int >> 16) & 0xffff) + $carry; - $return->limbs[0] = (int) ($tmp & 0xffff); - return $return; - } - - /** - * Subtract two int32 objects from each other - * - * @param ParagonIE_Sodium_Core32_Int32 $b - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function subInt32(ParagonIE_Sodium_Core32_Int32 $b) - { - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - - /** @var int $tmp */ - $tmp = $this->limbs[1] - ($b->limbs[1] & 0xffff); - /** @var int $carry */ - $carry = $tmp >> 16; - $return->limbs[1] = (int) ($tmp & 0xffff); - - /** @var int $tmp */ - $tmp = $this->limbs[0] - ($b->limbs[0] & 0xffff) + $carry; - $return->limbs[0] = (int) ($tmp & 0xffff); - return $return; - } - - /** - * XOR this 32-bit integer with another. - * - * @param ParagonIE_Sodium_Core32_Int32 $b - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function xorInt32(ParagonIE_Sodium_Core32_Int32 $b) - { - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->unsignedInt = $this->unsignedInt; - $return->limbs = array( - (int) ($this->limbs[0] ^ $b->limbs[0]), - (int) ($this->limbs[1] ^ $b->limbs[1]) - ); - return $return; - } - - /** - * @param int $signed - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromInt($signed) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($signed, 'int', 1);; - /** @var int $signed */ - $signed = (int) $signed; - - return new ParagonIE_Sodium_Core32_Int32( - array( - (int) (($signed >> 16) & 0xffff), - (int) ($signed & 0xffff) - ) - ); - } - - /** - * @param string $string - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromString($string) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); - $string = (string) $string; - if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) { - throw new RangeException( - 'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' - ); - } - $return = new ParagonIE_Sodium_Core32_Int32(); - - $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8); - $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff); - $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8); - $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff); - return $return; - } - - /** - * @param string $string - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromReverseString($string) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); - $string = (string) $string; - if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) { - throw new RangeException( - 'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' - ); - } - $return = new ParagonIE_Sodium_Core32_Int32(); - - $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8); - $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff); - $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8); - $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff); - return $return; - } - - /** - * @return array - */ - public function toArray() - { - return array((int) ($this->limbs[0] << 16 | $this->limbs[1])); - } - - /** - * @return string - * @throws TypeError - */ - public function toString() - { - return - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff); - } - - /** - * @return int - */ - public function toInt() - { - return (int) ( - (($this->limbs[0] & 0xffff) << 16) - | - ($this->limbs[1] & 0xffff) - ); - } - - /** - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function toInt32() - { - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->limbs[0] = (int) ($this->limbs[0] & 0xffff); - $return->limbs[1] = (int) ($this->limbs[1] & 0xffff); - $return->unsignedInt = $this->unsignedInt; - $return->overflow = (int) ($this->overflow & 0x7fffffff); - return $return; - } - - /** - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function toInt64() - { - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - if ($this->unsignedInt) { - $return->limbs[0] += (($this->overflow >> 16) & 0xffff); - $return->limbs[1] += (($this->overflow) & 0xffff); - } else { - $neg = -(($this->limbs[0] >> 15) & 1); - $return->limbs[0] = (int)($neg & 0xffff); - $return->limbs[1] = (int)($neg & 0xffff); - } - $return->limbs[2] = (int) ($this->limbs[0] & 0xffff); - $return->limbs[3] = (int) ($this->limbs[1] & 0xffff); - return $return; - } - - /** - * @return string - * @throws TypeError - */ - public function toReverseString() - { - return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff); - } - - /** - * @return string - */ - public function __toString() - { - try { - return $this->toString(); - } catch (TypeError $ex) { - // PHP engine can't handle exceptions from __toString() - return ''; - } - } -} diff --git a/libs/sodium_compat/src/Core32/Int64.php b/libs/sodium_compat/src/Core32/Int64.php deleted file mode 100644 index dd06a3f..0000000 --- a/libs/sodium_compat/src/Core32/Int64.php +++ /dev/null @@ -1,1066 +0,0 @@ - - four 16-bit integers - */ - public $limbs = array(0, 0, 0, 0); - - /** - * @var int - */ - public $overflow = 0; - - /** - * @var bool - */ - public $unsignedInt = false; - - /** - * ParagonIE_Sodium_Core32_Int64 constructor. - * @param array $array - * @param bool $unsignedInt - */ - public function __construct($array = array(0, 0, 0, 0), $unsignedInt = false) - { - $this->limbs = array( - (int) $array[0], - (int) $array[1], - (int) $array[2], - (int) $array[3] - ); - $this->overflow = 0; - $this->unsignedInt = $unsignedInt; - } - - /** - * Adds two int64 objects - * - * @param ParagonIE_Sodium_Core32_Int64 $addend - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function addInt64(ParagonIE_Sodium_Core32_Int64 $addend) - { - $i0 = $this->limbs[0]; - $i1 = $this->limbs[1]; - $i2 = $this->limbs[2]; - $i3 = $this->limbs[3]; - $j0 = $addend->limbs[0]; - $j1 = $addend->limbs[1]; - $j2 = $addend->limbs[2]; - $j3 = $addend->limbs[3]; - - $r3 = $i3 + ($j3 & 0xffff); - $carry = $r3 >> 16; - - $r2 = $i2 + ($j2 & 0xffff) + $carry; - $carry = $r2 >> 16; - - $r1 = $i1 + ($j1 & 0xffff) + $carry; - $carry = $r1 >> 16; - - $r0 = $i0 + ($j0 & 0xffff) + $carry; - $carry = $r0 >> 16; - - $r0 &= 0xffff; - $r1 &= 0xffff; - $r2 &= 0xffff; - $r3 &= 0xffff; - - $return = new ParagonIE_Sodium_Core32_Int64( - array($r0, $r1, $r2, $r3) - ); - $return->overflow = $carry; - $return->unsignedInt = $this->unsignedInt; - return $return; - } - - /** - * Adds a normal integer to an int64 object - * - * @param int $int - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - public function addInt($int) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); - /** @var int $int */ - $int = (int) $int; - - $i0 = $this->limbs[0]; - $i1 = $this->limbs[1]; - $i2 = $this->limbs[2]; - $i3 = $this->limbs[3]; - - $r3 = $i3 + ($int & 0xffff); - $carry = $r3 >> 16; - - $r2 = $i2 + (($int >> 16) & 0xffff) + $carry; - $carry = $r2 >> 16; - - $r1 = $i1 + $carry; - $carry = $r1 >> 16; - - $r0 = $i0 + $carry; - $carry = $r0 >> 16; - - $r0 &= 0xffff; - $r1 &= 0xffff; - $r2 &= 0xffff; - $r3 &= 0xffff; - $return = new ParagonIE_Sodium_Core32_Int64( - array($r0, $r1, $r2, $r3) - ); - $return->overflow = $carry; - $return->unsignedInt = $this->unsignedInt; - return $return; - } - - /** - * @param int $b - * @return int - */ - public function compareInt($b = 0) - { - $gt = 0; - $eq = 1; - - $i = 4; - $j = 0; - while ($i > 0) { - --$i; - /** @var int $x1 */ - $x1 = $this->limbs[$i]; - /** @var int $x2 */ - $x2 = ($b >> ($j << 4)) & 0xffff; - /** int */ - $gt |= (($x2 - $x1) >> 8) & $eq; - /** int */ - $eq &= (($x2 ^ $x1) - 1) >> 8; - } - return ($gt + $gt - $eq) + 1; - } - - /** - * @param int $b - * @return bool - */ - public function isGreaterThan($b = 0) - { - return $this->compareInt($b) > 0; - } - - /** - * @param int $b - * @return bool - */ - public function isLessThanInt($b = 0) - { - return $this->compareInt($b) < 0; - } - - /** - * @param int $hi - * @param int $lo - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function mask64($hi = 0, $lo = 0) - { - /** @var int $a */ - $a = ($hi >> 16) & 0xffff; - /** @var int $b */ - $b = ($hi) & 0xffff; - /** @var int $c */ - $c = ($lo >> 16) & 0xffff; - /** @var int $d */ - $d = ($lo & 0xffff); - return new ParagonIE_Sodium_Core32_Int64( - array( - $this->limbs[0] & $a, - $this->limbs[1] & $b, - $this->limbs[2] & $c, - $this->limbs[3] & $d - ), - $this->unsignedInt - ); - } - - /** - * @param int $int - * @param int $size - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedAssignment - */ - public function mulInt($int = 0, $size = 0) - { - if (ParagonIE_Sodium_Compat::$fastMult) { - return $this->mulIntFast($int); - } - ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); - ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); - /** @var int $int */ - $int = (int) $int; - /** @var int $size */ - $size = (int) $size; - - if (!$size) { - $size = 63; - } - - $a = clone $this; - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - - // Initialize: - $ret0 = 0; - $ret1 = 0; - $ret2 = 0; - $ret3 = 0; - $a0 = $a->limbs[0]; - $a1 = $a->limbs[1]; - $a2 = $a->limbs[2]; - $a3 = $a->limbs[3]; - - /** @var int $size */ - /** @var int $i */ - for ($i = $size; $i >= 0; --$i) { - $mask = -($int & 1); - $x0 = $a0 & $mask; - $x1 = $a1 & $mask; - $x2 = $a2 & $mask; - $x3 = $a3 & $mask; - - $ret3 += $x3; - $c = $ret3 >> 16; - - $ret2 += $x2 + $c; - $c = $ret2 >> 16; - - $ret1 += $x1 + $c; - $c = $ret1 >> 16; - - $ret0 += $x0 + $c; - - $ret0 &= 0xffff; - $ret1 &= 0xffff; - $ret2 &= 0xffff; - $ret3 &= 0xffff; - - $a3 = $a3 << 1; - $x3 = $a3 >> 16; - $a2 = ($a2 << 1) | $x3; - $x2 = $a2 >> 16; - $a1 = ($a1 << 1) | $x2; - $x1 = $a1 >> 16; - $a0 = ($a0 << 1) | $x1; - $a0 &= 0xffff; - $a1 &= 0xffff; - $a2 &= 0xffff; - $a3 &= 0xffff; - - $int >>= 1; - } - $return->limbs[0] = $ret0; - $return->limbs[1] = $ret1; - $return->limbs[2] = $ret2; - $return->limbs[3] = $ret3; - return $return; - } - - /** - * @param ParagonIE_Sodium_Core32_Int64 $A - * @param ParagonIE_Sodium_Core32_Int64 $B - * @return array - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedInferredReturnType - */ - public static function ctSelect( - ParagonIE_Sodium_Core32_Int64 $A, - ParagonIE_Sodium_Core32_Int64 $B - ) { - $a = clone $A; - $b = clone $B; - /** @var int $aNeg */ - $aNeg = ($a->limbs[0] >> 15) & 1; - /** @var int $bNeg */ - $bNeg = ($b->limbs[0] >> 15) & 1; - /** @var int $m */ - $m = (-($aNeg & $bNeg)) | 1; - /** @var int $swap */ - $swap = $bNeg & ~$aNeg; - /** @var int $d */ - $d = -$swap; - - /* - if ($bNeg && !$aNeg) { - $a = clone $int; - $b = clone $this; - } elseif($bNeg && $aNeg) { - $a = $this->mulInt(-1); - $b = $int->mulInt(-1); - } - */ - $x = $a->xorInt64($b)->mask64($d, $d); - return array( - $a->xorInt64($x)->mulInt($m), - $b->xorInt64($x)->mulInt($m) - ); - } - - /** - * @param array $a - * @param array $b - * @param int $baseLog2 - * @return array - */ - public function multiplyLong(array $a, array $b, $baseLog2 = 16) - { - $a_l = count($a); - $b_l = count($b); - /** @var array $r */ - $r = array_fill(0, $a_l + $b_l + 1, 0); - $base = 1 << $baseLog2; - for ($i = 0; $i < $a_l; ++$i) { - $a_i = $a[$i]; - for ($j = 0; $j < $a_l; ++$j) { - $b_j = $b[$j]; - $product = ($a_i * $b_j) + $r[$i + $j]; - $carry = ($product >> $baseLog2 & 0xffff); - $r[$i + $j] = ($product - (int) ($carry * $base)) & 0xffff; - $r[$i + $j + 1] += $carry; - } - } - return array_slice($r, 0, 5); - } - - /** - * @param int $int - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function mulIntFast($int) - { - // Handle negative numbers - $aNeg = ($this->limbs[0] >> 15) & 1; - $bNeg = ($int >> 31) & 1; - $a = array_reverse($this->limbs); - $b = array( - $int & 0xffff, - ($int >> 16) & 0xffff, - -$bNeg & 0xffff, - -$bNeg & 0xffff - ); - if ($aNeg) { - for ($i = 0; $i < 4; ++$i) { - $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; - } - ++$a[0]; - } - if ($bNeg) { - for ($i = 0; $i < 4; ++$i) { - $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; - } - ++$b[0]; - } - // Multiply - $res = $this->multiplyLong($a, $b); - - // Re-apply negation to results - if ($aNeg !== $bNeg) { - for ($i = 0; $i < 4; ++$i) { - $res[$i] = (0xffff ^ $res[$i]) & 0xffff; - } - // Handle integer overflow - $c = 1; - for ($i = 0; $i < 4; ++$i) { - $res[$i] += $c; - $c = $res[$i] >> 16; - $res[$i] &= 0xffff; - } - } - - // Return our values - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->limbs = array( - $res[3] & 0xffff, - $res[2] & 0xffff, - $res[1] & 0xffff, - $res[0] & 0xffff - ); - if (count($res) > 4) { - $return->overflow = $res[4] & 0xffff; - } - $return->unsignedInt = $this->unsignedInt; - return $return; - } - - /** - * @param ParagonIE_Sodium_Core32_Int64 $right - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function mulInt64Fast(ParagonIE_Sodium_Core32_Int64 $right) - { - $aNeg = ($this->limbs[0] >> 15) & 1; - $bNeg = ($right->limbs[0] >> 15) & 1; - - $a = array_reverse($this->limbs); - $b = array_reverse($right->limbs); - if ($aNeg) { - for ($i = 0; $i < 4; ++$i) { - $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; - } - ++$a[0]; - } - if ($bNeg) { - for ($i = 0; $i < 4; ++$i) { - $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; - } - ++$b[0]; - } - $res = $this->multiplyLong($a, $b); - if ($aNeg !== $bNeg) { - if ($aNeg !== $bNeg) { - for ($i = 0; $i < 4; ++$i) { - $res[$i] = ($res[$i] ^ 0xffff) & 0xffff; - } - $c = 1; - for ($i = 0; $i < 4; ++$i) { - $res[$i] += $c; - $c = $res[$i] >> 16; - $res[$i] &= 0xffff; - } - } - } - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->limbs = array( - $res[3] & 0xffff, - $res[2] & 0xffff, - $res[1] & 0xffff, - $res[0] & 0xffff - ); - if (count($res) > 4) { - $return->overflow = $res[4]; - } - return $return; - } - - /** - * @param ParagonIE_Sodium_Core32_Int64 $int - * @param int $size - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedAssignment - */ - public function mulInt64(ParagonIE_Sodium_Core32_Int64 $int, $size = 0) - { - if (ParagonIE_Sodium_Compat::$fastMult) { - return $this->mulInt64Fast($int); - } - ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); - if (!$size) { - $size = 63; - } - list($a, $b) = self::ctSelect($this, $int); - - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - - // Initialize: - $ret0 = 0; - $ret1 = 0; - $ret2 = 0; - $ret3 = 0; - $a0 = $a->limbs[0]; - $a1 = $a->limbs[1]; - $a2 = $a->limbs[2]; - $a3 = $a->limbs[3]; - $b0 = $b->limbs[0]; - $b1 = $b->limbs[1]; - $b2 = $b->limbs[2]; - $b3 = $b->limbs[3]; - - /** @var int $size */ - /** @var int $i */ - for ($i = (int) $size; $i >= 0; --$i) { - $mask = -($b3 & 1); - $x0 = $a0 & $mask; - $x1 = $a1 & $mask; - $x2 = $a2 & $mask; - $x3 = $a3 & $mask; - - $ret3 += $x3; - $c = $ret3 >> 16; - - $ret2 += $x2 + $c; - $c = $ret2 >> 16; - - $ret1 += $x1 + $c; - $c = $ret1 >> 16; - - $ret0 += $x0 + $c; - - $ret0 &= 0xffff; - $ret1 &= 0xffff; - $ret2 &= 0xffff; - $ret3 &= 0xffff; - - $a3 = $a3 << 1; - $x3 = $a3 >> 16; - $a2 = ($a2 << 1) | $x3; - $x2 = $a2 >> 16; - $a1 = ($a1 << 1) | $x2; - $x1 = $a1 >> 16; - $a0 = ($a0 << 1) | $x1; - $a0 &= 0xffff; - $a1 &= 0xffff; - $a2 &= 0xffff; - $a3 &= 0xffff; - - $x0 = ($b0 & 1) << 16; - $x1 = ($b1 & 1) << 16; - $x2 = ($b2 & 1) << 16; - - $b0 = ($b0 >> 1); - $b1 = (($b1 | $x0) >> 1); - $b2 = (($b2 | $x1) >> 1); - $b3 = (($b3 | $x2) >> 1); - - $b0 &= 0xffff; - $b1 &= 0xffff; - $b2 &= 0xffff; - $b3 &= 0xffff; - - } - $return->limbs[0] = $ret0; - $return->limbs[1] = $ret1; - $return->limbs[2] = $ret2; - $return->limbs[3] = $ret3; - - return $return; - } - - /** - * OR this 64-bit integer with another. - * - * @param ParagonIE_Sodium_Core32_Int64 $b - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function orInt64(ParagonIE_Sodium_Core32_Int64 $b) - { - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - $return->limbs = array( - (int) ($this->limbs[0] | $b->limbs[0]), - (int) ($this->limbs[1] | $b->limbs[1]), - (int) ($this->limbs[2] | $b->limbs[2]), - (int) ($this->limbs[3] | $b->limbs[3]) - ); - return $return; - } - - /** - * @param int $c - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAccess - */ - public function rotateLeft($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - /** @var int $c */ - $c = (int) $c; - - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - $c &= 63; - if ($c === 0) { - // NOP, but we want a copy. - $return->limbs = $this->limbs; - } else { - /** @var array $limbs */ - $limbs =& $return->limbs; - - /** @var array $myLimbs */ - $myLimbs =& $this->limbs; - - /** @var int $idx_shift */ - $idx_shift = ($c >> 4) & 3; - /** @var int $sub_shift */ - $sub_shift = $c & 15; - - for ($i = 3; $i >= 0; --$i) { - /** @var int $j */ - $j = ($i + $idx_shift) & 3; - /** @var int $k */ - $k = ($i + $idx_shift + 1) & 3; - $limbs[$i] = (int) ( - ( - ((int) ($myLimbs[$j]) << $sub_shift) - | - ((int) ($myLimbs[$k]) >> (16 - $sub_shift)) - ) & 0xffff - ); - } - } - return $return; - } - - /** - * Rotate to the right - * - * @param int $c - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedArrayAccess - */ - public function rotateRight($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - /** @var int $c */ - $c = (int) $c; - - /** @var ParagonIE_Sodium_Core32_Int64 $return */ - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - $c &= 63; - /** @var int $c */ - if ($c === 0) { - // NOP, but we want a copy. - $return->limbs = $this->limbs; - } else { - /** @var array $limbs */ - $limbs =& $return->limbs; - - /** @var array $myLimbs */ - $myLimbs =& $this->limbs; - - /** @var int $idx_shift */ - $idx_shift = ($c >> 4) & 3; - /** @var int $sub_shift */ - $sub_shift = $c & 15; - - for ($i = 3; $i >= 0; --$i) { - /** @var int $j */ - $j = ($i - $idx_shift) & 3; - /** @var int $k */ - $k = ($i - $idx_shift - 1) & 3; - $limbs[$i] = (int) ( - ( - ((int) ($myLimbs[$j]) >> (int) ($sub_shift)) - | - ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift))) - ) & 0xffff - ); - } - } - return $return; - } - /** - * @param int $c - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - public function shiftLeft($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - /** @var int $c */ - $c = (int) $c; - - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - $c &= 63; - - if ($c >= 16) { - if ($c >= 48) { - $return->limbs = array( - $this->limbs[3], 0, 0, 0 - ); - } elseif ($c >= 32) { - $return->limbs = array( - $this->limbs[2], $this->limbs[3], 0, 0 - ); - } else { - $return->limbs = array( - $this->limbs[1], $this->limbs[2], $this->limbs[3], 0 - ); - } - return $return->shiftLeft($c & 15); - } - if ($c === 0) { - $return->limbs = $this->limbs; - } elseif ($c < 0) { - /** @var int $c */ - return $this->shiftRight(-$c); - } else { - if (!is_int($c)) { - throw new TypeError(); - } - /** @var int $carry */ - $carry = 0; - for ($i = 3; $i >= 0; --$i) { - /** @var int $tmp */ - $tmp = ($this->limbs[$i] << $c) | ($carry & 0xffff); - $return->limbs[$i] = (int) ($tmp & 0xffff); - /** @var int $carry */ - $carry = $tmp >> 16; - } - } - return $return; - } - - /** - * @param int $c - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - public function shiftRight($c = 0) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); - $c = (int) $c; - /** @var int $c */ - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - $c &= 63; - - $negative = -(($this->limbs[0] >> 15) & 1); - if ($c >= 16) { - if ($c >= 48) { - $return->limbs = array( - (int) ($negative & 0xffff), - (int) ($negative & 0xffff), - (int) ($negative & 0xffff), - (int) $this->limbs[0] - ); - } elseif ($c >= 32) { - $return->limbs = array( - (int) ($negative & 0xffff), - (int) ($negative & 0xffff), - (int) $this->limbs[0], - (int) $this->limbs[1] - ); - } else { - $return->limbs = array( - (int) ($negative & 0xffff), - (int) $this->limbs[0], - (int) $this->limbs[1], - (int) $this->limbs[2] - ); - } - return $return->shiftRight($c & 15); - } - - if ($c === 0) { - $return->limbs = $this->limbs; - } elseif ($c < 0) { - return $this->shiftLeft(-$c); - } else { - if (!is_int($c)) { - throw new TypeError(); - } - /** @var int $carryRight */ - $carryRight = ($negative & 0xffff); - $mask = (int) (((1 << ($c + 1)) - 1) & 0xffff); - for ($i = 0; $i < 4; ++$i) { - $return->limbs[$i] = (int) ( - (($this->limbs[$i] >> $c) | ($carryRight << (16 - $c))) & 0xffff - ); - $carryRight = (int) ($this->limbs[$i] & $mask); - } - } - return $return; - } - - - /** - * Subtract a normal integer from an int64 object. - * - * @param int $int - * @return ParagonIE_Sodium_Core32_Int64 - * @throws SodiumException - * @throws TypeError - */ - public function subInt($int) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); - $int = (int) $int; - - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - - /** @var int $carry */ - $carry = 0; - for ($i = 3; $i >= 0; --$i) { - /** @var int $tmp */ - $tmp = $this->limbs[$i] - (($int >> 16) & 0xffff) + $carry; - /** @var int $carry */ - $carry = $tmp >> 16; - $return->limbs[$i] = (int) ($tmp & 0xffff); - } - return $return; - } - - /** - * The difference between two Int64 objects. - * - * @param ParagonIE_Sodium_Core32_Int64 $b - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function subInt64(ParagonIE_Sodium_Core32_Int64 $b) - { - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - /** @var int $carry */ - $carry = 0; - for ($i = 3; $i >= 0; --$i) { - /** @var int $tmp */ - $tmp = $this->limbs[$i] - $b->limbs[$i] + $carry; - /** @var int $carry */ - $carry = ($tmp >> 16); - $return->limbs[$i] = (int) ($tmp & 0xffff); - } - return $return; - } - - /** - * XOR this 64-bit integer with another. - * - * @param ParagonIE_Sodium_Core32_Int64 $b - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function xorInt64(ParagonIE_Sodium_Core32_Int64 $b) - { - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->unsignedInt = $this->unsignedInt; - $return->limbs = array( - (int) ($this->limbs[0] ^ $b->limbs[0]), - (int) ($this->limbs[1] ^ $b->limbs[1]), - (int) ($this->limbs[2] ^ $b->limbs[2]), - (int) ($this->limbs[3] ^ $b->limbs[3]) - ); - return $return; - } - - /** - * @param int $low - * @param int $high - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromInts($low, $high) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1); - ParagonIE_Sodium_Core32_Util::declareScalarType($high, 'int', 2); - - $high = (int) $high; - $low = (int) $low; - return new ParagonIE_Sodium_Core32_Int64( - array( - (int) (($high >> 16) & 0xffff), - (int) ($high & 0xffff), - (int) (($low >> 16) & 0xffff), - (int) ($low & 0xffff) - ) - ); - } - - /** - * @param int $low - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromInt($low) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1); - $low = (int) $low; - - return new ParagonIE_Sodium_Core32_Int64( - array( - 0, - 0, - (int) (($low >> 16) & 0xffff), - (int) ($low & 0xffff) - ) - ); - } - - /** - * @return int - */ - public function toInt() - { - return (int) ( - (($this->limbs[2] & 0xffff) << 16) - | - ($this->limbs[3] & 0xffff) - ); - } - - /** - * @param string $string - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromString($string) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); - $string = (string) $string; - if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) { - throw new RangeException( - 'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' - ); - } - $return = new ParagonIE_Sodium_Core32_Int64(); - - $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8); - $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff); - $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8); - $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff); - $return->limbs[2] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff) << 8); - $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff); - $return->limbs[3] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff) << 8); - $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff); - return $return; - } - - /** - * @param string $string - * @return self - * @throws SodiumException - * @throws TypeError - */ - public static function fromReverseString($string) - { - ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); - $string = (string) $string; - if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) { - throw new RangeException( - 'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' - ); - } - $return = new ParagonIE_Sodium_Core32_Int64(); - - $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff) << 8); - $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff); - $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff) << 8); - $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff); - $return->limbs[2] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8); - $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff); - $return->limbs[3] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8); - $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff); - return $return; - } - - /** - * @return array - */ - public function toArray() - { - return array( - (int) ((($this->limbs[0] & 0xffff) << 16) | ($this->limbs[1] & 0xffff)), - (int) ((($this->limbs[2] & 0xffff) << 16) | ($this->limbs[3] & 0xffff)) - ); - } - - /** - * @return ParagonIE_Sodium_Core32_Int32 - */ - public function toInt32() - { - $return = new ParagonIE_Sodium_Core32_Int32(); - $return->limbs[0] = (int) ($this->limbs[2]); - $return->limbs[1] = (int) ($this->limbs[3]); - $return->unsignedInt = $this->unsignedInt; - $return->overflow = (int) (ParagonIE_Sodium_Core32_Util::abs($this->limbs[1], 16) & 0xffff); - return $return; - } - - /** - * @return ParagonIE_Sodium_Core32_Int64 - */ - public function toInt64() - { - $return = new ParagonIE_Sodium_Core32_Int64(); - $return->limbs[0] = (int) ($this->limbs[0]); - $return->limbs[1] = (int) ($this->limbs[1]); - $return->limbs[2] = (int) ($this->limbs[2]); - $return->limbs[3] = (int) ($this->limbs[3]); - $return->unsignedInt = $this->unsignedInt; - $return->overflow = ParagonIE_Sodium_Core32_Util::abs($this->overflow); - return $return; - } - - /** - * @param bool $bool - * @return self - */ - public function setUnsignedInt($bool = false) - { - $this->unsignedInt = !empty($bool); - return $this; - } - - /** - * @return string - * @throws TypeError - */ - public function toString() - { - return ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff); - } - - /** - * @return string - * @throws TypeError - */ - public function toReverseString() - { - return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . - ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff); - } - - /** - * @return string - */ - public function __toString() - { - try { - return $this->toString(); - } catch (TypeError $ex) { - // PHP engine can't handle exceptions from __toString() - return ''; - } - } -} diff --git a/libs/sodium_compat/src/Core32/Poly1305.php b/libs/sodium_compat/src/Core32/Poly1305.php deleted file mode 100644 index b9dfaf3..0000000 --- a/libs/sodium_compat/src/Core32/Poly1305.php +++ /dev/null @@ -1,63 +0,0 @@ -update($m) - ->finish(); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $mac - * @param string $m - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function onetimeauth_verify($mac, $m, $key) - { - if (self::strlen($key) < 32) { - throw new InvalidArgumentException( - 'Key must be 32 bytes long.' - ); - } - $state = new ParagonIE_Sodium_Core32_Poly1305_State( - self::substr($key, 0, 32) - ); - $calc = $state - ->update($m) - ->finish(); - return self::verify_16($calc, $mac); - } -} diff --git a/libs/sodium_compat/src/Core32/Poly1305/State.php b/libs/sodium_compat/src/Core32/Poly1305/State.php deleted file mode 100644 index d80e1ff..0000000 --- a/libs/sodium_compat/src/Core32/Poly1305/State.php +++ /dev/null @@ -1,451 +0,0 @@ - - */ - protected $buffer = array(); - - /** - * @var bool - */ - protected $final = false; - - /** - * @var array - */ - public $h; - - /** - * @var int - */ - protected $leftover = 0; - - /** - * @var array - */ - public $r; - - /** - * @var array - */ - public $pad; - - /** - * ParagonIE_Sodium_Core32_Poly1305_State constructor. - * - * @internal You should not use this directly from another application - * - * @param string $key - * @throws InvalidArgumentException - * @throws SodiumException - * @throws TypeError - */ - public function __construct($key = '') - { - if (self::strlen($key) < 32) { - throw new InvalidArgumentException( - 'Poly1305 requires a 32-byte key' - ); - } - /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ - $this->r = array( - // st->r[0] = ... - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4)) - ->setUnsignedInt(true) - ->mask(0x3ffffff), - // st->r[1] = ... - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 3, 4)) - ->setUnsignedInt(true) - ->shiftRight(2) - ->mask(0x3ffff03), - // st->r[2] = ... - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 6, 4)) - ->setUnsignedInt(true) - ->shiftRight(4) - ->mask(0x3ffc0ff), - // st->r[3] = ... - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 9, 4)) - ->setUnsignedInt(true) - ->shiftRight(6) - ->mask(0x3f03fff), - // st->r[4] = ... - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4)) - ->setUnsignedInt(true) - ->shiftRight(8) - ->mask(0x00fffff) - ); - - /* h = 0 */ - $this->h = array( - new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), - new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), - new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), - new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), - new ParagonIE_Sodium_Core32_Int32(array(0, 0), true) - ); - - /* save pad for later */ - $this->pad = array( - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4)) - ->setUnsignedInt(true)->toInt64(), - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4)) - ->setUnsignedInt(true)->toInt64(), - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4)) - ->setUnsignedInt(true)->toInt64(), - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4)) - ->setUnsignedInt(true)->toInt64(), - ); - - $this->leftover = 0; - $this->final = false; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @return self - * @throws SodiumException - * @throws TypeError - */ - public function update($message = '') - { - $bytes = self::strlen($message); - - /* handle leftover */ - if ($this->leftover) { - /** @var int $want */ - $want = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - $this->leftover; - if ($want > $bytes) { - $want = $bytes; - } - for ($i = 0; $i < $want; ++$i) { - $mi = self::chrToInt($message[$i]); - $this->buffer[$this->leftover + $i] = $mi; - } - // We snip off the leftmost bytes. - $message = self::substr($message, $want); - $bytes = self::strlen($message); - $this->leftover += $want; - if ($this->leftover < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { - // We still don't have enough to run $this->blocks() - return $this; - } - - $this->blocks( - self::intArrayToString($this->buffer), - ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - ); - $this->leftover = 0; - } - - /* process full blocks */ - if ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { - /** @var int $want */ - $want = $bytes & ~(ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - 1); - if ($want >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { - /** @var string $block */ - $block = self::substr($message, 0, $want); - if (self::strlen($block) >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { - $this->blocks($block, $want); - $message = self::substr($message, $want); - $bytes = self::strlen($message); - } - } - } - - /* store leftover */ - if ($bytes) { - for ($i = 0; $i < $bytes; ++$i) { - $mi = self::chrToInt($message[$i]); - $this->buffer[$this->leftover + $i] = $mi; - } - $this->leftover = (int) $this->leftover + $bytes; - } - return $this; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param int $bytes - * @return self - * @throws SodiumException - * @throws TypeError - */ - public function blocks($message, $bytes) - { - if (self::strlen($message) < 16) { - $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT); - } - $hibit = ParagonIE_Sodium_Core32_Int32::fromInt((int) ($this->final ? 0 : 1 << 24)); /* 1 << 128 */ - $hibit->setUnsignedInt(true); - $zero = new ParagonIE_Sodium_Core32_Int64(array(0, 0, 0, 0), true); - /** - * @var ParagonIE_Sodium_Core32_Int64 $d0 - * @var ParagonIE_Sodium_Core32_Int64 $d1 - * @var ParagonIE_Sodium_Core32_Int64 $d2 - * @var ParagonIE_Sodium_Core32_Int64 $d3 - * @var ParagonIE_Sodium_Core32_Int64 $d4 - * @var ParagonIE_Sodium_Core32_Int64 $r0 - * @var ParagonIE_Sodium_Core32_Int64 $r1 - * @var ParagonIE_Sodium_Core32_Int64 $r2 - * @var ParagonIE_Sodium_Core32_Int64 $r3 - * @var ParagonIE_Sodium_Core32_Int64 $r4 - * - * @var ParagonIE_Sodium_Core32_Int32 $h0 - * @var ParagonIE_Sodium_Core32_Int32 $h1 - * @var ParagonIE_Sodium_Core32_Int32 $h2 - * @var ParagonIE_Sodium_Core32_Int32 $h3 - * @var ParagonIE_Sodium_Core32_Int32 $h4 - */ - $r0 = $this->r[0]->toInt64(); - $r1 = $this->r[1]->toInt64(); - $r2 = $this->r[2]->toInt64(); - $r3 = $this->r[3]->toInt64(); - $r4 = $this->r[4]->toInt64(); - - $s1 = $r1->toInt64()->mulInt(5, 3); - $s2 = $r2->toInt64()->mulInt(5, 3); - $s3 = $r3->toInt64()->mulInt(5, 3); - $s4 = $r4->toInt64()->mulInt(5, 3); - - $h0 = $this->h[0]; - $h1 = $this->h[1]; - $h2 = $this->h[2]; - $h3 = $this->h[3]; - $h4 = $this->h[4]; - - while ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { - /* h += m[i] */ - $h0 = $h0->addInt32( - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4)) - ->mask(0x3ffffff) - )->toInt64(); - $h1 = $h1->addInt32( - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 3, 4)) - ->shiftRight(2) - ->mask(0x3ffffff) - )->toInt64(); - $h2 = $h2->addInt32( - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 6, 4)) - ->shiftRight(4) - ->mask(0x3ffffff) - )->toInt64(); - $h3 = $h3->addInt32( - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 9, 4)) - ->shiftRight(6) - ->mask(0x3ffffff) - )->toInt64(); - $h4 = $h4->addInt32( - ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4)) - ->shiftRight(8) - ->orInt32($hibit) - )->toInt64(); - - /* h *= r */ - $d0 = $zero - ->addInt64($h0->mulInt64($r0, 25)) - ->addInt64($s4->mulInt64($h1, 26)) - ->addInt64($s3->mulInt64($h2, 26)) - ->addInt64($s2->mulInt64($h3, 26)) - ->addInt64($s1->mulInt64($h4, 26)); - - $d1 = $zero - ->addInt64($h0->mulInt64($r1, 25)) - ->addInt64($h1->mulInt64($r0, 25)) - ->addInt64($s4->mulInt64($h2, 26)) - ->addInt64($s3->mulInt64($h3, 26)) - ->addInt64($s2->mulInt64($h4, 26)); - - $d2 = $zero - ->addInt64($h0->mulInt64($r2, 25)) - ->addInt64($h1->mulInt64($r1, 25)) - ->addInt64($h2->mulInt64($r0, 25)) - ->addInt64($s4->mulInt64($h3, 26)) - ->addInt64($s3->mulInt64($h4, 26)); - - $d3 = $zero - ->addInt64($h0->mulInt64($r3, 25)) - ->addInt64($h1->mulInt64($r2, 25)) - ->addInt64($h2->mulInt64($r1, 25)) - ->addInt64($h3->mulInt64($r0, 25)) - ->addInt64($s4->mulInt64($h4, 26)); - - $d4 = $zero - ->addInt64($h0->mulInt64($r4, 25)) - ->addInt64($h1->mulInt64($r3, 25)) - ->addInt64($h2->mulInt64($r2, 25)) - ->addInt64($h3->mulInt64($r1, 25)) - ->addInt64($h4->mulInt64($r0, 25)); - - /* (partial) h %= p */ - $c = $d0->shiftRight(26); - $h0 = $d0->toInt32()->mask(0x3ffffff); - $d1 = $d1->addInt64($c); - - $c = $d1->shiftRight(26); - $h1 = $d1->toInt32()->mask(0x3ffffff); - $d2 = $d2->addInt64($c); - - $c = $d2->shiftRight(26); - $h2 = $d2->toInt32()->mask(0x3ffffff); - $d3 = $d3->addInt64($c); - - $c = $d3->shiftRight(26); - $h3 = $d3->toInt32()->mask(0x3ffffff); - $d4 = $d4->addInt64($c); - - $c = $d4->shiftRight(26); - $h4 = $d4->toInt32()->mask(0x3ffffff); - $h0 = $h0->addInt32($c->toInt32()->mulInt(5, 3)); - - $c = $h0->shiftRight(26); - $h0 = $h0->mask(0x3ffffff); - $h1 = $h1->addInt32($c); - - // Chop off the left 32 bytes. - $message = self::substr( - $message, - ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - ); - $bytes -= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE; - } - - /** @var array $h */ - $this->h = array($h0, $h1, $h2, $h3, $h4); - return $this; - } - - /** - * @internal You should not use this directly from another application - * - * @return string - * @throws SodiumException - * @throws TypeError - */ - public function finish() - { - /* process the remaining block */ - if ($this->leftover) { - $i = $this->leftover; - $this->buffer[$i++] = 1; - for (; $i < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE; ++$i) { - $this->buffer[$i] = 0; - } - $this->final = true; - $this->blocks( - self::substr( - self::intArrayToString($this->buffer), - 0, - ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - ), - $b = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - ); - } - - /** - * @var ParagonIE_Sodium_Core32_Int32 $f - * @var ParagonIE_Sodium_Core32_Int32 $g0 - * @var ParagonIE_Sodium_Core32_Int32 $g1 - * @var ParagonIE_Sodium_Core32_Int32 $g2 - * @var ParagonIE_Sodium_Core32_Int32 $g3 - * @var ParagonIE_Sodium_Core32_Int32 $g4 - * @var ParagonIE_Sodium_Core32_Int32 $h0 - * @var ParagonIE_Sodium_Core32_Int32 $h1 - * @var ParagonIE_Sodium_Core32_Int32 $h2 - * @var ParagonIE_Sodium_Core32_Int32 $h3 - * @var ParagonIE_Sodium_Core32_Int32 $h4 - */ - $h0 = $this->h[0]; - $h1 = $this->h[1]; - $h2 = $this->h[2]; - $h3 = $this->h[3]; - $h4 = $this->h[4]; - - $c = $h1->shiftRight(26); # $c = $h1 >> 26; - $h1 = $h1->mask(0x3ffffff); # $h1 &= 0x3ffffff; - - $h2 = $h2->addInt32($c); # $h2 += $c; - $c = $h2->shiftRight(26); # $c = $h2 >> 26; - $h2 = $h2->mask(0x3ffffff); # $h2 &= 0x3ffffff; - - $h3 = $h3->addInt32($c); # $h3 += $c; - $c = $h3->shiftRight(26); # $c = $h3 >> 26; - $h3 = $h3->mask(0x3ffffff); # $h3 &= 0x3ffffff; - - $h4 = $h4->addInt32($c); # $h4 += $c; - $c = $h4->shiftRight(26); # $c = $h4 >> 26; - $h4 = $h4->mask(0x3ffffff); # $h4 &= 0x3ffffff; - - $h0 = $h0->addInt32($c->mulInt(5, 3)); # $h0 += self::mul($c, 5); - $c = $h0->shiftRight(26); # $c = $h0 >> 26; - $h0 = $h0->mask(0x3ffffff); # $h0 &= 0x3ffffff; - $h1 = $h1->addInt32($c); # $h1 += $c; - - /* compute h + -p */ - $g0 = $h0->addInt(5); - $c = $g0->shiftRight(26); - $g0 = $g0->mask(0x3ffffff); - $g1 = $h1->addInt32($c); - $c = $g1->shiftRight(26); - $g1 = $g1->mask(0x3ffffff); - $g2 = $h2->addInt32($c); - $c = $g2->shiftRight(26); - $g2 = $g2->mask(0x3ffffff); - $g3 = $h3->addInt32($c); - $c = $g3->shiftRight(26); - $g3 = $g3->mask(0x3ffffff); - $g4 = $h4->addInt32($c)->subInt(1 << 26); - - # $mask = ($g4 >> 31) - 1; - /* select h if h < p, or h + -p if h >= p */ - $mask = (int) (($g4->toInt() >> 31) + 1); - - $g0 = $g0->mask($mask); - $g1 = $g1->mask($mask); - $g2 = $g2->mask($mask); - $g3 = $g3->mask($mask); - $g4 = $g4->mask($mask); - - /** @var int $mask */ - $mask = (~$mask) & 0xffffffff; - - $h0 = $h0->mask($mask)->orInt32($g0); - $h1 = $h1->mask($mask)->orInt32($g1); - $h2 = $h2->mask($mask)->orInt32($g2); - $h3 = $h3->mask($mask)->orInt32($g3); - $h4 = $h4->mask($mask)->orInt32($g4); - - /* h = h % (2^128) */ - $h0 = $h0->orInt32($h1->shiftLeft(26)); - $h1 = $h1->shiftRight(6)->orInt32($h2->shiftLeft(20)); - $h2 = $h2->shiftRight(12)->orInt32($h3->shiftLeft(14)); - $h3 = $h3->shiftRight(18)->orInt32($h4->shiftLeft(8)); - - /* mac = (h + pad) % (2^128) */ - $f = $h0->toInt64()->addInt64($this->pad[0]); - $h0 = $f->toInt32(); - $f = $h1->toInt64()->addInt64($this->pad[1])->addInt($h0->overflow); - $h1 = $f->toInt32(); - $f = $h2->toInt64()->addInt64($this->pad[2])->addInt($h1->overflow); - $h2 = $f->toInt32(); - $f = $h3->toInt64()->addInt64($this->pad[3])->addInt($h2->overflow); - $h3 = $f->toInt32(); - - return $h0->toReverseString() . - $h1->toReverseString() . - $h2->toReverseString() . - $h3->toReverseString(); - } -} diff --git a/libs/sodium_compat/src/Core32/Salsa20.php b/libs/sodium_compat/src/Core32/Salsa20.php deleted file mode 100644 index d8c8073..0000000 --- a/libs/sodium_compat/src/Core32/Salsa20.php +++ /dev/null @@ -1,306 +0,0 @@ - 0; $i -= 2) { - $x4 = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7)); - $x8 = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9)); - $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13)); - $x0 = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18)); - - $x9 = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7)); - $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9)); - $x1 = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13)); - $x5 = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18)); - - $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7)); - $x2 = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9)); - $x6 = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13)); - $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18)); - - $x3 = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7)); - $x7 = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9)); - $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13)); - $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18)); - - $x1 = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7)); - $x2 = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9)); - $x3 = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13)); - $x0 = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18)); - - $x6 = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7)); - $x7 = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9)); - $x4 = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13)); - $x5 = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18)); - - $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7)); - $x8 = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9)); - $x9 = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13)); - $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18)); - - $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7)); - $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9)); - $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13)); - $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18)); - } - - $x0 = $x0->addInt32($j0); - $x1 = $x1->addInt32($j1); - $x2 = $x2->addInt32($j2); - $x3 = $x3->addInt32($j3); - $x4 = $x4->addInt32($j4); - $x5 = $x5->addInt32($j5); - $x6 = $x6->addInt32($j6); - $x7 = $x7->addInt32($j7); - $x8 = $x8->addInt32($j8); - $x9 = $x9->addInt32($j9); - $x10 = $x10->addInt32($j10); - $x11 = $x11->addInt32($j11); - $x12 = $x12->addInt32($j12); - $x13 = $x13->addInt32($j13); - $x14 = $x14->addInt32($j14); - $x15 = $x15->addInt32($j15); - - return $x0->toReverseString() . - $x1->toReverseString() . - $x2->toReverseString() . - $x3->toReverseString() . - $x4->toReverseString() . - $x5->toReverseString() . - $x6->toReverseString() . - $x7->toReverseString() . - $x8->toReverseString() . - $x9->toReverseString() . - $x10->toReverseString() . - $x11->toReverseString() . - $x12->toReverseString() . - $x13->toReverseString() . - $x14->toReverseString() . - $x15->toReverseString(); - } - - /** - * @internal You should not use this directly from another application - * - * @param int $len - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function salsa20($len, $nonce, $key) - { - if (self::strlen($key) !== 32) { - throw new RangeException('Key must be 32 bytes long'); - } - $kcopy = '' . $key; - $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8); - $c = ''; - while ($len >= 64) { - $c .= self::core_salsa20($in, $kcopy, null); - $u = 1; - // Internal counter. - for ($i = 8; $i < 16; ++$i) { - $u += self::chrToInt($in[$i]); - $in[$i] = self::intToChr($u & 0xff); - $u >>= 8; - } - $len -= 64; - } - if ($len > 0) { - $c .= self::substr( - self::core_salsa20($in, $kcopy, null), - 0, - $len - ); - } - try { - ParagonIE_Sodium_Compat::memzero($kcopy); - } catch (SodiumException $ex) { - $kcopy = null; - } - return $c; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $m - * @param string $n - * @param int $ic - * @param string $k - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function salsa20_xor_ic($m, $n, $ic, $k) - { - $mlen = self::strlen($m); - if ($mlen < 1) { - return ''; - } - $kcopy = self::substr($k, 0, 32); - $in = self::substr($n, 0, 8); - // Initialize the counter - $in .= ParagonIE_Sodium_Core32_Util::store64_le($ic); - - $c = ''; - while ($mlen >= 64) { - $block = self::core_salsa20($in, $kcopy, null); - $c .= self::xorStrings( - self::substr($m, 0, 64), - self::substr($block, 0, 64) - ); - $u = 1; - for ($i = 8; $i < 16; ++$i) { - $u += self::chrToInt($in[$i]); - $in[$i] = self::intToChr($u & 0xff); - $u >>= 8; - } - - $mlen -= 64; - $m = self::substr($m, 64); - } - - if ($mlen) { - $block = self::core_salsa20($in, $kcopy, null); - $c .= self::xorStrings( - self::substr($m, 0, $mlen), - self::substr($block, 0, $mlen) - ); - } - try { - ParagonIE_Sodium_Compat::memzero($block); - ParagonIE_Sodium_Compat::memzero($kcopy); - } catch (SodiumException $ex) { - $block = null; - $kcopy = null; - } - - return $c; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $message - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function salsa20_xor($message, $nonce, $key) - { - return self::xorStrings( - $message, - self::salsa20( - self::strlen($message), - $nonce, - $key - ) - ); - } -} diff --git a/libs/sodium_compat/src/Core32/SecretStream/State.php b/libs/sodium_compat/src/Core32/SecretStream/State.php deleted file mode 100644 index 6f20486..0000000 --- a/libs/sodium_compat/src/Core32/SecretStream/State.php +++ /dev/null @@ -1,163 +0,0 @@ -key = $key; - $this->counter = 1; - if (is_null($nonce)) { - $nonce = str_repeat("\0", 12); - } - $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);; - $this->_pad = str_repeat("\0", 4); - } - - /** - * @return self - */ - public function counterReset() - { - $this->counter = 1; - $this->_pad = str_repeat("\0", 4); - return $this; - } - - /** - * @return string - */ - public function getKey() - { - return $this->key; - } - - /** - * @return string - */ - public function getCounter() - { - return ParagonIE_Sodium_Core32_Util::store32_le($this->counter); - } - - /** - * @return string - */ - public function getNonce() - { - if (!is_string($this->nonce)) { - $this->nonce = str_repeat("\0", 12); - } - if (ParagonIE_Sodium_Core32_Util::strlen($this->nonce) !== 12) { - $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT); - } - return $this->nonce; - } - - /** - * @return string - */ - public function getCombinedNonce() - { - return $this->getCounter() . - ParagonIE_Sodium_Core32_Util::substr($this->getNonce(), 0, 8); - } - - /** - * @return self - */ - public function incrementCounter() - { - ++$this->counter; - return $this; - } - - /** - * @return bool - */ - public function needsRekey() - { - return ($this->counter & 0xffff) === 0; - } - - /** - * @param string $newKeyAndNonce - * @return self - */ - public function rekey($newKeyAndNonce) - { - $this->key = ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 0, 32); - $this->nonce = str_pad( - ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 32), - 12, - "\0", - STR_PAD_RIGHT - ); - return $this; - } - - /** - * @param string $str - * @return self - */ - public function xorNonce($str) - { - $this->nonce = ParagonIE_Sodium_Core32_Util::xorStrings( - $this->getNonce(), - str_pad( - ParagonIE_Sodium_Core32_Util::substr($str, 0, 8), - 12, - "\0", - STR_PAD_RIGHT - ) - ); - return $this; - } - - /** - * @param string $string - * @return self - */ - public static function fromString($string) - { - $state = new ParagonIE_Sodium_Core32_SecretStream_State( - ParagonIE_Sodium_Core32_Util::substr($string, 0, 32) - ); - $state->counter = ParagonIE_Sodium_Core32_Util::load_4( - ParagonIE_Sodium_Core32_Util::substr($string, 32, 4) - ); - $state->nonce = ParagonIE_Sodium_Core32_Util::substr($string, 36, 12); - $state->_pad = ParagonIE_Sodium_Core32_Util::substr($string, 48, 8); - return $state; - } - - /** - * @return string - */ - public function toString() - { - return $this->key . - $this->getCounter() . - $this->nonce . - $this->_pad; - } -} diff --git a/libs/sodium_compat/src/Core32/SipHash.php b/libs/sodium_compat/src/Core32/SipHash.php deleted file mode 100644 index 079946d..0000000 --- a/libs/sodium_compat/src/Core32/SipHash.php +++ /dev/null @@ -1,238 +0,0 @@ - $v - * @return array - */ - public static function sipRound(array $v) - { - # v0 += v1; - $v[0] = $v[0]->addInt64($v[1]); - - # v1 = ROTL(v1, 13); - $v[1] = $v[1]->rotateLeft(13); - - # v1 ^= v0; - $v[1] = $v[1]->xorInt64($v[0]); - - # v0=ROTL(v0,32); - $v[0] = $v[0]->rotateLeft(32); - - # v2 += v3; - $v[2] = $v[2]->addInt64($v[3]); - - # v3=ROTL(v3,16); - $v[3] = $v[3]->rotateLeft(16); - - # v3 ^= v2; - $v[3] = $v[3]->xorInt64($v[2]); - - # v0 += v3; - $v[0] = $v[0]->addInt64($v[3]); - - # v3=ROTL(v3,21); - $v[3] = $v[3]->rotateLeft(21); - - # v3 ^= v0; - $v[3] = $v[3]->xorInt64($v[0]); - - # v2 += v1; - $v[2] = $v[2]->addInt64($v[1]); - - # v1=ROTL(v1,17); - $v[1] = $v[1]->rotateLeft(17); - - # v1 ^= v2; - $v[1] = $v[1]->xorInt64($v[2]); - - # v2=ROTL(v2,32) - $v[2] = $v[2]->rotateLeft(32); - - return $v; - } - - /** - * @internal You should not use this directly from another application - * - * @param string $in - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sipHash24($in, $key) - { - $inlen = self::strlen($in); - - # /* "somepseudorandomlygeneratedbytes" */ - # u64 v0 = 0x736f6d6570736575ULL; - # u64 v1 = 0x646f72616e646f6dULL; - # u64 v2 = 0x6c7967656e657261ULL; - # u64 v3 = 0x7465646279746573ULL; - $v = array( - new ParagonIE_Sodium_Core32_Int64( - array(0x736f, 0x6d65, 0x7073, 0x6575) - ), - new ParagonIE_Sodium_Core32_Int64( - array(0x646f, 0x7261, 0x6e64, 0x6f6d) - ), - new ParagonIE_Sodium_Core32_Int64( - array(0x6c79, 0x6765, 0x6e65, 0x7261) - ), - new ParagonIE_Sodium_Core32_Int64( - array(0x7465, 0x6462, 0x7974, 0x6573) - ) - ); - - # u64 k0 = LOAD64_LE( k ); - # u64 k1 = LOAD64_LE( k + 8 ); - $k = array( - ParagonIE_Sodium_Core32_Int64::fromReverseString( - self::substr($key, 0, 8) - ), - ParagonIE_Sodium_Core32_Int64::fromReverseString( - self::substr($key, 8, 8) - ) - ); - - # b = ( ( u64 )inlen ) << 56; - $b = new ParagonIE_Sodium_Core32_Int64( - array(($inlen << 8) & 0xffff, 0, 0, 0) - ); - - # v3 ^= k1; - $v[3] = $v[3]->xorInt64($k[1]); - # v2 ^= k0; - $v[2] = $v[2]->xorInt64($k[0]); - # v1 ^= k1; - $v[1] = $v[1]->xorInt64($k[1]); - # v0 ^= k0; - $v[0] = $v[0]->xorInt64($k[0]); - - $left = $inlen; - # for ( ; in != end; in += 8 ) - while ($left >= 8) { - # m = LOAD64_LE( in ); - $m = ParagonIE_Sodium_Core32_Int64::fromReverseString( - self::substr($in, 0, 8) - ); - - # v3 ^= m; - $v[3] = $v[3]->xorInt64($m); - - # SIPROUND; - # SIPROUND; - $v = self::sipRound($v); - $v = self::sipRound($v); - - # v0 ^= m; - $v[0] = $v[0]->xorInt64($m); - - $in = self::substr($in, 8); - $left -= 8; - } - - # switch( left ) - # { - # case 7: b |= ( ( u64 )in[ 6] ) << 48; - # case 6: b |= ( ( u64 )in[ 5] ) << 40; - # case 5: b |= ( ( u64 )in[ 4] ) << 32; - # case 4: b |= ( ( u64 )in[ 3] ) << 24; - # case 3: b |= ( ( u64 )in[ 2] ) << 16; - # case 2: b |= ( ( u64 )in[ 1] ) << 8; - # case 1: b |= ( ( u64 )in[ 0] ); break; - # case 0: break; - # } - switch ($left) { - case 7: - $b = $b->orInt64( - ParagonIE_Sodium_Core32_Int64::fromInts( - 0, self::chrToInt($in[6]) << 16 - ) - ); - case 6: - $b = $b->orInt64( - ParagonIE_Sodium_Core32_Int64::fromInts( - 0, self::chrToInt($in[5]) << 8 - ) - ); - case 5: - $b = $b->orInt64( - ParagonIE_Sodium_Core32_Int64::fromInts( - 0, self::chrToInt($in[4]) - ) - ); - case 4: - $b = $b->orInt64( - ParagonIE_Sodium_Core32_Int64::fromInts( - self::chrToInt($in[3]) << 24, 0 - ) - ); - case 3: - $b = $b->orInt64( - ParagonIE_Sodium_Core32_Int64::fromInts( - self::chrToInt($in[2]) << 16, 0 - ) - ); - case 2: - $b = $b->orInt64( - ParagonIE_Sodium_Core32_Int64::fromInts( - self::chrToInt($in[1]) << 8, 0 - ) - ); - case 1: - $b = $b->orInt64( - ParagonIE_Sodium_Core32_Int64::fromInts( - self::chrToInt($in[0]), 0 - ) - ); - case 0: - break; - } - - # v3 ^= b; - $v[3] = $v[3]->xorInt64($b); - - # SIPROUND; - # SIPROUND; - $v = self::sipRound($v); - $v = self::sipRound($v); - - # v0 ^= b; - $v[0] = $v[0]->xorInt64($b); - - // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation - # v2 ^= 0xff; - $v[2]->limbs[3] ^= 0xff; - - # SIPROUND; - # SIPROUND; - # SIPROUND; - # SIPROUND; - $v = self::sipRound($v); - $v = self::sipRound($v); - $v = self::sipRound($v); - $v = self::sipRound($v); - - # b = v0 ^ v1 ^ v2 ^ v3; - # STORE64_LE( out, b ); - return $v[0] - ->xorInt64($v[1]) - ->xorInt64($v[2]) - ->xorInt64($v[3]) - ->toReverseString(); - } -} diff --git a/libs/sodium_compat/src/Core32/Util.php b/libs/sodium_compat/src/Core32/Util.php deleted file mode 100644 index f32e5ad..0000000 --- a/libs/sodium_compat/src/Core32/Util.php +++ /dev/null @@ -1,13 +0,0 @@ -toInt(); - $f1 = (int) $f[1]->toInt(); - $f2 = (int) $f[2]->toInt(); - $f3 = (int) $f[3]->toInt(); - $f4 = (int) $f[4]->toInt(); - $f5 = (int) $f[5]->toInt(); - $f6 = (int) $f[6]->toInt(); - $f7 = (int) $f[7]->toInt(); - $f8 = (int) $f[8]->toInt(); - $f9 = (int) $f[9]->toInt(); - $g0 = (int) $g[0]->toInt(); - $g1 = (int) $g[1]->toInt(); - $g2 = (int) $g[2]->toInt(); - $g3 = (int) $g[3]->toInt(); - $g4 = (int) $g[4]->toInt(); - $g5 = (int) $g[5]->toInt(); - $g6 = (int) $g[6]->toInt(); - $g7 = (int) $g[7]->toInt(); - $g8 = (int) $g[8]->toInt(); - $g9 = (int) $g[9]->toInt(); - $b = -$b; - /** @var int $x0 */ - $x0 = ($f0 ^ $g0) & $b; - /** @var int $x1 */ - $x1 = ($f1 ^ $g1) & $b; - /** @var int $x2 */ - $x2 = ($f2 ^ $g2) & $b; - /** @var int $x3 */ - $x3 = ($f3 ^ $g3) & $b; - /** @var int $x4 */ - $x4 = ($f4 ^ $g4) & $b; - /** @var int $x5 */ - $x5 = ($f5 ^ $g5) & $b; - /** @var int $x6 */ - $x6 = ($f6 ^ $g6) & $b; - /** @var int $x7 */ - $x7 = ($f7 ^ $g7) & $b; - /** @var int $x8 */ - $x8 = ($f8 ^ $g8) & $b; - /** @var int $x9 */ - $x9 = ($f9 ^ $g9) & $b; - $f[0] = ParagonIE_Sodium_Core32_Int32::fromInt($f0 ^ $x0); - $f[1] = ParagonIE_Sodium_Core32_Int32::fromInt($f1 ^ $x1); - $f[2] = ParagonIE_Sodium_Core32_Int32::fromInt($f2 ^ $x2); - $f[3] = ParagonIE_Sodium_Core32_Int32::fromInt($f3 ^ $x3); - $f[4] = ParagonIE_Sodium_Core32_Int32::fromInt($f4 ^ $x4); - $f[5] = ParagonIE_Sodium_Core32_Int32::fromInt($f5 ^ $x5); - $f[6] = ParagonIE_Sodium_Core32_Int32::fromInt($f6 ^ $x6); - $f[7] = ParagonIE_Sodium_Core32_Int32::fromInt($f7 ^ $x7); - $f[8] = ParagonIE_Sodium_Core32_Int32::fromInt($f8 ^ $x8); - $f[9] = ParagonIE_Sodium_Core32_Int32::fromInt($f9 ^ $x9); - $g[0] = ParagonIE_Sodium_Core32_Int32::fromInt($g0 ^ $x0); - $g[1] = ParagonIE_Sodium_Core32_Int32::fromInt($g1 ^ $x1); - $g[2] = ParagonIE_Sodium_Core32_Int32::fromInt($g2 ^ $x2); - $g[3] = ParagonIE_Sodium_Core32_Int32::fromInt($g3 ^ $x3); - $g[4] = ParagonIE_Sodium_Core32_Int32::fromInt($g4 ^ $x4); - $g[5] = ParagonIE_Sodium_Core32_Int32::fromInt($g5 ^ $x5); - $g[6] = ParagonIE_Sodium_Core32_Int32::fromInt($g6 ^ $x6); - $g[7] = ParagonIE_Sodium_Core32_Int32::fromInt($g7 ^ $x7); - $g[8] = ParagonIE_Sodium_Core32_Int32::fromInt($g8 ^ $x8); - $g[9] = ParagonIE_Sodium_Core32_Int32::fromInt($g9 ^ $x9); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedMethodCall - */ - public static function fe_mul121666(ParagonIE_Sodium_Core32_Curve25519_Fe $f) - { - /** @var array $h */ - $h = array(); - for ($i = 0; $i < 10; ++$i) { - $h[$i] = $f[$i]->toInt64()->mulInt(121666, 17); - } - - $carry9 = $h[9]->addInt(1 << 24)->shiftRight(25); - $h[0] = $h[0]->addInt64($carry9->mulInt(19, 5)); - $h[9] = $h[9]->subInt64($carry9->shiftLeft(25)); - - $carry1 = $h[1]->addInt(1 << 24)->shiftRight(25); - $h[2] = $h[2]->addInt64($carry1); - $h[1] = $h[1]->subInt64($carry1->shiftLeft(25)); - - $carry3 = $h[3]->addInt(1 << 24)->shiftRight(25); - $h[4] = $h[4]->addInt64($carry3); - $h[3] = $h[3]->subInt64($carry3->shiftLeft(25)); - - $carry5 = $h[5]->addInt(1 << 24)->shiftRight(25); - $h[6] = $h[6]->addInt64($carry5); - $h[5] = $h[5]->subInt64($carry5->shiftLeft(25)); - - $carry7 = $h[7]->addInt(1 << 24)->shiftRight(25); - $h[8] = $h[8]->addInt64($carry7); - $h[7] = $h[7]->subInt64($carry7->shiftLeft(25)); - - $carry0 = $h[0]->addInt(1 << 25)->shiftRight(26); - $h[1] = $h[1]->addInt64($carry0); - $h[0] = $h[0]->subInt64($carry0->shiftLeft(26)); - - $carry2 = $h[2]->addInt(1 << 25)->shiftRight(26); - $h[3] = $h[3]->addInt64($carry2); - $h[2] = $h[2]->subInt64($carry2->shiftLeft(26)); - - $carry4 = $h[4]->addInt(1 << 25)->shiftRight(26); - $h[5] = $h[5]->addInt64($carry4); - $h[4] = $h[4]->subInt64($carry4->shiftLeft(26)); - - $carry6 = $h[6]->addInt(1 << 25)->shiftRight(26); - $h[7] = $h[7]->addInt64($carry6); - $h[6] = $h[6]->subInt64($carry6->shiftLeft(26)); - - $carry8 = $h[8]->addInt(1 << 25)->shiftRight(26); - $h[9] = $h[9]->addInt64($carry8); - $h[8] = $h[8]->subInt64($carry8->shiftLeft(26)); - - for ($i = 0; $i < 10; ++$i) { - $h[$i] = $h[$i]->toInt32(); - } - /** @var array $h2 */ - $h2 = $h; - return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h2); - } - - /** - * @internal You should not use this directly from another application - * - * Inline comments preceded by # are from libsodium's ref10 code. - * - * @param string $n - * @param string $p - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_scalarmult_curve25519_ref10($n, $p) - { - # for (i = 0;i < 32;++i) e[i] = n[i]; - $e = '' . $n; - # e[0] &= 248; - $e[0] = self::intToChr( - self::chrToInt($e[0]) & 248 - ); - # e[31] &= 127; - # e[31] |= 64; - $e[31] = self::intToChr( - (self::chrToInt($e[31]) & 127) | 64 - ); - # fe_frombytes(x1,p); - $x1 = self::fe_frombytes($p); - # fe_1(x2); - $x2 = self::fe_1(); - # fe_0(z2); - $z2 = self::fe_0(); - # fe_copy(x3,x1); - $x3 = self::fe_copy($x1); - # fe_1(z3); - $z3 = self::fe_1(); - - # swap = 0; - /** @var int $swap */ - $swap = 0; - - # for (pos = 254;pos >= 0;--pos) { - for ($pos = 254; $pos >= 0; --$pos) { - # b = e[pos / 8] >> (pos & 7); - /** @var int $b */ - $b = self::chrToInt( - $e[(int) floor($pos / 8)] - ) >> ($pos & 7); - # b &= 1; - $b &= 1; - - # swap ^= b; - $swap ^= $b; - - # fe_cswap(x2,x3,swap); - self::fe_cswap($x2, $x3, $swap); - - # fe_cswap(z2,z3,swap); - self::fe_cswap($z2, $z3, $swap); - - # swap = b; - /** @var int $swap */ - $swap = $b; - - # fe_sub(tmp0,x3,z3); - $tmp0 = self::fe_sub($x3, $z3); - - # fe_sub(tmp1,x2,z2); - $tmp1 = self::fe_sub($x2, $z2); - - # fe_add(x2,x2,z2); - $x2 = self::fe_add($x2, $z2); - - # fe_add(z2,x3,z3); - $z2 = self::fe_add($x3, $z3); - - # fe_mul(z3,tmp0,x2); - $z3 = self::fe_mul($tmp0, $x2); - - # fe_mul(z2,z2,tmp1); - $z2 = self::fe_mul($z2, $tmp1); - - # fe_sq(tmp0,tmp1); - $tmp0 = self::fe_sq($tmp1); - - # fe_sq(tmp1,x2); - $tmp1 = self::fe_sq($x2); - - # fe_add(x3,z3,z2); - $x3 = self::fe_add($z3, $z2); - - # fe_sub(z2,z3,z2); - $z2 = self::fe_sub($z3, $z2); - - # fe_mul(x2,tmp1,tmp0); - $x2 = self::fe_mul($tmp1, $tmp0); - - # fe_sub(tmp1,tmp1,tmp0); - $tmp1 = self::fe_sub($tmp1, $tmp0); - - # fe_sq(z2,z2); - $z2 = self::fe_sq($z2); - - # fe_mul121666(z3,tmp1); - $z3 = self::fe_mul121666($tmp1); - - # fe_sq(x3,x3); - $x3 = self::fe_sq($x3); - - # fe_add(tmp0,tmp0,z3); - $tmp0 = self::fe_add($tmp0, $z3); - - # fe_mul(z3,x1,z2); - $z3 = self::fe_mul($x1, $z2); - - # fe_mul(z2,tmp1,tmp0); - $z2 = self::fe_mul($tmp1, $tmp0); - } - - # fe_cswap(x2,x3,swap); - self::fe_cswap($x2, $x3, $swap); - - # fe_cswap(z2,z3,swap); - self::fe_cswap($z2, $z3, $swap); - - # fe_invert(z2,z2); - $z2 = self::fe_invert($z2); - - # fe_mul(x2,x2,z2); - $x2 = self::fe_mul($x2, $z2); - # fe_tobytes(q,x2); - return (string) self::fe_tobytes($x2); - } - - /** - * @internal You should not use this directly from another application - * - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY - * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ - * @return ParagonIE_Sodium_Core32_Curve25519_Fe - * @throws SodiumException - * @throws TypeError - */ - public static function edwards_to_montgomery( - ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY, - ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ - ) { - $tempX = self::fe_add($edwardsZ, $edwardsY); - $tempZ = self::fe_sub($edwardsZ, $edwardsY); - $tempZ = self::fe_invert($tempZ); - return self::fe_mul($tempX, $tempZ); - } - - /** - * @internal You should not use this directly from another application - * - * @param string $n - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function crypto_scalarmult_curve25519_ref10_base($n) - { - # for (i = 0;i < 32;++i) e[i] = n[i]; - $e = '' . $n; - - # e[0] &= 248; - $e[0] = self::intToChr( - self::chrToInt($e[0]) & 248 - ); - - # e[31] &= 127; - # e[31] |= 64; - $e[31] = self::intToChr( - (self::chrToInt($e[31]) & 127) | 64 - ); - - $A = self::ge_scalarmult_base($e); - if ( - !($A->Y instanceof ParagonIE_Sodium_Core32_Curve25519_Fe) - || - !($A->Z instanceof ParagonIE_Sodium_Core32_Curve25519_Fe) - ) { - throw new TypeError('Null points encountered'); - } - $pk = self::edwards_to_montgomery($A->Y, $A->Z); - return self::fe_tobytes($pk); - } -} diff --git a/libs/sodium_compat/src/Core32/XChaCha20.php b/libs/sodium_compat/src/Core32/XChaCha20.php deleted file mode 100644 index 1dfc859..0000000 --- a/libs/sodium_compat/src/Core32/XChaCha20.php +++ /dev/null @@ -1,64 +0,0 @@ -update($ad); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); - $state->update($ciphertext); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); - $computed_mac = $state->finish(); - - /* Compare the given MAC with the recalculated MAC: */ - if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { - throw new SodiumException('Invalid MAC'); - } - - // Here, we know that the MAC is valid, so we decrypt and return the plaintext - return ParagonIE_Sodium_Core_ChaCha20::streamXorIc( - $ciphertext, - $nonce, - $key, - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - } - - /** - * AEAD Encryption with ChaCha20-Poly1305 - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_chacha20poly1305_encrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - /** @var int $len - Length of the plaintext message */ - $len = ParagonIE_Sodium_Core_Util::strlen($message); - - /** @var int $adlen - Length of the associated data */ - $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); - - /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ - $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( - 32, - $nonce, - $key - ); - $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); - try { - ParagonIE_Sodium_Compat::memzero($block0); - } catch (SodiumException $ex) { - $block0 = null; - } - - /** @var string $ciphertext - Raw encrypted data */ - $ciphertext = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( - $message, - $nonce, - $key, - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - - $state->update($ad); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); - $state->update($ciphertext); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); - return $ciphertext . $state->finish(); - } - - /** - * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_chacha20poly1305_ietf_decrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - /** @var int $adlen - Length of associated data */ - $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); - - /** @var int $len - Length of message (ciphertext + MAC) */ - $len = ParagonIE_Sodium_Core_Util::strlen($message); - - /** @var int $clen - Length of ciphertext */ - $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES; - - /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ - $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( - 32, - $nonce, - $key - ); - - /** @var string $mac - Message authentication code */ - $mac = ParagonIE_Sodium_Core_Util::substr( - $message, - $len - self::aead_chacha20poly1305_IETF_ABYTES, - self::aead_chacha20poly1305_IETF_ABYTES - ); - - /** @var string $ciphertext - The encrypted message (sans MAC) */ - $ciphertext = ParagonIE_Sodium_Core_Util::substr( - $message, - 0, - $len - self::aead_chacha20poly1305_IETF_ABYTES - ); - - /* Recalculate the Poly1305 authentication tag (MAC): */ - $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); - try { - ParagonIE_Sodium_Compat::memzero($block0); - } catch (SodiumException $ex) { - $block0 = null; - } - $state->update($ad); - $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); - $state->update($ciphertext); - $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf)); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); - $computed_mac = $state->finish(); - - /* Compare the given MAC with the recalculated MAC: */ - if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { - throw new SodiumException('Invalid MAC'); - } - - // Here, we know that the MAC is valid, so we decrypt and return the plaintext - return ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( - $ciphertext, - $nonce, - $key, - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - } - - /** - * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_chacha20poly1305_ietf_encrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - /** @var int $len - Length of the plaintext message */ - $len = ParagonIE_Sodium_Core_Util::strlen($message); - - /** @var int $adlen - Length of the associated data */ - $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); - - /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ - $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( - 32, - $nonce, - $key - ); - $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); - try { - ParagonIE_Sodium_Compat::memzero($block0); - } catch (SodiumException $ex) { - $block0 = null; - } - - /** @var string $ciphertext - Raw encrypted data */ - $ciphertext = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( - $message, - $nonce, - $key, - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - - $state->update($ad); - $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); - $state->update($ciphertext); - $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf))); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); - $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); - return $ciphertext . $state->finish(); - } - - /** - * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_xchacha20poly1305_ietf_decrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), - $key - ); - $nonceLast = "\x00\x00\x00\x00" . - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); - - return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey); - } - - /** - * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_xchacha20poly1305_ietf_encrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), - $key - ); - $nonceLast = "\x00\x00\x00\x00" . - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); - - return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey); - } - - /** - * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $key - * @return string - * @throws TypeError - */ - public static function auth($message, $key) - { - return ParagonIE_Sodium_Core_Util::substr( - hash_hmac('sha512', $message, $key, true), - 0, - 32 - ); - } - - /** - * HMAC-SHA-512-256 validation. Constant-time via hash_equals(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $mac - * @param string $message - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function auth_verify($mac, $message, $key) - { - return ParagonIE_Sodium_Core_Util::hashEquals( - $mac, - self::auth($message, $key) - ); - } - - /** - * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $plaintext - * @param string $nonce - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box($plaintext, $nonce, $keypair) - { - $c = self::secretbox( - $plaintext, - $nonce, - self::box_beforenm( - self::box_secretkey($keypair), - self::box_publickey($keypair) - ) - ); - return $c; - } - - /** - * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $publicKey - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_seal($message, $publicKey) - { - /** @var string $ephemeralKeypair */ - $ephemeralKeypair = self::box_keypair(); - - /** @var string $ephemeralSK */ - $ephemeralSK = self::box_secretkey($ephemeralKeypair); - - /** @var string $ephemeralPK */ - $ephemeralPK = self::box_publickey($ephemeralKeypair); - - /** @var string $nonce */ - $nonce = self::generichash( - $ephemeralPK . $publicKey, - '', - 24 - ); - - /** @var string $keypair - The combined keypair used in crypto_box() */ - $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey); - - /** @var string $ciphertext Ciphertext + MAC from crypto_box */ - $ciphertext = self::box($message, $nonce, $keypair); - try { - ParagonIE_Sodium_Compat::memzero($ephemeralKeypair); - ParagonIE_Sodium_Compat::memzero($ephemeralSK); - ParagonIE_Sodium_Compat::memzero($nonce); - } catch (SodiumException $ex) { - $ephemeralKeypair = null; - $ephemeralSK = null; - $nonce = null; - } - return $ephemeralPK . $ciphertext; - } - - /** - * Opens a message encrypted via box_seal(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_seal_open($message, $keypair) - { - /** @var string $ephemeralPK */ - $ephemeralPK = ParagonIE_Sodium_Core_Util::substr($message, 0, 32); - - /** @var string $ciphertext (ciphertext + MAC) */ - $ciphertext = ParagonIE_Sodium_Core_Util::substr($message, 32); - - /** @var string $secretKey */ - $secretKey = self::box_secretkey($keypair); - - /** @var string $publicKey */ - $publicKey = self::box_publickey($keypair); - - /** @var string $nonce */ - $nonce = self::generichash( - $ephemeralPK . $publicKey, - '', - 24 - ); - - /** @var string $keypair */ - $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK); - - /** @var string $m */ - $m = self::box_open($ciphertext, $nonce, $keypair); - try { - ParagonIE_Sodium_Compat::memzero($secretKey); - ParagonIE_Sodium_Compat::memzero($ephemeralPK); - ParagonIE_Sodium_Compat::memzero($nonce); - } catch (SodiumException $ex) { - $secretKey = null; - $ephemeralPK = null; - $nonce = null; - } - return $m; - } - - /** - * Used by crypto_box() to get the crypto_secretbox() key. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sk - * @param string $pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_beforenm($sk, $pk) - { - return ParagonIE_Sodium_Core_HSalsa20::hsalsa20( - str_repeat("\x00", 16), - self::scalarmult($sk, $pk) - ); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @return string - * @throws Exception - * @throws SodiumException - * @throws TypeError - */ - public static function box_keypair() - { - $sKey = random_bytes(32); - $pKey = self::scalarmult_base($sKey); - return $sKey . $pKey; - } - - /** - * @param string $seed - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_seed_keypair($seed) - { - $sKey = ParagonIE_Sodium_Core_Util::substr( - hash('sha512', $seed, true), - 0, - 32 - ); - $pKey = self::scalarmult_base($sKey); - return $sKey . $pKey; - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sKey - * @param string $pKey - * @return string - * @throws TypeError - */ - public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey) - { - return ParagonIE_Sodium_Core_Util::substr($sKey, 0, 32) . - ParagonIE_Sodium_Core_Util::substr($pKey, 0, 32); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $keypair - * @return string - * @throws RangeException - * @throws TypeError - */ - public static function box_secretkey($keypair) - { - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== 64) { - throw new RangeException( - 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' - ); - } - return ParagonIE_Sodium_Core_Util::substr($keypair, 0, 32); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $keypair - * @return string - * @throws RangeException - * @throws TypeError - */ - public static function box_publickey($keypair) - { - if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) { - throw new RangeException( - 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' - ); - } - return ParagonIE_Sodium_Core_Util::substr($keypair, 32, 32); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sKey - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function box_publickey_from_secretkey($sKey) - { - if (ParagonIE_Sodium_Core_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) { - throw new RangeException( - 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.' - ); - } - return self::scalarmult_base($sKey); - } - - /** - * Decrypt a message encrypted with box(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ciphertext - * @param string $nonce - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_open($ciphertext, $nonce, $keypair) - { - return self::secretbox_open( - $ciphertext, - $nonce, - self::box_beforenm( - self::box_secretkey($keypair), - self::box_publickey($keypair) - ) - ); - } - - /** - * Calculate a BLAKE2b hash. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string|null $key - * @param int $outlen - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function generichash($message, $key = '', $outlen = 32) - { - // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); - - $k = null; - if (!empty($key)) { - /** @var SplFixedArray $k */ - $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); - if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { - throw new RangeException('Invalid key size'); - } - } - - /** @var SplFixedArray $in */ - $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); - - /** @var SplFixedArray $ctx */ - $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outlen); - ParagonIE_Sodium_Core_BLAKE2b::update($ctx, $in, $in->count()); - - /** @var SplFixedArray $out */ - $out = new SplFixedArray($outlen); - $out = ParagonIE_Sodium_Core_BLAKE2b::finish($ctx, $out); - - /** @var array */ - $outArray = $out->toArray(); - return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); - } - - /** - * Finalize a BLAKE2b hashing context, returning the hash. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ctx - * @param int $outlen - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_final($ctx, $outlen = 32) - { - if (!is_string($ctx)) { - throw new TypeError('Context must be a string'); - } - $out = new SplFixedArray($outlen); - - /** @var SplFixedArray $context */ - $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); - - /** @var SplFixedArray $out */ - $out = ParagonIE_Sodium_Core_BLAKE2b::finish($context, $out); - - /** @var array */ - $outArray = $out->toArray(); - return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); - } - - /** - * Initialize a hashing context for BLAKE2b. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $key - * @param int $outputLength - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_init($key = '', $outputLength = 32) - { - // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); - - $k = null; - if (!empty($key)) { - $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); - if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { - throw new RangeException('Invalid key size'); - } - } - - /** @var SplFixedArray $ctx */ - $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength); - - return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); - } - - /** - * Initialize a hashing context for BLAKE2b. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $key - * @param int $outputLength - * @param string $salt - * @param string $personal - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_init_salt_personal( - $key = '', - $outputLength = 32, - $salt = '', - $personal = '' - ) { - // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); - - $k = null; - if (!empty($key)) { - $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); - if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { - throw new RangeException('Invalid key size'); - } - } - if (!empty($salt)) { - $s = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($salt); - } else { - $s = null; - } - if (!empty($salt)) { - $p = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($personal); - } else { - $p = null; - } - - /** @var SplFixedArray $ctx */ - $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength, $s, $p); - - return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); - } - - /** - * Update a hashing context for BLAKE2b with $message - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ctx - * @param string $message - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_update($ctx, $message) - { - // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); - - /** @var SplFixedArray $context */ - $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); - - /** @var SplFixedArray $in */ - $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); - - ParagonIE_Sodium_Core_BLAKE2b::update($context, $in, $in->count()); - - return ParagonIE_Sodium_Core_BLAKE2b::contextToString($context); - } - - /** - * Libsodium's crypto_kx(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $my_sk - * @param string $their_pk - * @param string $client_pk - * @param string $server_pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk) - { - return ParagonIE_Sodium_Compat::crypto_generichash( - ParagonIE_Sodium_Compat::crypto_scalarmult($my_sk, $their_pk) . - $client_pk . - $server_pk - ); - } - - /** - * ECDH over Curve25519 - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sKey - * @param string $pKey - * @return string - * - * @throws SodiumException - * @throws TypeError - */ - public static function scalarmult($sKey, $pKey) - { - $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey); - self::scalarmult_throw_if_zero($q); - return $q; - } - - /** - * ECDH over Curve25519, using the basepoint. - * Used to get a secret key from a public key. - * - * @param string $secret - * @return string - * - * @throws SodiumException - * @throws TypeError - */ - public static function scalarmult_base($secret) - { - $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10_base($secret); - self::scalarmult_throw_if_zero($q); - return $q; - } - - /** - * This throws an Error if a zero public key was passed to the function. - * - * @param string $q - * @return void - * @throws SodiumException - * @throws TypeError - */ - protected static function scalarmult_throw_if_zero($q) - { - $d = 0; - for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) { - $d |= ParagonIE_Sodium_Core_Util::chrToInt($q[$i]); - } - - /* branch-free variant of === 0 */ - if (-(1 & (($d - 1) >> 8))) { - throw new SodiumException('Zero public key is not allowed'); - } - } - - /** - * XSalsa20-Poly1305 authenticated symmetric-key encryption. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $plaintext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox($plaintext, $nonce, $key) - { - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $block0 */ - $block0 = str_repeat("\x00", 32); - - /** @var int $mlen - Length of the plaintext message */ - $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); - $mlen0 = $mlen; - if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) { - $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES; - } - $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( - $block0, - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), - $subkey - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core_Util::substr( - $block0, - self::secretbox_xsalsa20poly1305_ZEROBYTES - ); - if ($mlen > $mlen0) { - $c .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( - ParagonIE_Sodium_Core_Util::substr( - $plaintext, - self::secretbox_xsalsa20poly1305_ZEROBYTES - ), - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), - 1, - $subkey - ); - } - $state = new ParagonIE_Sodium_Core_Poly1305_State( - ParagonIE_Sodium_Core_Util::substr( - $block0, - 0, - self::onetimeauth_poly1305_KEYBYTES - ) - ); - try { - ParagonIE_Sodium_Compat::memzero($block0); - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $block0 = null; - $subkey = null; - } - - $state->update($c); - - /** @var string $c - MAC || ciphertext */ - $c = $state->finish() . $c; - unset($state); - - return $c; - } - - /** - * Decrypt a ciphertext generated via secretbox(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ciphertext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox_open($ciphertext, $nonce, $key) - { - /** @var string $mac */ - $mac = ParagonIE_Sodium_Core_Util::substr( - $ciphertext, - 0, - self::secretbox_xsalsa20poly1305_MACBYTES - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core_Util::substr( - $ciphertext, - self::secretbox_xsalsa20poly1305_MACBYTES - ); - - /** @var int $clen */ - $clen = ParagonIE_Sodium_Core_Util::strlen($c); - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( - 64, - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), - $subkey - ); - $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( - $mac, - $c, - ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) - ); - if (!$verified) { - try { - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $subkey = null; - } - throw new SodiumException('Invalid MAC'); - } - - /** @var string $m - Decrypted message */ - $m = ParagonIE_Sodium_Core_Util::xorStrings( - ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES), - ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES) - ); - if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) { - // We had more than 1 block, so let's continue to decrypt the rest. - $m .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( - ParagonIE_Sodium_Core_Util::substr( - $c, - self::secretbox_xsalsa20poly1305_ZEROBYTES - ), - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), - 1, - (string) $subkey - ); - } - return $m; - } - - /** - * XChaCha20-Poly1305 authenticated symmetric-key encryption. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $plaintext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key) - { - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), - $key - ); - $nonceLast = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); - - /** @var string $block0 */ - $block0 = str_repeat("\x00", 32); - - /** @var int $mlen - Length of the plaintext message */ - $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); - $mlen0 = $mlen; - if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) { - $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES; - } - $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( - $block0, - $nonceLast, - $subkey - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core_Util::substr( - $block0, - self::secretbox_xchacha20poly1305_ZEROBYTES - ); - if ($mlen > $mlen0) { - $c .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( - ParagonIE_Sodium_Core_Util::substr( - $plaintext, - self::secretbox_xchacha20poly1305_ZEROBYTES - ), - $nonceLast, - $subkey, - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - } - $state = new ParagonIE_Sodium_Core_Poly1305_State( - ParagonIE_Sodium_Core_Util::substr( - $block0, - 0, - self::onetimeauth_poly1305_KEYBYTES - ) - ); - try { - ParagonIE_Sodium_Compat::memzero($block0); - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $block0 = null; - $subkey = null; - } - - $state->update($c); - - /** @var string $c - MAC || ciphertext */ - $c = $state->finish() . $c; - unset($state); - - return $c; - } - - /** - * Decrypt a ciphertext generated via secretbox_xchacha20poly1305(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ciphertext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) - { - /** @var string $mac */ - $mac = ParagonIE_Sodium_Core_Util::substr( - $ciphertext, - 0, - self::secretbox_xchacha20poly1305_MACBYTES - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core_Util::substr( - $ciphertext, - self::secretbox_xchacha20poly1305_MACBYTES - ); - - /** @var int $clen */ - $clen = ParagonIE_Sodium_Core_Util::strlen($c); - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core_HChaCha20::hchacha20($nonce, $key); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( - 64, - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), - $subkey - ); - $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( - $mac, - $c, - ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) - ); - - if (!$verified) { - try { - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $subkey = null; - } - throw new SodiumException('Invalid MAC'); - } - - /** @var string $m - Decrypted message */ - $m = ParagonIE_Sodium_Core_Util::xorStrings( - ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES), - ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES) - ); - - if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) { - // We had more than 1 block, so let's continue to decrypt the rest. - $m .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( - ParagonIE_Sodium_Core_Util::substr( - $c, - self::secretbox_xchacha20poly1305_ZEROBYTES - ), - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), - (string) $subkey, - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - } - return $m; - } - - /** - * @param string $key - * @return array Returns a state and a header. - * @throws Exception - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_init_push($key) - { - # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES); - $out = random_bytes(24); - - # crypto_core_hchacha20(state->k, out, k, NULL); - $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20($out, $key); - $state = new ParagonIE_Sodium_Core_SecretStream_State( - $subkey, - ParagonIE_Sodium_Core_Util::substr($out, 16, 8) . str_repeat("\0", 4) - ); - - # _crypto_secretstream_xchacha20poly1305_counter_reset(state); - $state->counterReset(); - - # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - # memset(state->_pad, 0, sizeof state->_pad); - return array( - $state->toString(), - $out - ); - } - - /** - * @param string $key - * @param string $header - * @return string Returns a state. - * @throws Exception - */ - public static function secretstream_xchacha20poly1305_init_pull($key, $header) - { - # crypto_core_hchacha20(state->k, in, k, NULL); - $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core_Util::substr($header, 0, 16), - $key - ); - $state = new ParagonIE_Sodium_Core_SecretStream_State( - $subkey, - ParagonIE_Sodium_Core_Util::substr($header, 16) - ); - $state->counterReset(); - # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - # memset(state->_pad, 0, sizeof state->_pad); - # return 0; - return $state->toString(); - } - - /** - * @param string $state - * @param string $msg - * @param string $aad - * @param int $tag - * @return string - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) - { - $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); - # crypto_onetimeauth_poly1305_state poly1305_state; - # unsigned char block[64U]; - # unsigned char slen[8U]; - # unsigned char *c; - # unsigned char *mac; - - $msglen = ParagonIE_Sodium_Core_Util::strlen($msg); - $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); - - if ((($msglen + 63) >> 6) > 0xfffffffe) { - throw new SodiumException( - 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' - ); - } - - # if (outlen_p != NULL) { - # *outlen_p = 0U; - # } - # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { - # sodium_misuse(); - # } - - # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); - # crypto_onetimeauth_poly1305_init(&poly1305_state, block); - # sodium_memzero(block, sizeof block); - $auth = new ParagonIE_Sodium_Core_Poly1305_State( - ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); - $auth->update($aad); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, - # (0x10 - adlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); - - # memset(block, 0, sizeof block); - # block[0] = tag; - # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, - # state->nonce, 1U, state->k); - $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( - ParagonIE_Sodium_Core_Util::intToChr($tag) . str_repeat("\0", 63), - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); - $auth->update($block); - - # out[0] = block[0]; - $out = $block[0]; - # c = out + (sizeof tag); - # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k); - $cipher = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( - $msg, - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core_Util::store64_le(2) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); - $auth->update($cipher); - - $out .= $cipher; - unset($cipher); - - # crypto_onetimeauth_poly1305_update - # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); - - # STORE64_LE(slen, (uint64_t) adlen); - $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $auth->update($slen); - - # STORE64_LE(slen, (sizeof block) + mlen); - $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $auth->update($slen); - - # mac = c + mlen; - # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); - $mac = $auth->finish(); - $out .= $mac; - - # sodium_memzero(&poly1305_state, sizeof poly1305_state); - unset($auth); - - - # XOR_BUF(STATE_INONCE(state), mac, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - $st->xorNonce($mac); - - # sodium_increment(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); - $st->incrementCounter(); - // Overwrite by reference: - $state = $st->toString(); - - /** @var bool $rekey */ - $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; - # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || - # sodium_is_zero(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { - # crypto_secretstream_xchacha20poly1305_rekey(state); - # } - if ($rekey || $st->needsRekey()) { - // DO REKEY - self::secretstream_xchacha20poly1305_rekey($state); - } - # if (outlen_p != NULL) { - # *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen; - # } - return $out; - } - - /** - * @param string $state - * @param string $cipher - * @param string $aad - * @return bool|array{0: string, 1: int} - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') - { - $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); - - $cipherlen = ParagonIE_Sodium_Core_Util::strlen($cipher); - # mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES; - $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES; - $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); - - # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { - # sodium_misuse(); - # } - if ((($msglen + 63) >> 6) > 0xfffffffe) { - throw new SodiumException( - 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' - ); - } - - # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); - # crypto_onetimeauth_poly1305_init(&poly1305_state, block); - # sodium_memzero(block, sizeof block); - $auth = new ParagonIE_Sodium_Core_Poly1305_State( - ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); - $auth->update($aad); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, - # (0x10 - adlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); - - - # memset(block, 0, sizeof block); - # block[0] = in[0]; - # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, - # state->nonce, 1U, state->k); - $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( - $cipher[0] . str_repeat("\0", 63), - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core_Util::store64_le(1) - ); - # tag = block[0]; - # block[0] = in[0]; - # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); - $tag = ParagonIE_Sodium_Core_Util::chrToInt($block[0]); - $block[0] = $cipher[0]; - $auth->update($block); - - - # c = in + (sizeof tag); - # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); - $auth->update(ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen)); - - # crypto_onetimeauth_poly1305_update - # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); - - # STORE64_LE(slen, (uint64_t) adlen); - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); - $auth->update($slen); - - # STORE64_LE(slen, (sizeof block) + mlen); - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); - $auth->update($slen); - - # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); - # sodium_memzero(&poly1305_state, sizeof poly1305_state); - $mac = $auth->finish(); - - # stored_mac = c + mlen; - # if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) { - # sodium_memzero(mac, sizeof mac); - # return -1; - # } - - $stored = ParagonIE_Sodium_Core_Util::substr($cipher, $msglen + 1, 16); - if (!ParagonIE_Sodium_Core_Util::hashEquals($mac, $stored)) { - return false; - } - - # crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k); - $out = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( - ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen), - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core_Util::store64_le(2) - ); - - # XOR_BUF(STATE_INONCE(state), mac, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - $st->xorNonce($mac); - - # sodium_increment(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); - $st->incrementCounter(); - - # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || - # sodium_is_zero(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { - # crypto_secretstream_xchacha20poly1305_rekey(state); - # } - - // Overwrite by reference: - $state = $st->toString(); - - /** @var bool $rekey */ - $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; - if ($rekey || $st->needsRekey()) { - // DO REKEY - self::secretstream_xchacha20poly1305_rekey($state); - } - return array($out, $tag); - } - - /** - * @param string $state - * @return void - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_rekey(&$state) - { - $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); - # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + - # crypto_secretstream_xchacha20poly1305_INONCEBYTES]; - # size_t i; - # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { - # new_key_and_inonce[i] = state->k[i]; - # } - $new_key_and_inonce = $st->getKey(); - - # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { - # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] = - # STATE_INONCE(state)[i]; - # } - $new_key_and_inonce .= ParagonIE_Sodium_Core_Util::substR($st->getNonce(), 0, 8); - - # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, - # sizeof new_key_and_inonce, - # state->nonce, state->k); - - $st->rekey(ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( - $new_key_and_inonce, - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core_Util::store64_le(0) - )); - - # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { - # state->k[i] = new_key_and_inonce[i]; - # } - # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { - # STATE_INONCE(state)[i] = - # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i]; - # } - # _crypto_secretstream_xchacha20poly1305_counter_reset(state); - $st->counterReset(); - - $state = $st->toString(); - } - - /** - * Detached Ed25519 signature. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign_detached($message, $sk) - { - return ParagonIE_Sodium_Core_Ed25519::sign_detached($message, $sk); - } - - /** - * Attached Ed25519 signature. (Returns a signed message.) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign($message, $sk) - { - return ParagonIE_Sodium_Core_Ed25519::sign($message, $sk); - } - - /** - * Opens a signed message. If valid, returns the message. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $signedMessage - * @param string $pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign_open($signedMessage, $pk) - { - return ParagonIE_Sodium_Core_Ed25519::sign_open($signedMessage, $pk); - } - - /** - * Verify a detached signature of a given message and public key. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $signature - * @param string $message - * @param string $pk - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function sign_verify_detached($signature, $message, $pk) - { - return ParagonIE_Sodium_Core_Ed25519::verify_detached($signature, $message, $pk); - } -} diff --git a/libs/sodium_compat/src/Crypto32.php b/libs/sodium_compat/src/Crypto32.php deleted file mode 100644 index 34c0d7a..0000000 --- a/libs/sodium_compat/src/Crypto32.php +++ /dev/null @@ -1,1654 +0,0 @@ -update($ad); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); - $state->update($ciphertext); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen)); - $computed_mac = $state->finish(); - - /* Compare the given MAC with the recalculated MAC: */ - if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) { - throw new SodiumException('Invalid MAC'); - } - - // Here, we know that the MAC is valid, so we decrypt and return the plaintext - return ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( - $ciphertext, - $nonce, - $key, - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - } - - /** - * AEAD Encryption with ChaCha20-Poly1305 - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_chacha20poly1305_encrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - /** @var int $len - Length of the plaintext message */ - $len = ParagonIE_Sodium_Core32_Util::strlen($message); - - /** @var int $adlen - Length of the associated data */ - $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); - - /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ - $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream( - 32, - $nonce, - $key - ); - $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); - try { - ParagonIE_Sodium_Compat::memzero($block0); - } catch (SodiumException $ex) { - $block0 = null; - } - - /** @var string $ciphertext - Raw encrypted data */ - $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( - $message, - $nonce, - $key, - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - - $state->update($ad); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); - $state->update($ciphertext); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len)); - return $ciphertext . $state->finish(); - } - - /** - * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_chacha20poly1305_ietf_decrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - /** @var int $adlen - Length of associated data */ - $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); - - /** @var int $len - Length of message (ciphertext + MAC) */ - $len = ParagonIE_Sodium_Core32_Util::strlen($message); - - /** @var int $clen - Length of ciphertext */ - $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES; - - /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ - $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream( - 32, - $nonce, - $key - ); - - /** @var string $mac - Message authentication code */ - $mac = ParagonIE_Sodium_Core32_Util::substr( - $message, - $len - self::aead_chacha20poly1305_IETF_ABYTES, - self::aead_chacha20poly1305_IETF_ABYTES - ); - - /** @var string $ciphertext - The encrypted message (sans MAC) */ - $ciphertext = ParagonIE_Sodium_Core32_Util::substr( - $message, - 0, - $len - self::aead_chacha20poly1305_IETF_ABYTES - ); - - /* Recalculate the Poly1305 authentication tag (MAC): */ - $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); - try { - ParagonIE_Sodium_Compat::memzero($block0); - } catch (SodiumException $ex) { - $block0 = null; - } - $state->update($ad); - $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); - $state->update($ciphertext); - $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf)); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen)); - $computed_mac = $state->finish(); - - /* Compare the given MAC with the recalculated MAC: */ - if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) { - throw new SodiumException('Invalid MAC'); - } - - // Here, we know that the MAC is valid, so we decrypt and return the plaintext - return ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( - $ciphertext, - $nonce, - $key, - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - } - - /** - * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_chacha20poly1305_ietf_encrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - /** @var int $len - Length of the plaintext message */ - $len = ParagonIE_Sodium_Core32_Util::strlen($message); - - /** @var int $adlen - Length of the associated data */ - $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); - - /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ - $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream( - 32, - $nonce, - $key - ); - $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); - try { - ParagonIE_Sodium_Compat::memzero($block0); - } catch (SodiumException $ex) { - $block0 = null; - } - - /** @var string $ciphertext - Raw encrypted data */ - $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( - $message, - $nonce, - $key, - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - - $state->update($ad); - $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); - $state->update($ciphertext); - $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf))); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); - $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len)); - return $ciphertext . $state->finish(); - } - - /** - * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_xchacha20poly1305_ietf_decrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), - $key - ); - $nonceLast = "\x00\x00\x00\x00" . - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); - - return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey); - } - - /** - * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $ad - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function aead_xchacha20poly1305_ietf_encrypt( - $message = '', - $ad = '', - $nonce = '', - $key = '' - ) { - $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), - $key - ); - $nonceLast = "\x00\x00\x00\x00" . - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); - - return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey); - } - - /** - * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $key - * @return string - * @throws TypeError - */ - public static function auth($message, $key) - { - return ParagonIE_Sodium_Core32_Util::substr( - hash_hmac('sha512', $message, $key, true), - 0, - 32 - ); - } - - /** - * HMAC-SHA-512-256 validation. Constant-time via hash_equals(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $mac - * @param string $message - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function auth_verify($mac, $message, $key) - { - return ParagonIE_Sodium_Core32_Util::hashEquals( - $mac, - self::auth($message, $key) - ); - } - - /** - * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $plaintext - * @param string $nonce - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box($plaintext, $nonce, $keypair) - { - return self::secretbox( - $plaintext, - $nonce, - self::box_beforenm( - self::box_secretkey($keypair), - self::box_publickey($keypair) - ) - ); - } - - /** - * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $publicKey - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_seal($message, $publicKey) - { - /** @var string $ephemeralKeypair */ - $ephemeralKeypair = self::box_keypair(); - - /** @var string $ephemeralSK */ - $ephemeralSK = self::box_secretkey($ephemeralKeypair); - - /** @var string $ephemeralPK */ - $ephemeralPK = self::box_publickey($ephemeralKeypair); - - /** @var string $nonce */ - $nonce = self::generichash( - $ephemeralPK . $publicKey, - '', - 24 - ); - - /** @var string $keypair - The combined keypair used in crypto_box() */ - $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey); - - /** @var string $ciphertext Ciphertext + MAC from crypto_box */ - $ciphertext = self::box($message, $nonce, $keypair); - try { - ParagonIE_Sodium_Compat::memzero($ephemeralKeypair); - ParagonIE_Sodium_Compat::memzero($ephemeralSK); - ParagonIE_Sodium_Compat::memzero($nonce); - } catch (SodiumException $ex) { - $ephemeralKeypair = null; - $ephemeralSK = null; - $nonce = null; - } - return $ephemeralPK . $ciphertext; - } - - /** - * Opens a message encrypted via box_seal(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_seal_open($message, $keypair) - { - /** @var string $ephemeralPK */ - $ephemeralPK = ParagonIE_Sodium_Core32_Util::substr($message, 0, 32); - - /** @var string $ciphertext (ciphertext + MAC) */ - $ciphertext = ParagonIE_Sodium_Core32_Util::substr($message, 32); - - /** @var string $secretKey */ - $secretKey = self::box_secretkey($keypair); - - /** @var string $publicKey */ - $publicKey = self::box_publickey($keypair); - - /** @var string $nonce */ - $nonce = self::generichash( - $ephemeralPK . $publicKey, - '', - 24 - ); - - /** @var string $keypair */ - $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK); - - /** @var string $m */ - $m = self::box_open($ciphertext, $nonce, $keypair); - try { - ParagonIE_Sodium_Compat::memzero($secretKey); - ParagonIE_Sodium_Compat::memzero($ephemeralPK); - ParagonIE_Sodium_Compat::memzero($nonce); - } catch (SodiumException $ex) { - $secretKey = null; - $ephemeralPK = null; - $nonce = null; - } - return $m; - } - - /** - * Used by crypto_box() to get the crypto_secretbox() key. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sk - * @param string $pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_beforenm($sk, $pk) - { - return ParagonIE_Sodium_Core32_HSalsa20::hsalsa20( - str_repeat("\x00", 16), - self::scalarmult($sk, $pk) - ); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @return string - * @throws Exception - * @throws SodiumException - * @throws TypeError - */ - public static function box_keypair() - { - $sKey = random_bytes(32); - $pKey = self::scalarmult_base($sKey); - return $sKey . $pKey; - } - - /** - * @param string $seed - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_seed_keypair($seed) - { - $sKey = ParagonIE_Sodium_Core32_Util::substr( - hash('sha512', $seed, true), - 0, - 32 - ); - $pKey = self::scalarmult_base($sKey); - return $sKey . $pKey; - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sKey - * @param string $pKey - * @return string - * @throws TypeError - */ - public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey) - { - return ParagonIE_Sodium_Core32_Util::substr($sKey, 0, 32) . - ParagonIE_Sodium_Core32_Util::substr($pKey, 0, 32); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $keypair - * @return string - * @throws RangeException - * @throws TypeError - */ - public static function box_secretkey($keypair) - { - if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== 64) { - throw new RangeException( - 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' - ); - } - return ParagonIE_Sodium_Core32_Util::substr($keypair, 0, 32); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $keypair - * @return string - * @throws RangeException - * @throws TypeError - */ - public static function box_publickey($keypair) - { - if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) { - throw new RangeException( - 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' - ); - } - return ParagonIE_Sodium_Core32_Util::substr($keypair, 32, 32); - } - - /** - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sKey - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function box_publickey_from_secretkey($sKey) - { - if (ParagonIE_Sodium_Core32_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) { - throw new RangeException( - 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.' - ); - } - return self::scalarmult_base($sKey); - } - - /** - * Decrypt a message encrypted with box(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ciphertext - * @param string $nonce - * @param string $keypair - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function box_open($ciphertext, $nonce, $keypair) - { - return self::secretbox_open( - $ciphertext, - $nonce, - self::box_beforenm( - self::box_secretkey($keypair), - self::box_publickey($keypair) - ) - ); - } - - /** - * Calculate a BLAKE2b hash. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string|null $key - * @param int $outlen - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function generichash($message, $key = '', $outlen = 32) - { - // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); - - $k = null; - if (!empty($key)) { - /** @var SplFixedArray $k */ - $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); - if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { - throw new RangeException('Invalid key size'); - } - } - - /** @var SplFixedArray $in */ - $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message); - - /** @var SplFixedArray $ctx */ - $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outlen); - ParagonIE_Sodium_Core32_BLAKE2b::update($ctx, $in, $in->count()); - - /** @var SplFixedArray $out */ - $out = new SplFixedArray($outlen); - $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($ctx, $out); - - /** @var array */ - $outArray = $out->toArray(); - return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray); - } - - /** - * Finalize a BLAKE2b hashing context, returning the hash. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ctx - * @param int $outlen - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_final($ctx, $outlen = 32) - { - if (!is_string($ctx)) { - throw new TypeError('Context must be a string'); - } - $out = new SplFixedArray($outlen); - - /** @var SplFixedArray $context */ - $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx); - - /** @var SplFixedArray $out */ - $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($context, $out); - - /** @var array */ - $outArray = $out->toArray(); - return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray); - } - - /** - * Initialize a hashing context for BLAKE2b. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $key - * @param int $outputLength - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_init($key = '', $outputLength = 32) - { - // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); - - $k = null; - if (!empty($key)) { - $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); - if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { - throw new RangeException('Invalid key size'); - } - } - - /** @var SplFixedArray $ctx */ - $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength); - - return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx); - } - - /** - * Initialize a hashing context for BLAKE2b. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $key - * @param int $outputLength - * @param string $salt - * @param string $personal - * @return string - * @throws RangeException - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_init_salt_personal( - $key = '', - $outputLength = 32, - $salt = '', - $personal = '' - ) { - // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); - - $k = null; - if (!empty($key)) { - $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); - if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { - throw new RangeException('Invalid key size'); - } - } - if (!empty($salt)) { - $s = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($salt); - } else { - $s = null; - } - if (!empty($salt)) { - $p = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($personal); - } else { - $p = null; - } - - /** @var SplFixedArray $ctx */ - $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength, $s, $p); - - return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx); - } - - /** - * Update a hashing context for BLAKE2b with $message - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ctx - * @param string $message - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function generichash_update($ctx, $message) - { - // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized - ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); - - /** @var SplFixedArray $context */ - $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx); - - /** @var SplFixedArray $in */ - $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message); - - ParagonIE_Sodium_Core32_BLAKE2b::update($context, $in, $in->count()); - - return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($context); - } - - /** - * Libsodium's crypto_kx(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $my_sk - * @param string $their_pk - * @param string $client_pk - * @param string $server_pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk) - { - return self::generichash( - self::scalarmult($my_sk, $their_pk) . - $client_pk . - $server_pk - ); - } - - /** - * ECDH over Curve25519 - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $sKey - * @param string $pKey - * @return string - * - * @throws SodiumException - * @throws TypeError - */ - public static function scalarmult($sKey, $pKey) - { - $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey); - self::scalarmult_throw_if_zero($q); - return $q; - } - - /** - * ECDH over Curve25519, using the basepoint. - * Used to get a secret key from a public key. - * - * @param string $secret - * @return string - * - * @throws SodiumException - * @throws TypeError - */ - public static function scalarmult_base($secret) - { - $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10_base($secret); - self::scalarmult_throw_if_zero($q); - return $q; - } - - /** - * This throws an Error if a zero public key was passed to the function. - * - * @param string $q - * @return void - * @throws SodiumException - * @throws TypeError - */ - protected static function scalarmult_throw_if_zero($q) - { - $d = 0; - for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) { - $d |= ParagonIE_Sodium_Core32_Util::chrToInt($q[$i]); - } - - /* branch-free variant of === 0 */ - if (-(1 & (($d - 1) >> 8))) { - throw new SodiumException('Zero public key is not allowed'); - } - } - - /** - * XSalsa20-Poly1305 authenticated symmetric-key encryption. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $plaintext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox($plaintext, $nonce, $key) - { - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $block0 */ - $block0 = str_repeat("\x00", 32); - - /** @var int $mlen - Length of the plaintext message */ - $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext); - $mlen0 = $mlen; - if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) { - $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES; - } - $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor( - $block0, - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), - $subkey - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core32_Util::substr( - $block0, - self::secretbox_xsalsa20poly1305_ZEROBYTES - ); - if ($mlen > $mlen0) { - $c .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( - ParagonIE_Sodium_Core32_Util::substr( - $plaintext, - self::secretbox_xsalsa20poly1305_ZEROBYTES - ), - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), - 1, - $subkey - ); - } - $state = new ParagonIE_Sodium_Core32_Poly1305_State( - ParagonIE_Sodium_Core32_Util::substr( - $block0, - 0, - self::onetimeauth_poly1305_KEYBYTES - ) - ); - try { - ParagonIE_Sodium_Compat::memzero($block0); - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $block0 = null; - $subkey = null; - } - - $state->update($c); - - /** @var string $c - MAC || ciphertext */ - $c = $state->finish() . $c; - unset($state); - - return $c; - } - - /** - * Decrypt a ciphertext generated via secretbox(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ciphertext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox_open($ciphertext, $nonce, $key) - { - /** @var string $mac */ - $mac = ParagonIE_Sodium_Core32_Util::substr( - $ciphertext, - 0, - self::secretbox_xsalsa20poly1305_MACBYTES - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core32_Util::substr( - $ciphertext, - self::secretbox_xsalsa20poly1305_MACBYTES - ); - - /** @var int $clen */ - $clen = ParagonIE_Sodium_Core32_Util::strlen($c); - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20( - 64, - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), - $subkey - ); - $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify( - $mac, - $c, - ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32) - ); - if (!$verified) { - try { - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $subkey = null; - } - throw new SodiumException('Invalid MAC'); - } - - /** @var string $m - Decrypted message */ - $m = ParagonIE_Sodium_Core32_Util::xorStrings( - ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES), - ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES) - ); - if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) { - // We had more than 1 block, so let's continue to decrypt the rest. - $m .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( - ParagonIE_Sodium_Core32_Util::substr( - $c, - self::secretbox_xsalsa20poly1305_ZEROBYTES - ), - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), - 1, - (string) $subkey - ); - } - return $m; - } - - /** - * XChaCha20-Poly1305 authenticated symmetric-key encryption. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $plaintext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key) - { - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), - $key - ); - $nonceLast = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); - - /** @var string $block0 */ - $block0 = str_repeat("\x00", 32); - - /** @var int $mlen - Length of the plaintext message */ - $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext); - $mlen0 = $mlen; - if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) { - $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES; - } - $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( - $block0, - $nonceLast, - $subkey - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core32_Util::substr( - $block0, - self::secretbox_xchacha20poly1305_ZEROBYTES - ); - if ($mlen > $mlen0) { - $c .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( - ParagonIE_Sodium_Core32_Util::substr( - $plaintext, - self::secretbox_xchacha20poly1305_ZEROBYTES - ), - $nonceLast, - $subkey, - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - } - $state = new ParagonIE_Sodium_Core32_Poly1305_State( - ParagonIE_Sodium_Core32_Util::substr( - $block0, - 0, - self::onetimeauth_poly1305_KEYBYTES - ) - ); - try { - ParagonIE_Sodium_Compat::memzero($block0); - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $block0 = null; - $subkey = null; - } - - $state->update($c); - - /** @var string $c - MAC || ciphertext */ - $c = $state->finish() . $c; - unset($state); - - return $c; - } - - /** - * Decrypt a ciphertext generated via secretbox_xchacha20poly1305(). - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $ciphertext - * @param string $nonce - * @param string $key - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) - { - /** @var string $mac */ - $mac = ParagonIE_Sodium_Core32_Util::substr( - $ciphertext, - 0, - self::secretbox_xchacha20poly1305_MACBYTES - ); - - /** @var string $c */ - $c = ParagonIE_Sodium_Core32_Util::substr( - $ciphertext, - self::secretbox_xchacha20poly1305_MACBYTES - ); - - /** @var int $clen */ - $clen = ParagonIE_Sodium_Core32_Util::strlen($c); - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core32_HChaCha20::hchacha20($nonce, $key); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream( - 64, - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), - $subkey - ); - $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify( - $mac, - $c, - ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32) - ); - - if (!$verified) { - try { - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $subkey = null; - } - throw new SodiumException('Invalid MAC'); - } - - /** @var string $m - Decrypted message */ - $m = ParagonIE_Sodium_Core32_Util::xorStrings( - ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES), - ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES) - ); - - if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) { - // We had more than 1 block, so let's continue to decrypt the rest. - $m .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( - ParagonIE_Sodium_Core32_Util::substr( - $c, - self::secretbox_xchacha20poly1305_ZEROBYTES - ), - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), - (string) $subkey, - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - } - return $m; - } - - /** - * @param string $key - * @return array Returns a state and a header. - * @throws Exception - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_init_push($key) - { - # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES); - $out = random_bytes(24); - - # crypto_core_hchacha20(state->k, out, k, NULL); - $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20($out, $key); - $state = new ParagonIE_Sodium_Core32_SecretStream_State( - $subkey, - ParagonIE_Sodium_Core32_Util::substr($out, 16, 8) . str_repeat("\0", 4) - ); - - # _crypto_secretstream_xchacha20poly1305_counter_reset(state); - $state->counterReset(); - - # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - # memset(state->_pad, 0, sizeof state->_pad); - return array( - $state->toString(), - $out - ); - } - - /** - * @param string $key - * @param string $header - * @return string Returns a state. - * @throws Exception - */ - public static function secretstream_xchacha20poly1305_init_pull($key, $header) - { - # crypto_core_hchacha20(state->k, in, k, NULL); - $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( - ParagonIE_Sodium_Core32_Util::substr($header, 0, 16), - $key - ); - $state = new ParagonIE_Sodium_Core32_SecretStream_State( - $subkey, - ParagonIE_Sodium_Core32_Util::substr($header, 16) - ); - $state->counterReset(); - # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - # memset(state->_pad, 0, sizeof state->_pad); - # return 0; - return $state->toString(); - } - - /** - * @param string $state - * @param string $msg - * @param string $aad - * @param int $tag - * @return string - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) - { - $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); - # crypto_onetimeauth_poly1305_state poly1305_state; - # unsigned char block[64U]; - # unsigned char slen[8U]; - # unsigned char *c; - # unsigned char *mac; - - $msglen = ParagonIE_Sodium_Core32_Util::strlen($msg); - $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad); - - if ((($msglen + 63) >> 6) > 0xfffffffe) { - throw new SodiumException( - 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' - ); - } - - # if (outlen_p != NULL) { - # *outlen_p = 0U; - # } - # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { - # sodium_misuse(); - # } - - # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); - # crypto_onetimeauth_poly1305_init(&poly1305_state, block); - # sodium_memzero(block, sizeof block); - $auth = new ParagonIE_Sodium_Core32_Poly1305_State( - ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); - $auth->update($aad); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, - # (0x10 - adlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); - - # memset(block, 0, sizeof block); - # block[0] = tag; - # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, - # state->nonce, 1U, state->k); - $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( - ParagonIE_Sodium_Core32_Util::intToChr($tag) . str_repeat("\0", 63), - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); - $auth->update($block); - - # out[0] = block[0]; - $out = $block[0]; - # c = out + (sizeof tag); - # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k); - $cipher = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( - $msg, - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core32_Util::store64_le(2) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); - $auth->update($cipher); - - $out .= $cipher; - unset($cipher); - - # crypto_onetimeauth_poly1305_update - # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); - - # STORE64_LE(slen, (uint64_t) adlen); - $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $auth->update($slen); - - # STORE64_LE(slen, (sizeof block) + mlen); - $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $auth->update($slen); - - # mac = c + mlen; - # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); - $mac = $auth->finish(); - $out .= $mac; - - # sodium_memzero(&poly1305_state, sizeof poly1305_state); - unset($auth); - - - # XOR_BUF(STATE_INONCE(state), mac, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - $st->xorNonce($mac); - - # sodium_increment(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); - $st->incrementCounter(); - // Overwrite by reference: - $state = $st->toString(); - - /** @var bool $rekey */ - $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; - # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || - # sodium_is_zero(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { - # crypto_secretstream_xchacha20poly1305_rekey(state); - # } - if ($rekey || $st->needsRekey()) { - // DO REKEY - self::secretstream_xchacha20poly1305_rekey($state); - } - # if (outlen_p != NULL) { - # *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen; - # } - return $out; - } - - /** - * @param string $state - * @param string $cipher - * @param string $aad - * @return bool|array{0: string, 1: int} - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') - { - $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); - - $cipherlen = ParagonIE_Sodium_Core32_Util::strlen($cipher); - # mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES; - $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES; - $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad); - - # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { - # sodium_misuse(); - # } - if ((($msglen + 63) >> 6) > 0xfffffffe) { - throw new SodiumException( - 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' - ); - } - - # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); - # crypto_onetimeauth_poly1305_init(&poly1305_state, block); - # sodium_memzero(block, sizeof block); - $auth = new ParagonIE_Sodium_Core32_Poly1305_State( - ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) - ); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); - $auth->update($aad); - - # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, - # (0x10 - adlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); - - - # memset(block, 0, sizeof block); - # block[0] = in[0]; - # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, - # state->nonce, 1U, state->k); - $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( - $cipher[0] . str_repeat("\0", 63), - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core32_Util::store64_le(1) - ); - # tag = block[0]; - # block[0] = in[0]; - # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); - $tag = ParagonIE_Sodium_Core32_Util::chrToInt($block[0]); - $block[0] = $cipher[0]; - $auth->update($block); - - - # c = in + (sizeof tag); - # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); - $auth->update(ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen)); - - # crypto_onetimeauth_poly1305_update - # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); - $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); - - # STORE64_LE(slen, (uint64_t) adlen); - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen); - $auth->update($slen); - - # STORE64_LE(slen, (sizeof block) + mlen); - # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); - $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen); - $auth->update($slen); - - # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); - # sodium_memzero(&poly1305_state, sizeof poly1305_state); - $mac = $auth->finish(); - - # stored_mac = c + mlen; - # if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) { - # sodium_memzero(mac, sizeof mac); - # return -1; - # } - - $stored = ParagonIE_Sodium_Core32_Util::substr($cipher, $msglen + 1, 16); - if (!ParagonIE_Sodium_Core32_Util::hashEquals($mac, $stored)) { - return false; - } - - # crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k); - $out = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( - ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen), - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core32_Util::store64_le(2) - ); - - # XOR_BUF(STATE_INONCE(state), mac, - # crypto_secretstream_xchacha20poly1305_INONCEBYTES); - $st->xorNonce($mac); - - # sodium_increment(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); - $st->incrementCounter(); - - # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || - # sodium_is_zero(STATE_COUNTER(state), - # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { - # crypto_secretstream_xchacha20poly1305_rekey(state); - # } - - // Overwrite by reference: - $state = $st->toString(); - - /** @var bool $rekey */ - $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; - if ($rekey || $st->needsRekey()) { - // DO REKEY - self::secretstream_xchacha20poly1305_rekey($state); - } - return array($out, $tag); - } - - /** - * @param string $state - * @return void - * @throws SodiumException - */ - public static function secretstream_xchacha20poly1305_rekey(&$state) - { - $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); - # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + - # crypto_secretstream_xchacha20poly1305_INONCEBYTES]; - # size_t i; - # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { - # new_key_and_inonce[i] = state->k[i]; - # } - $new_key_and_inonce = $st->getKey(); - - # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { - # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] = - # STATE_INONCE(state)[i]; - # } - $new_key_and_inonce .= ParagonIE_Sodium_Core32_Util::substR($st->getNonce(), 0, 8); - - # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, - # sizeof new_key_and_inonce, - # state->nonce, state->k); - - $st->rekey(ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( - $new_key_and_inonce, - $st->getCombinedNonce(), - $st->getKey(), - ParagonIE_Sodium_Core32_Util::store64_le(0) - )); - - # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { - # state->k[i] = new_key_and_inonce[i]; - # } - # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { - # STATE_INONCE(state)[i] = - # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i]; - # } - # _crypto_secretstream_xchacha20poly1305_counter_reset(state); - $st->counterReset(); - - $state = $st->toString(); - } - - /** - * Detached Ed25519 signature. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign_detached($message, $sk) - { - return ParagonIE_Sodium_Core32_Ed25519::sign_detached($message, $sk); - } - - /** - * Attached Ed25519 signature. (Returns a signed message.) - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $message - * @param string $sk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign($message, $sk) - { - return ParagonIE_Sodium_Core32_Ed25519::sign($message, $sk); - } - - /** - * Opens a signed message. If valid, returns the message. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $signedMessage - * @param string $pk - * @return string - * @throws SodiumException - * @throws TypeError - */ - public static function sign_open($signedMessage, $pk) - { - return ParagonIE_Sodium_Core32_Ed25519::sign_open($signedMessage, $pk); - } - - /** - * Verify a detached signature of a given message and public key. - * - * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. - * - * @param string $signature - * @param string $message - * @param string $pk - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function sign_verify_detached($signature, $message, $pk) - { - return ParagonIE_Sodium_Core32_Ed25519::verify_detached($signature, $message, $pk); - } -} diff --git a/libs/sodium_compat/src/File.php b/libs/sodium_compat/src/File.php deleted file mode 100644 index 867da3b..0000000 --- a/libs/sodium_compat/src/File.php +++ /dev/null @@ -1,1567 +0,0 @@ - ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MAX) { - throw new TypeError('Argument 2 must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes'); - } - } - if ($outputLength < ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MIN) { - throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MIN'); - } - if ($outputLength > ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MAX) { - throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MAX'); - } - - /** @var int $size */ - $size = filesize($filePath); - if (!is_int($size)) { - throw new SodiumException('Could not obtain the file size'); - } - - /** @var resource $fp */ - $fp = fopen($filePath, 'rb'); - if (!is_resource($fp)) { - throw new SodiumException('Could not open input file for reading'); - } - $ctx = ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outputLength); - while ($size > 0) { - $blockSize = $size > 64 - ? 64 - : $size; - $read = fread($fp, $blockSize); - if (!is_string($read)) { - throw new SodiumException('Could not read input file'); - } - ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $read); - $size -= $blockSize; - } - - fclose($fp); - return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength); - } - - /** - * Encrypt a file (rather than a string). Uses less memory than - * ParagonIE_Sodium_Compat::crypto_secretbox(), but produces - * the same result. - * - * @param string $inputFile Absolute path to a file on the filesystem - * @param string $outputFile Absolute path to a file on the filesystem - * @param string $nonce Number to be used only once - * @param string $key Encryption key - * - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox($inputFile, $outputFile, $nonce, $key) - { - /* Type checks: */ - if (!is_string($inputFile)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given..'); - } - if (!is_string($outputFile)) { - throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); - } - if (!is_string($nonce)) { - throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); - } - - /* Input validation: */ - if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { - throw new TypeError('Argument 3 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); - } - if (!is_string($key)) { - throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); - } - if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { - throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_KEYBYTES bytes'); - } - - /** @var int $size */ - $size = filesize($inputFile); - if (!is_int($size)) { - throw new SodiumException('Could not obtain the file size'); - } - - /** @var resource $ifp */ - $ifp = fopen($inputFile, 'rb'); - if (!is_resource($ifp)) { - throw new SodiumException('Could not open input file for reading'); - } - - /** @var resource $ofp */ - $ofp = fopen($outputFile, 'wb'); - if (!is_resource($ofp)) { - fclose($ifp); - throw new SodiumException('Could not open output file for writing'); - } - - $res = self::secretbox_encrypt($ifp, $ofp, $size, $nonce, $key); - fclose($ifp); - fclose($ofp); - return $res; - } - /** - * Seal a file (rather than a string). Uses less memory than - * ParagonIE_Sodium_Compat::crypto_secretbox_open(), but produces - * the same result. - * - * Warning: Does not protect against TOCTOU attacks. You should - * just load the file into memory and use crypto_secretbox_open() if - * you are worried about those. - * - * @param string $inputFile - * @param string $outputFile - * @param string $nonce - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - public static function secretbox_open($inputFile, $outputFile, $nonce, $key) - { - /* Type checks: */ - if (!is_string($inputFile)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); - } - if (!is_string($outputFile)) { - throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); - } - if (!is_string($nonce)) { - throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); - } - if (!is_string($key)) { - throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); - } - - /* Input validation: */ - if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { - throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); - } - if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { - throw new TypeError('Argument 4 must be CRYPTO_SECRETBOXBOX_KEYBYTES bytes'); - } - - /** @var int $size */ - $size = filesize($inputFile); - if (!is_int($size)) { - throw new SodiumException('Could not obtain the file size'); - } - - /** @var resource $ifp */ - $ifp = fopen($inputFile, 'rb'); - if (!is_resource($ifp)) { - throw new SodiumException('Could not open input file for reading'); - } - - /** @var resource $ofp */ - $ofp = fopen($outputFile, 'wb'); - if (!is_resource($ofp)) { - fclose($ifp); - throw new SodiumException('Could not open output file for writing'); - } - - $res = self::secretbox_decrypt($ifp, $ofp, $size, $nonce, $key); - fclose($ifp); - fclose($ofp); - try { - ParagonIE_Sodium_Compat::memzero($key); - } catch (SodiumException $ex) { - /** @psalm-suppress PossiblyUndefinedVariable */ - unset($key); - } - return $res; - } - - /** - * Sign a file (rather than a string). Uses less memory than - * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces - * the same result. - * - * @param string $filePath Absolute path to a file on the filesystem - * @param string $secretKey Secret signing key - * - * @return string Ed25519 signature - * @throws SodiumException - * @throws TypeError - */ - public static function sign($filePath, $secretKey) - { - /* Type checks: */ - if (!is_string($filePath)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.'); - } - if (!is_string($secretKey)) { - throw new TypeError('Argument 2 must be a string, ' . gettype($secretKey) . ' given.'); - } - - /* Input validation: */ - if (self::strlen($secretKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_SECRETKEYBYTES) { - throw new TypeError('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES bytes'); - } - if (PHP_INT_SIZE === 4) { - return self::sign_core32($filePath, $secretKey); - } - - /** @var int $size */ - $size = filesize($filePath); - if (!is_int($size)) { - throw new SodiumException('Could not obtain the file size'); - } - - /** @var resource $fp */ - $fp = fopen($filePath, 'rb'); - if (!is_resource($fp)) { - throw new SodiumException('Could not open input file for reading'); - } - - /** @var string $az */ - $az = hash('sha512', self::substr($secretKey, 0, 32), true); - - $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); - $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); - - $hs = hash_init('sha512'); - hash_update($hs, self::substr($az, 32, 32)); - /** @var resource $hs */ - $hs = self::updateHashWithFile($hs, $fp, $size); - - /** @var string $nonceHash */ - $nonceHash = hash_final($hs, true); - - /** @var string $pk */ - $pk = self::substr($secretKey, 32, 32); - - /** @var string $nonce */ - $nonce = ParagonIE_Sodium_Core_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); - - /** @var string $sig */ - $sig = ParagonIE_Sodium_Core_Ed25519::ge_p3_tobytes( - ParagonIE_Sodium_Core_Ed25519::ge_scalarmult_base($nonce) - ); - - $hs = hash_init('sha512'); - hash_update($hs, self::substr($sig, 0, 32)); - hash_update($hs, self::substr($pk, 0, 32)); - /** @var resource $hs */ - $hs = self::updateHashWithFile($hs, $fp, $size); - - /** @var string $hramHash */ - $hramHash = hash_final($hs, true); - - /** @var string $hram */ - $hram = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hramHash); - - /** @var string $sigAfter */ - $sigAfter = ParagonIE_Sodium_Core_Ed25519::sc_muladd($hram, $az, $nonce); - - /** @var string $sig */ - $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); - - try { - ParagonIE_Sodium_Compat::memzero($az); - } catch (SodiumException $ex) { - $az = null; - } - fclose($fp); - return $sig; - } - - /** - * Verify a file (rather than a string). Uses less memory than - * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but - * produces the same result. - * - * @param string $sig Ed25519 signature - * @param string $filePath Absolute path to a file on the filesystem - * @param string $publicKey Signing public key - * - * @return bool - * @throws SodiumException - * @throws TypeError - * @throws Exception - */ - public static function verify($sig, $filePath, $publicKey) - { - /* Type checks: */ - if (!is_string($sig)) { - throw new TypeError('Argument 1 must be a string, ' . gettype($sig) . ' given.'); - } - if (!is_string($filePath)) { - throw new TypeError('Argument 2 must be a string, ' . gettype($filePath) . ' given.'); - } - if (!is_string($publicKey)) { - throw new TypeError('Argument 3 must be a string, ' . gettype($publicKey) . ' given.'); - } - - /* Input validation: */ - if (self::strlen($sig) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_BYTES) { - throw new TypeError('Argument 1 must be CRYPTO_SIGN_BYTES bytes'); - } - if (self::strlen($publicKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_PUBLICKEYBYTES) { - throw new TypeError('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES bytes'); - } - if (self::strlen($sig) < 64) { - throw new SodiumException('Signature is too short'); - } - - if (PHP_INT_SIZE === 4) { - return self::verify_core32($sig, $filePath, $publicKey); - } - - /* Security checks */ - if ( - (ParagonIE_Sodium_Core_Ed25519::chrToInt($sig[63]) & 240) - && - ParagonIE_Sodium_Core_Ed25519::check_S_lt_L(self::substr($sig, 32, 32)) - ) { - throw new SodiumException('S < L - Invalid signature'); - } - if (ParagonIE_Sodium_Core_Ed25519::small_order($sig)) { - throw new SodiumException('Signature is on too small of an order'); - } - if ((self::chrToInt($sig[63]) & 224) !== 0) { - throw new SodiumException('Invalid signature'); - } - $d = 0; - for ($i = 0; $i < 32; ++$i) { - $d |= self::chrToInt($publicKey[$i]); - } - if ($d === 0) { - throw new SodiumException('All zero public key'); - } - - /** @var int $size */ - $size = filesize($filePath); - if (!is_int($size)) { - throw new SodiumException('Could not obtain the file size'); - } - - /** @var resource $fp */ - $fp = fopen($filePath, 'rb'); - if (!is_resource($fp)) { - throw new SodiumException('Could not open input file for reading'); - } - - /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ - $orig = ParagonIE_Sodium_Compat::$fastMult; - - // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. - ParagonIE_Sodium_Compat::$fastMult = true; - - /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ - $A = ParagonIE_Sodium_Core_Ed25519::ge_frombytes_negate_vartime($publicKey); - - $hs = hash_init('sha512'); - hash_update($hs, self::substr($sig, 0, 32)); - hash_update($hs, self::substr($publicKey, 0, 32)); - /** @var resource $hs */ - $hs = self::updateHashWithFile($hs, $fp, $size); - /** @var string $hDigest */ - $hDigest = hash_final($hs, true); - - /** @var string $h */ - $h = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); - - /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ - $R = ParagonIE_Sodium_Core_Ed25519::ge_double_scalarmult_vartime( - $h, - $A, - self::substr($sig, 32) - ); - - /** @var string $rcheck */ - $rcheck = ParagonIE_Sodium_Core_Ed25519::ge_tobytes($R); - - // Close the file handle - fclose($fp); - - // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. - ParagonIE_Sodium_Compat::$fastMult = $orig; - return self::verify_32($rcheck, self::substr($sig, 0, 32)); - } - - /** - * @param resource $ifp - * @param resource $ofp - * @param int $mlen - * @param string $nonce - * @param string $boxKeypair - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function box_encrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) - { - if (PHP_INT_SIZE === 4) { - return self::secretbox_encrypt( - $ifp, - $ofp, - $mlen, - $nonce, - ParagonIE_Sodium_Crypto32::box_beforenm( - ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), - ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) - ) - ); - } - return self::secretbox_encrypt( - $ifp, - $ofp, - $mlen, - $nonce, - ParagonIE_Sodium_Crypto::box_beforenm( - ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), - ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) - ) - ); - } - - - /** - * @param resource $ifp - * @param resource $ofp - * @param int $mlen - * @param string $nonce - * @param string $boxKeypair - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function box_decrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) - { - if (PHP_INT_SIZE === 4) { - return self::secretbox_decrypt( - $ifp, - $ofp, - $mlen, - $nonce, - ParagonIE_Sodium_Crypto32::box_beforenm( - ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), - ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) - ) - ); - } - return self::secretbox_decrypt( - $ifp, - $ofp, - $mlen, - $nonce, - ParagonIE_Sodium_Crypto::box_beforenm( - ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), - ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) - ) - ); - } - - /** - * Encrypt a file - * - * @param resource $ifp - * @param resource $ofp - * @param int $mlen - * @param string $nonce - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function secretbox_encrypt($ifp, $ofp, $mlen, $nonce, $key) - { - if (PHP_INT_SIZE === 4) { - return self::secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key); - } - - $plaintext = fread($ifp, 32); - if (!is_string($plaintext)) { - throw new SodiumException('Could not read input file'); - } - $first32 = self::ftell($ifp); - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $realNonce */ - $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); - - /** @var string $block0 */ - $block0 = str_repeat("\x00", 32); - - /** @var int $mlen - Length of the plaintext message */ - $mlen0 = $mlen; - if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { - $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; - } - $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( - $block0, - $realNonce, - $subkey - ); - - $state = new ParagonIE_Sodium_Core_Poly1305_State( - ParagonIE_Sodium_Core_Util::substr( - $block0, - 0, - ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES - ) - ); - - // Pre-write 16 blank bytes for the Poly1305 tag - $start = self::ftell($ofp); - fwrite($ofp, str_repeat("\x00", 16)); - - /** @var string $c */ - $cBlock = ParagonIE_Sodium_Core_Util::substr( - $block0, - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES - ); - $state->update($cBlock); - fwrite($ofp, $cBlock); - $mlen -= 32; - - /** @var int $iter */ - $iter = 1; - - /** @var int $incr */ - $incr = self::BUFFER_SIZE >> 6; - - /* - * Set the cursor to the end of the first half-block. All future bytes will - * generated from salsa20_xor_ic, starting from 1 (second block). - */ - fseek($ifp, $first32, SEEK_SET); - - while ($mlen > 0) { - $blockSize = $mlen > self::BUFFER_SIZE - ? self::BUFFER_SIZE - : $mlen; - $plaintext = fread($ifp, $blockSize); - if (!is_string($plaintext)) { - throw new SodiumException('Could not read input file'); - } - $cBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( - $plaintext, - $realNonce, - $iter, - $subkey - ); - fwrite($ofp, $cBlock, $blockSize); - $state->update($cBlock); - - $mlen -= $blockSize; - $iter += $incr; - } - try { - ParagonIE_Sodium_Compat::memzero($block0); - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $block0 = null; - $subkey = null; - } - $end = self::ftell($ofp); - - /* - * Write the Poly1305 authentication tag that provides integrity - * over the ciphertext (encrypt-then-MAC) - */ - fseek($ofp, $start, SEEK_SET); - fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); - fseek($ofp, $end, SEEK_SET); - unset($state); - - return true; - } - - /** - * Decrypt a file - * - * @param resource $ifp - * @param resource $ofp - * @param int $mlen - * @param string $nonce - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function secretbox_decrypt($ifp, $ofp, $mlen, $nonce, $key) - { - if (PHP_INT_SIZE === 4) { - return self::secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key); - } - $tag = fread($ifp, 16); - if (!is_string($tag)) { - throw new SodiumException('Could not read input file'); - } - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $realNonce */ - $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( - 64, - ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), - $subkey - ); - - /* Verify the Poly1305 MAC -before- attempting to decrypt! */ - $state = new ParagonIE_Sodium_Core_Poly1305_State(self::substr($block0, 0, 32)); - if (!self::onetimeauth_verify($state, $ifp, $tag, $mlen)) { - throw new SodiumException('Invalid MAC'); - } - - /* - * Set the cursor to the end of the first half-block. All future bytes will - * generated from salsa20_xor_ic, starting from 1 (second block). - */ - $first32 = fread($ifp, 32); - if (!is_string($first32)) { - throw new SodiumException('Could not read input file'); - } - $first32len = self::strlen($first32); - fwrite( - $ofp, - self::xorStrings( - self::substr($block0, 32, $first32len), - self::substr($first32, 0, $first32len) - ) - ); - $mlen -= 32; - - /** @var int $iter */ - $iter = 1; - - /** @var int $incr */ - $incr = self::BUFFER_SIZE >> 6; - - /* Decrypts ciphertext, writes to output file. */ - while ($mlen > 0) { - $blockSize = $mlen > self::BUFFER_SIZE - ? self::BUFFER_SIZE - : $mlen; - $ciphertext = fread($ifp, $blockSize); - if (!is_string($ciphertext)) { - throw new SodiumException('Could not read input file'); - } - $pBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( - $ciphertext, - $realNonce, - $iter, - $subkey - ); - fwrite($ofp, $pBlock, $blockSize); - $mlen -= $blockSize; - $iter += $incr; - } - return true; - } - - /** - * @param ParagonIE_Sodium_Core_Poly1305_State $state - * @param resource $ifp - * @param string $tag - * @param int $mlen - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function onetimeauth_verify( - ParagonIE_Sodium_Core_Poly1305_State $state, - $ifp, - $tag = '', - $mlen = 0 - ) { - /** @var int $pos */ - $pos = self::ftell($ifp); - - /** @var int $iter */ - $iter = 1; - - /** @var int $incr */ - $incr = self::BUFFER_SIZE >> 6; - - while ($mlen > 0) { - $blockSize = $mlen > self::BUFFER_SIZE - ? self::BUFFER_SIZE - : $mlen; - $ciphertext = fread($ifp, $blockSize); - if (!is_string($ciphertext)) { - throw new SodiumException('Could not read input file'); - } - $state->update($ciphertext); - $mlen -= $blockSize; - $iter += $incr; - } - $res = ParagonIE_Sodium_Core_Util::verify_16($tag, $state->finish()); - - fseek($ifp, $pos, SEEK_SET); - return $res; - } - - /** - * Update a hash context with the contents of a file, without - * loading the entire file into memory. - * - * @param resource|object $hash - * @param resource $fp - * @param int $size - * @return resource|object Resource on PHP < 7.2, HashContext object on PHP >= 7.2 - * @throws SodiumException - * @throws TypeError - * @psalm-suppress PossiblyInvalidArgument - * PHP 7.2 changes from a resource to an object, - * which causes Psalm to complain about an error. - * @psalm-suppress TypeCoercion - * Ditto. - */ - public static function updateHashWithFile($hash, $fp, $size = 0) - { - /* Type checks: */ - if (PHP_VERSION_ID < 70200) { - if (!is_resource($hash)) { - throw new TypeError('Argument 1 must be a resource, ' . gettype($hash) . ' given.'); - } - } else { - if (!is_object($hash)) { - throw new TypeError('Argument 1 must be an object (PHP 7.2+), ' . gettype($hash) . ' given.'); - } - } - - if (!is_resource($fp)) { - throw new TypeError('Argument 2 must be a resource, ' . gettype($fp) . ' given.'); - } - if (!is_int($size)) { - throw new TypeError('Argument 3 must be an integer, ' . gettype($size) . ' given.'); - } - - /** @var int $originalPosition */ - $originalPosition = self::ftell($fp); - - // Move file pointer to beginning of file - fseek($fp, 0, SEEK_SET); - for ($i = 0; $i < $size; $i += self::BUFFER_SIZE) { - /** @var string|bool $message */ - $message = fread( - $fp, - ($size - $i) > self::BUFFER_SIZE - ? $size - $i - : self::BUFFER_SIZE - ); - if (!is_string($message)) { - throw new SodiumException('Unexpected error reading from file.'); - } - /** @var string $message */ - /** @psalm-suppress InvalidArgument */ - hash_update($hash, $message); - } - // Reset file pointer's position - fseek($fp, $originalPosition, SEEK_SET); - return $hash; - } - - /** - * Sign a file (rather than a string). Uses less memory than - * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces - * the same result. (32-bit) - * - * @param string $filePath Absolute path to a file on the filesystem - * @param string $secretKey Secret signing key - * - * @return string Ed25519 signature - * @throws SodiumException - * @throws TypeError - */ - private static function sign_core32($filePath, $secretKey) - { - /** @var int|bool $size */ - $size = filesize($filePath); - if (!is_int($size)) { - throw new SodiumException('Could not obtain the file size'); - } - /** @var int $size */ - - /** @var resource|bool $fp */ - $fp = fopen($filePath, 'rb'); - if (!is_resource($fp)) { - throw new SodiumException('Could not open input file for reading'); - } - /** @var resource $fp */ - - /** @var string $az */ - $az = hash('sha512', self::substr($secretKey, 0, 32), true); - - $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); - $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); - - $hs = hash_init('sha512'); - hash_update($hs, self::substr($az, 32, 32)); - /** @var resource $hs */ - $hs = self::updateHashWithFile($hs, $fp, $size); - - /** @var string $nonceHash */ - $nonceHash = hash_final($hs, true); - - /** @var string $pk */ - $pk = self::substr($secretKey, 32, 32); - - /** @var string $nonce */ - $nonce = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); - - /** @var string $sig */ - $sig = ParagonIE_Sodium_Core32_Ed25519::ge_p3_tobytes( - ParagonIE_Sodium_Core32_Ed25519::ge_scalarmult_base($nonce) - ); - - $hs = hash_init('sha512'); - hash_update($hs, self::substr($sig, 0, 32)); - hash_update($hs, self::substr($pk, 0, 32)); - /** @var resource $hs */ - $hs = self::updateHashWithFile($hs, $fp, $size); - - /** @var string $hramHash */ - $hramHash = hash_final($hs, true); - - /** @var string $hram */ - $hram = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hramHash); - - /** @var string $sigAfter */ - $sigAfter = ParagonIE_Sodium_Core32_Ed25519::sc_muladd($hram, $az, $nonce); - - /** @var string $sig */ - $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); - - try { - ParagonIE_Sodium_Compat::memzero($az); - } catch (SodiumException $ex) { - $az = null; - } - fclose($fp); - return $sig; - } - - /** - * - * Verify a file (rather than a string). Uses less memory than - * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but - * produces the same result. (32-bit) - * - * @param string $sig Ed25519 signature - * @param string $filePath Absolute path to a file on the filesystem - * @param string $publicKey Signing public key - * - * @return bool - * @throws SodiumException - * @throws Exception - */ - public static function verify_core32($sig, $filePath, $publicKey) - { - /* Security checks */ - if (ParagonIE_Sodium_Core32_Ed25519::check_S_lt_L(self::substr($sig, 32, 32))) { - throw new SodiumException('S < L - Invalid signature'); - } - if (ParagonIE_Sodium_Core32_Ed25519::small_order($sig)) { - throw new SodiumException('Signature is on too small of an order'); - } - if ((self::chrToInt($sig[63]) & 224) !== 0) { - throw new SodiumException('Invalid signature'); - } - $d = 0; - for ($i = 0; $i < 32; ++$i) { - $d |= self::chrToInt($publicKey[$i]); - } - if ($d === 0) { - throw new SodiumException('All zero public key'); - } - - /** @var int|bool $size */ - $size = filesize($filePath); - if (!is_int($size)) { - throw new SodiumException('Could not obtain the file size'); - } - /** @var int $size */ - - /** @var resource|bool $fp */ - $fp = fopen($filePath, 'rb'); - if (!is_resource($fp)) { - throw new SodiumException('Could not open input file for reading'); - } - /** @var resource $fp */ - - /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ - $orig = ParagonIE_Sodium_Compat::$fastMult; - - // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. - ParagonIE_Sodium_Compat::$fastMult = true; - - /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */ - $A = ParagonIE_Sodium_Core32_Ed25519::ge_frombytes_negate_vartime($publicKey); - - $hs = hash_init('sha512'); - hash_update($hs, self::substr($sig, 0, 32)); - hash_update($hs, self::substr($publicKey, 0, 32)); - /** @var resource $hs */ - $hs = self::updateHashWithFile($hs, $fp, $size); - /** @var string $hDigest */ - $hDigest = hash_final($hs, true); - - /** @var string $h */ - $h = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); - - /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */ - $R = ParagonIE_Sodium_Core32_Ed25519::ge_double_scalarmult_vartime( - $h, - $A, - self::substr($sig, 32) - ); - - /** @var string $rcheck */ - $rcheck = ParagonIE_Sodium_Core32_Ed25519::ge_tobytes($R); - - // Close the file handle - fclose($fp); - - // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. - ParagonIE_Sodium_Compat::$fastMult = $orig; - return self::verify_32($rcheck, self::substr($sig, 0, 32)); - } - - /** - * Encrypt a file (32-bit) - * - * @param resource $ifp - * @param resource $ofp - * @param int $mlen - * @param string $nonce - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key) - { - $plaintext = fread($ifp, 32); - if (!is_string($plaintext)) { - throw new SodiumException('Could not read input file'); - } - $first32 = self::ftell($ifp); - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $realNonce */ - $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); - - /** @var string $block0 */ - $block0 = str_repeat("\x00", 32); - - /** @var int $mlen - Length of the plaintext message */ - $mlen0 = $mlen; - if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { - $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; - } - $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor( - $block0, - $realNonce, - $subkey - ); - - $state = new ParagonIE_Sodium_Core32_Poly1305_State( - ParagonIE_Sodium_Core32_Util::substr( - $block0, - 0, - ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES - ) - ); - - // Pre-write 16 blank bytes for the Poly1305 tag - $start = self::ftell($ofp); - fwrite($ofp, str_repeat("\x00", 16)); - - /** @var string $c */ - $cBlock = ParagonIE_Sodium_Core32_Util::substr( - $block0, - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES - ); - $state->update($cBlock); - fwrite($ofp, $cBlock); - $mlen -= 32; - - /** @var int $iter */ - $iter = 1; - - /** @var int $incr */ - $incr = self::BUFFER_SIZE >> 6; - - /* - * Set the cursor to the end of the first half-block. All future bytes will - * generated from salsa20_xor_ic, starting from 1 (second block). - */ - fseek($ifp, $first32, SEEK_SET); - - while ($mlen > 0) { - $blockSize = $mlen > self::BUFFER_SIZE - ? self::BUFFER_SIZE - : $mlen; - $plaintext = fread($ifp, $blockSize); - if (!is_string($plaintext)) { - throw new SodiumException('Could not read input file'); - } - $cBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( - $plaintext, - $realNonce, - $iter, - $subkey - ); - fwrite($ofp, $cBlock, $blockSize); - $state->update($cBlock); - - $mlen -= $blockSize; - $iter += $incr; - } - try { - ParagonIE_Sodium_Compat::memzero($block0); - ParagonIE_Sodium_Compat::memzero($subkey); - } catch (SodiumException $ex) { - $block0 = null; - $subkey = null; - } - $end = self::ftell($ofp); - - /* - * Write the Poly1305 authentication tag that provides integrity - * over the ciphertext (encrypt-then-MAC) - */ - fseek($ofp, $start, SEEK_SET); - fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); - fseek($ofp, $end, SEEK_SET); - unset($state); - - return true; - } - - /** - * Decrypt a file (32-bit) - * - * @param resource $ifp - * @param resource $ofp - * @param int $mlen - * @param string $nonce - * @param string $key - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key) - { - $tag = fread($ifp, 16); - if (!is_string($tag)) { - throw new SodiumException('Could not read input file'); - } - - /** @var string $subkey */ - $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); - - /** @var string $realNonce */ - $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); - - /** @var string $block0 */ - $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20( - 64, - ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), - $subkey - ); - - /* Verify the Poly1305 MAC -before- attempting to decrypt! */ - $state = new ParagonIE_Sodium_Core32_Poly1305_State(self::substr($block0, 0, 32)); - if (!self::onetimeauth_verify_core32($state, $ifp, $tag, $mlen)) { - throw new SodiumException('Invalid MAC'); - } - - /* - * Set the cursor to the end of the first half-block. All future bytes will - * generated from salsa20_xor_ic, starting from 1 (second block). - */ - $first32 = fread($ifp, 32); - if (!is_string($first32)) { - throw new SodiumException('Could not read input file'); - } - $first32len = self::strlen($first32); - fwrite( - $ofp, - self::xorStrings( - self::substr($block0, 32, $first32len), - self::substr($first32, 0, $first32len) - ) - ); - $mlen -= 32; - - /** @var int $iter */ - $iter = 1; - - /** @var int $incr */ - $incr = self::BUFFER_SIZE >> 6; - - /* Decrypts ciphertext, writes to output file. */ - while ($mlen > 0) { - $blockSize = $mlen > self::BUFFER_SIZE - ? self::BUFFER_SIZE - : $mlen; - $ciphertext = fread($ifp, $blockSize); - if (!is_string($ciphertext)) { - throw new SodiumException('Could not read input file'); - } - $pBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( - $ciphertext, - $realNonce, - $iter, - $subkey - ); - fwrite($ofp, $pBlock, $blockSize); - $mlen -= $blockSize; - $iter += $incr; - } - return true; - } - - /** - * One-time message authentication for 32-bit systems - * - * @param ParagonIE_Sodium_Core32_Poly1305_State $state - * @param resource $ifp - * @param string $tag - * @param int $mlen - * @return bool - * @throws SodiumException - * @throws TypeError - */ - protected static function onetimeauth_verify_core32( - ParagonIE_Sodium_Core32_Poly1305_State $state, - $ifp, - $tag = '', - $mlen = 0 - ) { - /** @var int $pos */ - $pos = self::ftell($ifp); - - /** @var int $iter */ - $iter = 1; - - /** @var int $incr */ - $incr = self::BUFFER_SIZE >> 6; - - while ($mlen > 0) { - $blockSize = $mlen > self::BUFFER_SIZE - ? self::BUFFER_SIZE - : $mlen; - $ciphertext = fread($ifp, $blockSize); - if (!is_string($ciphertext)) { - throw new SodiumException('Could not read input file'); - } - $state->update($ciphertext); - $mlen -= $blockSize; - $iter += $incr; - } - $res = ParagonIE_Sodium_Core32_Util::verify_16($tag, $state->finish()); - - fseek($ifp, $pos, SEEK_SET); - return $res; - } - - /** - * @param resource $resource - * @return int - * @throws SodiumException - */ - private static function ftell($resource) - { - $return = ftell($resource); - if (!is_int($return)) { - throw new SodiumException('ftell() returned false'); - } - return (int) $return; - } -} diff --git a/libs/sodium_compat/src/PHP52/SplFixedArray.php b/libs/sodium_compat/src/PHP52/SplFixedArray.php deleted file mode 100644 index c333ad4..0000000 --- a/libs/sodium_compat/src/PHP52/SplFixedArray.php +++ /dev/null @@ -1,189 +0,0 @@ - */ - private $internalArray = array(); - - /** @var int $size */ - private $size = 0; - - /** - * SplFixedArray constructor. - * @param int $size - */ - public function __construct($size = 0) - { - $this->size = $size; - $this->internalArray = array(); - } - - /** - * @return int - */ - public function count() - { - return count($this->internalArray); - } - - /** - * @return array - */ - public function toArray() - { - ksort($this->internalArray); - return (array) $this->internalArray; - } - - /** - * @param array $array - * @param bool $save_indexes - * @return SplFixedArray - * @psalm-suppress MixedAssignment - */ - public static function fromArray(array $array, $save_indexes = true) - { - $self = new SplFixedArray(count($array)); - if($save_indexes) { - foreach($array as $key => $value) { - $self[(int) $key] = $value; - } - } else { - $i = 0; - foreach (array_values($array) as $value) { - $self[$i] = $value; - $i++; - } - } - return $self; - } - - /** - * @return int - */ - public function getSize() - { - return $this->size; - } - - /** - * @param int $size - * @return bool - */ - public function setSize($size) - { - $this->size = $size; - return true; - } - - /** - * @param string|int $index - * @return bool - */ - public function offsetExists($index) - { - return array_key_exists((int) $index, $this->internalArray); - } - - /** - * @param string|int $index - * @return mixed - */ - public function offsetGet($index) - { - /** @psalm-suppress MixedReturnStatement */ - return $this->internalArray[(int) $index]; - } - - /** - * @param string|int $index - * @param mixed $newval - * @psalm-suppress MixedAssignment - */ - public function offsetSet($index, $newval) - { - $this->internalArray[(int) $index] = $newval; - } - - /** - * @param string|int $index - */ - public function offsetUnset($index) - { - unset($this->internalArray[(int) $index]); - } - - /** - * Rewind iterator back to the start - * @link https://php.net/manual/en/splfixedarray.rewind.php - * @return void - * @since 5.3.0 - */ - public function rewind() - { - reset($this->internalArray); - } - - /** - * Return current array entry - * @link https://php.net/manual/en/splfixedarray.current.php - * @return mixed The current element value. - * @since 5.3.0 - */ - public function current() - { - /** @psalm-suppress MixedReturnStatement */ - return current($this->internalArray); - } - - /** - * Return current array index - * @return int The current array index. - */ - public function key() - { - return key($this->internalArray); - } - - /** - * @return void - */ - public function next() - { - next($this->internalArray); - } - - /** - * Check whether the array contains more elements - * @link https://php.net/manual/en/splfixedarray.valid.php - * @return bool true if the array contains any more elements, false otherwise. - */ - public function valid() - { - if (empty($this->internalArray)) { - return false; - } - $result = next($this->internalArray) !== false; - prev($this->internalArray); - return $result; - } - - /** - * Do nothing. - */ - public function __wakeup() - { - // NOP - } -} \ No newline at end of file diff --git a/libs/sodium_compat/src/SodiumException.php b/libs/sodium_compat/src/SodiumException.php deleted file mode 100644 index a3176d7..0000000 --- a/libs/sodium_compat/src/SodiumException.php +++ /dev/null @@ -1,11 +0,0 @@ -=' ) && version_compare( phpversion(), '7.2', '<=' ) ) { + echo 'Your PHP version is not correct (' . phpversion() . ')! Please use PHP 7.2 for executing this composer script.' . PHP_EOL; + + exit( 1 ); +} diff --git a/php-scoper/config.php b/php-scoper/config.php index f8873a9..c54e75c 100644 --- a/php-scoper/config.php +++ b/php-scoper/config.php @@ -87,6 +87,8 @@ function wms_php_scoper_get_list_of_files( $path ) { [ 'vendor/psr/cache', 'vendor/psr/http-message', + 'vendor/psr/http-client', + 'vendor/psr/http-factory', 'vendor/psr/log', ] ) @@ -114,6 +116,10 @@ function wms_php_scoper_get_list_of_files( $path ) { ->files() ->in( 'vendor/symfony/polyfill-intl-idn' ) ->name( [ '*.php', 'LICENSE', 'composer.json' ] ), + Finder::create() + ->files() + ->in( 'vendor/symfony/deprecation-contracts' ) + ->name( [ '*.php', 'LICENSE', 'composer.json' ] ), ], /* diff --git a/readme.txt b/readme.txt index 2bff672..f818f27 100644 --- a/readme.txt +++ b/readme.txt @@ -1,12 +1,12 @@ === WP Mail SMTP by WPForms - The Most Popular SMTP and Email Log Plugin === -Contributors: wpforms, jaredatch, smub, slaFFik +Contributors: wpforms, jaredatch, smub, slaFFik, capuderg Tags: smtp, wp mail smtp, wordpress smtp, gmail smtp, sendgrid smtp, mailgun smtp, mail, mailer, phpmailer, wp_mail, email, mailgun, sengrid, gmail, sendinblue, wp smtp Requires at least: 5.2 -Tested up to: 6.1 -Stable tag: 3.7.0 -Requires PHP: 5.6.20 +Tested up to: 6.2 +Stable tag: 3.8.0 +Requires PHP: 7.2 -Make email delivery easy for WordPress. Connect with SMTP, Gmail, Outlook, SendGrid, Mailgun, Zoho, SES, and more. Rated #1 WordPress SMTP Email plugin. +Make email delivery easy for WordPress. Connect with SMTP, Gmail, Outlook, SendGrid, Mailgun, SES, Zoho, + more. Rated #1 WordPress SMTP Email plugin. == Description == @@ -20,6 +20,10 @@ WP Mail SMTP fixes your email deliverability by reconfiguring WordPress to use a Best of all, our easy-to-use Setup Wizard and detailed documentation guide you through the process. +WP Mail SMTP is free and has everything you need to reliably send your WordPress emails! + +**WP Mail SMTP Pro** unlocks even more powerful features like email logging, advanced email reporting and stats, backup connections, email alerts, smart conditional routing, and much more. + #### What is SMTP? SMTP (Simple Mail Transfer Protocol) is an industry standard for sending emails. Proper SMTP configuration helps increase email deliverability by using authentication. @@ -178,19 +182,19 @@ In addition to native Microsoft, Amazon SES, and Zoho Mail integrations, WP Mail Click here to purchase WP Mail SMTP Pro now! -#### Email Log +### Email Log Email Logging lets you log and view all emails sent from your site. Email logs are helpful for storing emails for your records, auditing outgoing emails, and debugging during site development. But that's just the beginning. Our powerful WordPress email logs unlock extra tools to help you measure email engagement and improve email deliverability: -#### Resend Emails +#### Email Log Details -You resend any email or forward it to one or more email addresses, right from your email log. From the overview page, you can also resend multiple emails in bulk. This is an awesome way to resend emails that failed or forward important emails to an alternative email address. +Each Email Log entry includes a lot of useful information about the email, including the subject, sender, recipients (TO, CC and BCC), email content, email headers, open&click tracking stats, delivery status, which WordPress plugin sent the email, and more! -#### Track Email Opens and Clicks +#### Resend Emails -Wondering if an important email was actually opened, or if any links in the email were clicked? Our email log lets you view open and click tracking stats for your WordPress emails. +You resend any email or forward it to one or more email addresses, right from your email log. From the overview page, you can also resend multiple emails in bulk. This is an awesome way to resend emails that failed or forward important emails to an alternative email address. #### Store Email Attachments @@ -204,16 +208,19 @@ Easily export your WordPress email logs to CSV, EML, or Excel. You can filter th Once you've activated email logging, any individual log file can be printed in an easy-to-read format. If you want to archive an email log digitally, it's easy to export it to a PDF document too. -#### Manage Multisite Email Logs Easily +### Email Reports -WP Mail SMTP makes it easy for Network Admins to view and manage email logs for subsites. You can access all of your deliverability information from the Network Admin dashboard and quickly switch between subsites. That makes it easy to review email logging data for all subsites on one centralized page. +Email reports make it easy to track deliverability and engagement at-a-glance. Your open and click-through rates are grouped by subject line, making it easy to review the performance of campaigns or notifications. The report also displays Sent and Failed emails each week so you can spot any issues quickly. You'll also see an email report chart right in your WordPress dashboard. -#### Backup Connection +#### Weekly Email Summary -WP Mail SMTP Pro allows you to configure multiple mailer providers. The main configuration will be your Primary Connection, and you can set another as your Backup Connection. -If an email fails to send via your Primary Connection, WP Mail SMTP will automatically route it through your Backup Connection and try to send it again. This means fewer missed emails, even when something goes wrong. +Get statistics about WordPress emails sent directly into your inbox. Our weekly emails reveal how many emails are being sent from your WordPress site, and which ones are getting opens and clicks. The Summary also shows you deliverability statistics at-a-glance so you can spot any issues without logging into WordPress. -#### Email Alerts +#### Track Email Opens and Clicks + +Wondering if your important emails were actually opened, or if any links in the email were clicked? Our email log allows you view open and click tracking stats for your WordPress emails and our Email Reports feature groups these stats by subject, so you can analyze their performance. + +### Email Alerts Get instantly notified about failed emails! If your site's mailer or SMTP service stops sending your emails, you'll immediately receive a notification. Choose from several helpful alert methods, including: @@ -224,28 +231,33 @@ Get instantly notified about failed emails! If your site's mailer or SMTP servic In combination with Email Logging and Email Resend, Email Alerts let you ensure that no important email will ever be lost. -#### Smart Routing +### Backup Connection -Smart Routing enables you to send emails through different mailer providers based on custom criteria. Easily configure your Smart Routing conditions using dozens of pre-determined options, including the contents of the email Subject or Message, From or To addresses, or which plugin initiated the email, just to name a few. -Using Smart Routing lets you choose the best mailer for each type of email you send. Select a transactional mailer to send out your eCommerce order confirmations, another mailer for your newsletter and marketing emails, and more! -Selecting the best mailer for each type of email you need to send will improve your overall deliverability and make sure your emails arrive in users' inboxes. +WP Mail SMTP Pro allows you to configure multiple mailer providers. The main configuration will be your Primary Connection, and you can set another as your Backup Connection. +If an email fails to send via your Primary Connection, WP Mail SMTP will automatically route it through your Backup Connection and try to send it again. This means fewer missed emails, even when something goes wrong. -#### Email Reports +### Smart Conditional Routing -Email reports make it easy to track deliverability and engagement at-a-glance. Your open and click-through rates are grouped by subject line, making it easy to review the performance of campaigns or notifications. The report also displays Sent and Failed emails each week so you spot any issues quickly. You'll also see an email report chart right in your WordPress dashboard. +Smart Routing enables you to send emails through different mailer providers based on custom criteria. Easily configure your Smart Routing conditions using dozens of pre-determined options, including the contents of the email Subject or Message, From or To addresses, or which plugin initiated the email, just to name a few. -#### Weekly Email Summary +Using Smart Routing lets you choose the best mailer for each type of email you send. Select a transactional mailer to send out your eCommerce order confirmations, another mailer for your newsletter and marketing emails, and more! -Get statistics about WordPress emails sent directly into your inbox. Our weekly emails reveal how many emails are being sent from your WordPress site, and which ones are getting opens and clicks. The Summary also shows you deliverability statistics at-a-glance so you can spot any issues without logging into WordPress. +Selecting the best mailer for each type of email you need to send will improve your overall deliverability and make sure your emails arrive in users' inboxes. -#### Manage WordPress Emails and Notifications +### Manage WordPress Emails and Notifications The Manage Notification feature gives you full control over which email notifications WordPress sends. This means you can disable different WordPress notification emails. Don't want to receive emails when new users are created? No problem, turn it off. +### WordPress Multisite + #### WordPress Multisite Network Settings For users running a multisite network, our network settings provide a centralized location to easily configure your SMTP settings for all sites, saving you time. +#### Manage Multisite Email Logs Easily + +WP Mail SMTP makes it easy for Network Admins to view and manage email logs for subsites. You can access all of your deliverability information from the Network Admin dashboard and quickly switch between subsites. That makes it easy to review email logging data for all subsites on one centralized page. + ### Expert Support We provide limited support for the WP Mail SMTP plugin on the WordPress.org forums. Access to our world class one-on-one email support is available to WP Mail SMTP Pro users. @@ -274,22 +286,24 @@ You can try the OptinMonster - Get More Email Subscribers with the most popular conversion optimization plugin for WordPress. +* OptinMonster - Get more email subscribers with the most popular conversion optimization plugin for WordPress. * WPForms - #1 drag & drop online form builder for WordPress (trusted by 5 million sites). -* MonsterInsights - See the Stats that Matter and Grow Your Business with Confidence. Best Google Analytics Plugin for WordPress. +* AIOSEO - The original WordPress SEO plugin to help you rank higher in search results (trusted by over 3 million sites). +* MonsterInsights - See the stats that matter and grow your business with confidence. Best Google Analytics plugin for WordPress. * SeedProd - Create beautiful landing pages with our powerful drag & drop landing page builder. -* RafflePress - Best WordPress giveaway and contest plugin to grow traffic and social followers. * Smash Balloon - #1 social feeds plugin for WordPress - display social media content in WordPress without code. -* AIOSEO - the original WordPress SEO plugin to help you rank higher in search results (trusted by over 3 million sites). +* WPCode - must have WordPress code snippet management plugin to help you future-proof website customization (trusted by 1.5 million sites). +* Duplicator - popular WordPress backup and migration plugin used by over 1 million websites. +* WP Simple Pay - #1 Stripe payments plugin for WordPress. Start accepting one-time or recurring payments without a shopping cart. * PushEngage - Connect with visitors after they leave your website with the leading web push notification plugin. +* RafflePress - Best WordPress giveaway and contest plugin to grow traffic and social followers. * TrustPulse - Add real-time social proof notifications to boost your store conversions by up to 15%. -* SearchWP - The most advanced WordPress search plugin. Customize your WordPress search algorithm, reorder search results, track search metrics, and everything you need to leverage search to grow your business. -* AffiliateWP - The #1 affiliate management plugin for WordPress. Easily create an affiliate program for your eCommerce store or membership site within minutes and start growing your sales with the power of referral marketing. -* WP Simple Pay - The #1 Stripe payments plugin for WordPress. Start accepting one-time and recurring payments on your WordPress site without setting up a shopping cart. No code required. -* Easy Digital Downloads - The best WordPress eCommerce plugin for selling digital downloads. Start selling eBooks, software, music, digital art, and more within minutes. Accept payments, manage subscriptions, advanced access control, and more. -* Sugar Calendar - A simple & powerful event calendar plugin for WordPress that comes with all the event management features including payments, scheduling, timezones, ticketing, recurring events, and more. +* SearchWP - The most advanced custom WordPress search plugin to improve WordPress search quality. +* AffiliateWP - #1 affiliate management plugin for WordPress. Add a referral program to your online store. +* Easy Digital Downloads - The best WordPress eCommerce plugin to sell digital products (eBooks, software, music, and more). +* WPCharitable - Top-rated WordPress donation and fundraising plugin for WordPress. -Visit WPBeginner to learn from our WordPress Tutorials and find out about other best WordPress plugins. +Visit WPBeginner to learn from our WordPress Tutorials and about the best WordPress plugins. == Installation == @@ -347,6 +361,14 @@ By all means please contact us to discuss features or options you'd like to see == Changelog == += 3.8.0 - 2023-04-26 = +- IMPORTANT: Support for PHP 5.6, 7.0, and 7.1 has been discontinued. If you are running one of those versions, you MUST upgrade PHP before installing or upgrading to WP Mail SMTP v3.8. Failure to do that will disable WP Mail SMTP functionality. +- Changed: Updated Moment.js library to 2.29.4. +- Changed: Removed unneeded sodium_compat library. +- Fixed: Email address with apostrophes in the Email Test page. +- Fixed: Review request notice display on subsites admin area in WP Multisite installation. +- Fixed: Setup Wizard playing UA anthem for certain WP sites. + = 3.7.0 - 2022-12-15 = - Changed: Improved Action Scheduler data cleanup on plugin uninstall. - Changed: Improved performance for database table validation checks. diff --git a/src/Admin/Area.php b/src/Admin/Area.php index b3cd90a..5c3470f 100644 --- a/src/Admin/Area.php +++ b/src/Admin/Area.php @@ -479,6 +479,7 @@ function ( $classes ) { 'education' => [ 'upgrade_icon_lock' => '', 'upgrade_title' => esc_html__( '%name% is a PRO Feature', 'wp-mail-smtp' ), + 'upgrade_content' => esc_html__( 'We\'re sorry, the %name% mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features.', 'wp-mail-smtp' ), 'upgrade_button' => esc_html__( 'Upgrade to Pro', 'wp-mail-smtp' ), 'upgrade_url' => add_query_arg( 'discount', 'SMTPLITEUPGRADE', wp_mail_smtp()->get_upgrade_link( '' ) ), 'upgrade_bonus' => '

      ' . diff --git a/src/Admin/ConnectionSettings.php b/src/Admin/ConnectionSettings.php index d750cc6..a9c7fbe 100644 --- a/src/Admin/ConnectionSettings.php +++ b/src/Admin/ConnectionSettings.php @@ -231,12 +231,14 @@ public function display() { // phpcs:ignore Generic.Metrics.CyclomaticComplexity

      is_disabled() ) : ?> assets_url . '/js/vendor/moment.min.js', [], - '2.22.2', + '2.29.4', true ); diff --git a/src/Admin/Pages/AboutTab.php b/src/Admin/Pages/AboutTab.php index 5d42228..f48d22c 100644 --- a/src/Admin/Pages/AboutTab.php +++ b/src/Admin/Pages/AboutTab.php @@ -276,13 +276,13 @@ private static function get_am_plugins() { 'path' => 'wpforms-lite/wpforms.php', 'icon' => wp_mail_smtp()->assets_url . '/images/about/plugin-wpf.png', 'name' => esc_html__( 'WPForms', 'wp-mail-smtp' ), - 'desc' => esc_html__( 'The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment forms, and more with our 100+ form templates. Trusted by over 5 million websites as the best forms plugin.', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment forms, and more with our 600+ form templates. Trusted by over 5 million websites as the best forms plugin.', 'wp-mail-smtp' ), 'url' => 'https://downloads.wordpress.org/plugin/wpforms-lite.zip', 'pro' => [ 'path' => 'wpforms/wpforms.php', 'icon' => wp_mail_smtp()->assets_url . '/images/about/plugin-wpf.png', 'name' => esc_html__( 'WPForms Pro', 'wp-mail-smtp' ), - 'desc' => esc_html__( 'The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment forms, and more with our 100+ form templates. Trusted by over 5 million websites as the best forms plugin.', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment forms, and more with our 600+ form templates. Trusted by over 5 million websites as the best forms plugin.', 'wp-mail-smtp' ), 'url' => 'https://wpforms.com/?utm_source=WordPress&utm_medium=about&utm_campaign=smtp', ], ], @@ -346,7 +346,7 @@ private static function get_am_plugins() { 'path' => 'pushengage/main.php', 'icon' => wp_mail_smtp()->assets_url . '/images/about/plugin-pushengage.png', 'name' => esc_html__( 'PushEngage', 'wp-mail-smtp' ), - 'desc' => esc_html__( 'Connect with your visitors after they leave your website with the leading web push notification software. Over 10,000+ businesses worldwide use PushEngage to send 9 billion notifications each month.', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Connect with your visitors after they leave your website with the leading web push notification software. Over 10,000+ businesses worldwide use PushEngage to send 15 billion notifications each month.', 'wp-mail-smtp' ), 'url' => 'https://downloads.wordpress.org/plugin/pushengage.zip', ], 'smash-balloon-instagram-feeds' => [ @@ -412,7 +412,7 @@ private static function get_am_plugins() { 'desc' => esc_html__( 'Boost your sales and conversions by up to 15% with real-time social proof notifications. TrustPulse helps you show live user activity and purchases to help convince other users to purchase.', 'wp-mail-smtp' ), 'url' => 'https://downloads.wordpress.org/plugin/trustpulse-api.zip', ], - 'searchwp' => [ + 'searchwp' => [ 'path' => '', 'icon' => wp_mail_smtp()->assets_url . '/images/about/searchwp.png', 'name' => esc_html__( 'SearchWP', 'wp-mail-smtp' ), @@ -475,6 +475,41 @@ private static function get_am_plugins() { 'url' => 'https://sugarcalendar.com/?utm_source=WordPress&utm_medium=about&utm_campaign=smtp', ], ], + 'wp-charitable' => [ + 'path' => 'charitable/charitable.php', + 'icon' => wp_mail_smtp()->assets_url . '/images/about/plugin-charitable.png', + 'name' => esc_html__( 'WP Charitable', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Top-rated WordPress donation and fundraising plugin. Over 10,000+ non-profit organizations and website owners use Charitable to create fundraising campaigns and raise more money online.', 'wp-mail-smtp' ), + 'url' => 'https://downloads.wordpress.org/plugin/charitable.zip', + ], + 'wpcode' => [ + 'path' => 'insert-headers-and-footers/ihaf.php', + 'icon' => wp_mail_smtp()->assets_url . '/images/about/plugin-wpcode.png', + 'name' => esc_html__( 'WPCode Lite', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Future proof your WordPress customizations with the most popular code snippet management plugin for WordPress. Trusted by over 1,500,000+ websites for easily adding code to WordPress right from the admin area.', 'wp-mail-smtp' ), + 'url' => 'https://downloads.wordpress.org/plugin/insert-headers-and-footers.zip', + 'pro' => [ + 'path' => 'wpcode-premium/wpcode.php', + 'icon' => wp_mail_smtp()->assets_url . '/images/about/plugin-wpcode.png', + 'name' => esc_html__( 'WPCode Pro', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Future proof your WordPress customizations with the most popular code snippet management plugin for WordPress. Trusted by over 1,500,000+ websites for easily adding code to WordPress right from the admin area.', 'wp-mail-smtp' ), + 'url' => 'https://wpcode.com/?utm_source=WordPress&utm_medium=about&utm_campaign=smtp', + ], + ], + 'duplicator' => [ + 'path' => 'duplicator/duplicator.php', + 'icon' => wp_mail_smtp()->assets_url . '/images/about/duplicator-icon-large.png', + 'name' => esc_html__( 'Duplicator', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Leading WordPress backup & site migration plugin. Over 1,500,000+ smart website owners use Duplicator to make reliable and secure WordPress backups to protect their websites. It also makes website migration really easy.', 'wp-mail-smtp' ), + 'url' => 'https://downloads.wordpress.org/plugin/duplicator.zip', + 'pro' => [ + 'path' => 'duplicator-pro/duplicator-pro.php', + 'icon' => wp_mail_smtp()->assets_url . '/images/about/duplicator-icon-large.png', + 'name' => esc_html__( 'Duplicator Pro', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Leading WordPress backup & site migration plugin. Over 1,500,000+ smart website owners use Duplicator to make reliable and secure WordPress backups to protect their websites. It also makes website migration really easy.', 'wp-mail-smtp' ), + 'url' => 'https://duplicator.com/?utm_source=WordPress&utm_medium=about&utm_campaign=smtp', + ], + ], ]; return $data; diff --git a/src/Admin/Pages/SmartRoutingTab.php b/src/Admin/Pages/SmartRoutingTab.php index e03b58d..5342277 100644 --- a/src/Admin/Pages/SmartRoutingTab.php +++ b/src/Admin/Pages/SmartRoutingTab.php @@ -67,11 +67,9 @@ public function hooks() { */ public function enqueue_assets() { - $min = WP::asset_min(); - wp_enqueue_style( 'wp-mail-smtp-smart-routing', - wp_mail_smtp()->plugin_url . "/assets/css/smtp-smart-routing{$min}.css", + wp_mail_smtp()->plugin_url . '/assets/css/smtp-smart-routing.min.css', [], WPMS_PLUGIN_VER ); diff --git a/src/Admin/Pages/TestTab.php b/src/Admin/Pages/TestTab.php index 2165609..f898aab 100644 --- a/src/Admin/Pages/TestTab.php +++ b/src/Admin/Pages/TestTab.php @@ -302,6 +302,7 @@ public function process_post( $data ) { $this->connection = apply_filters( 'wp_mail_smtp_admin_pages_test_tab_process_post_connection', $connection, $data ); if ( ! empty( $data['test']['email'] ) ) { + $data['test']['email'] = wp_unslash( $data['test']['email'] ); $data['test']['email'] = filter_var( $data['test']['email'], FILTER_VALIDATE_EMAIL ); } @@ -333,6 +334,9 @@ public function process_post( $data ) { $subject = 'WP Mail SMTP: HTML ' . sprintf( esc_html__( 'Test email to %s', 'wp-mail-smtp' ), $data['test']['email'] ); } + // Clear debug before send test email. + Debug::clear(); + // Start output buffering to grab smtp debugging output. ob_start(); diff --git a/src/Admin/Review.php b/src/Admin/Review.php index 7233625..e07a04c 100644 --- a/src/Admin/Review.php +++ b/src/Admin/Review.php @@ -36,10 +36,27 @@ class Review { */ public function hooks() { - add_action( 'admin_notices', array( $this, 'review_request' ) ); + add_action( 'admin_init', [ $this, 'admin_notices' ] ); add_action( 'wp_ajax_wp_mail_smtp_review_dismiss', array( $this, 'review_dismiss' ) ); } + /** + * Display notices only in Network Admin if in Multisite. + * Otherwise, display in Admin Dashboard. + * + * @since 3.8.0 + * + * @return void + */ + public function admin_notices() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + if ( is_multisite() ) { + add_action( 'network_admin_notices', [ $this, 'review_request' ] ); + } else { + add_action( 'admin_notices', [ $this, 'review_request' ] ); + } + } + /** * Add admin notices as needed for reviews. * diff --git a/src/Admin/SetupWizard.php b/src/Admin/SetupWizard.php index 995a1c6..f484d1c 100644 --- a/src/Admin/SetupWizard.php +++ b/src/Admin/SetupWizard.php @@ -122,8 +122,8 @@ public function maybe_redirect_after_activation() { // phpcs:ignore Generic.Metr return; } - // Only do this for single site installs. - if ( isset( $_GET['activate-multi'] ) || is_network_admin() ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + // Only do this for single site installs if Network Wide setting is not enabled. + if ( isset( $_GET['activate-multi'] ) || is_network_admin() || WP::use_global_plugin_settings() ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return; } diff --git a/src/Core.php b/src/Core.php index a96a67c..e027c1f 100644 --- a/src/Core.php +++ b/src/Core.php @@ -201,10 +201,6 @@ protected function is_pro_allowed() { $is_allowed = false; } - if ( version_compare( phpversion(), '5.6', '<' ) ) { - $is_allowed = false; - } - return apply_filters( 'wp_mail_smtp_core_is_pro_allowed', $is_allowed ); } @@ -429,52 +425,7 @@ public function get_site_health() { * * @since 1.0.0 */ - public function init_notifications() { - - // Old PHP version notification. - if ( - version_compare( phpversion(), '5.6', '<' ) && - is_super_admin() && - ( - isset( $GLOBALS['pagenow'] ) && - $GLOBALS['pagenow'] === 'index.php' - ) - ) { - WP::add_admin_notice( - sprintf( - wp_kses( /* translators: %1$s - WP Mail SMTP plugin name; %2$s - WPMailSMTP.com URL to a related doc. */ - __( 'Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. Read more for additional information.', 'wp-mail-smtp' ), - array( - 'a' => array( - 'href' => array(), - 'target' => array(), - 'rel' => array(), - ), - ) - ), - 'WP Mail SMTP', - // phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound - esc_url( wp_mail_smtp()->get_utm_url( 'https://wpmailsmtp.com/docs/supported-php-versions-for-wp-mail-smtp/', [ 'medium' => 'Admin Notice', 'content' => 'Upgrade PHP Recommendation' ] ) ) - ) . - '

      ' . - wp_kses( - __( 'Please Note: Support for PHP 5.5 will be discontinued in 2021. After this, if no further action is taken, WP Mail SMTP functionality will be disabled.', 'wp-mail-smtp' ), - array( - 'strong' => array(), - 'em' => array(), - ) - ) . - '', - WP::ADMIN_NOTICE_ERROR, - false - ); - } - - // Awesome Motive Notifications. - if ( Options::init()->get( 'general', 'am_notifications_hidden' ) ) { - return; - } - } + public function init_notifications() { } /** * Display all debug mail-delivery related notices. @@ -800,7 +751,11 @@ public function get_license_key() { */ public function get_upgrade_link( $utm ) { - $url = $this->get_utm_url( 'https://wpmailsmtp.com/lite-upgrade/', $utm ); + $url = add_query_arg( + 'utm_locale', + sanitize_key( get_locale() ), + $this->get_utm_url( 'https://wpmailsmtp.com/lite-upgrade/', $utm ) + ); /** * Filters upgrade link. diff --git a/src/DBRepair.php b/src/DBRepair.php index 3fa86bc..16c776d 100644 --- a/src/DBRepair.php +++ b/src/DBRepair.php @@ -48,11 +48,13 @@ public function fix_missing_db_tables() { // phpcs:ignore Generic.Metrics.Nestin $this->fix_missing_db_table( $missing_table ); } + $redirect_page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : Area::SLUG; + $redirect_url = add_query_arg( [ 'check-db-tables' => 1, ], - wp_mail_smtp()->get_admin()->get_admin_page_url( Area::SLUG ) + wp_mail_smtp()->get_admin()->get_admin_page_url( $redirect_page ) ); wp_safe_redirect( $redirect_url ); diff --git a/src/Helpers/Crypto.php b/src/Helpers/Crypto.php index 825377a..4f617d8 100644 --- a/src/Helpers/Crypto.php +++ b/src/Helpers/Crypto.php @@ -2,12 +2,6 @@ namespace WPMailSMTP\Helpers; -// WP 5.2+ already load Sodium Compat polyfill for libsodium-fallback. -// We need to do the same for under 5.2 versions (4.9-5.1). -if ( ! version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) && ! function_exists( 'sodium_crypto_box' ) ) { - require_once dirname( WPMS_PLUGIN_FILE ) . '/libs/sodium_compat/autoload.php'; -} - /** * Class for encryption functionality. * diff --git a/src/MailCatcherTrait.php b/src/MailCatcherTrait.php index c567878..ba629d1 100644 --- a/src/MailCatcherTrait.php +++ b/src/MailCatcherTrait.php @@ -49,6 +49,15 @@ trait MailCatcherTrait { */ private $is_setup_wizard_test_email = false; + /** + * Whether the current email is blocked to be sent. + * + * @since 3.8.0 + * + * @var bool + */ + private $is_emailing_blocked = false; + /** * Holds the most recent error message. * @@ -79,12 +88,11 @@ public function send() { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.Ma $this->debug_event_id = false; $this->is_test_email = false; $this->is_setup_wizard_test_email = false; + $this->is_emailing_blocked = false; $this->latest_error = ''; - $is_emailing_blocked = false; - if ( wp_mail_smtp()->is_blocked() ) { - $is_emailing_blocked = true; + $this->is_emailing_blocked = true; } // Always allow a test email - check for the specific header. @@ -95,8 +103,8 @@ public function send() { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.Ma $header[0] === 'X-Mailer-Type' ) { if ( trim( $header[1] ) === 'WPMailSMTP/Admin/Test' ) { - $is_emailing_blocked = false; - $this->is_test_email = true; + $this->is_emailing_blocked = false; + $this->is_test_email = true; } elseif ( trim( $header[1] ) === 'WPMailSMTP/Admin/SetupWizard/Test' ) { $this->is_setup_wizard_test_email = true; } @@ -104,7 +112,7 @@ public function send() { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.Ma } // Do not send emails if admin desired that. - if ( $is_emailing_blocked ) { + if ( $this->is_emailing_blocked ) { return false; } @@ -373,4 +381,16 @@ public function is_setup_wizard_test_email() { return $this->is_setup_wizard_test_email; } + + /** + * Whether the current email is blocked to be sent. + * + * @since 3.8.0 + * + * @return bool + */ + public function is_emailing_blocked() { + + return $this->is_emailing_blocked; + } } diff --git a/src/Providers/Gmail/Auth.php b/src/Providers/Gmail/Auth.php index 6222e47..13402ea 100644 --- a/src/Providers/Gmail/Auth.php +++ b/src/Providers/Gmail/Auth.php @@ -117,7 +117,7 @@ public function get_client( $force = false ) { // phpcs:ignore Generic.Metrics.C ); $client->setApplicationName( 'WP Mail SMTP v' . WPMS_PLUGIN_VER ); $client->setAccessType( 'offline' ); - $client->setApprovalPrompt( 'force' ); + $client->setPrompt( 'consent' ); $client->setIncludeGrantedScopes( false ); // We request only the sending capability, as it's what we only need to do. $client->setScopes( array( Gmail::MAIL_GOOGLE_COM ) ); diff --git a/src/UsageTracking/UsageTracking.php b/src/UsageTracking/UsageTracking.php index 929093d..c022eb2 100644 --- a/src/UsageTracking/UsageTracking.php +++ b/src/UsageTracking/UsageTracking.php @@ -142,6 +142,7 @@ public function get_data() { 'wp_mail_smtp_setup_wizard_launched_time' => isset( $setup_wizard_stats['launched_time'] ) ? (int) $setup_wizard_stats['launched_time'] : 0, 'wp_mail_smtp_setup_wizard_completed_time' => isset( $setup_wizard_stats['completed_time'] ) ? (int) $setup_wizard_stats['completed_time'] : 0, 'wp_mail_smtp_setup_wizard_completed_successfully' => ! empty( $setup_wizard_stats['was_successful'] ), + 'wp_mail_smtp_source' => sanitize_title( get_option( 'wp_mail_smtp_source', '' ) ), ] ); diff --git a/src/WP.php b/src/WP.php index a21dc59..981ade6 100644 --- a/src/WP.php +++ b/src/WP.php @@ -567,6 +567,7 @@ public static function get_initiator( $file_path ) { // phpcs:ignore Generic.Met } if ( empty( $initiator ) ) { + $initiator = []; $initiator['name'] = esc_html__( 'N/A', 'wp-mail-smtp' ); $initiator['slug'] = ''; $initiator['type'] = 'unknown'; diff --git a/wp_mail_smtp.php b/wp_mail_smtp.php index a811ed6..25c857a 100644 --- a/wp_mail_smtp.php +++ b/wp_mail_smtp.php @@ -1,13 +1,13 @@ wp_mail() function to use Gmail/Mailgun/SendGrid/SMTP instead of the default mail() and creates an options page to manage the settings. - * Author: WPForms - * Author URI: https://wpforms.com/ + * Author: WP Mail SMTP + * Author URI: https://wpmailsmtp.com/ * Network: false * Text Domain: wp-mail-smtp * Domain Path: /assets/languages @@ -15,7 +15,7 @@ /** * @author WPForms - * @copyright WPForms, 2007-21, All Rights Reserved + * @copyright WPForms, 2007-23, All Rights Reserved * This code is released under the GPL licence version 3 or later, available here * https://www.gnu.org/licenses/gpl.txt */ @@ -124,20 +124,35 @@ function wp_mail_smtp_check_pro_loading_allowed() { require_once ABSPATH . '/wp-admin/includes/plugin.php'; } + $lite_plugin_slug = 'wp-mail-smtp/wp_mail_smtp.php'; + // Search for old plugin name. - if ( is_plugin_active( 'wp-mail-smtp/wp_mail_smtp.php' ) ) { + if ( is_plugin_active( $lite_plugin_slug ) ) { /* * Prevent issues of WP functions not being available for other plugins that hook into * this early deactivation. GH issue #861. */ require_once ABSPATH . WPINC . '/pluggable.php'; - // As Pro is loaded and Lite too - deactivate *silently* itself not to break older SMTP plugin. - deactivate_plugins( plugin_basename( __FILE__ ) ); - - add_action( 'admin_notices', 'wp_mail_smtp_lite_deactivation_notice' ); - - return true; + if ( + is_multisite() && + is_plugin_active_for_network( plugin_basename( __FILE__ ) ) && + ! is_plugin_active_for_network( $lite_plugin_slug ) + ) { + // Deactivate Lite plugin if Pro activated on Network level. + deactivate_plugins( $lite_plugin_slug ); + } else { + // As Pro is loaded and Lite too - deactivate *silently* itself not to break older SMTP plugin. + deactivate_plugins( plugin_basename( __FILE__ ) ); + + if ( is_network_admin() ) { + add_action( 'network_admin_notices', 'wp_mail_smtp_lite_deactivation_notice' ); + } else { + add_action( 'admin_notices', 'wp_mail_smtp_lite_deactivation_notice' ); + } + + return true; + } } return false; @@ -233,10 +248,10 @@ function wp_mail_smtp_insecure_php_version_notice() { } if ( ! defined( 'WPMS_PLUGIN_VER' ) ) { - define( 'WPMS_PLUGIN_VER', '3.7.0' ); + define( 'WPMS_PLUGIN_VER', '3.8.0' ); } if ( ! defined( 'WPMS_PHP_VER' ) ) { - define( 'WPMS_PHP_VER', '5.6.20' ); + define( 'WPMS_PHP_VER', '7.2' ); } if ( ! defined( 'WPMS_WP_VER' ) ) { define( 'WPMS_WP_VER', '5.2' );