Backup Migration - Version 1.0.4

Version Description

  • Initial release

=

Download this release

Release Info

Developer migrate
Plugin Icon wp plugin Backup Migration
Version 1.0.4
Comparing to
See all releases

Version 1.0.4

Files changed (125) hide show
  1. admin/css/bmi-plugin.min.css +1 -0
  2. admin/images/002-monitor-white.svg +15 -0
  3. admin/images/Amazon.svg +47 -0
  4. admin/images/alert_error-min.png +0 -0
  5. admin/images/alert_info-min.png +0 -0
  6. admin/images/alert_success-min.png +0 -0
  7. admin/images/alert_warning-min.png +0 -0
  8. admin/images/arrow-min.png +0 -0
  9. admin/images/backblaze.svg +44 -0
  10. admin/images/backup-min.svg +1 -0
  11. admin/images/big_bg_clock_green-min.png +0 -0
  12. admin/images/big_bg_clock_white-min.png +0 -0
  13. admin/images/clock.svg +3 -0
  14. admin/images/clock2.svg +5 -0
  15. admin/images/clocks-min.png +0 -0
  16. admin/images/close-min.png +0 -0
  17. admin/images/copy-icon.png +0 -0
  18. admin/images/crown-bg.png +0 -0
  19. admin/images/download-min.png +0 -0
  20. admin/images/dream-objects.svg +47 -0
  21. admin/images/ftp.svg +37 -0
  22. admin/images/google-cloud.svg +49 -0
  23. admin/images/google-drive.svg +51 -0
  24. admin/images/happy-smile.png +0 -0
  25. admin/images/info-min.png +0 -0
  26. admin/images/kitty-cat.svg +1 -0
  27. admin/images/link-min.png +0 -0
  28. admin/images/lock-experimental.png +0 -0
  29. admin/images/lock-min.svg +1 -0
  30. admin/images/log-min.svg +1 -0
  31. admin/images/logo-min.png +0 -0
  32. admin/images/logo.png +0 -0
  33. admin/images/microsoft-azure.svg +43 -0
  34. admin/images/minimize-min.png +0 -0
  35. admin/images/next-icon-min.png +0 -0
  36. admin/images/nut-big.png +0 -0
  37. admin/images/nut-mid.png +0 -0
  38. admin/images/nut-small.png +0 -0
  39. admin/images/onedrive.svg +39 -0
  40. admin/images/openstack-swift.svg +28 -0
  41. admin/images/premium.png +0 -0
  42. admin/images/premium.svg +10 -0
  43. admin/images/rackspace.svg +44 -0
  44. admin/images/red-close-min.svg +1 -0
  45. admin/images/red-cross.svg +204 -0
  46. admin/images/restore-icon-min.png +0 -0
  47. admin/images/restore-min.svg +1 -0
  48. admin/images/search-min.png +0 -0
  49. admin/images/sftp-scp.svg +29 -0
  50. admin/images/stars.gif +0 -0
  51. admin/images/success.png +0 -0
  52. admin/images/support-1.svg +1 -0
  53. admin/images/support-2.svg +1 -0
  54. admin/images/support-3.svg +1 -0
  55. admin/images/thumb.png +0 -0
  56. admin/images/timemachine.svg +1 -0
  57. admin/images/trash.png +0 -0
  58. admin/images/unlocked-min.svg +1 -0
  59. admin/images/upload-min.png +0 -0
  60. admin/images/upload.svg +47 -0
  61. admin/images/warning-grey.png +0 -0
  62. admin/images/warning-red.png +0 -0
  63. admin/images/x-face.png +0 -0
  64. admin/js/backup-migration.min.js +1 -0
  65. backup-backup.php +48 -0
  66. includes/ajax.php +1434 -0
  67. includes/check/checker.php +110 -0
  68. includes/check/system_info.php +497 -0
  69. includes/config.php +158 -0
  70. includes/constants.php +76 -0
  71. includes/cron/handler.php +117 -0
  72. includes/dashboard/chapter/AA-Template.php +9 -0
  73. includes/dashboard/chapter/other_config.php +298 -0
  74. includes/dashboard/chapter/save-button.php +18 -0
  75. includes/dashboard/chapter/store_config.php +155 -0
  76. includes/dashboard/chapter/troubleshooting.php +195 -0
  77. includes/dashboard/chapter/what_backed_up.php +389 -0
  78. includes/dashboard/chapter/where_config.php +234 -0
  79. includes/dashboard/modals/AA-Modal-Template.php +25 -0
  80. includes/dashboard/modals/backup-error-modal.php +67 -0
  81. includes/dashboard/modals/backup-progress-modal.php +76 -0
  82. includes/dashboard/modals/backup-success-modal.php +74 -0
  83. includes/dashboard/modals/bfs-modal.php +76 -0
  84. includes/dashboard/modals/delete-confirm-modal.php +49 -0
  85. includes/dashboard/modals/pre-restore-modal.php +68 -0
  86. includes/dashboard/modals/prenotice-modal.php +69 -0
  87. includes/dashboard/modals/reset-confirm-modal.php +40 -0
  88. includes/dashboard/modals/restore-error-modal.php +67 -0
  89. includes/dashboard/modals/restore-progress-modal.php +51 -0
  90. includes/dashboard/modals/restore-success-modal.php +74 -0
  91. includes/dashboard/modals/upload-exist-file-modal.php +41 -0
  92. includes/dashboard/modals/upload-invalid-manifest-modal.php +39 -0
  93. includes/dashboard/modals/upload-success-modal.php +39 -0
  94. includes/dashboard/modals/upload-wrong-file-modal.php +39 -0
  95. includes/dashboard/modules/backup-ongoing.php +19 -0
  96. includes/dashboard/modules/backup_controller.php +213 -0
  97. includes/dashboard/modules/backups-table-header.php +42 -0
  98. includes/dashboard/modules/backups-under-table.php +93 -0
  99. includes/dashboard/modules/email-errors.php +35 -0
  100. includes/dashboard/modules/super-quick-migration.php +33 -0
  101. includes/dashboard/modules/upload-backup.php +13 -0
  102. includes/dashboard/settings.php +207 -0
  103. includes/dashboard/templates/AA-Template.php +9 -0
  104. includes/dashboard/templates/backup-row-template.php +42 -0
  105. includes/dashboard/templates/dropdown-template.php +14 -0
  106. includes/dashboard/templates/exclusion-rule-template.php +34 -0
  107. includes/dashboard/templates/option-template.php +11 -0
  108. includes/dashboard/templates/premium-overlay.php +26 -0
  109. includes/dashboard/translations.php +114 -0
  110. includes/database/manager.php +185 -0
  111. includes/extracter/extract.php +287 -0
  112. includes/htaccess/.htaccess +17 -0
  113. includes/htaccess/.litespeed +7 -0
  114. includes/htaccess/default.json +39 -0
  115. includes/initializer.php +637 -0
  116. includes/logger.php +43 -0
  117. includes/progress/migration.php +54 -0
  118. includes/progress/zip.php +110 -0
  119. includes/scanner/backups.php +90 -0
  120. includes/scanner/files.php +461 -0
  121. includes/uploader/chunks.php +133 -0
  122. includes/zipper/src/zip.php +500 -0
  123. includes/zipper/zipping.php +209 -0
  124. readme.txt +35 -0
  125. uninstall.php +65 -0
admin/css/bmi-plugin.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap");#bmi{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:'Montserrat', Helvetica, Arial, sans-serif;max-width:1495px;max-width:min(1495px, 95%);margin:0 auto;padding-top:55px;padding-bottom:30vh;min-width:1495px;min-width:calc(min(1495px, 95%))}#bmi .light{font-weight:300}#bmi .regular{font-weight:400}#bmi .medium{font-weight:500}#bmi .semibold{font-weight:600}#bmi .bold{font-weight:700}#bmi .f12{font-size:12px}#bmi .f14{font-size:14px}#bmi .f15{font-size:15px}#bmi .f16{font-size:16px}#bmi .f17{font-size:17px}#bmi .f18{font-size:18px}#bmi .f19{font-size:19px}#bmi .f20{font-size:20px}#bmi .f22{font-size:22px}#bmi .f24{font-size:24px}#bmi .f25{font-size:25px}#bmi .f26{font-size:26px}#bmi .f28{font-size:28px}#bmi .f30{font-size:30px}#bmi .f35{font-size:35px}#bmi .black{color:black}#bmi a{color:#555}#bmi .cf::after{content:'';display:block;clear:both}#bmi .left{float:left}#bmi .right{float:right}#bmi .pointer{cursor:pointer}#bmi .not-allowed{cursor:not-allowed !important}#bmi .hoverable{opacity:1;transition:.3s all;cursor:pointer}#bmi .hoverable:hover{opacity:0.8}#bmi .hoverable:active{transition:0 all !important;opacity:.6}#bmi .transition{transition:.3s all}#bmi .relative{position:relative}#bmi .vcenter{position:absolute;text-align:center;top:50%;transform:translate(0, -50%)}#bmi .flexcenter{justify-content:center;align-items:center}#bmi .shadow{box-shadow:2px 2px 5px rgba(0,0,0,0.35)}#bmi .inline{display:inline-block !important}#bmi .fullwidth{width:100%}#bmi .lh13{line-height:1.3}#bmi .lh14{line-height:1.4}#bmi .lh28{line-height:28px}#bmi .lh30{line-height:30px}#bmi .lh40{line-height:40px}#bmi .lh45{line-height:45px}#bmi .lh50{line-height:50px}#bmi .lh60{line-height:60px}#bmi .lh65{line-height:65px}#bmi .section-bmi{margin-bottom:25px}#bmi hr.section-bmi{margin-top:30px;margin-bottom:25px;border-top:2px solid #ddd}#bmi .secondary{color:#257671}#bmi .rbb{border-bottom-left-radius:10px;border-bottom-right-radius:10px}#bmi .rbt{border-top-left-radius:10px;border-top-right-radius:10px}#bmi .center{text-align:center}#bmi .center.block{margin:0 auto}#bmi .align-right{text-align:right}#bmi .align-left{text-align:left}#bmi button{border-radius:10px;background:#257671;line-height:46px;border:0;transition:.3s all;color:white;cursor:pointer}#bmi button:hover{background:#206662}#bmi button:active{transition:0 all;background:#1b5753;opacity:.4}#bmi button.centred{margin:0 auto;margin-bottom:20px;margin-top:25px}#bmi button.with-icon .for-img{display:inline-block;position:relative}#bmi button.with-icon img{position:absolute;left:0;top:8px;height:28px;width:28px}#bmi button.with-icon span{padding-left:35px}#bmi .mm{padding-left:45px;padding-right:45px}#bmi .ppr{padding-right:25px}#bmi .tml{margin-top:20px}#bmi .mo{padding:45px}#bmi .mt{padding-top:45px}#bmi .mb{padding-bottom:45px}#bmi .mtl{padding-top:25px}#bmi .mbl{padding-bottom:25px}#bmi .mtll{padding-top:15px}#bmi .mtlll{padding-top:7px}#bmi .mbll{padding-bottom:15px}#bmi .mblll{padding-bottom:7px}#bmi .nm{margin:0 !important}#bmi .mms{padding-left:20px;padding-right:20px}#bmi .mmm{padding-left:35px;padding-right:35px}#bmi .mm60{padding-left:60px;padding-right:60px}#bmi .mm30{padding-left:30px;padding-right:30px}#bmi .mm92{padding-left:76px !important;padding-right:76px !important}#bmi .text-grey{color:#373737}#bmi .text-muted{opacity:0.47}#bmi .red-text{color:red}#bmi .flex-here{display:flex;flex-direction:row}#bmi .flex-here div{flex:1}#bmi .nlink{text-decoration:none;color:#257671}#bmi .nplr{padding-left:0 !important;padding-right:0 !important}#bmi .flex{display:flex;flex-wrap:wrap}#bmi .rr{padding-left:32px}#bmi .np{padding:0}#bmi .npb{padding-bottom:0 !important}#bmi .npt{padding-top:0 !important}#bmi .pbl{padding-bottom:10px !important}#bmi .bg-second{background:#f8f8f8}#bmi .width50,#bmi .half{width:50% !important}#bmi .chhl{width:calc(50% - 80px) !important;margin:0 40px}#bmi .under{text-decoration:underline}#bmi .tilo{font-size:18px}#bmi .red-error-bg{background:#f9efef}#bmi .nodec{text-decoration:none !important}#bmi .mt30{margin-top:30px}#bmi .suc-buttns .a1,#bmi .suc-buttns .a2{width:calc(50% - 40px);margin:10px}#bmi .suc-buttns .a1 a,#bmi .suc-buttns .a2 a{padding:10px 30px}#bmi .suc-buttns .a1{margin-left:30px}#bmi .suc-buttns .a2{margin-right:30px}#bmi .nowrap{flex-wrap:nowrap !important}#bmi .fbcont{font-size:14px;text-align:left;padding-left:15px}#bmi .fbcont .fbhead{display:block;font-size:19px;margin-bottom:5px}#bmi .nmt{margin-top:0 !important}#bmi .fcentr{display:flex;justify-content:center}#bmi .autowidth{width:auto !important}#bmi .flex1{flex:1}#bmi .flex2{flex:2}#bmi .left-align{text-align:left}#bmi .right-align{text-align:right}#bmi .info-cursor{cursor:help}#bmi .wait-cursor{cursor:wait}#bmi .mrr{margin-right:20px !important}#bmi .orr{margin-right:10px}#bmi .oll{margin-left:10px}#bmi .ooo-to-pad .orr{padding-right:10px !important}#bmi .ooo-to-pad .oll{padding-left:10px !important}#bmi .mw850{max-width:850px}#bmi .bol{margin-left:100px}#bmi li.hasArrowRight{position:relative;padding-left:40px}#bmi li.hasArrowRight::before{content:'';position:absolute;border:solid #257671;border-width:0 3px 3px 0;display:inline-block;padding:3px;transform:rotate(-45deg);-webkit-transform:rotate(-45deg);left:20px;top:10px}#bmi .cron-a{line-height:77px;padding:0px 35px}#bmi .cron-b{border-top:2px solid #e2eceb;border-bottom:2px solid #e2eceb;background-color:#e6eeee;padding:0px 35px;overflow-x:auto;max-width:100%;max-height:78px;overflow-y:hidden}#bmi .cron-b table{height:72px}#bmi .cron-c{padding:0px 35px}#bmi .cron-c table{height:70px}#bmi .mr50{margin-right:50px}#bmi .mr20{margin-right:20px}#bmi .mw250{min-width:250px}#bmi .center-table{width:100%}#bmi .center-table td{text-align:center;padding-left:10px;padding-right:10px}#bmi .untab{box-shadow:none !important;outline:0 !important}#bmi .modal.before-open{transition:0s all !important;opacity:0;display:block}#bmi .modal.before-open .modal-wrapper{left:-60px;transition:0s all !important;top:-30px;opacity:0}#bmi .modal.open{transition:0.4s all !important;opacity:1;display:block}#bmi .modal.open .modal-wrapper{top:60px;left:0px;transition:0.4s all !important;opacity:1}#bmi .modal.before-close{transition:0s all !important;opacity:1;display:block}#bmi .modal.before-close .modal-wrapper{transition:0s all !important;top:60px;left:0px;opacity:1}#bmi .modal.closed{transition:0.4s all !important;left:0px;opacity:0}#bmi .modal.closed .modal-wrapper{transition:0.4s all !important;top:120px;left:60px;opacity:0}#bmi .modal{top:0;left:0;display:none;position:fixed;width:100%;height:100vh;background:rgba(37,118,113,0.4);overflow:auto;z-index:999999}#bmi .modal .modal-close{position:absolute;top:25px;right:25px;font-size:35px !important;color:#555 !important;font-weight:500 !important;z-index:9999999 !important;text-decoration:none !important;line-height:1.1;transition:.3s all;opacity:1}#bmi .modal .modal-close.light{color:white !important}#bmi .modal .modal-close:hover{opacity:.7}#bmi .modal .modal-wrapper{top:60px;max-width:60vw;box-shadow:0px 10px 64px rgba(0,0,0,0.24);margin:0 auto;position:relative;background:#FBFBFF;border-radius:10px;padding:40px 40px;margin-bottom:35px;min-height:200px}#bmi .modal .modal-wrapper.no-hpad{padding-left:0;padding-right:0}#bmi .modal .modal-wrapper.no-vpad{padding-top:0;padding-bottom:0}#bmi .modal-closer{cursor:pointer}#bmi .modal-closer:hover{text-decoration:underline}#bmi .live-log{transition:.3s all;overflow:hidden;max-height:306px}#bmi .live-log.expanded-logs{max-height:0px}#bmi .red-warning{position:relative;display:inline-block;padding-left:60px;padding-right:60px}#bmi .red-warning::after,#bmi .red-warning::before{content:'';position:absolute;top:12px;height:41px;width:46px}#bmi .red-warning::after{left:0;background:url("../images/warning-red.png")}#bmi .red-warning::before{right:0;background:url("../images/warning-red.png")}#bmi .premium-wrapper{cursor:not-allowed}#bmi .premium-wrapper .premium{pointer-events:none}#bmi .premium-wrapper .premium-img{line-height:30px;padding-right:30px;position:relative}#bmi .premium-wrapper .premium-img::after{content:'';position:absolute;top:0;bottom:0;right:0;background:url("../images/premium.svg");margin-top:3px;height:24px;width:24px;background-repeat:no-repeat;background-size:cover}#bmi .premium-wrapper .premium-img.premium-nt::after{margin-top:0px !important;right:20px;top:1px}#bmi .premium-wrapper .premium-img.premium-ntt::after{margin-top:0px !important;top:-1px}#bmi .bmi-notification-box{position:fixed;top:15px;right:15px;min-width:100px;max-width:40vw;z-index:1000000}#bmi .bmi-notification.is-info,#bmi .bmi-title.is-info{background-color:#0c96b7}#bmi .bmi-notification.is-danger,#bmi .bmi-title.is-danger{background-color:#e4706f}#bmi .bmi-notification.is-success,#bmi .bmi-title.is-success{background-color:#6db799}#bmi .bmi-alert-icon{height:100%;width:25px}#bmi .bmi-alert-icon .bmi-icon-bg{width:25px;height:25px}#bmi .bmi-alert-msg-title{padding-left:40px !important}#bmi .bmi-notification .bmi-icon-bg{background-position:center;background-repeat:no-repeat;position:absolute;height:calc(100% - 36px)}#bmi .bmi-notification.is-success .bmi-icon-bg{background-image:url("../images/alert_success-min.png")}#bmi .bmi-notification.is-warning .bmi-icon-bg{background-image:url("../images/alert_warning-min.png")}#bmi .bmi-notification.is-info .bmi-icon-bg{background-image:url("../images/alert_info-min.png")}#bmi .bmi-notification.is-danger .bmi-icon-bg{background-image:url("../images/alert_error-min.png")}#bmi .bmi-notification.is-warning,#bmi .bmi-title.is-warning{background-color:#ecb135}#bmi .bmi-title{margin-bottom:3px;font-weight:500;font-size:15px !important}#bmi .bmi-notification{border-radius:3px;padding:18px 36px 18px 20px !important;position:relative;margin-bottom:15px;padding-left:3px;font-family:'Montserrat', sans-serif !important;font-size:15px !important;font-weight:300;color:white}#bmi .bmi-times-button{top:2px;right:1px;position:absolute;background:none !important;border:none;font-size:24px;cursor:pointer;font-weight:500;color:white;opacity:0.6;transition:opacity 0.2s;padding:2px 9px !important}#bmi .bmi-times-button:hover{cursor:pointer;opacity:1}#bmi .bmi-noti-hide{display:none}#bmi .translations{display:none;visibility:hidden;height:0;width:0}#bmi .heading{padding-bottom:35px}#bmi .backup-creator .cron-backups-wrap{width:calc(100% - 225px);height:225px}#bmi .backup-creator .cron-backups{background-color:white;width:calc(100% - 15px);margin-left:15px;height:100%;border-radius:10px}#bmi .backup-creator .cron-backups .vcenter{width:100%}#bmi .backup-creator .cron-backups .turned-off{width:100%;height:100%;background:url("../images/big_bg_clock_white-min.png") no-repeat;background-size:cover;color:#257671}#bmi .backup-creator .cron-backups .turned-off:hover{background:url("../images/big_bg_clock_green-min.png") no-repeat;background-size:cover;color:white}#bmi .backup-creator .cron-backups .turned-off,#bmi .backup-creator .cron-backups .turned-on{width:100%;border-radius:10px;position:absolute;top:0;left:0;right:0;bottom:0;opacity:1;transition:.3s all}#bmi .backup-creator .cron-backups.disabled .cron-bc{opacity:.5;cursor:not-allowed}#bmi .backup-creator .cron-backups.disabled .cron-bc .cron-b{pointer-events:none}#bmi .backup-creator .cron-backups.disabled .cron-bc .cron-c{pointer-events:none}#bmi .trouble-section .shadow{border-radius:7px;background:#fff;color:black;cursor:pointer;transition:.3s all;min-height:185px;padding:0 20px}#bmi .trouble-section .shadow svg{color:#257671}#bmi .trouble-section .shadow:hover,#bmi .trouble-section .shadow.active{color:white;box-shadow:2px 2px 7px rgba(0,0,0,0.4);background:#257671}#bmi .trouble-section .shadow:hover svg,#bmi .trouble-section .shadow.active svg{color:white}#bmi .close-chapters:hover{text-decoration:underline !important}#bmi .hide-show-tr{display:none}@-moz-keyframes spin{100%{-moz-transform:rotate(360deg)}}@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes spinreverse{100%{-moz-transform:rotate(-360deg)}}@-webkit-keyframes spinreverse{100%{-webkit-transform:rotate(-360deg)}}@keyframes spinreverse{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}#bmi .spinning{-webkit-animation:spin 3s linear infinite;-moz-animation:spin 3s linear infinite;animation:spin 3s linear infinite}#bmi .spinning-reverse{-webkit-animation:spinreverse 3s linear infinite;-moz-animation:spinreverse 3s linear infinite;animation:spinreverse 3s linear infinite}#bmi #bmi-ongoing-backup{position:fixed;top:32px;right:50px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;height:78px;width:310px;background:#257671;color:white}#bmi #bmi-ongoing-backup .centered{position:absolute;left:85px;top:18px;line-height:22px}#bmi #bmi-ongoing-backup .nuts .nut{position:absolute}#bmi #bmi-ongoing-backup .nuts .nut-1{top:10px;left:30px}#bmi #bmi-ongoing-backup .nuts .nut-2{top:37px;left:15px}#bmi #bmi-ongoing-backup .nuts .nut-3{top:47px;left:37px}#bmi .ml50{margin-left:50px}#bmi .error-noticer{padding:25px 35px;border:1px solid red;border-radius:10px;background:#fbeded;color:red;position:relative;margin-bottom:25px}#bmi .error-noticer .error-header{font-weight:600;font-size:18px}#bmi .error-noticer .error-body{display:none;font-size:16px;padding-left:20px;padding-right:20px;padding-top:20px;line-height:25px}#bmi .error-noticer .error-body b{padding-top:10px;display:block}#bmi .lrn-mr-btn{line-height:70px}#bmi .learn_more_about_cron{background:white;padding:35px 55px 25px;border-radius:10px;font-size:17px;line-height:25px;min-width:calc(100% - 110px);margin-bottom:25px}#bmi .bmi-backup-btn{height:185px;width:185px;outline:none;display:flex;cursor:pointer;font-size:20px;background-color:#257671;position:relative;transition:all 0.7s ease;-webkit-transition:all 0.7s ease;-moz-transition:all 0.7s ease;-o-transition:all 0.7s ease;-ms-transition:all 0.7s ease;border-radius:10px;padding:20px}#bmi .bmi-backup-btn .vcenter{width:calc(100% - 40px)}#bmi .bmi-backup-btn .vcenter .text{margin-top:6px;line-height:1.2}#bmi .bmi-backup-btn.one{border-color:#fff;overflow:hidden;color:#fff}#bmi .bmi-backup-btn.one .insider{opacity:0.6;background-color:rgba(255,255,255,0.14);width:340px;height:162px;position:absolute;right:1px;bottom:86px;transform:rotateZ(-45deg);-webkit-transform:rotateZ(-45deg);-moz-transform:rotateZ(-45deg);-o-transform:rotateZ(-45deg);-ms-transform:rotateZ(-45deg);transition:all 0.3s ease;-webkit-transition:all 0.3s ease;-moz-transition:all 0.3s ease;-o-transition:all 0.3s ease;-ms-transition:all 0.3s ease}#bmi .bmi-backup-btn.one .insider-2{opacity:0.6;background:linear-gradient(180deg, rgba(255,255,255,0.73) 0%, rgba(255,255,255,0.14) 55%);width:390px;height:318px;position:absolute;right:-308px;bottom:-267px;transform:rotateZ(-45deg);-webkit-transform:rotateZ(-45deg);-moz-transform:rotateZ(-45deg);-o-transform:rotateZ(-45deg);-ms-transform:rotateZ(-45deg);transition:all 0.3s ease;-webkit-transition:all 0.3s ease;-moz-transition:all 0.3s ease;-o-transition:all 0.3s ease;-ms-transition:all 0.3s ease}#bmi .bmi-backup-btn.one:hover .insider{transition:all 0.5s ease;-webkit-transition:all 0.5s ease;-moz-transition:all 0.5s ease;-o-transition:all 0.5s ease;-ms-transition:all 0.5s ease;right:108px;bottom:200px}#bmi .bmi-backup-btn.one:hover .insider-2{transition:all 0.6s ease;-webkit-transition:all 0.6s ease;-moz-transition:all 0.6s ease;-o-transition:all 0.6s ease;-ms-transition:all 0.6s ease;transition-delay:0.5s;right:19px;bottom:75px}#bmi .tab-wrapper{min-width:100%}#bmi .tabs{border:0 !important;background-color:white;margin-bottom:25px;border-top-left-radius:10px;border-top-right-radius:10px}#bmi .tabs .tab.active{cursor:not-allowed}#bmi .tabs .tab:first-child{border-top-left-radius:10px}#bmi .tabs .tab:last-child{border-top-right-radius:10px}#bmi .tabs .tab{padding-top:18px;width:calc(50% - 1px);border-left:1px solid rgba(176,69,46,0.12);text-align:center;padding-bottom:18px;color:#8e8e8e}#bmi .tabs .tab.active{position:relative;color:#257671}#bmi .tabs .tab.active:not(.active):hover::before{border-bottom:7px solid white !important}#bmi .tabs .tab.active::before{content:'';height:0px;width:0px;transition:.3s all;background:transparent;border-top:5px solid transparent;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #257671;position:absolute;bottom:0;left:0;right:0;margin:0 auto;transform:translateX(-50%)}#bmi .tabs .tab.active::after{content:'';position:absolute;bottom:0;left:0;right:0;width:100%;height:6px;border-bottom:2px solid #257671}#bmi .tabs .tab:first-child.active::after{border-bottom-left-radius:14px}#bmi .tabs .tab:last-child.active::after{border-bottom-right-radius:14px}#bmi .tabs .tab:first-child{width:50%;border-left:0 !important}#bmi .tabs .tab:not(.active):hover{color:white;background:#257671}#bmi .collapser.active .header:not(.ignorehov){background:#257671;color:white}#bmi .collapser.active .header{border-bottom-left-radius:0px;border-bottom-right-radius:0px}#bmi .collapser.active .header:not(.ignorehov)::after{filter:brightness(0) invert(1) grayscale(1) !important;opacity:0.95 !important}#bmi .collapser.active .header::after{transform:rotate(180deg)}#bmi .collapser{border-radius:10px}#bmi .collapser .header{padding:21px 45px;background:white;border-radius:10px;position:relative}#bmi .collapser .header:not(.ignorehov):hover{background:#257671;color:white}#bmi .collapser .header::after{content:'';position:absolute;background:url("../images/arrow-min.png");background-size:cover;background-repeat:no-repeat;margin-top:4px;right:45px;width:19px;height:11px;transition:.3s all}#bmi .collapser .header:not(.ignorehov):hover::after{filter:brightness(0) invert(1) grayscale(1) !important;opacity:0.95 !important}#bmi .collapser .content{display:none;background:white;min-width:100%;border-bottom-left-radius:10px;border-bottom-right-radius:10px}#bmi #manage-restore-wrapper .restore-wrapper{background-color:white;padding-top:40px;padding-bottom:40px;min-width:100%;margin-top:10px}#bmi #manage-restore-wrapper .m{margin-left:30px;margin-right:30px}#bmi #manage-restore-wrapper .header{background:#beeddf;background:linear-gradient(60deg, #beeddf 10%, #dffaf2 100%);height:18px}#bmi #manage-restore-wrapper .header::before{content:'';position:absolute;background:#beeddf;background:linear-gradient(60deg, #dffaf2 10%, #beeddf 100%);left:0;top:0;border-radius:10px;width:100%;height:100%;opacity:0 !important;transition:.3s all}#bmi #manage-restore-wrapper .bold{position:absolute}#bmi #manage-restore-wrapper .collapser.active .header::before{border-bottom-left-radius:0px;border-bottom-right-radius:0px;opacity:1 !important}#bmi #manage-restore-wrapper .header:hover::before{opacity:1 !important}#bmi #manage-restore-wrapper .content{min-width:calc(100% - 90px);position:relative;padding:10px 45px}#bmi #manage-restore-wrapper .content .bg-quick-migration{top:0;left:0;right:0;bottom:0;position:absolute;width:100%;height:100%;object-fit:cover;object-position:center;pointer-events:none;border-bottom-left-radius:10px;border-bottom-right-radius:10px}#bmi #manage-restore-wrapper .content .content-above{position:relative}#bmi #manage-restore-wrapper .content .quick-migration{border-radius:10px}#bmi #manage-restore-wrapper .content .text-heading{padding:15px 0}#bmi #manage-restore-wrapper .content input{box-sizing:border-box;line-height:30px;border:1px solid #c6c9cf;width:100%;padding:11px;font-size:18px;border-radius:10px}#bmi #manage-restore-wrapper .content button{width:358px}#bmi #manage-restore-wrapper .heading-sq .bold{position:relative;padding-right:35px}#bmi #manage-restore-wrapper .heading-sq .bold::after{content:'';background:url("../images/next-icon-min.png");background-size:cover;height:24px;width:24px;position:absolute;top:0;right:0}#bmi #manage-restore-wrapper .valign-restore .a1{padding-top:6px;padding-right:6px}#bmi #manage-restore-wrapper .valign-restore .a2{padding-top:4px;padding-right:6px}#bmi #manage-restore-wrapper .table-wrapper{max-width:100%;overflow-y:auto}#bmi #manage-restore-wrapper .table-wrapper table{width:100%;min-width:400px;border-collapse:collapse;margin-bottom:10px}#bmi #manage-restore-wrapper .table-wrapper table .restore-btn{color:white;font-size:13px;font-weight:600;background:#0ec094;border-radius:5px;width:95px;height:25px;border:1px solid #0ec094;display:flex;justify-content:space-evenly;align-items:center}#bmi #manage-restore-wrapper .table-wrapper table th{font-size:19px;text-align:left;color:#111}#bmi #manage-restore-wrapper .table-wrapper table th.inactive{color:#c3c3c3}#bmi #manage-restore-wrapper .table-wrapper table tr{border-bottom:2px solid #e1dada}#bmi #manage-restore-wrapper .table-wrapper table tr th,#bmi #manage-restore-wrapper .table-wrapper table tr td{padding-top:15px;padding-bottom:14px}#bmi #manage-restore-wrapper .table-wrapper table tr td{font-size:18px;color:#333}#bmi .log-wrapper pre{max-height:200px;overflow:auto;line-height:1.2;font-size:13px;white-space:nowrap;text-align:left;background:#fbfbfb;border:1px solid #cececc;border-radius:10px;padding:30px}#bmi .log-wrapper pre .red{color:red}#bmi .log-wrapper pre .blue{color:blue}#bmi .log-wrapper pre .green{color:green}#bmi .log-wrapper pre .orange{color:#f59e00}#bmi .progress-bar-wrapper{line-height:1;margin-top:70px;margin-bottom:30px}#bmi .progress-bar-wrapper .progress-bar{position:relative;height:10px;width:100%;border-radius:10px;background:#f1f1f1}#bmi .progress-bar-wrapper .progress-active-bar{position:absolute;background:#257671;border-radius:10px;height:14px;width:40%;top:-2px;left:0;transition:0.1s all cubic-bezier(0, 0, 0.6, 1);box-shadow:0px 0px 10px rgba(0,0,0,0.4)}#bmi .progress-bar-wrapper .progress-active-bar::before{content:'';position:absolute;border-radius:10px;height:14px;width:20%;top:0;right:0;z-index:0}#bmi .progress-bar-wrapper .progress-percentage{position:absolute;background:#257671;width:32px;height:32px;border-radius:50%;transform:translate(calc(-50% - 3px), 0);bottom:26px;text-align:center;color:white;line-height:34px;font-size:11px;font-weight:800;transition:0.1s all cubic-bezier(0, 0, 0.6, 1)}#bmi .progress-bar-wrapper .progress-percentage::after{content:'';left:50%;position:absolute;background:#257671;width:6px;height:6px;border-radius:50%;transform:translate(-50%, 0);bottom:-10px}#bmi .deleteAllSelected{height:45px;width:265px;border-radius:10px;font-size:15px !important;font-weight:bold;padding-top:0 !important;padding-bottom:0 !important}#bmi .lds-spinner{color:#257671;display:inline-block;position:relative;width:20px;height:14px}#bmi .lds-spinner div{transform-origin:10px 10px;animation:lds-spinner 1.2s linear infinite}#bmi .lds-spinner div:after{content:" ";display:block;position:absolute;top:2px;left:9px;width:2px;height:4px;border-radius:20%;background:#257671}#bmi .lds-spinner div:nth-child(1){transform:rotate(0deg);animation-delay:-1.1s}#bmi .lds-spinner div:nth-child(2){transform:rotate(30deg);animation-delay:-1s}#bmi .lds-spinner div:nth-child(3){transform:rotate(60deg);animation-delay:-0.9s}#bmi .lds-spinner div:nth-child(4){transform:rotate(90deg);animation-delay:-0.8s}#bmi .lds-spinner div:nth-child(5){transform:rotate(120deg);animation-delay:-0.7s}#bmi .lds-spinner div:nth-child(6){transform:rotate(150deg);animation-delay:-0.6s}#bmi .lds-spinner div:nth-child(7){transform:rotate(180deg);animation-delay:-0.5s}#bmi .lds-spinner div:nth-child(8){transform:rotate(210deg);animation-delay:-0.4s}#bmi .lds-spinner div:nth-child(9){transform:rotate(240deg);animation-delay:-0.3s}#bmi .lds-spinner div:nth-child(10){transform:rotate(270deg);animation-delay:-0.2s}#bmi .lds-spinner div:nth-child(11){transform:rotate(300deg);animation-delay:-0.1s}#bmi .lds-spinner div:nth-child(12){transform:rotate(330deg);animation-delay:0s}@keyframes lds-spinner{0%{opacity:1}100%{opacity:0}}#bmi .prenotices{margin-top:45px;margin-bottom:45px}#bmi .prenotices .prenotice:first-child{border-top:1px solid #eeebeb}#bmi .prenotices .prenotice{position:relative;background:#fcfcfc;border-bottom:1px solid #eeebeb}#bmi .prenotices .prenotice .text{padding-top:25px;padding-bottom:25px;padding-left:155px;padding-right:60px;font-size:18px;line-height:1.2}#bmi .prenotices .prenotice.top{border-top-right-radius:10px;border-top-left-radius:10px}#bmi .prenotices .prenotice.top .text{padding-right:120px;padding-left:215px;font-size:20px;line-height:25px}#bmi .prenotices .prenotice::before{content:'';position:absolute;background:url("../images/warning-grey.png");width:46px;height:41px;top:50%;transform:translate(0, -50%);left:60px}#bmi .prenotices .prenotice.top::before{left:120px}#bmi .prenotices .prenotice.red{background:#feedee !important}#bmi .prenotices .prenotice.red::before{background:url("../images/warning-red.png")}#bmi .btn{display:block;background:#257671;box-shadow:0 10px 9px rgba(0,0,0,0.24);color:white;padding-top:18px;padding-bottom:18px;border-radius:10px;font-size:18px;line-height:1.2;transition:0.3s all;cursor:pointer;text-decoration:none}#bmi .btn .text{display:inline-block}#bmi .btn.btn-pad{padding-left:50px;padding-right:50px}#bmi .btn.btn-img-low-pad .text{padding-left:40px !important}#bmi .btn:hover{background:#206662;box-shadow:0 10px 15px rgba(0,0,0,0.34)}#bmi .btn:active{transition:0 all;background:#1b5753;box-shadow:0 10px 5px rgba(0,0,0,0.14)}#bmi .btn.red{background:#da2b2b}#bmi .btn.red:hover{background:#cd2424}#bmi .btn.red:active{background:#bb2121}#bmi .btn.lime{background:#4dbb84}#bmi .btn.lime:hover{background:#43b07a}#bmi .btn.lime:active{background:#3ea270}#bmi .btn.gray,#bmi .btn.grey{background:#b6b6b6}#bmi .btn.gray:hover,#bmi .btn.grey:hover{background:#acacac}#bmi .btn.gray:active,#bmi .btn.grey:active{background:#a2a2a2}#bmi .btn.btn-with-img .text{padding-left:60px;position:relative}#bmi .btn.btn-with-img img{position:absolute;top:50%;left:0;transform:translate(0, -50%)}#bmi input[type="checkbox"]{border-radius:4px;width:22px !important;height:22px !important;position:relative;transition:0.3s all}#bmi input[type="checkbox"],#bmi input[type="checkbox"]:active,#bmi input[type="checkbox"]:focus{outline:0 !important;box-shadow:none !important;border-color:#257671 !important}#bmi input[type="checkbox"]::before{content:'' !important;border-color:#257671 !important;border-radius:3px;transition:0.3s all;margin:0 !important;height:20px !important;width:20px !important;float:left;display:inline-block;vertical-align:middle;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#bmi input[type="checkbox"]:checked{background:#257671 !important}#bmi input[type="checkbox"]:checked::after{content:'';width:10px;height:5px;border-left:3px solid white;border-bottom:3px solid white;top:4px;left:4px;transform:rotate(-48deg);position:absolute}#bmi .success-copy-input input{width:calc(100% - 170px - 15px);margin-right:15px;line-height:44px;border-radius:10px;border:1px solid #d1d4d9;background:#fff}#bmi .success-copy-input a{line-height:10px;padding-left:40px !important;padding-right:40px !important;box-shadow:none !important;text-decoration:none}#bmi .grey-btn{background:#aaa;width:85%;line-height:13px}#bmi .save-btn{text-align:center;font-weight:700;width:450px;margin:0 auto;font-size:27px}#bmi .max300{max-width:300px;margin:0 auto}#bmi .max280{max-width:280px;margin:0 auto}#bmi label:hover input[type="checkbox"]{background:#dfdfdf}#bmi .btn.othersec{margin-top:6px;padding-top:13px;padding-bottom:13px}#bmi .file-checkboxes-wrapper{padding-left:32px}#bmi .file-checkboxes-wrapper .file-checkboxes label{display:block;width:50%;margin-bottom:10px}#bmi .file-checkboxes-wrapper div{margin-top:5px;margin-bottom:5px}#bmi .note{width:500px;margin:50px auto;font-size:1.1em;color:#333;text-align:justify}#bmi #drop-area{border:2px dashed #ccc;border-radius:20px;width:100%;height:340px;margin-top:10px;background:#f9f9f9}#bmi #drop-area:hover{background:linear-gradient(90deg, #d1efe6, #e5f6f1)}#bmi #drop-area.highlight{border-color:#257671}#bmi .my-form{margin-bottom:10px;margin-top:35px}#bmi #gallery{margin-top:10px}#bmi .img_upload{width:100px;height:75px;background-image:url("../images/upload.svg")}#bmi #gallery img{width:150px;margin-bottom:10px;margin-right:10px;vertical-align:middle}#bmi .button{display:inline-block;padding:10px;background:#ccc;cursor:pointer;border-radius:5px;border:1px solid #ccc}#bmi .button:hover{background:#ddd}#bmi #upid_input{position:absolute;left:2508px;top:3273px;opacity:0;z-index:9999;width:1px;height:1px;display:none}#bmi .ortext{font-size:18px;line-height:54px}#bmi .upload_button{font-size:18px;font-weight:800;padding:0;height:50px;line-height:50px;padding:0 20px}#bmi .upload-progress{border:2px dashed #ccc;padding-bottom:45px;border-radius:20px;margin-top:10px;margin-bottom:10px;overflow:hidden;position:relative}#bmi .upload-progress .upload-progress-bar{width:90%;margin:0 auto;background:#f1f1f1;height:10px;margin-top:65px;position:relative;border-radius:10px;margin-bottom:10px}#bmi .upload-progress .upload-progress-bar span{display:block;position:absolute;top:-2px;left:0;width:50%;background:#257671;height:14px;z-index:10;border-radius:10px;transition:0.1s all cubic-bezier(0, 0, 0.6, 1)}#bmi .upload-progress .upload-progress-bar .upload-percentage{position:absolute;bottom:calc(100% + 14px);right:-13px;color:white;background:#257671;border-radius:50%;width:30px;height:30px;font-size:12px;text-align:center;line-height:30px}#bmi .upload-progress .upload-progress-bar .upload-percentage::after{position:absolute;content:'';top:calc(100% + 4px);left:0;right:0;margin:0 auto;width:6px;height:6px;background:#257671;border-radius:50%}#bmi .upload-title{font-size:23px;font-weight:800}#bmi .bmi-txtar{padding:15px;border-radius:10px;font-size:18px;resize:none}#bmi .inline-radio{padding-right:20px}#bmi .exclude-row input{border-radius:5px;width:130px;height:44px;border:1px solid #d1d4d9;font-size:18px;margin:0 10px;text-align:center}#bmi .mbfieldlimit{font-size:20px;text-align:center;justify-content:center;margin:8px 5px;box-sizing:border-box;border:1px solid #d1d4d9;border-radius:5px;width:85px;height:45px;justify-content:center;align-items:center}#bmi .overlay-premium{display:none}#bmi .clocks_container{display:none}#bmi .overlayed:hover{position:relative}#bmi .overlayed:hover .overlay-premium{display:flex;position:absolute;top:0;left:0;width:100%;height:100%;background-image:url("../images/big_bg_clock_white-min.png");background-repeat:no-repeat;background-size:cover;align-items:center;justify-content:center;z-index:100000;border-top:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd}#bmi .overlayed:hover .clocks_container{display:flex;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.05);align-items:center;flex-direction:column;justify-content:center;height:100%;position:relative;font-size:18px}#bmi .tab2-item{position:relative;display:flex;justify-content:space-between;align-items:center;width:100%;background:#f6f6f6;border-radius:10px;height:70px;padding:0 30px;margin-top:15px;box-sizing:border-box}#bmi .tab2-item .container-40{margin:0 40px}#bmi .tab2-item .pb30{padding-bottom:30px}#bmi .tab2-item .bg_grey{background:#f8f8f8}#bmi .tab2-item .not-ready{position:absolute;left:0;width:100%;height:100%;background-color:#e5e5e5;opacity:0.7;border-radius:10px}#bmi .tab2-item .bg_clock_day2{display:none;background-image:url("../images/big_bg_clock_green-min.png");width:100%;height:100%;position:absolute;left:0;background-size:cover;background-repeat:no-repeat;z-index:3;color:white;border-radius:10px}#bmi .tab2-item .clock_img{flex-basis:5%}#bmi .tab2-item .d-flex{display:flex;flex:1}#bmi .tab2-item .ia-center{align-items:center}#bmi .tab2-item .switch{position:relative;width:70px;height:30px;overflow:hidden;border:none;padding:0;background:none}#bmi .tab2-item .switch.b2{border-radius:15px;border:none;background:none;padding:0}#bmi .tab2-item .switch.b2 .checkbox{position:relative;width:100%;height:100%;padding:0;margin:0;opacity:0;cursor:pointer;z-index:3;border:none}#bmi .tab2-item .knobs{z-index:2;position:absolute;top:0;right:0;bottom:0;left:0}#bmi .tab2-item .switch .knobs:before{content:'Off';left:7px}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after{color:white;z-index:1}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after,#bmi .tab2-item .switch .knobs span{position:absolute;top:6px;width:17px;height:17px;font-size:18px;font-weight:bold;text-align:center;line-height:1;padding:0 3px;border-radius:2px;transition:0.4s ease all}#bmi .tab2-item .switch .knobs:after{content:'On';right:17px}#bmi .tab2-item .switch .knobs:after{padding:0 12px}#bmi .tab2-item .switch .checkbox:checked+.knobs:before,#bmi .tab2-item .switch .checkbox:not(:checked)+.knobs:after{opacity:0}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after{color:white;z-index:1}#bmi .tab2-item .switch .knobs:after{padding:0 12px}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after,#bmi .tab2-item .switch .knobs span{position:absolute;top:6px;width:17px;height:17px;font-size:18px;font-weight:bold;text-align:center;line-height:1;padding:0 3px;border-radius:2px;transition:0.4s ease all}#bmi .tab2-item .layer,#bmi .tab2-item .layer_str{width:100%;background-color:#d5d5d5;transition:0.3s ease all;z-index:1}#bmi .tab2-item .button-cover,#bmi .tab2-item .knobs,#bmi .tab2-item .layer,#bmi .tab2-item .layer_str{position:absolute;top:0;right:0;bottom:0;left:0}#bmi .tab2-item .switch.b2 .checkbox{position:relative;width:100%;height:100%;padding:0;margin:0;opacity:0;cursor:pointer;z-index:3;border:none}#bmi .tab2-item .title_whereStored{font-size:20px;font-weight:bold}#bmi .tab2-item .ml25{margin-left:25px}#bmi .tab2-item .switch .knobs span{left:48px;background-color:white;z-index:2}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after,#bmi .tab2-item .switch .knobs span{position:absolute;top:6px;width:17px;height:17px;font-size:18px;font-weight:bold;text-align:center;line-height:1;padding:0 3px;border-radius:2px;transition:0.4s ease all}#bmi .tab2-item .switch .knobs span{padding:0;border-radius:50%;top:6px}#bmi .tab2-item .not_ready{position:absolute;left:0;width:100%;height:100%;background-color:#e5e5e5;opacity:0.7;border-radius:10px}#bmi .tab2-item .link-white:hover{text-decoration:underline;color:white}#bmi .tab2-item .link-white{color:white;text-decoration:none}#bmi .tab2-item .crown2{width:20px;height:20px;margin-left:7px;z-index:1}#bmi .tab2-item .d-flex .w100 .input-locally_web_server{width:100%;height:55px;border-radius:10px;margin:8px 0 !important;text-align:left !important;padding:0 20px;color:black}#bmi .tab2-item .w270{min-width:270px}#bmi .tab2-item:hover .bg_clock_day2{display:flex;justify-content:center;align-items:center}#bmi .tab2-item.activeList{color:white;background:#257671 !important;border-bottom-left-radius:0;border-bottom-right-radius:0}#bmi .tab2-item.activeList .switch .checkbox:checked ~ .layer_str{background-color:#154e4b}#bmi .tab2-item.activeList .bg_grey{background:#f8f8f8}#bmi .tab2-item.activeList .switch .checkbox:checked+.knobs:before,#bmi .tab2-item.activeList .switch .checkbox:not(:checked)+.knobs:after{opacity:0}#bmi .tab2-item.activeList .switch .checkbox:checked+.knobs span{left:7px;background-color:white}#bmi .container-radio input{position:absolute;opacity:0;cursor:pointer}#bmi .checkmark-radio{position:absolute;top:0;left:0;height:25px;width:25px;background-color:#fff;border:1px solid;border-radius:50%}#bmi .container-radio:hover input ~ .checkmark-radio{background-color:#cecece}#bmi .container-radio input:checked ~ .checkmark-radio{background-color:white;border:1px solid #257671}#bmi .checkmark-radio:after{content:"";position:absolute;display:none}#bmi .container-radio input:checked ~ .checkmark-radio:after{display:block}#bmi .container-radio .checkmark-radio:after{top:5px;left:5px;width:10px;height:10px;border-radius:50%;background:#257671}#bmi .container-checkbox .checkmark-checkbox:after{left:9px;top:5px;width:5px;height:10px;border:solid white;border-width:0 3px 3px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}#bmi .input-mar{margin:30px 0}#bmi .container-40{margin:0 40px}#bmi .container-36{margin:0 36px 0 40px}#bmi .container-55{margin:0 55px}#bmi .d-flex{display:flex}#bmi .w270{min-width:270px}#bmi .w100{width:100%}#bmi .pos-r{position:relative}#bmi .mt20{margin-top:20px}#bmi .pb30{padding-bottom:30px}#bmi .pt30{padding-top:30px}#bmi .bg_grey{background:#f8f8f8}#bmi .input-file{width:100%;height:55px}#bmi .input-file-user{position:relative;height:55px;width:525px;font-size:14px}#bmi .input-file-user::placeholder{font-size:14px}#bmi .input-label-file{color:#aaaeb3;width:525px;height:55px;border:1px solid #d1d4d9;border-radius:10px;display:flex;align-items:center;padding:0 30px}#bmi #copy-password{height:45px;width:410px;border-radius:10px;border:1px solid #d1d4d9;text-align:left}#bmi #copy-url{height:45px;width:480px;border-radius:10px;border:1px solid #d1d4d9}#bmi #copy-key{height:45px;width:230px;border-radius:10px;border:1px solid #d1d4d9}#bmi .input-other{height:45px;width:255px;border-radius:10px;border:1px solid #d1d4d9}#bmi #creatingBackUp{height:55px;border:1px solid #c6c9cf;border-radius:10px;padding:0 30px}#bmi .creatingBackUp input[type=text]{display:flex;font-size:20px;text-align:left;justify-content:center;margin:8px 5px;box-sizing:border-box;border:1px solid #d1d4d9}#bmi #backupsfile{border:1px dashed #a9a9a9;border-radius:10px;display:flex;justify-content:center}#bmi .drop{height:300px;display:flex;align-items:center;justify-content:center}#bmi .drop .dz-default{display:none}#bmi #textAreaCopy{height:230px;padding:25px;box-sizing:border-box;font-size:14px;color:#aaaaaa}#bmi .inprogressCreate{height:130px;padding:30px 40px;border:1px solid #aaaaaa;border-radius:10px;color:black;font-size:13px;overflow-y:auto}#bmi #text-areaSomeHick{height:240px;padding:25px;box-sizing:border-box;font-size:14px;color:#aaaaaa}#bmi #backupIsNowAccessible{height:51px;width:99%;border-radius:10px;border:1px solid #d1d4d9;text-align:left;padding-left:10px}#bmi .backupSuccess_link_container{display:flex;align-items:center;position:relative;margin:15px 70px 0}#bmi .input-config_set{width:280px;height:45px;border-radius:10px;padding-left:10px;text-align:left !important}#bmi .link_duplicate{color:#6bd5a0;margin:0 13px;text-decoration:none}#bmi .link_export{color:#0e80c9;margin:0 13px;text-decoration:none}#bmi .link_delete{color:#c20000;margin:0 13px;text-decoration:none}#bmi .d-flex .w100 .input-locally_web_server{width:100%;height:55px;border-radius:10px;margin:8px 0 !important;text-align:left !important;padding:0 20px;color:black}#bmi div .dropzone{position:relative;cursor:pointer;margin:20px 0;height:340px;border:2px dashed rgba(0,0,0,0.3);padding:20px;border-radius:20px;color:gray;background-color:#f9f9f9}#bmi .dropzone:hover{background:linear-gradient(90deg, #d1efe6, #e5f6f1)}#bmi .input-file-dropzone{opacity:0;width:100%;height:340px;position:absolute;top:0;left:0;cursor:pointer}#bmi .mt25{margin-top:25px}#bmi .mt16{margin-top:16px}#bmi .container-input{display:block;position:relative;padding-left:5px;cursor:pointer;font-size:22px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#bmi .custom-input{width:65px;height:45px;justify-content:center;align-items:center;border-radius:5px;border:1px solid #d1d4d9}#bmi .bg_grey .d-flex input[type=text]{margin:8px 10px}#bmi .d-flex input[type=text],#bmi .d-flex input[type=number],#bmi .d-flex input[type=email]{font-size:20px;text-align:center;justify-content:center;margin:8px 5px;box-sizing:border-box;border:1px solid #d1d4d9;border-radius:5px}#bmi .d-flex input[type=email]{font-size:17px}#bmi .d-flex input[type=text]:focus,#bmi .d-flex input[type=number]:focus,#bmi .d-flex input[type=email]:focus{box-shadow:none}#bmi .container-radio{display:block;position:relative;padding-left:35px;cursor:pointer;font-size:22px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:25px;line-height:25px;margin-top:5px}#bmi .mtf2{margin-top:2px}#bmi .mtf3{margin-top:3px}#bmi .checkmark-radio{position:absolute;top:0;left:0;height:20px;width:20px;background-color:#fff;border:1px solid;border-radius:50%}#bmi .tab2-img{width:35px;height:40px}#bmi .container-radio{opacity:0.5 !important;transition:.3s all}#bmi .container-radio.active{opacity:1 !important}#bmi .bmi-text-input{height:55px;border-radius:10px;margin:8px 0 !important;text-align:left !important;padding:0 20px;color:black;min-width:500px;border:1px solid #d1d4d9;box-shadow:0 !important;box-shadow:none !important;font-size:20px;text-align:center !important}#bmi .bmi-text-input.small{height:45px;line-height:45px;min-width:255px}#bmi #format-tip-wrp{margin-bottom:60px}#bmi .bmi-dropdown{display:inline-block;position:relative;border-radius:5px;border:1px solid #d1d4d9;background:#fff;font-size:18px;line-height:22px}#bmi .bmi-dropdown .dropdown-title{position:relative;padding:10px 8px;padding-right:30px;text-align:center;cursor:pointer}#bmi .bmi-dropdown .dropdown-title::before{content:'';position:absolute;border:solid #257671;border-width:0 3px 3px 0;padding:3px;transform:rotate(45deg);-webkit-transform:rotate(45deg);right:10px;top:calc(50% - 6px);transition:.3s all}#bmi .bmi-dropdown .dropdown-title::after{content:'';position:absolute;border-left:1px solid #37b0a9;opacity:.3;height:26px;top:8px;right:29px;transition:.3s all}#bmi .dropdown-options{font-size:18px;line-height:22px;display:none;position:absolute;background:white;text-align:center;z-index:1000;min-width:100%;border:1px solid #257671;top:calc(100% + 8px);right:0;left:-1px;border-radius:5px;box-shadow:0px 0px 20px -5px rgba(0,0,0,0.4);overflow:auto;max-height:300px}#bmi .dropdown-options .active-option{position:relative;opacity:.6}#bmi .dropdown-options .active-option::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;cursor:not-allowed}#bmi .dropdown-options .dropdown-option{padding:10px 8px;white-space:nowrap;text-overflow:ellipsis;transition:.3s all;cursor:pointer}#bmi .dropdown-options .dropdown-option:not(.active-option):hover{background:#257671;color:white}#bmi .dropdown-options::before{content:'';position:absolute;left:0;right:0;margin:0 auto;top:-5px;width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:5px solid #257671}#bmi .bmi-dropdown.active{border-color:#257671}#bmi .bmi-dropdown.active .dropdown-title::before{transform:rotate(-135deg);-webkit-transform:rotate(-135deg);top:calc(50% - 3px)}#bmi .bmi-switch{position:relative;display:inline-block;width:70px;height:30px}#bmi .bmi-switch input{display:none}#bmi .bmi-switch-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#257671;-webkit-transition:0.4s;transition:0.4s}#bmi .bmi-switch-slider:before{position:absolute;content:"";height:17px;width:17px;left:6px;bottom:7px;background-color:white;-webkit-transition:0.4s;transition:0.4s}#bmi input:checked+.bmi-switch-slider{background-color:#d5d5d5}#bmi input:checked+.bmi-switch-slider:before{-webkit-transform:translateX(40px);-ms-transform:translateX(40px);transform:translateX(40px)}#bmi .off{opacity:0}#bmi .off,#bmi .on{font-size:18px;font-weight:bold;color:white;position:absolute;transform:translate(0, -50%);top:50%;transition:.3s all}#bmi .off{left:10px}#bmi .on{right:10px}#bmi input:checked+.bmi-switch-slider .off{opacity:1}#bmi input:checked+.bmi-switch-slider .on{opacity:0}#bmi .bmi-switch-slider.round{border-radius:15px}#bmi .bmi-switch-slider.round:before{border-radius:50%}#bmi .label_e50._bottom_ea7{border-top-left-radius:8px !important;border-top-right-radius:34px !important;min-width:300px}#bmi .label_e50{position:fixed;z-index:2147483648;-webkit-backface-visibility:hidden;backface-visibility:hidden;height:40px;box-shadow:0 12px 14px 8px rgba(0,0,0,0.17);filter:blur(0)}#bmi jdiv{-webkit-animation:0s none;animation:0s none;-webkit-backface-visibility:visible;backface-visibility:visible;background:none;border:0;box-shadow:none;box-sizing:content-box;bottom:auto;caption-side:top;clear:none;clip:auto;cursor:auto;display:inline;direction:ltr;flex:none;height:auto;-webkit-hyphens:manual;-ms-hyphens:manual;hyphens:manual;image-rendering:auto;justify-content:flex-start;left:auto;letter-spacing:normal;line-height:normal;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;-o-object-fit:fill;object-fit:fill;opacity:1;order:1;orphans:2;outline:0 none;overflow:visible;padding:0;perspective:none;position:static;resize:none;right:auto;text-align:left;text-decoration:none;text-indent:0;text-overflow:clip;text-shadow:none;text-transform:none;top:auto;transform:none;transition:all 0s ease 0s;unicode-bidi:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:baseline;white-space:normal;width:auto;word-break:normal;word-spacing:normal;word-wrap:normal;z-index:auto;zoom:normal;filter:none !important;font-weight:400;-webkit-text-size-adjust:inherit;-webkit-font-smoothing:antialiased;-webkit-text-fill-color:currentColor}#bmi .hoverl_bc6{cursor:pointer}#bmi .label_e50._bottom_ea7 .text_468._noAd_b4d,#bmi .label_e50._left_bba .text_468._noAd_b4d,#bmi .label_e50._right_56b .text_468._noAd_b4d{margin:0 33px 0 16px}#bmi .label_e50._bottom_ea7 .text_468,#bmi .label_e50._left_bba .text_468,#bmi .label_e50._right_56b .text_468{transform:translateZ(0);margin:0 37px 0 16px;min-width:160px;visibility:visible}#bmi .label_e50 .text_468{font:inherit;text-indent:0;line-height:40px;vertical-align:top;white-space:nowrap;-webkit-font-smoothing:antialiased;visibility:visible;-webkit-backface-visibility:hidden;backface-visibility:hidden}#bmi .contentTransitionWrap_c73{-webkit-animation-name:fadeIn_d9b;animation-name:fadeIn_d9b;-webkit-animation-duration:0.15s;animation-duration:0.15s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;-webkit-animation-timing-function:ease;animation-timing-function:ease}#bmi .leaf_2cc{position:absolute;width:32px;height:33px;z-index:6;overflow:hidden}#bmi .leaf_2cc._bottom_afb,#bmi .leaf_2cc._left_7af,#bmi .leaf_2cc._right_ff0{right:0;top:0;width:33px;border-radius:0 24px 0 0 !important}#bmi .cssLeaf_464{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2240%22%20viewBox%3D%220%200%2032%2040%22%3E%0A%20%20%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20fill%3D%22%23424867%22%20d%3D%22M0%200h9.02L32%2033.196V40H0z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20fill%3D%22%2318C139%22%20d%3D%22M9%200c3.581.05%2023%205.426%2023%2033.08v.03C18.922%2030.751%209%2019.311%209%205.554V0z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A");position:absolute;height:33px;width:33px;left:1px}#bmi #bmi_support_chat *{cursor:pointer !important}#bmi #bmi_support_chat{cursor:pointer !important;opacity:1;transition:0.3s all}#bmi #bmi_support_chat:hover{opacity:0.9}#bmi *{outline:0}#bmi-preload{width:calc(50%);margin:0 auto;padding-right:20px;margin-top:50px}#bmi-preload .progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;background-clip:padding-box;margin:0.5rem 0 1rem 0;overflow:hidden}#bmi-preload .progress .determinate{position:absolute;background-color:inherit;top:0;bottom:0;background-color:#26a69a;transition:width .3s linear}#bmi-preload .progress .indeterminate{background-color:#26a69a}#bmi-preload .progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}#bmi-preload .progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);-moz-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-ms-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-o-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{color:#333;box-sizing:border-box;max-height:100%;max-width:100%;overflow:hidden;line-height:21px !important}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0, 0);-moz-transform:scale(0, 0);-o-transform:scale(0, 0);-ms-transform:scale(0, 0);transform:scale(0, 0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1, 1);-moz-transform:scale(1, 1);-o-transform:scale(1, 1);-ms-transform:scale(1, 1);transform:scale(1, 1);-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 1);-webkit-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);-moz-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);-ms-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);-o-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-fall.tooltipster-initial{top:0 !important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0 !important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-moz-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-ms-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-o-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-slide.tooltipster-initial{left:-40px !important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0 !important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading 0.4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating 0.6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling 0.6s}.tooltipster-sidetip .tooltipster-box{background:#fff;border-radius:10px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{border-radius:10px !important;font-size:15px;line-height:18px;padding:16px 20px !important;font-family:'Montserrat', sans-serif !important}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#fff;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#fff;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#fff;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#fff;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#fff}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#fff}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#fff}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#fff}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px}.bmi-tt-default-customized .tooltipster-box{background:#2b8984 !important}.bmi-tt-default-customized .tooltipster-content{background:#2b8984 !important;color:white;padding:16px 20px !important;font-weight:500}.bmi-tt-default-customized.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-left .tooltipster-arrow-background{border-left-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-right .tooltipster-arrow-background{border-right-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-top .tooltipster-arrow-background{border-top-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-top .tooltipster-arrow-border{border-top-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-right .tooltipster-arrow-border{border-right-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-left .tooltipster-arrow-border{border-left-color:#2b8984 !important}.bmi-tooltip-premium-css{text-align:center;width:350px}.bmi-premium-element *{cursor:not-allowed !important;border-color:rgba(198,201,206,0.5) !important}.bmi-tt-default a{color:white !important}.bmi-tt-banner{width:350px}.bmi-tt-center{text-align:center}.bmi-info-icon{position:absolute;top:calc(50% - 8px);width:16px;height:16px;background:url("../images/info-min.png");display:inline-block;line-height:16px;background-repeat:no-repeat;background-position:center;background-size:cover;margin:0;margin-left:3px;cursor:help}.toplevel_page_backup-migration .wp-menu-image img{padding:0 !important;height:20px;margin-top:7px}.toplevel_page_backup-migration.current .wp-menu-image img{filter:brightness(0) invert(1) grayscale(1) !important;opacity:0.85 !important}
admin/images/002-monitor-white.svg ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Shape_12_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 34 36"
5
+ enable-background="new 0 0 34 36" xml:space="preserve">
6
+ <image overflow="visible" width="34" height="36" id="Shape_12_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAkCAYAAADsHujfAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
7
+ GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAURJREFUeNpi/P//fzsDA0MFw8CC
8
+ XyxAQg7K6QDicwPgiCYg1mAAhsjS/xDgPRBBAbT3MMhyJiCbg2EQAJBDmAeLQ74OBoewILFVgFFl
9
+ PABu4IE55C1UYMIABsh/kEM6gVgIiMUHyBF/gXgjIzA6QInVD4hFB9AhR0EhUgnEzQOcVr+AHKIJ
10
+ 5SwA4hsD4IiEwVKyboGVrIMCjDoEX8nKA4wqwQFwAyvMIZ+gAisGOkT6gVgJiCVBLaUBcsdeRmgW
11
+ MgNSfAMYIOdYgI7IAjKmDnBafQmKGmsoZxMQvxgAR3iA281IJavNaMk6WrIO9iL+O5S9DZhm/gxU
12
+ 4xnUVDSFNookBygw/oECgZEK2U8CSHEB8TNGRsYfA9cPgJYDlJZDo7lm0DqEEUuct0N7fqRVWqRX
13
+ msuAifsgvsT38D99QCayvQABBgAmT/EYtRbn0QAAAABJRU5ErkJggg==">
14
+ </image>
15
+ </svg>
admin/images/Amazon.svg ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_3_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 39 31"
5
+ enable-background="new 0 0 39 31" xml:space="preserve">
6
+ <image overflow="visible" width="39" height="31" id="Layer_3_xA0_Зображення" xlink:href="data:image/png;base64,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
45
+ T4ABADAJQYT/mLhTAAAAAElFTkSuQmCC">
46
+ </image>
47
+ </svg>
admin/images/alert_error-min.png ADDED
Binary file
admin/images/alert_info-min.png ADDED
Binary file
admin/images/alert_success-min.png ADDED
Binary file
admin/images/alert_warning-min.png ADDED
Binary file
admin/images/arrow-min.png ADDED
Binary file
admin/images/backblaze.svg ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_7_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 25 41"
5
+ enable-background="new 0 0 25 41" xml:space="preserve">
6
+ <image overflow="visible" width="25" height="41" id="Layer_7_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
7
+ GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB79JREFUeNq0VwlQVOcd/79j37WA
8
+ LCDLIjfsStBim2CIiBIkAZMajaPGWLVNtOlYkqbpRGPHKTOdSTvtNKYTk+pkzGFzVIh1WknUNF41
9
+ URCJR1ABd5EbVmCXa9nr3f3e41DLlWT0m3n73ve97/1/3//6/f8LMMXgb7TE9X3wzwVwL4fY7WIa
10
+ C56u6N314dZ7CtTxq5KScwAq3+JMvGcg/ktXbVUIpM6W0/J9ZeDTgpy/NBjCpSsDjsrErt/99c/3
11
+ BASjaRxwDKOBA+cfXt0evNESf9dBqKR4s+QfxEhsJojQD71v7Xvp7pvrwpUFonITcNoAJBjB8/mp
12
+ lXcdxPvpfzcBEKDiGPoNA6GlM3nodKXl//f1l5VHfC8Qz5HThX1nD2ZRZByKLxUwtF0VRfQM7Oge
13
+ ye2JbHvulT1cThY9mRxysheqpLDXEufux8AAOEUhuQrI4AM6Nq0PFKV9dJ9jYWEVk2LtpBNm3fxO
14
+ mohOt6Fh8bIqf2ddJM0mIyUUwFQcJBiA0MK8stCCXFHb53zh93v77FVppo2r/vSdnKQEJabWmnWx
15
+ GilzlZmtXmGt6EpTa/A49TJEqL6zX9t0X311PldL0m/IWNX1xrvx39rxiiiR9gfyLvoaLtzPMFbk
16
+ bEUzHEoWDASlE0IXFVQbc+c7tL2dW0re1e6GCEuAzcoc/NYgHc9sK+2vrchgGdvwG+TsYe/KyOkk
17
+ mDatfkuPpNJDD3vrzsymwAQgyyhV0SmmGGOO9xz7Mt9emLfaSMYjDdRbAJqGQgBoY4qIEvMzbT54
18
+ 8OjPFAgAhUeDNOCmg/bGWG15Wk2QE98HLUgp7g4AHQRFFZUU1xman6MLEm92J2DAAEaRIMgdoHj8
19
+ +dOay3P8q1yv41wSRSQg+fLEIc1LzOgzET7DrSKSAYJAAozg2rP3lelByo8tVyCo58NEg8DCINBU
20
+ H+P7+pv7tLlxcfYJTWtMUoBi4sDnqEpsWrbx0JQgvKMpE0fuUUGdmIkZFkSlB/reKd2uzU3rV5Yx
21
+ xlRZ4gf1CKTpVHAf/miF/aGl5fz1FnpCELHdGY1DyBQKq+gI4TB44Og6od1poOJjh0KWLDwpgXtE
22
+ VRwYOgU8Vf9Z3lD4xLVgbaNlHAjOsYKK8nmqQRDhIAy0Ud5TlTnanHvoh+UacSKKGQ4U5B+atYG/
23
+ 7WqaI7/oMt/Qbr0DhLREt2oRBNjkfIkZCMRdXhC7en6kzen7rJUGmIkCQhhRVtXjkOXSIdhzw3w9
24
+ K/ey6Owyj4EgPjqkZ7YoT1EiNao0Q88f34zUpuz9P2gzREULihq807CqBCybDoHBVmPLquLPxkBm
25
+ vripNCR1kTMgNiJZkxEzhjQZBG7BA7pdFc8Qj5GkDBMEi2Z6zpAM/ef+Nb//4JGlY/ZJPf1JAc3F
26
+ CEH/dUQVw3x1uxaqIICW5VHFP63QllAAWERXD4thzMRnMhj02+CBwxtw1BjE6bU8Pva67ctT84wZ
27
+ D14UhE4Q/R0gBVygBLwg+d3gl1vBtGh15YwVRSe0/XJ37xJebke5NUmtQuWBRJU0WGfPxOrT89qN
28
+ C7P2J7z3+vbR9+0v/HYF72h5XOpyzZVcrhjMQA4xmbbjkZuf3RG+skivJfa5jzqGrp2xUlz8OBoa
29
+ o6NAAAwxZidWg8cP8Er7jOinnvswbPnSlyM2rHJPV3N6dr79cvPWLTs52jpMppNlV4AHMjqyD7Nn
30
+ PlrlvVKRrXERFZLgCV/zxMd0etpRIjKiOurnP3FN9HF96sIWX2N1IsUl62aZtAAGfEgTSwdpSJjV
31
+ rF4RsmkuBWSvJ6xn3+5ilP3FVOQsoT55QSthMbmYZJvT/OpvNtIpiUGUJ7hjXlEEAaFTAmglRmME
32
+ Y8qDrXjI4uyzWsipsgI4GwIUmwQkZQKpt5cKNjdYPZUncjr/8cbqoeNnivSgiYlWCFNYlwweJGiK
33
+ ZkfWQl6EsGWPfIqHrSgsowxJoPCekWxQdS7CWSMQbDhQXKJGHsDXNxWNfj9z2y9fk7SDae3RuKKI
34
+ 2BkjIMA7gIvI8Ea9uOlNnJmd2hu2dMkXPPToL8e5UR0mx/6yA2tHlyI3P/2OedmzJ31iMyh+vy5Y
35
+ /1BRQQ54wO+3AzXDMpD6RVkBEWIM6vpG73i+RHuQee8EJ0PcxkSDv+taRNvmrZ+MriUf3vdIzNrN
36
+ 7yvgByHQBkKwA0T+JhAhXMC8YcvfEnbttnHzM6uHdRsZbet+fcBZumuNkZkNKiaP4y1VEkEQWiF6
37
+ Q/FfEj/ePZZT7j1/z+Qbm/NQTrC0NcVBmkwnI55ZOzSpr+rSslvPa/0Wi/otbrjfGr2ucja1hkxQ
38
+ L4BBrc/Ireh5/e3HJ/139vyOJ4WOrvhbXrq9c+zojrfnLjnrb6lNoIlE1MnTevd4SyNca4GQWboQ
39
+ s3LAzplzicmwXTBYYpq15kBy9cUNnju+jolM6U068sHDlMXcPQ5EG8G6Jq7jpW17+4+Vr9e8SYEF
40
+ lV9mxFfqiPVwFI08wvOgleAIQyPfoKewyLS2Oa01Gcjhvgk1uX24d+97cqD88194T1c8Jgv9I5tJ
41
+ vTvBCFqviLLqQyB+vRk3GM28af1TryXs3VkyvkhMM3rf258WqKnND9Y6cuR+T7rk7rOoPn8YEKRA
42
+ RIS6SHOUnZ2XcSpk0cJ/h6/58YSd/f8EGADf2EvwBWN89QAAAABJRU5ErkJggg==">
43
+ </image>
44
+ </svg>
admin/images/backup-min.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 48"><path d="M42.36 29c-2.17-3.17-5.2-4.87-9-5.24l.01-8.26c0-.75-.08-1.45-.62-2.04.54-.6.62-1.3.62-2.04l-.01-8.96c0-1.5-1-2.47-2.48-2.47H2.8C1.2 0 .26.95.26 2.54l-.01 8.7c0 .8.02 1.6.63 2.2-.5.56-.63 1.18-.63 1.87v8.37c0 .88-.07 1.76.62 2.43-.45.53-.63 1.07-.62 1.7v9.26c0 1.57.95 2.53 2.52 2.53h18.6a11.87 11.87 0 0 0 13.55 7.69c5.25-1.07 9.15-5.6 9.44-10.94.16-2.67-.48-5.14-2-7.35zM2.9 1.6h27.82c.85 0 1.06.22 1.06 1.1v8.96c0 .8-.23 1.04-1 1.04H2.9c-.86 0-1.06-.22-1.06-1.1v-8.9c-.01-.88.2-1.1 1.05-1.1zM1.84 15.23c0-.7.25-.96.94-.96h28.05c.68 0 .94.25.95.9v8.36c0 .06-.01.13-.02.25-1.44.13-2.83.4-4.1 1.07-.76.4-1.5.5-2.35.5l-22.44-.01c-.8 0-1.03-.23-1.03-1.02l-.01-9.1zm19.12 22.8H2.83c-.73 0-.98-.24-.98-.97v-9.2c0-.64.27-.9.9-.9H24.2c.06 0 .12.01.26.03-3.08 3.1-4.2 6.76-3.5 11.06zm11.5 7.9c-5.6-.01-10.16-4.66-10.15-10.33s4.6-10.27 10.26-10.26c5.64.01 10.23 4.63 10.22 10.3-.01 5.73-4.6 10.3-10.33 10.28zM27.05 11.1c.88 0 1.6-.72 1.58-1.6-.01-.86-.72-1.56-1.57-1.56a1.59 1.59 0 0 0-1.58 1.61 1.57 1.57 0 0 0 1.57 1.56zm-.01 12.68c.88 0 1.6-.72 1.6-1.6-.01-.86-.7-1.56-1.57-1.57-.88 0-1.6.7-1.58 1.6 0 .86.7 1.56 1.56 1.57zm7.88 3.2H30.2v6.33h-6.26v4.76h6.3v6.3h4.73v-6.32h6.26v-4.76h-6.3v-6.3zm4.7 7.88v1.6h-6.25v6.32H31.8v-6.3h-6.3v-1.6h6.26v-6.32h1.58v6.3h6.28z" fill="#fff"/></svg>
admin/images/big_bg_clock_green-min.png ADDED
Binary file
admin/images/big_bg_clock_white-min.png ADDED
Binary file
admin/images/clock.svg ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M15 0C10.8594 0 7.32422 1.46484 4.39453 4.39453C1.46484 7.32422 0 10.8594 0 15C0 19.1406 1.46484 22.6758 4.39453 25.6055C7.32422 28.5352 10.8594 30 15 30C19.1406 30 22.6758 28.5352 25.6055 25.6055C28.5352 22.6758 30 19.1406 30 15C30 10.8594 28.5352 7.32422 25.6055 4.39453C22.6758 1.46484 19.1406 0 15 0ZM26.25 16.2305H27.3633C27.0508 19.1992 25.8496 21.7383 23.7598 23.8477C21.6699 25.957 19.1602 27.1289 16.2305 27.3633V26.25C16.2305 25.4297 15.8203 25.0195 15 25.0195C14.1797 25.0195 13.7695 25.4297 13.7695 26.25V27.3633C10.8008 27.0508 8.26172 25.8496 6.15234 23.7598C4.04297 21.6699 2.87109 19.1602 2.63672 16.2305H3.75C4.57031 16.2305 4.98047 15.8203 4.98047 15C4.98047 14.1797 4.57031 13.7695 3.75 13.7695H2.63672C2.87109 10.8008 4.04297 8.26172 6.15234 6.15234C8.26172 4.04297 10.8008 2.87109 13.7695 2.63672V3.75C13.7695 4.57031 14.1797 4.98047 15 4.98047C15.8203 4.98047 16.2305 4.57031 16.2305 3.75V2.63672C19.1992 2.94922 21.7383 4.15039 23.8477 6.24023C25.957 8.33008 27.1289 10.8398 27.3633 13.7695H26.25C25.4297 13.7695 25.0195 14.1797 25.0195 15C25.0195 15.8203 25.4297 16.2305 26.25 16.2305ZM16.3477 14.8828L18.6328 9.25781C18.75 8.90625 18.7402 8.57422 18.6035 8.26172C18.4668 7.94922 18.2227 7.73438 17.8711 7.61719C17.0898 7.34375 16.543 7.59766 16.2305 8.37891L13.4766 15.2344L18.8672 23.2617C19.0625 23.5742 19.3945 23.7305 19.8633 23.7305C20.0586 23.7305 20.3125 23.6523 20.625 23.4961C21.3672 23.1055 21.4844 22.5195 20.9766 21.7383L16.3477 14.8828Z" fill="#257671"/>
3
+ </svg>
admin/images/clock2.svg ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M15 0C10.8594 0 7.32422 1.46484 4.39453 4.39453C1.46484 7.32422 0 10.8594 0 15C0 19.1406 1.46484 22.6758 4.39453 25.6055C7.32422 28.5352 10.8594 30 15 30C19.1406 30 22.6758 28.5352 25.6055 25.6055C28.5352 22.6758 30 19.1406 30 15C30 10.8594 28.5352 7.32422 25.6055 4.39453C22.6758 1.46484 19.1406 0 15 0ZM26.25 16.2305H27.3633C27.0508 19.1992 25.8496 21.7383 23.7598 23.8477C21.6699 25.957 19.1602 27.1289 16.2305 27.3633V26.25C16.2305 25.4297 15.8203 25.0195 15 25.0195C14.1797 25.0195 13.7695 25.4297 13.7695 26.25V27.3633C10.8008 27.0508 8.26172 25.8496 6.15234 23.7598C4.04297 21.6699 2.87109 19.1602 2.63672 16.2305H3.75C4.57031 16.2305 4.98047 15.8203 4.98047 15C4.98047 14.1797 4.57031 13.7695 3.75 13.7695H2.63672C2.87109 10.8008 4.04297 8.26172 6.15234 6.15234C8.26172 4.04297 10.8008 2.87109 13.7695 2.63672V3.75C13.7695 4.57031 14.1797 4.98047 15 4.98047C15.8203 4.98047 16.2305 4.57031 16.2305 3.75V2.63672C19.1992 2.94922 21.7383 4.15039 23.8477 6.24023C25.957 8.33008 27.1289 10.8398 27.3633 13.7695H26.25C25.4297 13.7695 25.0195 14.1797 25.0195 15C25.0195 15.8203 25.4297 16.2305 26.25 16.2305ZM16.3477 14.8828L18.6328 9.25781C18.75 8.90625 18.7402 8.57422 18.6035 8.26172C18.4668 7.94922 18.2227 7.73438 17.8711 7.61719C17.0898 7.34375 16.543 7.59766 16.2305 8.37891L13.4766 15.2344L18.8672 23.2617C19.0625 23.5742 19.3945 23.7305 19.8633 23.7305C20.0586 23.7305 20.3125 23.6523 20.625 23.4961C21.3672 23.1055 21.4844 22.5195 20.9766 21.7383L16.3477 14.8828Z" fill="#ccc"/>
3
+ </svg>
4
+
5
+
admin/images/clocks-min.png ADDED
Binary file
admin/images/close-min.png ADDED
Binary file
admin/images/copy-icon.png ADDED
Binary file
admin/images/crown-bg.png ADDED
Binary file
admin/images/download-min.png ADDED
Binary file
admin/images/dream-objects.svg ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_8_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 36 35"
5
+ enable-background="new 0 0 36 35" xml:space="preserve">
6
+ <image overflow="visible" width="36" height="35" id="Layer_8_xA0_Зображення" xlink:href="data:image/png;base64,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
45
+ T3e/wAAAAABJRU5ErkJggg==">
46
+ </image>
47
+ </svg>
admin/images/ftp.svg ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Shape_16_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 39 40"
5
+ enable-background="new 0 0 39 40" xml:space="preserve">
6
+ <image overflow="visible" width="39" height="40" id="Shape_16_xA0_Зображення" xlink:href="data:image/png;base64,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
35
+ SpRPo4WIAAAAAElFTkSuQmCC">
36
+ </image>
37
+ </svg>
admin/images/google-cloud.svg ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_2_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 42 33"
5
+ enable-background="new 0 0 42 33" xml:space="preserve">
6
+ <image overflow="visible" width="42" height="33" id="Layer_2_xA0_Зображення" xlink:href="data:image/png;base64,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">
48
+ </image>
49
+ </svg>
admin/images/google-drive.svg ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 39 33"
5
+ enable-background="new 0 0 39 33" xml:space="preserve">
6
+ <image overflow="visible" width="39" height="33" id="Layer_1_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAhCAYAAABa+rIoAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
7
+ GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACThJREFUeNqsVwtwVNUZ/s+5d9+b
8
+ ZLN5EKKJwEAGkKFUxFiGFmW0dJzAVEbAysNXq44w0AI+6GNqH9NKQBBnWhFqpVBRZHSkFoexlnY6
9
+ HUgVeSnDRJ55kSxJdpN1d5Ps3nNO/3POvbsbTWmiBP499569e853vv///v+/BEb4t/rwKz9f0rVi
10
+ 7YzyIkhlfEBAAH7gf4ofaHhFCLGflqMA0X8JzKrVu10T6leMZC8ykoePdV8ov+nlpyPzy5ph/7RL
11
+ kE76gCEoQjQwDUoiJRJibgveB2DFwZx6YKIRuqVxuPvRkYB7/Miu14B0wF+6a/jRSJnl9qdx1oX7
12
+ uxCPaY/aAO8JlWbgdBES2Aes+TdvjGS/YYP707l/z2k48/c5UFqJGwn64PlqnPVytyls1gzNIHWu
13
+ 0cAZ0en+CSBiB6eyjj2Lrzm4Jxt27QaXR7EDhRn4pCtk/LG1khtBCygCAGoDUYxRxZqcAwc0cQN1
14
+ lQFv3brjmoJ7+qN96yNtJyqhsEKyhp7ETT0WWXmuglp9hcztwTlh5gHRwAh1KQPpXhmHnusBUqcL
15
+ WPOmjddEEJ/2Xi6ueX1FFARHLxYp9cmAh0Q/QKcLHpsYs16c2mKwpI9wpVSqBUEcYeRUq5Rr9aI4
16
+ PgM69eAYGpjU9JWY+9FHe1+C5BWAQEjvIc3ADxcyEsjAtqZiejYa4kbA0qLIujcv5gjNmSsMwBIg
17
+ Wp9/5Su59Z2W49848MlfF0K4Sp+cEhXwygw0N05zSu8/N0r6mhsoDi0KQwtDicO049BxOT4jxdG5
18
+ 73be9e68Lw1u9dHdO/HwuK9Xu1LlWDsS3PiFgRbMwJH2oPFWazEnAYZn0OrUrNmJWR6G2OKQixgo
19
+ LCOI4ti8/UuB+8XH+1deaP6gBkLX5VhzNpN/psxfhpoGNyePnQ/TKzEGhmlJv+uliZFj2knU6h+y
20
+ 570BRLyhgrVs/vWIwF1Oxdy/OrZ3CwSK7ZPr4FbxptjTbiUuijAQYFBAZxfQvdGJHeAdyB1AOGKg
21
+ kAvYnAalennbiz8RfZdKhg1u9bHXtlvxFhOCpfZ6NjhKckAVeyaYyAqPd0NxRTgyf+aW6WBMOSUG
22
+ WlXcKWxS5cqEMqVZoXSL4VICIt2BlaP+1WGB+1ekcfK+j9++H0KVee7MM6DZa4KutSg+0xeHLbPu
23
+ WTOmsOwylHz/CWD9iCetyZNAOMcR4Qiu7h2gEjTxjgPWsXsuj/3zm/8X3A/+8zKeAk/q8tncO+7M
24
+ c62jDYy5TLwdaifOPvHApNv2qMdDM98j5YveF6kmPJphg9JANG82QHWH+1BZdTxgXXjmz1cFt+H0
25
+ u0sbLx2eBkWV+mSO+yjJc6/tYUGAWRhfHi9sn/3wfYMWrfrhMuIKAeU9dv7VAAW3gQK3Act7huxV
26
+ AzJXnWl+Ye2Q4JoSna5fHn/996oKEDK4hmRd6vRueIX3oqcNHqpduPNro8adGVR23BUdmfJHn03G
27
+ mjTpSrQyB/JBTKr1nHtPJVjNz9Wz5LnwF8CtP/nmlmTn2QIIlIDNe+4v/14FMwWW6gZ/qDqzdfri
28
+ R4YKZm/1I+tj/Maey60XINZrQV+fBRxjzzTQFFDQMShdi+wpcaSaqNW0adsgcIfaT4/fc+rtFVA4
29
+ +nNABGTlxUXeNC6Y7IX6GfetKnD5Mv8rT5Xe+OTDqUQceuIp6Iym4UpXBjpjGYgnLbAsjtlIYA8h
30
+ FKtYdIH4qsFq27HQ6nqvNgtu1Qe7X4X+BCbTQJ6SRJb2rCmA+JNoG9ROubVx5fg5266W4X0Vd741
31
+ dvL8BitxVrVQGcYgkbCgK2ZBBMF2RjMInMFAGvtpdLnL7UNWGbCLWhxkw8n9y5469NwuKBqty5FK
32
+ upCrCI4CnDGdhuKiRO/fbq+vuLlgQv9wWh/RUNoOyWgFmMHsgTkyxS2uxGEgICKbVlM31tj7A0xY
33
+ udZ85vibL6gVDFMHKeGqPspQACoGvahgkUc6IlCdruvYt23sgptWnC8ZXW6A10MxbCxw+4vx9EE8
34
+ F4M0VrGWKIVxVa7unW3vtEHsH+UZGpaCVQpVuQ+N4zVHRi3GlWMokpLujxlFp/y/JWsadq3bfHjH
35
+ RpU+KM2rofkqtZOvO4Ffe9mE99cZA91hCJQnQb93oUv8YTDtfk//gqilelIAce6R/aZADCBNEsbl
36
+ iAdATGpURQQ0J6wFyNJF8KzKGWP3rmq82HaiBoqr9NeUDs5xTuYtvCwqTy1n152ZZw6E2+V7l3rU
37
+ 5S8FNwIj+Ft9HpKnJ6EASFYYfjC8YcgYY/Ka6WtLssfVnk1XGEwZY0ZObiqrUILYOGPJEtVBZPrs
38
+ IOFO46pX5biZtws8XRN52YXZtD8Q1QlVRoO/HAxvSCvYBuYAlC7SozyjUEbUCGrUOV3YzhEYClyB
39
+ X//d4ANZtd4zrvboHZPmvgHRFj2l4pTZCpVPDCgeKs/UCdLvp4wmVK4zAxVguAvQXxm7NDkRShFA
40
+ rvulQCHXsOc8IUjuTcHA7rq13YIFM72H7p3lOzgoCW+6+XuPmqHrLUh055zvsOaPQLD5FhZsmU77
41
+ fW1KUgYCI6YPFZdxCocNz36HoBogdVyc1y45TpHohF2/owkOoZAB6+8uePALFWJa6Q09a6YvfkKB
42
+ 43aQSDN7gfSV8FGNdchfLxXYJilg2M1ylgannKtSLByIJKsnh3wxhOVXyO4rHFbe5d8wY7y7ecjC
43
+ Xz/j3ucrq6dfhM8i+hdyVW+3CJ+/g7si1aZV0If9/2gQKD1upYE7uVkGvZ2eVPDLwEez5CgGtXP2
44
+ b4RdBvUBWrsZTBrvij4+N/Djq7ZMG2qXLgGMIaVvXyeY0Rpe/OlskilMYeCPUhswBUxki7juJzUg
45
+ OS9BybzFMMC5yl9CAeafAynnMpaAVBJFcHfwocqwya8Kbtn4WUe+Nfk7ByCO4nBZItz4bUGsKkMU
46
+ +fXCmGxzi4NiRqWIPIAyPUhwGTlmGZSmgTL1e63a8x0W1N3q+XD5bf79w2rTt9YuXwrybe/sJBLq
47
+ qDOtEks1DoxbOhy5ZkJtyBxANmMKkASWu9d5TbJos8uEqg7xFINQgMDPFgQWDYXDHGry6yiOVR/+
48
+ 4anfHar6KfcEUVSR7MsKA5s2YnvAkIzJFx3Jis5rWgxOXAkdClnX2u06jpEeBuvm+XbU1nguDYXj
49
+ vwIMAJakr2+6t2qdAAAAAElFTkSuQmCC">
50
+ </image>
51
+ </svg>
admin/images/happy-smile.png ADDED
Binary file
admin/images/info-min.png ADDED
Binary file
admin/images/kitty-cat.svg ADDED
@@ -0,0 +1 @@
 
1
+ <?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg fill-rule="evenodd" height="96pt" overflow="visible" stroke-linejoin="bevel" stroke-width="0.501" version="1.1" viewBox="0 0 96 96" width="96pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><marker id="DefaultArrow2" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -9 54 L -9 -54 L 117 0 z"/></g></marker><marker id="DefaultArrow3" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -27 54 L -9 0 L -27 -54 L 135 0 z"/></g></marker><marker id="DefaultArrow4" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -9,0 L -9,-45 C -9,-51.708 2.808,-56.580 9,-54 L 117,-9 C 120.916,-7.369 126.000,-4.242 126,0 C 126,4.242 120.916,7.369 117,9 L 9,54 C 2.808,56.580 -9,51.708 -9,45 z"/></g></marker><marker id="DefaultArrow5" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -54, 0 C -54,29.807 -29.807,54 0,54 C 29.807,54 54,29.807 54,0 C 54,-29.807 29.807,-54 0,-54 C -29.807,-54 -54,-29.807 -54,0 z"/></g></marker><marker id="DefaultArrow6" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -63,0 L 0,63 L 63,0 L 0,-63 z"/></g></marker><marker id="DefaultArrow7" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M 18,-54 L 108,-54 L 63,0 L 108,54 L 18, 54 L -36,0 z"/></g></marker><marker id="DefaultArrow8" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -36,0 L 18,-54 L 54,-54 L 18,-18 L 27,-18 L 63,-54 L 99,-54 L 63,-18 L 72,-18 L 108,-54 L 144,-54 L 90,0 L 144,54 L 108,54 L 72,18 L 63,18 L 99,54 L 63,54 L 27,18 L 18,18 L 54,54 L 18,54 z"/></g></marker><marker id="DefaultArrow9" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M 0,45 L -45,0 L 0, -45 L 45, 0 z M 0, 63 L-63, 0 L 0, -63 L 63, 0 z"/></g></marker><filter id="StainedFilter"><feBlend in="SourceGraphic" in2="BackgroundImage" mode="multiply" result="blend"/><feComposite in="blend" in2="SourceAlpha" operator="in" result="comp"/></filter><filter id="BleachFilter"><feBlend in="SourceGraphic" in2="BackgroundImage" mode="screen" result="blend"/><feComposite in="blend" in2="SourceAlpha" operator="in" result="comp"/></filter><filter id="InvertTransparencyBitmapFilter"><feComponentTransfer><feFuncR amplitude="1.055" exponent=".416666666" offset="-0.055" type="gamma"/><feFuncG amplitude="1.055" exponent=".416666666" offset="-0.055" type="gamma"/><feFuncB amplitude="1.055" exponent=".416666666" offset="-0.055" type="gamma"/></feComponentTransfer><feComponentTransfer><feFuncR intercept="1" slope="-1" type="linear"/><feFuncG intercept="1" slope="-1" type="linear"/><feFuncB intercept="1" slope="-1" type="linear"/><feFuncA intercept="0" slope="1" type="linear"/></feComponentTransfer><feComponentTransfer><feFuncR amplitude="1" exponent="2.4" offset="0" type="gamma"/><feFuncG amplitude="1" exponent="2.4" offset="0" type="gamma"/><feFuncB amplitude="1" exponent="2.4" offset="0" type="gamma"/></feComponentTransfer></filter></defs><g fill="none" font-family="Times New Roman" font-size="16" id="Document" stroke="black" transform="scale(1 -1)"><g id="Spread" transform="translate(0 -96)"><g id="Layer 1"><g id="Group" stroke-linejoin="round"><path d="M 48.991,19.687 C 70.466,18.515 87.895,13.443 87.895,8.368 C 87.895,3.293 70.466,0.126 48.991,1.299 C 27.516,2.471 10.087,7.543 10.087,12.618 C 10.087,17.693 27.516,20.86 48.991,19.687 Z" fill="#000000" fill-opacity="0.298039" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-opacity="0.298039" stroke-width="0.75"/><g id="Group_1"><path d="M 36.49,5.373 L 36.605,6.192 L 32.613,7.026 C 30.491,7.654 28.557,8.431 26.885,9.349 C 25.616,10.044 24.466,10.753 23.425,11.476 L 20.923,13.445 L 17.888,12.723 C 15.049,12.336 5.676,10.935 4.981,17.152 C 4.766,19.084 5.197,20.84 8.101,22.474 C 9.764,23.409 11.441,24.507 13.093,25.697 L 14.175,26.541 L 13.806,29.181 C 13.548,34.131 15.214,38.792 17.686,43.226 L 18.208,44.069 L 17.737,46.773 C 17.721,48.943 18.357,51.115 19.362,52.619 C 21.523,55.855 25.402,58.491 28.886,60.012 L 29.425,60.228 L 31.583,63.781 C 33.205,66.82 34.787,70.487 36.432,74.203 L 38.565,78.872 L 38.292,79.832 C 37.343,83.291 35.116,92.459 37.671,94.972 C 39.4,96.67 42.611,95.469 45.492,93.599 L 48.599,91.154 L 51.158,92.351 C 56.068,94.082 61.647,94.08 65.925,92.247 L 68.292,90.711 L 71.881,92.765 C 74.746,94.16 77.855,95.104 79.942,94.266 C 85.749,91.933 80.196,76.864 79.593,75.468 L 79.476,75.34 L 80.34,73.61 C 85.067,62.773 87.573,49.649 86.641,38.149 L 85.54,31.718 L 85.622,31.493 C 85.347,24.154 89.681,19.122 88.838,12.727 C 87.344,1.387 75.219,-1.465 66.435,3.461 L 63.291,5.771 L 61.489,4.809 C 57.45,2.918 53.182,1.458 49.396,0.943 C 46.562,0.558 37.187,-0.844 36.49,5.373 Z M 77.159,15.168 L 75.854,13.966 L 75.549,13.991 C 77.047,13.656 77.298,14.359 77.159,15.168 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none"/><g fill="#f68634" id="Group_2" stroke-linecap="round"><path d="M 40.063,79.163 C 39.249,81.948 36.762,91.946 38.737,93.888 C 40.678,95.795 49.138,89.53 49.928,87.629 C 46.13,85.643 43.345,82.283 40.799,78.868 L 40.063,79.163 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 8.847,21.15 C 6.492,19.825 6.342,18.667 6.492,17.321 C 6.973,13.022 13.7,13.687 17.683,14.23 C 24.912,15.213 34.165,19.873 39.769,24.241 C 50.888,32.912 36.036,44.35 27.252,35.874 C 22.692,31.473 15.691,24.999 8.847,21.15 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 15.324,29.261 C 14.663,41.947 26.962,51.887 32.925,63.066 C 36.487,69.74 39.077,77.431 42.982,84.158 C 48.013,92.819 62.581,94.529 68.643,88.705 C 84.109,73.845 91.784,35.529 78.493,19.236 C 69.692,5.407 40.608,3.558 27.616,10.682 C 17.974,15.97 15.712,21.846 15.324,29.261 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 40.357,9.37 C 38.001,8.045 37.851,6.888 38.001,5.542 C 38.483,1.242 45.211,1.909 49.192,2.45 C 56.422,3.433 65.676,8.094 71.278,12.462 C 82.399,21.131 67.546,32.57 58.762,24.095 C 54.201,19.692 47.202,13.22 40.357,9.37 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 29.495,58.62 C 26.162,57.165 22.568,54.683 20.627,51.775 C 18.867,49.141 18.59,44.359 21.068,42.058 C 21.738,41.437 22.599,41.297 23.425,41.616 C 28.627,43.624 26.042,50.688 26.516,53.395 C 26.527,53.453 30.367,58.684 30.786,59.138 C 30.363,58.984 29.932,58.811 29.495,58.62 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 53.02,20.414 C 54.837,21.373 55.697,19.179 54.492,18.352 L 70.983,13.64 C 74.75,14.435 82.91,23.505 73.781,26.893 C 70.461,28.124 56.966,30.952 57.511,25.272 C 57.637,25.047 52.999,20.678 53.02,20.414 Z" marker-end="none" marker-start="none" stroke="none" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 84.104,31.55 C 83.799,23.413 88.136,19.032 87.332,12.926 C 85.858,1.739 72.106,-0.55 63.962,7.152 C 59.56,10.708 56.498,19.306 61.593,21.13 C 67.431,22.363 71.034,13.441 75.219,12.508 C 79.445,11.565 79.234,16.033 77.606,17.908 C 79.24,19.542 83.49,28.098 84.104,31.55 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 66.271,87.408 C 68.695,89.506 76.208,94.129 79.376,92.856 C 83.297,91.281 79.36,78.762 78.198,76.071 C 76.477,76.361 67.827,84.388 66.345,86.083 L 66.271,87.408 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 64.058,88.434 C 65.51,87.251 66.7,87.265 68.476,87.256 C 68.886,83.627 76.248,81.81 77.604,79.452 C 77.834,78.832 77.744,75.111 77.899,74.152 C 73.603,69.521 63.839,82.879 62.881,86.52 C 62.718,87.137 63.111,87.454 63.469,87.551 C 63.439,87.925 63.635,88.219 64.058,88.434 Z" marker-end="none" marker-start="none" stroke="none" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/></g></g><path d="M 38.094,8.127 C 34.325,8 28.303,10.598 23.567,14.134 C 19.906,25.157 24.018,33.218 26.61,37.178 C 30.349,42.887 36.559,48.965 43.493,49.802 C 56.448,49.733 55.543,24.339 51.478,18.469 C 50.608,17.213 37.476,8.535 38.094,8.127 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 78.324,21.359 C 80.25,24.441 79.531,31.291 82.037,34.171 C 82.512,34.386 83.608,34.543 83.788,34.188 C 83.114,31.106 82.938,30.106 83.368,27.768 C 83.641,26.273 85.397,21.545 85.007,19.859 C 84.947,19.603 83.973,19.429 83.665,19.331 C 82.856,19.074 82.022,19.76 81.165,19.787 C 81.385,20.189 81.614,21.128 80.961,21.471 C 80.572,21.429 79.893,22.228 79.313,21.663 C 79.106,21.391 78.601,21.3 78.324,21.359 Z" fill="#f68634" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 43.529,68.049 C 45.847,63.353 52.768,64.961 53.263,67.756 C 53.902,71.349 45.645,70.6 44.138,69.432 C 43.545,69.181 43.321,68.731 43.529,68.049 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 37.329,75.364 C 37.502,76.256 37.914,77.043 38.488,77.669 L 46.422,76.142 C 46.722,75.347 46.814,74.464 46.642,73.572 C 46.147,71.001 43.66,69.317 41.09,69.811 C 38.52,70.306 36.834,72.794 37.329,75.364 Z" fill="#ffffff" marker-end="none" marker-start="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 47.899,69.289 C 48.923,69.289 49.755,68.884 49.755,68.385 C 49.755,67.886 48.923,67.481 47.899,67.481 C 46.875,67.481 46.043,67.886 46.043,68.385 C 46.043,68.884 46.875,69.289 47.899,69.289 Z" fill="#f8dab6" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 54.922,71.659 C 55.115,72.666 55.58,73.551 56.225,74.256 L 65.163,72.536 C 65.501,71.642 65.604,70.647 65.411,69.64 C 64.854,66.747 62.052,64.848 59.157,65.405 C 56.263,65.963 54.365,68.765 54.922,71.659 Z" fill="#ffffff" marker-end="none" marker-start="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 48.512,65.088 C 48.64,64.616 49,62.454 49.425,62.274 C 49.638,62.183 50.046,62.279 50.556,62.394 C 50.774,62.406 51.138,62.529 51.404,62.565 C 51.969,62.653 52.579,62.681 53.151,62.502 C 56.051,61.591 56.817,58.567 55.661,55.961 C 53.86,51.904 47.295,53.072 48.664,55.81 C 48.955,56.391 50.847,56.724 51.097,56.266" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 85.625,68.739 L 85.625,68.739 Z" fill="#000000" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 52.315,61.97 C 52.855,61.633 53.366,61.159 53.683,60.601 C 55.283,57.784 50.865,56.838 49.121,56.57 C 48.693,56.176 48.563,55.349 49.044,54.897 C 51.186,52.886 55.723,54.808 55.585,58.167 C 55.523,59.658 54.415,61.925 52.619,61.628 L 52.315,61.97 Z" fill="#502c11" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 58.095,72.807 C 58.095,73.137 58.163,73.451 58.288,73.736 L 62.729,72.9 C 62.73,72.869 62.731,72.837 62.731,72.807 C 62.731,71.528 61.692,70.49 60.413,70.49 C 59.134,70.49 58.095,71.528 58.095,72.807 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 40.602,76.42 C 40.602,76.71 40.661,76.987 40.766,77.24 L 44.859,76.47 C 44.859,76.452 44.86,76.437 44.86,76.42 C 44.86,75.246 43.906,74.292 42.732,74.292 C 41.557,74.292 40.602,75.246 40.602,76.42 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 58.026,49.273 C 56.965,46.836 55.62,43.837 53.904,41.764 C 50.37,37.494 44.375,35.229 45.658,32.487 C 48.897,25.567 67.067,36.553 69.217,42.647" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 69.235,84.293 C 71.525,85.617 73.818,88.934 76.687,88.704 C 78.431,87.239 75.739,79.694 74.71,78.868 C 73.391,80.213 70.525,83.188 69.082,83.532 L 69.235,84.293 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 41.38,84.077 C 40.905,85.364 39.533,89.16 40.183,90.073 C 41.024,91.251 44.38,88.591 44.899,87.791 C 44.056,87.193 41.701,84.859 41.451,83.888 C 41.43,83.942 41.407,84.006 41.38,84.077 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 58.739,61.022 C 61.051,59.68 62.018,57.386 63.455,55.394" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 61.021,62.543 C 62.851,61.676 64.561,60.432 66.04,59.044" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 37.749,58.892 C 39.432,60.294 41.5,61.681 43.834,62.086" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 37.446,62.999 C 38.862,64.018 41.322,64.439 43.073,64.519" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 47.323,79.081 C 47.594,80.361 47.725,82.395 47.054,83.796" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 45.546,79.31 C 45.418,80.323 45.519,81.246 45.242,82.275" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 56.877,77.027 C 57.661,79.184 58.955,81.253 60.68,82.731" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 59.615,77.484 C 60.228,78.562 61.045,79.675 62.201,80.221" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 84.636,51.17 C 83.115,49.726 76.628,47.758 76.763,51.113 C 78.375,53.826 81.843,52.968 83.911,55.479 C 84.06,54.268 84.198,52.183 84.636,51.17 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 85.701,44.326 C 84.18,42.883 77.693,40.913 77.828,44.269 C 79.44,46.981 82.908,46.124 84.976,48.634 C 85.125,47.423 85.263,45.339 85.701,44.326 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 85.472,37.102 C 83.952,35.658 77.465,33.688 77.6,37.044 C 79.211,39.757 82.68,38.899 84.748,41.409 C 84.896,40.198 85.034,38.113 85.472,37.102 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 44.037,10.3 C 46.489,9.52 48.411,4.052 47.051,2.92 C 46.543,2.495 44.749,2.586 44.013,2.615 C 40.874,2.742 36.224,4.899 40.375,8.43 C 41.29,9.209 43.303,9.95 43.724,10.372 C 43.829,10.357 43.933,10.333 44.037,10.3 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 12.2,21.937 C 14.525,21.179 16.345,15.874 15.057,14.775 C 14.576,14.363 12.875,14.449 12.177,14.478 C 9.201,14.602 4.794,16.695 8.728,20.123 C 9.596,20.879 11.504,21.598 11.904,22.008 C 12.003,21.992 12.101,21.97 12.2,21.937 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 19.993,47.27 C 20.096,45.604 20.981,41.399 23.73,42.579 C 26.374,43.714 25.81,46.98 25.717,49.039 C 22.661,49.527 22.169,48.58 20.352,47.579 L 19.993,47.27 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 61.973,10.94 C 61.496,11.178 60.414,13.502 60.224,14.058 C 59.902,14.996 59.308,17.142 59.539,18.089 C 60.946,23.858 67.296,18.697 68.742,16.263 C 68.437,14.134 63.795,10.031 61.973,10.94 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/></g></g></g></g></svg>
admin/images/link-min.png ADDED
Binary file
admin/images/lock-experimental.png ADDED
Binary file
admin/images/lock-min.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 24"><path fill-rule="evenodd" fill="#a2a2a2" d="M19.5 11.7c-.02-.46.01-.92-.3-1.33-.46-.58-1.05-.8-1.77-.75-.5.04-.53.03-.53-.43l-.02-2.36C16.6 2.93 13.24.13 9.3.47 6.3.7 3.78 2.82 3.18 5.7c-.22 1.03-.16 2.12-.2 3.2-.02.7 0 .7-.74.72-1.15 0-1.86.7-1.86 1.85v10.37c0 1.2.7 1.87 1.9 1.87h15.2c1.32 0 1.98-.65 1.98-1.95v-8.3l.03-1.76zm-8.33 4.82a.77.77 0 0 0-.34.74v1.92c-.01.54-.4.93-.9.93-.5 0-.88-.4-.9-.94v-1.4c.03-.55-.02-1-.52-1.45-.8-.73-.67-1.95.17-2.67a1.94 1.94 0 0 1 2.71.21c.7.83.62 2-.23 2.66zm3.16-6.9l-3.37-.03-5.85.02c.08-1.23.02-2.42.27-3.54.52-2.3 2.83-3.74 5.22-3.43 2.28.3 4.06 2.3 4.07 4.6l.01 2.06c.01.3-.12.34-.35.33z"/></svg>
admin/images/log-min.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 22 23"><defs><path id="A" d="M21.85 10.05a5.07 5.07 0 0 0-.03-.55c-.08-.6-.6-1.06-1.23-1.1-.22-.01-.44 0-.7 0v-2.6c0-.22-.06-.4-.22-.58L15.14.3c-.08-.08-.17-.15-.25-.22H2.98c-.37.15-.66.35-.73.75-.02.1-.02.2-.02.3V8.4H1.8C.98 8.4.5 8.74.3 9.5c-.01.02-.02.03-.03.05v7.07c.07.18.12.38.23.54.24.38.6.57 1.06.6h.67v4.5c0 .7.37 1.05 1.1 1.05H18.8c.73 0 1.1-.36 1.1-1.06v-4.48h.47c.92 0 1.48-.54 1.48-1.4v-6.3zM3.2 1.02L3.44 1H14c.2 0 .26.05.26.25v4.28c0 .45.14.6.62.6h4.05V8.4H3.2V1.02zm9.8 11.9c-.02.83-.18 1.57-.7 2.2-.72.86-1.7 1.14-2.8 1.04-1.57-.15-2.63-1.26-2.7-2.8-.04-.7.04-1.4.4-2.03.6-1.06 1.57-1.53 2.8-1.52 1.8.01 2.85 1.27 2.97 2.78a6.03 6.03 0 0 0 .03.32zM2.55 9.94H4v4.98h2.57v1.15H2.55V9.94zm16.37 12.2H3.2V17.8h15.72v4.36zm.44-6.3l-1.6.28a5.21 5.21 0 0 1-2.04-.17 2.78 2.78 0 0 1-2.03-2.44c-.1-.92.07-1.8.72-2.52.48-.54 1.1-.86 1.8-1.02.88-.2 1.76-.17 2.64.06.1.03.2.07.3.1l-.3 1.12c-.53-.22-1.07-.27-1.62-.25-1.35.04-2.17.95-2 2.23.12.97.64 1.57 1.54 1.72.34.06.7.01 1.04 0a.14.14 0 0 0 .16-.17v-1.15H17v-1.08c.05-.01.08-.01.12-.01h2.26v3.3zM8.8 11.46c-.6.75-.63 2.15-.1 2.97.57.87 1.8.87 2.37.01.3-.44.37-.93.4-1.42-.02-.55-.1-1.08-.45-1.53-.54-.73-1.64-.75-2.2-.03z"/></defs><clipPath id="B"><use xlink:href="#A"/></clipPath><image overflow="visible" clip-path="url(#B)" width="22" height="23" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAXCAIAAACAiijJAAAACXBIWXMAAAsSAAALEgHS3X78AAAA GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWZJREFUeNp8VFGWrTAIC5Xv2f8e 5v/tTniFQqXWjsdz9RZMIUmhn3+/QIOud1+R8X5BCbgydGG7GO2GAD1N/Xdc9j6WxL+/bXFENxSG Kui25IYPrPjUY70cUstfwwwSq5BKRpPAWlIHynheNeQQsdWdXbTAoqyqN1J7XFESwqq7HpSZHX10 diU/Iai/a6CwbQi/Lam9UZDUTI5iM2fatKPBxUOZoVgLiTvu3siIVtaza7aFuUo4SNOs+EYQ9S6o ssPJXNFCD1iB2NIsHiOZihQtkHKYzPJR/GOWbqhrhcAr6bbdUMok2c3CQVjwJ6sQu8ytmCVkrr4o jWAitrNZojv2/1Jst/KnLnOsyqdZOBvXOAIvLR5QcqxqlnADL/XNLkKRv80SM4GLAg9DyfYwi7qj jjOBVx1fKKXtKcc2E3hzwxgqG9BilmUm8Feaa/k+bMeZwAdnVrPMo/E9Ew4Qf5hlmwn/BRgAyMAN jQnpGUYAAAAASUVORK5CYII="/></svg>
admin/images/logo-min.png ADDED
Binary file
admin/images/logo.png ADDED
Binary file
admin/images/microsoft-azure.svg ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_4_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 48 28"
5
+ enable-background="new 0 0 48 28" xml:space="preserve">
6
+ <image overflow="visible" width="48" height="28" id="Layer_4_xA0_Зображення" xlink:href="data:image/png;base64,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">
42
+ </image>
43
+ </svg>
admin/images/minimize-min.png ADDED
Binary file
admin/images/next-icon-min.png ADDED
Binary file
admin/images/nut-big.png ADDED
Binary file
admin/images/nut-mid.png ADDED
Binary file
admin/images/nut-small.png ADDED
Binary file
admin/images/onedrive.svg ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_5_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 44 28"
5
+ enable-background="new 0 0 44 28" xml:space="preserve">
6
+ <image overflow="visible" width="44" height="28" id="Layer_5_xA0_Зображення" xlink:href="data:image/png;base64,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">
38
+ </image>
39
+ </svg>
admin/images/openstack-swift.svg ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_9_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 34 33"
5
+ enable-background="new 0 0 34 33" xml:space="preserve">
6
+ <image overflow="visible" width="34" height="33" id="Layer_9_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAhCAYAAAC803lsAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
7
+ GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABBpJREFUeNrMV11oHFUUPufeubOT
8
+ nWS3SVMTV7R5qKJQtEG0EJMi2NJisQ/NQx98kaL2oS9VKKLgT7H0pSq+iEgVC/0RH3wQwSoUDIKC
9
+ lUIRrT4IInZjaeL+z+zszs4cz2yyyc7ubMRmmubCcPfunbn3u+d85zvnInCzj5w8XDt/4RAqtQl1
10
+ RUBEcCsbIlCtLkCTOTU5/rF5/sRb6Lx77lnryCunhDEK2G8CeB6/uPQFP9TWQ8Tv9kYR30HH72DI
11
+ Y00ClS3wnL/APH7sKBZGd2Upl8/gxqE6+D7CWjaBRMWyDmYyLxhoH6RTsOYgguYTYqofGI4mIKFX
12
+ MXDH7Woeu0lXNXFrzPD/ua5FUKnNh4KoZOlklQI79nprJds3t8CBFKDZV28u0BWQC2OtJ3YhgApl
13
+ HTemr6s9EzNo6C65DVxiPfY4PC5HDcsBUdXRGj9enaB8aTP2J92IWF62SNQ5GYQS94zMGi8ffCjx
14
+ zL751Tiq/tlF0zl55op3+ZctOLTBjXQNzeUzZJUBha5CHPJnQctsvbZaEEHTp3dahZGdv5Nb3QJz
15
+ pMLeY/cpbVjTHn/4GFTsNA9CoSPm/pFy230/wTfx0Ffee/cZXu83FkyvI4Qli1sF1kvD+tkvd1Dd
16
+ TYAUFFJjy0YxdtecenLyShwb1U5/sZXXvbOL3j7/K9DFfGqKQ5Q5oqlQmvAbf4O+Y/f3A99+9Fgc
17
+ QHLqkQtIsCdCXZlE7B1MmzcQ6Q5QYQ7hPMu+2ZePLa2k+ws9ZJ7JKgsaSNkgKQGl7AgrqVCK+LRf
18
+ ytZa4X3QVwEGsQ5ouqAjeNuBtCQ+iOPAT0HfmSeI4rOY74vFSJAhLV/cW6OKNQJcKTFZRRhnBchy
19
+ NsV27rI93OJtBFkHNX36iafAdpKsbn5oPlcUavuDWZg5FQsQ/cCuV7n7cDElt59YgERn/Shr9bX3
20
+ j5JTG8Dl8FoAWixxrrn/18Tz05/EsZH9wtv7MWlsY6505xopbMzBOFcXrKygh0okD65B4tF9l1KX
21
+ zm6PA0jenPjKt67vRjA6VJ6a1YgmxzKzVKpkmKwhocFSSlHRGnXe+9Q0Dh+wVgPC/fo7WX39g810
22
+ uQZiaNDtsIhiss5jYWxvFiKANCu0YkXh8IY/1NT4RTASDXBd7JIAjLjStMY6F4B1VzZ++HnKz954
23
+ AAdMt6tU9FlZlbYCEL6NNSvMsq1TpXiTNSs1oxWTXLOmTHepzIwAomGvmjv4gMtOLnpdfmIQElpR
24
+ 4sVqZDlOiRccukaQfW8mUcWUlbm6dhN8I9fqVCo17zBrrmLB3bdUCWziCePFp0/4tSxQvhgIieLy
25
+ ve3xOnr/P+Z7vdeaa5snUMHlzbP/hMRz+99p2tg6dPwl9/OZgzw5yAxeG8sElzXfK6q9k+fM02++
26
+ 8a8AAwBpB96T4TiRdAAAAABJRU5ErkJggg==">
27
+ </image>
28
+ </svg>
admin/images/premium.png ADDED
Binary file
admin/images/premium.svg ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Shape_2967_copy_3_1_" x="0px" y="0px" viewBox="0 0 20 20" style="enable-background:new 0 0 20 20;" xml:space="preserve">
2
+ <style type="text/css">
3
+ .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFC000;}
4
+ </style>
5
+ <g id="Shape_2967_copy_3">
6
+ <g>
7
+ <path class="st0" d="M10,0C4.48,0,0,4.48,0,10c0,5.52,4.48,10,10,10c5.52,0,10-4.48,10-10C20,4.48,15.52,0,10,0z M13.94,14.88 H6.06L3.38,7.12l4.71,2.4L10,5.28l1.91,4.25l4.71-2.4L13.94,14.88z"/>
8
+ </g>
9
+ </g>
10
+ </svg>
admin/images/rackspace.svg ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_6_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 36 37"
5
+ enable-background="new 0 0 36 37" xml:space="preserve">
6
+ <image overflow="visible" width="36" height="37" id="Layer_6_xA0_Зображення" xlink:href="data:image/png;base64,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">
43
+ </image>
44
+ </svg>
admin/images/red-close-min.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 12"><path fill-rule="evenodd" fill="#d0302d" d="M12.4 2.6c.3-.3.52-.62.57-1.05 0-.01.01-.02.02-.03V1.2l-.12-.42a1.57 1.57 0 0 0-1.26-.99c-.02 0-.05-.02-.07-.02h-.35c-.05.01-.1.03-.15.04-.34.07-.63.25-.88.5L6.7 3.72c-.03.02-.06.07-.1.1-.02.01-.04.01-.07.02-.02-.05-.04-.1-.08-.14L3.05.3C2.76.02 2.43-.2 2-.24 2-.23 2-.24 2-.25h-.35c-.17.05-.34.08-.5.15C.14.35-.14 1.65.6 2.44l2.2 2.2L4.2 6l.1.12c-.05.03-.1.05-.13.1L.7 9.65c-.53.53-.67 1.24-.37 1.88.46.97 1.76 1.23 2.55.5l.82-.8L6.47 8.5c.03-.03.06-.08.08-.12h.06c.04.05.07.1.12.16l3.44 3.4c.54.53 1.25.66 1.9.34.5-.24.8-.65.9-1.2L13 11v-.35c-.01-.05-.03-.1-.04-.15-.07-.34-.25-.62-.5-.87L9 6.23c-.03-.03-.08-.07-.13-.1.05-.05.08-.1.12-.12l3.4-3.4z"/></svg>
admin/images/red-cross.svg ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1229_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 144 123"
5
+ enable-background="new 0 0 144 123" xml:space="preserve">
6
+ <image overflow="visible" width="144" height="123" id="Layer_1229_xA0_Зображення" xlink:href="data:image/png;base64,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
202
+ rkJggg==">
203
+ </image>
204
+ </svg>
admin/images/restore-icon-min.png ADDED
Binary file
admin/images/restore-min.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 12"><path fill-rule="evenodd" fill="#fff" d="M11 6.65c.01 2.13-1.8 3.77-3.73 4-1.82.23-3.6-.62-4.45-2.2-.84-1.54-.52-3.43.8-4.67C4.85 2.6 6.6 2.43 7.56 2.7l-1 1.18c-.07.07-.14.15-.07.23.05.06.15.1.24.1l1.25.08 3.02.18c.34.02.53-.2.44-.52L10.27.1c-.02-.08-.1-.16-.2-.2-.04-.02-.15.05-.2.1l-.9 1.06c-.07.08-.12.1-.2.06a6.52 6.52 0 0 0-4.74.22C1.33 2.52-.1 5.44.65 8.13c.68 2.4 2.93 4.18 5.56 4.36 1.36.1 2.62-.18 3.77-.87 1.7-1 2.65-2.47 2.9-4.33.03-.2.03-.42.04-.63H11z"/></svg>
admin/images/search-min.png ADDED
Binary file
admin/images/sftp-scp.svg ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Shape_17_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 37 38"
5
+ enable-background="new 0 0 37 38" xml:space="preserve">
6
+ <image overflow="visible" width="37" height="38" id="Shape_17_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAmCAYAAABDClKtAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
7
+ GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABGRJREFUeNrMWFtsDUEYnjlZvYUh
8
+ jUgRDyTEg5BIG22kbhX3XtLqUVKJRAURiRC0r6Re+oIKQiSi9KrVG4rWrVF1SRBCQl1eGg9C2LiU
9
+ csY3e6a7Z/fsOj3tntYk3/6zu//OfPvPzLf/LCX9KKzy7mSYM8BcQig13eS0P038ATqADeraOW9C
10
+ OYdskVV1pMFUAd8IJ6V4RA3ZRDDReGA7EAPkgdi1AZNi1e074FKCTtpxukZdM/cDGWBhFfcSYM4D
11
+ yUARiJWERYpV3xZvdBLIhwuiQ3aq3tTfZJCFVXaOgDmMl9wCWwEUgNz3kKRYza1JMHV4cAbsVtU7
12
+ 7zRxuYBcAcwR4DmQreYlv3Mkxc7fSAUZEeJezTl3wX0SoYLFkyyHMxo0vCB2o++exyB0fStmaBuh
13
+ /BWQFElCoqh5KZ3oLwl4CVwFyR16pFhtW7QMZQFW1wmxStTVab/IEBVWdScKNA6hugX9C9nZDFKt
14
+ LagsBTCR6ZPg5W0daRpi+dMQ+kXtr3E6ExWxEG4pGCpB6AXwzCAQ4Ewt7Dg3N04dXoJyB5LchiQX
15
+ /kJUZwHzFUJ84kapmr3kGBnmAinaBi5HFD9zTv6T4hNcPFqYqUGK1bV4Aq2/ftUzJJSoT+Pi8Q+f
16
+ z9/5hcvFuNgg50QHu9CyC+TG4P5n2JTIk+J9pAKHzzcBGC8nJCwfCycGjALiXZk3tW3TgU2GPrZt
17
+ BGYYi8A6fJrlf/ThNcGteceXAcWQIo9cfBgdstzo32eNlKbordKhHhCq+0EoLpxfuqLkOYsPot2J
18
+ sD7Z5yQ1J61Ej5RQIdbQwFGvwZUas+g4iZyTEFKbZyix1T5nMV4NPfMqkl0uLuSaBZDbE3MSyyB/
19
+ 2g9/G3IwipxPInzHg/yIgwhHjiTyLLpbiif5pGZkvxlu5YQkfRJ0lP9IzfWJrpjUvKl2Ea4nqBk5
20
+ 5ayxTqSsImt4AOwDShHN9xH/yoCV5TPD16O+R0pCIZCBaxBUXgTMdmWI6hspEGucN8UA1FnRKY8C
21
+ PEauwXVHQl0KBuXIMHk3q2/oy2mQn8tAyCG0zCku9nRf5MNfcfwJ9GienLiUjfImvOBHNTOLy352
22
+ oe2HgUtR0b7MxgOFOMTJukj+PqurvF9Zc/VUNPTWFUXPzOqC6TLOM8+ZPshajn6pXEThB6o9Ninq
23
+ PwSJ2uhNKEUP1QYV+81YRd57jCtPnVNaO5LW9qlZZQcmxIk4zpbpMClTV+QPfzrcWIdtHjnqcXVl
24
+ uZHkEV0SZOZ5uSwOGKPVL52NB6JlPWHoFD04ySvGjXpZvwnsBcl42G4QWzjE6bDOdJye9lI+GoDy
25
+ 8pGAIB/nyry5WJECHNDPm6v2A6nmdNicefYa6TDvCye37ngGGY0pQgPZxXKZDvuWA9MC+7Qqern8
26
+ DSjqB3F4BLzX/in564MXzxXrhFjqgqmuXJto2mJp4nnllAhDE+rNwf8NwhA+fXtOwvvnYPYTG4gs
27
+ kbp0oaF0nKSHJXThZqL9T4tf/xVgAN4NylGysIuoAAAAAElFTkSuQmCC">
28
+ </image>
29
+ </svg>
admin/images/stars.gif ADDED
Binary file
admin/images/success.png ADDED
Binary file
admin/images/support-1.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="66" height="63" viewBox="0 0 66 63" id="img" fill="currentColor"><defs><filter id="filter" x="282" y="1117" width="66" height="63" filterUnits="userSpaceOnUse"><feOffset result="offset" dx="0.877" dy="1.798" in="SourceAlpha"></feOffset> <feGaussianBlur result="blur" stdDeviation="2.646"></feGaussianBlur> <feFlood result="flood" flood-opacity="0.08"></feFlood> <feComposite result="composite" operator="in" in2="blur"></feComposite> <feBlend result="blend" in="SourceGraphic"></feBlend></filter></defs> <path d="M287.648,1146.81a8.609,8.609,0,0,1,2.508-4.62,8.057,8.057,0,0,1,4.883-2.07,18.346,18.346,0,0,1,6.867-14.18,18.746,18.746,0,0,1,30.555,14.15c3.413,0.47,5.849,2.18,6.92,5.49,1.545,4.78-.944,9.62-5.631,10.65a22.243,22.243,0,0,1-5.3.24,1.63,1.63,0,0,1-1.654-1.82c0-4.21-.008-8.43,0-12.64a1.733,1.733,0,0,1,1.834-1.89c0.571-.04,1.146-0.01,1.871-0.01-0.2-5.65-2.38-10.2-6.983-13.39-5.706-3.95-11.811-4.29-17.974-1.06a16.06,16.06,0,0,0-8.565,14.37c0.545,0.03,1.1.05,1.661,0.08a1.8,1.8,0,0,1,1.979,1.99q0.016,6.21,0,12.42c0,1.32-.339,1.62-2.6,2.25,1.727,2.21,3.238,4.46,5.079,6.41a9.307,9.307,0,0,0,6.5,2.54,1.182,1.182,0,0,0,1.327-.75,3.647,3.647,0,0,1,6.9,1.84,3.632,3.632,0,0,1-3.028,3.4,3.566,3.566,0,0,1-3.784-1.82,1.492,1.492,0,0,0-1.5-.88,12.481,12.481,0,0,1-10.256-5.88c-0.953-1.47-1.86-2.96-2.836-4.42a1.564,1.564,0,0,0-.943-0.67c-4.366-.31-6.85-2.69-7.834-6.77v-2.96Zm11.085,7.9v-12.82c-3.06-.14-6.092-0.37-8.085,2.48a6.574,6.574,0,0,0-.286,7.4C292.2,1155.01,295.422,1154.89,298.733,1154.71Zm29.984-12.82v12.82c3.216,0.18,6.372.31,8.274-2.81a6.56,6.56,0,0,0-.073-7.31C334.993,1141.55,331.875,1141.72,328.717,1141.89Zm-14.54,22.9a1.875,1.875,0,0,0-1.9,1.76,1.9,1.9,0,0,0,3.8.11A1.88,1.88,0,0,0,314.177,1164.79Zm-0.237-38.49a14.141,14.141,0,0,1,2.336.31,1.521,1.521,0,0,1,.978.99c0.052,0.76-.641.87-1.25,0.75a10.235,10.235,0,0,0-6.34.55,31.447,31.447,0,0,0-4.574,2.98c-0.483.34-.88,0.87-1.468,0.32a1,1,0,0,1,.164-1.58A13.968,13.968,0,0,1,313.94,1126.3Zm5.46,2.35a1.767,1.767,0,0,1,.847-0.48,11.267,11.267,0,0,1,1.675,1.33,2.736,2.736,0,0,1-.939.8A1.753,1.753,0,0,1,319.4,1128.65Z" transform="translate(-282 -1117)" class="cls-1"></path></svg>
admin/images/support-2.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="69" height="47" viewBox="0 0 69 47" id="img" fill="currentColor"><defs><filter id="filter" x="572" y="1122" width="69" height="47" filterUnits="userSpaceOnUse"><feOffset result="offset" dx="0.877" dy="1.798" in="SourceAlpha"></feOffset> <feGaussianBlur result="blur" stdDeviation="2.646"></feGaussianBlur> <feFlood result="flood" flood-opacity="0.08"></feFlood> <feComposite result="composite" operator="in" in2="blur"></feComposite> <feBlend result="blend" in="SourceGraphic"></feBlend></filter></defs> <path d="M632.188,1134.43c-0.675,2.31-2.013,3.88-4.583,4.22a1.628,1.628,0,0,0-.733,1.07c-1.34,4.66-2.642,9.33-3.955,14-0.087.3-.187,0.61-0.287,0.93H585.87c-0.861-3.64-1.719-7.25-2.574-10.87-0.194-.82-0.391-1.64-0.569-2.46-0.341-1.58-.622-2.86-2.7-3.49-2.682-.8-3.551-4.21-2.192-6.67a5.049,5.049,0,0,1,6.85-1.94,4.908,4.908,0,0,1,1.756,6.9c-0.188.3-.409,0.58-0.61,0.87,5.38,6.57,11.5,5.92,15.7-1.64-2.4-3.11-2.438-5.79-.1-7.74a5.075,5.075,0,0,1,6.852.31c2.1,2.2,1.859,4.91-.907,7.79a50.3,50.3,0,0,0,3.7,4.31,5.9,5.9,0,0,0,6.483,1.02,17.2,17.2,0,0,0,5.84-4.01,5.072,5.072,0,0,1-1.112-4.36,5,5,0,0,1,9.7-.11,2.417,2.417,0,0,0,.209.42v1.45Zm-7.453,4.78a57.321,57.321,0,0,1-6.162,3.69,7.834,7.834,0,0,1-9.493-1.75,43.1,43.1,0,0,1-3.8-5.26,10.627,10.627,0,0,1-.63-1.15c-1.274,1.77-2.369,3.57-3.736,5.14-4.079,4.67-9.083,5.06-13.964,1.2-0.8-.63-1.562-1.32-2.556-2.16,1.074,4.56,2.07,8.85,3.125,13.12a1.224,1.224,0,0,0,.94.46c1.464,0.05,2.931.02,4.4,0.02q13.5,0,26.993-.01c0.529,0,1.117.2,1.344-.63C622.363,1147.59,623.581,1143.32,624.735,1139.21Zm-42.493-8.42a2.758,2.758,0,0,0-2.845,2.67,2.8,2.8,0,1,0,5.609.07A2.727,2.727,0,0,0,582.242,1130.79Zm42.124,2.97a2.85,2.85,0,0,0,2.829,2.74,2.9,2.9,0,0,0,2.778-2.82,2.792,2.792,0,0,0-2.855-2.69A2.734,2.734,0,0,0,624.366,1133.76Zm-19.608-5.13a2.746,2.746,0,0,0-2.877,2.63,3.038,3.038,0,0,0,2.777,2.98,3.133,3.133,0,0,0,2.832-2.82A2.755,2.755,0,0,0,604.758,1128.63Zm-0.569,30.46c-5.5,0-11-.01-16.492.01-0.845,0-1.693-.09-1.645-1.11,0.045-.94.859-1.1,1.72-1.1,11,0.01,21.989,0,32.984.04a2.159,2.159,0,0,1,1.609.85c0.4,0.75-.264,1.3-1.44,1.31H604.189Z" transform="translate(-572 -1122)" class="cls-1"></path></svg>
admin/images/support-3.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70" height="56" viewBox="0 0 70 56" id="img" fill="currentColor"><defs><filter id="filter" x="870" y="1118" width="70" height="56" filterUnits="userSpaceOnUse"><feOffset result="offset" dx="0.877" dy="1.798" in="SourceAlpha"></feOffset> <feGaussianBlur result="blur" stdDeviation="2.646"></feGaussianBlur> <feFlood result="flood" flood-opacity="0.08"></feFlood> <feComposite result="composite" operator="in" in2="blur"></feComposite> <feBlend result="blend" in="SourceGraphic"></feBlend></filter></defs> <path d="M929.12,1132.08a1.422,1.422,0,0,0-1.238.55c-0.331.32-.667,0.63-1,0.95a29.832,29.832,0,0,0-2.774,2.84,3.443,3.443,0,0,1-4.386,1.1,3.314,3.314,0,0,1-1.7-2.4,2.5,2.5,0,0,1,.444-2.33c0.8-.81,1.608-1.61,2.416-2.41,0.774-.76,1.548-1.53,2.316-2.3a1.094,1.094,0,0,0-.559-2.09l-0.853-.24c-1.38-.38-2.807-0.78-4.223-1.04a1.981,1.981,0,0,0-1.449.33c-2.48,2.33-4.938,4.78-7.308,7.26a2.016,2.016,0,0,0-.37,1.46,19.146,19.146,0,0,0,.577,2.4c0.133,0.47.271,0.95,0.387,1.43a1.808,1.808,0,0,1-.122,1.44c-0.513.69-1.067,1.33-1.654,2.01-0.217.25-.439,0.51-0.663,0.77l-0.359.42-1.768-1.79c-1-1.02-1.88-1.91-2.764-2.81-0.055-.05-0.11-0.11-0.165-0.16a1.763,1.763,0,0,1-.585-2.27,2.168,2.168,0,0,0-.54-1.08,18.126,18.126,0,0,0-1.7-1.64c-0.279-.25-0.569-0.51-0.865-0.78l-0.585-.54,0.743-.29a4.723,4.723,0,0,1,5.089.64c0.962,0.76,1.192.75,2.056-.08,1.118-1.08,2.26-2.21,3.393-3.36,0.818-.83.816-1.25-0.01-2.05a12.424,12.424,0,0,0-16.071-.74c-2.391,2-4.636,4.27-6.807,6.47-0.842.86-1.713,1.74-2.582,2.59a1,1,0,0,0,0,1.56c0.177,0.2.365,0.4,0.564,0.61,0.1,0.1.192,0.2,0.291,0.31l0.316,0.34-1.825,1.96-0.37-.31c-0.1-.08-0.185-0.16-0.264-0.22-0.16-.13-0.291-0.24-0.415-0.36-1.021-.94-1.276-0.94-2.27.04l-0.384.38c-0.992.97-2.019,1.97-3,2.99-0.79.81-.664,1.2-0.081,1.79,2.614,2.63,5.284,5.26,7.866,7.8a1.065,1.065,0,0,0,1.728-.03c1.2-1.16,2.478-2.42,3.743-3.72a1.054,1.054,0,0,0-.008-1.72c-0.2-.2-0.385-0.4-0.51-0.53l-0.38-.41,1.638-2.24,0.418,0.38a5.633,5.633,0,0,0,1.618,1.22,2.488,2.488,0,0,0,1.3-.57l0.333-.2,5.715,5.44-2.243,2.22c-1.489,1.47-2.979,2.95-4.471,4.42a5.4,5.4,0,0,0-1.778,3.63,5.279,5.279,0,0,0,9.022,3.99c1.549-1.5,3.04-2.99,4.619-4.57q1.012-1.02,2.039-2.04l0.358-.36,2.438,2.42c1.71,1.7,3.4,3.39,5.1,5.06,0.795,0.79,1.223.8,2,.05,1.62-1.58,3.241-3.19,4.818-4.79,0.845-.86.846-1.23,0.006-2.08-1.139-1.16-2.308-2.33-3.473-3.46-0.84-.82-1.686-1.62-2.582-2.47-0.4-.37-0.81-0.76-1.228-1.16l-0.389-.37,0.4-.36c0.27-.25.526-0.47,0.765-0.68a11.96,11.96,0,0,0,1.238-1.18,2.1,2.1,0,0,1,2.512-.68,25.749,25.749,0,0,0,3.582.92,1.649,1.649,0,0,0,1.146-.16c2.147-2.09,4.289-4.25,6.36-6.35l1.75-1.77v-0.73l-0.432-1.48c-0.358-1.23-.715-2.45-1.076-3.68A1.456,1.456,0,0,0,929.12,1132.08Zm-34.9-5.35a10.322,10.322,0,0,1,12.331.01l0.4,0.31-0.453.57c-0.083.1-.152,0.19-0.223,0.27-0.842,1.01-1.822,1.92-3.726.93a4.976,4.976,0,0,0-4.634.12,2.71,2.71,0,0,1-1.247.36,2.32,2.32,0,0,1-1.771-1.05,5.371,5.371,0,0,0-.479-0.52c-0.084-.09-0.168-0.18-0.251-0.26l-0.374-.4Zm-9.464,22.4-6.635-6.63,2.44-2.15,6.452,6.43Zm1.863-6.03-2.339-2.78,1.733-1.73,2.827,2.73Zm5.828-1.56-6.559-6.51,6.274-6.22,6.53,6.51Zm2.988,0.09,3.722-3.7,5.6,5.53-3.854,3.64Zm23.809,16.18-3.707,3.53-6.777-6.69,3.626-3.68Zm8.6-17.84c-0.46.46-.922,0.91-1.384,1.36-1.047,1.03-2.129,2.09-3.153,3.16a1.96,1.96,0,0,1-2.283.58c-0.509-.17-1.03-0.29-1.581-0.42s-1.136-.27-1.7-0.46a1.863,1.863,0,0,0-2.175.61c-5.451,5.46-11.022,10.97-16.41,16.3l-0.473.47a3.558,3.558,0,0,1-2.493,1.12,3.238,3.238,0,0,1-3.141-3.83,5.315,5.315,0,0,1,1.358-2.19c6.333-6.34,11.561-11.52,16.452-16.31,0.893-.87,1.078-1.53.685-2.43a0.967,0.967,0,0,1-.073-0.33l0-.03c-1.48-2.77-.836-5.11,1.969-7.14a10.674,10.674,0,0,0,1.556-1.47c0.234-.25.475-0.51,0.724-0.76,1.686-1.67,1.892-1.7,4.4-.67l0.719,0.29-0.563.53c-0.413.39-.819,0.78-1.22,1.16-0.951.9-1.85,1.76-2.776,2.61a1.67,1.67,0,0,0-.576,2.03,31.312,31.312,0,0,1,1.02,3.66,1.42,1.42,0,0,0,1.238,1.27,34.306,34.306,0,0,1,3.94,1.06,1.444,1.444,0,0,0,1.725-.46c0.9-.94,1.835-1.89,2.738-2.81,0.385-.39.772-0.78,1.161-1.18l0.484-.49,0.326,0.61C929.518,1138,929.476,1138.35,927.847,1139.97Z" transform="translate(-870 -1118)" class="cls-1"></path></svg>
admin/images/thumb.png ADDED
Binary file
admin/images/timemachine.svg ADDED
@@ -0,0 +1 @@
 
1
+ <?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 30 30" xmlns="http://www.w3.org/2000/svg"><circle cx="15" cy="15" r="15" fill="#257671"/><path d="m13.998 10.5-0.0024 5.6844c0 0.2158 0.0857 0.4221 0.2381 0.5744l4.0664 4.0657 1.149-1.1489-3.8285-3.8277 0.0024-5.3479h-1.625z" fill="#fff"/><path d="m15.625 4c-5.7191 0-10.452 4.2474-11.245 9.75h-3.3799l4.0625 4.0625 4.0625-4.0625h-3.1032c0.77732-4.6038 4.7815-8.125 9.6032-8.125 5.3765 0 9.75 4.3735 9.75 9.75 0 5.3765-4.3735 9.75-9.75 9.75-3.0223 0-5.8247-1.3679-7.6886-3.753l-1.2806 0.9997c2.174 2.7819 5.4431 4.3783 8.9692 4.3783 6.2723 0 11.375-5.1035 11.375-11.375 0-6.2714-5.1027-11.375-11.375-11.375z" fill="#fff"/></svg>
admin/images/trash.png ADDED
Binary file
admin/images/unlocked-min.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 19 26"><defs><path id="A" d="M19 13.4c0-1.08-.7-1.8-1.8-1.8h-.8v-.5-3.6c-.01-.6-.03-1.2-.15-1.76-.55-2.53-2.1-4.27-4.55-5.1C9.17-.24 6.83.23 4.8 1.94c-2 1.7-2.57 3.96-2.33 6.48 0 .02.03.04.03.04h2.15V7c.02-2.17 1.7-4.1 3.93-4.5 2.18-.4 4.5.87 5.24 2.92.2.57.3 1.2.33 1.8l.02 4.38H1.67c-1.1 0-1.83.72-1.83 1.8v10.43c0 1.2.7 1.88 1.9 1.88h15.4c1.1 0 1.84-.72 1.84-1.8v-2.7l.01-7.8zm-8.35 5.13c-.27.2-.34.4-.33.7l.01 1.88c0 .58-.37.98-.9.98s-.9-.4-.9-.97v-1.5c.04-.5-.04-.88-.5-1.27-.82-.7-.72-1.97.1-2.68.84-.73 2.07-.63 2.8.23.66.8.54 2-.3 2.63z"/></defs><clipPath id="B"><use xlink:href="#A"/></clipPath><image overflow="visible" clip-path="url(#B)" width="19" height="26" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAaCAIAAADaPfBTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpiVC0rZCALMDGQC0Z1 juoc1Tmqc1QnfXQCBBgAx7IBQEz79mMAAAAASUVORK5CYII="/></svg>
admin/images/upload-min.png ADDED
Binary file
admin/images/upload.svg ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Shape_703_xA0_Зображення_1_"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 97 73"
5
+ enable-background="new 0 0 97 73" xml:space="preserve">
6
+ <image overflow="visible" width="97" height="73" id="Shape_703_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGEAAABJCAYAAAAt+Uj4AAAACXBIWXMAAAsSAAALEgHS3X78AAAA
7
+ GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACF5JREFUeNrsXPlvFVUUvp1SKxUt
8
+ AhUQVFAoWgGR3VKjLCogUkFRQNFEUGJcMOoP+hf4EwZRiBJBSVwiboAsNpiwKBCIRSSACiICKhQE
9
+ 2QLK0vp9znnJ8+X13Tv7PDonObmEztztm3v2+wpUjGnRokUFaMrAV4Pby78vA1+cxs3Ap8HnwCfB
10
+ x8FHwAfBdeC91dXVf8d5nQUx3HgLTWdwD3B3cEuPXTYIGD8K/wJQ6hMQsm8+v/BK8ADwpQEOxZNS
11
+ C94AMP5MQLA3nxs+FDxQREtYxBOyFbwCYPzRJEEQscMv/y5w8wj3gGBsAi8DGMeaDAgAoDWa8SL7
12
+ 40JU3ktETDVc0CAAgBvRTBDLJo70PfjjMC2qgpABGIJmRBytsgyiNTUXQBy5YEAQe/9e8CCXXZyn
13
+ vS/MDTokPsHJtGcuAl8Cvhx8hfgWnTxYWrSi3g5DaReEBMBY8C0OX6Utv02U5g5sxj8uxyYYN4H7
14
+ gkscdkGQ38TYB/IdhJFohjh4hZ7vRvAqP8UB5lGEpp+Yw6UOXqXFNDNIy6kgYAAq5RSY0mbwYiz4
15
+ eIBzIhiDBYxCw9cokl7HvM7mFQhY7HVopoItg8dPgRdgkVtDNBLaopkEbmf4Si3m92HegCAhiOfB
16
+ LQwe3w9+JyxLJGOexWgeBPc0fOV9zPM7v+dhBbCwAnHETADYDZ4VBQAkUfbvgdcZvjIG62sRaxAE
17
+ gLvB5QaP09ycE3WYWSKqn4sxoCNaV6NiCwIA6IBmCvh2g8cZvZwXlKJzAQTDFJ8oO9Stoz5Y61Wx
18
+ 0QkSA+orMrWt4WsUATOw8ENxc5OxHgYSnwO31jxKv2VOpCBgst3ki+/ioo8PsIBNcY1XYG30sp8y
19
+ WBdN1j2hiyOaneBn8c/HwV1dALA1zgCIaPrVUFEP8WvMZoabT4VUDe7tQYQxBPCpyg+qkbXmynNU
20
+ YF9a+WHZWSZfP5oXqZA8ANAgztiJfEAA86TzuNJAlPcPXBwBAKYcn1B2hYPyAMASLGy7yi9aL0ZE
21
+ LuonGcJgQJDY//0O4ivZiDGg+QBgdYCKdJTkqf0+DSyj+VbzWKlICP9BkMDbSA+ynzGgj8CvBBkP
22
+ wjwHiJU20Y8vMgvVmuCFsXuIo+qPiYrOysXpcrIoRhkZU9mOTa8LyZS8Es0z4CL5L1ZN1AQwzkto
23
+ 2hg8ylA3Re428SPqXYEgx/oFw7hPKvbzJQbcFbItz/z0NGVX5KXrHmbCfvJ5LGYEq1yIYeqUtaLk
24
+ HYmjMYYAUGEtAM8OGwChBzIASH1QE7BppT6PtcPFOzRkWMrzMuZTpROVVhriXZVZSJd28WvY/I1h
25
+ l4bIPKtyzJMf0CQ8U+jjkLvllLkh+hk8SU9iTi1NTsJwg04ZeHsDm38wopACA2f3aB5j2GGEz1bS
26
+ fo/dsL5qWmOBPyvNIbtG0xFDznODTD0aeO2TDE3m26S+yS/yw8ehvp2aDYjUSTCphFgYVeQzLVHU
27
+ yoHBMZ5hBZ+msEbZpfZeiQbF5Ey9ZUmKr7uBXKxV0RF9gQoX8vgRP/SDWDjTwW/xYwR/A96p7HsR
28
+ Tol669F0Zc0A3g1KH8iriUIJyyno7EHGdwSPVnbmzCsQ52Xjd2bMr514zX0chHdYC3UreHVKHOlS
29
+ kXWYwM8RAcCv5mHlLQM4CP30CmqOLAwDL2V0QNnRV9Ns4TDRcyp1KyYXbY4IAM5tonJWqNUYjUN/
30
+ ZUHOl6la8Ar881Vll2maiMuqFAjaVF5EemCoMisYMKFi0Q9FQU9ajJdZhmZtJT82S3PUGf/4PYJT
31
+ QMfxDp+7bS8RARUCEAxizjVQ3BS3XXWy9ig6PBcyAFRuD6kAaqJA/dF/v5CAOIpmscGjFbqFnggZ
32
+ AEscshYBDjNWLJowiPkIXVS5iw6EsK+aDlfBX6EqEv1QHMJpoFmvKxoo04FQGOIpoL8yOKTheIlk
33
+ XEhjbdP83dKBUBwSALxdM0GFe42ql2QQw9ANOeNtOhBaeUnbGQJQKHqgRIVPo6V8M2j6K9cfdeEK
34
+ ys82hs6HW2KacpewCXXQ+A80JtY4GL8sBDP8tA6Ees2JKA8SBBzXfWj2OTg5lRoQTqLPlSpe1Fwn
35
+ jnSX4m5WCXmlMh0IusR4J79LwZsSSZCuRAfCFoO+RiTb6Zq6af7eYIlM1gWbyoFo72Q/XZGuQu9A
36
+ SiGblCnS3W+T7KkjUdTR4CTsSIGwySDGwfzolCDqPi9QALi3Ywwc0C2WmIk0U5ca9M2T8LRck0oo
37
+ N7GWV1fBwqzcHivNXmdZh0nxLgFgDU1Fss+NnoI7ldkFylXZPGbeYGQSWpewpsn1GAZjBcZyiY8k
38
+ m29fPLwPbJLTrhM18H8QmBFCR+8q++KcSQSVmr8n3mFn6/H+b0108xno5K2dYcr+uR8dMcT9Wapy
39
+ u1mWMMJedMq7BaZRTcaXeE9gAN47rOySEJq9LJlkvc4Zh2s6KuUlQW1YkfJ284jE31Zi4okp0+vB
40
+ 1ypnP6K4Lr2QOuuLvGGJyRLRaoeTay080MMCpyvvtZ+5iNd+J0d4cPhLBl9kesyqESC+VnbRVINK
41
+ yC9iIHReZt4+Zz4BD69FM1/ZxcAJeSMGSmdLJYYyBkGAoNk6U+mjrQk1Tj8o+0pB1sIJo7ISuY8w
42
+ A8wKs7PJnhoTbzQtFBHUqDQx1ugix2qgsHkXq0qUb0myz1npvPgAy03uczj+bWrpdBnA+ErZ5eos
43
+ q2eQqnmy9/8pXtbubnDiwLr+gXAMckYG3CzFACwjYfKH8SVezigVYIqF052/UxmOS/pRDVrccSyv
44
+ TmW9iBrmjpnE5xXiPW5/hd6XX2mXIqc6pY/ERk6Y627Rb7EhK5EgCQgJJSAkICSUgJCAkJDfJmrI
45
+ RDv/cI6/H8u3Bf0rwABF6ayG75IcggAAAABJRU5ErkJggg==">
46
+ </image>
47
+ </svg>
admin/images/warning-grey.png ADDED
Binary file
admin/images/warning-red.png ADDED
Binary file
admin/images/x-face.png ADDED
Binary file
admin/js/backup-migration.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function(t,e){"function"==typeof define&&define.amd?define(["jquery"],function(t){return e(t)}):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(0,function(t){var e={animation:"fade",animationDuration:350,content:null,contentAsHTML:!1,contentCloning:!1,debug:!0,delay:300,delayTouch:[300,500],functionInit:null,functionBefore:null,functionReady:null,functionAfter:null,functionFormat:null,IEmin:6,interactive:!1,multiple:!1,parent:null,plugins:["sideTip"],repositionOnScroll:!1,restoration:"none",selfDestruction:!0,theme:[],timer:0,trackerInterval:500,trackOrigin:!1,trackTooltip:!1,trigger:"hover",triggerClose:{click:!1,mouseleave:!1,originClick:!1,scroll:!1,tap:!1,touchleave:!1},triggerOpen:{click:!1,mouseenter:!1,tap:!1,touchstart:!1},updateAnimation:"rotate",zIndex:9999999},i="undefined"!=typeof window?window:null,o={hasTouchCapability:!(!i||!("ontouchstart"in i||i.DocumentTouch&&i.document instanceof i.DocumentTouch||i.navigator.maxTouchPoints)),hasTransitions:function(){if(!i)return!1;var t=(i.document.body||i.document.documentElement).style,e="transition",o=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof t[e])return!0;e=e.charAt(0).toUpperCase()+e.substr(1);for(var n=0;n<o.length;n++)if("string"==typeof t[o[n]+e])return!0;return!1}(),IE:!1,semVer:"4.2.8",window:i},n=function(){this.__$emitterPrivate=t({}),this.__$emitterPublic=t({}),this.__instancesLatestArr=[],this.__plugins={},this._env=o};function r(t){this.$container,this.constraints=null,this.__$tooltip,this.__init(t)}function s(e,i){var o=!0;return t.each(e,function(t,n){if(void 0===i[t]||e[t]!==i[t])return o=!1,!1}),o}function a(e){var i=e.attr("id"),n=i?o.window.document.getElementById(i):null;return n?n===e[0]:t.contains(o.window.document.body,e[0])}n.prototype={__bridge:function(e,i,o){if(!i[o]){var n=function(){};n.prototype=e;var r=new n;r.__init&&r.__init(i),t.each(e,function(t,e){0!=t.indexOf("__")&&(i[t]||(i[t]=function(){return r[t].apply(r,Array.prototype.slice.apply(arguments))},i[t].bridged=r))}),i[o]=r}return this},__setWindow:function(t){return o.window=t,this},_getRuler:function(t){return new r(t)},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_plugin:function(e){if("string"==typeof e){var i=e,o=null;return i.indexOf(".")>0?o=this.__plugins[i]:t.each(this.__plugins,function(t,e){if(e.name.substring(e.name.length-i.length-1)=="."+i)return o=e,!1}),o}if(e.name.indexOf(".")<0)throw new Error("Plugins must be namespaced");return this.__plugins[e.name]=e,e.core&&this.__bridge(e.core,this,e.name),this},_trigger:function(){var t=Array.prototype.slice.apply(arguments);return"string"==typeof t[0]&&(t[0]={type:t[0]}),this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,t),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,t),this},instances:function(e){var i=[];return t(e||".tooltipstered").each(function(){var e=t(this),o=e.data("tooltipster-ns");o&&t.each(o,function(t,o){i.push(e.data(o))})}),i},instancesLatest:function(){return this.__instancesLatestArr},off:function(){return this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},origins:function(e){return t((e?e+" ":"")+".tooltipstered").toArray()},setDefaults:function(i){return t.extend(e,i),this},triggerHandler:function(){return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},t.tooltipster=new n,t.Tooltipster=function(e,i){this.__callbacks={close:[],open:[]},this.__closingTime,this.__Content,this.__contentBcr,this.__destroyed=!1,this.__$emitterPrivate=t({}),this.__$emitterPublic=t({}),this.__enabled=!0,this.__garbageCollector,this.__Geometry,this.__lastPosition,this.__namespace="tooltipster-"+Math.round(1e6*Math.random()),this.__options,this.__$originParents,this.__pointerIsOverOrigin=!1,this.__previousThemes=[],this.__state="closed",this.__timeouts={close:[],open:null},this.__touchEvents=[],this.__tracker=null,this._$origin,this._$tooltip,this.__init(e,i)},t.Tooltipster.prototype={__init:function(i,n){var r=this;if(r._$origin=t(i),r.__options=t.extend(!0,{},e,n),r.__optionsFormat(),!o.IE||o.IE>=r.__options.IEmin){var s=null;if(void 0===r._$origin.data("tooltipster-initialTitle")&&(void 0===(s=r._$origin.attr("title"))&&(s=null),r._$origin.data("tooltipster-initialTitle",s)),null!==r.__options.content)r.__contentSet(r.__options.content);else{var a,l=r._$origin.attr("data-tooltip-content");l&&(a=t(l)),a&&a[0]?r.__contentSet(a.first()):r.__contentSet(s)}r._$origin.removeAttr("title").addClass("tooltipstered"),r.__prepareOrigin(),r.__prepareGC(),t.each(r.__options.plugins,function(t,e){r._plug(e)}),o.hasTouchCapability&&t(o.window.document.body).on("touchmove."+r.__namespace+"-triggerOpen",function(t){r._touchRecordEvent(t)}),r._on("created",function(){r.__prepareTooltip()})._on("repositioned",function(t){r.__lastPosition=t.position})}else r.__options.disabled=!0},__contentInsert:function(){var t=this._$tooltip.find(".tooltipster-content"),e=this.__Content;return this._trigger({type:"format",content:this.__Content,format:function(t){e=t}}),this.__options.functionFormat&&(e=this.__options.functionFormat.call(this,this,{origin:this._$origin[0]},this.__Content)),"string"!=typeof e||this.__options.contentAsHTML?t.empty().append(e):t.text(e),this},__contentSet:function(e){return e instanceof t&&this.__options.contentCloning&&(e=e.clone(!0)),this.__Content=e,this._trigger({type:"updated",content:e}),this},__destroyError:function(){throw new Error("This tooltip has been destroyed and cannot execute your method call.")},__geometry:function(){var e=this._$origin,i=this._$origin.is("area");if(i){var n=this._$origin.parent().attr("name");e=t('img[usemap="#'+n+'"]')}var r=e[0].getBoundingClientRect(),s=t(o.window.document),a=t(o.window),l=e,c={available:{document:null,window:null},document:{size:{height:s.height(),width:s.width()}},window:{scroll:{left:o.window.scrollX||o.window.document.documentElement.scrollLeft,top:o.window.scrollY||o.window.document.documentElement.scrollTop},size:{height:a.height(),width:a.width()}},origin:{fixedLineage:!1,offset:{},size:{height:r.bottom-r.top,width:r.right-r.left},usemapImage:i?e[0]:null,windowOffset:{bottom:r.bottom,left:r.left,right:r.right,top:r.top}}};if(i){var p=this._$origin.attr("shape"),u=this._$origin.attr("coords");if(u&&(u=u.split(","),t.map(u,function(t,e){u[e]=parseInt(t)})),"default"!=p)switch(p){case"circle":var d=u[0],_=u[1],f=u[2],h=_-f,m=d-f;c.origin.size.height=2*f,c.origin.size.width=c.origin.size.height,c.origin.windowOffset.left+=m,c.origin.windowOffset.top+=h;break;case"rect":var g=u[0],b=u[1],w=u[2],v=u[3];c.origin.size.height=v-b,c.origin.size.width=w-g,c.origin.windowOffset.left+=g,c.origin.windowOffset.top+=b;break;case"poly":for(var y=0,k=0,x=0,$=0,C="even",T=0;T<u.length;T++){var O=u[T];"even"==C?(O>x&&(x=O,0===T&&(y=x)),O<y&&(y=O),C="odd"):(O>$&&($=O,1==T&&(k=$)),O<k&&(k=O),C="even")}c.origin.size.height=$-k,c.origin.size.width=x-y,c.origin.windowOffset.left+=y,c.origin.windowOffset.top+=k}}for(this._trigger({type:"geometry",edit:function(t){c.origin.size.height=t.height,c.origin.windowOffset.left=t.left,c.origin.windowOffset.top=t.top,c.origin.size.width=t.width},geometry:{height:c.origin.size.height,left:c.origin.windowOffset.left,top:c.origin.windowOffset.top,width:c.origin.size.width}}),c.origin.windowOffset.right=c.origin.windowOffset.left+c.origin.size.width,c.origin.windowOffset.bottom=c.origin.windowOffset.top+c.origin.size.height,c.origin.offset.left=c.origin.windowOffset.left+c.window.scroll.left,c.origin.offset.top=c.origin.windowOffset.top+c.window.scroll.top,c.origin.offset.bottom=c.origin.offset.top+c.origin.size.height,c.origin.offset.right=c.origin.offset.left+c.origin.size.width,c.available.document={bottom:{height:c.document.size.height-c.origin.offset.bottom,width:c.document.size.width},left:{height:c.document.size.height,width:c.origin.offset.left},right:{height:c.document.size.height,width:c.document.size.width-c.origin.offset.right},top:{height:c.origin.offset.top,width:c.document.size.width}},c.available.window={bottom:{height:Math.max(c.window.size.height-Math.max(c.origin.windowOffset.bottom,0),0),width:c.window.size.width},left:{height:c.window.size.height,width:Math.max(c.origin.windowOffset.left,0)},right:{height:c.window.size.height,width:Math.max(c.window.size.width-Math.max(c.origin.windowOffset.right,0),0)},top:{height:Math.max(c.origin.windowOffset.top,0),width:c.window.size.width}};"html"!=l[0].tagName.toLowerCase();){if("fixed"==l.css("position")){c.origin.fixedLineage=!0;break}l=l.parent()}return c},__optionsFormat:function(){return"number"==typeof this.__options.animationDuration&&(this.__options.animationDuration=[this.__options.animationDuration,this.__options.animationDuration]),"number"==typeof this.__options.delay&&(this.__options.delay=[this.__options.delay,this.__options.delay]),"number"==typeof this.__options.delayTouch&&(this.__options.delayTouch=[this.__options.delayTouch,this.__options.delayTouch]),"string"==typeof this.__options.theme&&(this.__options.theme=[this.__options.theme]),null===this.__options.parent?this.__options.parent=t(o.window.document.body):"string"==typeof this.__options.parent&&(this.__options.parent=t(this.__options.parent)),"hover"==this.__options.trigger?(this.__options.triggerOpen={mouseenter:!0,touchstart:!0},this.__options.triggerClose={mouseleave:!0,originClick:!0,touchleave:!0}):"click"==this.__options.trigger&&(this.__options.triggerOpen={click:!0,tap:!0},this.__options.triggerClose={click:!0,tap:!0}),this._trigger("options"),this},__prepareGC:function(){var e=this;return e.__options.selfDestruction?e.__garbageCollector=setInterval(function(){var i=(new Date).getTime();e.__touchEvents=t.grep(e.__touchEvents,function(t,e){return i-t.time>6e4}),a(e._$origin)||e.close(function(){e.destroy()})},2e4):clearInterval(e.__garbageCollector),e},__prepareOrigin:function(){var t=this;if(t._$origin.off("."+t.__namespace+"-triggerOpen"),o.hasTouchCapability&&t._$origin.on("touchstart."+t.__namespace+"-triggerOpen touchend."+t.__namespace+"-triggerOpen touchcancel."+t.__namespace+"-triggerOpen",function(e){t._touchRecordEvent(e)}),t.__options.triggerOpen.click||t.__options.triggerOpen.tap&&o.hasTouchCapability){var e="";t.__options.triggerOpen.click&&(e+="click."+t.__namespace+"-triggerOpen "),t.__options.triggerOpen.tap&&o.hasTouchCapability&&(e+="touchend."+t.__namespace+"-triggerOpen"),t._$origin.on(e,function(e){t._touchIsMeaningfulEvent(e)&&t._open(e)})}if(t.__options.triggerOpen.mouseenter||t.__options.triggerOpen.touchstart&&o.hasTouchCapability){e="";t.__options.triggerOpen.mouseenter&&(e+="mouseenter."+t.__namespace+"-triggerOpen "),t.__options.triggerOpen.touchstart&&o.hasTouchCapability&&(e+="touchstart."+t.__namespace+"-triggerOpen"),t._$origin.on(e,function(e){!t._touchIsTouchEvent(e)&&t._touchIsEmulatedEvent(e)||(t.__pointerIsOverOrigin=!0,t._openShortly(e))})}if(t.__options.triggerClose.mouseleave||t.__options.triggerClose.touchleave&&o.hasTouchCapability){e="";t.__options.triggerClose.mouseleave&&(e+="mouseleave."+t.__namespace+"-triggerOpen "),t.__options.triggerClose.touchleave&&o.hasTouchCapability&&(e+="touchend."+t.__namespace+"-triggerOpen touchcancel."+t.__namespace+"-triggerOpen"),t._$origin.on(e,function(e){t._touchIsMeaningfulEvent(e)&&(t.__pointerIsOverOrigin=!1)})}return t},__prepareTooltip:function(){var e=this,i=e.__options.interactive?"auto":"";return e._$tooltip.attr("id",e.__namespace).css({"pointer-events":i,zIndex:e.__options.zIndex}),t.each(e.__previousThemes,function(t,i){e._$tooltip.removeClass(i)}),t.each(e.__options.theme,function(t,i){e._$tooltip.addClass(i)}),e.__previousThemes=t.merge([],e.__options.theme),e},__scrollHandler:function(e){if(this.__options.triggerClose.scroll)this._close(e);else if(a(this._$origin)&&a(this._$tooltip)){var i=null;if(e.target===o.window.document)this.__Geometry.origin.fixedLineage||this.__options.repositionOnScroll&&this.reposition(e);else{i=this.__geometry();var n=!1;if("fixed"!=this._$origin.css("position")&&this.__$originParents.each(function(e,o){var r=t(o),s=r.css("overflow-x"),a=r.css("overflow-y");if("visible"!=s||"visible"!=a){var l=o.getBoundingClientRect();if("visible"!=s&&(i.origin.windowOffset.left<l.left||i.origin.windowOffset.right>l.right))return n=!0,!1;if("visible"!=a&&(i.origin.windowOffset.top<l.top||i.origin.windowOffset.bottom>l.bottom))return n=!0,!1}if("fixed"==r.css("position"))return!1}),n)this._$tooltip.css("visibility","hidden");else if(this._$tooltip.css("visibility","visible"),this.__options.repositionOnScroll)this.reposition(e);else{var r=i.origin.offset.left-this.__Geometry.origin.offset.left,s=i.origin.offset.top-this.__Geometry.origin.offset.top;this._$tooltip.css({left:this.__lastPosition.coord.left+r,top:this.__lastPosition.coord.top+s})}}this._trigger({type:"scroll",event:e,geo:i})}return this},__stateSet:function(t){return this.__state=t,this._trigger({type:"state",state:t}),this},__timeoutsClear:function(){return clearTimeout(this.__timeouts.open),this.__timeouts.open=null,t.each(this.__timeouts.close,function(t,e){clearTimeout(e)}),this.__timeouts.close=[],this},__trackerStart:function(){var t=this,e=t._$tooltip.find(".tooltipster-content");return t.__options.trackTooltip&&(t.__contentBcr=e[0].getBoundingClientRect()),t.__tracker=setInterval(function(){if(a(t._$origin)&&a(t._$tooltip)){if(t.__options.trackOrigin){var i=t.__geometry(),o=!1;s(i.origin.size,t.__Geometry.origin.size)&&(t.__Geometry.origin.fixedLineage?s(i.origin.windowOffset,t.__Geometry.origin.windowOffset)&&(o=!0):s(i.origin.offset,t.__Geometry.origin.offset)&&(o=!0)),o||(t.__options.triggerClose.mouseleave?t._close():t.reposition())}if(t.__options.trackTooltip){var n=e[0].getBoundingClientRect();n.height===t.__contentBcr.height&&n.width===t.__contentBcr.width||(t.reposition(),t.__contentBcr=n)}}else t._close()},t.__options.trackerInterval),t},_close:function(e,i,n){var r=this,s=!0;if(r._trigger({type:"close",event:e,stop:function(){s=!1}}),s||n){i&&r.__callbacks.close.push(i),r.__callbacks.open=[],r.__timeoutsClear();var a=function(){t.each(r.__callbacks.close,function(t,i){i.call(r,r,{event:e,origin:r._$origin[0]})}),r.__callbacks.close=[]};if("closed"!=r.__state){var l=!0,c=(new Date).getTime()+r.__options.animationDuration[1];if("disappearing"==r.__state&&c>r.__closingTime&&r.__options.animationDuration[1]>0&&(l=!1),l){r.__closingTime=c,"disappearing"!=r.__state&&r.__stateSet("disappearing");var p=function(){clearInterval(r.__tracker),r._trigger({type:"closing",event:e}),r._$tooltip.off("."+r.__namespace+"-triggerClose").removeClass("tooltipster-dying"),t(o.window).off("."+r.__namespace+"-triggerClose"),r.__$originParents.each(function(e,i){t(i).off("scroll."+r.__namespace+"-triggerClose")}),r.__$originParents=null,t(o.window.document.body).off("."+r.__namespace+"-triggerClose"),r._$origin.off("."+r.__namespace+"-triggerClose"),r._off("dismissable"),r.__stateSet("closed"),r._trigger({type:"after",event:e}),r.__options.functionAfter&&r.__options.functionAfter.call(r,r,{event:e,origin:r._$origin[0]}),a()};o.hasTransitions?(r._$tooltip.css({"-moz-animation-duration":r.__options.animationDuration[1]+"ms","-ms-animation-duration":r.__options.animationDuration[1]+"ms","-o-animation-duration":r.__options.animationDuration[1]+"ms","-webkit-animation-duration":r.__options.animationDuration[1]+"ms","animation-duration":r.__options.animationDuration[1]+"ms","transition-duration":r.__options.animationDuration[1]+"ms"}),r._$tooltip.clearQueue().removeClass("tooltipster-show").addClass("tooltipster-dying"),r.__options.animationDuration[1]>0&&r._$tooltip.delay(r.__options.animationDuration[1]),r._$tooltip.queue(p)):r._$tooltip.stop().fadeOut(r.__options.animationDuration[1],p)}}else a()}return r},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_open:function(e,i){var n=this;if(!n.__destroying&&a(n._$origin)&&n.__enabled){var r=!0;if("closed"==n.__state&&(n._trigger({type:"before",event:e,stop:function(){r=!1}}),r&&n.__options.functionBefore&&(r=n.__options.functionBefore.call(n,n,{event:e,origin:n._$origin[0]}))),!1!==r&&null!==n.__Content){i&&n.__callbacks.open.push(i),n.__callbacks.close=[],n.__timeoutsClear();var s,l=function(){"stable"!=n.__state&&n.__stateSet("stable"),t.each(n.__callbacks.open,function(t,e){e.call(n,n,{origin:n._$origin[0],tooltip:n._$tooltip[0]})}),n.__callbacks.open=[]};if("closed"!==n.__state)s=0,"disappearing"===n.__state?(n.__stateSet("appearing"),o.hasTransitions?(n._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"),n.__options.animationDuration[0]>0&&n._$tooltip.delay(n.__options.animationDuration[0]),n._$tooltip.queue(l)):n._$tooltip.stop().fadeIn(l)):"stable"==n.__state&&l();else{if(n.__stateSet("appearing"),s=n.__options.animationDuration[0],n.__contentInsert(),n.reposition(e,!0),o.hasTransitions?(n._$tooltip.addClass("tooltipster-"+n.__options.animation).addClass("tooltipster-initial").css({"-moz-animation-duration":n.__options.animationDuration[0]+"ms","-ms-animation-duration":n.__options.animationDuration[0]+"ms","-o-animation-duration":n.__options.animationDuration[0]+"ms","-webkit-animation-duration":n.__options.animationDuration[0]+"ms","animation-duration":n.__options.animationDuration[0]+"ms","transition-duration":n.__options.animationDuration[0]+"ms"}),setTimeout(function(){"closed"!=n.__state&&(n._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"),n.__options.animationDuration[0]>0&&n._$tooltip.delay(n.__options.animationDuration[0]),n._$tooltip.queue(l))},0)):n._$tooltip.css("display","none").fadeIn(n.__options.animationDuration[0],l),n.__trackerStart(),t(o.window).on("resize."+n.__namespace+"-triggerClose",function(e){var i=t(document.activeElement);(i.is("input")||i.is("textarea"))&&t.contains(n._$tooltip[0],i[0])||n.reposition(e)}).on("scroll."+n.__namespace+"-triggerClose",function(t){n.__scrollHandler(t)}),n.__$originParents=n._$origin.parents(),n.__$originParents.each(function(e,i){t(i).on("scroll."+n.__namespace+"-triggerClose",function(t){n.__scrollHandler(t)})}),n.__options.triggerClose.mouseleave||n.__options.triggerClose.touchleave&&o.hasTouchCapability){n._on("dismissable",function(t){t.dismissable?t.delay?(d=setTimeout(function(){n._close(t.event)},t.delay),n.__timeouts.close.push(d)):n._close(t):clearTimeout(d)});var c=n._$origin,p="",u="",d=null;n.__options.interactive&&(c=c.add(n._$tooltip)),n.__options.triggerClose.mouseleave&&(p+="mouseenter."+n.__namespace+"-triggerClose ",u+="mouseleave."+n.__namespace+"-triggerClose "),n.__options.triggerClose.touchleave&&o.hasTouchCapability&&(p+="touchstart."+n.__namespace+"-triggerClose",u+="touchend."+n.__namespace+"-triggerClose touchcancel."+n.__namespace+"-triggerClose"),c.on(u,function(t){if(n._touchIsTouchEvent(t)||!n._touchIsEmulatedEvent(t)){var e="mouseleave"==t.type?n.__options.delay:n.__options.delayTouch;n._trigger({delay:e[1],dismissable:!0,event:t,type:"dismissable"})}}).on(p,function(t){!n._touchIsTouchEvent(t)&&n._touchIsEmulatedEvent(t)||n._trigger({dismissable:!1,event:t,type:"dismissable"})})}n.__options.triggerClose.originClick&&n._$origin.on("click."+n.__namespace+"-triggerClose",function(t){n._touchIsTouchEvent(t)||n._touchIsEmulatedEvent(t)||n._close(t)}),(n.__options.triggerClose.click||n.__options.triggerClose.tap&&o.hasTouchCapability)&&setTimeout(function(){if("closed"!=n.__state){var e="",i=t(o.window.document.body);n.__options.triggerClose.click&&(e+="click."+n.__namespace+"-triggerClose "),n.__options.triggerClose.tap&&o.hasTouchCapability&&(e+="touchend."+n.__namespace+"-triggerClose"),i.on(e,function(e){n._touchIsMeaningfulEvent(e)&&(n._touchRecordEvent(e),n.__options.interactive&&t.contains(n._$tooltip[0],e.target)||n._close(e))}),n.__options.triggerClose.tap&&o.hasTouchCapability&&i.on("touchstart."+n.__namespace+"-triggerClose",function(t){n._touchRecordEvent(t)})}},0),n._trigger("ready"),n.__options.functionReady&&n.__options.functionReady.call(n,n,{origin:n._$origin[0],tooltip:n._$tooltip[0]})}if(n.__options.timer>0){d=setTimeout(function(){n._close()},n.__options.timer+s);n.__timeouts.close.push(d)}}}return n},_openShortly:function(t){var e=this,i=!0;if("stable"!=e.__state&&"appearing"!=e.__state&&!e.__timeouts.open&&(e._trigger({type:"start",event:t,stop:function(){i=!1}}),i)){var o=0==t.type.indexOf("touch")?e.__options.delayTouch:e.__options.delay;o[0]?e.__timeouts.open=setTimeout(function(){e.__timeouts.open=null,e.__pointerIsOverOrigin&&e._touchIsMeaningfulEvent(t)?(e._trigger("startend"),e._open(t)):e._trigger("startcancel")},o[0]):(e._trigger("startend"),e._open(t))}return e},_optionsExtract:function(e,i){var o=this,n=t.extend(!0,{},i),r=o.__options[e];return r||(r={},t.each(i,function(t,e){var i=o.__options[t];void 0!==i&&(r[t]=i)})),t.each(n,function(e,i){void 0!==r[e]&&("object"!=typeof i||i instanceof Array||null==i||"object"!=typeof r[e]||r[e]instanceof Array||null==r[e]?n[e]=r[e]:t.extend(n[e],r[e]))}),n},_plug:function(e){var i=t.tooltipster._plugin(e);if(!i)throw new Error('The "'+e+'" plugin is not defined');return i.instance&&t.tooltipster.__bridge(i.instance,this,i.name),this},_touchIsEmulatedEvent:function(t){for(var e=!1,i=(new Date).getTime(),o=this.__touchEvents.length-1;o>=0;o--){var n=this.__touchEvents[o];if(!(i-n.time<500))break;n.target===t.target&&(e=!0)}return e},_touchIsMeaningfulEvent:function(t){return this._touchIsTouchEvent(t)&&!this._touchSwiped(t.target)||!this._touchIsTouchEvent(t)&&!this._touchIsEmulatedEvent(t)},_touchIsTouchEvent:function(t){return 0==t.type.indexOf("touch")},_touchRecordEvent:function(t){return this._touchIsTouchEvent(t)&&(t.time=(new Date).getTime(),this.__touchEvents.push(t)),this},_touchSwiped:function(t){for(var e=!1,i=this.__touchEvents.length-1;i>=0;i--){var o=this.__touchEvents[i];if("touchmove"==o.type){e=!0;break}if("touchstart"==o.type&&t===o.target)break}return e},_trigger:function(){var e=Array.prototype.slice.apply(arguments);return"string"==typeof e[0]&&(e[0]={type:e[0]}),e[0].instance=this,e[0].origin=this._$origin?this._$origin[0]:null,e[0].tooltip=this._$tooltip?this._$tooltip[0]:null,this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,e),t.tooltipster._trigger.apply(t.tooltipster,e),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,e),this},_unplug:function(e){var i=this;if(i[e]){var o=t.tooltipster._plugin(e);o.instance&&t.each(o.instance,function(t,o){i[t]&&i[t].bridged===i[e]&&delete i[t]}),i[e].__destroy&&i[e].__destroy(),delete i[e]}return i},close:function(t){return this.__destroyed?this.__destroyError():this._close(null,t),this},content:function(t){var e=this;if(void 0===t)return e.__Content;if(e.__destroyed)e.__destroyError();else if(e.__contentSet(t),null!==e.__Content){if("closed"!==e.__state&&(e.__contentInsert(),e.reposition(),e.__options.updateAnimation))if(o.hasTransitions){var i=e.__options.updateAnimation;e._$tooltip.addClass("tooltipster-update-"+i),setTimeout(function(){"closed"!=e.__state&&e._$tooltip.removeClass("tooltipster-update-"+i)},1e3)}else e._$tooltip.fadeTo(200,.5,function(){"closed"!=e.__state&&e._$tooltip.fadeTo(200,1)})}else e._close();return e},destroy:function(){var e=this;if(e.__destroyed)e.__destroyError();else{"closed"!=e.__state?e.option("animationDuration",0)._close(null,null,!0):e.__timeoutsClear(),e._trigger("destroy"),e.__destroyed=!0,e._$origin.removeData(e.__namespace).off("."+e.__namespace+"-triggerOpen"),t(o.window.document.body).off("."+e.__namespace+"-triggerOpen");var i=e._$origin.data("tooltipster-ns");if(i)if(1===i.length){var n=null;"previous"==e.__options.restoration?n=e._$origin.data("tooltipster-initialTitle"):"current"==e.__options.restoration&&(n="string"==typeof e.__Content?e.__Content:t("<div></div>").append(e.__Content).html()),n&&e._$origin.attr("title",n),e._$origin.removeClass("tooltipstered"),e._$origin.removeData("tooltipster-ns").removeData("tooltipster-initialTitle")}else i=t.grep(i,function(t,i){return t!==e.__namespace}),e._$origin.data("tooltipster-ns",i);e._trigger("destroyed"),e._off(),e.off(),e.__Content=null,e.__$emitterPrivate=null,e.__$emitterPublic=null,e.__options.parent=null,e._$origin=null,e._$tooltip=null,t.tooltipster.__instancesLatestArr=t.grep(t.tooltipster.__instancesLatestArr,function(t,i){return e!==t}),clearInterval(e.__garbageCollector)}return e},disable:function(){return this.__destroyed?(this.__destroyError(),this):(this._close(),this.__enabled=!1,this)},elementOrigin:function(){if(!this.__destroyed)return this._$origin[0];this.__destroyError()},elementTooltip:function(){return this._$tooltip?this._$tooltip[0]:null},enable:function(){return this.__enabled=!0,this},hide:function(t){return this.close(t)},instance:function(){return this},off:function(){return this.__destroyed||this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},open:function(t){return this.__destroyed?this.__destroyError():this._open(null,t),this},option:function(e,i){return void 0===i?this.__options[e]:(this.__destroyed?this.__destroyError():(this.__options[e]=i,this.__optionsFormat(),t.inArray(e,["trigger","triggerClose","triggerOpen"])>=0&&this.__prepareOrigin(),"selfDestruction"===e&&this.__prepareGC()),this)},reposition:function(t,e){return this.__destroyed?this.__destroyError():"closed"!=this.__state&&a(this._$origin)&&(e||a(this._$tooltip))&&(e||this._$tooltip.detach(),this.__Geometry=this.__geometry(),this._trigger({type:"reposition",event:t,helper:{geo:this.__Geometry}})),this},show:function(t){return this.open(t)},status:function(){return{destroyed:this.__destroyed,enabled:this.__enabled,open:"closed"!==this.__state,state:this.__state}},triggerHandler:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},t.fn.tooltipster=function(){var i=Array.prototype.slice.apply(arguments);if(0===this.length)return this;if("string"==typeof i[0]){var o="#*$~&";return this.each(function(){var e=t(this).data("tooltipster-ns"),n=e?t(this).data(e[0]):null;if(!n)throw new Error("You called Tooltipster's \""+i[0]+'" method on an uninitialized element');if("function"!=typeof n[i[0]])throw new Error('Unknown method "'+i[0]+'"');this.length>1&&"content"==i[0]&&(i[1]instanceof t||"object"==typeof i[1]&&null!=i[1]&&i[1].tagName)&&!n.__options.contentCloning&&n.__options.debug;var r=n[i[0]](i[1],i[2]);if(r!==n||"instance"===i[0])return o=r,!1}),"#*$~&"!==o?o:this}t.tooltipster.__instancesLatestArr=[];var n=i[0]&&void 0!==i[0].multiple,r=n&&i[0].multiple||!n&&e.multiple,s=i[0]&&void 0!==i[0].content,a=s&&i[0].content||!s&&e.content,l=i[0]&&void 0!==i[0].contentCloning,c=(l&&i[0].contentCloning,i[0]&&void 0!==i[0].debug);c&&i[0].debug;return this.length>1&&(a instanceof t||"object"==typeof a&&null!=a&&a.tagName),this.each(function(){var e=!1,o=t(this),n=o.data("tooltipster-ns"),s=null;n?r&&(e=!0):e=!0,e&&(s=new t.Tooltipster(this,i[0]),n||(n=[]),n.push(s.__namespace),o.data("tooltipster-ns",n),o.data(s.__namespace,s),s.__options.functionInit&&s.__options.functionInit.call(s,s,{origin:this}),s._trigger("init")),t.tooltipster.__instancesLatestArr.push(s)}),this},r.prototype={__init:function(e){this.__$tooltip=e,this.__$tooltip.css({left:0,overflow:"hidden",position:"absolute",top:0}).find(".tooltipster-content").css("overflow","auto"),this.$container=t('<div class="tooltipster-ruler"></div>').append(this.__$tooltip).appendTo(o.window.document.body)},__forceRedraw:function(){var t=this.__$tooltip.parent();this.__$tooltip.detach(),this.__$tooltip.appendTo(t)},constrain:function(t,e){return this.constraints={width:t,height:e},this.__$tooltip.css({display:"block",height:"",overflow:"auto",width:t}),this},destroy:function(){this.__$tooltip.detach().find(".tooltipster-content").css({display:"",overflow:""}),this.$container.remove()},free:function(){return this.constraints=null,this.__$tooltip.css({display:"",height:"",overflow:"visible",width:""}),this},measure:function(){this.__forceRedraw();var t=this.__$tooltip[0].getBoundingClientRect(),e={size:{height:t.height||t.bottom-t.top,width:t.width||t.right-t.left}};if(this.constraints){var i=this.__$tooltip.find(".tooltipster-content"),n=this.__$tooltip.outerHeight(),r=i[0].getBoundingClientRect(),s={height:n<=this.constraints.height,width:t.width<=this.constraints.width&&r.width>=i[0].scrollWidth-1};e.fits=s.height&&s.width}return o.IE&&o.IE<=11&&e.size.width!==o.window.document.documentElement.clientWidth&&(e.size.width=Math.ceil(e.size.width)+1),e}};var l=navigator.userAgent.toLowerCase();-1!=l.indexOf("msie")?o.IE=parseInt(l.split("msie")[1]):-1!==l.toLowerCase().indexOf("trident")&&-1!==l.indexOf(" rv:11")?o.IE=11:-1!=l.toLowerCase().indexOf("edge/")&&(o.IE=parseInt(l.toLowerCase().split("edge/")[1])),t.tooltipster._plugin({name:"tooltipster.sideTip",instance:{__defaults:function(){return{arrow:!0,distance:6,functionPosition:null,maxWidth:null,minIntersection:16,minWidth:0,position:null,side:"top",viewportAware:!0}},__init:function(t){var e=this;e.__instance=t,e.__namespace="tooltipster-sideTip-"+Math.round(1e6*Math.random()),e.__previousState="closed",e.__options,e.__optionsFormat(),e.__instance._on("state."+e.__namespace,function(t){"closed"==t.state?e.__close():"appearing"==t.state&&"closed"==e.__previousState&&e.__create(),e.__previousState=t.state}),e.__instance._on("options."+e.__namespace,function(){e.__optionsFormat()}),e.__instance._on("reposition."+e.__namespace,function(t){e.__reposition(t.event,t.helper)})},__close:function(){this.__instance.content()instanceof t&&this.__instance.content().detach(),this.__instance._$tooltip.remove(),this.__instance._$tooltip=null},__create:function(){var e=t('<div class="tooltipster-base tooltipster-sidetip"><div class="tooltipster-box"><div class="tooltipster-content"></div></div><div class="tooltipster-arrow"><div class="tooltipster-arrow-uncropped"><div class="tooltipster-arrow-border"></div><div class="tooltipster-arrow-background"></div></div></div></div>');this.__options.arrow||e.find(".tooltipster-box").css("margin",0).end().find(".tooltipster-arrow").hide(),this.__options.minWidth&&e.css("min-width",this.__options.minWidth+"px"),this.__options.maxWidth&&e.css("max-width",this.__options.maxWidth+"px"),this.__instance._$tooltip=e,this.__instance._trigger("created")},__destroy:function(){this.__instance._off("."+self.__namespace)},__optionsFormat:function(){if(this.__options=this.__instance._optionsExtract("tooltipster.sideTip",this.__defaults()),this.__options.position&&(this.__options.side=this.__options.position),"object"!=typeof this.__options.distance&&(this.__options.distance=[this.__options.distance]),this.__options.distance.length<4&&(void 0===this.__options.distance[1]&&(this.__options.distance[1]=this.__options.distance[0]),void 0===this.__options.distance[2]&&(this.__options.distance[2]=this.__options.distance[0]),void 0===this.__options.distance[3]&&(this.__options.distance[3]=this.__options.distance[1])),this.__options.distance={top:this.__options.distance[0],right:this.__options.distance[1],bottom:this.__options.distance[2],left:this.__options.distance[3]},"string"==typeof this.__options.side){this.__options.side=[this.__options.side,{top:"bottom",right:"left",bottom:"top",left:"right"}[this.__options.side]],"left"==this.__options.side[0]||"right"==this.__options.side[0]?this.__options.side.push("top","bottom"):this.__options.side.push("right","left")}6===t.tooltipster._env.IE&&!0!==this.__options.arrow&&(this.__options.arrow=!1)},__reposition:function(e,i){var o,n=this,r=n.__targetFind(i),s=[];n.__instance._$tooltip.detach();var a=n.__instance._$tooltip.clone(),l=t.tooltipster._getRuler(a),c=!1,p=n.__instance.option("animation");switch(p&&a.removeClass("tooltipster-"+p),t.each(["window","document"],function(o,p){var u=null;if(n.__instance._trigger({container:p,helper:i,satisfied:c,takeTest:function(t){u=t},results:s,type:"positionTest"}),1==u||0!=u&&0==c&&("window"!=p||n.__options.viewportAware))for(o=0;o<n.__options.side.length;o++){var d={horizontal:0,vertical:0},_=n.__options.side[o];"top"==_||"bottom"==_?d.vertical=n.__options.distance[_]:d.horizontal=n.__options.distance[_],n.__sideChange(a,_),t.each(["natural","constrained"],function(t,o){if(u=null,n.__instance._trigger({container:p,event:e,helper:i,mode:o,results:s,satisfied:c,side:_,takeTest:function(t){u=t},type:"positionTest"}),1==u||0!=u&&0==c){var a={container:p,distance:d,fits:null,mode:o,outerSize:null,side:_,size:null,target:r[_],whole:null},f=("natural"==o?l.free():l.constrain(i.geo.available[p][_].width-d.horizontal,i.geo.available[p][_].height-d.vertical)).measure();if(a.size=f.size,a.outerSize={height:f.size.height+d.vertical,width:f.size.width+d.horizontal},"natural"==o?i.geo.available[p][_].width>=a.outerSize.width&&i.geo.available[p][_].height>=a.outerSize.height?a.fits=!0:a.fits=!1:a.fits=f.fits,"window"==p&&(a.fits?a.whole="top"==_||"bottom"==_?i.geo.origin.windowOffset.right>=n.__options.minIntersection&&i.geo.window.size.width-i.geo.origin.windowOffset.left>=n.__options.minIntersection:i.geo.origin.windowOffset.bottom>=n.__options.minIntersection&&i.geo.window.size.height-i.geo.origin.windowOffset.top>=n.__options.minIntersection:a.whole=!1),s.push(a),a.whole)c=!0;else if("natural"==a.mode&&(a.fits||a.size.width<=i.geo.available[p][_].width))return!1}})}}),n.__instance._trigger({edit:function(t){s=t},event:e,helper:i,results:s,type:"positionTested"}),s.sort(function(t,e){return t.whole&&!e.whole?-1:!t.whole&&e.whole?1:t.whole&&e.whole?(i=n.__options.side.indexOf(t.side))<(o=n.__options.side.indexOf(e.side))?-1:i>o?1:"natural"==t.mode?-1:1:t.fits&&!e.fits?-1:!t.fits&&e.fits?1:t.fits&&e.fits?(i=n.__options.side.indexOf(t.side))<(o=n.__options.side.indexOf(e.side))?-1:i>o?1:"natural"==t.mode?-1:1:"document"==t.container&&"bottom"==t.side&&"natural"==t.mode?-1:1;var i,o}),(o=s[0]).coord={},o.side){case"left":case"right":o.coord.top=Math.floor(o.target-o.size.height/2);break;case"bottom":case"top":o.coord.left=Math.floor(o.target-o.size.width/2)}switch(o.side){case"left":o.coord.left=i.geo.origin.windowOffset.left-o.outerSize.width;break;case"right":o.coord.left=i.geo.origin.windowOffset.right+o.distance.horizontal;break;case"top":o.coord.top=i.geo.origin.windowOffset.top-o.outerSize.height;break;case"bottom":o.coord.top=i.geo.origin.windowOffset.bottom+o.distance.vertical}"window"==o.container?"top"==o.side||"bottom"==o.side?o.coord.left<0?i.geo.origin.windowOffset.right-this.__options.minIntersection>=0?o.coord.left=0:o.coord.left=i.geo.origin.windowOffset.right-this.__options.minIntersection-1:o.coord.left>i.geo.window.size.width-o.size.width&&(i.geo.origin.windowOffset.left+this.__options.minIntersection<=i.geo.window.size.width?o.coord.left=i.geo.window.size.width-o.size.width:o.coord.left=i.geo.origin.windowOffset.left+this.__options.minIntersection+1-o.size.width):o.coord.top<0?i.geo.origin.windowOffset.bottom-this.__options.minIntersection>=0?o.coord.top=0:o.coord.top=i.geo.origin.windowOffset.bottom-this.__options.minIntersection-1:o.coord.top>i.geo.window.size.height-o.size.height&&(i.geo.origin.windowOffset.top+this.__options.minIntersection<=i.geo.window.size.height?o.coord.top=i.geo.window.size.height-o.size.height:o.coord.top=i.geo.origin.windowOffset.top+this.__options.minIntersection+1-o.size.height):(o.coord.left>i.geo.window.size.width-o.size.width&&(o.coord.left=i.geo.window.size.width-o.size.width),o.coord.left<0&&(o.coord.left=0)),n.__sideChange(a,o.side),i.tooltipClone=a[0],i.tooltipParent=n.__instance.option("parent").parent[0],i.mode=o.mode,i.whole=o.whole,i.origin=n.__instance._$origin[0],i.tooltip=n.__instance._$tooltip[0],delete o.container,delete o.fits,delete o.mode,delete o.outerSize,delete o.whole,o.distance=o.distance.horizontal||o.distance.vertical;var u,d,_,f=t.extend(!0,{},o);if(n.__instance._trigger({edit:function(t){o=t},event:e,helper:i,position:f,type:"position"}),n.__options.functionPosition){var h=n.__options.functionPosition.call(n,n.__instance,i,f);h&&(o=h)}l.destroy(),"top"==o.side||"bottom"==o.side?(u={prop:"left",val:o.target-o.coord.left},d=o.size.width-this.__options.minIntersection):(u={prop:"top",val:o.target-o.coord.top},d=o.size.height-this.__options.minIntersection),u.val<this.__options.minIntersection?u.val=this.__options.minIntersection:u.val>d&&(u.val=d),_=i.geo.origin.fixedLineage?i.geo.origin.windowOffset:{left:i.geo.origin.windowOffset.left+i.geo.window.scroll.left,top:i.geo.origin.windowOffset.top+i.geo.window.scroll.top},o.coord={left:_.left+(o.coord.left-i.geo.origin.windowOffset.left),top:_.top+(o.coord.top-i.geo.origin.windowOffset.top)},n.__sideChange(n.__instance._$tooltip,o.side),i.geo.origin.fixedLineage?n.__instance._$tooltip.css("position","fixed"):n.__instance._$tooltip.css("position",""),n.__instance._$tooltip.css({left:o.coord.left,top:o.coord.top,height:o.size.height,width:o.size.width}).find(".tooltipster-arrow").css({left:"",top:""}).css(u.prop,u.val),n.__instance._$tooltip.appendTo(n.__instance.option("parent")),n.__instance._trigger({type:"repositioned",event:e,position:o})},__sideChange:function(t,e){t.removeClass("tooltipster-bottom").removeClass("tooltipster-left").removeClass("tooltipster-right").removeClass("tooltipster-top").addClass("tooltipster-"+e)},__targetFind:function(t){var e={},i=this.__instance._$origin[0].getClientRects();i.length>1&&(1==this.__instance._$origin.css("opacity")&&(this.__instance._$origin.css("opacity",.99),i=this.__instance._$origin[0].getClientRects(),this.__instance._$origin.css("opacity",1)));if(i.length<2)e.top=Math.floor(t.geo.origin.windowOffset.left+t.geo.origin.size.width/2),e.bottom=e.top,e.left=Math.floor(t.geo.origin.windowOffset.top+t.geo.origin.size.height/2),e.right=e.left;else{var o=i[0];e.top=Math.floor(o.left+(o.right-o.left)/2),o=i.length>2?i[Math.ceil(i.length/2)-1]:i[0],e.right=Math.floor(o.top+(o.bottom-o.top)/2),o=i[i.length-1],e.bottom=Math.floor(o.left+(o.right-o.left)/2),o=i.length>2?i[Math.ceil((i.length+1)/2)-1]:i[i.length-1],e.left=Math.floor(o.top+(o.bottom-o.top)/2)}return e}}})}),jQuery(document).ready(function($){var fchunker_upload={fchunker:function(t){$.extend(t),$.upId&&$.upUrl&&($.domHtml=$("#"+$.upId).html(),$.upInputId=$.upId+"_input")},fchunker_limitFileSize:function(t,e){for(var i=["KB","MB","GB"],o=e.toUpperCase(),n=0,r=0;r<i.length;r++){var s=o.indexOf(i[r]);if(s>-1){n=parseInt(o.substr(0,s))*Math.pow(1024,r+1);break}}return!(t.size>n)},upErrorMsg:function(t){$.upError=t},upStop:function(t){$.upError=t},upStatus:function(){return!$.upError||("function"==typeof $.upStop&&$.upStop($.upError),!1)},fchunker_getPercent:function(t,e){if(t=parseFloat(t),e=parseFloat(e),isNaN(t)||isNaN(e))return"-";return e<=0?0:Math.round(t/e*1e4)/100},fchunker_upload:function(t,e){$.upError="",$.tempFile=$("#"+$.upInputId)[0].files[0],"file"==t&&($.tempFile=e);var i=$.tempFile;if(!i)return!1;"function"==typeof $.upStart&&$.upStart();var o=i.name,n=o.lastIndexOf("."),r=o.length,s=o.substring(n+1,r);if($.upType&&(uptype=$.upType.split(","),-1==$.inArray(s,uptype)&&($.upError="Type error: Error-"+s)),$.upMaxSize&&($.fchunker_limitFileSize(i,$.upMaxSize+"MB")||($.upError="Error")),0==$.upStatus())return!1;$.taskStart=+new Date,setTimeout("jQuery.fchunker_upload_core()","100")},fchunker_upload_core:function(){var file=$.tempFile;if(!file)return!1;$.upShardSize||($.upShardSize=2);for(var filename=file.name,size=file.size,index1=filename.lastIndexOf("."),index2=filename.length,suffix=filename.substring(index1+1,index2),shardSize=1024*$.upShardSize*1024,succeed=0,shardCount=Math.ceil(size/shardSize),re=[],start,end=0,i=0;i<shardCount;++i)re[i]=[],start=i*shardSize,end=Math.min(size,start+shardSize),re[i].file_data=file.slice(start,end),re[i].file_name=filename,re[i].file_size=size;const URL=$.upUrl;var i2=0,i3=1,fcs=Array(),xhr=new XMLHttpRequest;function ajaxStack(stack){if(0!=$.upStatus()){var form=new FormData;stack[i2]&&(fcs=stack[i2],form.append("file_data",fcs.file_data),form.append("file_name",fcs.file_name),form.append("file_size",fcs.file_size),form.append("file_total",shardCount),form.append("file_index",i3),form.append("taskStart",$.taskStart),form.append("action","backup_migration"),form.append("token","bmi"),form.append("f","upload-backup"),xhr.open("POST",URL,!0),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.setRequestHeader("HTTP_X_REQUESTED_WITH","XMLHttpRequest"),xhr.onload=function(){ajaxStack(stack)},xhr.onreadystatechange=function(){if(0!=$.upStatus()&&4==xhr.readyState&&200==xhr.status){var data=xhr.responseText?eval("("+xhr.responseText+")"):"";++succeed;var cent=$.fchunker_getPercent(succeed,shardCount);"function"==typeof $.upEvent&&$.upEvent(cent),100==cent?setTimeout(function(){"function"==typeof $.upCallBack&&$.upCallBack(data)},500):"function"==typeof $.upCallBack&&$.upCallBack(data)}},xhr.send(form),i2++,i3++,form.delete("file_data"),form.delete("file_name"),form.delete("file_size"),form.delete("file_total"),form.delete("taskStart"),form.delete("file_index"),form.delete("action"),form.delete("token"),form.delete("f"))}}ajaxStack(re),re=null,file=null}};$.extend(fchunker_upload)}),jQuery(window).on("load",function(){setTimeout(function(){jQuery("#bmi").css({opacity:0}),jQuery("#bmi-preload").css({opacity:1}),jQuery("#bmi-preload").animate({opacity:0},150,function(){jQuery("#bmi-preload").remove(),jQuery("#bmi").css({display:"block"}),jQuery.bmi.dropdowns.init(),setTimeout(function(){jQuery("#bmi").animate({opacity:1},350)},100)})},50)}),jQuery(document).ready(function(t){let e=!1;t.extend({bmi:{clipboard:function(e){try{const i=document.createElement("textarea");return i.value=e,i.setAttribute("readonly",""),i.style.position="absolute",i.style.left="-9999px",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i),t.bmi.alert("success",t("#bmi-success-copy").text(),3e3),!0}catch(e){return console.log(e),t.bmi.alert("warning",t("#bmi-failed-copy").text(),3e3),!1}},alert:function(e="default",i="---",o=7e3){t(".bmi-notification-box").length<=0&&t("body").find("#bmi").prepend(t('<div class="bmi-notification-box"></div>')),e="default"==e?"":"success"==e?" is-success":"warning"==e?" is-warning":"error"==e?" is-danger":" is-info";let n=Math.floor(Math.random()*Math.floor(64e3)),r=`<div style="display: none;" id="ntf-${n}" class="bmi-notification${e}">\n <button class="bmi-times-button" onclick="jQuery.bmi.hideAlert(this)">&times;</button>\n <div class="bmi-cf">\n <div class="bmi-left bmi-alert-icon"><div class="bmi-icon-bg"></div></div>\n <div class="bmi-left bmi-alert-msg-title">\n <div class="bmi-title${e}">Backup Migration</div>\n <div>${i}</div>\n </div>\n </div>\n </div>`;t(".bmi-notification-box").prepend(r);let s=t(`#ntf-${n}`);s.css({opacity:0,display:"block"});let a=s.outerWidth();s.outerHeight();s.css({right:"-35vw","font-size":"0px",width:0,padding:0,opacity:"0"}),s.animate({right:"15px",width:a,padding:"1rem 2rem 1rem 1.5rem",opacity:"1"},{duration:200,queue:!1}),s.animate({"font-size":"16px"},{duration:300,queue:!1}),setTimeout(()=>{t(`#ntf-${n}`).css({width:""})},250),setTimeout(()=>{s.animate({"font-size":"0px"},{duration:200,queue:!1}),s.animate({right:"-35vw",height:0,width:0,margin:0,padding:0,opacity:"0"},300,function(){s.remove()})},o)},_msg:function(e){"msg"==e.status&&(void 0===e.level&&(e.level="info"),t.bmi.alert(e.level,e.why,3e3),console.log("Backup-migration: ","["+e.level.toUpperCase()+"]",e.why))},hideAlert:function(e){let i=t(e).parents(".bmi-notification");i.animate({"font-size":"0px"},{duration:200,queue:!1}),i.animate({right:"-35vw",height:0,width:0,margin:0,padding:0,opacity:"0"},300,function(){i.remove()})},modal:function(e=!1){let i=!1;return 0!=e&&(i=document.getElementById(e)),{clearModal:function(){i.querySelectorAll(".customselect").forEach(function(t){t.classList.remove("active")}),i.querySelectorAll('input[type="text"]').forEach(function(t){t.value="",t.setAttribute("value","")})},open:function(e=function(){}){i.classList.add("before-open"),setTimeout(function(){i.classList.add("open"),t("html")[0].style.overflowY="hidden",setTimeout(e,410)},10)},close:function(e=function(){}){i.offsetWidth>0&&i.offsetHeight>0?(i.classList.add("before-close"),setTimeout(function(){i.classList.add("closed"),setTimeout(function(){i.classList.remove("before-open"),i.classList.remove("open"),i.classList.remove("before-close"),i.classList.remove("closed"),t.bmi.modal(i.id).clearModal(),e()},410)},10)):(i.classList.remove("before-open"),i.classList.remove("open"),i.classList.remove("before-close"),i.classList.remove("closed"),e()),t("html")[0].style.overflowY="auto"},closeAll:function(){document.querySelectorAll(".modal").forEach(function(e){t.bmi.modal(e.id).close()}),t("html")[0].style.overflowY="auto"}}},json:function(e){return new Promise(function(i,o){try{return i(JSON.parse(e))}catch(n){if("string"!=typeof e)return o(!1);{let n=t.bmi.reverse(e).indexOf("}");n=0==n?e.length:-n,e=e.slice(e.indexOf("{"),n);try{return i(JSON.parse(e))}catch(t){return o(!1)}}}})},reverse:function(e){return"string"==typeof e?""===e?"":t.bmi.reverse(e.substr(1))+e.charAt(0):e},ajax:function(e,i={}){return new Promise(function(o,n){function r(t,i){i||(i=t),console.log("------- BACKUP MIGRATION ERROR START -------"),!1===t?(console.log("Call: ",e),console.log("Status: ",i.status),console.log("Error: ",i.responseText)):console.log(i),console.log("-------- BACKUP MIGRATION ERROR END --------\n\n"),n(t,i.responseText)}i.action="backup_migration",i.token="bmi",i.f=e,t.post(ajaxurl,i).done(e=>{t.bmi.json(e).then(function(t){o(t)}).catch(function(t){r("json")})}).fail(t=>{r(!1,t)})})},tooltips:{init:function(){let e={delay:200,debug:!1,delayTouch:[100,200],interactive:!1,distance:0,side:"top",contentAsHTML:!1,maxWidth:460,triggerOpen:{mouseenter:!0,touchstart:!0},triggerClose:{mouseleave:!0,click:!0,tap:!0},theme:["bmi-tooltip","bmi-tt-default","bmi-tt-default-customized"],repositionOnScroll:!0,functionReady:function(){setTimeout(()=>{let e=t.tooltipster.instances();for(instance in e)e[instance].reposition()},10)}},i=t(".tooltip"),o=t(".tooltip-html"),n=t(".premium-wrapper"),r=JSON.parse(JSON.stringify(e));r.contentAsHTML=!0,r.interactive=!0;for(let o=0;o<i.length;++o){let n=i[o],r=n.getAttribute("data-top"),s=n.getAttribute("side"),a=JSON.parse(JSON.stringify(e));a.content=n.getAttribute("tooltip"),r&&(a.distance=parseInt(r)),s&&s.trim().length>0&&(a.side=s),t(n).tooltipster(a)}for(let e=0;e<o.length;++e){let i=o[e],n=i.getAttribute("side"),s=JSON.parse(JSON.stringify(r));s.content=i.getAttribute("tooltip"),n&&n.trim().length>0&&(s.side=n),t(i).tooltipster(s)}for(let i=0;i<n.length;++i){let o=n[i],r=JSON.parse(JSON.stringify(e));r.contentAsHTML=!0,r.interactive=!0,r.maxWidth=500,o.getAttribute("tooltip")?r.content=o.getAttribute("tooltip"):r.content=t("#premium-tooltip")[0].innerHTML,o.getAttribute("side")&&(r.side=o.getAttribute("side")),t(o).tooltipster(r)}},hideAll:function(e=!1){function i(){let e=t.tooltipster.instances();for(instance in e)e[instance].close()}e?i():setTimeout(i,10)}},collapsers:{toggle:function(i){if(!0===e)return;e=!0;let o=i.getAttribute("group");i.classList.contains("active")?t.bmi.collapsers.close(i):t.bmi.collapsers.open(i,o)},open:function(i,o){t.bmi.collapsers.closeGroup(o),t(i).addClass("active"),t(i).find(".content").show(300),setTimeout(function(){e=!1},300)},close:function(i){t(i).removeClass("active"),t(i).find(".content").hide(300),setTimeout(function(){e=!1},300)},closeGroup:function(i){t('.collapser[group="'+i+'"]').removeClass("active"),t('.collapser[group="'+i+'"]').find(".content").hide(300),setTimeout(function(){e=!1},300)},closeAll:function(){t(".collapser").removeClass("active"),t(".collapser").find(".content").hide(300),setTimeout(function(){e=!1},300)}},isUrlValid:function(t){return!!new RegExp("^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$","i").test(t)},bytesToHuman:function(t,e,i,o,n){return(e=Math,i=e.log,o=1024,n=i(t)/i(o)|0,t/e.pow(o,n)).toFixed(2)+" "+(n?"KMGTPEZY"[--n]+"B":"Bytes")},getCurrentBackups:function(e=function(){}){t("#reloading-bm-list").length>0&&"none"==t("#reloading-bm-list")[0].style.display&&(t("#reloading-bm-list").show(),t.bmi.ajax("get-current-backups",{}).then(function(i){t("#reloading-bm-list").hide(),e(i)}).catch(function(t){console.log(t)}))},fillWithNewBackups:function(e,i=function(){}){backups={},t("#bmi_restore_tbody").html("");let o=Object.keys(e).sort(function(t,i){return+new Date(e[t][1].replace(/\-/g,"/"))-+new Date(e[i][1].replace(/\-/g,"/"))}),n=0;for(;n<o.length;++n){let i=o[n],r="locked"===e[i][5];i=(i=i.replace(/ /g,"")).trim();let s="bmi_br_backup_"+n,a=t(".br_tr_template").clone();a.removeClass("br_tr_template"),a[0].style.display="none",a.find(".br_label").attr("for",s),a.find(".br_checkbox").attr("id",s),a.find(".bc-download-btn").attr("href",t("#BMI_BLOG_URL").text().trim()+"/?backup-migration=BMI_BACKUP&backup-id="+i),a.find(".bc-logs-btn").attr("href",t("#BMI_BLOG_URL").text().trim()+"/?backup-migration=BMI_BACKUP_LOGS&backup-id="+i),a.find(".br_date").text(e[i][1]),a.find(".br_name").text(i),a.find(".br_size").text(t.bmi.bytesToHuman(e[i][4])+" ("+e[i][2]+")"),r?a.find(".bc-unlocked-btn").hide():a.find(".bc-locked-btn").hide(),a.prependTo("#bmi_restore_tbody"),e[i].push(i),backups[s]=e[i]}if(0==n){let e=t("#bmi_restore_tbody").data("empty");t("#bmi_restore_tbody").html('<tr><td class="center text-muted" colspan="100%">'+e+"</td></tr>")}t.bmi.tooltips.init(),t.bmi.showMoreBackups(),i()},showMoreBackups:function(e){backups={};let i=t("#bmi_restore_tbody").find("tr:hidden");for(let e=0;e<i.length&&e<10;++e)setTimeout(function(){t(i[e]).show(300)},50*e);i.length-10<=0?t("#load-more-backups-wrp").hide(300):t("#load-more-backups-wrp").show(300)},reloadBackups:function(e=function(){}){t.bmi.getCurrentBackups(function(i){t.bmi.fillWithNewBackups(i.backups,function(){e(),t("#backups-select-all").prop("checked",!1),t(".del-all-btn-wrp").hide(300)})})},hideAllLists:function(){let e=t(".dropdown-open");if(!(e.length<=0))for(let i=0;i<e.length;++i){let o=t(e[i]);o.hasClass("ignored-open")?o.removeClass("ignored-open"):(o.hide(300),o.removeClass("dropdown-open"),t(o[0].closest(".bmi-dropdown")).removeClass("active"))}},setOption:function(e,i=null,o=!1){let n=e.find(".dropdown-options");e.attr("data-optioner")&&(n=t(".optioner-"+e.attr("data-optioner"))),n.find(".active-option").removeClass("active-option"),!1!==o&&(i=n.find('.dropdown-option[data-value="'+o+'"]')),t(i).hasClass("active-option")||(e.find(".dropdown-title").text(i.text()),e.attr("data-selected",i.data("value")),i.addClass("active-option"),!1===o&&e.change(),t.bmi.hideAllLists())},prepareFile:function(e,i){let o=document.createElement("a");o.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(i)),o.setAttribute("download",e),o.style.display="none",document.body.appendChild(o),o.click(),document.body.removeChild(o),t.bmi.alert("success",t("#bmi-download-should-start").text(),3e3)}}})}),jQuery(document).ready(function(t){t(".collapser .header").on("click",function(e){e.preventDefault();let i=t(this).parent(".collapser")[0];t.bmi.collapsers.toggle(i)}),t(".bmi_will_collapse").on("change",function(e){e.preventDefault();let i=!1;"radio"==this.getAttribute("type")&&"false"==this.getAttribute("value")&&(i=!0),$child=t(this).data("if-checked"),!0!==this.checked||i?t("#"+$child).hide(300):t("#"+$child).show(300)}),t(".collapser-openner").on("click",function(e){e.preventDefault();let i="configuration",o=t(this).data("el");t(this).data("group")&&(i=t(this).data("group")),t.bmi.collapsers.open(o,i),setTimeout(function(){t([document.documentElement,document.body]).animate({scrollTop:t(o).offset().top-50+"px"},300)},300)}),function(){let e=t(".bmi_will_collapse");for(let i=0;i<e.length;++i){let o=!1;$trigger=e[i],$child=t($trigger).data("if-checked"),"radio"==$trigger.getAttribute("type")&&"false"==$trigger.getAttribute("value")&&(o=!0),!0===$trigger.checked?t("#"+$child).show():t("#"+$child).hide()}}()}),jQuery(document).ready(function(t){var e=!0,i=!1;t.bmi.crons=function(){function o(){!function(e,i){t.bmi.ajax("calculate-cron",e).then(function(e){"success"==e.status?i(e):(i(!1),t.bmi._msg(e))}).catch(function(t){i(!1),console.log(t)})}({type:t('[data-id="cron-period"]').attr("data-selected"),day:t('[data-id="cron-day"]').attr("data-selected"),week:t('[data-id="cron-week"]').attr("data-selected"),hour:t('[data-id="cron-hour"]').attr("data-selected"),minute:t('[data-id="cron-minute"]').attr("data-selected"),keep:t('[data-id="cron-keep-backups"]').attr("data-selected"),enabled:!0==!t("#cron-btn-toggle")[0].checked},function(i){"success"===i.status&&!1!==i?(t(".cron-time-server").tooltipster("option","interactive",!1),t(".cron-time-server").tooltipster("option","contentAsHTML",!0),!0===t("#cron-btn-toggle")[0].checked&&(i.data="---"),t(".cron-time-server").tooltipster("content","<b>"+t("#bmi-next-cron").text()+"</b>"+i.data+"<br><b>"+t("#bmi-current-time").text()+"</b>"+i.currdata),e?e=!1:t.bmi.alert("success",t("#bmi-cron-updated").text(),1500)):e?e=!1:t.bmi.alert("error",t("#bmi-cron-updated-fail").text(),2500)})}function n(e){"month"==e?(t(".cron-the").show(),t('[data-id="cron-day"]').show(),t('[data-id="cron-week"]').hide(),t("#cron-on-word").show()):"week"==e?(t(".cron-the").hide(),t('[data-id="cron-day"]').hide(),t('[data-id="cron-week"]').show(),t("#cron-on-word").show()):(t(".cron-the").hide(),t('[data-id="cron-day"]').hide(),t('[data-id="cron-week"]').hide(),t("#cron-on-word").hide())}!0!==i&&(i=!0,t("#bmi").on("change",'[data-id="cron-period"]',function(t){o(),n(t.target.getAttribute("data-selected"))}),t("#bmi").on("change",'[data-id="cron-day"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-week"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-hour"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-minute"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-keep-backups"]',function(t){t.target.getAttribute("data-selected");o()}),t("#i-backup-cron").on("click",function(){t(".cron-backups").find(".turned-off").is(":visible")&&(t("#cron-btn-toggle").prop("checked",!1),t(".cron-backups").removeClass("disabled"),o(),t(".cron-backups").find(".turned-on").css({opacity:0}),t(".cron-backups").find(".turned-off").css({opacity:0}),t(".cron-backups").find(".turned-on").show(),t(".cron-backups").find(".turned-on").css({opacity:1}),setTimeout(function(){t(".cron-backups").find(".turned-off").hide()},300))}),t("#cron-btn-toggle").on("change",function(){this.checked?t(".cron-backups").addClass("disabled"):t(".cron-backups").removeClass("disabled"),o()}),n(t('[data-id="cron-period"]')[0].getAttribute("data-selected")),o())}}),jQuery(document).ready(function(t){t.bmi.dropdowns={init:function(){let e=t("#bmi");function i(e="null",i="---"){let o=t(".option-template").clone();return o.removeClass("option-template"),o.attr("data-value",e),o.text(i),o}function o(o){if("none"!=o.style.display){o.style.display="none";let n=t(o),r=n.find("option"),s=function(e="---"){let i=t(".dropdown-template").clone();return i.removeClass("dropdown-template"),i.find(".dropdown-title").text(e),i}(function(t){let e="";for(let i=0;i<t.length;++i){let o=t[i].innerText;e.length<o.length&&(e=o)}return e}(r));s=function(e,o){let n=t(e).find(".dropdown-options");t(e).attr("data-optioner")&&(n=t(".optioner-"+t(e).attr("data-optioner")));for(let t=0;t<o.length;++t){let e=o[t];n.append(i(e.value,e.innerText))}return e}(s,r);let a=r[0].value,l=o.getAttribute("data-parent"),c=o.getAttribute("data-classes"),p="true"===o.getAttribute("data-hide");if(n.data("def")&&(a=n.data("def")),t(s).attr("data-id",o.id),t(s).attr("class",((null!=c?c:"")+" bmi-dropdown").trim()),t(s).insertBefore(n),null!==l){let e=parseInt(864197532*Math.random()+123456789);t(s).attr("data-optioner",e),t(s).find(".dropdown-options").attr("data-oparent",e),t(s).find(".dropdown-options").addClass("optioner-"+e),t(s).find(".dropdown-options").appendTo(l),t(l).css({position:"relative"})}let u=t(s).clone();if(!u)return;u[0].style.visibility="hidden",e.append(u);let d=u.width();u.remove(),t.bmi.setOption(t(s),null,a),t(s).find(".dropdown-title")[0].style.minWidth=d+10+"px",p&&t(s).hide()}}!function(){let t=e.find("select");for(let e=0;e<t.length;++e)o(t[e])}(),t.bmi.crons(),e.on("click",function(e){t(e.target).hasClass("bmi-dropdown")||e.target.closest(".bmi-dropdown")||t.bmi.hideAllLists()}),e.on("click",".dropdown-title",function(e){$dropdown=t(e.target.closest(".bmi-dropdown")),function(e){let i=e.find(".dropdown-options");if(e.attr("data-optioner")){(i=t(".optioner-"+e.attr("data-optioner"))).css({position:"absolute"});let o=e[0].offsetWidth,n=e[0].offsetLeft+240,r=e[0].offsetTop+e[0].offsetHeight+5;i.css({maxWidth:o+"px",minWidth:o+"px",top:r+"px",left:n+"px"})}i.hasClass("dropdown-open")?(e.removeClass("active"),i.removeClass("dropdown-open"),i.hide(300)):(e.addClass("active"),i.addClass("dropdown-open"),i.addClass("ignored-open"),i.show(300))}($dropdown),t.bmi.hideAllLists()}),e.on("click",".dropdown-option",function(e){t(e.target.closest(".dropdown-options")).attr("data-oparent")?($dropdown=t('.bmi-dropdown[data-optioner="'+t(e.target.closest(".dropdown-options")).attr("data-oparent")+'"]'),$option=t(e.target),t.bmi.setOption($dropdown,$option)):($dropdown=t(e.target.closest(".bmi-dropdown")),$option=t(e.target),t.bmi.setOption($dropdown,$option))})}}}),jQuery(document).ready(function(t){var e,i,o=!1,n=!1,r=0;let s=0,a=0,l=null,c=null,p=null,u=!1,d=!1,_=!1;function f(e){return $cb=t("#"+e).is(":checked"),!0===$cb?"true":"false"}function h(){return size=0,t("#files-group-plugins").is(":checked")&&(size+=parseInt(t('label[for="files-group-plugins"]').find(".value").attr("bytes"))),t("#files-group-uploads").is(":checked")&&(size+=parseInt(t('label[for="files-group-uploads"]').find(".value").attr("bytes"))),t("#files-group-themes").is(":checked")&&(size+=parseInt(t('label[for="files-group-themes"]').find(".value").attr("bytes"))),t("#files-group-other-contents").is(":checked")&&(size+=parseInt(t('label[for="files-group-other-contents"]').find(".value").attr("bytes"))),t("#files-group-wp-install").is(":checked")&&(size+=parseInt(t('label[for="files-group-wp-install"]').find(".value").attr("bytes"))),size}function m(e,i){if(a+=1,s+=parseInt(i.bytes),i.bytes<=1e4)t("#bmi-scan-"+e).find(".value").text("(0 MB)");else{let o=(parseInt(i.bytes)/1024/1024).toFixed(2);t("#bmi-scan-"+e).find(".value").text("("+o+" MB)")}t("#bmi-scan-"+e).find(".value").attr("bytes",parseInt(i.bytes)),5==a&&(t("#bmi-scan-total").find(".value").text("("+t.bmi.bytesToHuman(s)+")"),t("#bmi-scan-total").find(".value").attr("bytes",parseInt(s)),w())}function g(e){t.bmi.ajax("scan-directory",{folder:e}).then(function(t){m(e,t)}).catch(function(t){m(t,{bytes:"0",readable:"0 B"})})}function b(e=!1,i=function(){}){t.bmi.ajax("is-running-backup",{}).then(function(o){"success"==o.status?i(!1):1==e?i(!0):t.bmi._msg(o)}).catch(function(t){i(!1),console.log(t)})}function w(){let e=parseInt(t("#bmi-scan-total").find(".value").attr("bytes")),i=parseInt(h());t("#files-group-backup").is(":checked")||(e=0,i=0);let o=((e-i)/1024/1024).toFixed(2),n=(i/1024/1024).toFixed(2);"0.00"==o&&(o="0"),"0.00"==n&&(n="0"),t("#esta-exclude").text(o+" MB"),t("#esta-size-for").text(n+" MB")}function v(){t("#prenotice-modal .prenotice").hide(),t("#prenotice-size").text(t.bmi.bytesToHuman(h())),t(".prenotic-3").show(),"true"!==f("database-group-backup")||"true"!==f("database-group-backup")||"true"===f("files-group-backup")&&("true"!==f("files-group-plugins")&&"true"!==f("files-group-themes")&&"true"!==f("files-group-uploads")&&"true"!==f("files-group-wp-install")&&f("files-group-other-contents"),1)||t(".prenotic-6").show(),"true"===f("database-group-backup")||"true"===f("database-group-backup")||"true"!==f("files-group-backup")||"true"!==f("files-group-plugins")&&"true"!==f("files-group-themes")&&"true"!==f("files-group-uploads")&&"true"!==f("files-group-wp-install")&&"true"!==f("files-group-other-contents")||t(".prenotic-5").show(),"true"===f("database-group-backup")&&"true"===f("files-group-backup")&&"true"===f("files-group-plugins")&&"true"===f("files-group-themes")&&"true"===f("files-group-uploads")&&"true"===f("files-group-other-contents")||t(".prenotic-4").show(),t("#prenotice-modal .prenotice:visible").css({background:""});let e=t("#prenotice-modal .prenotice"),i=[];for(let t=0;t<e.length;++t)"none"!==e[t].style.display&&i.push(e[t]);for(let t=0;t<i.length;t+=2)i[t].style.background="#f8f8f8"}function y(t,e=function(){}){try{window.XMLHttpRequest?xmlhttp=new XMLHttpRequest:xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"),xmlhttp.onloadend=function(){4==xmlhttp.readyState&&200==xmlhttp.status?e(xmlhttp.responseText):e(!1)},xmlhttp.open("GET",t),xmlhttp.send()}catch(t){e(!1)}}function k(e,i){if(!1===e)return;let o=e.split("\n"),n=r;r=o.length,n>0&&n--;for(let e=n;e<o.length;++e){let n=o[e],r=document.createElement("DIV"),s="";"[INFO]"==n.substr(0,6)?s="blue":"[SUCCESS]"==n.substr(0,9)?s="green":"[WARN]"==n.substr(0,6)?s="orange":"[ERROR]"==n.substr(0,7)&&(s="red"),"[STEP]"==n.substr(0,6)&&(r.classList.add("bold"),r.classList.add("step"),t("#restore-progress-modal").hasClass("open")?t("#restore_current_step").text(n.slice(29)):t("#current_step").text(n.slice(29))),s.length>0&&r.classList.add(s),r.style.display="none",r.innerText=n,setTimeout(function(){i.appendChild(r),t(r).show(55),i.scrollTop=i.scrollHeight},55*e)}setTimeout(function(){i.scrollTop=i.scrollHeight},110)}function x(e=0,r=1e3,s=null){if(c==e)return;c=e,clearInterval(i);let a=parseFloat(t(".progress-percentage")[0].style.left)-1;if(t("#restore-progress-modal").hasClass("open")&&(a=parseFloat(t("#restore-progress-modal .progress-percentage")[0].style.left)-1),a>e&&0!=e)return;let l=e-a,p=a,d=Math.abs(Math.floor(r/l));i=setInterval(function(){if(p+=1,t("#restore-progress-modal").hasClass("open")?(t("#restore-progress-modal .progress-active-bar")[0].style.width=p.toFixed(2)+"%",t("#restore-progress-modal .progress-percentage")[0].style.left=p.toFixed(2)+"%",t("#restore-progress-modal .progress-percentage")[0].innerText=p.toFixed(0)+"%"):(t(".progress-active-bar")[0].style.width=p.toFixed(2)+"%",t(".progress-percentage")[0].style.left=p.toFixed(2)+"%",t(".progress-percentage")[0].innerText=p.toFixed(0)+"%"),p>=100&&clearInterval(i),p>=100&&null!=s&&(c=null,t("#backup-progress-modal").hasClass("open"))){o=!0,n=!0,S(s,0==u)}p>e&&clearInterval(i)},d)}t("#live-log-toggle").on("click",function(){t(".expanded-logs").length>0?t(this).text(t(this).data("hide")):t(this).text(t(this).data("show")),t("#live-log-wrapper").toggleClass("expanded-logs")}),t("#backup-stop").on("click",function(){t.bmi.ajax("stop-backup",{}).then(function(e){"success"==e.status?t.bmi.alert("success",t("#bmi-abort-soon").text(),3e3):t.bmi._msg(e)}).catch(function(t){console.log(t)})}),t("#bmi_restore_tbody").on("click",".bc-unlocked-btn",function(e){e.preventDefault();let i=e.target,o=i.closest("tr").querySelector(".br_name").innerText.trim();t.bmi.ajax("lock-backup",{filename:o}).then(function(e){"success"==e.status?(t.bmi.alert("success",t("#bmi-lock-success").text(),3e3),t(i.closest("tr").querySelector(".bc-unlocked-btn")).hide(),t(i.closest("tr").querySelector(".bc-locked-btn")).show()):(t.bmi.alert("error",t("#bmi-lock-error").text(),3e3),console.error("BMI Backend error: ",e))}).catch(function(t){console.log(t)})}),t("#files-group-backup").on("change",w),t(".basic-file-exlusion").on("change",'input[type="checkbox"]',w),t("#bmi_restore_tbody").on("click",".bc-locked-btn",function(e){e.preventDefault();let i=e.target,o=i.closest("tr").querySelector(".br_name").innerText.trim();t.bmi.ajax("unlock-backup",{filename:o}).then(function(e){"success"==e.status?(t.bmi.alert("success",t("#bmi-unlock-success").text(),3e3),t(i.closest("tr").querySelector(".bc-locked-btn")).hide(),t(i.closest("tr").querySelector(".bc-unlocked-btn")).show()):(t.bmi.alert("error",t("#bmi-unlock-error").text(),3e3),console.error("BMI Backend error: ",e))}).catch(function(t){console.log(t)})}),t("#bmi_restore_tbody").on("click",".bc-url-btn",function(e){let i=e.target.closest("tr").querySelector(".bc-download-btn").getAttribute("href");t.bmi.clipboard(i)}),t("#bmi_restore_tbody").on("click",".bc-remove-btn",function(e){let i=e.target.closest("tr").querySelector(".br_name").innerText.trim();p=[i],t("#delete-confirm-modal").find(".text2").hide(),t("#delete-confirm-modal").find(".text1").show(),t.bmi.modal("delete-confirm-modal").open()}),t("#sure_delete").on("click",function(){t.bmi.ajax("delete-backup",{filenames:p}).then(function(e){p=null,"success"==e.status?(t.bmi.reloadBackups(),t.bmi.modal("delete-confirm-modal").close(),t.bmi.alert("success",t("#bmi-remove-success").text(),3e3)):(t.bmi.alert("warning",t("#bmi-remove-error").text(),3e3),console.error("BMI Backend error: ",e))}).catch(function(t){console.log(t)})}),t("#add-exclusion-rule").on("click",function(e){e.preventDefault();let i=t(".exclusion_template").clone();i[0].classList.remove("exclusion_template"),i[0].style.display="none",t("#bmi_exclusion_rules").append(i),i.show(300)}),t("#bmi_exclusion_rules").on("click",".kill-exclusion-rule",function(e){e.preventDefault(),$el=e.target,$parent=$el.closest(".exclude-row"),$parent&&(t($parent).hide(300),setTimeout(function(){$parent.remove()},320))}),t("#i-backup-creator").on("click",function(){if(!isNaN(h()))return h()/1024/1024>1e3*parseInt(t("#BMI_REV").text().trim())?E():void("true"===f("database-group-backup")||"true"===f("files-group-backup")&&("true"===f("files-group-plugins")||"true"===f("files-group-themes")||"true"===f("files-group-uploads")||"true"===f("files-group-wp-install")||"true"===f("files-group-other-contents"))?(v(),b(!1,function(){t.bmi.modal("prenotice-modal").open()})):t.bmi.alert("warning",t("#bmi-no-selected").text(),3e3));t.bmi.alert("warning",t("#bmi-preb-processing").text(),3e3)}),t("#BFFSIN").on("change",function(t){let e=parseInt(this.value);isNaN(e)?this.value=1:this.value=e>9999?9999:e<=0?1:e}),t(".save-btn").on("click",function(e){e.preventDefault();let i={},o=t(this.closest(".save-action")).data("save");if(o){if("save-storage"==o)i.directory=t("#bmi_path_storage_default").val(),i.access="true"===t('[name="radioAccessViaLink"]:checked').val()?"true":"false";else if("save-file-config"==o){i.database_group=f("database-group-backup"),i.files_group=f("files-group-backup"),i["files-group-plugins"]=f("files-group-plugins"),i["files-group-uploads"]=f("files-group-uploads"),i["files-group-themes"]=f("files-group-themes"),i["files-group-other-contents"]=f("files-group-other-contents"),i["files-group-wp-install"]=f("files-group-wp-install"),i.files_by_filters=f("files_by_filters"),i.ex_b_fs=f("ex_b_fs"),i.BFFSIN=t("#BFFSIN").val()?t("#BFFSIN").val():"1",i.ex_b_names=f("ex_b_names"),i.ex_b_fpaths=f("ex_b_fpaths"),i.ex_b_dpaths=f("ex_b_dpaths");let e=[],o=t("#bmi_exclusion_rules").find(".exclude-row");for(let i=0;i<o.length;++i){let n=t(o[i]),r=n.find(".exclusion_txt").val(),s=n.find(".exclusion_position").find(".bmi-dropdown").data("selected")+"",a=n.find(".exclusion_where").find(".bmi-dropdown").data("selected")+"";e.push({txt:r,pos:s,whr:a})}i["dynamic-names"]=e,i["dynamic-fpaths-names"]=t("#dynamic-fpaths-names").val().split("\n"),i["dynamic-dpaths-names"]=t("#dynamic-dpaths-names").val().split("\n")}else if("store-config"==o)i.name=t("#backup_filename").val().trim();else{if("save-other-options"!=o)return;i.email=t("#email-for-notices").val().trim(),i.email_title=t("#email-title-for-notices").val().trim(),i.schedule_issues=f("scheduled-issues"),i.uninstall_config=f("uninstalling-configs"),i.uninstall_backups=f("uninstalling-backups")}t.bmi.ajax(o,i).then(function(e){"success"==e.status?e.errors<=0?(t.bmi.alert("success",t("#bmi-save-success").text(),3e3),t.bmi.collapsers.closeAll()):t.bmi.alert("warning",t("#bmi-save-issues").text(),3e3):t.bmi._msg(e)}).catch(function(t){console.log(t)})}}),t(".close-chapters").on("click",function(e){e.preventDefault(),t.bmi.collapsers.closeAll()}),t("#rescan-for-backups").on("click",function(){t.bmi.reloadBackups()});var $=0;function C(e=function(){}){let i=t("#BMI_BLOG_URL").text().trim();y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest_progress.log&backup-id=current&t="+ +new Date,function(o){y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date,function(i){let n=t(".log-wrapper").find("pre")[0],r=t("#bmi-making-archive").text().trim();if(o&&0!=o&&void 0!==o&&(x(parseInt(o.split("/")[0])/parseInt(o.split("/")[1])*100),t("#current_step").text().trim().slice(0,r.length)==r)){let e=document.getElementById("bmi_counter_magic");if(e){(async function(t,e,i,o){let n=null,r=function(s){if($>i)return;n||(n=s);let a=Math.min((s-n)/o,1);t.innerText=Math.floor(a*(i-e)+e),a<1&&window.requestAnimationFrame(r)};window.requestAnimationFrame(r)})(e,parseInt(e.innerText),$=parseInt(o.split("/")[0]),2e3),t("#bmi_magic_max_count").text("---")&&100!=parseInt(o.split("/")[1])&&t("#bmi_magic_max_count").text(parseInt(o.split("/")[1]))}else{let e=parseInt(o.split("/")[1]);100==e&&(e="---"),t("#current_step").html(r+' (<span id="bmi_counter_magic">0</span>/<span id="bmi_magic_max_count">'+e+"</span>)")}}i&&0!=i&&void 0!==i&&k(i,n),e()})})}function T(){t(".log-wrapper").find("pre")[0].innerText="",x(0),setTimeout(function(){C(function(){!function t(){e=setTimeout(function(){C(function(){!0===u&&t()})},1e3)}()})})}function O(){x(0),setTimeout(function(){L(function(){!function t(){e=setTimeout(function(){L(function(){!0===d&&t()})},1e3)}()})})}function I(t=function(){}){b(!0,function(e){t(e)})}function S(r,s=!1){(o&&n||s)&&setTimeout(function(){u=!1,t("#backup-progress-modal").hasClass("open")&&(t.bmi.modal("backup-progress-modal").close(),"true"==t('[name="radioAccessViaLink"]:checked').val()?t("#accessible-at-section").show():t("#accessible-at-section").hide(),t.bmi.modal("backup-success-modal").open()),clearInterval(i),clearTimeout(e);let o=t("#BMI_BLOG_URL").text().trim()+"?backup-migration=BMI_BACKUP&backup-id="+r.filename+"&t="+ +new Date,n=t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date;t("#text-input-copy")[0].value=o,t("#download-backup-url").attr("href",o),t("#download-backup-log-url").attr("href",n),t.bmi.reloadBackups(),setTimeout(function(){clearInterval(i),t(".log-wrapper").find("pre")[0].innerText="",t(".progress-active-bar")[0].style.width="0%",t(".progress-percentage")[0].style.left="0%",t(".progress-percentage")[0].innerText="0%"},300)},700)}function z(){setTimeout(function(){t("#backup-error-pre").text("Loading..."),t.bmi.modal("backup-error-modal").open(),y(t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date,function(e){if(0==e)z();else{let i=t("#backup-error-pre")[0];t("#backup-error-pre").text(""),r=0,k(e,i)}})},100)}function E(){t.bmi.modal("bfs-modal").open()}function A(){I(function(e){!0===e?t("#backup-progress-modal").hasClass("open")||(!1===u&&(o=!1,u=!0,_=!0),t("#bmi-ongoing-backup").show(300)):(t("#bmi-ongoing-backup").is(":visible")&&t("#bmi-ongoing-backup").hide(300),t("#backup-progress-modal").hasClass("open")&&!0===_?(!0===u&&(u=!1),_=!1,t.bmi.getCurrentBackups(function(e){t.bmi.fillWithNewBackups(e.backups,function(){y(t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date,function(e){if(!1===e)t.bmi.modal("backup-progress-modal").close();else{let i="Backup process aborted",o="[ERROR]";if((e=e.split("\n"))[e.length-1].includes(i)||e[e.length-2].includes(i))t.bmi.modal("backup-progress-modal").close(),t.bmi.alert("info",t("#bmi-aborted-al").text(),3e3);else if(e[e.length-1].includes(o)||e[e.length-2].includes(o))t.bmi.modal("backup-progress-modal").close(),z();else{t.bmi.modal("backup-progress-modal").close(),t.bmi.modal("backup-success-modal").open();let e=t(t("#bmi_restore_tbody").find("tr")[0]).find(".bc-download-btn").attr("href");t("#download-backup-url").attr({href:e}),t("#text-input-copy").val(e)}}})})})):!0!==u||t("#backup-progress-modal").hasClass("open")||(u=!1,t.bmi.reloadBackups()))})}function L(e=function(){}){let i=t("#BMI_BLOG_URL").text().trim();y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t="+ +new Date,function(o){y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest_migration_progress.log&backup-id=current&t="+ +new Date,function(i){let n=t("#restore-live-log-wrapper").find("pre")[0];if(0!=o){let t=o.split("\n");(t=void 0!==t[t.length-2]?t[t.length-2]:"").includes("[")&&t.includes("]")&&k(o,n)}0!=i&&x(i),e({progress:i,logs:o})})})}function B(e=function(){}){t.bmi.ajax("htaccess-litespeed",{}).then(function(t){setTimeout(function(){e(!0)},400)}).catch(function(t){e(!1),console.log(t)})}function M(e=function(){}){t.bmi.ajax("migration-locked",{}).then(function(i){"success"==i.status?e(!0):(t.bmi._msg(i),e(!1))}).catch(function(t){console.log(t)})}function P(e=""){if(!t("#restore-progress-modal").hasClass("open"))return;d=!1,t("#restore-error-pre").text("Loading..."),y(t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t="+ +new Date,function(i){let o=t("#restore-error-pre")[0];t("#restore-error-pre").text(""),r=0,e.length>0&&(i+="\n"+e),k(i,o)}),t.bmi.modal("restore-progress-modal").close(),t.bmi.modal("restore-error-modal").open()}function D(o=!1){let n=l;if(!n||n.trim().length<=0)return t.bmi.alert("warning",t("#bmi-no-file").text(),3e3);t("#pre-restore-modal").hasClass("open")&&t.bmi.modal("pre-restore-modal").close(),t("#restore-progress-modal").hasClass("open")||t.bmi.modal("restore-progress-modal").open(),o||(t("#restore-live-log-wrapper").find("pre")[0].innerText=""),r=0,d=!0,O(),B(function(){t.bmi.ajax("restore-backup",{file:n,remote:o}).then(function(o){"success"===o.status?setTimeout(function(){clearInterval(i),clearTimeout(e),d=!1,t.bmi.modal("restore-progress-modal").close(),t.bmi.modal("restore-success-modal").open(),setTimeout(function(){t("#restore-progress-modal .progress-active-bar")[0].style.width="0%",t("#restore-progress-modal .progress-percentage")[0].style.left="0%",t("#restore-progress-modal .progress-percentage")[0].innerText="0%"},500)},1500):"error"===o.status?setTimeout(function(){clearInterval(i),clearTimeout(e),P()},1e3):(t.bmi.modal("pre-restore-modal").close(),t.bmi.modal("restore-progress-modal").close(),t.bmi._msg(o))}).catch(function(t,e){P(e),console.log(t)})})}function R(){return t("#bmi_restore_tbody").find('input[type="checkbox"]:checked')}function j(e){e.preventDefault(),t("#format-tip-wrp")[0].style.minWidth="calc(100% - 120px)","none"===t("#format-tip-wrp")[0].style.display?t("#format-tip-wrp").show(300):t("#format-tip-wrp").hide(300)}t("#configuration-reset-absolute").on("click",function(e){e.preventDefault(),t.bmi.ajax("reset-configuration",{}).then(function(e){"success"==e.status?window.location.reload():t.bmi._msg(e)}).catch(function(t){console.log(t)})}),t("#download-site-infos").on("click",function(e){e.preventDefault(),t.bmi.ajax("get-site-data",{}).then(function(e){"success"==e.status?t.bmi.prepareFile("bmi-site-info.debug",JSON.stringify(e.data)):t.bmi._msg(e)}).catch(function(t){console.log(t)})}),t("#start-entire-backup").on("click",function(){t.bmi.modal("prenotice-modal").close(),function(e=function(){}){t.bmi.ajax("reset-latest",{}).then(function(i){"success"==i.status?(e(),t.bmi.modal("backup-progress-modal").open()):t.bmi._msg(i)}).catch(function(t){console.log(t)})}(function(){B(function(){_=!1,o=!1,u=!0,t.bmi.ajax("create-backup",{estaminated_size:h()}).then(function(n){"success"==n.status?(o=!0,clearTimeout(e),u=!1,C(function(){setTimeout(function(){x(101,500,n),S(n,!0)},350)})):(u=!1,setTimeout(function(){clearInterval(i),t(".log-wrapper").find("pre")[0].innerText="",t(".progress-active-bar")[0].style.width="0%",t(".progress-percentage")[0].style.left="0%",t(".progress-percentage")[0].innerText="0%"},300),t.bmi._msg(n),t("#backup-progress-modal").hasClass("open")&&(t.bmi.modal("backup-progress-modal").close(),void 0!==n.bfs?E():z()))}).catch(function(e){t("#backup-progress-modal").hasClass("open")&&(t.bmi.modal("backup-progress-modal").close(),z()),console.log(e)}),r=0,u=!0,T()}),T()})}),t("#open_trouble_extenstion").on("click",function(){t("#trouble_extenstion").hasClass("openned")?(t("#trouble_extenstion").hide(300),t("#trouble_extenstion").removeClass("openned"),t(this).removeClass("active")):(t("#trouble_extenstion").show(300),t("#trouble_extenstion").addClass("openned"),t(this).addClass("active"))}),t("#switch-show-trs").on("click",function(){let e=this.dataset.see,i=this.dataset.hide,o=t(".hide-show-tr");t(this).hasClass("shown")?(o.hide(300),t(this).removeClass("shown"),this.innerText=e):(o.show(300),t(this).addClass("shown"),this.innerText=i)}),t("#ex_b_fs").on("change",function(){t("#ex_b_fs").is(":checked")?t("#bmi__collon").show():t("#bmi__collon").hide()}),t("#show-upload-area").on("click",function(){t(".upload_area").hasClass("hidden")?(t(".upload_area").show(300),t(".upload_area").removeClass("hidden"),t([document.documentElement,document.body]).animate({scrollTop:t(this).offset().top-50+"px"},300)):(t(".upload_area").hide(300),t(".upload_area").addClass("hidden"))}),t(".bmi-copper").on("click",function(e){e.preventDefault();let i=t("#"+this.getAttribute("data-copy"))[0];i.value&&i.value.length>0?t.bmi.clipboard(i.value):t.bmi.clipboard(i.innerText)}),t("#bmi_restore_tbody").on("click",".restore-btn",function(e){M(function(i){if(i){let i=e.target.closest("tr").querySelector(".br_name").innerText;if(l=i,!i||i.trim().length<=0)return t.bmi.alert("warning",t("#bmi-no-file").text(),3e3);t("#restore-ok").prop("checked",!1),t.bmi.modal("pre-restore-modal").open()}})}),t("#quick-download-migration").on("click",function(){let e=t("#bm-d-url").val();t.bmi.isUrlValid(e)?M(function(i){i&&(e.length>0?(l=-100,t("#restore-ok").prop("checked",!1),t.bmi.modal("pre-restore-modal").open()):t.bmi.alert("warning",t("#bmi-invalid-url").text(),5e3))}):t.bmi.alert("warning",t("#bmi-invalid-url").text(),5e3)}),t("#restore-start-sure").on("click",function(){t("#restore-ok").is(":checked")?-100===l?(l=null,t("#restore-live-log-wrapper").find("pre")[0].innerText="",M(function(o){B(function(){if(o){let o=t("#bm-d-url").val();t("#restore_current_step").text(t("#bmi-downloading-remote").text()),t.bmi.ajax("download-backup",{url:o}).then(function(o){clearInterval(i),clearTimeout(e),"success"===o.status?(t.bmi.reloadBackups(),l=o.name,x(100,300),setTimeout(function(){clearInterval(i),t("#restore-progress-modal .progress-active-bar")[0].style.width="0%",t("#restore-progress-modal .progress-percentage")[0].style.left="0%",t("#restore-progress-modal .progress-percentage")[0].innerText="0%",t("#restore_current_step").text(t("#bmi-restoring-prepare").text()),setTimeout(function(){D(!0)},300)},600)):"error"===o.status?P():(t.bmi._msg(o),P())}).catch(function(t,e){P(e),console.log(t)}),t("#restore-live-log-wrapper").find("pre")[0].innerText="",r=0,d=!0,O(),t.bmi.modal("pre-restore-modal").close(),t.bmi.modal("restore-progress-modal").open()}})})):D():t.bmi.alert("warning",t("#bmi-restore-require-checkmark").text(),3e3)}),t(".backup-minimize").on("click",function(){I(function(e){!0===e?t("#bmi-ongoing-backup").show(300):t("#bmi-ongoing-backup").hide()})}),setInterval(function(){A()},4500),A(),t("#bmi-ongoing-backup").on("click",function(){I(function(e){!0===e?(r=0,T(),t.bmi.modal("backup-progress-modal").open()):(t.bmi.alert("info",t("#bmi-bc-ended").text(),3e3),t.bmi.reloadBackups()),t("#bmi-ongoing-backup").hide(300)})}),t("#bmi_restore_tbody").on("change",'input[type="checkbox"]',function(e){let i=R().length;i>0?t(".del-all-btn-wrp").show(300):t(".del-all-btn-wrp").hide(300),i==t("#bmi_restore_tbody").find('input[type="checkbox"]').length?t("#backups-select-all").prop("checked",!0):t("#backups-select-all").prop("checked",!1)}),t("#backups-select-all").on("change",function(){!0===this.checked?t("#bmi_restore_tbody").find('input[type="checkbox"]').prop("checked",!0):t("#bmi_restore_tbody").find('input[type="checkbox"]').prop("checked",!1),R().length>0?t(".del-all-btn-wrp").show(300):t(".del-all-btn-wrp").hide(300)}),t(".lrn-mr-btn, .closer-learn-more").on("click",function(){t(".learn_more_about_cron").hasClass("open")?(t(".learn_more_about_cron").removeClass("open"),t(".learn_more_about_cron").hide(300),t(".lrn-mr-btn").show(),t(".lrn-mr-btn").css({opacity:0}),t(".lrn-mr-btn").animate({opacity:1},300)):(t(".learn_more_about_cron").addClass("open"),t(".learn_more_about_cron").show(300),t(".lrn-mr-btn").css({opacity:1}),t(".lrn-mr-btn").animate({opacity:0},300,function(){t(".lrn-mr-btn").hide()}))}),t("#bmi-error-toggle").on("click",function(){t(".error-body").hasClass("open")?(t(".error-body").hide(300),t(".error-body").removeClass("open"),t("#bmi-error-toggle").text(t("#bmi-error-toggle").data("expand"))):(t(".error-body").show(300),t(".error-body").addClass("open"),t("#bmi-error-toggle").text(t("#bmi-error-toggle").data("collapse")))}),t("#bmi-error-dismiss").on("click",function(){t(".error-noticer").hide(300),setTimeout(function(){t(".error-noticer").remove()},330),t.bmi.ajax("dismiss-error-notice",{}).then(function(t){}).catch(function(t){})}),t(".deleteAllSelected").on("click",function(){let e=R(),i=[];for(let t=0;t<e.length;++t){let o=e[t].closest("tr");i.push(o.querySelector(".br_name").innerText)}t("#delete-confirm-modal").find(".text1").hide(),t("#delete-confirm-modal").find(".text2").show();let o=i.length;o<=0||(t("#backup-multiple-del-count").text(o),o>1?(t("#del-only-one").hide(),t("#del-more-than-one").show()):(t("#del-more-than-one").hide(),t("#del-only-one").show()),p=i,t.bmi.modal("delete-confirm-modal").open())}),t("#load-more-backups").on("click",function(e){e.preventDefault(),t.bmi.showMoreBackups()}),t("#show-format-tip").on("click",j),t("#hide-format-tip").on("click",j),t(".go-to-marbs").on("click",function(e){e.preventDefault(),document.getElementById("marbs").click(),t.bmi.modal().closeAll()}),t(".site-reloader").on("click",function(){window.location.reload()}),async function(){g("plugins"),g("uploads"),g("themes"),g("contents_others"),g("wordpress")}(),t.bmi.ajax("get-dynamic-names",{}).then(function(e){let i=e.data;if(t("#bmi_exclusion_rules").text(""),void 0!==i&&void 0!==i.length){for(let e=0;e<i.length;++e){let o=t(".exclusion_template").clone();o.removeClass("exclusion_template"),o.find(".exclusion_txt").val(i[e].txt);let n=o.find(".exclusion_position").find("select"),r=o.find(".exclusion_where").find("select");n&&(n[0].setAttribute("data-def",i[e].pos),r&&(r[0].setAttribute("data-def",i[e].whr),t("#bmi_exclusion_rules").append(o)))}t("#dynamic-fpaths-names").text(e["dynamic-fpaths-names"].join("\n")),t("#dynamic-dpaths-names").text(e["dynamic-dpaths-names"].join("\n"))}}).catch(function(t){console.log(t)}),t.bmi.reloadBackups(),function(){let e=1e3*parseInt(t("#server-time-auto").attr("data-time")),i=new Date(e);t("#server-time-auto").text(i.toUTCString()),setInterval(function(){e+=1e3,i=new Date(e),t("#server-time-auto").text(i.toUTCString())},1e3),t("#ex_b_fs").is(":checked")?t("#bmi__collon").show():t("#bmi__collon").hide()}()}),jQuery(document).ready(function(t){t(".modal-opener").on("click",function(e){this.getAttribute("data-modal")&&""!=this.getAttribute("data-modal")&&(e.preventDefault(),this.getAttribute("data-close")&&t.bmi.modal(this.getAttribute("data-close")).close(),t.bmi.modal(this.getAttribute("data-modal")).open())}),t(".modal-closer").on("click",function(e){this.getAttribute("data-close")&&""!=this.getAttribute("data-close")?(e.preventDefault(),t.bmi.modal(this.getAttribute("data-close")).close()):this.closest(".modal")&&(e.preventDefault(),t("#"+this.closest(".modal").getAttribute("id")).length>0&&t.bmi.modal(this.closest(".modal").getAttribute("id")).close())}),t(".modal-close").on("click",function(e){this.closest(".modal")&&(e.preventDefault(),t.bmi.modal(this.closest(".modal").id).close())}),t(".modal").on("click",function(e){e.target!=this||t(e.target).hasClass("modal-no-close")||t.bmi.modal(this.id).close()})}),jQuery(document).ready(function(t){t.bmi.tooltips.init();let e,i=-1,o=!1,n="";for(let t=0;t<12;++t)n+="<div></div>";function r(o){clearInterval(e),0==o?(t(".upload-progress-bar").find("span")[0].style.width=o+"%",t(".upload-percentage").text(o+"%")):100==o?(t(".upload-progress-bar").find("span")[0].style.width=o+"%",t(".upload-percentage").text(o+"%")):function(o=0,n=1e3){if(i==o)return;i=o,clearInterval(e);let r=parseInt(t(".upload-percentage").text())-1;if(r>o&&0!=o)return;let s=o-r,a=r,l=Math.abs(Math.floor(n/s));e=setInterval(function(){a+=1,t(".upload-progress-bar").find("span")[0].style.width=a+"%",t(".upload-percentage").text(a+"%"),a>=100&&(clearInterval(e),i=null)},l)}(o,1e3)}t(".spinner-loader").html(n).addClass("lds-spinner"),t.fchunker({upId:"upid",upShardSize:"5",upMaxSize:"2000",upUrl:ajaxurl,upType:"zip",upCallBack:function(e){var i=e.status,n=e.message;e.url,Math.random();2==i&&(setTimeout(function(){t("#drop-area").show(300),t(".upload-progress").hide(300)},100),t.bmi.alert("success",t("#bmi-upload-end").text(),3e3),t.bmi.modal("upload-success-modal").open(),t.bmi.reloadBackups()),1==i&&(o||(t.bmi.alert("success",t("#bmi-upload-start").text(),3e3),o=!0)),0==i&&(t.upErrorMsg(n),t("#drop-area").show(300),t(".upload-progress").hide(300)),5==i&&(t.bmi.modal("upload-invalid-manifest-modal").open(),t("#drop-area").show(300),t(".upload-progress").hide(300)),3==i&&(r(100),t.upErrorMsg(n),t("#drop-area").show(300),t(".upload-progress").hide(300))},upEvent:function(t){r(t)},upStop:function(e){r(0),setTimeout(function(){t("#drop-area").show(300),t(".upload-progress").hide(300)},100),e.includes("Type error")?(t.bmi.modal("upload-wrong-file-modal").open(),t.bmi.alert("warning",t("#bmi-upload-wrong").text(),3e3)):e.includes("File already exists")?(t.bmi.modal("upload-exist-file-modal").open(),t.bmi.alert("warning",t("#bmi-upload-exists").text(),3e3)):(t.bmi.alert("error",t("#bmi-upload-error").text(),3e3),console.error(e))},upStart:function(){o=!1,i=-1,r(0),setTimeout(function(){t("#drop-area").hide(300),t(".upload-progress").show(300)},100)}})}),jQuery(document).ready(function(t){function e(t){for(let e=0;e<t.length;++e){let i=t[e].closest(".container-radio");i&&void 0!=typeof i.classList&&(i.classList.remove("active"),!0===t[e].checked&&i.classList.add("active"))}}t('input[type="radio"]').on("change",function(){let t=this.getAttribute("name");this.closest(".container-radio");e(document.querySelectorAll('[name="'+t+'"]'))}),e(document.getElementById("bmi").querySelectorAll('input[type="radio"]'))}),jQuery(document).ready(function(t){let e=!1;t(".tabs").on("click",".tab",function(i){if(this.classList.contains("active"))return;if(!0===e)return;e=!0,t.bmi.collapsers.closeAll();let o=this.getAttribute("data-point");"manage-restore-wrapper"==o?(t("#create-backup-wrapper").hide(300),t('[data-point="create-backup-wrapper"]').removeClass("active")):"create-backup-wrapper"==o&&(t("#manage-restore-wrapper").hide(300),t('[data-point="manage-restore-wrapper"]').removeClass("active")),t("#"+o).show(300),t(this).addClass("active"),setTimeout(function(){e=!1},320)})}),jQuery(document).ready(function(t){let e=document.getElementById("drop-area");function i(t){t.preventDefault(),t.stopPropagation()}function o(t){e.classList.add("highlight")}function n(t){e.classList.remove("highlight")}e&&(["dragenter","dragover","dragleave","drop"].forEach(t=>{e.addEventListener(t,i,!1)}),["dragenter","dragover"].forEach(t=>{e.addEventListener(t,o,!1),document.querySelector("body").addEventListener(t,o,!1)}),["dragleave","drop","mouseleave"].forEach(t=>{e.addEventListener(t,n,!1)}),t("body, #drop-area").on("mouseleave dragleave drop",function(){n()}),e.addEventListener("drop",function(t){!function(t){t=[...t],jQuery.fchunker_upload("file",t[0])}(t.dataTransfer.files)},!1))});
backup-backup.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Plugin Name: Backup Backup
5
+ * Description: Most sophisticated backup & migration plugin for WordPress
6
+ * Author: Migrate
7
+ * Author URI: https://backupbliss.com/
8
+ * Plugin URI: https://backupbliss.com
9
+ * Text Domain: backup-migration
10
+ * Domain Path: /languages
11
+ * Version: 1.0.4
12
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
13
+
14
+ // Exit on direct access
15
+ if (!defined('ABSPATH')) {
16
+ exit;
17
+ }
18
+
19
+ // Default namespace
20
+ use BMI\Plugin\Backup_Migration_Plugin;
21
+
22
+ // Not dynamic constants
23
+ if (!defined('BMI_DEBUG')) {
24
+ define('BMI_DEBUG', false);
25
+ }
26
+ if (!defined('BMI_VERSION')) {
27
+ define('BMI_VERSION', '1.0.4');
28
+ }
29
+ if (!defined('BMI_ROOT_DIR')) {
30
+ define('BMI_ROOT_DIR', __DIR__);
31
+ }
32
+ if (!defined('BMI_ROOT_FILE')) {
33
+ define('BMI_ROOT_FILE', __FILE__);
34
+ }
35
+
36
+ // Global plugin variables
37
+ require_once BMI_ROOT_DIR . '/includes/constants.php';
38
+
39
+ // Initialize backup-migration
40
+ if (!class_exists('Backup_Migration_Plugin')) {
41
+
42
+ // Require initializator
43
+ require_once BMI_ROOT_DIR . '/includes/initializer.php';
44
+
45
+ // Initialize entire plugin
46
+ $bmi_instance = new Backup_Migration_Plugin();
47
+ $bmi_instance->initialize();
48
+ }
includes/ajax.php ADDED
@@ -0,0 +1,1434 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ // Uses
12
+ use BMI\Plugin\Backup_Migration_Plugin as BMP;
13
+ use BMI\Plugin\BMI_Logger as Logger;
14
+ use BMI\Plugin\Checker\BMI_Checker as Checker;
15
+ use BMI\Plugin\Checker\System_Info as SI;
16
+ use BMI\Plugin\CRON\BMI_Crons as Crons;
17
+ use BMI\Plugin\Dashboard as Dashboard;
18
+ use BMI\Plugin\Extracter\BMI_Extracter as Extracter;
19
+ use BMI\Plugin\Progress\BMI_MigrationProgress as MigrationProgress;
20
+ use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
21
+ use BMI\Plugin\Scanner\BMI_BackupsScanner as Backups;
22
+ use BMI\Plugin\Scanner\BMI_FileScanner as Scanner;
23
+ use BMI\Plugin\Zipper\BMI_Zipper as Zipper;
24
+
25
+ /**
26
+ * Ajax Handler for BMI
27
+ */
28
+ class BMI_Ajax {
29
+ public function __construct() {
30
+
31
+ // Return if it's not post
32
+ if (empty($_POST)) {
33
+ return;
34
+ }
35
+
36
+ // Sanitize User Input
37
+ $this->post = BMP::sanitize($_POST);
38
+
39
+ // Log Handler Call (Verbose)
40
+ Logger::debug(__("Running POST Function: ", 'backup-migration') . $this->post['f']);
41
+
42
+ // Create backup folder
43
+ if (!file_exists(BMI_BACKUPS)) {
44
+ mkdir(BMI_BACKUPS, 0755, true);
45
+ }
46
+
47
+ // Handle User Request If Known And Sanitize Response
48
+ if ($this->post['f'] == 'scan-directory') {
49
+ BMP::res($this->dirSize());
50
+ }
51
+ if ($this->post['f'] == 'create-backup') {
52
+ BMP::res($this->prepareAndMakeBackup());
53
+ }
54
+ if ($this->post['f'] == 'reset-latest') {
55
+ BMP::res($this->resetLatestLogs());
56
+ }
57
+ if ($this->post['f'] == 'get-current-backups') {
58
+ BMP::res($this->getBackupsList());
59
+ }
60
+ if ($this->post['f'] == 'restore-backup') {
61
+ BMP::res($this->restoreBackup());
62
+ }
63
+ if ($this->post['f'] == 'is-running-backup') {
64
+ BMP::res($this->isRunningBackup());
65
+ }
66
+ if ($this->post['f'] == 'stop-backup') {
67
+ BMP::res($this->stopBackup());
68
+ }
69
+ if ($this->post['f'] == 'download-backup') {
70
+ BMP::res($this->handleQuickMigration());
71
+ }
72
+ if ($this->post['f'] == 'migration-locked') {
73
+ BMP::res($this->isMigrationLocked());
74
+ }
75
+ if ($this->post['f'] == 'upload-backup') {
76
+ BMP::res($this->handleChunkUpload());
77
+ }
78
+ if ($this->post['f'] == 'delete-backup') {
79
+ BMP::res($this->removeBackupFile());
80
+ }
81
+ if ($this->post['f'] == 'save-storage') {
82
+ BMP::res($this->saveStorageConfig());
83
+ }
84
+ if ($this->post['f'] == 'save-file-config') {
85
+ BMP::res($this->saveFilesConfig());
86
+ }
87
+ if ($this->post['f'] == 'save-other-options') {
88
+ BMP::res($this->saveOtherOptions());
89
+ }
90
+ if ($this->post['f'] == 'store-config') {
91
+ BMP::res($this->saveStorageTypeConfig());
92
+ }
93
+ if ($this->post['f'] == 'unlock-backup') {
94
+ BMP::res($this->toggleBackupLock(true));
95
+ }
96
+ if ($this->post['f'] == 'lock-backup') {
97
+ BMP::res($this->toggleBackupLock(false));
98
+ }
99
+ if ($this->post['f'] == 'get-dynamic-names') {
100
+ BMP::res($this->getDynamicNames());
101
+ }
102
+ if ($this->post['f'] == 'reset-configuration') {
103
+ BMP::res($this->resetConfiguration());
104
+ }
105
+ if ($this->post['f'] == 'get-site-data') {
106
+ BMP::res($this->getSiteData());
107
+ }
108
+ if ($this->post['f'] == 'calculate-cron') {
109
+ BMP::res($this->calculateCron());
110
+ }
111
+ if ($this->post['f'] == 'dismiss-error-notice') {
112
+ BMP::res($this->dismissErrorNotice());
113
+ }
114
+ if ($this->post['f'] == 'htaccess-litespeed') {
115
+ BMP::res($this->fixLitespeed());
116
+ }
117
+ if ($this->post['f'] == 'debugging') {
118
+ BMP::res($this->debugging());
119
+ }
120
+ }
121
+
122
+ public function siteURL() {
123
+ $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
124
+ $domainName = $_SERVER['HTTP_HOST'];
125
+
126
+ return $protocol . $domainName;
127
+ }
128
+
129
+ public function dirSize() {
130
+
131
+ // Require File Scanner
132
+ require_once BMI_INCLUDES . '/scanner/files.php';
133
+
134
+ // Folder
135
+ $f = $this->post['folder'];
136
+
137
+ // Bytes
138
+ $bytes = 0;
139
+ $bm = BMP::fixSlashes(BMI_BACKUPS);
140
+
141
+ if ($f == 'plugins') {
142
+ $bytes = Scanner::scanFiles(BMP::fixSlashes(WP_PLUGIN_DIR), $bm);
143
+ } elseif ($f == 'uploads') {
144
+ $bytes = Scanner::scanFiles(BMP::fixSlashes(WP_CONTENT_DIR) . DIRECTORY_SEPARATOR . 'uploads', $bm);
145
+ } elseif ($f == 'themes') {
146
+ $bytes = Scanner::scanFiles(BMP::fixSlashes(WP_CONTENT_DIR) . DIRECTORY_SEPARATOR . 'themes', $bm);
147
+ } elseif ($f == 'contents_others') {
148
+ $bytes = Scanner::scanFilesWithIgnore(BMP::fixSlashes(WP_CONTENT_DIR), ['uploads', 'themes', 'plugins'], $bm);
149
+ } elseif ($f == 'wordpress') {
150
+ $bytes = Scanner::scanFilesWithIgnore(BMP::fixSlashes(ABSPATH), [BMP::fixSlashes(WP_CONTENT_DIR)], $bm);
151
+ }
152
+
153
+ return [
154
+ 'bytes' => $bytes,
155
+ 'readable' => BMP::humanSize($bytes)
156
+ ];
157
+ }
158
+
159
+ public function resetLatestLogs() {
160
+
161
+ // Check time if not bugged
162
+ if (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) > 65) {
163
+ @unlink(BMI_BACKUPS . '/.running');
164
+ @unlink(BMI_BACKUPS . '/.abort');
165
+ }
166
+
167
+ // Check if backup is not in progress
168
+ if (file_exists(BMI_BACKUPS . '/.running')) {
169
+ return ['status' => 'msg', 'why' => __('Backup process already running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
170
+ }
171
+
172
+ // Require logs
173
+ require_once BMI_INCLUDES . '/progress/zip.php';
174
+
175
+ // Write initial
176
+ $zip_progress = new Progress('', 0);
177
+ $zip_progress->start();
178
+ $zip_progress->log(__("Initializing backup...", 'backup-migration'), 'step');
179
+ $zip_progress->progress('0/100');
180
+ $zip_progress->end();
181
+
182
+ // Return done
183
+ return ['status' => 'success'];
184
+ }
185
+
186
+ public function makeBackupName() {
187
+ $name = Dashboard\bmi_get_config('BACKUP:NAME');
188
+
189
+ $hash = rand(1000, 9999);
190
+ $name = str_replace('%hash', $hash, $name);
191
+ $name = str_replace('%Y', date('Y'), $name);
192
+ $name = str_replace('%M', date('M'), $name);
193
+ $name = str_replace('%D', date('D'), $name);
194
+ $name = str_replace('%d', date('d'), $name);
195
+ $name = str_replace('%j', date('j'), $name);
196
+ $name = str_replace('%m', date('m'), $name);
197
+ $name = str_replace('%n', date('n'), $name);
198
+ $name = str_replace('%Y', date('Y'), $name);
199
+ $name = str_replace('%y', date('y'), $name);
200
+ $name = str_replace('%a', date('a'), $name);
201
+ $name = str_replace('%A', date('A'), $name);
202
+ $name = str_replace('%B', date('B'), $name);
203
+ $name = str_replace('%g', date('g'), $name);
204
+ $name = str_replace('%G', date('G'), $name);
205
+ $name = str_replace('%h', date('h'), $name);
206
+ $name = str_replace('%H', date('H'), $name);
207
+ $name = str_replace('%i', date('i'), $name);
208
+ $name = str_replace('%s', date('s'), $name);
209
+ $name = str_replace('%s', date('s'), $name);
210
+
211
+ $i = 2;
212
+ $tmpname = $name;
213
+
214
+ while (file_exists($tmpname . '.zip')) {
215
+ $tmpname = $name . '_' . $i;
216
+ $i++;
217
+ }
218
+
219
+ $name = $tmpname . '.zip';
220
+
221
+ return $name;
222
+ }
223
+
224
+ public function prepareAndMakeBackup($cron = false) {
225
+
226
+ // Require File Scanner
227
+ require_once BMI_INCLUDES . '/progress/zip.php';
228
+ require_once BMI_INCLUDES . '/check/checker.php';
229
+
230
+ // Backup name
231
+ $name = $this->makeBackupName();
232
+
233
+ // Progress & Logs
234
+ $zip_progress = new Progress($name, 100, 0, $cron);
235
+ $zip_progress->start();
236
+ $zip_progress->log(__("Initializing backup...", 'backup-migration'), 'step');
237
+ $zip_progress->log((__("Backup & Migration version: ", 'backup-migration') . BMI_VERSION), 'info');
238
+ $zip_progress->log(__("Site which will be backed up: ", 'backup-migration') . $this->siteURL(), 'info');
239
+ $zip_progress->log(__("Checking if backup dir is writable...", 'backup-migration'), 'info');
240
+
241
+ // Checker
242
+ $checker = new Checker($zip_progress);
243
+
244
+ if (!is_writable(dirname(BMI_BACKUPS))) {
245
+
246
+ // Abort backup
247
+ $zip_progress->log(__("Backup directory is not writable...", 'backup-migration'), 'error');
248
+ $zip_progress->log(__("Path: ", 'backup-migration') . BMI_BACKUPS, 'error');
249
+
250
+ // Close backup
251
+ @unlink(BMI_BACKUPS . '/.running');
252
+ @unlink(BMI_BACKUPS . '/.abort');
253
+
254
+ // Log and close log
255
+ $zip_progress->end();
256
+
257
+ // Return error
258
+ return ['status' => 'error'];
259
+ } else {
260
+ $zip_progress->log(__("Yup it is writable...", 'backup-migration'), 'success');
261
+ }
262
+
263
+ if (!file_exists(BMI_BACKUPS)) {
264
+ @mkdir(BMI_BACKUPS, true);
265
+ }
266
+
267
+ // Get file names (huge list mostly)
268
+ if ($fgwp = Dashboard\bmi_get_config('BACKUP:FILES') == 'true') {
269
+ $zip_progress->log(__("Scanning files...", 'backup-migration'), 'step');
270
+ $files = $this->scanFilesForBackup($zip_progress);
271
+ $files = $this->parseFilesForBackup($files, $zip_progress);
272
+ } else {
273
+ $zip_progress->log(__("Omitting files (due to settings)...", 'backup-migration'), 'warn');
274
+ $files = [];
275
+ }
276
+
277
+ // Check if there is enough space
278
+ $bytes = intval($this->total_size_for_backup * 1.2);
279
+ $zip_progress->log(__("Checking free space, reserving...", 'backup-migration'), 'step');
280
+ if ($this->total_size_for_backup_in_mb >= BMI_REV * 1000) {
281
+
282
+ // Abort backup
283
+ $zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
284
+ $zip_progress->log(str_replace('%s', BMI_REV, __("Site weights more than %s GB.", 'backup-migration')), 'error');
285
+
286
+ // Close backup
287
+ @unlink(BMI_BACKUPS . '/.running');
288
+ @unlink(BMI_BACKUPS . '/.abort');
289
+
290
+ // Log and close log
291
+ $zip_progress->end();
292
+
293
+ // Return error
294
+ return ['status' => 'error', 'bfs' => true];
295
+ }
296
+
297
+ if (!$checker->check_free_space($bytes)) {
298
+
299
+ // Abort backup
300
+ $zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
301
+ $zip_progress->log(__("There is no space for that backup, checked: ", 'backup-migration') . ($bytes) . __(" bytes", 'backup-migration'), 'error');
302
+
303
+ // Close backup
304
+ @unlink(BMI_BACKUPS . '/.running');
305
+ @unlink(BMI_BACKUPS . '/.abort');
306
+
307
+ // Log and close log
308
+ $zip_progress->end();
309
+
310
+ // Return error
311
+ return ['status' => 'error'];
312
+ } else {
313
+ $zip_progress->log(__("Confirmed, there is more than enough space, checked: ", 'backup-migration') . ($bytes) . __(" bytes", 'backup-migration'), 'success');
314
+ $zip_progress->bytes = $this->total_size_for_backup;
315
+ }
316
+
317
+ if (Dashboard\bmi_get_config('BACKUP:DATABASE') != 'true') {
318
+ // Do something if db is not selected
319
+ }
320
+
321
+ // Log and set files length
322
+ $zip_progress->log(__("Scanning done - found ", 'backup-migration') . sizeof($files) . __(" files...", 'backup-migration'), 'info');
323
+ $zip_progress->files = sizeof($files);
324
+
325
+ // Make Backup
326
+ $zip_progress->log(__("Backup initialized...", 'backup-migration'), 'success');
327
+ $zip_progress->log(__("Initializing archiving system...", 'backup-migration'), 'step');
328
+
329
+ return $this->createBackup($files, ABSPATH, $name, $zip_progress);
330
+ }
331
+
332
+ public function fixLitespeed() {
333
+ BMP::fixLitespeed();
334
+
335
+ return ['status' => 'success'];
336
+ }
337
+
338
+ public function revertLitespeed() {
339
+ BMP::revertLitespeed();
340
+
341
+ return ['status' => 'success'];
342
+ }
343
+
344
+ public function createBackup($files, $base, $name, &$zip_progress) {
345
+
346
+ // Require File Zipper
347
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
348
+
349
+ // Backup name
350
+ $backup_path = BMI_BACKUPS . '/' . $name;
351
+
352
+ // Check time if not bugged
353
+ if (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) > 65) {
354
+ @unlink(BMI_BACKUPS . '/.running');
355
+ @unlink(BMI_BACKUPS . '/.abort');
356
+ }
357
+
358
+ // Mark as in progress
359
+ if (!file_exists(BMI_BACKUPS . '/.running')) {
360
+ touch(BMI_BACKUPS . '/.running');
361
+ } else {
362
+ return ['status' => 'msg', 'why' => __('Backup process already running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
363
+ }
364
+
365
+ // Initialized
366
+ $zip_progress->log(__("Archive system initialized...", 'backup-migration'), 'success');
367
+
368
+ // Make ZIP
369
+ $zipper = new Zipper();
370
+ $zippy = $zipper->makeZIP($files, $backup_path, $name, $zip_progress);
371
+ if (!$zippy) {
372
+
373
+ // Make sure it's open
374
+ $zip_progress->start();
375
+
376
+ // Abort backup
377
+ $zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
378
+
379
+ // Close backup
380
+ @unlink(BMI_BACKUPS . '/.running');
381
+ @unlink(BMI_BACKUPS . '/.abort');
382
+
383
+ // Log and close log
384
+ $zip_progress->end();
385
+
386
+ // Return error
387
+ if (file_exists($backup_path)) {
388
+ @unlink($backup_path);
389
+ }
390
+
391
+ return ['status' => 'error'];
392
+ }
393
+
394
+ // Backup aborted
395
+ if (file_exists(BMI_BACKUPS . '/.abort')) {
396
+
397
+ // Make sure it's open
398
+ $zip_progress->start();
399
+
400
+ if (file_exists($backup_path)) {
401
+ @unlink($backup_path);
402
+ }
403
+ @unlink(BMI_BACKUPS . '/.running');
404
+ @unlink(BMI_BACKUPS . '/.abort');
405
+
406
+ // Log and close log
407
+ $zip_progress->log(__("Backup process aborted.", 'backup-migration'), 'warn');
408
+ $zip_progress->end();
409
+
410
+ Logger::log(__("Backup process aborted.", 'backup-migration'));
411
+
412
+ return ['status' => 'msg', 'why' => __('Backup process aborted.', 'backup-migration'), 'level' => 'info'];
413
+ }
414
+
415
+ if (!file_exists($backup_path)) {
416
+
417
+ // Make sure it's open
418
+ $zip_progress->start();
419
+
420
+ // Abort backup
421
+ $zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
422
+ $zip_progress->log(__("There is no backup file...", 'backup-migration'), 'error');
423
+ $zip_progress->log(__("We could not find backup file when it already should be here.", 'backup-migration'), 'error');
424
+ $zip_progress->log(__("This error may be related to missing space. (filled during backup)", 'backup-migration'), 'error');
425
+ $zip_progress->log(__("Path: ", 'backup-migration') . $backup_path, 'error');
426
+
427
+ // Close backup
428
+ @unlink(BMI_BACKUPS . '/.running');
429
+ @unlink(BMI_BACKUPS . '/.abort');
430
+
431
+ // Log and close log
432
+ $zip_progress->end();
433
+
434
+ // Return error
435
+ return ['status' => 'error'];
436
+ }
437
+
438
+ // End zip log
439
+ $zip_progress->log(__("New backup created and its name is: ", 'backup-migration') . $name, 'success');
440
+ $zip_progress->end();
441
+
442
+ // Unlink progress
443
+ @unlink(BMI_BACKUPS . '/.running');
444
+ @unlink(BMI_BACKUPS . '/.abort');
445
+
446
+ // Return
447
+ Logger::log(__("New backup created and its name is: ", 'backup-migration') . $name);
448
+
449
+ return ['status' => 'success', 'filename' => $name, 'root' => plugin_dir_url(BMI_ROOT_FILE)];
450
+ }
451
+
452
+ public function getBackupsList() {
453
+
454
+ // Require File Scanner
455
+ require_once BMI_INCLUDES . '/scanner/backups.php';
456
+
457
+ // Get backups
458
+ $backups = new Backups();
459
+ $manifests = $backups->getAvailableBackups();
460
+
461
+ // Return files
462
+ return ['status' => 'success', 'backups' => $manifests];
463
+ }
464
+
465
+ public function restoreBackup() {
466
+
467
+ // Require File Scanner
468
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
469
+ require_once BMI_INCLUDES . '/extracter/extract.php';
470
+ require_once BMI_INCLUDES . '/progress/migration.php';
471
+ require_once BMI_INCLUDES . '/check/checker.php';
472
+
473
+ // Progress & lock file
474
+ $lock = BMI_BACKUPS . '/.migration_lock';
475
+ $progress = BMI_BACKUPS . '/latest_migration_progress.log';
476
+
477
+ if (file_exists($lock) && (time() - filemtime($lock)) < 65) {
478
+ return ['status' => 'msg', 'why' => __('Download process is currently running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
479
+ }
480
+
481
+ // Logs
482
+ $migration = new MigrationProgress($this->post['remote']);
483
+ $migration->start();
484
+
485
+ // Checker
486
+ $checker = new Checker($migration);
487
+ $zipper = new Zipper();
488
+
489
+ // Handle remote
490
+ if ($this->post['file']) {
491
+ $migration->log(__('Restore process responded', 'backup-migration'), 'SUCCESS');
492
+ }
493
+
494
+ // Make lock file
495
+ $migration->log(__('Locking migration process', 'backup-migration'), 'SUCCESS');
496
+ touch($lock);
497
+
498
+ // Initializing
499
+ $migration->log(__('Initializing restore process', 'backup-migration'), 'STEP');
500
+ $migration->log((__("Backup & Migration version: ", 'backup-migration') . BMI_VERSION), 'info');
501
+ $migration->log(__("Site which will be restored: ", 'backup-migration') . $this->siteURL(), 'info');
502
+
503
+ // Check file size
504
+ $zippath = BMP::fixSlashes(BMI_BACKUPS) . DIRECTORY_SEPARATOR . $this->post['file'];
505
+ $manifest = $zipper->getZipFileContent($zippath, 'bmi_backup_manifest.json');
506
+ $migration->log(__('Free space checking...', 'backup-migration'), 'STEP');
507
+ $migration->log(__('Checking if there is enough amount of free space', 'backup-migration'), 'INFO');
508
+ if ($manifest) {
509
+ if (isset($manifest->bytes) && $manifest->bytes) {
510
+ $bytes = intval($manifest->bytes * 1.2);
511
+ if (!$checker->check_free_space($bytes)) {
512
+ $migration->log(__('Cannot start migration process', 'backup-migration'), 'ERROR');
513
+ $migration->log(__('Error: There is not enough space on the server, checked: ' . ($bytes) . ' bytes.', 'backup-migration'), 'ERROR');
514
+ $migration->log(__('Aborting...', 'backup-migration'), 'ERROR');
515
+ $migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
516
+
517
+ @unlink($lock);
518
+ $migration->end();
519
+
520
+ return ['status' => 'error'];
521
+ } else {
522
+ $migration->log(__('Confirmed, there is enough space on the device, checked: ' . ($bytes) . ' bytes.', 'backup-migration'), 'SUCCESS');
523
+ }
524
+ }
525
+ } else {
526
+ $migration->log(__('Cannot start migration process', 'backup-migration'), 'ERROR');
527
+ $migration->log(__('Error: Could not find manifest in backup, file may be broken', 'backup-migration'), 'ERROR');
528
+ $migration->log(__('Error: Btw. because of this I also cannot check free space', 'backup-migration'), 'ERROR');
529
+ $migration->log(__('Aborting...', 'backup-migration'), 'ERROR');
530
+ $migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
531
+
532
+ @unlink($lock);
533
+ $migration->end();
534
+
535
+ return ['status' => 'error'];
536
+ }
537
+
538
+ // New extracter
539
+ $extracter = new Extracter($this->post['file'], $migration);
540
+
541
+ // Extract
542
+ $isFine = $extracter->extractTo();
543
+ if (!$isFine) {
544
+ $migration->log(__('Aborting...', 'backup-migration'), 'ERROR');
545
+ $migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
546
+
547
+ @unlink($lock);
548
+ $migration->end();
549
+
550
+ return ['status' => 'error'];
551
+ }
552
+
553
+ $migration->progress('100');
554
+ $migration->log(__('Restore process completed', 'backup-migration'), 'SUCCESS');
555
+ $migration->log(__('Finalizing restored files', 'backup-migration'), 'STEP');
556
+ $migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
557
+ @unlink($lock);
558
+
559
+ $migration->end();
560
+
561
+ return ['status' => 'success'];
562
+ }
563
+
564
+ public function isRunningBackup() {
565
+ if (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) <= 65) {
566
+ return ['status' => 'msg', 'why' => __('Backup process already running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
567
+ } else {
568
+ return ['status' => 'success'];
569
+ }
570
+ }
571
+
572
+ public function stopBackup() {
573
+ if (!file_exists(BMI_BACKUPS . '/.running')) {
574
+ return ['status' => 'msg', 'why' => __('Backup process completed or is not running.', 'backup-migration'), 'level' => 'info'];
575
+ } else {
576
+ if (!file_exists(BMI_BACKUPS . '/.abort')) {
577
+ touch(BMI_BACKUPS . '/.abort');
578
+ }
579
+
580
+ return ['status' => 'success'];
581
+ }
582
+ }
583
+
584
+ public function isMigrationLocked() {
585
+ $lock = BMI_BACKUPS . '/.migration_lock';
586
+ if (file_exists($lock) && (time() - filemtime($lock)) < 65) {
587
+ return ['status' => 'msg', 'why' => __('Download process is currently running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
588
+ } else {
589
+ require_once BMI_INCLUDES . '/progress/migration.php';
590
+ $progress = BMI_BACKUPS . '/latest_migration_progress.log';
591
+ $migration = new MigrationProgress();
592
+ $migration->start();
593
+ $migration->log(__('Initializing restore process...', 'backup-migration'), 'STEP');
594
+ $migration->end();
595
+
596
+ file_put_contents($progress, '0');
597
+
598
+ return ['status' => 'success'];
599
+ }
600
+ }
601
+
602
+ public function downloadFile($url, $dest, $progress, $lock) {
603
+ $current_percentage = 0;
604
+ $fp = fopen($dest, 'w+');
605
+
606
+ $progressfile = $progress;
607
+ $lockfile = $lock;
608
+
609
+ $ch = curl_init(str_replace(' ', '%20', $url));
610
+ curl_setopt($ch, CURLOPT_TIMEOUT, 500);
611
+
612
+ curl_setopt($ch, CURLOPT_FILE, $fp);
613
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
614
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
615
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
616
+
617
+ curl_setopt($ch, CURLOPT_NOPROGRESS, false);
618
+ curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function ($resource, $download_size, $downloaded) use (&$current_percentage, &$lockfile, &$progressfile) {
619
+ if ($download_size > 0) {
620
+ $new_percentage = intval(($downloaded / $download_size) * 100);
621
+
622
+ if (intval($current_percentage) != intval($new_percentage)) {
623
+ $current_percentage = $new_percentage;
624
+ file_put_contents($progressfile, $current_percentage);
625
+ touch($lockfile);
626
+ }
627
+ }
628
+ });
629
+
630
+ curl_exec($ch);
631
+ $this->lastCurlCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
632
+
633
+ $error_msg = false;
634
+ if (curl_errno($ch)) {
635
+ $error_msg = curl_error($ch);
636
+ }
637
+
638
+ curl_close($ch);
639
+ fclose($fp);
640
+
641
+ if ($error_msg) {
642
+ return $error_msg;
643
+ } else {
644
+ return false;
645
+ }
646
+ }
647
+
648
+ public function handleQuickMigration() {
649
+ $lock = BMI_BACKUPS . '/.migration_lock';
650
+ if (file_exists($lock) && (time() - filemtime($lock)) < 65) {
651
+ return ['status' => 'msg', 'why' => __('Download process is currently running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
652
+ }
653
+
654
+ require_once BMI_INCLUDES . '/progress/migration.php';
655
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
656
+
657
+ $migration = new MigrationProgress(true);
658
+ $migration->start();
659
+
660
+ $tmp_name = 'backup_' . time() . '.zip';
661
+ $url = $this->post['url'];
662
+ $dest = BMI_BACKUPS . '/' . $tmp_name;
663
+ $progress = BMI_BACKUPS . '/latest_migration_progress.log';
664
+
665
+ $migration->log(__('Creating lock file', 'backup-migration'));
666
+ file_put_contents($lock, '');
667
+ $migration->log(__('Initializing download process', 'backup-migration'), 'STEP');
668
+ $downstart = microtime(true);
669
+ $migration->log(__('Downloading initialized', 'backup-migration'), 'SUCCESS');
670
+ $migration->log(__('Downloading remote file...', 'backup-migration'), 'STEP');
671
+ $fileError = $this->downloadFile($url, $dest, $progress, $lock);
672
+ $migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
673
+ @unlink($lock);
674
+
675
+ if ($fileError) {
676
+ $migration->log(__('Removing downloaded file', 'backup-migration'), 'INFO');
677
+ @unlink($dest);
678
+ $migration->log(__('Download error', 'backup-migration'), 'ERROR');
679
+
680
+ if (strpos($fileError, 'Failed writing body') !== false) {
681
+ $migration->log(__('Error: There is not enough space on the server', 'backup-migration'), 'ERROR');
682
+ } else {
683
+ $migration->log(__('Error', 'backup-migration') . ': ' . $fileError, 'ERROR');
684
+ }
685
+
686
+ $migration->end();
687
+
688
+ return ['status' => 'error'];
689
+ } else {
690
+ $migration->log(__('Download completed (took: ', 'backup-migration') . (microtime(true) - $downstart) . 's)', 'SUCCESS');
691
+ $migration->log(__('Looking for backup manifest', 'backup-migration'), 'STEP');
692
+ $zipper = new Zipper();
693
+ $content = $zipper->getZipFileContent($dest, 'bmi_backup_manifest.json');
694
+ if ($content) {
695
+ try {
696
+ $i = 1;
697
+ $name = $content->name;
698
+ $prepared_name = $name;
699
+ $migration->log(__('Manifest found remote name: ', 'backup-migration') . $name, 'SUCCESS');
700
+
701
+ while (file_exists(BMI_BACKUPS . '/' . $prepared_name)) {
702
+ $prepared_name = substr($name, 0, -4) . '_' . $i . '.zip';
703
+ $i++;
704
+ }
705
+
706
+ rename($dest, BMI_BACKUPS . '/' . $prepared_name);
707
+ $migration->log(__('Requesting restore process', 'backup-migration'), 'STEP');
708
+
709
+ $migration->end();
710
+ file_put_contents($progress, '0');
711
+
712
+ return ['status' => 'success', 'name' => $prepared_name];
713
+ } catch (\Exception $e) {
714
+ $migration->log(__('Error: ', 'backup-migration') . $e, 'ERROR');
715
+ $migration->log(__('Removing downloaded file', 'backup-migration'), 'ERROR');
716
+ @unlink($dest);
717
+
718
+ $migration->end();
719
+
720
+ return ['status' => 'error'];
721
+ } catch (\Throwable $e) {
722
+ $migration->log(__('Error: ', 'backup-migration') . $e, 'ERROR');
723
+ $migration->log(__('Removing downloaded file', 'backup-migration'), 'ERROR');
724
+ @unlink($dest);
725
+
726
+ $migration->end();
727
+
728
+ return ['status' => 'error'];
729
+ }
730
+ } else {
731
+ if ($this->lastCurlCode == '403') {
732
+ $migration->log(__('Backup is not available to download (Error 403).', 'backup-migration'), 'ERROR');
733
+ $migration->log(__('It is restricted by remote server configuration.', 'backup-migration'), 'ERROR');
734
+ } elseif ($this->lastCurlCode == '423') {
735
+ $migration->log(__('Backup is locked on remote site, please unlock remote downloading.', 'backup-migration'), 'ERROR');
736
+ $migration->log(__('You can find the setting in "Where shall the backup(s) be stored?" section.', 'backup-migration'), 'ERROR');
737
+ } elseif ($this->lastCurlCode == '200' || $this->lastCurlCode == '404') {
738
+ $migration->log(__('Backup does not exist under provided URL.', 'backup-migration'), 'ERROR');
739
+ $migration->log(__('Please confirm that you can download the backup file via provided URL.', 'backup-migration'), 'ERROR');
740
+ $migration->log(__('...or the manifest file does not exist in the backup.', 'backup-migration'), 'ERROR');
741
+ $migration->log(__('Missing manifest means that the backup is probably invalid.', 'backup-migration'), 'ERROR');
742
+ } else {
743
+ $migration->log(__('Manifest file does not exist', 'backup-migration'), 'ERROR');
744
+ $migration->log(__('Downloaded backup may be incomplete (missing manifest)', 'backup-migration'), 'ERROR');
745
+ $migration->log(__('...or provided URL is not a direct download of ZIP file.', 'backup-migration'), 'ERROR');
746
+ $migration->log(__('Removing downloaded file', 'backup-migration'), 'ERROR');
747
+ }
748
+
749
+ @unlink($dest);
750
+ $migration->end();
751
+
752
+ return ['status' => 'error'];
753
+ }
754
+ }
755
+ }
756
+
757
+ public function handleChunkUpload() {
758
+ require_once BMI_INCLUDES . '/uploader/chunks.php';
759
+ }
760
+
761
+ public function removeBackupFile() {
762
+ $files = $this->post['filenames'];
763
+
764
+ try {
765
+ if (is_array($files)) {
766
+ for ($i = 0; $i < sizeof($files); $i++) {
767
+ $file = $files[$i];
768
+ $file = preg_replace('/\.\./', '', $file);
769
+ if (file_exists(BMI_BACKUPS . '/' . $file)) {
770
+ unlink(BMI_BACKUPS . '/' . $file);
771
+ }
772
+ }
773
+ }
774
+ } catch (\Exception $e) {
775
+ return ['status' => 'error', 'e' => $e];
776
+ } catch (\Throwable $e) {
777
+ return ['status' => 'error', 'e' => $e];
778
+ }
779
+
780
+ return ['status' => 'success'];
781
+ }
782
+
783
+ public function saveStorageConfig() {
784
+ $dir_path = $this->post['directory']; // STORAGE::LOCAL::PATH
785
+ $accessible = $this->post['access']; // TORAGE::DIRECT::URL
786
+ $curr_path = Dashboard\bmi_get_config('STORAGE::LOCAL::PATH');
787
+
788
+ $error = 0;
789
+ $created = false;
790
+
791
+ if (!file_exists($dir_path)) {
792
+ $created = true;
793
+ @mkdir($dir_path, 0755, true);
794
+ }
795
+
796
+ if (is_writable($dir_path)) {
797
+ if (!Dashboard\bmi_set_config('STORAGE::DIRECT::URL', $accessible)) {
798
+ $error++;
799
+ }
800
+ if (!Dashboard\bmi_set_config('STORAGE::LOCAL::PATH', $dir_path)) {
801
+ $error++;
802
+ } else {
803
+ $cur_dir = BMP::fixSlashes($curr_path . DIRECTORY_SEPARATOR . 'backups');
804
+ $new_dir = BMP::fixSlashes($dir_path . DIRECTORY_SEPARATOR . 'backups');
805
+
806
+ if ($cur_dir != $new_dir) {
807
+ $scanned_directory = array_diff(scandir($cur_dir), ['..', '.']);
808
+ if (!file_exists($new_dir)) {
809
+ @mkdir($new_dir, 0755, true);
810
+ }
811
+ foreach ($scanned_directory as $i => $file) {
812
+ rename($cur_dir . DIRECTORY_SEPARATOR . $file, $new_dir . DIRECTORY_SEPARATOR . $file);
813
+ }
814
+
815
+ @rmdir($cur_dir);
816
+ @rmdir(dirname($cur_dir));
817
+ }
818
+ }
819
+ } else {
820
+ if ($created === true) {
821
+ @unlink($dir_path);
822
+ }
823
+
824
+ return ['status' => 'msg', 'why' => __('Entered path is not writable, cannot be used.', 'backup-migration'), 'level' => 'warning'];
825
+ }
826
+
827
+ return ['status' => 'success', 'errors' => $error];
828
+ }
829
+
830
+ public function saveOtherOptions() {
831
+
832
+ // Errors
833
+ $invalid_email = __('Provided email addess is not valid.', 'backup-migration');
834
+ $title_long = __('Your email title is too long, please change the title (max 64 chars).', 'backup-migration');
835
+ $title_short = __('Your email title is too short, please use longer one (at least 3 chars).', 'backup-migration');
836
+ $title_empty = __('Title field is required, please fill it.', 'backup-migration');
837
+ $email_empty = __('Email field cannot be empty, please fill it.', 'backup-migration');
838
+
839
+ $email = trim($this->post['email']); // OTHER:EMAIL
840
+ $email_title = trim($this->post['email_title']); // OTHER:EMAIL:TITLE
841
+ $schedule_issues = $this->post['schedule_issues'] === 'true' ? true : false; // OTHER:EMAIL:NOTIS
842
+ $uninstall_config = $this->post['uninstall_config'] === 'true' ? true : false; // OTHER:UNINSTALL:CONFIGS
843
+ $uninstall_backups = $this->post['uninstall_backups'] === 'true' ? true : false; // OTHER:UNINSTALL:BACKUPS
844
+
845
+ if (strlen($email) <= 0) {
846
+ return ['status' => 'msg', 'why' => $email_empty, 'level' => 'warning'];
847
+ }
848
+ if (strlen($email_title) <= 0) {
849
+ return ['status' => 'msg', 'why' => $title_empty, 'level' => 'warning'];
850
+ }
851
+ if (strlen($email_title) > 64) {
852
+ return ['status' => 'msg', 'why' => $title_long, 'level' => 'warning'];
853
+ }
854
+ if (strlen($email_title) < 3) {
855
+ return ['status' => 'msg', 'why' => $title_short, 'level' => 'warning'];
856
+ }
857
+ if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
858
+ return ['status' => 'msg', 'why' => $invalid_email, 'level' => 'warning'];
859
+ }
860
+
861
+ $error = 0;
862
+ if (!Dashboard\bmi_set_config('OTHER:EMAIL', $email)) {
863
+ $error++;
864
+ }
865
+ if (!Dashboard\bmi_set_config('OTHER:EMAIL:TITLE', $email_title)) {
866
+ $error++;
867
+ }
868
+ if (!Dashboard\bmi_set_config('OTHER:EMAIL:NOTIS', $schedule_issues)) {
869
+ $error++;
870
+ }
871
+ if (!Dashboard\bmi_set_config('OTHER:UNINSTALL:CONFIGS', $uninstall_config)) {
872
+ $error++;
873
+ }
874
+ if (!Dashboard\bmi_set_config('OTHER:UNINSTALL:BACKUPS', $uninstall_backups)) {
875
+ $error++;
876
+ }
877
+
878
+ return ['status' => 'success', 'errors' => $error];
879
+ }
880
+
881
+ public function saveStorageTypeConfig() {
882
+
883
+ // Errors
884
+ $name_empty = __('Name is required, please fill the input.', 'backup-migration');
885
+ $name_long = __('Your name is too long, please change the name.', 'backup-migration');
886
+ $name_short = __('Your name is too short, please create longer one.', 'backup-migration');
887
+ $name_space = __('Please, do not use spaces in file name.', 'backup-migration');
888
+ $name_forbidden = __('Your name contains character(s) that are not allowed in file names: ', 'backup-migration');
889
+
890
+ $forbidden_chars = ['/', '\\', '<', '>', ':', '"', "'", '|', '?', '*', '.', ';', '@', '!', '~', '`', ',', '#', '$', '&', '=', '+'];
891
+ $name = trim($this->post['name']); // BACKUP:NAME
892
+
893
+ if (strlen($name) == 0) {
894
+ return ['status' => 'msg', 'why' => $name_empty, 'level' => 'warning'];
895
+ }
896
+ if (strlen($name) > 40) {
897
+ return ['status' => 'msg', 'why' => $name_long, 'level' => 'warning'];
898
+ }
899
+ if (strlen($name) < 3) {
900
+ return ['status' => 'msg', 'why' => $name_short, 'level' => 'warning'];
901
+ }
902
+ if (strpos($name, ' ') !== false) {
903
+ return ['status' => 'msg', 'why' => $name_space, 'level' => 'warning'];
904
+ }
905
+
906
+ for ($i = 0; $i < sizeof($forbidden_chars); ++$i) {
907
+ $char = $forbidden_chars[$i];
908
+ if (strpos($name, $char) !== false) {
909
+ return ['status' => 'msg', 'why' => $name_forbidden . $char, 'level' => 'warning'];
910
+ }
911
+ }
912
+
913
+ $error = 0;
914
+ if (!Dashboard\bmi_set_config('BACKUP:NAME', $name)) {
915
+ $error++;
916
+ }
917
+
918
+ return ['status' => 'success', 'errors' => $error];
919
+ }
920
+
921
+ public function saveFilesConfig() {
922
+ $db_group = $this->post['database_group']; // BACKUP:DATABASE
923
+ $files_group = $this->post['files_group']; // BACKUP:FILES
924
+
925
+ $fgp = $this->post['files-group-plugins']; // BACKUP:FILES::PLUGINS
926
+ $fgu = $this->post['files-group-uploads']; // BACKUP:FILES::UPLOADS
927
+ $fgt = $this->post['files-group-themes']; // BACKUP:FILES::THEMES
928
+ $fgoc = $this->post['files-group-other-contents']; // BACKUP:FILES::OTHERS
929
+ $fgwp = $this->post['files-group-wp-install']; // BACKUP:FILES::WP
930
+
931
+ $file_filters = $this->post['files_by_filters']; // BACKUP:FILES::FILTER
932
+ $ffs = $this->post['ex_b_fs']; // BACKUP:FILES::FILTER:SIZE
933
+ $ffsizemax = $this->post['BFFSIN']; // BACKUP:FILES::FILTER:SIZE:IN
934
+ $ffn = $this->post['ex_b_names']; // BACKUP:FILES::FILTER:NAMES
935
+ $ffp = $this->post['ex_b_fpaths']; // BACKUP:FILES::FILTER:FPATHS
936
+ $ffd = $this->post['ex_b_dpaths']; // BACKUP:FILES::FILTER:DPATHS
937
+
938
+ $existant = [];
939
+ $parsed = [];
940
+ $ffnames = $this->post['dynamic-names']; // BACKUP:FILES::FILTER:NAMES:IN
941
+ $ffpnames = array_unique($this->post['dynamic-fpaths-names']); // BACKUP:FILES::FILTER:FPATHS:IN
942
+ $ffdnames = array_unique($this->post['dynamic-dpaths-names']); // BACKUP:FILES::FILTER:DPATHS:IN
943
+
944
+
945
+ $max = sizeof($ffpnames);
946
+ for ($i = 0; $i < $max; ++$i) {
947
+ if (!is_string($ffpnames[$i]) || trim(strlen($ffpnames[$i])) <= 1) {
948
+ array_splice($ffpnames, $i, 1);
949
+ $i--;
950
+ $max--;
951
+ }
952
+ }
953
+
954
+ $max = sizeof($ffdnames);
955
+ for ($i = 0; $i < $max; ++$i) {
956
+ if (!is_string($ffdnames[$i]) || trim(strlen($ffdnames[$i])) <= 1) {
957
+ array_splice($ffdnames, $i, 1);
958
+ $i--;
959
+ $max--;
960
+ }
961
+ }
962
+
963
+ for ($i = 0; $i < sizeof($ffnames); ++$i) {
964
+ $row = $ffnames[$i];
965
+ $txt = array_key_exists('txt', $row) ? "" . $row['txt'] . "" : false;
966
+ $pos = array_key_exists('pos', $row) ? $row['pos'] : false;
967
+ $whr = array_key_exists('whr', $row) ? $row['whr'] : false;
968
+
969
+ if ($txt === false || $pos === false || $whr === false) {
970
+ continue;
971
+ }
972
+ if (trim(strlen($txt)) <= 0) {
973
+ continue;
974
+ }
975
+ if (!in_array($pos, ["1", "2", "3"])) {
976
+ continue;
977
+ }
978
+ if (!in_array($whr, ["1", "2"])) {
979
+ continue;
980
+ }
981
+ if (in_array($txt . $pos . $whr, $existant)) {
982
+ continue;
983
+ } else {
984
+ $existant[] = $txt . $pos . $whr;
985
+ }
986
+
987
+ $parsed[] = ['txt' => $txt, 'pos' => $pos, 'whr' => $whr];
988
+ }
989
+
990
+ if ($ffs == 'true' && !is_numeric($ffsizemax)) {
991
+ return ['status' => 'msg', 'why' => __('Entred file size limit, is not correct number.', 'backup-migration'), 'level' => 'warning'];
992
+ }
993
+
994
+ $error = 0;
995
+ if (!Dashboard\bmi_set_config('BACKUP:DATABASE', $db_group)) {
996
+ $error++;
997
+ }
998
+ if (!Dashboard\bmi_set_config('BACKUP:FILES', $files_group)) {
999
+ $error++;
1000
+ }
1001
+
1002
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::PLUGINS', $fgp)) {
1003
+ $error++;
1004
+ }
1005
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::UPLOADS', $fgu)) {
1006
+ $error++;
1007
+ }
1008
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::THEMES', $fgt)) {
1009
+ $error++;
1010
+ }
1011
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::OTHERS', $fgoc)) {
1012
+ $error++;
1013
+ }
1014
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::WP', $fgwp)) {
1015
+ $error++;
1016
+ }
1017
+
1018
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER', $file_filters)) {
1019
+ $error++;
1020
+ }
1021
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:SIZE', $ffs)) {
1022
+ $error++;
1023
+ }
1024
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:NAMES', $ffn)) {
1025
+ $error++;
1026
+ }
1027
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:FPATHS', $ffp)) {
1028
+ $error++;
1029
+ }
1030
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:DPATHS', $ffd)) {
1031
+ $error++;
1032
+ }
1033
+
1034
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:SIZE:IN', $ffsizemax)) {
1035
+ $error++;
1036
+ }
1037
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:NAMES:IN', $parsed)) {
1038
+ $error++;
1039
+ }
1040
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:FPATHS:IN', $ffpnames)) {
1041
+ $error++;
1042
+ }
1043
+ if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:DPATHS:IN', $ffdnames)) {
1044
+ $error++;
1045
+ }
1046
+
1047
+ // return array('status' => 'msg', 'why' => __('Entred path is not writable or does not exist.', 'backup-migration'), 'level' => 'warning');
1048
+
1049
+ return ['status' => 'success', 'errors' => $error];
1050
+ }
1051
+
1052
+ public function scanFilesForBackup(&$progress) {
1053
+ require_once BMI_INCLUDES . '/scanner/files.php';
1054
+
1055
+ // Use filters?
1056
+ $is = Dashboard\bmi_get_config('BACKUP:FILES::FILTER') === 'true' ? true : false;
1057
+
1058
+ // Get settings form config
1059
+ $fgp = Dashboard\bmi_get_config('BACKUP:FILES::PLUGINS');
1060
+ $fgt = Dashboard\bmi_get_config('BACKUP:FILES::THEMES');
1061
+ $fgu = Dashboard\bmi_get_config('BACKUP:FILES::UPLOADS');
1062
+ $fgoc = Dashboard\bmi_get_config('BACKUP:FILES::OTHERS');
1063
+ $fgwp = Dashboard\bmi_get_config('BACKUP:FILES::WP');
1064
+ $dpathsis = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:DPATHS') === 'true' ? true : false;
1065
+ $dpaths = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:DPATHS:IN');
1066
+ $dynamesis = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES') === 'true' ? true : false;
1067
+ $dynames = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES:IN');
1068
+ $dynparsed = [];
1069
+
1070
+ // Filter dynames to for smaller size
1071
+ if ($is && $dynamesis) {
1072
+ for ($i = 0; $i < sizeof($dynames); ++$i) {
1073
+ $s = $dynames[$i];
1074
+ if ($s->whr == '2') {
1075
+ $dynparsed[] = ['s' => $s->txt, 'w' => $s->pos, 'z' => strlen($s->txt)];
1076
+ }
1077
+ }
1078
+ }
1079
+
1080
+ // Set exclusion rules
1081
+ $ignored_folders_default = [];
1082
+ if ($is && $dynamesis) {
1083
+ BMP::merge_arrays($ignored_folders_default, $dynparsed);
1084
+ }
1085
+ $ignored_folders = $ignored_folders_default;
1086
+ $ignored_paths_default = [BMI_CONFIG_DIR, BMI_BACKUPS, BMI_ROOT_DIR];
1087
+ if ($is && $dpathsis) {
1088
+ BMP::merge_arrays($ignored_paths_default, $dpaths);
1089
+ }
1090
+ $ignored_paths = $ignored_paths_default;
1091
+
1092
+ // Fix slashes for current system
1093
+ for ($i = 0; $i < sizeof($ignored_paths); ++$i) {
1094
+ $ignored_paths[$i] = BMP::fixSlashes($ignored_paths[$i]);
1095
+ }
1096
+
1097
+ // WordPress Paths
1098
+ $plugins_path = BMP::fixSlashes(WP_PLUGIN_DIR);
1099
+ $themes_path = BMP::fixSlashes(dirname(get_template_directory()));
1100
+ $uploads_path = BMP::fixSlashes(wp_upload_dir()['basedir']);
1101
+ $wp_contents = BMP::fixSlashes(WP_CONTENT_DIR);
1102
+ $wp_install = BMP::fixSlashes(ABSPATH);
1103
+
1104
+ // Getting plugins
1105
+ $sfgp = Scanner::equalFolderByPath($wp_install, $plugins_path, $ignored_folders);
1106
+ if ($fgp == 'true' && !$sfgp) {
1107
+ $plugins_path_files = Scanner::scanFilesGetNamesWithIgnoreFBC($plugins_path, $ignored_folders, $ignored_paths);
1108
+ }
1109
+
1110
+ // Getting themes
1111
+ $sfgt = Scanner::equalFolderByPath($wp_install, $themes_path, $ignored_folders);
1112
+ if ($fgt == 'true' && !$sfgt) {
1113
+ $themes_path_files = Scanner::scanFilesGetNamesWithIgnoreFBC($themes_path, $ignored_folders, $ignored_paths);
1114
+ }
1115
+
1116
+ // Getting uploads
1117
+ $sfgu = Scanner::equalFolderByPath($wp_install, $uploads_path, $ignored_folders);
1118
+ if ($fgu == 'true' && !$sfgu) {
1119
+ $uploads_path_files = Scanner::scanFilesGetNamesWithIgnoreFBC($uploads_path, $ignored_folders, $ignored_paths);
1120
+ }
1121
+
1122
+ // Ignore above paths
1123
+ $sfgoc = Scanner::equalFolderByPath($wp_install, $wp_contents, $ignored_folders);
1124
+ if ($fgoc == 'true' && !$sfgoc) {
1125
+
1126
+ // Ignore common folders (already scanned)
1127
+ $content_folders = [$plugins_path, $themes_path, $uploads_path];
1128
+ BMP::merge_arrays($content_folders, $ignored_paths);
1129
+
1130
+ // Getting other contents
1131
+ $wp_contents_files = Scanner::scanFilesGetNamesWithIgnoreFBC($wp_contents, $ignored_folders, $content_folders);
1132
+ }
1133
+
1134
+ // Ignore contents path
1135
+ if ($fgwp == 'true') {
1136
+
1137
+ // Ignore contents file
1138
+ $ignored_paths[] = $wp_contents;
1139
+
1140
+ // Getting WP Installation
1141
+ $wp_install_files = Scanner::scanFilesGetNamesWithIgnoreFBC($wp_install, $ignored_folders, $ignored_paths);
1142
+ }
1143
+
1144
+ // Concat all file paths
1145
+ $all_files = [];
1146
+ if ($fgp == 'true' && !$sfgp) {
1147
+ BMP::merge_arrays($all_files, $plugins_path_files);
1148
+ unset($plugins_path_files);
1149
+ }
1150
+
1151
+ if ($fgt == 'true' && !$sfgt) {
1152
+ BMP::merge_arrays($all_files, $themes_path_files);
1153
+ unset($themes_path_files);
1154
+ }
1155
+
1156
+ if ($fgu == 'true' && !$sfgu) {
1157
+ BMP::merge_arrays($all_files, $uploads_path_files);
1158
+ unset($uploads_path_files);
1159
+ }
1160
+
1161
+ if ($fgoc == 'true' && !$sfgoc) {
1162
+ BMP::merge_arrays($all_files, $wp_contents_files);
1163
+ unset($wp_contents_files);
1164
+ }
1165
+
1166
+ if ($fgwp == 'true') {
1167
+ BMP::merge_arrays($all_files, $wp_install_files);
1168
+ unset($wp_install_files);
1169
+ }
1170
+
1171
+ return $all_files;
1172
+ }
1173
+
1174
+ public function parseFilesForBackup(&$files, &$progress) {
1175
+ $is = Dashboard\bmi_get_config('BACKUP:FILES::FILTER') === 'true' ? true : false;
1176
+ $acis = (Dashboard\bmi_get_config('BACKUP:FILES::FILTER:FPATHS') === 'true' && $is) ? true : false;
1177
+ $ac = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:FPATHS:IN');
1178
+
1179
+ $abis = (Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES') === 'true' && $is) ? true : false;
1180
+ $ab = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES:IN');
1181
+ $abres = [];
1182
+ $acres = new \stdClass();
1183
+
1184
+ if ($is && $acis) {
1185
+ foreach ($ac as $key => $value) {
1186
+ $value = BMP::fixSlashes($value);
1187
+ $acres->{$value} = 1;
1188
+ }
1189
+ }
1190
+
1191
+ if ($is && $abis) {
1192
+ for ($i = 0; $i < sizeof($ab); ++$i) {
1193
+ $s = $ab[$i];
1194
+ if ($s->whr == '1') {
1195
+ $abres[] = ['s' => $s->txt, 'w' => $s->pos, 'z' => strlen($s->txt)];
1196
+ }
1197
+ }
1198
+ }
1199
+
1200
+ $sizemax = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:SIZE:IN');
1201
+ $usesize = (Dashboard\bmi_get_config('BACKUP:FILES::FILTER:SIZE') === 'true' && $is) ? true : false;
1202
+ if (!is_numeric($sizemax)) {
1203
+ $usesize = false;
1204
+ $sizemax = 99999;
1205
+ } else {
1206
+ intval($sizemax);
1207
+ }
1208
+
1209
+ $total_size = 0;
1210
+ $max = $sizemax * (1024 * 1024);
1211
+ $maxfor = sizeof($files);
1212
+ for ($i = 0; $i < $maxfor; ++$i) {
1213
+
1214
+ // Remove size from path and get the size
1215
+ $files[$i] = explode(',', $files[$i]);
1216
+ $last = sizeof($files[$i]) - 1;
1217
+ $size = intval($files[$i][$last]);
1218
+ unset($files[$i][$last]);
1219
+ $files[$i] = implode(',', $files[$i]);
1220
+
1221
+ if ($usesize && Scanner::fileTooLarge($size, $max)) {
1222
+ $progress->log(__("Removing file from backup (too large) ", 'backup-migration') . $files[$i] . ' (' . number_format(($size / 1024 / 1024), 2) . ' MB)', 'WARN');
1223
+ array_splice($files, $i, 1);
1224
+ $maxfor--;
1225
+ $i--;
1226
+
1227
+ continue;
1228
+ }
1229
+
1230
+ if ($abis && Scanner::equalFolder(basename($files[$i]), $abres)) {
1231
+ $progress->log(__("Removing file from backup (due to exclude rules): ", 'backup-migration') . $files[$i], 'WARN');
1232
+ array_splice($files, $i, 1);
1233
+ $maxfor--;
1234
+ $i--;
1235
+
1236
+ continue;
1237
+ }
1238
+
1239
+ if ($acis && property_exists($acres, $files[$i])) {
1240
+ $progress->log(__("Removing file from backup (due to path rules): ", 'backup-migration') . $files[$i], 'WARN');
1241
+ array_splice($files, $i, 1);
1242
+ $maxfor--;
1243
+ $i--;
1244
+
1245
+ continue;
1246
+ }
1247
+
1248
+ $total_size += $size;
1249
+ }
1250
+
1251
+
1252
+ $this->total_size_for_backup = $total_size;
1253
+ $this->total_size_for_backup_in_mb = ($total_size / 1024 / 1024);
1254
+
1255
+ return $files;
1256
+ }
1257
+
1258
+ public function toggleBackupLock($unlock = false) {
1259
+
1260
+ // Require lib
1261
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
1262
+
1263
+ // Backup name
1264
+ $filename = $this->post['filename'];
1265
+
1266
+ // Init Zipper
1267
+ $zipper = new Zipper();
1268
+
1269
+ // Path to Backup
1270
+ $path = BMI_BACKUPS . DIRECTORY_SEPARATOR . $filename;
1271
+ $path_dir = BMP::fixSlashes(dirname($path));
1272
+
1273
+ // Check if file exists
1274
+ if (!file_exists($path)) {
1275
+ return ['status' => 'fail'];
1276
+ }
1277
+
1278
+ // Check if directory is correct
1279
+ if ($path_dir != BMP::fixSlashes(BMI_BACKUPS)) {
1280
+ return ['status' => 'fail'];
1281
+ }
1282
+
1283
+ // Toggle the lock
1284
+ $status = $zipper->lock_zip($path, $unlock);
1285
+
1286
+ // Return the status
1287
+ return ['status' => ($status ? 'success' : 'fail')];
1288
+ }
1289
+
1290
+ public function getDynamicNames() {
1291
+ $data = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES:IN');
1292
+ $fpdata = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:FPATHS:IN');
1293
+ $fddata = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:DPATHS:IN');
1294
+
1295
+ for ($i = 0; $i < sizeof($fpdata); ++$i) {
1296
+ $fpdata[$i] = BMP::fixSlashes($fpdata[$i]);
1297
+ }
1298
+
1299
+ for ($i = 0; $i < sizeof($fddata); ++$i) {
1300
+ $fddata[$i] = BMP::fixSlashes($fddata[$i]);
1301
+ }
1302
+
1303
+ return [
1304
+ 'status' => 'success',
1305
+ 'dynamic-fpaths-names' => $fpdata,
1306
+ 'dynamic-dpaths-names' => $fddata,
1307
+ 'data' => $data
1308
+ ];
1309
+ }
1310
+
1311
+ public function resetConfiguration() {
1312
+ if (file_exists(BMI_CONFIG_PATH)) {
1313
+ unlink(BMI_CONFIG_PATH);
1314
+ }
1315
+
1316
+ return ['status' => 'success'];
1317
+ }
1318
+
1319
+ public function getSiteData() {
1320
+ require_once BMI_INCLUDES . '/check/system_info.php';
1321
+ $bmi = new SI();
1322
+ $bmi = $bmi->to_array();
1323
+
1324
+ return ['status' => 'success', 'data' => $bmi];
1325
+ }
1326
+
1327
+ public function calculateCron() {
1328
+ require_once BMI_INCLUDES . '/cron/handler.php';
1329
+
1330
+ $minutes = [];
1331
+ $keeps = [];
1332
+ $days = [];
1333
+ $weeks = [];
1334
+ $hours = [];
1335
+
1336
+ for ($i = 1; $i <= 28; ++$i) {
1337
+ $days[] = substr('0' . $i, -2);
1338
+ }
1339
+ for ($i = 1; $i <= 7; ++$i) {
1340
+ $weeks[] = $i . '';
1341
+ }
1342
+ for ($i = 0; $i <= 23; ++$i) {
1343
+ $hours[] = substr('0' . $i, -2);
1344
+ }
1345
+ for ($i = 0; $i <= 55; $i += 5) {
1346
+ $minutes[] = substr('0' . $i, -2);
1347
+ }
1348
+ for ($i = 1; $i <= 20; ++$i) {
1349
+ $keeps[] = $i . '';
1350
+ }
1351
+
1352
+ $errors = 0;
1353
+ if (in_array($this->post['type'], ['month', 'week', 'day'])) {
1354
+ if (!Dashboard\bmi_set_config('CRON:TYPE', $this->post['type'])) {
1355
+ $errors++;
1356
+ }
1357
+ }
1358
+ if (in_array($this->post['day'], $days)) {
1359
+ if (!Dashboard\bmi_set_config('CRON:DAY', $this->post['day'])) {
1360
+ $errors++;
1361
+ }
1362
+ }
1363
+ if (in_array($this->post['week'], $weeks)) {
1364
+ if (!Dashboard\bmi_set_config('CRON:WEEK', $this->post['week'])) {
1365
+ $errors++;
1366
+ }
1367
+ }
1368
+ if (in_array($this->post['hour'], $hours)) {
1369
+ if (!Dashboard\bmi_set_config('CRON:HOUR', $this->post['hour'])) {
1370
+ $errors++;
1371
+ }
1372
+ }
1373
+ if (in_array($this->post['minute'], $minutes)) {
1374
+ if (!Dashboard\bmi_set_config('CRON:MINUTE', $this->post['minute'])) {
1375
+ $errors++;
1376
+ }
1377
+ }
1378
+ if (in_array($this->post['keep'], $keeps)) {
1379
+ if (!Dashboard\bmi_set_config('CRON:KEEP', $this->post['keep'])) {
1380
+ $errors++;
1381
+ }
1382
+ }
1383
+
1384
+ if ($this->post['enabled'] === 'true') {
1385
+ $this->post['enabled'] = true;
1386
+ } else {
1387
+ $this->post['enabled'] = false;
1388
+ }
1389
+
1390
+ if (!Dashboard\bmi_set_config('CRON:ENABLED', $this->post['enabled'])) {
1391
+ $errors++;
1392
+ }
1393
+
1394
+ if ($errors === 0) {
1395
+ $time = Crons::calculate_date([
1396
+ 'type' => $this->post['type'],
1397
+ 'week' => $this->post['week'],
1398
+ 'day' => $this->post['day'],
1399
+ 'hour' => $this->post['hour'],
1400
+ 'minute' => $this->post['minute']
1401
+ ], time());
1402
+
1403
+ $file = BMI_INCLUDES . '/htaccess/.plan';
1404
+ if (file_exists($file)) {
1405
+ $earlier = intval(file_get_contents($file));
1406
+ } else {
1407
+ $earlier = 0;
1408
+ }
1409
+
1410
+ if (!wp_next_scheduled('bmi_do_backup_right_now') || $earlier === 0 || (abs($time - $earlier) >= 15)) {
1411
+ wp_clear_scheduled_hook('bmi_do_backup_right_now');
1412
+ if ($this->post['enabled'] === true) {
1413
+ wp_schedule_single_event($time, 'bmi_do_backup_right_now');
1414
+ file_put_contents($file, $time);
1415
+ }
1416
+ }
1417
+
1418
+ return [
1419
+ 'status' => 'success',
1420
+ 'data' => date('Y-m-d H:i:s', $time),
1421
+ 'currdata' => date('Y-m-d H:i:s')
1422
+ ];
1423
+ } else {
1424
+ return ['status' => 'error'];
1425
+ }
1426
+ }
1427
+
1428
+ public function dismissErrorNotice() {
1429
+ delete_option('bmi_display_email_issues');
1430
+ }
1431
+
1432
+ public function debugging() {
1433
+ }
1434
+ }
includes/check/checker.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Checker;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger AS Logger;
8
+ use BMI\Plugin\Progress\BMI_ZipProgress AS Progress;
9
+
10
+ // Exit on direct access
11
+ if (!defined('ABSPATH')) exit;
12
+
13
+ /**
14
+ * BMI_Checker
15
+ */
16
+ class BMI_Checker {
17
+
18
+ function __construct($progress = false) {
19
+
20
+ $this->issues = array();
21
+ $this->progress = $progress;
22
+
23
+ }
24
+
25
+ public function make_backup_check() {
26
+
27
+ }
28
+
29
+ public function make_restore_check() {
30
+
31
+ }
32
+
33
+ public function logs($log, $status = 'INFO') {
34
+
35
+ if ($this->progress) {
36
+ $this->progress->log($log, $status);
37
+ }
38
+
39
+ }
40
+
41
+ public function is_enabled($func) {
42
+
43
+ $disabled = explode(',', ini_get('disable_functions'));
44
+ return !in_array($func, $disabled);
45
+
46
+ }
47
+
48
+ public function check_free_space($size) {
49
+
50
+ $this->logs('Requires at least ' . $size . ' bytes.');
51
+ if ($this->is_enabled('disk_free_space')) {
52
+
53
+ $this->logs(__('Disk free space function is not disabled - using...', 'backup-migration'));
54
+ $free = intval(disk_free_space(BMI_BACKUPS));
55
+ $this->logs(__('There is ', 'backup-migration') . number_format($free / 1024 / 1024, 2) . __(' MB free.', 'backup-migration'), 'SUCCESS');
56
+ if ($free > $size) {
57
+ $this->logs(__('Great! We have enough space.', 'backup-migration'), 'SUCCESS');
58
+ return true;
59
+ } else {
60
+ return false;
61
+ }
62
+
63
+ } else {
64
+
65
+ // Log
66
+ $this->logs(__('Disk free space function is disabled by hosting.', 'backup-migration'));
67
+ $this->logs(__('Using dummy file to check free space (it can take some time).', 'backup-migration'));
68
+
69
+ // TMP Filename
70
+ $file = BMI_BACKUPS . '/' . '.space_check';
71
+ try {
72
+
73
+ // 2 GB = (1024 * 1024 * 1024 * 2)
74
+ $total = $size;
75
+
76
+ $fh = fopen($file, 'w');
77
+ $chunk = 1024;
78
+ while ($size > 0) {
79
+ fputs($fh, str_pad('', min($chunk, $size)));
80
+ $size -= $chunk;
81
+ }
82
+ fclose($fh);
83
+
84
+ $fs = filesize($file);
85
+ @unlink($file);
86
+
87
+ if ($fs > ($total - 100)) return true;
88
+ else return false;
89
+
90
+ } catch (\Exception $e) {
91
+
92
+ Logger::error($e);
93
+ if (file_exists($file)) unlink($file);
94
+
95
+ return false;
96
+
97
+ } catch (\Throwable $e) {
98
+
99
+ Logger::error($e);
100
+ if (file_exists($file)) unlink($file);
101
+
102
+ return false;
103
+
104
+ }
105
+
106
+ }
107
+
108
+ }
109
+
110
+ }
includes/check/system_info.php ADDED
@@ -0,0 +1,497 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Checker;
5
+
6
+ // Use
7
+ use BMI\Plugin\Backup_Migration_Plugin as BMP;
8
+ use BMI\Plugin\BMI_Logger as Logger;
9
+
10
+ /**
11
+ * Class System_Info
12
+ */
13
+ class System_Info {
14
+ /**
15
+ * Get the available memory
16
+ *
17
+ * @var float|int // flot|int
18
+ */
19
+ protected $memory_available;
20
+
21
+ /**
22
+ * Get the PHP version
23
+ *
24
+ * @var float // Version
25
+ */
26
+ protected $php_version;
27
+
28
+ /**
29
+ * Get the MySQL version
30
+ *
31
+ * @var float // MySQL version
32
+ */
33
+ protected $mysql_version;
34
+
35
+ /**
36
+ * Get the webserver
37
+ *
38
+ * @var String // webserver used.
39
+ */
40
+ protected $webserver;
41
+
42
+ /**
43
+ * Get the Operating Server
44
+ *
45
+ * @var String // OS used.
46
+ */
47
+ protected $os;
48
+ /**
49
+ * Get the Free Space After Backup
50
+ *
51
+ * @var false|float|int
52
+ */
53
+ protected $free_space_after_backup;
54
+
55
+ public function is_enabled($func) {
56
+ $disabled = explode(',', ini_get('disable_functions'));
57
+
58
+ return !in_array($func, $disabled);
59
+ }
60
+
61
+ /**
62
+ * Get the timezone from WordPress details.
63
+ *
64
+ * @return String // timezone
65
+ */
66
+ public function get_timezone() {
67
+ if (! isset($this->timezone)) {
68
+ if (function_exists('wp_timezone')) {
69
+ $this->timezone = wp_timezone()->getName();
70
+ } else {
71
+ $date = new \DateTime();
72
+ $time_zone = $date->getTimezone();
73
+ $this->timezone = $time_zone->getName();
74
+ }
75
+ }
76
+
77
+ return $this->timezone;
78
+ }
79
+
80
+ /**
81
+ * Get the Webserver by executing shell details.
82
+ *
83
+ * @return String // webserver name
84
+ */
85
+ public function get_webserver() {
86
+ if (! isset($this->webserver)) {
87
+ if (isset($_SERVER['SERVER_SOFTWARE'])) {
88
+ $this->webserver = sanitize_text_field(wp_unslash($_SERVER['SERVER_SOFTWARE']));
89
+ }
90
+ }
91
+
92
+ return $this->webserver;
93
+ }
94
+
95
+ /**
96
+ * Get the Webserver from phpinfo details.
97
+ *
98
+ * @return String // os fingureprint
99
+ */
100
+ public function get_os() {
101
+ if ($this->is_enabled('php_uname')) {
102
+ if (! isset($this->os)) {
103
+ $this->os = strtolower(php_uname('s'));
104
+ }
105
+
106
+ return $this->os;
107
+ } else {
108
+ return __('Blocked by hosting', 'backup-migration');
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Get the homeurl from WordPress details.
114
+ *
115
+ * @return String // os
116
+ */
117
+ public function get_operating_system() {
118
+ if ($this->is_enabled('php_uname')) {
119
+ if (! isset($this->operating_system)) {
120
+ $this->operating_system = php_uname('s') . ' ' . php_uname('v');
121
+ }
122
+
123
+ return $this->operating_system;
124
+ } else {
125
+ return __('Blocked by hosting', 'backup-migration');
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Get the upload directory url from WordPress details.
131
+ *
132
+ * @return String // upload directory url
133
+ */
134
+ public function get_upload_dir_url() {
135
+ if (! isset($this->upload_dir_url)) {
136
+ $upload_dir_url = wp_get_upload_dir();
137
+ $this->upload_dir_url = $upload_dir_url['baseurl'];
138
+ }
139
+
140
+ return $this->upload_dir_url;
141
+ }
142
+
143
+ /**
144
+ * Get the content directory
145
+ *
146
+ * @return String // content directory
147
+ */
148
+ public function get_content_dir() {
149
+ if (! isset($this->content_dir)) {
150
+ $content_dir = plugin_dir_path(WP_CONTENT_DIR . '/' . 'plugins/');
151
+ $this->content_dir = $content_dir;
152
+ }
153
+
154
+ return $this->content_dir;
155
+ }
156
+
157
+ /**
158
+ * Get the plugin directory from WordPress details.
159
+ *
160
+ * @return String // plugin directory
161
+ */
162
+ public function get_plugin_dir() {
163
+ if (! isset($this->plugin_dir)) {
164
+ $plugin_dir = plugin_dir_path(WP_CONTENT_DIR . '/plugins/plugin-folder');
165
+ $this->plugin_dir = $plugin_dir;
166
+ }
167
+
168
+ return $this->plugin_dir;
169
+ }
170
+
171
+ /**
172
+ * Get the active plugins.
173
+ *
174
+ * @return String // active plugins
175
+ */
176
+ public function get_active_plugins_info() {
177
+ if (! isset($this->active_plugins)) {
178
+ $active_plugins = get_option('active_plugins', false);
179
+
180
+ $arr_active_plugins = [];
181
+
182
+ foreach ($active_plugins as $path) {
183
+ $arr_data = [];
184
+ if (! function_exists('get_plugin_data')) {
185
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
186
+ }
187
+ $plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $path);
188
+ if (
189
+ isset($plugin_data['Name']) && ! empty($plugin_data['Name'])
190
+ && isset($plugin_data['Version']) && ! empty($plugin_data['Version'])
191
+ ) {
192
+ $arr_data['name'] = $plugin_data['Name'];
193
+ $arr_data['version'] = $plugin_data['Version'];
194
+ $arr_data['slug'] = $plugin_data['TextDomain'];
195
+
196
+ array_push($arr_active_plugins, $arr_data);
197
+ unset($arr_data);
198
+ }
199
+ }
200
+ $this->active_plugins = $arr_active_plugins;
201
+ }
202
+
203
+ return $this->active_plugins;
204
+ }
205
+
206
+ /**
207
+ * Get the check multisite.
208
+ *
209
+ * @return bool // check multisite
210
+ */
211
+ public function check_multisite() {
212
+ if (! isset($this->is_multisite)) {
213
+ $this->is_multisite = is_multisite();
214
+ }
215
+
216
+ return $this->is_multisite;
217
+ }
218
+
219
+ /**
220
+ * Get the disk free space
221
+ *
222
+ * @return float // disk free space
223
+ */
224
+ public function get_disk_free_space() {
225
+ if ($this->is_enabled('disk_free_space')) {
226
+ if (! isset($this->disk_free_space)) {
227
+ $this->disk_free_space = disk_free_space(getcwd());
228
+ }
229
+
230
+ return $this->disk_free_space;
231
+ } else {
232
+ return __('Blocked by hosting', 'backup-migration');
233
+ }
234
+ }
235
+
236
+ /**
237
+ * Get the php version
238
+ *
239
+ * @return String // php version
240
+ */
241
+ public function get_php_version() {
242
+ if (! isset($this->php_version)) {
243
+ $this->php_version = explode(' ', phpversion())[0];
244
+ }
245
+
246
+ return $this->php_version;
247
+ }
248
+
249
+ /**
250
+ * Get the php loaded extensions
251
+ *
252
+ * @return String // php loaded extensions
253
+ */
254
+ public function get_php_loaded_extensions() {
255
+ if (! isset($this->php_loaded_extensions)) {
256
+ $this->php_loaded_extensions = get_loaded_extensions();
257
+ }
258
+
259
+ return $this->php_loaded_extensions;
260
+ }
261
+
262
+ /**
263
+ * Get the disable functions
264
+ *
265
+ * @return String // disable functions
266
+ */
267
+ public function get_php_disable_functions() {
268
+ if (! isset($this->disable_functions)) {
269
+ $this->disable_functions = explode(',', ini_get('disable_functions'));
270
+ }
271
+
272
+ return $this->disable_functions;
273
+ }
274
+
275
+ /**
276
+ * Get the backtrack limit
277
+ *
278
+ * @return String // backtrack limit
279
+ */
280
+ public function get_backtrack_limit() {
281
+ if (! isset($this->backtrack_limit)) {
282
+ $this->backtrack_limit = (int) ini_get('pcre.backtrack_limit');
283
+ }
284
+
285
+ return $this->backtrack_limit;
286
+ }
287
+
288
+ /**
289
+ * Get the is mysql character set
290
+ *
291
+ * @return String // mysql character set
292
+ */
293
+ public function get_mysql_character_set() {
294
+ global $wpdb;
295
+ if (! isset($this->get_mysql_character_set)) {
296
+ $charset_query = $wpdb->get_charset_collate();
297
+ $matches = [];
298
+ preg_match('/SET\s+(\w+)/', $charset_query, $matches);
299
+ if (count($matches) > 1) {
300
+ return $matches[1];
301
+ }
302
+ }
303
+
304
+ return '';
305
+ }
306
+
307
+ /**
308
+ * Get the is get active_themes_info
309
+ *
310
+ * @return String // active_themes_info
311
+ */
312
+ public function get_active_themes_info() {
313
+ if (! isset($this->wp_active_themes_info)) {
314
+ $arr_active_themes = [];
315
+ $theme = wp_get_theme();
316
+ $theme_name = $theme->get('TextDomain');
317
+ $theme_version = $theme->get('TextDomain');
318
+ if (
319
+ isset($theme_name) && ! empty($theme_name)
320
+ && isset($theme_version) && ! empty($theme_version)
321
+ ) {
322
+ $arr_data['name'] = $theme->get('Name');
323
+ $arr_data['version'] = $theme->get('Version');
324
+ $arr_data['slug'] = $theme->get('TextDomain');
325
+
326
+ array_push($arr_active_themes, $arr_data);
327
+ unset($arr_data);
328
+ }
329
+ $this->wp_active_themes_info = $arr_active_themes;
330
+ }
331
+
332
+ return $this->wp_active_themes_info;
333
+ }
334
+
335
+ /**
336
+ * Get the is get php_version_primary()
337
+ *
338
+ * @return String // php_version_primary()
339
+ */
340
+ public function get_php_version_primary() {
341
+ if (! isset($this->php_version_primary)) {
342
+ $this->php_version_primary = explode('.', $this->get_php_version());
343
+
344
+ return $this->php_version_primary[0];
345
+ }
346
+ }
347
+
348
+ /**
349
+ * Get the is get php_version_secondary()
350
+ *
351
+ * @return String // php_version_secondary()
352
+ */
353
+ public function get_php_version_secondary() {
354
+ if (! isset($this->php_version_secondary)) {
355
+ $this->php_version_secondary = explode('.', $this->get_php_version());
356
+
357
+ return $this->php_version_secondary[1];
358
+ }
359
+ }
360
+
361
+ /**
362
+ * Get the is get php_version_minor()
363
+ *
364
+ * @return String // php_version_minor()
365
+ */
366
+ public function get_php_version_minor() {
367
+ if (! isset($this->php_version_minor)) {
368
+ $this->php_version_minor = explode('.', $this->get_php_version());
369
+
370
+ return $this->php_version_minor[2];
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Get changes human redeable sizes to numbers()
376
+ *
377
+ * @param String $num // readble size to be converted to byte
378
+ *
379
+ * @return number // readble_size_to_bytes()
380
+ */
381
+ public function readble_size_to_bytes($num) {
382
+ $num_split = str_split(strval(strtolower($num)));
383
+ $num_split_temp = $num_split;
384
+ $num_end = end($num_split);
385
+ array_pop($num_split);
386
+ $num_join = implode('', $num_split);
387
+ if ('m' === $num_end) {
388
+ $num = doubleval($num_join) * 1048576;
389
+ } elseif ('k' === $num_end) {
390
+ $num = doubleval($num_join) * 1024;
391
+ } elseif ('g' === $num_end) {
392
+ $num = doubleval($num_join) * 1073741824;
393
+ }
394
+
395
+ return $num;
396
+ }
397
+
398
+ /**
399
+ * List of system information.
400
+ *
401
+ * @return array // List of system information
402
+ */
403
+ public function to_array() {
404
+ global $wpdb;
405
+ if (function_exists('curl_version')) {
406
+ $curl_version = curl_version();
407
+ } else {
408
+ $curl_version = [];
409
+ }
410
+
411
+ return [
412
+ // WP related.
413
+ 'wp_version' => get_bloginfo('version'),
414
+ 'wp_site_url' => \site_url(),
415
+ 'wp_timezone' => $this->get_timezone(),
416
+ 'wp_blog_time' => time(),
417
+ 'wp_root_dir' => ABSPATH,
418
+ 'wp_language' => get_bloginfo('language'),
419
+ 'wp_cache' => defined('WP_CACHE') ? WP_CACHE : null,
420
+ 'wp_fs_method' => defined('FS_METHOD') ? FS_METHOD : null,
421
+ 'wp_db_charset' => defined('DB_CHARSET') ? DB_CHARSET : null,
422
+ 'wp_db_collate' => defined('DB_COLLATE') ? DB_COLLATE : null,
423
+ 'wp_debug' => defined('WP_DEBUG') ? WP_DEBUG : null,
424
+ 'wp_debug_log' => defined('WP_DEBUG_LOG') ? WP_DEBUG_LOG : null,
425
+ 'wp_debug_display' => defined('WP_DEBUG_DISPLAY') ? WP_DEBUG_DISPLAY : null,
426
+ 'wp_script_debug' => defined('SCRIPT_DEBUG') ? SCRIPT_DEBUG : null,
427
+ // 'wp_content_dir' => File_System::normalize_path( $this->get_content_dir() ),
428
+ // 'wp_plugin_dir' => ( new File_System() )->get_plugin_root_directory(),
429
+ // 'wp_theme_dir' => ( new File_System() )->get_theme_root_directory(),
430
+ // 'wp_upload_dir' => ( new File_System() )->get_upload_directory(),
431
+ 'wp_upload_dir_url' => $this->get_upload_dir_url(),
432
+ 'wp_multisite_enabled' => $this->check_multisite(),
433
+ 'wp_memory_limit_readable' => defined('WP_MEMORY_LIMIT') ? WP_MEMORY_LIMIT : null,
434
+ 'wp_memory_limit_bytes' => defined('WP_MEMORY_LIMIT') ? $this->readble_size_to_bytes(WP_MEMORY_LIMIT) : null,
435
+ 'wp_max_memory_limit_readble' => defined('WP_MAX_MEMORY_LIMIT') ? WP_MAX_MEMORY_LIMIT : null,
436
+ 'wp_max_memory_limit_bytes' => defined('WP_MAX_MEMORY_LIMIT') ? $this->readble_size_to_bytes(WP_MAX_MEMORY_LIMIT) : null,
437
+ 'wp_active_plugins_info' => $this->get_active_plugins_info(),
438
+ 'wp_alternative_cron_enabled' => defined('ALTERNATE_WP_CRON') ? ALTERNATE_WP_CRON : null,
439
+ 'wp_cron_enabled' => defined('DISABLE_WP_CRON') ? false : true,
440
+ 'wp_cron_lock_timeout' => defined('WP_CRON_LOCK_TIMEOUT') ? WP_CRON_LOCK_TIMEOUT : null,
441
+ 'wp_cron_job_running' => defined('DOING_CRON') ? DOING_CRON : false,
442
+ 'wp_http_block_external' => defined('WP_HTTP_BLOCK_EXTERNAL') ? true : false,
443
+ 'wp_automatic_update_disable' => defined('AUTOMATIC_UPDATER_DISABLED') ? true : false,
444
+ 'wp_active_themes_info' => $this->get_active_themes_info(),
445
+
446
+ // Webserver related information.
447
+ 'web_server_name' => $this->get_webserver(),
448
+ 'operating_system_short_name' => $this->get_os(),
449
+ 'operating_system_full' => $this->get_operating_system(),
450
+ 'server_ip' => isset($_SERVER['REMOTE_ADDR']) ? sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR'])) : null,
451
+ 'temp_folder' => get_temp_dir(),
452
+
453
+ // PHP Library related info.
454
+
455
+ // Disk & storage related info.
456
+ 'disk_free_space_bytes' => $this->get_disk_free_space(),
457
+
458
+ 'disk_free_space_readable' => (($this->is_enabled('disk_total_space')) ? BMP::humanSize($this->get_disk_free_space()) : __('Blocked by hosting', 'backup-migration')),
459
+ 'dir_disk_space_bytes' => (($this->is_enabled('disk_total_space')) ? disk_total_space(ABSPATH) : __('Blocked by hosting', 'backup-migration')),
460
+ 'dir_disk_space_readable' => (($this->is_enabled('disk_total_space')) ? BMP::humanSize(disk_total_space(ABSPATH)) : __('Blocked by hosting', 'backup-migration')),
461
+
462
+ // PHP Configuration information.
463
+ 'php_memory_limit_bytes' => $this->readble_size_to_bytes(ini_get('memory_limit')),
464
+ 'php_memory_limit_readable' => ini_get('memory_limit'),
465
+ 'php_max_execution_time' => ini_get('max_execution_time'),
466
+ 'php_upload_max_filesize_bytes' => $this->readble_size_to_bytes(ini_get('upload_max_filesize')),
467
+ 'php_upload_max_filesize_readable' => ini_get('upload_max_filesize'),
468
+ 'php_max_input_vars' => (int) ini_get('max_input_vars'),
469
+ 'php_post_max_size_bytes' => $this->readble_size_to_bytes(ini_get('post_max_size')),
470
+ 'php_post_max_size_readable' => ini_get('post_max_size'),
471
+
472
+ 'php_version_primary' => $this->get_php_version_primary(),
473
+ 'php_version_secondary' => $this->get_php_version_secondary(),
474
+ 'php_version_minor' => $this->get_php_version_minor(),
475
+ 'php_version_full' => $this->get_php_version(),
476
+
477
+ 'php_sapi' => php_sapi_name(),
478
+ 'php_allow_url_fopen' => ini_get('allow_url_fopen') === 1 ? true : false,
479
+ 'php_loaded_extensions' => $this->get_php_loaded_extensions(),
480
+ 'php_disable_functions' => $this->get_php_disable_functions(),
481
+ 'php_xml_support' => extension_loaded('xml'),
482
+ 'php_backtrack_limit' => $this->get_backtrack_limit(),
483
+ 'php_fast_cgi' => strpos(php_sapi_name(), 'fcgi') !== false, // for some it was coming fpm-fcgi and on some cgi-fcgi so changed to account for both.
484
+ 'php_zip_archive_class_exists' => class_exists('ZipArchive'),
485
+ 'php_mcrypt_exists' => extension_loaded('mcrypt'),
486
+
487
+ // MySql Configuration information.
488
+ 'mysql_version' => $wpdb->db_version(),
489
+ 'mysql_character_set' => $this->get_mysql_character_set(),
490
+
491
+ 'curl_version' => isset($curl_version['version']) ? $curl_version['version'] : null,
492
+ 'curl_ssl_enabled' => isset($curl_version['features']) ? (bool) ($curl_version['features'] & 4) : false,
493
+ 'php_open_ssl_version_text' => isset($curl_version['ssl_version']) ? $curl_version['ssl_version'] : null,
494
+ 'php_open_ssl_version_number' => isset($curl_version['ssl_version_number']) ? $curl_version['ssl_version_number'] : null,
495
+ ];
496
+ }
497
+ }
includes/config.php ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ if (!function_exists('bmi_get_config')) {
10
+ function bmi_get_config($setting) {
11
+
12
+ // Load default and additional
13
+ $defaults = json_decode(file_get_contents(BMI_CONFIG_DEFAULT));
14
+
15
+ // Result default
16
+ if (isset($defaults->{$setting}))
17
+ $result = $defaults->{$setting};
18
+ else $result = array();
19
+
20
+ // Load user config
21
+ if (file_exists(BMI_CONFIG_PATH) && BMI_CONFIG_STATUS) {
22
+
23
+ // Get file contents
24
+ $bmi_config_contents = file_get_contents(BMI_CONFIG_PATH);
25
+ $bmi_config_json = json_decode($bmi_config_contents);
26
+
27
+ // If config is correct set it
28
+ if (json_last_error() == JSON_ERROR_NONE) {
29
+
30
+ // Setting exist?
31
+ if (isset($bmi_config_json->{$setting})) {
32
+
33
+ // Get result
34
+ $result = $bmi_config_json->{$setting};
35
+
36
+ }
37
+
38
+ }
39
+
40
+ }
41
+
42
+ // Replace exceptions
43
+ if ($setting == 'STORAGE::LOCAL::PATH' && $result == 'default') {
44
+ $result = BMI_BACKUPS_DEFAULT;
45
+ }
46
+
47
+ // Replace backshashes
48
+ if ($setting == 'STORAGE::LOCAL::PATH') {
49
+ $result = str_replace('\\\\', DIRECTORY_SEPARATOR, $result);
50
+ $result = str_replace('\\', DIRECTORY_SEPARATOR, $result);
51
+ $result = str_replace('/', DIRECTORY_SEPARATOR, $result);
52
+ }
53
+
54
+ // Return setting
55
+ return $result;
56
+
57
+ }
58
+ }
59
+
60
+ if (!function_exists('bmi_set_config')) {
61
+ function bmi_set_config($setting, $value) {
62
+
63
+ // Load default and additional
64
+ if (file_exists(BMI_CONFIG_PATH)) {
65
+
66
+ // Get file contents
67
+ $bmi_config_contents = file_get_contents(BMI_CONFIG_PATH);
68
+ $bmi_config_json = json_decode($bmi_config_contents);
69
+
70
+ // Result default
71
+ $default = bmi_get_config($setting);
72
+
73
+ // If config is correct set it
74
+ if (!(json_last_error() == JSON_ERROR_NONE)) {
75
+
76
+ // Setting refill base
77
+ $bmi_config_json = json_decode(json_encode(array()));;
78
+
79
+ }
80
+
81
+ // Check if setting is not empty
82
+ if (isset($value) && (!is_string($value) || strlen(trim($value)) > 0)) {
83
+
84
+ // Set new setting
85
+ @$bmi_config_json->{$setting} = $value;
86
+
87
+ } else return false;
88
+
89
+ // Write edited settings
90
+ file_put_contents(BMI_CONFIG_PATH, json_encode($bmi_config_json));
91
+ return true;
92
+
93
+ }
94
+
95
+ return false;
96
+
97
+ }
98
+ }
99
+
100
+ if (!function_exists('bmi_try_checked')) {
101
+ function bmi_try_checked($setting, $reversed = false) {
102
+
103
+ if (!$reversed) {
104
+
105
+ if (bmi_get_config($setting) == 'true' || bmi_get_config($setting) === true) {
106
+ echo ' checked';
107
+ } else return false;
108
+
109
+ } else {
110
+
111
+ if (bmi_get_config($setting) == 'true' || bmi_get_config($setting) === true) {
112
+ return false;
113
+ } else {
114
+ echo ' checked';
115
+ }
116
+
117
+ }
118
+
119
+ }
120
+ }
121
+
122
+ if (!function_exists('bmi_try_value')) {
123
+ function bmi_try_value($setting) {
124
+
125
+ $res = bmi_get_config($setting);
126
+ if ($res !== false) {
127
+ echo ' value="' . sanitize_text_field($res) . '"';
128
+ } else echo '';
129
+
130
+ }
131
+ }
132
+
133
+ // Get config and parse it
134
+ if (file_exists(BMI_CONFIG_PATH)) {
135
+
136
+ // Get file contents
137
+ $bmi_config_contents = file_get_contents(BMI_CONFIG_PATH);
138
+ $bmi_config_json = json_decode($bmi_config_contents);
139
+
140
+ // If config is correct set it
141
+ if (json_last_error() == JSON_ERROR_NONE) {
142
+
143
+ if (!defined('BMI_CONFIG_STATUS')) define('BMI_CONFIG_STATUS', true);
144
+ if (!defined('BMI_BACKUPS')) define('BMI_BACKUPS', bmi_get_config('STORAGE::LOCAL::PATH') . DIRECTORY_SEPARATOR . 'backups');
145
+
146
+ } else {
147
+
148
+ if (!defined('BMI_CONFIG_STATUS')) define('BMI_CONFIG_STATUS', false);
149
+
150
+ }
151
+
152
+ } else {
153
+
154
+ @mkdir(dirname(BMI_CONFIG_PATH), 0755, true);
155
+ @copy(BMI_CONFIG_DEFAULT, BMI_CONFIG_PATH);
156
+ if (!defined('BMI_CONFIG_STATUS')) define('BMI_CONFIG_STATUS', true);
157
+
158
+ }
includes/constants.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ // Plugin includes
12
+ if (!defined('BMI_AUTHOR_URI')) {
13
+ define('BMI_AUTHOR_URI', 'https://premium.backupbliss.com/');
14
+ }
15
+ if (!defined('BMI_INCLUDES')) {
16
+ define('BMI_INCLUDES', BMI_ROOT_DIR . DIRECTORY_SEPARATOR . 'includes');
17
+ }
18
+ if (!defined('BMI_BACKUPS_DEFAULT')) {
19
+ define('BMI_BACKUPS_DEFAULT', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration');
20
+ }
21
+ if (!defined('BMI_CONFIG_DEFAULT')) {
22
+ define('BMI_CONFIG_DEFAULT', BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . 'default.json');
23
+ }
24
+ if (!defined('BMI_CONFIG_PATH')) {
25
+ define('BMI_CONFIG_PATH', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR . 'config.json');
26
+ }
27
+ if (!defined('BMI_CONFIG_DIR')) {
28
+ define('BMI_CONFIG_DIR', dirname(BMI_CONFIG_PATH));
29
+ }
30
+ if (!defined('BMI_REV')) {
31
+ define('BMI_REV', 1);
32
+ }
33
+
34
+ // Load configuration
35
+ require_once BMI_INCLUDES . DIRECTORY_SEPARATOR . 'config.php';
36
+
37
+ // Default constants
38
+ if (!defined('BMI_ASSETS')) {
39
+ define('BMI_ASSETS', plugin_dir_url(BMI_ROOT_FILE) . 'admin');
40
+ }
41
+ if (!defined('BMI_BACKUPS')) {
42
+ define('BMI_BACKUPS', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR . 'backups');
43
+ }
44
+
45
+ // Fill folders if not removed (security)
46
+ if (!file_exists(BMI_BACKUPS)) {
47
+ mkdir(BMI_BACKUPS, 0755, true);
48
+ }
49
+ if (!file_exists(BMI_CONFIG_DIR)) {
50
+ mkdir(BMI_CONFIG_DIR, 0755, true);
51
+ }
52
+ if (!file_exists(BMI_CONFIG_PATH)) {
53
+ touch(BMI_CONFIG_PATH);
54
+ }
55
+
56
+ // Secure config and logs
57
+ if (!file_exists(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.php')) {
58
+ touch(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.php');
59
+ }
60
+ if (!file_exists(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.html')) {
61
+ touch(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.html');
62
+ }
63
+ if (!file_exists(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . '.htaccess')) {
64
+ copy(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . '.htaccess', BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . '.htaccess');
65
+ }
66
+
67
+ // Secure backups (if in backup dir)
68
+ if (!file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.php')) {
69
+ touch(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.php');
70
+ }
71
+ if (!file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.html')) {
72
+ touch(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.html');
73
+ }
74
+ if (!file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.htaccess')) {
75
+ copy(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . '.htaccess', BMI_BACKUPS . DIRECTORY_SEPARATOR . '.htaccess');
76
+ }
includes/cron/handler.php ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\CRON;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger AS Logger;
8
+
9
+ // Exit on direct access
10
+ if (!defined('ABSPATH')) exit;
11
+
12
+ /**
13
+ * BMI_Crons
14
+ */
15
+ class BMI_Crons {
16
+
17
+ function __construct() {
18
+
19
+ }
20
+
21
+ public static function calculate_date($base, $curr = false) {
22
+
23
+ $type = $base['type'];
24
+ $week = intval($base['week']);
25
+ $day = intval($base['day']);
26
+ $hour = intval($base['hour']);
27
+ $minutes = intval($base['minute']);
28
+
29
+ if (isset($curr) && $curr != false) {
30
+ $timestamp = $curr;
31
+ } else $timestamp = time();
32
+
33
+ $current = new \DateTime();
34
+ $current->setTimestamp($timestamp);
35
+
36
+ $future = new \DateTime();
37
+ $future->setTimestamp($timestamp);
38
+ $future->setTime($hour, $minutes, 0);
39
+
40
+ $c_minute = intval($current->format('i'));
41
+ $c_hour = intval($current->format('G'));
42
+ $c_month_day = intval($current->format('j'));
43
+ $c_month = intval($current->format('n'));
44
+ $c_week = intval($current->format('N'));
45
+
46
+ if ($type == 'day') {
47
+
48
+ if ($current->getTimestamp() >= $future->getTimestamp()) {
49
+
50
+ $future->modify('+1 day');
51
+
52
+ }
53
+
54
+ } else if ($type == 'week') {
55
+
56
+ if ($c_week >= $week) {
57
+
58
+ if ($c_week == $week) {
59
+
60
+ if ($c_hour >= $hour && (($c_hour > $hour) || ($c_hour == $hour && $c_minute >= $minutes))) {
61
+ // if () {
62
+ $offset = (7 - ($c_week - $week));
63
+ $future->modify("+$offset day");
64
+ // }
65
+ }
66
+
67
+ } else {
68
+
69
+ // if ($c_hour <= $hour) {
70
+ $offset = (7 - ($c_week - $week));
71
+ $future->modify("+$offset day");
72
+ // }
73
+
74
+ }
75
+
76
+
77
+ } else {
78
+
79
+ $offset = ($week - $c_week);
80
+ $future->modify("+$offset day");
81
+
82
+ }
83
+
84
+ } else if ($type == 'month') {
85
+
86
+ if ($c_month_day >= $day) {
87
+
88
+ if ($c_month_day == $day && $c_hour <= $hour) {
89
+ if ($c_minute >= $minutes) {
90
+
91
+ $days = cal_days_in_month(CAL_GREGORIAN, $c_month, $current->format('Y'));
92
+ $offset = ($days - ($c_month_day - $day));
93
+ $future->modify("+$offset day");
94
+
95
+ }
96
+ } else {
97
+
98
+ $offset = ($day - $c_month_day);
99
+ $future->modify("+1 month");
100
+ $future->modify("+$offset day");
101
+
102
+ }
103
+
104
+ } else {
105
+
106
+ $offset = ($day - $c_month_day);
107
+ $future->modify("+$offset day");
108
+
109
+ }
110
+
111
+ }
112
+
113
+ return $future->getTimestamp();
114
+
115
+ }
116
+
117
+ }
includes/dashboard/chapter/AA-Template.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
includes/dashboard/chapter/other_config.php ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ // Tooltips
12
+ $deinstalled_info = __('This will be triggered on plugin removal via WordPress plugins tab', 'backup-migration');
13
+
14
+ ?>
15
+
16
+ <div class="mt mb f18 lh30">
17
+
18
+ <!-- -->
19
+ <div class="mm cf mbl">
20
+ <div class="f20 bold mbll">
21
+ <?php _e('Email notifications', 'backup-migration'); ?>
22
+ </div>
23
+
24
+ <div class="left mw250 lh65">
25
+ <?php _e('Email address:', 'backup-migration'); ?>
26
+ </div>
27
+ <div class="left">
28
+ <div class="">
29
+ <?php
30
+ $ee = sanitize_text_field(bmi_get_config('OTHER:EMAIL'));
31
+ if (strlen($ee) <= 1) {
32
+ $ee = get_bloginfo('admin_email');
33
+ }
34
+ ?>
35
+ <input type="text" id="email-for-notices" class="bmi-text-input small" value="<?php echo $ee; ?>" />
36
+ </div>
37
+ <div class="f16">
38
+ <?php _e('This is where the log files will be sent to. You can enter several email addresses, separated by comma.', 'backup-migration'); ?>
39
+ </div>
40
+ </div>
41
+ </div>
42
+
43
+ <!-- -->
44
+ <div class="mm cf mbl">
45
+ <div class="left mw250 lh65">
46
+ <?php _e('From field:', 'backup-migration'); ?>
47
+ </div>
48
+ <div class="left">
49
+ <div class="">
50
+ <input type="text" id="email-title-for-notices" class="bmi-text-input small" value="<?php echo sanitize_text_field(bmi_get_config('OTHER:EMAIL:TITLE')); ?>" />
51
+ </div>
52
+ <div class="f16">
53
+ <?php _e('This will show up as sender of the emails', 'backup-migration'); ?>
54
+ </div>
55
+ </div>
56
+ </div>
57
+
58
+ <!-- -->
59
+ <div class="mm cf mbl">
60
+
61
+ <div class="left mw250 lh50" style="line-height: 145px;">
62
+ <?php _e("You'll get an email if...", 'backup-migration'); ?>
63
+ </div>
64
+
65
+ <div class="left lh40">
66
+ <table>
67
+ <tbody>
68
+ <tr>
69
+ <td>
70
+ <label class="premium-wrapper">
71
+ <input type="checkbox" disabled>
72
+ <span><?php _e("Backups was created successfully", 'backup-migration'); ?></span>
73
+ <span class="premium premium-img premium-ntt"></span>
74
+ </label>
75
+ </td>
76
+ <td>
77
+ <label class="premium-wrapper">
78
+ <input type="checkbox" disabled>
79
+ <span><?php _e("Backup creation failed", 'backup-migration'); ?></span>
80
+ <span class="premium premium-img premium-ntt"></span>
81
+ </label>
82
+ </td>
83
+ </tr>
84
+ <tr>
85
+ <td>
86
+ <label class="premium-wrapper">
87
+ <input type="checkbox" disabled>
88
+ <span><?php _e("Restore succeeded", 'backup-migration'); ?></span>
89
+ <span class="premium premium-img premium-ntt"></span>
90
+ </label>
91
+ </td>
92
+ <td>
93
+ <label class="premium-wrapper">
94
+ <input type="checkbox" disabled>
95
+ <span><?php _e("Restore failed", 'backup-migration'); ?></span>
96
+ <span class="premium premium-img premium-ntt"></span>
97
+ </label>
98
+ </td>
99
+ </tr>
100
+ <tr>
101
+ <td colspan="2">
102
+ <label for="scheduled-issues">
103
+ <input type="checkbox" id="scheduled-issues"<?php bmi_try_checked('OTHER:EMAIL:NOTIS'); ?>>
104
+ <span>
105
+ <?php _e("There are (new) issues with scheduling (creating automatic backups)", 'backup-migration'); ?><br>
106
+ <span class="f14">
107
+ <?php _e("(Make sure that your hosting does not block mail functions, otherwise you have to configure SMTP mail.)", 'backup-migration'); ?>
108
+ </span>
109
+ </span>
110
+ </label>
111
+ </td>
112
+ </tr>
113
+ </tbody>
114
+ </table>
115
+ </div>
116
+
117
+ </div>
118
+
119
+ <!-- -->
120
+ <div class="mm mbl">
121
+ <div class="cf">
122
+
123
+ <div class="left mr20">
124
+ <?php _e("Add logs to emails?", 'backup-migration'); ?>
125
+ </div>
126
+
127
+ <div class="left">
128
+ <div class="left d-flex mr60 ia-center">
129
+ <label class="container-radio">
130
+ <?php _e("No", 'backup-migration'); ?>
131
+ <input type="radio" checked name="add_logs_email">
132
+ <span class="checkmark-radio"></span>
133
+ </label>
134
+ <div class="inline premium-wrapper cf">
135
+ <label class="left container-radio ml25 not-allowed">
136
+ <?php _e("Yes", 'backup-migration'); ?>
137
+ <input type="radio" disabled name="add_logs_email">
138
+ <span class="checkmark-radio"></span>
139
+ </label>
140
+ <span class="left premium premium-img premium-nt mtf3"></span>
141
+ </div>
142
+ </div>
143
+ </div>
144
+
145
+ </div>
146
+
147
+ <div class="f16 mtll">
148
+ <?php _e("If you want to also receive the backup file as attachment of the email (for backup notifications), please set this in chapter Where will backups be stored?.", 'backup-migration'); ?>
149
+ </div>
150
+ </div>
151
+
152
+ <!-- -->
153
+ <div class="mm">
154
+ <div class="f20 bold">
155
+ <?php _e("Backup triggers", 'backup-migration'); ?>
156
+ </div>
157
+
158
+ <div class="f16 mtll">
159
+ <?php _e('At the top of the plugin you can create a backup instantly ("Create backup now" - button), or schedule them. Here are more options which trigger the backup creation:', 'backup-migration'); ?>
160
+ </div>
161
+ </div>
162
+
163
+ <!-- -->
164
+ <div class="mbl mtl overlayed">
165
+
166
+ <?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
167
+
168
+ <div class="mm">
169
+ <div class="cf">
170
+ <div class="left">
171
+ <div class="f20 bold mr20 premium-wrapper">
172
+ <?php _e("Before updates", 'backup-migration'); ?>
173
+ <span class="premium premium-img premium-ntt"></span>
174
+ </div>
175
+ </div>
176
+ <div class="left">
177
+ <label for="before-updates-switch" class="bmi-switch">
178
+ <input type="checkbox" disabled checked id="before-updates-switch">
179
+ <div class="bmi-switch-slider round">
180
+ <span class="on"><?php _e("On", 'backup-migration'); ?></span>
181
+ <span class="off"><?php _e("Off", 'backup-migration'); ?></span>
182
+ </div>
183
+ </label>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ <div class="mm">
188
+ <div class="mtll f16">
189
+ <?php _e("Activate this so that a backup is created before there are automatic WordPress updates (WordPress core, plugins, themes, or language files).", 'backup-migration'); ?>
190
+ </div>
191
+ </div>
192
+
193
+ </div>
194
+
195
+ <!-- -->
196
+ <div class="overlayed">
197
+
198
+ <?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
199
+
200
+ <table class="mm">
201
+ <tbody>
202
+ <tr>
203
+ <td style="vertical-align: top;">
204
+ <div class="f20 bold mw250 lh65 premium-wrapper">
205
+ <?php _e("Trigger by URI", 'backup-migration'); ?>
206
+ <span class="premium premium-img premium-ntt"></span>
207
+ </div>
208
+ </td>
209
+ <td>
210
+ <div class="">
211
+ <div class="cf">
212
+ <div class="left mr20">
213
+ <input type="text" class="bmi-text-input small" id="trigger-input1" />
214
+ </div>
215
+ <div class="left">
216
+ <a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad left bmi-copper othersec mm30" data-copy="trigger-input1">
217
+ <div class="text">
218
+ <img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
219
+ <div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
220
+ </div>
221
+ </a>
222
+ </div>
223
+ </div>
224
+ <div class="f16 mtlll">
225
+ <?php _e("Copy & paste this url into a browser and press enter to trigger the backup creation.", 'backup-migration'); ?><br>
226
+ <?php _e("Make sure you keep this url a secret. For safety reasons this only works once per hour & you’ll get emailed when it used.", 'backup-migration'); ?>
227
+ </div>
228
+ <div class="mtll cf">
229
+ <div class="left lh60 mr20"><?php _e("Key:", 'backup-migration'); ?></div>
230
+ <div class="left mr20">
231
+ <input type="text" class="bmi-text-input small" />
232
+ </div>
233
+ <div class="left">
234
+ <a href="#" class="btn mm30 othersec"><?php _e("Save", 'backup-migration'); ?></a>
235
+ </div>
236
+ </div>
237
+ <div class="f16 mtlll">
238
+ <?php _e("Change the key (which is part of above url) if you suspect an unauthorized person got access to it.", 'backup-migration'); ?>
239
+ </div>
240
+ </div>
241
+ </td>
242
+ </tr>
243
+ </tbody>
244
+ </table>
245
+
246
+ </div>
247
+
248
+ <!-- -->
249
+ <div class="mbl mtl overlayed" style="display: none;">
250
+
251
+ <?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
252
+
253
+ <div class="mm f20 bold premium-wrapper">
254
+ <?php _e("WP CLI", 'backup-migration'); ?>
255
+ <span class="premium premium-img premium-ntt"></span>
256
+ </div>
257
+ <div class="mm mtll f16">
258
+ <?php _e('Trigger backups via WP CLI.', 'backup-migration'); ?>
259
+ </div>
260
+ <div class="mm mtll">
261
+ <?php _e('If you selected the "schedule backups" - option at the top of the plugin, and backups are not created, then please check out the Cron settings. Or just ask us in the forum.', 'backup-migration'); ?>
262
+ </div>
263
+ </div>
264
+
265
+ <!-- -->
266
+ <div class="mm mbl mtl">
267
+ <div class="f20 bold">
268
+ <?php _e("Clean-ups", 'backup-migration'); ?>
269
+ </div>
270
+ <div class="mtll">
271
+ <span class="relative">
272
+ <?php _e("When this plugins is", 'backup-migration'); ?> <b><?php _e("de-installed:", 'backup-migration'); ?></b>
273
+ <span class="bmi-info-icon tooltip" tooltip="<?php echo $deinstalled_info; ?>"></span>
274
+ </span>
275
+ </div>
276
+
277
+ <div class="lh40">
278
+ <label for="uninstalling-configs">
279
+ <input type="checkbox" id="uninstalling-configs"<?php bmi_try_checked('OTHER:UNINSTALL:CONFIGS'); ?> />
280
+ <span><?php _e("Delete all plugins settings (this means if you install it again, you have to configure it again)", 'backup-migration'); ?></span>
281
+ </label>
282
+ </div>
283
+ <div class="lh40">
284
+ <label for="uninstalling-backups">
285
+ <input type="checkbox" id="uninstalling-backups"<?php bmi_try_checked('OTHER:UNINSTALL:BACKUPS'); ?> />
286
+ <span><?php _e("Delete all backups (created by this plugin)", 'backup-migration'); ?></span>
287
+ </label>
288
+ </div>
289
+ </div>
290
+
291
+ <!-- -->
292
+ <div class="mm mtll">
293
+ <?php _e("If you're looking for other options not listed above, check out the", 'backup-migration'); ?> <a href="#" class="secondary hoverable nodec collapser-openner" data-el="#troubleshooting-chapter"><?php _e("troubleshooting", 'backup-migration'); ?></a> <?php _e("chapter as they might be there.", 'backup-migration'); ?>
294
+ </div>
295
+
296
+ </div>
297
+
298
+ <?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
includes/dashboard/chapter/save-button.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="mm mtl mbl lh30">
12
+ <a href="#" class="btn save-btn"><?php _e("Save", 'backup-migration'); ?></a>
13
+ </div>
14
+
15
+ <div class="mm center f20 mb">
16
+ <a href="#" class="text-muted close-chapters nodec"><?php _e("Collapse this chapter", 'backup-migration'); ?></a>
17
+ </div>
18
+ <div class="mbll"></div>
includes/dashboard/chapter/store_config.php ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="mm mt mb">
12
+
13
+ <div class="lh30">
14
+ <div class="f20 semibold"><?php _e("File name", 'backup-migration'); ?></div>
15
+ <div class="f20"><?php _e("Your backup(s) will be given the following file name(s)", 'backup-migration'); ?></div>
16
+ </div>
17
+
18
+ <div class="center mtl f18">
19
+ <div class="">
20
+ <input type="text" id="backup_filename" class="bmi-text-input" value="<?php echo sanitize_text_field(bmi_get_config('BACKUP:NAME')); ?>">
21
+ <span class="oll mrr">.zip </span><a href="#" id="show-format-tip" class="nodec secondary hoverable"><?php _e("Huh? Explain this please", 'backup-migration'); ?></a>
22
+ </div>
23
+ </div>
24
+
25
+ </div>
26
+
27
+ <div class="mm lh30 f16 bg-second mtl mbl" id="format-tip-wrp" style="display: none;">
28
+
29
+ <div class="lh30 f18">
30
+ <?php _e("We’re giving you maximum flexibility to automatically name your backup files in the way you want. Simply use below keys:", 'backup-migration'); ?>
31
+ </div>
32
+ <div class="mm mtl">
33
+ <div class="format-entry"><b>%Y</b> = <?php _e("A full numeric representation of a year, 4 digits", 'backup-migration'); ?></div>
34
+ <div class="format-entry"><b>%M</b> = <?php _e("A short textual representation of a month, three letters", 'backup-migration'); ?></div>
35
+ <div class="format-entry"><b>%D</b> = <?php _e("A textual representation of a day, three letters", 'backup-migration'); ?></div>
36
+ <div class="format-entry"><b>%d</b> = <?php _e("Day of the month, 2 digits with leading zeros", 'backup-migration'); ?></div>
37
+ <div class="format-entry"><b>%j</b> = <?php _e("Day of the month without leading zeros", 'backup-migration'); ?></div>
38
+ <div class="format-entry"><b>%m</b> = <?php _e("Numeric representation of a month, with leading zeros", 'backup-migration'); ?></div>
39
+ <div class="format-entry"><b>%n</b> = <?php _e("Numeric representation of a month, without leading zeros", 'backup-migration'); ?></div>
40
+ <div class="format-entry"><b>%Y</b> = <?php _e("A full numeric representation of a year, 4 digits", 'backup-migration'); ?></div>
41
+ <div class="format-entry"><b>%y</b> = <?php _e("A two digit representation of a year", 'backup-migration'); ?></div>
42
+ <div class="format-entry"><b>%a</b> = <?php _e("Lowercase Ante meridiem and Post meridiem", 'backup-migration'); ?></div>
43
+ <div class="format-entry"><b>%A</b> = <?php _e("Uppercase Ante meridiem and Post meridiem", 'backup-migration'); ?></div>
44
+ <div class="format-entry"><b>%B</b> = <?php _e("Swatch Internet time", 'backup-migration'); ?></div>
45
+ <div class="format-entry"><b>%g</b> = <?php _e("12-hour format of an hour without leading zeros", 'backup-migration'); ?></div>
46
+ <div class="format-entry"><b>%G</b> = <?php _e("24-hour format of an hour without leading zeros", 'backup-migration'); ?></div>
47
+ <div class="format-entry"><b>%h</b> = <?php _e("12-hour format of an hour with leading zeros", 'backup-migration'); ?></div>
48
+ <div class="format-entry"><b>%H</b> = <?php _e("24-hour format of an hour with leading zeros", 'backup-migration'); ?></div>
49
+ <div class="format-entry"><b>%i</b> = <?php _e("Minutes with leading zeros", 'backup-migration'); ?></div>
50
+ <div class="format-entry"><b>%s</b> = <?php _e("Seconds with leading zeros", 'backup-migration'); ?></div>
51
+ <div class="format-entry"><b>%hash</b> = <?php _e("4 digit random hash", 'backup-migration'); ?></div>
52
+ </div>
53
+ <div class="right-align">
54
+ <a href="#" class="hoverable nodec secondary" id="hide-format-tip"><?php _e("Hide", 'backup-migration'); ?></a>
55
+ </div>
56
+
57
+ </div>
58
+
59
+ <div class="mm mb">
60
+
61
+ <div class="lh30">
62
+ <div class="f20 semibold"><?php _e("Zipping", 'backup-migration'); ?></div>
63
+ <div class="f20"><?php _e("Please select the compression method of your backup files:", 'backup-migration'); ?></div>
64
+ </div>
65
+
66
+ <table class="f20 mtl">
67
+ <tbody>
68
+ <tr>
69
+
70
+ <td>
71
+ <div class="lh30">
72
+
73
+ <div class="mbll">
74
+ <label class="container-radio">
75
+ Zip
76
+ <input type="radio" name="smart_exclusion_db" value="false" checked>
77
+ <span class="checkmark-radio"></span>
78
+ </label>
79
+ </div>
80
+
81
+ <div class="mbll">
82
+ <span class="cf premium-wrapper">
83
+ <label class="left container-radio ml25 not-allowed">
84
+ Tar
85
+ <input type="radio" disabled name="smart_exclusion_db" value="true">
86
+ <span class="checkmark-radio"></span>
87
+ </label>
88
+ <span class="left premium premium-img premium-nt"></span>
89
+ </span>
90
+ </div>
91
+
92
+ <div class="">
93
+ <span class="cf premium-wrapper">
94
+ <label class="left container-radio ml25 not-allowed">
95
+ Tar GZip
96
+ <input type="radio" disabled name="smart_exclusion_db" value="true">
97
+ <span class="checkmark-radio"></span>
98
+ </label>
99
+ <span class="left premium premium-img premium-nt"></span>
100
+ </span>
101
+ </div>
102
+
103
+ </div>
104
+ </td>
105
+
106
+ <td>
107
+ <div class="f16 mw850 bol lh30">
108
+ <i><?php _e('“ZIP” is the standard choice (compression level 1). Use “Tar” (compression level 2) or Tar.gz (compression level 5) if you want to have more compression (i.e. smaller file sizes). However, this will also put more load on the backup creation.', 'backup-migration'); ?></i>
109
+ </div>
110
+ </td>
111
+
112
+ </tr>
113
+ </tbody>
114
+ </table>
115
+
116
+ </div>
117
+
118
+ <div class="mm mt mb overlayed">
119
+
120
+ <?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
121
+
122
+ <div class="">
123
+ <div class="lh30">
124
+ <div class="f20 semibold">
125
+ <span class="cf premium-wrapper">
126
+ <div class="left"><?php _e("Encryption", 'backup-migration'); ?></div>
127
+ <span class="left premium premium-img"></span>
128
+ </span>
129
+ </div>
130
+ <div class="f20"><?php _e("Do you want to encrypt and password protect your files?", 'backup-migration'); ?></div>
131
+ </div>
132
+
133
+ <div class="mtl">
134
+ <div class="left d-flex mr60 ia-center">
135
+ <label class="container-radio">
136
+ <?php _e("No", 'backup-migration'); ?>
137
+ <input type="radio" name="" value="false" checked>
138
+ <span class="checkmark-radio"></span>
139
+ </label>
140
+ <label class="left container-radio ml25 not-allowed">
141
+ <?php _e("Yes", 'backup-migration'); ?>
142
+ <input type="radio" disabled name="" value="true">
143
+ <span class="checkmark-radio"></span>
144
+ </label>
145
+ </div>
146
+ </div>
147
+ </div>
148
+
149
+ </div>
150
+
151
+ <div class="mm f16 mtl mbl">
152
+ <i><?php _e("For other security settings, e.g. who can access your backup directories, please go to the", 'backup-migration'); ?> <a href="#" class="hoverable secondary nodec collapser-openner" data-el="#other-options"><?php _e("Other options", 'backup-migration'); ?></a> <?php _e("chapter.", 'backup-migration'); ?></i>
153
+ </div>
154
+
155
+ <?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
includes/dashboard/chapter/troubleshooting.php ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Use
7
+ use BMI\Plugin\Checker\System_Info as SI;
8
+
9
+ // Exit on direct access
10
+ if (!defined('ABSPATH')) {
11
+ exit;
12
+ }
13
+
14
+ // Tooltips
15
+ $ctl = __("Your account on Wordpress.org (where you open a new support thread) is different to the one you login to your WordPress dashboard (where you are now). If you don’t have a WordPress.org account yet, please sign up at the top right on the Support Forum page, and then scroll down on that page . It only takes a minute :) Thank you!", 'backup-migration');
16
+
17
+ ?>
18
+
19
+ <div class="mm mt mb f20 lh40">
20
+
21
+ <div class="mbl">
22
+ <?php _e("If something doesn't work, you have several options - pick one:", 'backup-migration'); ?>
23
+ </div>
24
+
25
+ <table class="center-table trouble-section">
26
+
27
+ <tr class="lh30">
28
+ <td style="width: 33%">
29
+ <a href="https://wordpress.org/support/plugin/backup-backup/" target="_blank" class="nodec">
30
+ <div class="shadow">
31
+ <div class="flex flexcenter mtl mtb">
32
+ <div style="width: 66px; height: 63px;">
33
+ <svg style="width: 66px; height: 63px;"><use xlink:href="<?php echo $this->get_asset('images', 'support-1.svg'); ?>#img"></use></svg>
34
+ </div>
35
+ <div class="semibold">
36
+ <?php _e("Ask us in the Support forum", 'backup-migration'); ?>
37
+ </div>
38
+ </div>
39
+ <div class="f16">
40
+ <?php _e("Your first port of call. We'll try to respond quickly!", 'backup-migration'); ?>
41
+ </div>
42
+ </div>
43
+ </a>
44
+ </td>
45
+ <td style="width: 33%">
46
+ <a href="<?php echo BMI_AUTHOR_URI; ?>" target="_blank" class="nodec">
47
+ <div class="shadow">
48
+ <div class="flex flexcenter mtl mtb">
49
+ <div style="width: 69px; height: 63px;">
50
+ <svg style="width: 69px; height: 63px; margin-top: 10px;"><use xlink:href="<?php echo $this->get_asset('images', 'support-2.svg'); ?>#img"></use></svg>
51
+ </div>
52
+ <div class="semibold">
53
+ <?php _e("Get the Premium Plugin", 'backup-migration'); ?>
54
+ </div>
55
+ </div>
56
+ <div class="f16">
57
+ <?php _e("...which includes support, so we can help you in more detail if you get stuck.", 'backup-migration'); ?>
58
+ </div>
59
+ </div>
60
+ </a>
61
+ </td>
62
+ <td style="width: 33%">
63
+ <div class="shadow" id="open_trouble_extenstion">
64
+ <div class="flex flexcenter mtl mtb">
65
+ <div style="width: 70px; height: 63px;">
66
+ <svg style="width: 70px; height: 63px;"><use xlink:href="<?php echo $this->get_asset('images', 'support-3.svg'); ?>#img"></use></svg>
67
+ </div>
68
+ <div class="semibold">
69
+ <?php _e("Check advanced options", 'backup-migration'); ?>
70
+ </div>
71
+ </div>
72
+ <div class="f16">
73
+ <?php _e("...in an effort to fix it yourself. Be sure you know what you are doing!", 'backup-migration'); ?>
74
+ </div>
75
+ </div>
76
+ </td>
77
+ </tr>
78
+ <tr>
79
+ <td class="mtlll">
80
+ <span class="tooltip hoverable info-cursor f18" tooltip="<?php echo $ctl; ?>"><?php _e("Cannot log in there?", 'backup-migration'); ?></span>
81
+ </td>
82
+ <td></td>
83
+ <td></td>
84
+ </tr>
85
+
86
+ </table>
87
+
88
+ </div>
89
+
90
+ <div id="trouble_extenstion" class="f20" style="display: none; min-width: calc(100% - 45px - 45px);">
91
+
92
+ <div class="mm">
93
+ <div class="f26 semibold mb">
94
+ <?php _e("Troubleshooting settings", 'backup-migration'); ?>
95
+ </div>
96
+ <div class="f20 semibold">
97
+ <?php _e("Site information", 'backup-migration'); ?>
98
+ </div>
99
+ <div class="f16 mtll mbll">
100
+ <?php _e("Here is some information about your site, which may help to debug if there is an issue:", 'backup-migration'); ?>
101
+ </div>
102
+ </div>
103
+
104
+ <div class="mm bg-second f16 mtl mbl lh25">
105
+ <table style="width: 100%">
106
+ <tbody>
107
+
108
+ <?php
109
+ require_once BMI_INCLUDES . '/check/system_info.php';
110
+ $info = new SI();
111
+ $info = $info->to_array();
112
+ $i = 0;
113
+ foreach ($info as $key => $value) {
114
+ $i++; ?>
115
+ <tr class="<?php echo(($i <= 7)?'ignored-tr':'hide-show-tr'); ?>">
116
+ <th align="left"><?php echo ucwords(str_replace('_', ' ', $key)); ?></th>
117
+ <td><?php
118
+
119
+ if (is_object($value)) {
120
+ echo $value->format('Y-m-d H:i:s.u');
121
+ } elseif (is_array($value)) {
122
+ if (sizeof($value) === 0) {
123
+ echo '---';
124
+ } else {
125
+ if ($key == 'wp_active_themes_info') {
126
+ echo $value[0]['name'] . '@' . $value[0]['version'];
127
+ } elseif ($key == 'wp_active_plugins_info') {
128
+ $disp = '';
129
+ for ($i = 0; $i < sizeof($value); ++$i) {
130
+ $disp .= $value[$i]['name'] . '@' . $value[$i]['version'] . ' | ';
131
+ }
132
+ echo rtrim($disp, ' | ');
133
+ } else {
134
+ echo implode(' | ', $value);
135
+ }
136
+ }
137
+ } elseif (is_bool($value)) {
138
+ echo $value === true ? 'true' : 'false';
139
+ } else {
140
+ if (strlen($value) == '0') {
141
+ echo '---';
142
+ } else {
143
+ echo $value;
144
+ }
145
+ } ?></td>
146
+ </tr>
147
+ <?php
148
+ }
149
+ ?>
150
+ <tr class="ignored-tr">
151
+ <th style="width: 400px"></th>
152
+ <td align="right">
153
+ <span class="hoverable secondary" id="switch-show-trs" data-see="<?php _e("See more", 'backup-migration'); ?>" data-hide="<?php _e("Collapse", 'backup-migration'); ?>">
154
+ <?php _e("See more", 'backup-migration'); ?>
155
+ </span>
156
+ </td>
157
+ </tr>
158
+ </tbody>
159
+ </table>
160
+ </div>
161
+
162
+ <div class="mm mtll f16">
163
+ <a href="#" class="nodec secondary hoverable" id="download-site-infos"><?php _e("Download your site infos", 'backup-migration'); ?></a> <?php _e("(e.g. for easy sharing with us, so that we can debug)", 'backup-migration'); ?>
164
+ </div>
165
+
166
+ <div class="mm mtl semibold">
167
+ <?php _e("Logging", 'backup-migration'); ?>
168
+ </div>
169
+
170
+ <div class="mm mtll f16">
171
+ <?php _e("All backup creation & restore processes are documented in log files which to debug issues.", 'backup-migration'); ?>
172
+ <a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=complete_logs.log&backup-id=current&t=<?php echo time(); ?>"
173
+ download="<?php _e('bmi-debug-info', 'backup-migration') ?>" class="nodec hoverable secondary">
174
+ <?php _e("Download logs.", 'backup-migration'); ?>
175
+ </a>
176
+ </div>
177
+
178
+ <div class="mm mtl mbll semibold">
179
+ <?php _e("Reset configuration", 'backup-migration'); ?>
180
+ </div>
181
+
182
+ <div class="mm mb f16">
183
+ <?php _e("Please", 'backup-migration'); ?> <a href="#" class="hoverable secondary modal-opener nodec" data-modal="reset-confirm-modal"><?php _e("click here", 'backup-migration'); ?></a> <?php _e("to reset plugin configuration.", 'backup-migration'); ?>
184
+ </div>
185
+
186
+ <div class="mm mb f18">
187
+ <?php _e("If you’re looking for other options not listed above, check out the", 'backup-migration'); ?> <a href="#" class="collapser-openner nodec secondary hoverable" data-el="#other-options"><?php _e("Other options", 'backup-migration'); ?></a> <?php _e("chapter as they might be there.", 'backup-migration'); ?>
188
+ </div>
189
+
190
+ </div>
191
+
192
+ <div class="mm center f20 mb">
193
+ <a href="#" class="text-muted close-chapters nodec"><?php _e("Collapse this chapter", 'backup-migration'); ?></a>
194
+ </div>
195
+ <div class="mbll"></div>
includes/dashboard/chapter/what_backed_up.php ADDED
@@ -0,0 +1,389 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Use
7
+ use BMI\Plugin\Backup_Migration_Plugin as BMP;
8
+
9
+ // Exit on direct access
10
+ if (!defined('ABSPATH')) {
11
+ exit;
12
+ }
13
+
14
+ function siteURL() {
15
+ $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
16
+ $domainName = $_SERVER['HTTP_HOST'];
17
+
18
+ return $protocol . $domainName;
19
+ }
20
+
21
+ // Tooltips
22
+ $sellcodes_url = BMI_AUTHOR_URI;
23
+ $tooltip_files = __("Here are stored all plugin, theme, WordPress installation files, but also files from Media library and other folders and files located in your server’s site directory. Note that WordPress keeps records of files such as Media library in the Databases, so you should also backup Databases if you want WordPress to “see” e.g. recovered media files. Size here is the total size you can get.", 'backup-migration');
24
+ $domain = siteURL();
25
+ $tooltip_exclude_file = __("Enter the paths to the files you want to exclude from your backup (one per line).", 'backup-migration');
26
+ $tooltip_exclude_path = __("Enter the paths to the directories/folders you want to exclude from your backup (one per line).", 'backup-migration');
27
+ $tooltip_premium_details = __("You can already exclude files based on filters (click on “Yes” below), however in the premium plugin you’ll also be able to browse through them.", 'backup-migration') . "<br><br>";
28
+ $tooltip_premium_details .= __("This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a", 'backup-migration') . "<b>" . __("big discount", 'backup-migration') . "</b>. <a href='" . $sellcodes_url . "' target='_blank'>" . __("Learn more", 'backup-migration') . "</a>.";
29
+
30
+ $tooltip_smart_exclusion = __("This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>. ", 'backup-migration');
31
+ $tooltip_smart_exclusion .= "<a href='" . $sellcodes_url . "' target='_blank'>" . __("Learn more", 'backup-migration') . "</a>.";
32
+
33
+ if (!function_exists('bmi_cb_collapsible')) {
34
+ function bmi_cb_collapsible($c) {
35
+ echo ' class="bmi_will_collapse" data-if-checked="' . $c . '"';
36
+ }
37
+ }
38
+
39
+ ?>
40
+
41
+ <!-- Files -->
42
+ <div class="mm mt lh30">
43
+ <div class="mbl">
44
+ <?php _e("Here you can define what exactly will be included in the backup. If your site is very large it may make sense to only backup certain parts of it.", 'backup-migration'); ?>
45
+ </div>
46
+
47
+ <div class="">
48
+
49
+ <label for="files-group-backup">
50
+ <input id="files-group-backup"<?php bmi_cb_collapsible('file_group_cb'); ?> type="checkbox"<?php bmi_try_checked('BACKUP:FILES'); ?>>
51
+ <span id="bmi-scan-total" class="relative">
52
+ <b><?php _e("Files", 'backup-migration'); ?></b>
53
+ <span class="value">(<div class="spinner-loader"></div>)</span>&nbsp;
54
+ <span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_files; ?>"></span>
55
+ </span>
56
+ </label>
57
+
58
+ </div>
59
+
60
+ </div>
61
+
62
+ <div id="file_group_cb">
63
+ <div class="mm92 lh30 file-checkboxes-wrapper mbl npb">
64
+ <div class="">
65
+ <span class="medium"><?php _e("Select which files you want to have backed up.", 'backup-migration'); ?></span>
66
+ </div>
67
+ <div class="flex file-checkboxes basic-file-exlusion">
68
+
69
+ <label for="files-group-plugins">
70
+ <div class="cf nm">
71
+ <div class="left nm" id="bmi-scan-plugins">
72
+ <input type="checkbox" id="files-group-plugins"<?php bmi_try_checked('BACKUP:FILES::PLUGINS'); ?>>
73
+ <span class="medium"><?php _e("Plugins", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
74
+ </div>
75
+ <div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
76
+ <div class="nm">
77
+ <span class="left f15">
78
+ <?php _e("Details", 'backup-migration'); ?>
79
+ </span>
80
+ <span class="right premium premium-img"></span>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </label>
85
+
86
+ <label for="files-group-uploads">
87
+ <div class="cf nm">
88
+ <div class="left nm" id="bmi-scan-plugins">
89
+ <input type="checkbox" id="files-group-uploads"<?php bmi_try_checked('BACKUP:FILES::UPLOADS'); ?>>
90
+ <span id="bmi-scan-uploads">
91
+ <span class="medium"><?php _e("Uploads", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
92
+ </span>
93
+ </div>
94
+ <div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
95
+ <div class="nm">
96
+ <span class="left f15">
97
+ <?php _e("Details", 'backup-migration'); ?>
98
+ </span>
99
+ <span class="right premium premium-img"></span>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </label>
104
+
105
+ <label for="files-group-themes">
106
+ <div class="cf nm">
107
+ <div class="left nm" id="bmi-scan-plugins">
108
+ <input type="checkbox" id="files-group-themes"<?php bmi_try_checked('BACKUP:FILES::THEMES'); ?>>
109
+ <span id="bmi-scan-themes">
110
+ <span class="medium"><?php _e("Themes", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
111
+ </span>
112
+ </div>
113
+ <div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
114
+ <div class="nm">
115
+ <span class="left f15">
116
+ <?php _e("Details", 'backup-migration'); ?>
117
+ </span>
118
+ <span class="right premium premium-img"></span>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </label>
123
+
124
+ <label for="files-group-other-contents">
125
+ <div class="cf nm">
126
+ <div class="left nm" id="bmi-scan-plugins">
127
+ <input type="checkbox" id="files-group-other-contents"<?php bmi_try_checked('BACKUP:FILES::OTHERS'); ?>>
128
+ <span id="bmi-scan-contents_others">
129
+ <span class="medium"><?php _e("Everything else in wp-content", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
130
+ </span>
131
+ </div>
132
+ <div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
133
+ <div class="nm">
134
+ <span class="left f15">
135
+ <?php _e("Details", 'backup-migration'); ?>
136
+ </span>
137
+ <span class="right premium premium-img"></span>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ </label>
142
+
143
+ <label for="files-group-wp-install">
144
+ <div class="cf nm">
145
+ <div class="left nm" id="bmi-scan-plugins">
146
+ <input type="checkbox" id="files-group-wp-install"<?php bmi_try_checked('BACKUP:FILES::WP'); ?>>
147
+ <span id="bmi-scan-wordpress">
148
+ <span class="medium"><?php _e("WordPress installation", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
149
+ </span>
150
+ </div>
151
+ <div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
152
+ <div class="nm">
153
+ <span class="left f15">
154
+ <?php _e("Details", 'backup-migration'); ?>
155
+ </span>
156
+ <span class="right premium premium-img"></span>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ </label>
161
+
162
+ </div>
163
+ <div class="mtl cf">
164
+ <div class="left inline-radio">
165
+ <?php _e("Want to exclude files based on filters?", 'backup-migration'); ?>
166
+ </div>
167
+ <div class="left d-flex mr60 ia-center">
168
+ <label class="container-radio">
169
+ <?php _e("No", 'backup-migration'); ?>
170
+ <input type="radio" name="exclude_files_by_filters"<?php bmi_cb_collapsible('file_filters_exclusion'); ?> value="false"<?php bmi_try_checked('BACKUP:FILES::FILTER', true); ?>>
171
+ <span class="checkmark-radio"></span>
172
+ </label>
173
+ <label class="container-radio ml25">
174
+ <?php _e("Yes", 'backup-migration'); ?>
175
+ <input id="files_by_filters" type="radio" name="exclude_files_by_filters"<?php bmi_cb_collapsible('file_filters_exclusion'); ?> value="true"<?php bmi_try_checked('BACKUP:FILES::FILTER'); ?>>
176
+ <span class="checkmark-radio"></span>
177
+ </label>
178
+ </div>
179
+ </div>
180
+ </div>
181
+
182
+ <!-- Files @ Filter (Excluder) -->
183
+ <div class="mm mtl mbl lh30 bg-second" id="file_filters_exclusion">
184
+ <div class="rr">
185
+
186
+ <div>
187
+ <label for="ex_b_fs">
188
+ <input type="checkbox" id="ex_b_fs"<?php bmi_cb_collapsible('file_filters_size'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:SIZE'); ?>>
189
+ <span id="bmi-scan-plugins">
190
+ <span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("file size", 'backup-migration'); ?></b></span><span id="bmi__collon">:</span>
191
+ </span>
192
+ </label>
193
+ <div class="rr mtll" id="file_filters_size">
194
+
195
+ <?php _e("Do not backup files which are larger than", 'backup-migration'); ?>
196
+ <input type="number" min="0" id="BFFSIN" class="mbfieldlimit" <?php bmi_try_value('BACKUP:FILES::FILTER:SIZE:IN'); ?>>
197
+ MB
198
+
199
+ </div>
200
+ </div>
201
+ <div class="mtl" side="left">
202
+ <label for="ex_b_names">
203
+ <input type="checkbox" id="ex_b_names"<?php bmi_cb_collapsible('file_filters_names'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:NAMES'); ?>>
204
+ <span id="bmi-scan-plugins">
205
+ <span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("file / folder name", 'backup-migration'); ?></b> <?php _e("(case-sensitive)", 'backup-migration'); ?></span>
206
+ </span>
207
+ </label>
208
+ <div class="rr" id="file_filters_names">
209
+
210
+ <div id="bmi_exclusion_rules"></div>
211
+ <div class="f16 hoverable mtll inline">
212
+ <a href="#" id="add-exclusion-rule" class="nodec secondary hoverable">+ <?php _e("Add an exclusion rule", 'backup-migration'); ?></a>
213
+ </div>
214
+
215
+ <div class="mt">
216
+ <?php _e('File names include the extension, e.g. if you select to exclude all files which end with “.psd” at the end then all files in psd format will be excluded.', 'backup-migration'); ?>
217
+ </div>
218
+
219
+ <div class="mtl mbll">
220
+ <?php _e("The folder where backups are stored (i.e. the backups which this plugin creates) is always excluded, to prevent you from taking backups of your own backups.", 'backup-migration'); ?>
221
+ </div>
222
+
223
+ </div>
224
+ </div>
225
+
226
+ <div class="mtl" side="left">
227
+ <label for="ex_b_fpaths">
228
+ <input type="checkbox" id="ex_b_fpaths"<?php bmi_cb_collapsible('file_filters_fpaths'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:FPATHS'); ?>>
229
+ <span id="bmi-scan-plugins" class="relative">
230
+ <span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("file path", 'backup-migration'); ?></b></span>&nbsp;
231
+ <span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_exclude_file; ?>"></span>
232
+ </span>
233
+ </label>
234
+ <div class="rr mtll" id="file_filters_fpaths">
235
+
236
+ <?php
237
+ $ex0 = __('Examples:', 'backup-migration');
238
+ $ex1 = BMP::fixSlashes(ABSPATH . 'wp-config.php');
239
+ $ex2 = BMP::fixSlashes(ABSPATH . 'debug.log');
240
+ $ex3 = BMP::fixSlashes(ABSPATH . 'readme.html');
241
+ ?>
242
+
243
+ <textarea id="dynamic-fpaths-names" class="fullwidth bmi-txtar" name="name" rows="6" cols="80" placeholder="<?php echo $ex0 . '&#10;' . $ex1 . '&#10;' . $ex2 . '&#10;' . $ex3 ?>">
244
+ </textarea>
245
+
246
+ </div>
247
+ </div>
248
+
249
+ <div class="mtl" side="left">
250
+ <label for="ex_b_dpaths">
251
+ <input type="checkbox" id="ex_b_dpaths"<?php bmi_cb_collapsible('file_filters_dpaths'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:DPATHS'); ?>>
252
+ <span id="bmi-scan-plugins" class="relative">
253
+ <span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("directory path", 'backup-migration'); ?></b></span>&nbsp;
254
+ <span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_exclude_path; ?>"></span>
255
+ </span>
256
+ </label>
257
+ <div class="rr mtll" id="file_filters_dpaths">
258
+
259
+ <?php
260
+ $ex4 = BMP::fixSlashes(ABSPATH . 'wp-admin');
261
+ $ex5 = BMP::fixSlashes(ABSPATH . 'wp-includes');
262
+ $ex6 = BMP::fixSlashes(WP_CONTENT_DIR . '/uploads');
263
+ ?>
264
+
265
+ <textarea id="dynamic-dpaths-names" class="fullwidth bmi-txtar" name="name" rows="6" cols="80" placeholder="<?php echo $ex0 . '&#10;' . $ex4 . '&#10;' . $ex5 . '&#10;' . $ex6 ?>">
266
+ </textarea>
267
+
268
+ </div>
269
+ </div>
270
+
271
+ </div>
272
+ </div>
273
+ </div>
274
+
275
+ <!-- Database -->
276
+ <div class="mm mtl lh30">
277
+ <div class="">
278
+
279
+ <label for="database-group-backup">
280
+ <input id="database-group-backup"<?php bmi_cb_collapsible('database_group_cb'); ?> type="checkbox"<?php bmi_try_checked('BACKUP:DATABASE'); ?>>
281
+ <span class="relative">
282
+ <b><?php _e("Databases", 'backup-migration'); ?>&nbsp;</b>
283
+ <span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_files; ?>"></span>
284
+ </span>
285
+ </label>
286
+
287
+ </div>
288
+ </div>
289
+
290
+ <div id="database_group_cb">
291
+ <div class="mm92 mbl lh30 file-checkboxes-wrapper">
292
+
293
+ <div class="mbl">
294
+ <span class="regular"><?php _e("All databases (on the domain", 'backup-migration'); ?> <a href="<?php echo $domain; ?>" target="_blank"><?php echo $domain; ?></a>) <?php _e("will be backed up unless you exclude them by defining exclusion rules.", 'backup-migration'); ?></span>
295
+ </div>
296
+
297
+ <div class="flex file-checkboxes">
298
+ <div class="premium-wrapper">
299
+ <label class="autowidth premium premium-img">
300
+ <input type="checkbox" disabled>
301
+ <span>
302
+ <span class="regular text-muted"><?php _e("Exclude certain tables from backups", 'backup-migration'); ?></span>
303
+ </span>
304
+ </label>
305
+ </div>
306
+ </div>
307
+
308
+ </div>
309
+ </div>
310
+
311
+ <div class="mm mtll lh30">
312
+
313
+ <div class="cf">
314
+ <div class="left inline-radio semibold">
315
+ <?php _e('Want to apply "smart" exclusions rules?', 'backup-migration'); ?>
316
+ </div>
317
+
318
+ <div class="left d-flex mr60 ia-center">
319
+ <label id="nnmysql" class="container-radio active">
320
+ <?php _e("No", 'backup-migration'); ?>
321
+ <input id="nnmysql" type="radio" name="smart_exclusion_db_first_bm" value="true" checked>
322
+ <span class="checkmark-radio"></span>
323
+ </label>
324
+ <span class="cf premium-wrapper" tooltip="<?php echo $tooltip_smart_exclusion; ?>">
325
+ <label class="left container-radio ml25 not-allowed">
326
+ <?php _e("Yes", 'backup-migration'); ?>
327
+ <input type="radio" disabled name="smart_exclusion_db_first_bm">
328
+ <span class="checkmark-radio"></span>
329
+ </label>
330
+ <span class="left premium premium-img premium-nt mtf3"></span>
331
+ </span>
332
+ </div>
333
+ </div>
334
+
335
+ </div>
336
+
337
+ <div class="mm lh30 mbll">
338
+ <?php _e('With the "Files" and "Databases" options above you can already define what to include or exclude in your backup. However, you may want to exclude elements in your backups where you are not sure in which file or table they reside. For example, you may want to exclude all spam comments in your backups. This is what the "smart" exclusion rules are for. This is also a good way to clean your site of things you do not want.', 'backup-migration'); ?>
339
+ </div>
340
+
341
+ <div class="mm mtl mbl lh40 bg-second f20 overlayed">
342
+
343
+ <?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
344
+
345
+ <div class="cf">
346
+ <label class="left half chhl">
347
+ <input type="checkbox" name="" value="">
348
+ <span><?php _e("Exclude", 'backup-migration'); ?> <b><?php _e("spam comments", 'backup-migration'); ?></b></span>
349
+ </label>
350
+ <label class="left half chhl">
351
+ <input type="checkbox" name="" value="">
352
+ <span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("cache files", 'backup-migration'); ?></b></span>
353
+ </label>
354
+ <label class="left half chhl">
355
+ <input type="checkbox" name="" value="">
356
+ <span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("deactivated plugins", 'backup-migration'); ?></b></span>
357
+ </label>
358
+ <label class="left half chhl">
359
+ <input type="checkbox" name="" value="">
360
+ <span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("debug logs", 'backup-migration'); ?></b></span>
361
+ </label>
362
+ <label class="left half chhl">
363
+ <input type="checkbox" name="" value="">
364
+ <span><?php _e("Exclude", 'backup-migration'); ?> <b><?php _e("all non-used themes", 'backup-migration'); ?></b></span>
365
+ </label>
366
+ <label class="left half chhl">
367
+ <input type="checkbox" name="" value="">
368
+ <span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("thumbnails", 'backup-migration'); ?></b></span>
369
+ </label>
370
+ <label class="left half chhl">
371
+ <input type="checkbox" name="" value="">
372
+ <span><?php _e("Exclude", 'backup-migration'); ?> <b><?php _e("post revisions", 'backup-migration'); ?></b></span>
373
+ </label>
374
+ </div>
375
+
376
+ </div>
377
+
378
+
379
+ <div class="mm mt mblll bold">
380
+ <?php _e("Summary / Sanity check", 'backup-migration'); ?>
381
+ </div>
382
+
383
+ <div class="mm mbl lh30 f20">
384
+ <?php _e("With above exclusion rules you excluded", 'backup-migration'); ?> <b id="esta-exclude">0 B</b> <?php _e("of data, which means your backup will be about", 'backup-migration'); ?> <b id="esta-size-for">0 B</b> <?php _e("large, unzipped.", 'backup-migration'); ?>
385
+ <!-- <?php _e("(refresh)", 'backup-migration'); ?> -->
386
+ <!-- <?php _e("See the list of files you excluded.", 'backup-migration'); ?> -->
387
+ </div>
388
+
389
+ <?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
includes/dashboard/chapter/where_config.php ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ // Preorder URL
12
+ $preorder = BMI_AUTHOR_URI;
13
+
14
+ ?>
15
+
16
+ <div class="mm mt mbl f20">
17
+ <?php _e("Select all the storage options you want to use:", 'backup-migration'); ?>
18
+ </div>
19
+
20
+ <div class="mm60">
21
+ <div class="mm tilo">
22
+
23
+ <div class="tab2">
24
+ <div class="tab2-item d-flex jst-sb ia-center activeList">
25
+ <div class="d-flex ia-center">
26
+ <img src="<?php echo $this->get_asset('images', '002-monitor-white.svg') ?>" alt="logo" class="tab2-img">
27
+ <span class="ml25">
28
+ <span class="title_whereStored"><?php _e("Locally", 'backup-migration'); ?></span>
29
+ <?php _e("(on this web server)", 'backup-migration'); ?>
30
+ </span>
31
+ </div>
32
+ <div class="ia-center">
33
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" checked class="checkbox">
34
+ <div class="knobs"><span></span></div>
35
+ <div class="layer_str"></div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ <div class="bg_grey">
40
+ <div class="container-40 lh30 pt30 pb30">
41
+ <div class="d-flex">
42
+ <div class="w270" style="margin-top: 23px;"><span><?php _e("Backup directory path:", 'backup-migration'); ?></span></div>
43
+ <div>
44
+ <div class="w100 pos-r"><input type="text" id="bmi_path_storage_default" placeholder="<?php _e("Enter directory path", 'backup-migration'); ?>" class="input-locally_web_server" value="<?php echo sanitize_text_field(bmi_get_config('STORAGE::LOCAL::PATH')); ?>">
45
+ <!---->
46
+ </div>
47
+ <div class="mt20"><span>
48
+ <?php _e("That’s where your local backups will be stored. If you picked external storage this folder will also be used (to store your backup temporarily, until it is uploaded to the external storage).", 'backup-migration'); ?>
49
+ </span></div>
50
+ </div>
51
+ </div>
52
+ <div class="d-flex">
53
+ <div class="w270" style="margin-top: 23px;"><span><?php _e("Accessible via direct link?", 'backup-migration'); ?></span></div>
54
+ <div>
55
+ <div class="w100">
56
+ <div class="d-flex mr60 ia-center" style="margin-top: 23px;">
57
+
58
+ <label class="container-radio">
59
+ <?php _e("No", 'backup-migration'); ?>
60
+ <input type="radio" name="radioAccessViaLink" value="false"<?php echo (bmi_get_config('STORAGE::DIRECT::URL') === 'false')?' checked':'' ?>>
61
+ <span class="checkmark-radio"></span>
62
+ </label>
63
+
64
+ <label class="container-radio ml25">
65
+ <?php _e("Yes", 'backup-migration'); ?>
66
+ <input type="radio" name="radioAccessViaLink" value="true"<?php echo (bmi_get_config('STORAGE::DIRECT::URL') === 'true')?' checked':'' ?>>
67
+ <span class="checkmark-radio"></span>
68
+ </label>
69
+
70
+ </div>
71
+ </div>
72
+ <div class="mt20">
73
+ <span>
74
+ <?php _e('Select “Yes” if you want your (manually created) backups to be available via a direct link. This makes migration from one site to another super-fast.', 'backup-migration'); ?>
75
+ </span>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ <div class="tab2-item">
82
+ <div class="not_ready"></div>
83
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
84
+ <p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
85
+ </div>
86
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'google-drive.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored"><?php _e("Google Drive", 'backup-migration'); ?></span></div>
87
+ <div class="ia-center">
88
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
89
+ <div class="knobs"><span></span></div>
90
+ <div class="layer_str"></div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ <div class="tab2-item">
95
+ <div class="not_ready"></div>
96
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
97
+ <p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
98
+ </div>
99
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'google-cloud.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Google Cloud</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
100
+ alt="logo" class="crown2"></div>
101
+ <div class="ia-center">
102
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
103
+ <div class="knobs"><span></span></div>
104
+ <div class="layer_str"></div>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ <div class="tab2-item">
109
+ <div class="not_ready"></div>
110
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
111
+ <p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
112
+ </div>
113
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'ftp.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">FTP</span></div>
114
+ <div class="ia-center">
115
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
116
+ <div class="knobs"><span></span></div>
117
+ <div class="layer_str"></div>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ <div class="tab2-item">
122
+ <div class="not_ready"></div>
123
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
124
+ <p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
125
+ </div>
126
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'sftp-scp.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">SFTP / SCP</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
127
+ alt="logo" class="crown2"></div>
128
+ <div class="ia-center">
129
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
130
+ <div class="knobs"><span></span></div>
131
+ <div class="layer_str"></div>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ <div class="tab2-item">
136
+ <div class="not_ready"></div>
137
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
138
+ <p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
139
+ </div>
140
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'Amazon.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Amazon S3</span></div>
141
+ <div class="ia-center">
142
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
143
+ <div class="knobs"><span></span></div>
144
+ <div class="layer_str"></div>
145
+ </div>
146
+ </div>
147
+ </div>
148
+ <div class="tab2-item">
149
+ <div class="not_ready"></div>
150
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
151
+ <p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
152
+ </div>
153
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'microsoft-azure.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Microsoft Azure</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
154
+ alt="logo" class="crown2"></div>
155
+ <div class="ia-center">
156
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
157
+ <div class="knobs"><span></span></div>
158
+ <div class="layer_str"></div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ <div class="tab2-item">
163
+ <div class="not_ready"></div>
164
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
165
+ <p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
166
+ </div>
167
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'onedrive.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">OneDrive</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
168
+ alt="logo" class="crown2"></div>
169
+ <div class="ia-center">
170
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
171
+ <div class="knobs"><span></span></div>
172
+ <div class="layer_str"></div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ <div class="tab2-item">
177
+ <div class="not_ready"></div>
178
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
179
+ <p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
180
+ </div>
181
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'rackspace.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Rackspace</span></div>
182
+ <div class="ia-center">
183
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
184
+ <div class="knobs"><span></span></div>
185
+ <div class="layer_str"></div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ <div class="tab2-item">
190
+ <div class="not_ready"></div>
191
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
192
+ <p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
193
+ </div>
194
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'backblaze.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Backblaze</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
195
+ alt="logo" class="crown2"></div>
196
+ <div class="ia-center">
197
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
198
+ <div class="knobs"><span></span></div>
199
+ <div class="layer_str"></div>
200
+ </div>
201
+ </div>
202
+ </div>
203
+ <div class="tab2-item">
204
+ <div class="not_ready"></div>
205
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
206
+ <p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
207
+ </div>
208
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'dream-objects.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">DreamObjects</span></div>
209
+ <div class="ia-center">
210
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
211
+ <div class="knobs"><span></span></div>
212
+ <div class="layer_str"></div>
213
+ </div>
214
+ </div>
215
+ </div>
216
+ <div class="tab2-item">
217
+ <div class="not_ready"></div>
218
+ <div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
219
+ <p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
220
+ </div>
221
+ <div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'openstack-swift.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Openstack (Swift)</span></div>
222
+ <div class="ia-center">
223
+ <div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
224
+ <div class="knobs"><span></span></div>
225
+ <div class="layer_str"></div>
226
+ </div>
227
+ </div>
228
+ </div>
229
+ </div>
230
+
231
+ </div>
232
+ </div>
233
+
234
+ <?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
includes/dashboard/modals/AA-Modal-Template.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <a href="#" class="modal-opener" data-modal="test-modal">Open test modal</a>
12
+
13
+ <div class="modal" id="test-modal">
14
+
15
+ <div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
16
+ <a href="#" class="modal-close">×</a>
17
+ <div class="modal-content">
18
+
19
+ <div class="mm60 f26 medium">We noticed:</div>
20
+
21
+
22
+ </div>
23
+ </div>
24
+
25
+ </div>
includes/dashboard/modals/backup-error-modal.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="backup-error-modal">
12
+
13
+ <div class="modal-wrapper no-hpad" style="max-width: 900px; max-width: min(900px, 80vw)">
14
+ <a href="#" class="modal-close">×</a>
15
+ <div class="modal-content center">
16
+
17
+ <div class="mm60 f30 bold black mb">
18
+ <div class="mb"><?php _e('There were some hick-ups...', 'backup-migration') ?></div>
19
+ <img src="<?php echo $this->get_asset('images', 'x-face.png'); ?>" alt="red-cross" width="110px">
20
+ </div>
21
+
22
+ <div class="mm60 f20 left-align">
23
+ <?php _e('The backup process ran into some difficulties. Error report:', 'backup-migration'); ?>
24
+ </div>
25
+
26
+ <div class="mm60 relative">
27
+ <div class="log-wrapper">
28
+ <pre id="backup-error-pre" style="min-height: 32px;"></pre>
29
+ </div>
30
+
31
+ <div class="mm60 right-align" style="position: absolute; top: 15px; right: 30px;">
32
+ <a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad bmi-copper" data-copy="backup-error-pre">
33
+ <div class="text">
34
+ <img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
35
+ <div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
36
+ </div>
37
+ </a>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="mm60 f20 mbl mtl lh30 left-align">
42
+ <?php
43
+ _e('Please copy this and post into a new support thread you open in the Support Forum - we are happy to help you quickly (100% free)!', 'backup-migration');
44
+ ?>
45
+ </div>
46
+
47
+ <div class="mm60 flex flexcenter mtl">
48
+ <div class="flex1 f16">
49
+ <a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t=<?php echo time(); ?>"
50
+ class="hoverable nodec secondary" download="restore_error_log">
51
+ <?php _e('Download logs', 'backup-migration') ?>
52
+ </a>
53
+ </div>
54
+ <div class="flex2">
55
+ <a class="btn inline semibold mm60 f16" href="#">
56
+ <?php _e('Go to Support Forum', 'backup-migration') ?>
57
+ </a>
58
+ </div>
59
+ <div class="flex1 f16 tooltip-html info-cursor" tooltip="<?php _e("Your account on Wordpress.org (where you open a new support thread) is different to the one you login to your WordPress dashboard (where you are now). If you don't have a WordPress.org account yet, please sign up at the top right on here. It only takes a minute :) Thank you!", 'backup-migration') ?>">
60
+ <?php _e('Cannot login there?', 'backup-migration') ?>
61
+ </div>
62
+ </div>
63
+
64
+ </div>
65
+ </div>
66
+
67
+ </div>
includes/dashboard/modals/backup-progress-modal.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal modal-no-close" id="backup-progress-modal">
12
+
13
+ <div class="modal-wrapper" style="max-width: 900px; max-width: min(900px, 80vw)">
14
+ <div class="modal-content center">
15
+
16
+ <div class="mm60 f26 bold black"><?php _e('Backup in progress', 'backup-migration') ?></div>
17
+
18
+ <div class="progress-bar-wrapper">
19
+
20
+ <div class="progress-bar">
21
+ <div class="progress-active-bar" style="width: 0%;"></div>
22
+ <div class="progress-percentage" style="left: 0%;">0%</div>
23
+ </div>
24
+
25
+ </div>
26
+
27
+ <div class="step-progress cf">
28
+ <div class="right f16 medium hoverable pointer"
29
+ data-show="<?php _e('Show live log', 'backup-migration') ?>"
30
+ data-hide="<?php _e('Hide live log', 'backup-migration') ?>"
31
+ id="live-log-toggle"
32
+ >
33
+ <?php _e('Hide live log', 'backup-migration') ?>
34
+ </div>
35
+ <div class="left f16 medium">
36
+ <?php _e('Step: ', 'backup-migration') ?>
37
+ <span id="current_step"><?php _e('Preparing backup process...', 'backup-migration') ?></span>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="live-log" id="live-log-wrapper">
42
+
43
+ <div class="log-wrapper">
44
+ <pre></pre>
45
+ </div>
46
+ <div class="f16 semibold secondary hoverable pointer">
47
+ <a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t=<?php echo time(); ?>"
48
+ download="<?php _e('live_progress', 'backup-migration') ?>" class="nlink">
49
+ <?php _e('Download live log​', 'backup-migration') ?>
50
+ </a>
51
+ </div>
52
+
53
+ </div>
54
+
55
+ <div class="f18 semibold mtll">
56
+ <?php _e('Please don’t do any major modifications on your site while the backup is running.', 'backup-migration') ?>
57
+ </div>
58
+
59
+ <div class="mtl">
60
+ <div>
61
+ <a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad modal-closer backup-minimize">
62
+ <div class="text">
63
+ <img src="<?php echo $this->get_asset('images', 'minimize-min.png'); ?>" alt="minimize-img">
64
+ <div class="f18 semibold"><?php _e('Minimize this window', 'backup-migration') ?></div>
65
+ </div>
66
+ </a>
67
+ </div>
68
+ <div class="text-grey text-muted mtll f16 modal-closer medium red-text inline" data-close="backup-progress-modal" id="backup-stop">
69
+ <?php _e('Stop the backup process', 'backup-migration') ?>
70
+ </div>
71
+ </div>
72
+
73
+ </div>
74
+ </div>
75
+
76
+ </div>
includes/dashboard/modals/backup-success-modal.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="backup-success-modal">
12
+
13
+ <div class="modal-wrapper" style="max-width: 900px; max-width: min(900px, 80vw)">
14
+ <div class="modal-content">
15
+
16
+ <div class="mms f30 bold center black"><?php _e('Backup successful!', 'backup-migration') ?></div>
17
+
18
+ <div class="center mbl mtl">
19
+ <img src="<?php echo $this->get_asset('images', 'happy-smile.png'); ?>" alt="happy-img">
20
+ </div>
21
+
22
+ <div id="accessible-at-section">
23
+ <div class="mms mbl">
24
+ <div class="f18 mbll">
25
+ <?php _e('Your backup is now accessible at:', 'backup-migration') ?>
26
+ </div>
27
+ <div class="cf success-copy-input">
28
+ <input type="text" id="text-input-copy" readonly class="left f18">
29
+ <a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad left bmi-copper" data-copy="text-input-copy">
30
+ <div class="text">
31
+ <img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
32
+ <div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
33
+ </div>
34
+ </a>
35
+ </div>
36
+ </div>
37
+
38
+ <div class="mms f18 mtl lh30">
39
+ <?php _e('To migrate your site, just copy above link, install our plugin on the target site, go to the', 'backup-migration') ?>
40
+ "<a href="#" class="hoverable secondary go-to-marbs"><?php _e('Manage & Restore Backups', 'backup-migration') ?></a>"
41
+ <?php _e('- tab, and paste the link there.', 'backup-migration') ?>
42
+ </div>
43
+ </div>
44
+
45
+ <div class="f18 mtl mbl mms lh14">
46
+ <?php _e('You can manage the backup on the', 'backup-migration') ?>
47
+ "<a href="#" class="hoverable secondary go-to-marbs"><?php _e('Manage & Restore Backups', 'backup-migration') ?></a>"
48
+ <?php _e('- tab.', 'backup-migration') ?>
49
+ </div>
50
+
51
+ <div class="mms mtl flex-here lh50">
52
+ <div class="f18 align-left">
53
+ <a href="#" class="nlink hoverable" id="download-backup-url" download><?php _e('Download backup', 'backup-migration') ?></a>
54
+ </div>
55
+
56
+ <div class="center">
57
+ <a href="#" class="btn inline btn-pad modal-closer grey-btn nplr" data-close="backup-success-modal">
58
+ <div class="text">
59
+ <div class="f18 semibold"><?php _e('Close window', 'backup-migration') ?></div>
60
+ </div>
61
+ </a>
62
+ </div>
63
+
64
+ <div class="f18 inline align-right">
65
+ <a href="#" class="nlink hoverable" id="download-backup-log-url" download="<?php _e('backup-logs', 'backup-migration') ?>">
66
+ <?php _e('Download logs', 'backup-migration') ?>
67
+ </a>
68
+ </div>
69
+ </div>
70
+
71
+ </div>
72
+ </div>
73
+
74
+ </div>
includes/dashboard/modals/bfs-modal.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="bfs-modal">
12
+
13
+ <div class="modal-wrapper no-hpad" style="max-width: 1080px; max-width: min(1080px, 80vw);">
14
+ <a href="#" class="modal-close">×</a>
15
+ <div class="modal-content">
16
+
17
+ <table>
18
+ <tbody>
19
+ <tr>
20
+
21
+ <td>
22
+ <div class="mm60">
23
+ <img class="center block inline" style="height: 379px; transform: rotateY(180deg);" src="<?php echo $this->get_asset('images', 'kitty-cat.svg'); ?>" alt="kitty">
24
+ </div>
25
+ </td>
26
+ <td>
27
+ <div class="f20 lh30 mm" style="padding-left: 0;">
28
+ <div class="f35 semibold mbl">
29
+ <?php _e("Wow, your site is", 'backup-migration'); ?> <span class="bold"><?php _e("FAT!", 'backup-migration'); ?></span>
30
+ </div>
31
+
32
+ <div class="mbl">
33
+ <?php printf(__("For large sites (above %sGB) we point you to the premium plugin, because:", 'backup-migration'), BMI_REV); ?>
34
+ </div>
35
+
36
+ <div class="mbl">
37
+ <ul>
38
+ <li class="hasArrowRight"><?php _e("Big sites tend to be more support heavy", 'backup-migration'); ?></li>
39
+ <li class="hasArrowRight"><?php _e("We also need to buy food", 'backup-migration'); ?></li>
40
+ <li class="hasArrowRight"><?php _e("The plugin offers many features for free which other plugins don’t", 'backup-migration'); ?></li>
41
+ </ul>
42
+ </div>
43
+
44
+ <div class="mbll">
45
+ <?php _e("We made it really affordable and it’s a great way to show your appreciation and support the further development of the plugin :) Thank you!", 'backup-migration'); ?>
46
+ </div>
47
+
48
+ <a href="#" class="btn center lh45">
49
+ <div class="f18"><?php _e("Yes, that’s fair…", 'backup-migration'); ?></div>
50
+ <div class="f30 bold"><?php _e("Get premium", 'backup-migration'); ?></div>
51
+ <div class="f18"><?php _e("(which includes other cool features too!)", 'backup-migration'); ?></div>
52
+ </a>
53
+
54
+ </div>
55
+ </td>
56
+
57
+ </tr>
58
+ </tbody>
59
+ </table>
60
+
61
+ <div class="center f18 mt">
62
+ <span class="text-muted">
63
+ <?php _e("Tip: You can also", 'backup-migration'); ?>
64
+ </span>
65
+ <span class="hoverable secondary">
66
+ <a href="#" class="modal-closer secondary collapser-openner nodec" data-el="#exlucde-parts"><?php _e("exclude parts from backup", 'backup-migration'); ?></a>
67
+ </span>
68
+ <span class="text-muted">
69
+ , <?php _e("which makes it smaller so that you stay below this limit.", 'backup-migration'); ?>
70
+ </span>
71
+ </div>
72
+
73
+ </div>
74
+ </div>
75
+
76
+ </div>
includes/dashboard/modals/delete-confirm-modal.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="delete-confirm-modal">
12
+
13
+ <div class="modal-wrapper" style="max-width: 380px; max-width: min(380px, 80vw);">
14
+ <a href="#" class="modal-close">×</a>
15
+ <div class="modal-content">
16
+
17
+ <div class="mbl center">
18
+ <img class="center block inline" src="<?php echo $this->get_asset('images', 'trash.png'); ?>" alt="trash">
19
+ </div>
20
+
21
+ <div class="center f24 bold mbl lh30 text1">
22
+ <?php _e("You’re sure you want to", 'backup-migration'); ?><br>
23
+ <?php _e("delete this backup?", 'backup-migration'); ?>
24
+ </div>
25
+
26
+ <div class="center f24 bold mbl lh30 text2" style="display: none;">
27
+ <?php _e("You’re sure you want to", 'backup-migration'); ?><br>
28
+ <?php _e("delete", 'backup-migration'); ?>
29
+ (<span id="backup-multiple-del-count">1</span>)
30
+ <span id="del-only-one"><?php _e("backup?", 'backup-migration'); ?></span>
31
+ <span id="del-more-than-one" style="display: none;"><?php _e("backups?", 'backup-migration'); ?></span>
32
+ </div>
33
+
34
+ <div class="center f19 mbl">
35
+ <a href="#" id="sure_delete" class="btn bold red inline mm60">
36
+ <?php _e("Yes, kill it!", 'backup-migration'); ?>
37
+ </a>
38
+ </div>
39
+
40
+ <div class="center f19">
41
+ <a href="#" class="bold modal-closer hoverable text-muted nodec">
42
+ <?php _e("No, cancel", 'backup-migration'); ?>
43
+ </a>
44
+ </div>
45
+
46
+ </div>
47
+ </div>
48
+
49
+ </div>
includes/dashboard/modals/pre-restore-modal.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ // Premium
12
+ $sellcodes = BMI_AUTHOR_URI;
13
+ $tooltip = "This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>. ";
14
+ $tooltip .= "<a href='" . $sellcodes . "' target='_blank'>Learn more</a>.";
15
+
16
+ ?>
17
+
18
+ <div class="modal" id="pre-restore-modal">
19
+
20
+ <div class="modal-wrapper no-hpad no-vpad" style="max-width: 900px; max-width: min(900px, 80vw)">
21
+ <a href="#" class="modal-close">×</a>
22
+ <div class="modal-content">
23
+
24
+ <div class="prenotices">
25
+
26
+ <div class="prenotice red top">
27
+ <div class="text bold">
28
+ <?php _e('All existing folders, files & databases on this site will be overwritten and destroyed for good. *', 'backup-migration') ?> ​
29
+ </div>
30
+ </div>
31
+
32
+ </div>
33
+
34
+ <div class="mm60 center f20 mbl">
35
+ <label for="restore-ok">
36
+ <input type="checkbox" id="restore-ok" />
37
+ <span><?php _e('Yes, I understand that. I am sound in mind.', 'backup-migration') ?></span>
38
+ </label>
39
+ </div>
40
+
41
+ <div class="mm60 center mbl">
42
+ <a href="#" class="btn max280" id="restore-start-sure">
43
+ <div class="text">
44
+ <div class="f20 bold"><?php _e('Start restoring!', 'backup-migration') ?></div>
45
+ </div>
46
+ </a>
47
+ </div>
48
+
49
+ <div class="mm60 center mbl f18">
50
+ <div class="premium-wrapper center block inline" tooltip="<?php echo $tooltip; ?>">
51
+ <div class="premium premium-img">
52
+ <?php _e('Only want to restore parts of the backup?​', 'backup-migration') ?>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="mm60 f18 center mbll">
58
+ <a href="#" class="modal-closer text-muted" data-close="pre-restore-modal"><?php _e('Close window & do not restore', 'backup-migration') ?></a>
59
+ </div>
60
+
61
+ <div class="mm60 center mb">
62
+ <?php _e('* Only those folders, files & database will be replaced which also exist in the backup file.', 'backup-migration') ?>
63
+ </div>
64
+
65
+ </div>
66
+ </div>
67
+
68
+ </div>
includes/dashboard/modals/prenotice-modal.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="prenotice-modal">
12
+
13
+ <div class="modal-wrapper no-hpad" style="max-width: 660px; max-width: min(660px, 80vw);">
14
+ <a href="#" class="modal-close">×</a>
15
+ <div class="modal-content">
16
+
17
+ <div class="mm60 f26 medium black"><?php _e('We noticed:', 'backup-migration') ?></div>
18
+ <div class="prenotices">
19
+
20
+ <div class="prenotice red prenotic-1">
21
+ <div class="text">
22
+ <?php _e('You running quite low on space. Maybe it would be good to clear up some space before you do the backup.', 'backup-migration') ?> ​
23
+ </div>
24
+ </div>
25
+ <div class="prenotice prenotic-2">
26
+ <div class="text">
27
+ <?php _e('You may not have enough memory (RAM) to create the backup. You can still try, if it fails check out the troubleshooting section.', 'backup-migration') ?>
28
+ </div>
29
+ </div>
30
+ <div class="prenotice prenotic-3">
31
+ <div class="text">
32
+ <?php _e('Based on your selections ', 'backup-migration') ?>
33
+ <span id="prenotice-size"></span><?php _e(' of data (unzipped) will be backed up.', 'backup-migration') ?>
34
+ </div>
35
+ </div>
36
+ <div class="prenotice prenotic-4">
37
+ <div class="text">
38
+ <?php _e('You selected to only back up part of your site (not a complete backup).', 'backup-migration') ?>
39
+ </div>
40
+ </div>
41
+ <div class="prenotice prenotic-5">
42
+ <div class="text">
43
+ <?php _e('You selected only files for backup - without database.', 'backup-migration') ?>
44
+ </div>
45
+ </div>
46
+ <div class="prenotice prenotic-6">
47
+ <div class="text">
48
+ <?php _e('You selected only database to backup - without website files.', 'backup-migration') ?>
49
+ </div>
50
+ </div>
51
+
52
+ </div>
53
+ <div class="mm60 center">
54
+ <a href="#" class="btn btn-with-img" id="start-entire-backup">
55
+ <div class="text">
56
+ <img style="margin-top: 1px;" src="<?php echo $this->get_asset('images', 'backup-min.svg'); ?>" alt="server-img" height="50px" class="img-now">
57
+ <div class="f18 regular"><?php _e('That’s all fine / I don’t care…', 'backup-migration') ?></div>
58
+ <div class="f25 bold"><?php _e('Create the backup!', 'backup-migration') ?></div>
59
+ </div>
60
+ </a>
61
+ <div class="text-grey text-muted mtl f18 modal-closer inline" data-close="prenotice-modal">
62
+ <?php _e('Don’t do backup & close this pop-up​', 'backup-migration') ?>
63
+ </div>
64
+ </div>
65
+
66
+ </div>
67
+ </div>
68
+
69
+ </div>
includes/dashboard/modals/reset-confirm-modal.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="reset-confirm-modal">
12
+
13
+ <div class="modal-wrapper" style="min-height: 0px; max-width: 564px; max-width: min(564px, 80vw);">
14
+ <div class="modal-content">
15
+
16
+ <div class="flex flexcenter">
17
+ <div class="mr20">
18
+ <img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
19
+ </div>
20
+ <div class="semibold f18 center lh30">
21
+ <?php _e("Do you really want to reset the configuration?", 'backup-migration'); ?><br>
22
+ <?php _e("This action cannot be undone!", 'backup-migration'); ?>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="center mtl">
27
+ <div class="cf inline">
28
+ <div class="left inline mr50">
29
+ <a href="#" class="btn bold mm red" id="configuration-reset-absolute"><?php _e("Yes, reset", 'backup-migration'); ?></a>
30
+ </div>
31
+ <div class="left inline">
32
+ <a href="#" class="btn bold mm grey nodec modal-closer"><?php _e("No, cancel", 'backup-migration'); ?></a>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ </div>
38
+ </div>
39
+
40
+ </div>
includes/dashboard/modals/restore-error-modal.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="restore-error-modal">
12
+
13
+ <div class="modal-wrapper no-hpad" style="max-width: 900px; max-width: min(900px, 80vw)">
14
+ <a href="#" class="modal-close">×</a>
15
+ <div class="modal-content center">
16
+
17
+ <div class="mm60 f30 bold black flex flexcenter mb">
18
+ <img src="<?php echo $this->get_asset('images', 'red-cross.svg'); ?>" alt="red-cross" width="110px">
19
+ <?php _e('Restore failed', 'backup-migration') ?>
20
+ </div>
21
+
22
+ <div class="mm60 f20 left-align">
23
+ <?php _e('The restoring process ran into some difficulties. Error report:', 'backup-migration') ?>
24
+ </div>
25
+
26
+ <div class="mm60 relative">
27
+ <div class="log-wrapper">
28
+ <pre id="restore-error-pre" style="min-height: 32px;"></pre>
29
+ </div>
30
+
31
+ <div class="mm60 right-align" style="position: absolute; top: 15px; right: 30px;">
32
+ <a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad bmi-copper" data-copy="restore-error-pre">
33
+ <div class="text">
34
+ <img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
35
+ <div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
36
+ </div>
37
+ </a>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="mm60 f20 mbl mtl lh30 left-align">
42
+ <?php
43
+ _e('Please copy this and post into a new support thread you open in the Support Forum - we are happy to help you quickly (100% free)!', 'backup-migration');
44
+ ?>
45
+ </div>
46
+
47
+ <div class="mm60 flex flexcenter mtl">
48
+ <div class="flex1 f16">
49
+ <a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t=<?php echo time(); ?>"
50
+ class="hoverable nodec secondary" download="restore_error_log">
51
+ <?php _e('Download logs', 'backup-migration') ?>
52
+ </a>
53
+ </div>
54
+ <div class="flex2">
55
+ <a class="btn inline semibold mm60 f16" href="#">
56
+ <?php _e('Go to Support Forum', 'backup-migration') ?>
57
+ </a>
58
+ </div>
59
+ <div class="flex1 f16 tooltip-html info-cursor" tooltip="<?php _e("Your account on Wordpress.org (where you open a new support thread) is different to the one you login to your WordPress dashboard (where you are now). If you don't have a WordPress.org account yet, please sign up at the top right on here. It only takes a minute :) Thank you!", 'backup-migration') ?>">
60
+ <?php _e('Cannot login there?', 'backup-migration') ?>
61
+ </div>
62
+ </div>
63
+
64
+ </div>
65
+ </div>
66
+
67
+ </div>
includes/dashboard/modals/restore-progress-modal.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal modal-no-close modal-not-allowed" id="restore-progress-modal">
12
+
13
+ <div class="modal-wrapper no-hpad" style="max-width: 900px; max-width: min(900px, 80vw)">
14
+ <div class="modal-content center">
15
+
16
+ <div class="mm60 f30 bold black"><?php _e('Restoring in progress', 'backup-migration') ?></div>
17
+
18
+ <div class="red-error-bg tml">
19
+ <div class="red-warning mtl mbl f18">
20
+ <?php _e('Do not close this window as long as the restoring process is ongoing', 'backup-migration'); ?>
21
+ </div>
22
+ </div>
23
+
24
+ <div class="mm60 progress-bar-wrapper">
25
+
26
+ <div class="progress-bar">
27
+ <div class="progress-active-bar" style="width: 0%;"></div>
28
+ <div class="progress-percentage" style="left: 0%;">0%</div>
29
+ </div>
30
+
31
+ </div>
32
+
33
+ <div class="mm60 step-progress cf">
34
+ <div class="left f16 medium">
35
+ <?php _e('Step: ', 'backup-migration') ?>
36
+ <span id="restore_current_step"><?php _e('Preparing restore process...', 'backup-migration') ?></span>
37
+ </div>
38
+ </div>
39
+
40
+ <div class="mm60 live-log" id="restore-live-log-wrapper">
41
+
42
+ <div class="log-wrapper">
43
+ <pre></pre>
44
+ </div>
45
+
46
+ </div>
47
+
48
+ </div>
49
+ </div>
50
+
51
+ </div>
includes/dashboard/modals/restore-success-modal.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal modal-no-close" id="restore-success-modal">
12
+
13
+ <div class="modal-wrapper no-hpad" style="max-width: 850px; max-width: min(850px, 80vw)">
14
+ <div class="modal-content center">
15
+
16
+ <div class="mm60 f35 bold black mbl mtl"><?php _e('Restore successful!​', 'backup-migration') ?></div>
17
+ <img class="mb mtl" src="<?php echo $this->get_asset('images', 'happy-smile.png'); ?>" alt="success">
18
+
19
+ <div class="mbl f20 lh30">
20
+ <?php _e("Liked how easy it was? Then PLEASE support the further", 'backup-migration'); ?><br>
21
+ <?php _e("development of our plugins by doing the following:", 'backup-migration'); ?>
22
+ </div>
23
+
24
+ <div class="cf mb inline center block suc-buttns">
25
+ <div class="left a1">
26
+ <a href="#" class="btn lime">
27
+ <div class="flex nowrap flexcenter">
28
+ <div class="fcentr">
29
+ <img class="center block inline" src="<?php echo $this->get_asset('images', 'thumb.png'); ?>" alt="trash">
30
+ </div>
31
+ <div class="fbcont lh20">
32
+ <span class="fbhead semibold"><?php _e("Give us a nice rating", 'backup-migration'); ?></span>
33
+ <?php _e("…so that others discover our", 'backup-migration'); ?>
34
+ <?php _e("plugin & benefit from it too.", 'backup-migration'); ?>
35
+ </div>
36
+ </div>
37
+ </a>
38
+ </div>
39
+ <div class="left a2">
40
+ <a href="#" class="btn">
41
+ <div class="flex nowrap flexcenter">
42
+ <div class="fcentr">
43
+ <img class="center block inline" src="<?php echo $this->get_asset('images', 'crown-bg.png'); ?>" alt="trash">
44
+ </div>
45
+ <div class="fbcont lh20">
46
+ <span class="fbhead semibold"><?php _e("Get our Premium plugin", 'backup-migration'); ?></span>
47
+ <?php _e("…to benefit from many cool features & support.", 'backup-migration'); ?>
48
+ </div>
49
+ </div>
50
+
51
+ </a>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="mb f28 secondary center semibold">
56
+ <?php _e("Thank you!!", 'backup-migration'); ?>
57
+ </div>
58
+
59
+ <div class="center mbl">
60
+ <a href="#" class="btn width50 f22 inline grey bold nodec site-reloader">
61
+ <?php _e("Ok, close", 'backup-migration'); ?>
62
+ </a>
63
+ </div>
64
+
65
+ <div class="center f17 mbl">
66
+ <a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t=<?php echo time(); ?>"
67
+ download="<?php _e('restore_process_logs', 'backup-migration') ?>">
68
+ <?php _e("Download the log", 'backup-migration'); ?></a> <?php _e("of the restoration process", 'backup-migration'); ?>
69
+ </div>
70
+
71
+ </div>
72
+ </div>
73
+
74
+ </div>
includes/dashboard/modals/upload-exist-file-modal.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="upload-exist-file-modal">
12
+
13
+ <div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
14
+ <div class="modal-content">
15
+
16
+ <div class="center">
17
+ <div class="mbl cf center block inline">
18
+ <div class="left center">
19
+ <img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
20
+ </div>
21
+ <div class="left f24 bold lh50 mms"><?php _e("File already exist", 'backup-migration'); ?></div>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="center f19 regular mbl lh30">
26
+ <?php _e("The file you tried to upload already match,", 'backup-migration'); ?><br>
27
+ <?php _e("name and size of file which already,", 'backup-migration'); ?><br>
28
+ <?php _e("exist in your backup directory.", 'backup-migration'); ?><br><br>
29
+ <?php _e("If you wish to have duplicate change name of the upload.", 'backup-migration'); ?><br>
30
+ </div>
31
+
32
+ <div class="center">
33
+ <a href="#" class="btn modal-closer inline mm60 center block bold nodec">
34
+ <?php _e("Ok, close", 'backup-migration'); ?>
35
+ </a>
36
+ </div>
37
+
38
+ </div>
39
+ </div>
40
+
41
+ </div>
includes/dashboard/modals/upload-invalid-manifest-modal.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="upload-invalid-manifest-modal">
12
+
13
+ <div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
14
+ <div class="modal-content">
15
+
16
+ <div class="center">
17
+ <div class="mbl cf center block inline">
18
+ <div class="left center">
19
+ <img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
20
+ </div>
21
+ <div class="left f24 bold lh50 mms"><?php _e("Invalid backup", 'backup-migration'); ?></div>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="center f19 regular mbl lh30">
26
+ <?php _e("Uploaded file is not valid backup,", 'backup-migration'); ?><br>
27
+ <?php _e("we removed the file from the server.", 'backup-migration'); ?>
28
+ </div>
29
+
30
+ <div class="center">
31
+ <a href="#" class="btn modal-closer inline mm60 center block bold nodec">
32
+ <?php _e("Ok, close", 'backup-migration'); ?>
33
+ </a>
34
+ </div>
35
+
36
+ </div>
37
+ </div>
38
+
39
+ </div>
includes/dashboard/modals/upload-success-modal.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="upload-success-modal">
12
+
13
+ <div class="modal-wrapper" style="max-width: 645px; max-width: min(645px, 80vw);">
14
+ <div class="modal-content">
15
+
16
+ <div class="center">
17
+ <div class="mbl cf center block inline">
18
+ <div class="left center">
19
+ <img class="inline" src="<?php echo $this->get_asset('images', 'success.png'); ?>" alt="success">
20
+ </div>
21
+ <div class="left f24 bold lh50"><?php _e("Upload successful!", 'backup-migration'); ?></div>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="f19 mbl center lh30">
26
+ <?php _e("We also triggered a rescan of your local folder automatically,", 'backup-migration'); ?><br>
27
+ <?php _e("so that the file will show up in your list of backups.", 'backup-migration'); ?>
28
+ </div>
29
+
30
+ <div class="center">
31
+ <a href="#" class="btn modal-closer inline mm60 center block bold nodec">
32
+ <?php _e("Ok, close", 'backup-migration'); ?>
33
+ </a>
34
+ </div>
35
+
36
+ </div>
37
+ </div>
38
+
39
+ </div>
includes/dashboard/modals/upload-wrong-file-modal.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="modal" id="upload-wrong-file-modal">
12
+
13
+ <div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
14
+ <div class="modal-content">
15
+
16
+ <div class="center">
17
+ <div class="mbl cf center block inline">
18
+ <div class="left center">
19
+ <img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
20
+ </div>
21
+ <div class="left f24 bold lh50 mms"><?php _e("Not right file type", 'backup-migration'); ?></div>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="center f19 regular mbl lh30">
26
+ <?php _e("The file you tried to upload isn’t a zip-file.", 'backup-migration'); ?><br>
27
+ <?php _e("All backup files are saved as zip.", 'backup-migration'); ?>
28
+ </div>
29
+
30
+ <div class="center">
31
+ <a href="#" class="btn modal-closer inline mm60 center block bold nodec">
32
+ <?php _e("Ok, close", 'backup-migration'); ?>
33
+ </a>
34
+ </div>
35
+
36
+ </div>
37
+ </div>
38
+
39
+ </div>
includes/dashboard/modules/backup-ongoing.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="f17 hoverable" id="bmi-ongoing-backup" style="display: none;">
2
+
3
+ <div class="nuts">
4
+ <img class="nut spinning nut-1" src="<?php echo $this->get_asset('images', 'nut-big.png'); ?>" alt="nut">
5
+ <img class="nut spinning-reverse nut-2" src="<?php echo $this->get_asset('images', 'nut-mid.png'); ?>" alt="nut">
6
+ <img class="nut spinning-reverse nut-3" src="<?php echo $this->get_asset('images', 'nut-small.png'); ?>" alt="nut">
7
+ </div>
8
+
9
+ <div class="centered">
10
+ <div class="bold">
11
+ <?php _e("Backup in progress!", 'backup-migration'); ?>
12
+ </div>
13
+
14
+ <div class="">
15
+ <?php _e("Click to see status quo", 'backup-migration'); ?>
16
+ </div>
17
+ </div>
18
+
19
+ </div>
includes/dashboard/modules/backup_controller.php ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ // ThMaker
10
+ function __th($n) {
11
+
12
+ $ths = [__("st", 'backup-migration'), __("nd", 'backup-migration'), __("rd", 'backup-migration'), __("th", 'backup-migration')];
13
+ $n = intval($n);
14
+ $nah = [11, 12, 13];
15
+
16
+ if (in_array($n, $nah)) return $ths[3];
17
+ else {
18
+
19
+ if (substr(''.$n, -1) == '1') return $ths[0];
20
+ elseif (substr(''.$n, -1) == '2') return $ths[1];
21
+ elseif (substr(''.$n, -1) == '3') return $ths[2];
22
+ else return $ths[3];
23
+
24
+ }
25
+
26
+ }
27
+
28
+ ?>
29
+
30
+ <div class="backup-creator cf section-bmi" id="bmi-section--cron">
31
+ <div class="left">
32
+ <div class="create-now pointer bmi-backup-btn one shadow" id="i-backup-creator">
33
+ <div class="insider"></div>
34
+ <div class="insider-2"></div>
35
+ <div class="vcenter">
36
+ <img src="<?php echo $this->get_asset('images', 'backup-min.svg'); ?>" alt="server-img" height="50px" class="img-now">
37
+ <div class="text">
38
+ <span class="medium pointer">
39
+ <?php _e('Create backup', 'backup-migration') ?> <span class="bold"><?php _e('now!', 'backup-migration') ?></span>
40
+ </span>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ <div class="left cron-backups-wrap" id="i-backup-cron">
46
+ <div class="cron-backups shadow relative<?php echo ((bmi_get_config('CRON:ENABLED') === false) ? ' disabled' : '') ?>">
47
+ <div class="turned-off pointer transition"<?php echo ((bmi_get_config('CRON:ENABLED') === true) ? ' style="display: none"' : '') ?>>
48
+ <div class="vcenter">
49
+ <div class="fullwidth">
50
+ <div class="cf inline lh28">
51
+ <div class="left">
52
+ <img src="<?php echo $this->get_asset('images', 'timemachine.svg'); ?>" alt="cron-icon" height="30px;">&nbsp;&nbsp;
53
+ </div>
54
+ <div class="left">
55
+ <span class="f20 regular">
56
+ <?php _e('... or have', 'backup-migration') ?>
57
+ <span class="semibold"><?php _e('backups created automatically', 'backup-migration') ?></span>
58
+ </span>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ <div class="turned-on f18"<?php echo ((bmi_get_config('CRON:ENABLED') === false) ? ' style="display: none"' : '') ?>>
65
+
66
+ <div class="cron-a cf">
67
+ <div class="left semibold relative">
68
+ <?php _e("Automatic backups creation", 'backup-migration'); ?>&nbsp;
69
+ <span class="bmi-info-icon tooltip cron-time-server" tooltip=""></span>
70
+ </div>
71
+ <div class="right">
72
+
73
+ <label for="cron-btn-toggle" class="bmi-switch">
74
+ <input type="checkbox" id="cron-btn-toggle"<?php echo ((bmi_get_config('CRON:ENABLED') === false) ? ' checked' : '') ?>>
75
+ <div class="bmi-switch-slider round">
76
+ <span class="on"><?php _e("On", 'backup-migration'); ?></span>
77
+ <span class="off"><?php _e("Off", 'backup-migration'); ?></span>
78
+ </div>
79
+ </label>
80
+
81
+ </div>
82
+ </div>
83
+
84
+ <div class="cron-bc">
85
+ <div class="cron-b bg-second cf">
86
+ <table class="ooo-to-pad">
87
+ <tbody>
88
+ <tr>
89
+ <td class="orr" style="min-width: 76px;"><?php _e("Create a backup every", 'backup-migration'); ?></td>
90
+ <td>
91
+ <select id="cron-period" data-parent="#bmi-section--cron" data-classes="orr" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:TYPE')); ?>">
92
+ <option value="month"><?php _e("Month", 'backup-migration'); ?></option>
93
+ <option value="week"><?php _e("Week", 'backup-migration'); ?></option>
94
+ <option value="day"><?php _e("Day", 'backup-migration'); ?></option>
95
+ </select>
96
+ </td>
97
+ <td id="cron-on-word"><?php _e("on", 'backup-migration'); ?></td>
98
+ <td class="cron-the"><?php _e("the", 'backup-migration'); ?></td>
99
+ <td>
100
+ <select id="cron-day" data-parent="#bmi-section--cron" data-classes="left orr oll" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:DAY')); ?>">
101
+ <?php for ($i = 0; $i < 28; ++$i): ?>
102
+ <?php $d = ($i+1); ?>
103
+ <option value="<?php echo $d; ?>"><?php echo $d . __th($d); ?></option>
104
+ <?php endfor; ?>
105
+ </select>
106
+ </td>
107
+ <td>
108
+ <select id="cron-week" data-parent="#bmi-section--cron" data-classes="orr oll" data-hide="true" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:WEEK')); ?>">
109
+ <option value="1"><?php _e("Monday", 'backup-migration'); ?></option>
110
+ <option value="2"><?php _e("Tuesday", 'backup-migration'); ?></option>
111
+ <option value="3"><?php _e("Wednesday", 'backup-migration'); ?></option>
112
+ <option value="4"><?php _e("Thursday", 'backup-migration'); ?></option>
113
+ <option value="5"><?php _e("Friday", 'backup-migration'); ?></option>
114
+ <option value="6"><?php _e("Saturday", 'backup-migration'); ?></option>
115
+ <option value="7"><?php _e("Sunday", 'backup-migration'); ?></option>
116
+ </select>
117
+ </td>
118
+ <td class="orr"><?php _e("at", 'backup-migration'); ?></td>
119
+ <td>
120
+ <select id="cron-hour" data-parent="#bmi-section--cron" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:HOUR')); ?>">
121
+ <?php for ($i = 0; $i < 24; ++$i): ?>
122
+ <?php $d = substr('0' . ($i), -2); ?>
123
+ <option value="<?php echo $d; ?>"><?php echo $d; ?></option>
124
+ <?php endfor; ?>
125
+ </select>
126
+ </td>
127
+ <td class="orr oll"><?php _e("hours and", 'backup-migration'); ?></td>
128
+ <td>
129
+ <select id="cron-minute" data-parent="#bmi-section--cron" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:MINUTE')); ?>">
130
+ <?php for ($i = 0; $i < 60; $i += 5): ?>
131
+ <?php $d = substr('0' . ($i), -2); ?>
132
+ <option value="<?php echo $d; ?>"><?php echo $d; ?></option>
133
+ <?php endfor; ?>
134
+ </select>
135
+ </td>
136
+ <td class="orr"><?php _e("minutes", 'backup-migration'); ?></td>
137
+ </tr>
138
+ </tbody>
139
+ </table>
140
+ </div>
141
+
142
+ <div class="cron-c cf">
143
+ <table class="left ooo-to-pad" style="max-width: calc(100% - 110px);">
144
+ <tbody>
145
+ <tr>
146
+ <td class="orr oll">
147
+ <?php _e("...and keep the last", 'backup-migration'); ?>
148
+ </td>
149
+ <td>
150
+ <select id="cron-keep-backups" data-parent="#bmi-section--cron" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:KEEP')); ?>">
151
+ <?php for ($i = 0; $i < 20; ++$i): ?>
152
+ <option value="<?php echo ($i+1); ?>"><?php echo ($i+1); ?></option>
153
+ <?php endfor; ?>
154
+ </select>
155
+ </td>
156
+ <td class="orr oll">
157
+ <?php _e("backups that have been created automatically.", 'backup-migration'); ?>
158
+ </td>
159
+ </tr>
160
+ </tbody>
161
+ </table>
162
+ <div class="lrn-mr-btn hoverable secondary right">
163
+ <?php _e('Learn more', 'backup-migration'); ?>
164
+ </div>
165
+ </div>
166
+ </div>
167
+
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </div>
172
+
173
+ <div class="mbl learn_more_about_cron" style="display: none;">
174
+ <ol style="list-style: outside;">
175
+ <li>
176
+ <?php _e("Above times are", 'backup-migration'); ?>
177
+ <b><?php _e("server times", 'backup-migration'); ?></b>
178
+ (<span id="server-time-auto" data-time="<?php echo time(); ?>"></span>)
179
+ </li>
180
+ <li>
181
+ <?php _e("There needs to be", 'backup-migration'); ?>
182
+ <b><?php _e("at least one visitor", 'backup-migration'); ?></b>
183
+ <?php _e("so that the backup process gets triggered (learn more about this in the", 'backup-migration'); ?>
184
+ <span class="secondary hoverable collapser-openner" data-el="#troubleshooting-chapter"><?php _e("troubleshooting section", 'backup-migration'); ?></span>)
185
+ </li>
186
+ <li>
187
+ <?php _e("We suggest to", 'backup-migration'); ?>
188
+ <b><?php _e("only keep 2 or 3 backups", 'backup-migration'); ?></b>
189
+ <?php _e("otherwise you may run out of space.", 'backup-migration'); ?>
190
+ </li>
191
+ <li>
192
+ <b><?php _e("Locked backups will not be deleted", 'backup-migration'); ?></b>
193
+ <?php _e("automatically. Those are indicated by a lock sign", 'backup-migration'); ?>
194
+ <img src="<?php echo $this->get_asset('images', 'lock-min.svg'); ?>" alt="lock" class="inline" height="18px">.
195
+ <?php _e('Manually created backups (i.e. those after click on "Create backup now!") are locked, while automatically created backups are unlocked.', 'backup-migration'); ?>
196
+ <?php _e("You can change their lock status on the", 'backup-migration'); ?>
197
+ <span class="secondary hoverable go-to-marbs"><?php _e("Manage & Restore Backup(s)", 'backup-migration'); ?></span>
198
+ <?php _e("tab", 'backup-migration'); ?>.
199
+ </li>
200
+ <li>
201
+ <?php _e("For", 'backup-migration'); ?>
202
+ <b><?php _e("other triggers", 'backup-migration'); ?></b>
203
+ <?php _e("when your backups are created, please go", 'backup-migration'); ?>
204
+ <span class="secondary hoverable collapser-openner" data-el="#other-options"><?php _e("here", 'backup-migration'); ?></span>.
205
+ </li>
206
+ <li>
207
+ <?php _e("Settings change saves automatically and it's confirmed with alert.", 'backup-migration'); ?>.
208
+ </li>
209
+ </ol>
210
+ <div class="right-align hoverable secondary closer-learn-more">
211
+ <?php _e("Collapse", 'backup-migration'); ?>
212
+ </div>
213
+ </div>
includes/dashboard/modules/backups-table-header.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <tr>
12
+ <th>
13
+ <label for="backups-select-all">
14
+ <input id="backups-select-all" type="checkbox">
15
+ <div class="inline tooltip" tooltip="<?php _e('When your backup was created, in server time', 'backup-migration') ?>" data-top="5">
16
+ <?php _e('Backup date', 'backup-migration') ?>
17
+ </div>
18
+ </label>
19
+ </th>
20
+ <th>
21
+ <div class="inline tooltip" tooltip="<?php _e('The name of your backup. To see the logic which default names your backups get, go to chapter &quot;How backups will be stored&quot;', 'backup-migration') ?>" data-top="5">
22
+ <?php _e('Filename', 'backup-migration') ?>
23
+ </div>
24
+ </th>
25
+ <th>
26
+ <div class="inline tooltip" tooltip="<?php _e('Size of your backup file', 'backup-migration') ?>" data-top="5">
27
+ <?php _e('Size', 'backup-migration') ?>
28
+ </div>
29
+ </th>
30
+ <th style="text-align: center;">
31
+ <div class="tooltip inline" tooltip="<?php _e('Locked backups can only be deleted manually. Unlocked backups get deleted automatically according to the deletion processes which you defined at the top of the &quot;Create backups&quot; - tab. Click on the icon(s) to change the lock status.', 'backup-migration') ?>" data-top="5">
32
+ <?php _e('Locked?', 'backup-migration') ?>
33
+ </div>
34
+ </th>
35
+ <th>
36
+ <div class="inline tooltip" tooltip="<?php _e('Move over the icons to see what you can do with the backup(s)', 'backup-migration') ?>" data-top="5">
37
+ <?php _e('Actions', 'backup-migration') ?>
38
+ </div>
39
+ </th>
40
+ <th></th>
41
+ <th></th>
42
+ </tr>
includes/dashboard/modules/backups-under-table.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+ use BMI\Plugin\Backup_Migration_Plugin AS BMP;
6
+
7
+ // Exit on direct access
8
+ if (!defined('ABSPATH')) exit;
9
+
10
+ ?>
11
+
12
+ <div class="cf lh28 valign-restore">
13
+
14
+ <div class="left cf hoverable" id="show-upload-area">
15
+ <div class="left">
16
+ <img class="a2" src="<?php echo $this->get_asset('images', 'upload-min.png'); ?>" width="15px" alt="image">
17
+ </div>
18
+ <div class="left f16 secondary hoverable">
19
+ <?php _e('Upload backup files', 'backup-migration') ?>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="left cf" style="margin-left: 35px;">
24
+ <div class="left">
25
+ <img class="a1" src="<?php echo $this->get_asset('images', 'search-min.png'); ?>" width="15px" alt="image">
26
+ </div>
27
+ <div class="left f16">
28
+ <?php _e('Rescan for backup files:', 'backup-migration') ?>
29
+ <a href="#" id="rescan-for-backups" class="secondary hoverable"><?php _e('Locally', 'backup-migration') ?></a>
30
+ <span style="display: none;">| <a href="#"><?php _e('Remotely', 'backup-migration') ?></a></span>
31
+ <span id="reloading-bm-list" style="display: none;"><div class="spinner-loader"></div></span>
32
+ </div>
33
+ </div>
34
+
35
+ </div>
36
+
37
+ <div class="mtl del-all-btn-wrp mbll" style="display: none;">
38
+ <button class="btn red deleteAllSelected"><?php _e('Delete all selected backups', 'backup-migration') ?></button>
39
+ </div>
40
+
41
+ <div class="upload_area hidden">
42
+
43
+ <div id="drop-area">
44
+ <label for="upid_input">
45
+ <form class="my-form center mt">
46
+ <div class="img_upload center block"></div>
47
+ <div class="f18 muted-text mtll">
48
+ <?php _e("Drag & drop your backup file here", 'backup-migration'); ?>
49
+ </div>
50
+ <div class="cf mtl center block inline">
51
+ <div class="left ortext">
52
+ <?php _e("...or", 'backup-migration'); ?>&nbsp;&nbsp;
53
+ </div>
54
+ <div class="left">
55
+ <div class="btn upload_button">
56
+ <?php _e("Browse for file", 'backup-migration'); ?>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ <input type="file" id="upid_input" accept=".zip" onchange="jQuery.fchunker_upload()">
61
+ </form>
62
+ </label>
63
+ </div>
64
+
65
+ <div class="mtl center upload-progress" style="display: none;">
66
+
67
+ <div class="upload-title mtl">
68
+ <?php _e("Upload in progress", 'backup-migration'); ?>
69
+ </div>
70
+
71
+ <div class="upload-progress-bar">
72
+ <span>
73
+ <div class="upload-percentage">99%</div>
74
+ </span>
75
+ </div>
76
+
77
+ <div class="mtll">
78
+ <a href="#" class="f16 medium red-text nodec hoverable" onclick="window.location.reload()"><?php _e("Cancel upload", 'backup-migration'); ?></a>
79
+ </div>
80
+
81
+ </div>
82
+
83
+ <div class="f18 mt30 lh30">
84
+ <?php _e("Alternatively, you can place the files (e.g. via FTP) into your local backup directory", 'backup-migration'); ?> (<?php echo BMP::fixSlashes(BMI_BACKUPS); ?>) <?php _e('or remote storage, and then use the "Rescan for backup files"-option above to make them show up in the list.', 'backup-migration'); ?>
85
+ </div>
86
+
87
+ </div>
88
+
89
+ <div class="center mtll" id="load-more-backups-wrp">
90
+ <a href="#" id="load-more-backups" style="display: none;" class="btn inline semibold mm60">
91
+ <?php _e('Load more', 'backup-migration'); ?>
92
+ </a>
93
+ </div>
includes/dashboard/modules/email-errors.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+ use BMI\Plugin\Backup_Migration_Plugin AS BMP;
6
+
7
+ // Exit on direct access
8
+ if (!defined('ABSPATH')) exit;
9
+
10
+ ?>
11
+
12
+ <?php if (get_option('bmi_display_email_issues', false)): ?>
13
+
14
+ <div class="error-noticer">
15
+ <div class="error-header">
16
+ <div class="cf">
17
+ <div class="left">
18
+ <?php _e('We have some notices regarding most recent automated backup.', 'backup-migration'); ?>
19
+ </div>
20
+ <div class="right hoverable">
21
+ <span id="bmi-error-toggle" data-expand="<?php _e('Expand', 'backup-migration'); ?>" data-collapse="<?php _e('Collapse', 'backup-migration'); ?>">
22
+ <?php _e('Expand', 'backup-migration'); ?>
23
+ </span> |
24
+ <span id="bmi-error-dismiss">
25
+ <?php _e('Dismiss', 'backup-migration'); ?>
26
+ </span>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ <div class="error-body">
31
+ <?php echo get_option('bmi_display_email_issues', false); ?>
32
+ </div>
33
+ </div>
34
+
35
+ <?php endif; ?>
includes/dashboard/modules/super-quick-migration.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="collapser ignorehov section-bmi shadow section-bmi" group="quick-migration">
12
+ <div class="header f20 pointer ignorehov transition heading-sq"><span class="bold"><?php _e('Super-quick migration', 'backup-migration') ?></span></div>
13
+ <div class="content">
14
+ <img src="<?php echo $this->get_asset('images', 'clocks-min.png'); ?>" class="bg-quick-migration" alt="bg-watches">
15
+ <div class="content-above">
16
+
17
+ <div class="f16 medium text-heading">
18
+ <?php _e('Paste here the url you got after creating a backup:', 'backup-migration') ?>
19
+ </div>
20
+
21
+ <input type="text" id="bm-d-url" placeholder="<?php _e('E.g.', 'backup-migration') ?> https://your-site.com/?backup=bmi_backup.zip&secret" class="light">
22
+
23
+ <div class="center">
24
+ <button type="button" id="quick-download-migration" class="f16 semibold with-icon centred">
25
+ <div class="for-img">
26
+ <img src="<?php echo $this->get_asset('images', 'restore-icon-min.png'); ?>" alt="restore-img">
27
+ <span><?php _e('Restore now!', 'backup-migration') ?></span>
28
+ </div>
29
+ </button>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
includes/dashboard/modules/upload-backup.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="">
12
+
13
+ </div>
includes/dashboard/settings.php ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ // Configuration sets tooltip
12
+ $sellcodes_url = BMI_AUTHOR_URI;
13
+ $configu_sets = __('This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>. ', 'backup-migration') . " <a href='" . $sellcodes_url . "' target='_blank'>" . __('Learn more', 'backup-migration') . '.</a>';
14
+
15
+ ?>
16
+
17
+ <style>#wpfooter { display: none !important; }</style>
18
+ <div id="bmi-preload">
19
+ <div class="progress">
20
+ <div class="indeterminate"></div>
21
+ </div>
22
+ </div>
23
+
24
+ <div id="bmi" style="display: none;">
25
+
26
+ <!-- Translations for JS -->
27
+ <?php require_once 'translations.php'; ?>
28
+
29
+ <!-- Plugin Title -->
30
+ <div class="heading f30 semibold">
31
+ <?php _e('Welcome to Backup & Migration!', 'backup-migration'); ?>
32
+ </div>
33
+
34
+ <!-- TABS -->
35
+ <div class="tabs cf shadow rbb">
36
+ <div class="tab left semibold f22 active pointer transition" data-point="create-backup-wrapper">
37
+ <?php _e('Create backup(s)', 'backup-migration') ?>
38
+ </div>
39
+ <div id="marbs" class="tab left semibold f22 pointer transition" data-point="manage-restore-wrapper">
40
+ <?php _e('Manage & Restore Backup(s)', 'backup-migration') ?>
41
+ </div>
42
+ </div>
43
+
44
+ <!-- Error handling -->
45
+ <?php require_once 'modules/email-errors.php'; ?>
46
+
47
+ <!-- @@TAB@@ Create backups(s) -->
48
+ <div class="tab-wrapper" id="create-backup-wrapper">
49
+
50
+ <!-- BACKUP BTNS -->
51
+ <?php require_once 'modules/backup_controller.php'; ?>
52
+
53
+ <!-- CONFIGURATION HEADER -->
54
+ <div class="cf section-bmi lh30">
55
+ <div class="left f20">
56
+ <?php _e('Configuration options', 'backup-migration') ?>
57
+ </div>
58
+ <div class="right f18 secondary premium-wrapper" tooltip="<?php echo $configu_sets; ?>">
59
+ <div class="premium premium-img">
60
+ <?php _e('+ Add / manage configuration set(s)​', 'backup-migration') ?>
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <!-- CONFIGURATION SECTION 1 -->
66
+ <div class="collapser section-bmi shadow" id="exlucde-parts" group="configuration">
67
+ <div class="header f20 pointer transition">
68
+ <span class="bold"><?php _e('What', 'backup-migration') ?></span> <?php _e('will be backed up?​', 'backup-migration') ?>
69
+ </div>
70
+ <div class="content save-action f20" data-save="save-file-config">
71
+
72
+ <?php require_once 'chapter/what_backed_up.php'; ?>
73
+
74
+ </div>
75
+ </div>
76
+
77
+ <!-- CONFIGURATION SECTION 2 -->
78
+ <div class="collapser section-bmi shadow" group="configuration">
79
+ <div class="header f20 pointer transition">
80
+ <span class="bold"><?php _e('Where', 'backup-migration') ?></span> <?php _e('shall the backup(s) be stored?', 'backup-migration') ?>
81
+ </div>
82
+ <div class="content save-action" data-save="save-storage">
83
+
84
+ <?php require_once 'chapter/where_config.php'; ?>
85
+
86
+ </div>
87
+ </div>
88
+
89
+ <!-- CONFIGURATION SECTION 3 -->
90
+ <div class="collapser section-bmi shadow" group="configuration">
91
+ <div class="header f20 pointer transition">
92
+ <span class="bold"><?php _e('How', 'backup-migration') ?></span> <?php _e('shall the backup(s) be stored?', 'backup-migration') ?>
93
+ </div>
94
+ <div class="content save-action" data-save="store-config">
95
+
96
+ <?php require_once 'chapter/store_config.php'; ?>
97
+
98
+ </div>
99
+ </div>
100
+
101
+ <!-- SECTION DIVIDER -->
102
+ <hr class="section-bmi">
103
+
104
+ <!-- GLOBAL CONFIGURATION -->
105
+ <div class="collapser section-bmi shadow" id="other-options" group="configuration">
106
+ <div class="header f20 pointer transition"><span class="bold"><?php _e('Other options', 'backup-migration') ?></span></div>
107
+ <div class="content save-action" data-save="save-other-options">
108
+
109
+ <?php require_once 'chapter/other_config.php'; ?>
110
+
111
+ </div>
112
+ </div>
113
+
114
+ <!-- TROUBLESHOOTING -->
115
+ <div class="collapser section-bmi shadow" id="troubleshooting-chapter" group="configuration">
116
+ <div class="header f20 pointer transition"><span class="bold"><?php _e('Troubleshooting', 'backup-migration') ?></span></div>
117
+ <div class="content">
118
+
119
+ <?php require_once 'chapter/troubleshooting.php'; ?>
120
+
121
+ </div>
122
+ </div>
123
+
124
+ </div>
125
+
126
+ <!-- @@TAB@@ Manage backups(s) -->
127
+ <div class="tab-wrapper rbb" id="manage-restore-wrapper" style="display: none;">
128
+
129
+ <!-- Super Quick Migration -->
130
+ <?php require_once 'modules/super-quick-migration.php'; ?>
131
+
132
+ <div class="restore-wrapper shadow fullwidth rbb rbt">
133
+ <div class="f22 regular m mbl"><?php _e("Your saved backups:", 'backup-migration'); ?></div>
134
+
135
+ <!-- Super Quick Migration -->
136
+ <div class="quick-migration m">
137
+
138
+ <!-- Templates -->
139
+ <div style="display: none; visibility: none;" class="hide">
140
+
141
+ <!-- Backup Row Template -->
142
+ <?php require_once 'templates/backup-row-template.php'; ?>
143
+
144
+ <!-- Exclusion Rule Row Template -->
145
+ <?php require_once 'templates/exclusion-rule-template.php'; ?>
146
+
147
+ <!-- Dropdown Template -->
148
+ <?php require_once 'templates/dropdown-template.php'; ?>
149
+
150
+ <!-- Dropdown Option Template -->
151
+ <?php require_once 'templates/option-template.php'; ?>
152
+
153
+ </div>
154
+
155
+ <!-- Backups TABLE -->
156
+ <div class="">
157
+
158
+ <div class="table-wrapper">
159
+ <table>
160
+ <thead>
161
+
162
+ <!-- Table Header -->
163
+ <?php require_once 'modules/backups-table-header.php'; ?>
164
+
165
+ </thead>
166
+ <tbody id="bmi_restore_tbody" data-empty="<?php _e('You have not created any backups yet.', 'backup-migration'); ?>">
167
+ <tr>
168
+ <td colspan="100%"><?php _e('You have not created any backups yet.', 'backup-migration'); ?></td>
169
+ </tr>
170
+ </tbody>
171
+ </table>
172
+ </div>
173
+
174
+ <!-- Backup options -->
175
+ <?php require_once 'modules/backups-under-table.php'; ?>
176
+
177
+ </div>
178
+
179
+ <!-- Upload Backup -->
180
+ <?php require_once 'modules/upload-backup.php'; ?>
181
+
182
+ </div>
183
+
184
+ </div>
185
+ </div>
186
+
187
+ <!-- Modals -->
188
+ <?php require_once 'modals/upload-invalid-manifest-modal.php'; ?>
189
+ <?php require_once 'modals/backup-progress-modal.php'; ?>
190
+ <?php require_once 'modals/backup-success-modal.php'; ?>
191
+ <?php require_once 'modals/prenotice-modal.php'; ?>
192
+ <?php require_once 'modals/pre-restore-modal.php'; ?>
193
+ <?php require_once 'modals/backup-error-modal.php'; ?>
194
+ <?php require_once 'modals/restore-progress-modal.php'; ?>
195
+ <?php require_once 'modals/restore-success-modal.php'; ?>
196
+ <?php require_once 'modals/restore-error-modal.php'; ?>
197
+ <?php require_once 'modals/upload-wrong-file-modal.php'; ?>
198
+ <?php require_once 'modals/upload-exist-file-modal.php'; ?>
199
+ <?php require_once 'modals/upload-success-modal.php'; ?>
200
+ <?php require_once 'modals/delete-confirm-modal.php'; ?>
201
+ <?php require_once 'modals/reset-confirm-modal.php'; ?>
202
+ <?php require_once 'modals/bfs-modal.php'; ?>
203
+
204
+ <!-- Other modules -->
205
+ <?php require_once 'modules/backup-ongoing.php'; ?>
206
+
207
+ </div>
includes/dashboard/templates/AA-Template.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
includes/dashboard/templates/backup-row-template.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <table>
12
+ <tr class="br_tr_template">
13
+ <td>
14
+ <label class="br_label" for="">
15
+ <input class="br_checkbox" id="" type="checkbox">
16
+ <span class="br_date">---</span>
17
+ </label>
18
+ </td>
19
+ <td class="br_name">---</td>
20
+ <td class="br_size">---</td>
21
+ <td class="center">
22
+ <img class="tooltip bc-unlocked-btn hoverable" tooltip="<?php _e('Lock backup files', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'unlocked-min.svg'); ?>" height="23px" alt="image">
23
+ <img class="tooltip bc-locked-btn hoverable" tooltip="<?php _e('Unlock backup files', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'lock-min.svg'); ?>" height="23px" alt="image">
24
+ </td>
25
+ <td>
26
+ <a href="#" class="bc-download-btn hoverable nodec untab" tabindex="-1" download>
27
+ <img class="tooltip" tooltip="<?php _e('Download the backup file. Click on it downloads it', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'download-min.png'); ?>" height="23px" alt="image">
28
+ </a>
29
+ <img class="tooltip bc-url-btn hoverable untab" tabindex="-1" tooltip="<?php _e('Copy link to backup file for super-quick migration', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'link-min.png'); ?>" height="23px" alt="image">
30
+ <a href="#" class="bc-logs-btn hoverable nodec untab" tabindex="-1" download>
31
+ <img class="tooltip" tooltip="<?php _e('Download log file which was created at time of backup', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'log-min.svg'); ?>" height="23px" alt="image">
32
+ </a>
33
+ </td>
34
+ <td>
35
+ <div class="restore-btn hoverable tooltip" tooltip="<?php _e('Restore this backup on this site', 'backup-migration') ?>">
36
+ <img src="<?php echo $this->get_asset('images', 'restore-min.svg'); ?>" width="12px" alt="image">
37
+ <?php _e('Restore', 'backup-migration') ?>
38
+ </div>
39
+ </td>
40
+ <td><img class="tooltip bc-remove-btn hoverable" tooltip="<?php _e('Delete this backup', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'red-close-min.svg'); ?>" height="12px" alt="image"></td>
41
+ </tr>
42
+ </table>
includes/dashboard/templates/dropdown-template.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="bmi-dropdown dropdown-template" data-selected="-1">
12
+ <div class="dropdown-title"></div>
13
+ <div class="dropdown-options"></div>
14
+ </div>
includes/dashboard/templates/exclusion-rule-template.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ ?>
12
+
13
+ <div class="mtll exclude-row exclusion_template">
14
+ <span><?php _e("Exclude if string", 'backup-migration'); ?></span>
15
+ <input class="exclusion_txt" type="text">
16
+ <span class="orr"><?php _e("appears", 'backup-migration'); ?></span>
17
+ <div class="exclusion_position inline">
18
+ <select>
19
+ <option value="1"><?php _e("anywhere in", 'backup-migration'); ?></option>
20
+ <option value="2"><?php _e("at the beginning of", 'backup-migration'); ?></option>
21
+ <option value="3"><?php _e("at the end of", 'backup-migration'); ?></option>
22
+ </select>
23
+ </div>
24
+ <span class="oll orr"><?php _e("the", 'backup-migration'); ?></span>
25
+ <div class="exclusion_where inline">
26
+ <select>
27
+ <option value="1"><?php _e("file name", 'backup-migration'); ?></option>
28
+ <option value="2"><?php _e("folder name", 'backup-migration'); ?></option>
29
+ </select>
30
+ </div>
31
+ <span class="oll kill-exclusion-rule">
32
+ <img src="<?php echo $this->get_asset('images', 'red-close-min.svg') ?>" alt="close-img" class="hoverable" height="15px">
33
+ </span>
34
+ </div>
includes/dashboard/templates/option-template.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ ?>
10
+
11
+ <div class="option-template dropdown-option"></div>
includes/dashboard/templates/premium-overlay.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ ?>
12
+
13
+ <div class="overlay-premium">
14
+ <div class="clocks_container">
15
+ <div>
16
+ <img src="<?php echo $this->get_asset('images', 'clock.svg') ?>" alt="clocks-bg">
17
+ </div>
18
+ <div>
19
+ <p class="f18 secondary"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> –
20
+ <b>
21
+ <a href="<?php echo $sellcodes_url; ?>" target="_blank" class="secondary"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a>
22
+ </b>
23
+ </p>
24
+ </div>
25
+ </div>
26
+ </div>
includes/dashboard/translations.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Dashboard;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ ?>
12
+
13
+ <div class="translations">
14
+ <div id="premium-tooltip">
15
+ <?php _e("This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>.", 'backup-migration') ?>
16
+ <a href="<?php echo BMI_AUTHOR_URI; ?>" target="_blank"><?php _e('Learn more', 'backup-migration') ?>.</a>
17
+ </div>
18
+ <div id="bmi-success-copy">
19
+ <?php _e('Text copied successfully', 'backup-migration') ?>
20
+ </div>
21
+ <div id="bmi-failed-copy">
22
+ <?php _e('Your browser does not support copying, please copy by hand', 'backup-migration') ?>
23
+ </div>
24
+ <div id="bmi-abort-soon">
25
+ <?php _e('Backup will be aborted in few seconds.', 'backup-migration') ?>
26
+ </div>
27
+ <div id="bmi-aborted-al">
28
+ <?php _e('Backup process aborted.', 'backup-migration') ?>
29
+ </div>
30
+ <div id="bmi-downloading-remote">
31
+ <?php _e('Downloading backup file...', 'backup-migration') ?>
32
+ </div>
33
+ <div id="bmi-restoring-prepare">
34
+ <?php _e('Preparing restore process...', 'backup-migration') ?>
35
+ </div>
36
+ <div id="bmi-restore-require-checkmark">
37
+ <?php _e('You have to confirm that you understand the risk.', 'backup-migration') ?>
38
+ </div>
39
+ <div id="bmi-upload-start">
40
+ <?php _e('File upload started.', 'backup-migration') ?>
41
+ </div>
42
+ <div id="bmi-upload-error">
43
+ <?php _e('There was an error during file upload.', 'backup-migration') ?>
44
+ </div>
45
+ <div id="bmi-upload-end">
46
+ <?php _e('File has been uploaded successfully.', 'backup-migration') ?>
47
+ </div>
48
+ <div id="bmi-upload-wrong">
49
+ <?php _e('File has wrong type.', 'backup-migration') ?>
50
+ </div>
51
+ <div id="bmi-upload-exists">
52
+ <?php _e('File already exist in backup directory.', 'backup-migration') ?>
53
+ </div>
54
+ <div id="bmi-remove-success">
55
+ <?php _e('Backup(s) removed successfully.', 'backup-migration') ?>
56
+ </div>
57
+ <div id="bmi-remove-error">
58
+ <?php _e('Cannot remove backup(s) file(s) due to unknown error.', 'backup-migration') ?>
59
+ </div>
60
+ <div id="bmi-save-success">
61
+ <?php _e('Configuration saved successfully.', 'backup-migration') ?>
62
+ </div>
63
+ <div id="bmi-save-issues">
64
+ <?php _e('There was an issue during saving, some settings may stay unchanged.', 'backup-migration') ?>
65
+ </div>
66
+ <div id="bmi-no-file">
67
+ <?php _e('Could not find this backup, it may be deleted or there was an error with getting the name.', 'backup-migration') ?>
68
+ </div>
69
+ <div id="bmi-unlock-success">
70
+ <?php _e('File unlocked successfully.', 'backup-migration') ?>
71
+ </div>
72
+ <div id="bmi-unlock-error">
73
+ <?php _e('Could not unlock this backup due to unknown error, please reload and try again.', 'backup-migration') ?>
74
+ </div>
75
+ <div id="bmi-lock-success">
76
+ <?php _e('File locked successfully.', 'backup-migration') ?>
77
+ </div>
78
+ <div id="bmi-lock-error">
79
+ <?php _e('Could not lock this backup due to unknown error, please reload and try again.', 'backup-migration') ?>
80
+ </div>
81
+ <div id="bmi-download-should-start">
82
+ <?php _e('Download process should start.', 'backup-migration') ?>
83
+ </div>
84
+ <div id="bmi-preb-processing">
85
+ <?php _e('We are processing your files, please wait till it complete. You can check the progress in the "What will be backed up?" tab.', 'backup-migration') ?>
86
+ </div>
87
+ <div id="bmi-no-selected">
88
+ <?php _e('There is nothing to backup. Please select database and / or files to backup.', 'backup-migration') ?>
89
+ </div>
90
+ <div id="bmi-invalid-url">
91
+ <?php _e('The URL you provided does not seems to be correct.', 'backup-migration') ?>
92
+ </div>
93
+ <div id="bmi-bc-ended">
94
+ <?php _e('Backup process ended, we triggered backup list reload for your.', 'backup-migration') ?>
95
+ </div>
96
+ <div id="bmi-current-time">
97
+ <?php _e('Current server time: ', 'backup-migration') ?>
98
+ </div>
99
+ <div id="bmi-next-cron">
100
+ <?php _e('Next backup planned: ', 'backup-migration') ?>
101
+ </div>
102
+ <div id="bmi-cron-updated">
103
+ <?php _e('Settings updated successfully', 'backup-migration') ?>
104
+ </div>
105
+ <div id="bmi-cron-updated-fail">
106
+ <?php _e('Could not update CRON setting now, please check the logs.', 'backup-migration') ?>
107
+ </div>
108
+ <div id="bmi-making-archive">
109
+ <?php _e("Making archive", 'backup-migration') ?>
110
+ </div>
111
+ <div id="BMI_URL_ROOT"><?php echo plugin_dir_url(BMI_ROOT_FILE); ?></div>
112
+ <div id="BMI_BLOG_URL"><?php echo get_site_url(); ?></div>
113
+ <div id="BMI_REV"><?php echo BMI_REV; ?></div>
114
+ </div>
includes/database/manager.php ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Database;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger AS Logger;
8
+ use BMI\Plugin\Progress\BMI_ZipProgress AS Progress;
9
+
10
+ // Exit on direct access
11
+ if (!defined('ABSPATH')) exit;
12
+
13
+ /**
14
+ * BMI_Database
15
+ */
16
+ class BMI_Database {
17
+
18
+ function __construct($host, $user, $pass, $name) {
19
+
20
+ $this->host = $host;
21
+ $this->user = $user;
22
+ $this->pass = $pass;
23
+ $this->name = $name;
24
+
25
+ }
26
+
27
+ public function exportDatabase(/*$tables = false, */$backup_name = false) {
28
+
29
+ $mysqli = new \mysqli($this->host, $this->user, $this->pass, $this->name);
30
+ $mysqli->select_db($this->name);
31
+ $mysqli->query("SET NAMES 'utf8'");
32
+
33
+ $file = fopen(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . $backup_name, 'w');
34
+ $queryTables = $mysqli->query('SHOW TABLES');
35
+ while ($row = $queryTables->fetch_row()) {
36
+
37
+ $target_tables[] = $row[0];
38
+
39
+ }
40
+
41
+ // if ($tables !== false) {
42
+ //
43
+ // $target_tables = array_intersect( $target_tables, $tables);
44
+ //
45
+ // }
46
+
47
+ fwrite($file, "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\n");
48
+ fwrite($file, "SET time_zone = \"+00:00\";\r\n\r\n\r\n");
49
+ fwrite($file, "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\r\n");
50
+ fwrite($file, "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\r\n");
51
+ fwrite($file, "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\r\n");
52
+ fwrite($file, "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\n");
53
+ fwrite($file, "/*!40101 SET NAMES utf8 */;\r\n");
54
+ fwrite($file, "--\r\n-- Database: `" . $this->name . "`\r\n");
55
+ fwrite($file, "--\r\n\r\n\r\n");
56
+
57
+ foreach ($target_tables as $table) {
58
+
59
+ if (empty($table)) { continue; }
60
+
61
+ $result = $mysqli->query('SELECT * FROM `'.$table.'`');
62
+ $fields_amount = $result->field_count;
63
+ $rows_num = $mysqli->affected_rows;
64
+ $res = $mysqli->query('SHOW CREATE TABLE ' . $table);
65
+ $TableMLine = $res->fetch_row();
66
+
67
+ fwrite($file, "\n\n".$TableMLine[1].";\n\n");;
68
+ $TableMLine[1] = str_ireplace('CREATE TABLE `','CREATE TABLE IF NOT EXISTS `', $TableMLine[1]);
69
+
70
+ for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter = 0) {
71
+
72
+ while ($row = $result->fetch_row()) {
73
+
74
+ if ($st_counter%100 == 0 || $st_counter == 0) {
75
+
76
+ fwrite($file, "\nINSERT INTO " . $table . " VALUES");
77
+
78
+ }
79
+
80
+ fwrite($file, "\n(");
81
+
82
+ for ($j = 0; $j < $fields_amount; $j++) {
83
+
84
+ $row[$j] = str_replace("\n","\\n", addslashes($row[$j]));
85
+
86
+ if (isset($row[$j])) {
87
+
88
+ fwrite($file, '"'.$row[$j].'"');
89
+
90
+ } else {
91
+
92
+ fwrite($file, '""');
93
+
94
+ }
95
+
96
+ if ($j<($fields_amount-1)) {
97
+ fwrite($file, ',');
98
+ }
99
+
100
+ }
101
+
102
+ fwrite($file, ")");
103
+
104
+ if ((($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) {
105
+
106
+ fwrite($file, ";");
107
+
108
+ } else {
109
+
110
+ fwrite($file, ",");
111
+
112
+ }
113
+
114
+ $st_counter=$st_counter+1;
115
+
116
+ }
117
+
118
+ }
119
+
120
+ fwrite($file, "\n\n\n");
121
+
122
+ }
123
+
124
+ fwrite($file, "\r\n\r\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\r\n");
125
+ fwrite($file, "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\r\n");
126
+ fwrite($file, "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;");
127
+
128
+ $backup_name = $backup_name ? $backup_name : $this->name.'___('.date('H-i-s').'_'.date('d-m-Y').').sql';
129
+
130
+ fclose($file);
131
+
132
+ }
133
+
134
+ public function importDatabase($sql_file_OR_content) {
135
+
136
+ @set_time_limit(3000);
137
+ $SQL_CONTENT = $sql_file_OR_content;
138
+ $allLines = explode("\n", $SQL_CONTENT);
139
+ $mysqli = new \mysqli($this->host, $this->user, $this->pass, $this->name);
140
+
141
+ if (mysqli_connect_errno()) {
142
+
143
+ Logger::error("Failed to connect to MySQL: " . mysqli_connect_error());
144
+
145
+ }
146
+
147
+ $qyr = $mysqli->query('SET foreign_key_checks = 0');
148
+ preg_match_all("/\nCREATE TABLE(.*?)\`(.*?)\`/si", "\n" . $SQL_CONTENT, $target_tables);
149
+
150
+ foreach ($target_tables[2] as $table) {
151
+
152
+ $mysqli->query('DROP TABLE IF EXISTS ' . $table);
153
+
154
+ }
155
+
156
+ $qyr = $mysqli->query('SET foreign_key_checks = 1');
157
+ $mysqli->query("SET NAMES 'utf8'");
158
+
159
+ $templine = '';
160
+ foreach ($allLines as $line) {
161
+
162
+ if (substr($line, 0, 2) != '--' && $line != '') {
163
+
164
+ $templine .= $line;
165
+ if (substr(trim($line), -1, 1) == ';') {
166
+
167
+ if (!$mysqli->query($templine)) {
168
+
169
+ Logger::error('Error performing query \'<strong>' . $templine . '\': ' . $mysqli->error . '<br /><br />');
170
+
171
+ }
172
+
173
+ $templine = '';
174
+
175
+ }
176
+
177
+ }
178
+
179
+ }
180
+
181
+ return __("Importing finished. Now, Delete the import file.", 'backup-migration');
182
+
183
+ }
184
+
185
+ }
includes/extracter/extract.php ADDED
@@ -0,0 +1,287 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Extracter;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger as Logger;
8
+ use BMI\Plugin\Dashboard as Dashboard;
9
+ use BMI\Plugin\Database\BMI_Database as Database;
10
+ use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
11
+ use BMI\Plugin\Zipper\Zip as Zip;
12
+
13
+ // Exit on direct access
14
+ if (!defined('ABSPATH')) {
15
+ exit;
16
+ }
17
+
18
+ /**
19
+ * BMI_Extracter
20
+ */
21
+ class BMI_Extracter {
22
+ public function __construct($backup, &$migration) {
23
+
24
+ // Globals
25
+ global $table_prefix;
26
+
27
+ // Requirements
28
+ require_once BMI_INCLUDES . '/database/manager.php';
29
+
30
+ // Backup name
31
+ $this->backup_name = $backup;
32
+
33
+ // Logger
34
+ $this->migration = $migration;
35
+
36
+ // Temp name
37
+ $this->tmptime = time();
38
+ $this->tmp = ABSPATH . '/backup-migration_' . $this->tmptime;
39
+
40
+ // Prepare database connection
41
+ $this->db = new Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
42
+
43
+ // Save current wp-config to replace (only those required)
44
+ $this->DB_NAME = DB_NAME;
45
+ $this->DB_USER = DB_USER;
46
+ $this->DB_PASSWORD = DB_PASSWORD;
47
+ $this->DB_HOST = DB_HOST;
48
+ $this->DB_CHARSET = DB_CHARSET;
49
+ $this->DB_COLLATE = DB_COLLATE;
50
+
51
+ $this->AUTH_KEY = AUTH_KEY;
52
+ $this->SECURE_AUTH_KEY = SECURE_AUTH_KEY;
53
+ $this->LOGGED_IN_KEY = LOGGED_IN_KEY;
54
+ $this->NONCE_KEY = NONCE_KEY;
55
+ $this->AUTH_SALT = AUTH_SALT;
56
+ $this->SECURE_AUTH_SALT = SECURE_AUTH_SALT;
57
+ $this->LOGGED_IN_SALT = LOGGED_IN_SALT;
58
+ $this->NONCE_SALT = NONCE_SALT;
59
+
60
+ $this->ABSPATH = ABSPATH;
61
+ $this->WP_CONTENT_DIR = WP_CONTENT_DIR;
62
+
63
+ $this->WP_DEBUG_LOG = WP_DEBUG_LOG;
64
+ $this->table_prefix = $table_prefix;
65
+
66
+ // Make temp dir
67
+ $this->migration->log(__('Making temporary directory', 'backup-migration'), 'INFO');
68
+ mkdir($this->tmp);
69
+
70
+ // Deny read of this folder
71
+ copy(BMI_INCLUDES . '/htaccess/.htaccess', $this->tmp . '/.htaccess');
72
+ touch($this->tmp . '/index.html');
73
+ touch($this->tmp . '/index.php');
74
+ }
75
+
76
+ public function replacePath($path, $sub, $content) {
77
+ $path .= DIRECTORY_SEPARATOR . 'wordpress' . $sub;
78
+ $rii = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
79
+
80
+ $clent = strlen($content);
81
+ $sublen = strlen($path);
82
+ $files = [];
83
+ $dirs = [];
84
+
85
+ foreach ($rii as $file) {
86
+ if (!$file->isDir()) {
87
+ $files[] = substr($file->getPathname(), $sublen);
88
+ } else {
89
+ $dirs[] = substr($file->getPathname(), $sublen);
90
+ }
91
+ }
92
+
93
+ for ($i = 0; $i < sizeof($dirs); ++$i) {
94
+ $src = $path . $dirs[$i];
95
+ if (strpos($src, $content) !== false) {
96
+ $dest = $this->WP_CONTENT_DIR . $sub . substr($dirs[$i], $clent);
97
+ } else {
98
+ $dest = $this->ABSPATH . $sub . $dirs[$i];
99
+ }
100
+
101
+ if (!file_exists($dest)) {
102
+ @mkdir($dest, 0755, true);
103
+ }
104
+ }
105
+
106
+ for ($i = 0; $i < sizeof($files); ++$i) {
107
+ if (strpos($files[$i], 'debug.log') !== false) {
108
+ array_splice($files, $i, 1);
109
+
110
+ break;
111
+ }
112
+ }
113
+
114
+ $max = sizeof($files);
115
+ for ($i = 0; $i < $max; ++$i) {
116
+ $src = $path . $files[$i];
117
+ if (strpos($src, $content) !== false) {
118
+ $dest = $this->WP_CONTENT_DIR . $sub . substr($files[$i], $clent);
119
+ } else {
120
+ $dest = $this->ABSPATH . $sub . $files[$i];
121
+ }
122
+
123
+ @rename($src, $dest);
124
+
125
+ if ($i % 100 === 0) {
126
+ $this->migration->progress(intval((($i / $max) * 100) / 2));
127
+ }
128
+ }
129
+ }
130
+
131
+ public function replaceAll($content) {
132
+ $this->replacePath($this->tmp, DIRECTORY_SEPARATOR, $content);
133
+ }
134
+
135
+ public function cleanup() {
136
+ $dir = $this->tmp;
137
+ $it = new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS);
138
+ $files = new \RecursiveIteratorIterator($it, \RecursiveIteratorIterator::CHILD_FIRST);
139
+
140
+ $this->migration->log(__('Removing ', 'backup-migration') . iterator_count($files) . __(' files', 'backup-migration'), 'INFO');
141
+ foreach ($files as $file) {
142
+ if ($file->isDir()) {
143
+ @rmdir($file->getRealPath());
144
+ } else {
145
+ @unlink($file->getRealPath());
146
+ }
147
+ }
148
+
149
+ @rmdir($dir);
150
+ }
151
+
152
+ public function extractTo() {
153
+ try {
154
+
155
+ // Require Universal Zip Library
156
+ require_once BMI_INCLUDES . '/zipper/src/zip.php';
157
+
158
+ // Verbose
159
+ Logger::log('Restoring site...');
160
+
161
+ // Time start
162
+ $start = microtime(true);
163
+ $this->migration->log(__('Scanning archive...', 'backup-migration'), 'STEP');
164
+
165
+ // Source
166
+ $src = BMI_BACKUPS . '/' . $this->backup_name;
167
+
168
+ // Extract
169
+ $this->zip = new Zip();
170
+ $isOk = $this->zip->unzip_file($src, $this->tmp, $this->migration);
171
+ if (!$isOk) {
172
+ $this->cleanup();
173
+
174
+ return false;
175
+ }
176
+
177
+ $this->migration->log(__('Files extracted...', 'backup-migration'), 'SUCCESS');
178
+
179
+ // WP Config backup
180
+ $this->migration->log(__('Saving wp-config file...', 'backup-migration'), 'STEP');
181
+ rename(ABSPATH . '/wp-config.php', ABSPATH . '/wp-config.' . $this->tmptime . '.php');
182
+ $this->migration->log(__('File wp-config saved', 'backup-migration'), 'SUCCESS');
183
+
184
+ $this->migration->log(__('Getting backup manifest...', 'backup-migration'), 'STEP');
185
+ $manifest = json_decode(file_get_contents($this->tmp . '/bmi_backup_manifest.json'));
186
+ $this->migration->log(__('Manifest loaded', 'backup-migration'), 'SUCCESS');
187
+
188
+ $this->migration->log(__('Restoring files...', 'backup-migration'), 'STEP');
189
+ $contentDirectory = $this->WP_CONTENT_DIR;
190
+ $pathtowp = DIRECTORY_SEPARATOR . 'wp-content';
191
+ if (isset($manifest->config->WP_CONTENT_DIR) && isset($manifest->config->ABSPATH)) {
192
+ $absi = $manifest->config->ABSPATH;
193
+ $cotsi = $manifest->config->WP_CONTENT_DIR;
194
+ if (strlen($absi) <= strlen($cotsi) && substr($cotsi, 0, strlen($absi)) == $absi) {
195
+ $inside = true;
196
+ $pathtowp = substr($cotsi, strlen($absi));
197
+ } else {
198
+ $inside = false;
199
+ $pathtowp = $cotsi;
200
+ }
201
+ }
202
+
203
+ $this->replaceAll($pathtowp);
204
+ $this->migration->log(__('Files restored', 'backup-migration'), 'SUCCESS');
205
+
206
+ // Restore WP Config ** It allows to recover session after restore no matter what
207
+ $curr_prefix = $this->table_prefix;
208
+ $new_prefix = $manifest->config->table_prefix;
209
+ $this->migration->log(__('Restoring wp-config file...', 'backup-migration'), 'STEP');
210
+ $file = file(ABSPATH . '/wp-config.' . $this->tmptime . '.php');
211
+ rename(ABSPATH . '/wp-config.' . $this->tmptime . '.php', ABSPATH . '/wp-config.php');
212
+ $wpconfig = file_get_contents(ABSPATH . '/wp-config.php');
213
+ if (strpos($wpconfig, '"' . $curr_prefix . '";') !== false) {
214
+ $wpconfig = str_replace('"' . $curr_prefix . '";', '"' . $new_prefix . '";', $wpconfig);
215
+ } elseif (strpos($wpconfig, "'" . $curr_prefix . "';") !== false) {
216
+ $wpconfig = str_replace("'" . $curr_prefix . "';", "'" . $new_prefix . "';", $wpconfig);
217
+ }
218
+ file_put_contents(ABSPATH . '/wp-config.php', $wpconfig);
219
+ $this->migration->log(__('WP-Config restored', 'backup-migration'), 'SUCCESS');
220
+
221
+ $this->migration->log(__('Restoring database...', 'backup-migration'), 'STEP');
222
+ if (file_exists($this->tmp . '/bmi_database_backup.sql')) {
223
+ $old_domain = $manifest->domain;
224
+ $new_domain = parse_url(home_url())['host'];
225
+
226
+ $sql = file_get_contents($this->tmp . '/bmi_database_backup.sql');
227
+ $sql = str_replace($old_domain, $new_domain, $sql);
228
+ $this->db->importDatabase($sql);
229
+ $this->migration->log(__('Database restored', 'backup-migration'), 'SUCCESS');
230
+
231
+ $this->migration->log(__('Making new login session', 'backup-migration'), 'STEP');
232
+ if ($manifest->cron === true || $manifest->cron === 'true' || $manifest->uid === 0 || $manifest->uid === '0') {
233
+ $manifest->uid = 1;
234
+ }
235
+ if (is_numeric($manifest->uid)) {
236
+ $existant = (bool) get_users(['include' => $manifest->uid, 'fields' => 'ID']);
237
+ if ($existant) {
238
+ $user = get_user_by('id', $manifest->uid);
239
+ } else {
240
+ $existant = (bool) get_users(['include' => 1, 'fields' => 'ID']);
241
+ if ($existant) {
242
+ $user = get_user_by('id', 1);
243
+ }
244
+ }
245
+ }
246
+
247
+ if (isset($user) && is_object($user) && property_exists($user, 'ID')) {
248
+ clean_user_cache(get_current_user_id());
249
+ clean_user_cache($user->ID);
250
+ wp_clear_auth_cookie();
251
+ wp_set_current_user($user->ID, $user->user_login);
252
+ wp_set_auth_cookie($user->ID, 1, is_ssl());
253
+ do_action('wp_login', $user->user_login, $user);
254
+ update_user_caches($user);
255
+ }
256
+
257
+ $this->migration->log(__('User should be logged in', 'backup-migration'), 'SUCCESS');
258
+ } else {
259
+ $this->migration->log(__('There is no Database file, omitting...', 'backup-migration'), 'INFO');
260
+ }
261
+
262
+ $this->migration->log(__('Cleaning temporary files...', 'backup-migration'), 'STEP');
263
+ $this->cleanup();
264
+ $this->migration->log(__('Temporary files cleaned', 'backup-migration'), 'SUCCESS');
265
+ $this->migration->log(__('Restore process took: ', 'backup-migration') . (microtime(true) - $start) . 's', 'INFO');
266
+ Logger::log('Site restored...');
267
+
268
+ return true;
269
+ } catch (\Exception $e) {
270
+
271
+ // On this tragedy at least remove tmp files
272
+ $this->migration->log(__('Something bad happened...', 'backup-migration'), 'ERROR');
273
+ $this->migration->log($e->getMessage(), 'ERROR');
274
+ $this->cleanup();
275
+
276
+ return false;
277
+ } catch (\Throwable $e) {
278
+
279
+ // On this tragedy at least remove tmp files
280
+ $this->migration->log(__('Something bad happened...', 'backup-migration'), 'ERROR');
281
+ $this->migration->log($e->getMessage(), 'ERROR');
282
+ $this->cleanup();
283
+
284
+ return false;
285
+ }
286
+ }
287
+ }
includes/htaccess/.htaccess ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # Added by Backup Migration Plugin
3
+
4
+ # Deny all backup and config files
5
+ <Files "*">
6
+
7
+ Require all denied
8
+
9
+ </Files>
10
+
11
+ # Redirect if it's possible to home directory
12
+ <IfModule mod_rewrite.c>
13
+
14
+ RewriteEngine On
15
+ RewriteRule (.*) / [R]
16
+
17
+ </IfModule>
includes/htaccess/.litespeed ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Backup Migration START
2
+ <IfModule Litespeed>
3
+ RewriteEngine On
4
+ RewriteRule .* - [E=noconntimeout:1]
5
+ RewriteRule .* - [E=noabort:1]
6
+ </IfModule>
7
+ # Backup Migration END
includes/htaccess/default.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "STORAGE::DIRECT::URL": "true",
3
+ "STORAGE::LOCAL::PATH": "default",
4
+ "BACKUP:DATABASE": "true",
5
+ "BACKUP:FILES": "true",
6
+ "BACKUP:FILES::PLUGINS": "true",
7
+ "BACKUP:FILES::UPLOADS": "true",
8
+ "BACKUP:FILES::THEMES": "true",
9
+ "BACKUP:FILES::OTHERS": "true",
10
+ "BACKUP:FILES::WP": "false",
11
+ "BACKUP:FILES::FILTER:SIZE": "false",
12
+ "BACKUP:FILES::FILTER:SIZE:IN": "100",
13
+ "BACKUP:FILES::FILTER:NAMES": "true",
14
+ "BACKUP:FILES::FILTER:FPATHS": "false",
15
+ "BACKUP:FILES::FILTER:DPATHS": "false",
16
+ "BACKUP:FILES::FILTER:NAMES:IN": [
17
+ {"txt": "wp-clone", "pos": "1", "whr": "1" },
18
+ {"txt": "backup", "pos": "1", "whr": "1" },
19
+ {"txt": "backup", "pos": "1", "whr": "2" },
20
+ {"txt": "snapshot", "pos": "1", "whr": "1" },
21
+ {"txt": "upgrade", "pos": "2", "whr": "1" },
22
+ {"txt": "mysql.sql", "pos": "3", "whr": "1" },
23
+ {"txt": "debug.log", "pos": "3", "whr": "1" }
24
+ ],
25
+ "BACKUP:FILES::FILTER:FPATHS:IN": [],
26
+ "BACKUP:FILES::FILTER:DPATHS:IN": [],
27
+ "BACKUP:NAME": "BM_Backup_%Y-%m-%d_%H_%i_%s_%hash",
28
+ "OTHER:EMAIL:TITLE": "Backup Migration Plugin",
29
+ "OTHER:EMAIL:NOTIS": true,
30
+ "OTHER:UNINSTALL:CONFIGS": false,
31
+ "OTHER:UNINSTALL:BACKUPS": false,
32
+ "CRON:ENABLED": false,
33
+ "CRON:TYPE": "month",
34
+ "CRON:DAY": "1",
35
+ "CRON:WEEK": "1",
36
+ "CRON:HOUR": "08",
37
+ "CRON:MINUTE": "00",
38
+ "CRON:KEEP": "2"
39
+ }
includes/initializer.php ADDED
@@ -0,0 +1,637 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ // Require classes
12
+ require_once BMI_INCLUDES . '/logger.php';
13
+
14
+ // Alias for classes
15
+ use BMI\Plugin\BMI_Logger as Logger;
16
+ use BMI\Plugin\CRON\BMI_Crons as Crons;
17
+ use BMI\Plugin\Dashboard as Dashboard;
18
+ use BMI\Plugin\Scanner\BMI_BackupsScanner as Backups;
19
+ use BMI\Plugin\Zipper\BMI_Zipper as Zipper;
20
+
21
+ // Uninstallator
22
+ function bmi_uninstall_handler() {
23
+ require_once BMI_ROOT_DIR . '/uninstall.php';
24
+ }
25
+
26
+ /**
27
+ * Backup Migration Main Class
28
+ */
29
+ class Backup_Migration_Plugin {
30
+ public function initialize() {
31
+
32
+ // Handle CRONs
33
+ add_action('bmi_do_backup_right_now', [$this, 'handle_cron_backup']);
34
+ add_action('bmi_handle_cron_check', [$this, 'handle_cron_check']);
35
+ add_action('plugins_loaded', [$this, 'handle_crons']);
36
+
37
+ // Return if CRON time
38
+ if (function_exists('wp_doing_cron') && wp_doing_cron()) {
39
+ return;
40
+ }
41
+
42
+ // POST Logic
43
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
44
+
45
+ // Register AJAX Handler
46
+ add_action('wp_ajax_backup_migration', [$this, 'ajax']);
47
+
48
+ // Stop GET Registration
49
+ return;
50
+ }
51
+
52
+ // File downloading
53
+ add_action('init', [$this, 'handle_downloading']);
54
+
55
+ // Hooks
56
+ register_activation_hook(BMI_ROOT_FILE, [$this, 'activation']);
57
+ register_deactivation_hook(BMI_ROOT_FILE, [$this, 'deactivation']);
58
+ register_uninstall_hook(BMI_ROOT_FILE, 'bmi_uninstall_handler');
59
+
60
+ // Actions
61
+ add_action('admin_init', [$this, 'admin_init_hook']);
62
+ add_action('admin_menu', [$this, 'submenu']);
63
+ add_action('admin_notices', [$this, 'admin_notices']);
64
+
65
+ // Settings action
66
+ add_filter('plugin_action_links_' . plugin_basename(BMI_ROOT_FILE), [$this, 'settings_action']);
67
+
68
+ // Ignore below actions if those true
69
+ if (function_exists('wp_doing_ajax') && wp_doing_ajax()) {
70
+ return;
71
+ }
72
+
73
+ // Styles & scripts
74
+ add_action('admin_head', [$this, 'enqueue_styles']);
75
+ add_action('admin_footer', [$this, 'enqueue_scripts']);
76
+ }
77
+
78
+ public function ajax() {
79
+ if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
80
+ if (isset($_POST['token']) && $_POST['token'] == 'bmi' && isset($_POST['f']) && is_admin()) {
81
+ try {
82
+
83
+ // Extend execution time
84
+ $exectime = intval(ini_get('max_execution_time'));
85
+ if ($exectime < 10800 && $exectime != 0) {
86
+ set_time_limit(10800);
87
+ }
88
+
89
+ // Require AJAX Handler
90
+ require_once BMI_INCLUDES . '/ajax.php';
91
+ $handler = new BMI_Ajax();
92
+ } catch (\Exception $e) {
93
+ Logger::error('POST error:');
94
+ Logger::error($e);
95
+ $this->res(['status' => 'error', 'error' => $e]);
96
+ exit;
97
+ } catch (\Throwable $e) {
98
+ Logger::error('POST error:');
99
+ Logger::error($e);
100
+ $this->res(['status' => 'error', 'error' => $e]);
101
+ exit;
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ public function submenu() {
108
+
109
+ // Menu icon
110
+ $icon_url = $this->get_asset('images', 'logo-min.png');
111
+
112
+ // Main menu slug
113
+ $parentSlug = 'backup-migration';
114
+
115
+ // Content
116
+ $content = [$this, 'settings_page'];
117
+
118
+ // Main menu hook
119
+ add_menu_page('Backup Migration', '<span id="bmi-menu">Backup Migration</span>', 'read', $parentSlug, $content, $icon_url, $position = 98);
120
+
121
+ // Remove default submenu by menu
122
+ remove_submenu_page($parentSlug, $parentSlug);
123
+ }
124
+
125
+ public function settings_action($links) {
126
+ $text = __('Manage', 'backup-migration');
127
+ $links['bmi-settings-link'] = '<a href="' . admin_url('/admin.php?page=backup-migration') . '">' . $text . '</a>';
128
+
129
+ return $links;
130
+ }
131
+
132
+ public function settings_page() {
133
+
134
+ // Set email if does not exist
135
+ if (!Dashboard\bmi_get_config('OTHER:EMAIL')) {
136
+ Dashboard\bmi_set_config('OTHER:EMAIL', get_bloginfo('admin_email'));
137
+ }
138
+
139
+ // Require The HTML
140
+ require_once BMI_INCLUDES . '/dashboard/settings.php';
141
+ }
142
+
143
+ public function admin_init_hook() {
144
+ if (get_option('_bmi_redirect', false)) {
145
+ delete_option('_bmi_redirect', false);
146
+ wp_safe_redirect(admin_url('admin.php?page=backup-migration'));
147
+ }
148
+ }
149
+
150
+ public function admin_notices() {
151
+ if (get_current_screen()->id != 'toplevel_page_backup-migration' && get_option('bmi_display_email_issues', false)) {
152
+ ?>
153
+ <div class="notice notice-warning">
154
+ <p>
155
+ <?php _e('There was an error during automated backup, please', 'backup-migration'); ?>
156
+ <?php echo '<a href="' . admin_url('/admin.php?page=backup-migration') . '">' . __('check that.', 'backup-migration') . '</a>'; ?>
157
+ </p>
158
+ </div>
159
+ <?php
160
+ }
161
+ }
162
+
163
+ public function handle_crons() {
164
+ $time = get_option('bmi_backup_check', 0);
165
+ if ((time() - $time) > 60) {
166
+ update_option('bmi_backup_check', time());
167
+
168
+ if (Dashboard\bmi_get_config('CRON:ENABLED') !== true) {
169
+ return;
170
+ }
171
+ do_action('bmi_handle_cron_check');
172
+ }
173
+ }
174
+
175
+ public function email_error($msg) {
176
+ Logger::log('Displaying some issues about email sending...');
177
+ update_option('bmi_display_email_issues', $msg);
178
+ }
179
+
180
+ public function backup_inproper_time($should_time) {
181
+ Logger::log('Sending notification about backup being late');
182
+ $email = Dashboard\bmi_get_config('OTHER:EMAIL') != false ? Dashboard\bmi_get_config('OTHER:EMAIL') : get_bloginfo('admin_email');
183
+ $subject = Dashboard\bmi_get_config('OTHER:EMAIL:TITLE');
184
+ $message = __("Automatic backup was not on time because there was no traffic on the site.", 'backup-migration') . "\n";
185
+ $message .= __("Backup was made on: ", 'backup-migration') . date('Y-m-d H:i:s') . __(', but should be on: ', 'backup-migration') . date('Y-m-d H:i:s', $should_time);
186
+ $message .= ' ' . __("(server time)", 'backup-migration');
187
+
188
+ Logger::debug($message);
189
+ if (!$this->send_notification_mail($email, $subject, $message)) {
190
+ $issue = __("Couldn't send mail to you, please check server configuration.", 'backup-migration') . '<br>';
191
+ $issue .= '<b>' . __("Message you missed because of this: ", 'backup-migration') . '</b>' . $message;
192
+ $this->email_error($issue);
193
+ }
194
+ }
195
+
196
+ public function handle_cron_check() {
197
+ $now = time();
198
+ if (file_exists(BMI_INCLUDES . '/htaccess/.last')) {
199
+ $last = file_get_contents(BMI_INCLUDES . '/htaccess/.last');
200
+ $last_status = explode('.', $last)[0];
201
+ $last_time = intval(explode('.', $last)[1]);
202
+ } else {
203
+ $last_time = 0;
204
+ $last_status = 0;
205
+ }
206
+
207
+ $plan = intval(file_get_contents(BMI_INCLUDES . '/htaccess/.plan'));
208
+ if ($last_time < $plan && ((time() - $plan) > 55)) {
209
+ if ($last_status !== '0') {
210
+ $this->backup_inproper_time($plan);
211
+ if (!wp_next_scheduled('bmi_do_backup_right_now')) {
212
+ wp_schedule_single_event(time(), 'bmi_do_backup_right_now');
213
+ }
214
+ }
215
+ }
216
+ }
217
+
218
+ public function get_next_cron($curr = false) {
219
+ if ($curr === false) {
220
+ $curr = time();
221
+ }
222
+
223
+ $time = Crons::calculate_date([
224
+ 'type' => Dashboard\bmi_get_config('CRON:TYPE'),
225
+ 'week' => Dashboard\bmi_get_config('CRON:WEEK'),
226
+ 'day' => Dashboard\bmi_get_config('CRON:DAY'),
227
+ 'hour' => Dashboard\bmi_get_config('CRON:HOUR'),
228
+ 'minute' => Dashboard\bmi_get_config('CRON:MINUTE')
229
+ ], $curr);
230
+
231
+ return $time;
232
+ }
233
+
234
+ public function handle_cron_error($e) {
235
+ Logger::error(__("Automatic backup failed at time: ", 'backup-migration') . date('Y-m-d, H:i:s'));
236
+ if (is_object($e) || is_array($e)) {
237
+ Logger::error('Error: ' . $e->getMessage());
238
+ } else {
239
+ Logger::error('Error: ' . $e);
240
+ }
241
+
242
+ $notis = Dashboard\bmi_get_config('OTHER:EMAIL:NOTIS');
243
+ if (in_array($notis, [true, 'true'])) {
244
+ $email = Dashboard\bmi_get_config('OTHER:EMAIL') != false ? Dashboard\bmi_get_config('OTHER:EMAIL') : get_bloginfo('admin_email');
245
+ $subject = Dashboard\bmi_get_config('OTHER:EMAIL:TITLE');
246
+ $message = __("There was an error during automatic backup, please check the logs.", 'backup-migration');
247
+ if (is_string($e)) {
248
+ $message .= "\nError: " . $e;
249
+ }
250
+
251
+ $this->send_notification_mail($email, $subject, $message);
252
+ }
253
+
254
+ @unlink(BMI_BACKUPS . '/.cron');
255
+ }
256
+
257
+ public function send_notification_mail($email, $subject, $message) {
258
+ $email_fail = __("Could not send the email notification about that fail", 'backup-migration');
259
+
260
+ try {
261
+ if (wp_mail($email, $subject, $message)) {
262
+ Logger::info(__("Sent email notification to: ", 'backup-migration') . $email);
263
+
264
+ return true;
265
+ } else {
266
+ Logger::error($email_fail);
267
+ $this->email_error(__("Couldn't send notification via email, please check the email and your server settings.", 'backup-migration'));
268
+
269
+ return false;
270
+ }
271
+ } catch (\Exception $e) {
272
+ Logger::error($email_fail);
273
+ $this->email_error(__("Couldn't send notification via email due to error, please check plugin logs for more details.", 'backup-migration'));
274
+
275
+ return false;
276
+ } catch (\Throwable $e) {
277
+ Logger::error($email_fail);
278
+ $this->email_error(__("Couldn't send notification via email due to error, please check plugin logs for more details.", 'backup-migration'));
279
+
280
+ return false;
281
+ }
282
+ }
283
+
284
+ public function handle_after_cron() {
285
+ require_once BMI_INCLUDES . '/scanner/backups.php';
286
+ $backups = new Backups();
287
+ $list = $backups->getAvailableBackups();
288
+
289
+ $cron_list = [];
290
+ $cron_dates = [];
291
+ foreach ($list as $key => $value) {
292
+ if ($list[$key][6] == true) {
293
+ if ($list[$key][5] == 'unlocked') {
294
+ $cron_list[$list[$key][1]] = $list[$key][0];
295
+ $cron_dates[] = $list[$key][1];
296
+ }
297
+ }
298
+ }
299
+
300
+ usort($cron_dates, function ($a, $b) {
301
+ return (strtotime($a) < strtotime($b)) ? -1 : 1;
302
+ });
303
+
304
+ $cron_dates = array_slice($cron_dates, 0, -(intval(Dashboard\bmi_get_config('CRON:KEEP'))));
305
+ foreach ($cron_dates as $key => $value) {
306
+ $name = $cron_list[$cron_dates[$key]];
307
+ Logger::log(__("Removing backup due to keep rules: ", 'backup-migration') . $name);
308
+ @unlink(BMI_BACKUPS . DIRECTORY_SEPARATOR . $name);
309
+ }
310
+ }
311
+
312
+ public function set_last_cron($status, $time) {
313
+ $file = BMI_INCLUDES . '/htaccess/.last';
314
+ file_put_contents($file, $status . '.' . $time);
315
+ }
316
+
317
+ public function handle_cron_backup() {
318
+
319
+ // Planned time
320
+ $plan = intval(file_get_contents(BMI_INCLUDES . '/htaccess/.plan'));
321
+
322
+ // Check difference
323
+ if ((time() - $plan) > 45) {
324
+ Logger::log('Backup failed to run on proper time, but running now.');
325
+ Logger::log('Planned time: ' . date('Y-m-d H:i:s', $plan));
326
+ $this->backup_inproper_time($plan);
327
+ }
328
+
329
+ // Now
330
+ $now = time();
331
+ $this->set_last_cron('0', $now);
332
+
333
+ // Extend execution time
334
+ $exectime = intval(ini_get('max_execution_time'));
335
+ if ($exectime < 10800 && $exectime != 0) {
336
+ set_time_limit(10800);
337
+ }
338
+
339
+ if (Dashboard\bmi_get_config('CRON:ENABLED') !== true) {
340
+ return;
341
+ }
342
+ Logger::log(__("Automatic backup called at time: ", 'backup-migration') . date('Y-m-d, H:i:s'));
343
+
344
+ try {
345
+ require_once BMI_INCLUDES . '/ajax.php';
346
+ $isBackup = (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) <= 65) ? true : false;
347
+ $isCron = (file_exists(BMI_BACKUPS . '/.cron') && (time() - filemtime(BMI_BACKUPS . '/.cron')) <= 65) ? true : false;
348
+ if ($isCron) {
349
+ return;
350
+ }
351
+
352
+ if ($isBackup) {
353
+ $this->handle_cron_error(__("Could not make the backup: Backup already running, please wait till it complete.", 'backup-migration'));
354
+ $this->set_last_cron('2', $now);
355
+ } else {
356
+ touch(BMI_BACKUPS . '/.cron');
357
+
358
+ $handler = new BMI_Ajax();
359
+ $handler->resetLatestLogs();
360
+ $backup = $handler->prepareAndMakeBackup(true);
361
+
362
+ if ($backup['status'] == 'success') {
363
+ Logger::log(__("Automatic backup successed: ", 'backup-migration') . $backup['filename']);
364
+ $this->handle_after_cron();
365
+ $this->set_last_cron('1', $now);
366
+ } elseif ($backup['status'] == 'msg') {
367
+ $this->handle_cron_error($backup['why']);
368
+ $this->set_last_cron('3', $now);
369
+ } else {
370
+ $this->handle_cron_error(__("Could not make the backup due to internal server error.", 'backup-migration'));
371
+ $this->set_last_cron('4', $now);
372
+ }
373
+ }
374
+ } catch (\Exception $e) {
375
+ $this->handle_cron_error($e);
376
+ $this->set_last_cron('5', $now);
377
+ } catch (\Throwable $e) {
378
+ $this->handle_cron_error($e);
379
+ $this->set_last_cron('5', $now);
380
+ }
381
+
382
+ @unlink(BMI_BACKUPS . '/.cron');
383
+ require_once BMI_INCLUDES . '/cron/handler.php';
384
+ $time = $this->get_next_cron();
385
+
386
+ wp_clear_scheduled_hook('bmi_do_backup_right_now');
387
+ wp_schedule_single_event($time, 'bmi_do_backup_right_now');
388
+
389
+ $file = BMI_INCLUDES . '/htaccess/.plan';
390
+ file_put_contents($file, $time);
391
+ }
392
+
393
+ public function enqueue_scripts() {
394
+
395
+ // Only for BM Settings
396
+ if (get_current_screen()->id != 'toplevel_page_backup-migration') {
397
+ return;
398
+ }
399
+ wp_enqueue_script('backup-migration-script', $this->get_asset('js', 'backup-migration.min.js'), ['jquery'], BMI_VERSION, true);
400
+ }
401
+
402
+ public function enqueue_styles() {
403
+
404
+ // Only for BM Settings
405
+ if (get_current_screen()->id != 'toplevel_page_backup-migration') {
406
+ return;
407
+ }
408
+ wp_enqueue_style('backup-migration-style', $this->get_asset('css', 'bmi-plugin.min.css'), [], BMI_VERSION);
409
+ }
410
+
411
+ public function handle_downloading() {
412
+ $allowed = ['BMI_BACKUP', 'BMI_BACKUP_LOGS', 'PROGRESS_LOGS'];
413
+ $get_bmi = !empty($_GET['backup-migration']) ? sanitize_text_field($_GET['backup-migration']) : false;
414
+ $get_bid = !empty($_GET['backup-id']) ? sanitize_text_field($_GET['backup-id']) : false;
415
+ $get_pid = !empty($_GET['progress-id']) ? sanitize_text_field($_GET['progress-id']) : false;
416
+
417
+ if (isset($get_bmi) && in_array($get_bmi, $allowed)) {
418
+ if (isset($get_bid) && strlen($get_bid) > 0) {
419
+ $type = $get_bmi;
420
+ if ($type == 'BMI_BACKUP') {
421
+ if (Dashboard\bmi_get_config('STORAGE::DIRECT::URL') === 'true' || current_user_can('administrator')) {
422
+ $backupname = $get_bid;
423
+ $file = $this->fixSlashes(BMI_BACKUPS . DIRECTORY_SEPARATOR . $backupname);
424
+
425
+ // Prevent parent directory downloading
426
+ if (file_exists($file) && $this->fixSlashes(dirname($file)) == $this->fixSlashes(BMI_BACKUPS)) {
427
+ header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
428
+ header('Content-Disposition: attachment; filename="' . $backupname . '"');
429
+ header('Content-Type: application/octet-stream');
430
+ header('Content-Length: ' . filesize($file));
431
+ header('Content-Description: File Transfer');
432
+ header('Content-Transfer-Encoding: binary');
433
+ header('Pragma: public');
434
+ header('Expires: 0');
435
+ http_response_code(200);
436
+
437
+ if (ob_get_level()) {
438
+ ob_end_clean();
439
+ }
440
+
441
+ readfile($file);
442
+ exit;
443
+ }
444
+ } else {
445
+ header('HTTP/1.0 423 Locked');
446
+ echo __("Backup download is restricted (allowed for admins only).", 'backup-migration');
447
+ exit;
448
+ }
449
+ } elseif ($type == 'BMI_BACKUP_LOGS') {
450
+ $backupname = $get_bid;
451
+ $file = $this->fixSlashes(BMI_BACKUPS . DIRECTORY_SEPARATOR . $backupname);
452
+
453
+ // Prevent parent directory downloading
454
+ if (file_exists($file) && $this->fixSlashes(dirname($file)) == $this->fixSlashes(BMI_BACKUPS)) {
455
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
456
+
457
+ $zipper = new Zipper();
458
+ $logs = $zipper->getZipFileContentPlain($file, 'bmi_logs_this_backup.log');
459
+ header('Content-Type: text/plain');
460
+
461
+ if ($logs) {
462
+ header('Content-Disposition: attachment; filename="' . substr($backupname, 0, -4) . '.log"');
463
+ http_response_code(200);
464
+ echo $logs;
465
+ exit;
466
+ } else {
467
+ header('HTTP/1.0 404 Not found');
468
+ echo __("There was an error during getting logs, this file is not right log file.", 'backup-migration');
469
+ exit;
470
+ }
471
+ }
472
+ } elseif ($type == 'PROGRESS_LOGS') {
473
+ header('Content-Type: text/plain');
474
+ header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
475
+ http_response_code(200);
476
+ $allowed_progress = ['latest.log', 'latest_progress.log', 'latest_migration_progress.log', 'latest_migration.log', 'complete_logs.log'];
477
+ if (isset($get_pid) && in_array($get_pid, $allowed_progress)) {
478
+ if ($get_pid == 'complete_logs.log') {
479
+ $file = BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'complete_logs.log';
480
+ readfile($file);
481
+ } else {
482
+ $file = dirname(BMI_BACKUPS) . DIRECTORY_SEPARATOR . 'backups' . DIRECTORY_SEPARATOR . $get_pid;
483
+ if (file_exists($file) && (time() - filemtime($file)) < (60 * 5)) {
484
+ readfile($file);
485
+ } else {
486
+ if (file_exists($file) && !(time() - filemtime($file)) < (60 * 5)) {
487
+ echo __("Due to security reasons access to this file is disabled at this moment.", 'backup-migration') . "\n";
488
+ echo __("Human readable: file expired.", 'backup-migration');
489
+ } else {
490
+ echo '';
491
+ }
492
+ }
493
+ }
494
+
495
+ exit;
496
+ }
497
+ }
498
+ }
499
+ }
500
+ }
501
+
502
+ public function activation() {
503
+ Logger::log(__("Activated", 'backup-migration'));
504
+ $this->fixLitespeed();
505
+
506
+ update_option('_bmi_redirect', true);
507
+ }
508
+
509
+ public function deactivation() {
510
+ Logger::log(__("Deactivated", 'backup-migration'));
511
+ $this->revertLitespeed();
512
+ }
513
+
514
+ public static function res($array) {
515
+ echo json_encode(Backup_Migration_Plugin::sanitize($array));
516
+ }
517
+
518
+ public static function sanitize($data = []) {
519
+ $array = [];
520
+
521
+ if (is_array($data) || is_object($data)) {
522
+ foreach ($data as $key => $value) {
523
+ $key = ((is_numeric($key))?intval($key):sanitize_text_field($key));
524
+
525
+ if (is_array($value) || is_object($value)) {
526
+ $array[$key] = Backup_Migration_Plugin::sanitize($value);
527
+ } else {
528
+ $array[$key] = sanitize_text_field($value);
529
+ }
530
+ }
531
+ } elseif (is_string($data)) {
532
+ return sanitize_text_field($data);
533
+ } elseif (is_bool($data)) {
534
+ return $data;
535
+ } elseif (is_null($data)) {
536
+ return 'false';
537
+ } else {
538
+ Logger::log(__("Unknow AJAX Sanitize Type: ", 'backup-migration') . gettype($data));
539
+ wp_die();
540
+ }
541
+
542
+ return $array;
543
+ }
544
+
545
+ public static function fixLitespeed() {
546
+ $litepath = BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . '.litespeed';
547
+ $htpath = ABSPATH . DIRECTORY_SEPARATOR . '.htaccess';
548
+ if (file_exists($htpath)) {
549
+ $litespeed = file_get_contents($litepath);
550
+ $htaccess = file_get_contents($htpath);
551
+ $htaccess = explode("\n", $htaccess);
552
+ $litespeed = explode("\n", $litespeed);
553
+
554
+ $hasAlready = false;
555
+ for ($i = 0; $i < sizeof($htaccess); ++$i) {
556
+ if (strpos($htaccess[$i], 'Backup Migration') !== false) {
557
+ $hasAlready = true;
558
+
559
+ break;
560
+ }
561
+ }
562
+
563
+ if ($hasAlready) {
564
+ return ['status' => 'success'];
565
+ }
566
+ $htaccess[] = '';
567
+ for ($i = 0; $i < sizeof($litespeed); ++$i) {
568
+ $htaccess[] = $litespeed[$i];
569
+ }
570
+
571
+ file_put_contents($htpath, implode("\n", $htaccess));
572
+ } else {
573
+ copy($litepath, $htpath);
574
+ }
575
+
576
+ return ['status' => 'success'];
577
+ }
578
+
579
+ public static function revertLitespeed() {
580
+ $htpath = ABSPATH . DIRECTORY_SEPARATOR . '.htaccess';
581
+ $addline = true;
582
+
583
+ $htaccess = file_get_contents($htpath);
584
+ $htaccess = explode("\n", $htaccess);
585
+ $htFilter = [];
586
+
587
+ for ($i = 0; $i < sizeof($htaccess); ++$i) {
588
+ if (strpos($htaccess[$i], 'Backup Migration START')) {
589
+ $addline = false;
590
+
591
+ continue;
592
+ } elseif (strpos($htaccess[$i], 'Backup Migration END')) {
593
+ $addline = true;
594
+
595
+ continue;
596
+ } else {
597
+ if ($addline == true) {
598
+ $htFilter[] = $htaccess[$i];
599
+ }
600
+ }
601
+ }
602
+
603
+ file_put_contents($htpath, trim(implode("\n", $htFilter)));
604
+
605
+ return ['status' => 'success'];
606
+ }
607
+
608
+ public static function humanSize($bytes) {
609
+ $label = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
610
+ for ($i = 0; $bytes >= 1024 && $i < (count($label) - 1); $bytes /= 1024, $i++);
611
+
612
+ return (round($bytes, 2) . " " . $label[$i]);
613
+ }
614
+
615
+ public static function fixSlashes($str) {
616
+ $str = str_replace('\\\\', DIRECTORY_SEPARATOR, $str);
617
+ $str = str_replace('\\', DIRECTORY_SEPARATOR, $str);
618
+ $str = str_replace('\/', DIRECTORY_SEPARATOR, $str);
619
+ $str = str_replace('/', DIRECTORY_SEPARATOR, $str);
620
+
621
+ if ($str[strlen($str) - 1] == DIRECTORY_SEPARATOR) {
622
+ $str = substr($str, 0, -1);
623
+ }
624
+
625
+ return $str;
626
+ }
627
+
628
+ public static function merge_arrays(&$array1, &$array2) {
629
+ for ($i = 0; $i < sizeof($array2); ++$i) {
630
+ $array1[] = $array2[$i];
631
+ }
632
+ }
633
+
634
+ private function get_asset($base = '', $asset) {
635
+ return BMI_ASSETS . '/' . $base . '/' . $asset;
636
+ }
637
+ }
includes/logger.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ /**
10
+ * Main Plugin Logger
11
+ */
12
+ class BMI_Logger {
13
+
14
+ public static function append($type, $log) {
15
+
16
+ $date = '[' . date('Y-m-d H:i:s') . '] ';
17
+ $file = fopen(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'complete_logs.log', 'a');
18
+ fwrite($file, $date . $type . ' ' . $log . "\n");
19
+ fclose($file);
20
+
21
+ }
22
+
23
+ public static function log($log) {
24
+
25
+ BMI_Logger::append('[LOG]', $log);
26
+
27
+ }
28
+
29
+ public static function error($log) {
30
+
31
+ BMI_Logger::append('[ERROR]', $log);
32
+
33
+ }
34
+
35
+ public static function debug($log) {
36
+
37
+ if (BMI_DEBUG === TRUE) {
38
+ BMI_Logger::append('[DEBUG]', $log);
39
+ }
40
+
41
+ }
42
+
43
+ }
includes/progress/migration.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Progress;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger AS Logger;
8
+
9
+ // Exit on direct access
10
+ if (!defined('ABSPATH')) exit;
11
+
12
+ /**
13
+ * Main File Scanner Logic
14
+ */
15
+ class BMI_MigrationProgress {
16
+
17
+ public function __construct($continue = false) {
18
+
19
+ if (!file_exists(BMI_BACKUPS)) mkdir(BMI_BACKUPS);
20
+
21
+ $this->latest = BMI_BACKUPS . '/latest_migration.log';
22
+ $this->progress = BMI_BACKUPS . '/latest_migration_progress.log';
23
+
24
+ if (file_exists($this->latest) && !$continue) unlink($this->latest);
25
+
26
+ }
27
+
28
+ public function start($muted = false) {
29
+
30
+ $this->muted = $muted;
31
+ $this->file = fopen($this->latest, 'a') or die(__("Unable to open file!", 'backup-migration'));
32
+
33
+ }
34
+
35
+ public function progress($progress = '0') {
36
+
37
+ file_put_contents($this->progress, $progress);
38
+
39
+ }
40
+
41
+ public function log($log = '', $level = 'INFO') {
42
+
43
+ if (!$this->muted)
44
+ fwrite($this->file, '[' . strtoupper($level) . '] [' . date('Y-m-d H:i:s') . '] ' . $log . "\n");
45
+
46
+ }
47
+
48
+ public function end() {
49
+
50
+ fclose($this->file);
51
+
52
+ }
53
+
54
+ }
includes/progress/zip.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Progress;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger AS Logger;
8
+
9
+ // Exit on direct access
10
+ if (!defined('ABSPATH')) exit;
11
+
12
+ /**
13
+ * Main File Scanner Logic
14
+ */
15
+ class BMI_ZipProgress {
16
+
17
+ public function __construct($backup_name, $files = 0, $bytes = 0, $cron = false) {
18
+
19
+ if (!file_exists(BMI_BACKUPS)) mkdir(BMI_BACKUPS);
20
+
21
+ $this->name = $backup_name;
22
+ $this->date = date('Y-m-d H:i:s');
23
+ $this->millis = microtime(true);
24
+ $this->cron = $cron;
25
+ $this->logfilename = substr($backup_name, 0, -4) . '.log';
26
+ $this->latest = BMI_BACKUPS . '/latest.log';
27
+ $this->latest_progress = BMI_BACKUPS . '/latest_progress.log';
28
+ $this->files = $files;
29
+ $this->bytes = $bytes;
30
+
31
+ if (file_exists($this->latest)) @unlink($this->latest);
32
+ if (file_exists($this->latest_progress)) @unlink($this->latest_progress);
33
+
34
+ file_put_contents($this->latest_progress, '0/100');
35
+
36
+ }
37
+
38
+ public function createManifest() {
39
+
40
+ global $table_prefix;
41
+
42
+ $manifest = array(
43
+ 'name' => $this->name,
44
+ 'date' => $this->date,
45
+ 'files' => $this->files,
46
+ 'bytes' => $this->bytes,
47
+ 'cron' => $this->cron,
48
+ 'manifest' => date('Y-m-d H:i:s'),
49
+ 'millis_start' => $this->millis,
50
+ 'millis_end' => microtime(true),
51
+ 'version' => BMI_VERSION,
52
+ 'domain' => parse_url(home_url())['host'],
53
+ 'dbdomain' => get_option('siteurl'),
54
+ 'uid' => get_current_user_id(),
55
+ 'config' => array(
56
+ 'ABSPATH' => ABSPATH,
57
+ 'DB_NAME' => DB_NAME,
58
+ 'DB_USER' => DB_USER,
59
+ 'DB_PASSWORD' => DB_PASSWORD,
60
+ 'DB_HOST' => DB_HOST,
61
+ 'DB_CHARSET' => DB_CHARSET,
62
+ 'DB_COLLATE' => DB_COLLATE,
63
+ 'AUTH_KEY' => AUTH_KEY,
64
+ 'SECURE_AUTH_KEY' => SECURE_AUTH_KEY,
65
+ 'LOGGED_IN_KEY' => LOGGED_IN_KEY,
66
+ 'NONCE_KEY' => NONCE_KEY,
67
+ 'AUTH_SALT' => AUTH_SALT,
68
+ 'SECURE_AUTH_SALT' => SECURE_AUTH_SALT,
69
+ 'LOGGED_IN_SALT' => LOGGED_IN_SALT,
70
+ 'NONCE_SALT' => NONCE_SALT,
71
+ 'WP_DEBUG_LOG' => WP_DEBUG_LOG,
72
+ 'WP_CONTENT_URL' => WP_CONTENT_URL,
73
+ 'WP_CONTENT_DIR' => WP_CONTENT_DIR,
74
+ 'table_prefix' => $table_prefix
75
+ )
76
+ );
77
+
78
+ return json_encode($manifest);
79
+
80
+ }
81
+
82
+ public function start($muted = false) {
83
+
84
+ $this->muted = $muted;
85
+ $this->file = fopen($this->latest, 'a') or die(__("Unable to open file!", 'backup-migration'));
86
+
87
+ }
88
+
89
+ public function log($log = '', $level = 'INFO') {
90
+
91
+ if (!$this->muted)
92
+ fwrite($this->file, '[' . strtoupper($level) . '] [' . date('Y-m-d H:i:s') . '] ' . $log . "\n");
93
+
94
+ }
95
+
96
+ public function progress($progress = '0') {
97
+
98
+ $this->progress = fopen($this->latest_progress, 'w') or die(__("Unable to open file!", 'backup-migration'));
99
+ fwrite($this->progress, $progress);
100
+ fclose($this->progress);
101
+
102
+ }
103
+
104
+ public function end() {
105
+
106
+ fclose($this->file);
107
+
108
+ }
109
+
110
+ }
includes/scanner/backups.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Scanner;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger AS Logger;
8
+ use BMI\Plugin\Zipper\BMI_Zipper AS Zipper;
9
+ use BMI\Plugin\Zipper\PclZip AS PclZip;
10
+ use BMI\Plugin\Zipper\Zip AS Zip;
11
+
12
+ // Exit on direct access
13
+ if (!defined('ABSPATH')) exit;
14
+
15
+ /**
16
+ * Main Backup Scanner Logic
17
+ */
18
+ class BMI_BackupsScanner {
19
+
20
+ public function scanBackupDir($path) {
21
+
22
+ $files = [];
23
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
24
+
25
+ if ($fileInfo->isDot()) continue;
26
+ if ($fileInfo->isFile()) {
27
+ if (in_array($fileInfo->getExtension(), ['zip', 'tar', 'tar.gz', 'gz', 'rar', '7zip'])) {
28
+
29
+ $files[] = array(
30
+ 'filename' => $fileInfo->getFilename(),
31
+ 'path' => $path,
32
+ 'size' => $fileInfo->getSize()
33
+ );
34
+
35
+ }
36
+ }
37
+
38
+ }
39
+
40
+ return $files;
41
+
42
+ }
43
+
44
+ public function getManifestFromZip($zip_path, &$zipper) {
45
+
46
+ // Get manifest content
47
+ $res = array();
48
+ $manifest = $zipper->getZipFileContent($zip_path, 'bmi_backup_manifest.json');
49
+ if ($manifest) {
50
+
51
+ $res[] = $manifest->name;
52
+ $res[] = $manifest->date;
53
+ $res[] = $manifest->files;
54
+ $res[] = $manifest->manifest;
55
+ $res[] = filesize($zip_path);
56
+ $res[] = $zipper->is_locked_zip($zip_path) ? 'locked' : 'unlocked';
57
+ $res[] = $manifest->cron;
58
+
59
+ return $res;
60
+
61
+ } else return false;
62
+
63
+ }
64
+
65
+ public function getAvailableBackups() {
66
+
67
+ // Require Universal Zip Library
68
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
69
+ $zipper = new Zipper();
70
+
71
+ // Scan for manifests
72
+ $manifests = array();
73
+ $backups = array();
74
+
75
+ if (file_exists(BMI_BACKUPS))
76
+ $backups = $this->scanBackupDir(BMI_BACKUPS);
77
+
78
+ for ($i = 0; $i < sizeof($backups); ++$i) {
79
+
80
+ $backup = $backups[$i];
81
+ $manifest = $this->getManifestFromZip($backup['path'] . '/' . $backup['filename'], $zipper);
82
+ if ($manifest) $manifests[$backup['filename']] = $manifest;
83
+
84
+ }
85
+
86
+ return $manifests;
87
+
88
+ }
89
+
90
+ }
includes/scanner/files.php ADDED
@@ -0,0 +1,461 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Scanner;
5
+
6
+ // Use
7
+ use BMI\Plugin\BMI_Logger AS Logger;
8
+ use BMI\Plugin\Zipper\BMI_Zipper AS Zipper;
9
+
10
+ // Exit on direct access
11
+ if (!defined('ABSPATH')) exit;
12
+
13
+ /**
14
+ * Main File Scanner Logic
15
+ */
16
+ class BMI_FileScanner {
17
+
18
+ public static function equalEnd($name, $nsiz, $rsiz, $rule) {
19
+
20
+ if (substr($name, -$rsiz) == $rule) return true;
21
+
22
+ }
23
+
24
+ public static function equalStart($name, $nsiz, $rsiz, $rule) {
25
+
26
+ if (substr($name, 0, $rsiz) == $rule) return true;
27
+
28
+ }
29
+
30
+ public static function equalAnywhere($name, $rule) {
31
+
32
+ if (strpos($name, $rule) !== false) return true;
33
+
34
+ }
35
+
36
+ public static function equalFolder($name, $ignores) {
37
+
38
+ $s = strlen($name);
39
+ for ($i = 0; $i < sizeof($ignores); ++$i) {
40
+
41
+ if ($ignores[$i]['z'] > $s) continue;
42
+ if ($ignores[$i]['w'] == '1') {
43
+
44
+ if (BMI_FileScanner::equalAnywhere($name, $ignores[$i]['s'])) return true;
45
+ else continue;
46
+
47
+ } elseif ($ignores[$i]['w'] == '2') {
48
+
49
+ if (BMI_FileScanner::equalStart($name, $s, $ignores[$i]['z'], $ignores[$i]['s'])) return true;
50
+ else continue;
51
+
52
+ } elseif ($ignores[$i]['w'] == '3') {
53
+
54
+ if (BMI_FileScanner::equalEnd($name, $s, $ignores[$i]['z'], $ignores[$i]['s'])) return true;
55
+ else continue;
56
+
57
+ }
58
+
59
+ }
60
+
61
+ return false;
62
+
63
+ }
64
+
65
+ public static function equalFolderByPath($abs, $path, $ignores) {
66
+
67
+ $alen = strlen($abs);
68
+ $path = substr($path, $alen + 1);
69
+ $paths = explode(DIRECTORY_SEPARATOR, $path);
70
+
71
+ for ($i=0; $i < sizeof($paths); ++$i) {
72
+
73
+ $c = $paths[$i];
74
+ if (BMI_FileScanner::equalFolder($c, $ignores)) {
75
+
76
+ return true;
77
+
78
+ }
79
+
80
+ }
81
+
82
+ return false;
83
+
84
+ }
85
+
86
+ public static function scanDirectory($path) {
87
+
88
+ $files = [];
89
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
90
+
91
+ if ($fileInfo->isDot()) continue;
92
+ if ($fileInfo->isFile()) {
93
+
94
+ $files[] = $fileInfo->getFilename() . DIRECTORY_SEPARATOR . $fileInfo->getSize();
95
+
96
+ } else {
97
+
98
+ $files[] = [];
99
+ $index = sizeof($files) - 1;
100
+ $dirName = $fileInfo->getFilename();
101
+ $newBase = $path . DIRECTORY_SEPARATOR . $dirName;
102
+ $files[$index] = BMI_FileScanner::scanDirectory($newBase);
103
+ array_unshift($files[$index], $dirName);
104
+
105
+ }
106
+
107
+ }
108
+
109
+ return $files;
110
+
111
+ }
112
+
113
+ public static function scanDirectorySizeOnly($path, $bm) {
114
+
115
+ $files = [];
116
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
117
+
118
+ if ($fileInfo->isDot()) continue;
119
+ if ($fileInfo->isFile()) {
120
+
121
+ $files[] = $fileInfo->getSize();
122
+
123
+ } else {
124
+
125
+ $files[] = [];
126
+ $index = sizeof($files) - 1;
127
+ $dirName = $fileInfo->getFilename();
128
+ $newBase = $path . DIRECTORY_SEPARATOR . $dirName;
129
+ if ($newBase == $bm) continue;
130
+ $files[$index] = BMI_FileScanner::scanDirectorySizeOnly($newBase, $bm);
131
+ array_unshift($files[$index], $dirName);
132
+
133
+ }
134
+
135
+ }
136
+
137
+ return $files;
138
+
139
+ }
140
+
141
+ public static function scanDirectorySizeOnlyAndIgnore($path, $ignored = [], $bm) {
142
+
143
+ $files = [];
144
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
145
+
146
+ if ($fileInfo->isDot()) continue;
147
+ if ($fileInfo->isFile()) {
148
+
149
+ $files[] = $fileInfo->getSize();
150
+
151
+ } else {
152
+
153
+ $dirPath = $fileInfo->getPath();
154
+ $dirName = $fileInfo->getFilename();
155
+ if (in_array($dirName, $ignored) || in_array($dirPath, $ignored)) {
156
+ Logger::debug('Dodging ' . $dirName);
157
+ continue;
158
+ }
159
+
160
+ $files[] = [];
161
+ $index = sizeof($files) - 1;
162
+ $newBase = $path . DIRECTORY_SEPARATOR . $dirName;
163
+ if ($newBase == $bm) continue;
164
+ $files[$index] = BMI_FileScanner::scanDirectorySizeOnlyAndIgnoreDirOnly($newBase, $ignored, $bm);
165
+ array_unshift($files[$index], $dirName);
166
+
167
+ }
168
+
169
+ }
170
+
171
+ return $files;
172
+
173
+ }
174
+
175
+ public static function scanDirectorySizeOnlyAndIgnoreDirOnly($path, $ignored = [], $bm) {
176
+
177
+ $files = [];
178
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
179
+
180
+ if ($fileInfo->isDot()) continue;
181
+ if ($fileInfo->isFile()) {
182
+
183
+ $files[] = $fileInfo->getSize();
184
+
185
+ } else {
186
+
187
+ $dirName = $fileInfo->getFilename();
188
+ $dirPath = $fileInfo->getPath();
189
+ if (in_array($dirPath, $ignored)) {
190
+ Logger::debug('Dodging ' . $dirName);
191
+ continue;
192
+ }
193
+
194
+ $files[] = [];
195
+ $index = sizeof($files) - 1;
196
+ $newBase = $path . DIRECTORY_SEPARATOR . $dirName;
197
+ if ($newBase == $bm) continue;
198
+ $files[$index] = BMI_FileScanner::scanDirectorySizeOnlyAndIgnoreDirOnly($newBase, $ignored, $bm);
199
+ array_unshift($files[$index], $dirName);
200
+
201
+ }
202
+
203
+ }
204
+
205
+ return $files;
206
+
207
+ }
208
+
209
+ public static function scanDirectoryNameOnly($path) {
210
+
211
+ $files = [];
212
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
213
+
214
+ if ($fileInfo->isDot()) continue;
215
+ if ($fileInfo->isFile()) {
216
+
217
+ $files[] = $fileInfo->getFilename();
218
+
219
+ } else {
220
+
221
+ $files[] = [];
222
+ $index = sizeof($files) - 1;
223
+ $dirName = $fileInfo->getFilename();
224
+ $newBase = $path . DIRECTORY_SEPARATOR . $dirName;
225
+ $files[$index] = BMI_FileScanner::scanDirectoryNameOnly($newBase);
226
+ array_unshift($files[$index], $dirName);
227
+
228
+ }
229
+
230
+ }
231
+
232
+ return $files;
233
+
234
+ }
235
+
236
+ public static function scanDirectoryNameOnlyAndIgnore($path, $ignored = []) {
237
+
238
+ $files = [];
239
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
240
+
241
+ if ($fileInfo->isDot()) continue;
242
+ if ($fileInfo->isFile()) {
243
+
244
+ $files[] = $fileInfo->getFilename();
245
+
246
+ } else {
247
+
248
+ $dirName = $fileInfo->getFilename();
249
+ if (in_array($dirName, $ignored)) {
250
+ Logger::debug('Dodging ' . $dirName);
251
+ continue;
252
+ }
253
+
254
+ $files[] = [];
255
+ $index = sizeof($files) - 1;
256
+ $newBase = $path . DIRECTORY_SEPARATOR . $dirName;
257
+ $files[$index] = BMI_FileScanner::scanDirectoryNameOnlyAndIgnore($newBase, $ignored);
258
+ array_unshift($files[$index], $dirName);
259
+
260
+ }
261
+
262
+ }
263
+
264
+ return $files;
265
+
266
+ }
267
+
268
+ public static function scanDirectoryNameOnlyAndIgnoreFBC($path, $ignored_folders = [], $ignored_paths = []) {
269
+
270
+ $files = [];
271
+ foreach (new \DirectoryIterator($path) as $fileInfo) {
272
+
273
+ if ($fileInfo->isDot()) continue;
274
+ if ($fileInfo->isFile()) {
275
+
276
+ $files[] = $fileInfo->getFilename() . ',' . $fileInfo->getSize();
277
+
278
+ } else {
279
+
280
+ $dirName = $fileInfo->getFilename();
281
+ if (BMI_FileScanner::equalFolder($dirName, $ignored_folders)) {
282
+ Logger::debug('Dodging folder ' . $dirName);
283
+ continue;
284
+ }
285
+
286
+ $files[] = [];
287
+ $index = sizeof($files) - 1;
288
+ $newBase = $path . DIRECTORY_SEPARATOR . $dirName;
289
+ if (in_array($newBase, $ignored_paths)) {
290
+ Logger::debug('Dodging path ' . $newBase);
291
+ continue;
292
+ }
293
+
294
+ $files[$index] = BMI_FileScanner::scanDirectoryNameOnlyAndIgnoreFBC($newBase, $ignored_folders, $ignored_paths);
295
+ array_unshift($files[$index], $dirName);
296
+
297
+ }
298
+
299
+ }
300
+
301
+ return $files;
302
+
303
+ }
304
+
305
+ public static function getSizeOfFileList($fileList) {
306
+
307
+ $size = 0;
308
+ for ($i = 0; $i < sizeOf($fileList); $i++) {
309
+
310
+ if ($i == 0) continue;
311
+ if (!is_array($fileList[$i])) {
312
+
313
+ $size += intval($fileList[$i]);
314
+
315
+ } else {
316
+
317
+ $size += BMI_FileScanner::getSizeOfFileList($fileList[$i]);
318
+
319
+ }
320
+
321
+ }
322
+ return $size;
323
+
324
+ }
325
+
326
+ public static function getFileFullPaths($base, $fileList) {
327
+
328
+ $paths = []; $merge = [];
329
+ for ($i = 0; $i < sizeOf($fileList); $i++) {
330
+
331
+ if ($i == 0) {
332
+
333
+ $base = $base . DIRECTORY_SEPARATOR . $fileList[$i];
334
+ continue;
335
+
336
+ }
337
+
338
+ if (!is_array($fileList[$i])) {
339
+
340
+ $paths[] = $base . DIRECTORY_SEPARATOR . $fileList[$i];
341
+
342
+ } else {
343
+
344
+ $merge[] = BMI_FileScanner::getFileFullPaths($base, $fileList[$i]);
345
+
346
+ }
347
+
348
+ }
349
+
350
+ $paths = array_merge($paths, ...$merge);
351
+ return $paths;
352
+
353
+ }
354
+
355
+ public static function scanFiles($path, $bm) {
356
+
357
+ // Get TOP Dir name
358
+ $z = explode(DIRECTORY_SEPARATOR, $path);
359
+ $z = $z[sizeof($z) - 1];
360
+
361
+ // Scan Directory
362
+ $x = BMI_FileScanner::scanDirectorySizeOnly($path, $bm);
363
+
364
+ // Push TOP Lever (root) Directory
365
+ array_unshift($x, $z);
366
+
367
+ // Calculate size
368
+ $y = BMI_FileScanner::getSizeOfFileList($x);
369
+
370
+ // Return size in Bytes
371
+ return $y;
372
+
373
+ }
374
+
375
+ public static function scanFilesGetNamesWithIgnore($path, $ignored = []) {
376
+
377
+ // Require Zipper
378
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
379
+
380
+ // Get TOP Dir name
381
+ $z = explode(DIRECTORY_SEPARATOR, $path);
382
+ $z = $z[sizeof($z) - 1];
383
+
384
+ // Scan Directory
385
+ $x = BMI_FileScanner::scanDirectoryNameOnlyAndIgnore($path, $ignored);
386
+
387
+ // Push TOP Lever (root) Directory
388
+ array_unshift($x, $z);
389
+
390
+ // Parse Output to Array of Full Paths
391
+ $path = substr($path, 0, -(strlen($z) + 1));
392
+ $y = BMI_FileScanner::getFileFullPaths($path, $x);
393
+
394
+ // Return array of Full Paths
395
+ return $y;
396
+
397
+ }
398
+
399
+ public static function scanFilesGetNamesWithIgnoreFBC($path, $ignored = [], $ignored_paths = []) {
400
+
401
+ // Require Zipper
402
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
403
+
404
+ // Exclude paths which won't exist in current $path
405
+ $max = sizeof($ignored_paths);
406
+ for ($i = 0; $i < $max; ++$i) {
407
+
408
+ if (strpos($ignored_paths[$i], $path) === false) {
409
+ array_splice($ignored_paths, $i, 1);
410
+ $max--; $i--;
411
+ }
412
+
413
+ }
414
+
415
+ // Get TOP Dir name
416
+ $z = explode(DIRECTORY_SEPARATOR, $path);
417
+ $z = $z[sizeof($z) - 1];
418
+
419
+ // Scan Directory
420
+ $x = BMI_FileScanner::scanDirectoryNameOnlyAndIgnoreFBC($path, $ignored, $ignored_paths);
421
+
422
+ // Push TOP Lever (root) Directory
423
+ array_unshift($x, $z);
424
+
425
+ // Parse Output to Array of Full Paths
426
+ $path = substr($path, 0, -(strlen($z) + 1));
427
+ $y = BMI_FileScanner::getFileFullPaths($path, $x);
428
+
429
+ // Return array of Full Paths
430
+ return $y;
431
+
432
+ }
433
+
434
+ public static function scanFilesWithIgnore($path, $ignored, $bm) {
435
+
436
+ // Get TOP Dir name
437
+ $z = explode(DIRECTORY_SEPARATOR, $path);
438
+ $z = $z[sizeof($z) - 1];
439
+
440
+ // Scan Directory
441
+ $x = BMI_FileScanner::scanDirectorySizeOnlyAndIgnore($path, $ignored, $bm);
442
+
443
+ // Push TOP Lever (root) Directory
444
+ array_unshift($x, $z);
445
+
446
+ // Calculate size
447
+ $y = BMI_FileScanner::getSizeOfFileList($x);
448
+
449
+ // Return size in Bytes
450
+ return $y;
451
+
452
+ }
453
+
454
+ public static function fileTooLarge($size, $max) {
455
+
456
+ if ($size > $max) return true;
457
+ else return false;
458
+
459
+ }
460
+
461
+ }
includes/uploader/chunks.php ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Uploader;
5
+
6
+ // Use
7
+ use BMI\Plugin\Zipper\BMI_Zipper AS Zipper;
8
+
9
+ // Exit on direct access
10
+ if (!defined('ABSPATH')) exit;
11
+
12
+ header('Content-Type: application/json; charset=utf-8');
13
+ $file = isset($_FILES['file_data']) ? $_FILES['file_data'] : null;
14
+ $name = isset($this->post['file_name']) ? $this->post['file_name'] : null;
15
+ $total = isset($this->post['file_total']) ? $this->post['file_total'] : 0;
16
+ $index = isset($this->post['file_index']) ? $this->post['file_index'] : 0;
17
+ $size = isset($this->post['file_size']) ? $this->post['file_size'] : null;
18
+ $taskStart = isset($this->post['taskStart']) ? $this->post['taskStart'] : 123;
19
+
20
+ $info = pathinfo($name);
21
+ $ext = isset($info['extension']) ? $info['extension'] : '';
22
+
23
+ $beforename = $name;
24
+ $name = substr($name, 0, -(strlen($ext) + 1));
25
+ $noextname = $name;
26
+ $file_name = $name . '-' . $taskStart . '.' . $ext;
27
+ $newfile = BMI_BACKUPS . '/' . $file_name;
28
+ $afterfile = BMI_BACKUPS . '/' . $beforename;
29
+ $url = plugin_dir_url(BMI_ROOT_FILE) . '/backups' . '/' . $file_name;
30
+
31
+ function jsonMsg($status, $message, $url = '', $afterfile = false) {
32
+
33
+ if ($status === 2) {
34
+
35
+ require_once BMI_INCLUDES . '/zipper/zipping.php';
36
+ $zipper = new Zipper();
37
+ $manifest = $zipper->getZipFileContent($afterfile, 'bmi_backup_manifest.json');
38
+
39
+ if ($manifest === false) {
40
+ @unlink($afterfile);
41
+ $status = 5;
42
+ }
43
+
44
+ }
45
+
46
+ $arr['status'] = $status;
47
+ $arr['message'] = $message;
48
+ $arr['url'] = $url;
49
+
50
+ echo json_encode($arr);
51
+ die();
52
+
53
+ }
54
+
55
+ if (!$file || !$name) {
56
+
57
+ jsonMsg(0, 'Missing file?');
58
+
59
+ }
60
+
61
+ $imgarr = array('zip');
62
+ if (!in_array(strtolower($ext), $imgarr)) {
63
+
64
+ jsonMsg(0, 'Invalid file type');
65
+
66
+ }
67
+
68
+ function completed($newfile, $noextname, $ext) {
69
+
70
+ chmod($newfile, 0755);
71
+
72
+ $i = 1;
73
+ $curr_fil = BMI_BACKUPS . '/' . $noextname . '.' . $ext;
74
+ while (file_exists($curr_fil)) {
75
+ $i++;
76
+ $curr_fil = BMI_BACKUPS . '/' . $noextname . '-' . $i . '.' . $ext;
77
+ }
78
+ rename($newfile, $curr_fil);
79
+
80
+ }
81
+
82
+ clearstatcache($afterfile);
83
+ if (is_file($afterfile) && ($size == filesize($afterfile))) {
84
+
85
+ jsonMsg(3, 'File already exists.', $url);
86
+
87
+ }
88
+
89
+ if ($file['error'] == 0) {
90
+
91
+ if (!file_exists($newfile)) {
92
+
93
+ if (!move_uploaded_file($file['tmp_name'], $newfile)) {
94
+
95
+ jsonMsg(0, 'Cannot move file');
96
+
97
+ }
98
+
99
+ if ($index == $total) {
100
+
101
+ completed($newfile, $noextname, $ext);
102
+ jsonMsg(2, 'Upload completed', $url, $afterfile);
103
+
104
+ }
105
+
106
+ jsonMsg(1, 'Uploading');
107
+
108
+ }
109
+
110
+ if ($index <= $total) {
111
+
112
+ $content = file_get_contents($file['tmp_name']);
113
+ if (!file_put_contents($newfile, $content, FILE_APPEND)) {
114
+
115
+ jsonMsg(0, 'Cannot write file');
116
+
117
+ }
118
+
119
+ if ($index == $total) {
120
+
121
+ completed($newfile, $noextname, $ext);
122
+ jsonMsg(2, 'Upload completed', $url, $afterfile);
123
+
124
+ }
125
+
126
+ jsonMsg(1, 'Uploading');
127
+ }
128
+
129
+ } else {
130
+
131
+ jsonMsg(0, 'No file uploaded');
132
+
133
+ }
includes/zipper/src/zip.php ADDED
@@ -0,0 +1,500 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace BMI\Plugin\Zipper;
4
+
5
+ use BMI\Plugin\Backup_Migration_Plugin as BMP;
6
+ use BMI\Plugin\BMI_Logger as Logger;
7
+ use BMI\Plugin\Dashboard as Dashboard;
8
+ use BMI\Plugin\Database\BMI_Database as Database;
9
+ use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
10
+
11
+ class Zip {
12
+ protected $lib;
13
+ protected $org_files;
14
+ protected $new_file_path;
15
+ protected $new_file_name;
16
+ protected $backupname;
17
+ protected $zip_progress;
18
+
19
+ protected $extr_file;
20
+ protected $extr_dirc;
21
+ protected $start_zip;
22
+
23
+ public function __construct() {
24
+ $this->lib = 0;
25
+ $this->extr_file = 0;
26
+ $this->new_file_path = 0;
27
+ $this->org_files = [];
28
+ }
29
+
30
+ public function zip_start($file_path, $files = [], $name = '', &$zip_progress = null, $start = null) {
31
+
32
+ // save the new file path
33
+ $this->new_file_path = $file_path;
34
+ $this->backupname = $name;
35
+ $this->zip_progress = $zip_progress;
36
+ $this->start_zip = $start;
37
+
38
+ if (sizeof($files) > 0) {
39
+ $this->org_files = $files;
40
+ }
41
+
42
+ // Some php installations doesn't have the ZipArchive
43
+ // So in this case we'll use another lib called PclZip
44
+ if (class_exists("ZipArchive")) {
45
+ $this->lib = 1;
46
+ } else {
47
+ $this->lib = 2;
48
+ }
49
+
50
+ return true;
51
+ }
52
+
53
+ public function return_bytes($val) {
54
+ $val = trim($val);
55
+ $last = strtolower($val[strlen($val) - 1]);
56
+ $val = substr($val, 0, -1);
57
+
58
+ switch ($last) {
59
+ // The 'G' modifier is available since PHP 5.1.0
60
+ case 'g':
61
+ $val *= 1024;
62
+ // no break
63
+ case 'm':
64
+ $val *= 1024;
65
+ // no break
66
+ case 'k':
67
+ $val *= 1024;
68
+ }
69
+
70
+ return $val;
71
+ }
72
+
73
+ public function zip_failed($error) {
74
+ Logger::error(__("There was an error during backup (packing)...", 'backup-migration'));
75
+ Logger::error($error);
76
+
77
+ if ($this->zip_progress != null) {
78
+ $this->zip_progress->log(__("Issues during backup (packing)...", 'backup-migration'), 'ERROR');
79
+ $this->zip_progress->log($error, 'ERROR');
80
+ }
81
+ }
82
+
83
+ public function restore_failed($error) {
84
+ Logger::error(__("There was an error during restore process (extracting)...", 'backup-migration'));
85
+ Logger::error($error);
86
+
87
+ if ($this->zip_progress != null) {
88
+ $this->zip_progress->log(__("Issues during restore process (extracting)...", 'backup-migration'), 'ERROR');
89
+ $this->zip_progress->log($error, 'ERROR');
90
+ }
91
+ }
92
+
93
+ public function zip_add($in) {
94
+
95
+ // Just to make sure.. if the user haven't called the earlier method
96
+ if ($this->lib === 0 || $this->new_file_path === 0) {
97
+ throw new \Exception("PHP-ZIP: must call zip_start before zip_add");
98
+ }
99
+
100
+ // Push file
101
+ array_push($this->org_files, $in);
102
+
103
+ //
104
+ return true;
105
+ }
106
+
107
+ public function zip_end($force_lib = false) {
108
+
109
+ // Try to set limit
110
+ $this->zip_progress->log(__("Smart memory calculation...", 'backup-migration'), 'STEP');
111
+ if ((intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024) < 256) {
112
+ @ini_set('memory_limit', '256M');
113
+ }
114
+
115
+ $memory_limit = (intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024);
116
+ $this->zip_progress->log(str_replace('%s', $memory_limit, __("There is %s MBs of memory to use", 'backup-migration')), 'INFO');
117
+ $safe_limit = intval($memory_limit / 4);
118
+ $this->zip_progress->log(str_replace('%s', $safe_limit, __("Setting the safe limit to %s MB", 'backup-migration')), 'SUCCESS');
119
+
120
+ $abs = BMP::fixSlashes(ABSPATH) . DIRECTORY_SEPARATOR;
121
+
122
+ $dbbackupname = 'bmi_database_backup.sql';
123
+ $database_file = BMP::fixSlashes(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . $dbbackupname);
124
+ $database_file_dir = BMP::fixSlashes((dirname($database_file))) . DIRECTORY_SEPARATOR;
125
+
126
+ if (Dashboard\bmi_get_config('BACKUP:DATABASE') == 'true') {
127
+
128
+ // Require Database Manager
129
+ require_once BMI_INCLUDES . DIRECTORY_SEPARATOR . 'database' . DIRECTORY_SEPARATOR . 'manager.php';
130
+
131
+ // Get database dump
132
+ $this->zip_progress->log(__("Making database backup", 'backup-migration'), 'STEP');
133
+ $this->zip_progress->log(__("Iterating database...", 'backup-migration'), 'INFO');
134
+ $databaser = new Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
135
+ $databaser->exportDatabase($dbbackupname);
136
+ $this->zip_progress->log(__("Database backup finished", 'backup-migration'), 'SUCCESS');
137
+ } else {
138
+ $this->zip_progress->log(__("Omitting database backup (due to settings)...", 'backup-migration'), 'WARN');
139
+ $database_file = false;
140
+ }
141
+
142
+ // force usage of specific lib (for testing purposes)
143
+ if ($force_lib === 2) {
144
+ $this->lib = 2;
145
+ } elseif ($force_lib === 1) {
146
+ $this->lib = 1;
147
+ }
148
+
149
+ // just to make sure.. if the user haven't called the earlier method
150
+ if ($this->lib === 0 || $this->new_file_path === 0) {
151
+ throw new \Exception('PHP-ZIP: zip_start and zip_add haven\'t been called yet');
152
+ }
153
+
154
+ // All files
155
+ $max = sizeof($this->org_files);
156
+ $this->zip_progress->log(__("Making archive", 'backup-migration'), 'STEP');
157
+ $this->zip_progress->log(__("Compressing...", 'backup-migration'), 'INFO');
158
+
159
+ // using zipArchive class
160
+ if ($this->lib === 1) {
161
+
162
+ // Verbose
163
+ $this->zip_progress->log(__("Using Zlib to create Backup", 'backup-migration'));
164
+
165
+ $lib = new \ZipArchive();
166
+ if (!$lib->open($this->new_file_path, \ZIPARCHIVE::CREATE)) {
167
+ throw new \Exception('PHP-ZIP: Permission Denied or zlib can\'t be found');
168
+ }
169
+
170
+ // Add each file
171
+ for ($i = 0; $i < $max; $i++) {
172
+ $file = $this->org_files[$i];
173
+ $zippath = substr($file, strlen($abs));
174
+ $lib->addFile($file, 'wordpress' . DIRECTORY_SEPARATOR . $zippath);
175
+
176
+ if ($i % 100 === 0) {
177
+ if (file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.abort')) {
178
+ break;
179
+ }
180
+ $this->zip_progress->progress($i + 1 . '/' . $max);
181
+ }
182
+
183
+ if (($i + 1) % 5000 === 0 || $i == 0) {
184
+ $this->zip_progress->log((__("Milestone: ", 'backup-migration') . ($i + 1) . '/' . $max), 'info');
185
+ }
186
+ }
187
+
188
+ if (file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.abort')) {
189
+
190
+ // close the archive
191
+ $lib->close();
192
+ } else {
193
+ $this->zip_progress->log((__("Milestone: ", 'backup-migration') . $max . '/' . $max), 'info');
194
+ $this->zip_progress->log(__("Compressed ", 'backup-migration') . $max . __(" files", 'backup-migration'), 'SUCCESS');
195
+
196
+ // Log time of ZIP Process
197
+ $this->zip_progress->log(__("Archiving of ", 'backup-migration') . $max . __(" files took: ", 'backup-migration') . (microtime(true) - $this->start_zip) . 's');
198
+
199
+ $this->zip_progress->log(__("Finalizing backup", 'backup-migration'), 'STEP');
200
+ $this->zip_progress->log(__("Adding manifest...", 'backup-migration'), 'INFO');
201
+ $this->zip_progress->log(__("Closing files and archives", 'backup-migration'), 'STEP');
202
+
203
+ $this->zip_progress->end();
204
+ $logs = file_get_contents(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'latest.log');
205
+ $this->zip_progress->start(true);
206
+
207
+ if ($database_file !== false) {
208
+ $lib->addFile($database_file, 'bmi_database_backup.sql');
209
+ }
210
+
211
+ $lib->addFromString('bmi_backup_manifest.json', $this->zip_progress->createManifest());
212
+ $lib->addFromString('bmi_logs_this_backup.log', $logs);
213
+ $this->zip_progress->progress($max . '/' . $max);
214
+
215
+ // close the archive
216
+ $lib->close();
217
+ }
218
+ }
219
+
220
+ // using PclZip
221
+ if ($this->lib === 2) {
222
+
223
+ // Verbose
224
+ $this->zip_progress->log(__("Using PclZip to create Backup (forced)", 'backup-migration'));
225
+
226
+ // require the lib
227
+ if (!class_exists('PclZip')) {
228
+ if (!defined('PCLZIP_TEMPORARY_DIR')) {
229
+ $bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
230
+ if (!file_exists($bmi_tmp_dir)) {
231
+ @mkdir($bmi_tmp_dir, 0775, true);
232
+ }
233
+ define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
234
+ }
235
+ require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
236
+ }
237
+ $common = $this->org_files;
238
+
239
+ if (!$lib = new \PclZip($this->new_file_path)) {
240
+ throw new \Exception('PHP-ZIP: Permission Denied or zlib can\'t be found');
241
+ }
242
+
243
+ try {
244
+ $chunks = array_chunk($this->org_files, 500);
245
+ $chunkslen = sizeof($chunks);
246
+ $sizeoflast = sizeof($chunks[$chunkslen - 1]);
247
+ if ($chunkslen > 1 && $sizeoflast == 1) {
248
+ $buffer = array_slice($chunks[$chunkslen - 2], -1);
249
+ $chunks[$chunkslen - 2] = array_slice($chunks[$chunkslen - 2], 0, -1);
250
+ $chunks[$chunkslen - 1][] = $buffer[0];
251
+ }
252
+
253
+ for ($i = 0; $i < $chunkslen; ++$i) {
254
+
255
+ // Abort if user wants it (check every 100 files)
256
+ if (file_exists(BMI_BACKUPS . '/.abort')) {
257
+ break;
258
+ }
259
+
260
+ $chunk = $chunks[$i];
261
+ $back = $lib->add($chunk, PCLZIP_OPT_REMOVE_PATH, $abs, PCLZIP_OPT_ADD_PATH, 'wordpress' . DIRECTORY_SEPARATOR, PCLZIP_OPT_TEMP_FILE_THRESHOLD, $safe_limit);
262
+ if ($back == 0) {
263
+ $this->zip_failed($lib->errorInfo(true));
264
+
265
+ return false;
266
+ }
267
+
268
+ $curfile = (($i * 500) + 500);
269
+ $this->zip_progress->progress($curfile . '/' . $max);
270
+ if ($curfile % 5000 === 0) {
271
+ $this->zip_progress->log(__("Milestone: ", 'backup-migration') . ($curfile . '/' . $max), 'info');
272
+ }
273
+ }
274
+ } catch (\Exception $e) {
275
+ $this->zip_failed($e->getMessage());
276
+
277
+ return false;
278
+ } catch (\Throwable $e) {
279
+ $this->zip_failed($e->getMessage());
280
+
281
+ return false;
282
+ }
283
+
284
+ if (file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.abort')) {
285
+ @unlink($database_file_dir . 'bmi_backup_manifest.json');
286
+ @unlink($database_file_dir . 'bmi_logs_this_backup.log');
287
+ } else {
288
+
289
+ // End
290
+ $this->zip_progress->log(__("Milestone: ", 'backup-migration') . ($max . '/' . $max), 'info');
291
+ $this->zip_progress->log(__("Compressed ", 'backup-migration') . $max . __(" files", 'backup-migration'), 'SUCCESS');
292
+
293
+ // Log time of ZIP Process
294
+ $this->zip_progress->log(__("Archiving of ", 'backup-migration') . $max . __(" files took: ", 'backup-migration') . (microtime(true) - $this->start_zip) . 's');
295
+
296
+ $this->zip_progress->log(__("Finalizing backup", 'backup-migration'), 'STEP');
297
+ $this->zip_progress->log(__("Adding manifest...", 'backup-migration'), 'INFO');
298
+ $this->zip_progress->log(__("Closing files and archives", 'backup-migration'), 'STEP');
299
+
300
+ $this->zip_progress->end();
301
+
302
+ file_put_contents($database_file_dir . 'bmi_backup_manifest.json', $this->zip_progress->createManifest());
303
+ file_put_contents($database_file_dir . 'bmi_logs_this_backup.log', file_get_contents(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'latest.log'));
304
+
305
+ $this->zip_progress->start(true);
306
+
307
+ $files = [$database_file_dir . 'bmi_backup_manifest.json', $database_file_dir . 'bmi_logs_this_backup.log'];
308
+ if ($database_file !== false) {
309
+ $files[] = $database_file;
310
+ }
311
+ $lib->add($files, PCLZIP_OPT_REMOVE_PATH, $database_file_dir);
312
+
313
+ @unlink($database_file_dir . 'bmi_backup_manifest.json');
314
+ @unlink($database_file_dir . 'bmi_logs_this_backup.log');
315
+
316
+ $this->zip_progress->progress($max . '/' . $max);
317
+ }
318
+ }
319
+
320
+ @unlink($database_file);
321
+ if (!file_exists($this->new_file_path)) {
322
+ throw new \Exception('PHP-ZIP: After doing the zipping file can not be found');
323
+ }
324
+ if (filesize($this->new_file_path) === 0) {
325
+ throw new \Exception('PHP-ZIP: After doing the zipping file size is still 0 bytes');
326
+ }
327
+
328
+ // empty the array
329
+ $this->org_files = [];
330
+
331
+ return true;
332
+ }
333
+
334
+ public function zip_files($files, $to) {
335
+ $this->zip_start($to);
336
+ $this->zip_add($files);
337
+
338
+ return $this->zip_end();
339
+ }
340
+
341
+ public function unzip_file($file_path, $target_dir = null, &$zip_progress = null) {
342
+
343
+ // Progress
344
+ $this->zip_progress = $zip_progress;
345
+
346
+ // if it doesn't exist
347
+ if (!file_exists($file_path)) {
348
+ throw new \Exception("PHP-ZIP: File doesn't Exist");
349
+ }
350
+
351
+ // check mimetype
352
+ $_FILEINFO = finfo_open(FILEINFO_MIME_TYPE);
353
+ $file_mime_type = finfo_file($_FILEINFO, $file_path);
354
+ if (!array_search($file_mime_type, [
355
+ 'application/x-zip',
356
+ 'application/zip',
357
+ 'application/x-zip-compressed',
358
+ 'application/s-compressed',
359
+ 'multipart/x-zip']
360
+ )) {
361
+ throw new \Exception("PHP-ZIP: File type is not ZIP");
362
+ }
363
+
364
+
365
+ $this->extr_file = $file_path;
366
+
367
+ // if (class_exists("ZipArchive")) $this->lib = 1;
368
+ // else $this->lib = 2;
369
+ $this->lib = 2;
370
+
371
+ if ($target_dir !== null) {
372
+ return $this->unzip_to($target_dir);
373
+ } else {
374
+ return true;
375
+ }
376
+ }
377
+
378
+ public function unzip_to($target_dir) {
379
+
380
+ // validations -- start //
381
+ if ($this->lib === 0 && $this->extr_file === 0) {
382
+ throw new \Exception("PHP-ZIP: unzip_file hasn't been called");
383
+ }
384
+ // it exists, but it's not a directory
385
+ if (file_exists($target_dir) && (!is_dir($target_dir))) {
386
+ throw new \Exception("PHP-ZIP: Target directory exists as a file not a directory");
387
+ }
388
+ // it doesn't exist
389
+ if (!file_exists($target_dir)) {
390
+ if (!mkdir($target_dir)) {
391
+ throw new \Exception("PHP-ZIP: Directory not found, and unable to create it");
392
+ }
393
+ }
394
+ // validations -- end //
395
+
396
+ // Target Directory
397
+ $this->extr_dirc = $target_dir;
398
+
399
+ // Smart memory -- start //
400
+ if ($this->zip_progress != null) {
401
+ $this->zip_progress->log(__("Smart memory calculation...", 'backup-migration'), 'STEP');
402
+ }
403
+
404
+ if ((intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024) < 256) {
405
+ @ini_set('memory_limit', '256M');
406
+ }
407
+
408
+ $memory_limit = (intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024);
409
+ if ($this->zip_progress != null) {
410
+ $this->zip_progress->log(str_replace('%s', $memory_limit, __("There is %s MBs of memory to use", 'backup-migration')), 'INFO');
411
+ }
412
+
413
+ $safe_limit = intval($memory_limit / 4);
414
+
415
+ if ($this->zip_progress != null) {
416
+ $this->zip_progress->log(str_replace('%s', $safe_limit, __("Setting the safe limit to %s MB", 'backup-migration')), 'SUCCESS');
417
+ }
418
+ // Smart memory -- end //
419
+
420
+ // Extract msg
421
+ $this->zip_progress->log(__('Extracting files (this process can take some time)...', 'backup_migration'), 'STEP');
422
+
423
+ // Force PCL Zip
424
+ $this->lib = 2;
425
+
426
+ // extract using ZipArchive
427
+ // if($this->lib === 1) {
428
+ // $lib = new \ZipArchive;
429
+ // if(!$lib->open($this->extr_file)) throw new \Exception("PHP-ZIP: Unable to open the zip file");
430
+ // if(!$lib->extractTo($this->extr_dirc)) throw new \Exception("PHP-ZIP: Unable to extract files");
431
+ // $lib->close();
432
+ // }
433
+
434
+ // extarct using PclZip
435
+ if ($this->lib === 2) {
436
+ if (!class_exists('PclZip')) {
437
+ if (!defined('PCLZIP_TEMPORARY_DIR')) {
438
+ $bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
439
+ if (!file_exists($bmi_tmp_dir)) {
440
+ @mkdir($bmi_tmp_dir, 0775, true);
441
+ }
442
+ define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
443
+ }
444
+ require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
445
+ }
446
+ $lib = new \PclZip($this->extr_file);
447
+ $restor = $lib->extract(PCLZIP_OPT_PATH, $this->extr_dirc, PCLZIP_OPT_TEMP_FILE_THRESHOLD, $safe_limit);
448
+ if ($restor == 0) {
449
+ $this->restore_failed($lib->errorInfo(true));
450
+
451
+ return false;
452
+ }
453
+ }
454
+
455
+ return true;
456
+ }
457
+
458
+ private function dir_to_assoc_arr(DirectoryIterator $dir) {
459
+ $data = [];
460
+ foreach ($dir as $node) {
461
+ if ($node->isDir() && !$node->isDot()) {
462
+ $data[$node->getFilename()] = $this->dir_to_assoc_arr(new DirectoryIterator($node->getPathname()));
463
+ } elseif ($node->isFile()) {
464
+ $data[] = $node->getFilename();
465
+ }
466
+ }
467
+
468
+ return $data;
469
+ }
470
+
471
+ private function path() {
472
+ return join(DIRECTORY_SEPARATOR, func_get_args());
473
+ }
474
+
475
+ private function commonPath($files, $remove = true) {
476
+ foreach ($files as $index => $filesStr) {
477
+ $files[$index] = explode(DIRECTORY_SEPARATOR, $filesStr);
478
+ }
479
+ $toDiff = $files;
480
+ foreach ($toDiff as $arr_i => $arr) {
481
+ foreach ($arr as $name_i => $name) {
482
+ $toDiff[$arr_i][$name_i] = $name . "___" . $name_i;
483
+ }
484
+ }
485
+ $diff = call_user_func_array("array_diff", $toDiff);
486
+ reset($diff);
487
+ $i = key($diff) - 1;
488
+ if ($remove) {
489
+ foreach ($files as $index => $arr) {
490
+ $files[$index] = implode(DIRECTORY_SEPARATOR, array_slice($files[$index], $i));
491
+ }
492
+ } else {
493
+ foreach ($files as $index => $arr) {
494
+ $files[$index] = implode(DIRECTORY_SEPARATOR, array_slice($files[$index], 0, $i));
495
+ }
496
+ }
497
+
498
+ return $files;
499
+ }
500
+ }
includes/zipper/zipping.php ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Zipper;
5
+
6
+ // Use
7
+ use BMI\Plugin\Backup_Migration_Plugin as BMP;
8
+ use BMI\Plugin\BMI_Logger as Logger;
9
+ use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
10
+
11
+ // Exit on direct access
12
+ if (!defined('ABSPATH')) {
13
+ exit;
14
+ }
15
+
16
+ /**
17
+ * BMI_Zipper
18
+ */
19
+ class BMI_Zipper {
20
+ public function makeZIP($files, $output, $name, &$zip_progress) {
21
+
22
+ // Verbose
23
+ Logger::log(__("Creating backup ", 'backup-migration'));
24
+ Logger::log(__("Found ", 'backup-migration') . sizeof($files) . __(" files to backup.", 'backup-migration'));
25
+
26
+ // Require Universal Zip Library
27
+ require_once BMI_INCLUDES . '/zipper/src/zip.php';
28
+
29
+ // Start microtime for ZIP Process
30
+ $start = microtime(true);
31
+
32
+ // Logs
33
+ $zip_progress->log(__("Preparing map of files...", 'backup-migration'), 'step');
34
+
35
+ // Try to catch error
36
+ try {
37
+
38
+ // Create new ZIP
39
+ $zip = new Zip();
40
+ $zip->zip_start($output, $files, $name, $zip_progress, $start);
41
+
42
+ // Logs
43
+ $zip_progress->log(__("Files prepared.", 'backup-migration'), 'success');
44
+ $zip_progress->log(__("Starting compression process...", 'backup-migration'), 'info');
45
+
46
+ // Close ZIP and Save
47
+ $lala = $zip->zip_end(2);
48
+ if (!$lala) {
49
+ $zip_progress->log(__("Removing files backup...", 'backup-migration'), 'error');
50
+
51
+ return false;
52
+ }
53
+
54
+ return true;
55
+ } catch (\Throwable $e) {
56
+
57
+ // Error print
58
+ $zip_progress->log(__("Reverting backup, removing file...", 'backup-migration'), 'step');
59
+ $zip_progress->log(__("There was an error during backup...", 'backup-migration'), 'error');
60
+ $zip_progress->log($e->getMessage(), 'error');
61
+
62
+ return false;
63
+ } catch (\Exception $e) {
64
+
65
+ // Error print
66
+ $zip_progress->log(__("Reverting backup, removing file...", 'backup-migration'), 'step');
67
+ $zip_progress->log(__("There was an error during backup...", 'backup-migration'), 'error');
68
+ $zip_progress->log($e->getMessage(), 'error');
69
+
70
+ return false;
71
+ }
72
+
73
+ return true;
74
+ }
75
+
76
+ public function getZipFileContent($zipname, $filename) {
77
+ if (class_exists('ZipArchive')) {
78
+ $zip = new \ZipArchive();
79
+
80
+ if ($zip->open($zipname) === true) {
81
+ if ($content = $zip->getFromName($filename)) {
82
+ return json_decode($content);
83
+ } else {
84
+ return false;
85
+ }
86
+ } else {
87
+ return false;
88
+ }
89
+ } else {
90
+ if (!class_exists('PclZip')) {
91
+ if (!defined('PCLZIP_TEMPORARY_DIR')) {
92
+ $bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
93
+ if (!file_exists($bmi_tmp_dir)) {
94
+ @mkdir($bmi_tmp_dir, 0775, true);
95
+ }
96
+ define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
97
+ }
98
+ require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
99
+ }
100
+ $lib = new \PclZip($zipname);
101
+
102
+ $content = $lib->extract(PCLZIP_OPT_BY_NAME, $filename, PCLZIP_OPT_EXTRACT_AS_STRING);
103
+ if (sizeof($content) > 0) {
104
+ return json_decode($content[0]['content']);
105
+ } else {
106
+ return false;
107
+ }
108
+ }
109
+ }
110
+
111
+ public function getZipFileContentPlain($zipname, $filename) {
112
+ if (class_exists('ZipArchive')) {
113
+ $zip = new \ZipArchive();
114
+
115
+ if ($zip->open($zipname) === true) {
116
+ if ($content = $zip->getFromName($filename)) {
117
+ return $content;
118
+ } else {
119
+ return false;
120
+ }
121
+ } else {
122
+ return false;
123
+ }
124
+ } else {
125
+ if (!class_exists('PclZip')) {
126
+ if (!defined('PCLZIP_TEMPORARY_DIR')) {
127
+ $bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
128
+ if (!file_exists($bmi_tmp_dir)) {
129
+ @mkdir($bmi_tmp_dir, 0775, true);
130
+ }
131
+ define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
132
+ }
133
+ require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
134
+ }
135
+ $lib = new \PclZip($zipname);
136
+
137
+ $content = $lib->extract(PCLZIP_OPT_BY_NAME, $filename, PCLZIP_OPT_EXTRACT_AS_STRING);
138
+ if (sizeof($content) > 0) {
139
+ return $content[0]['content'];
140
+ } else {
141
+ return false;
142
+ }
143
+ }
144
+ }
145
+
146
+ public function lock_zip($zippath, $unlock = false) {
147
+
148
+ // Require Universal Zip Library
149
+ require_once BMI_INCLUDES . '/zipper/src/zip.php';
150
+
151
+ try {
152
+
153
+ // Path to lock file
154
+ $filename = '.lock';
155
+
156
+ // Load lib
157
+ if (!class_exists('PclZip')) {
158
+ if (!defined('PCLZIP_TEMPORARY_DIR')) {
159
+ $bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
160
+ if (!file_exists($bmi_tmp_dir)) {
161
+ @mkdir($bmi_tmp_dir, 0775, true);
162
+ }
163
+ define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
164
+ }
165
+ require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
166
+ }
167
+ $lib = new \PclZip($zippath);
168
+
169
+ // Unlocking case
170
+ if ($unlock) {
171
+ if ($this->is_locked_zip($zippath)) {
172
+ $lib->delete(PCLZIP_OPT_BY_NAME, $filename);
173
+ } else {
174
+ return true;
175
+ }
176
+ } else {
177
+ if (!$this->is_locked_zip($zippath)) {
178
+
179
+ // Locking case
180
+ $content = json_encode(['locked' => 'true']);
181
+ $lib->add([[PCLZIP_ATT_FILE_NAME => $filename, PCLZIP_ATT_FILE_CONTENT => $content]]);
182
+ }
183
+ }
184
+
185
+ return true;
186
+ } catch (\Exception $e) {
187
+ Logger::error($e);
188
+
189
+ return false;
190
+ } catch (\Throwable $e) {
191
+ Logger::error($e);
192
+
193
+ return false;
194
+ }
195
+ }
196
+
197
+ public function is_locked_zip($zippath) {
198
+ $lock = $this->getZipFileContent($zippath, '.lock');
199
+ if ($lock) {
200
+ if ($lock->locked == 'true') {
201
+ return true;
202
+ } else {
203
+ return false;
204
+ }
205
+ } else {
206
+ return false;
207
+ }
208
+ }
209
+ }
readme.txt ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Backup Migration ===
2
+ Contributors: Migrate
3
+ Tags: Backup, Migration, Restore, Clone, Duplicate
4
+ Requires at least: 4.6
5
+ Tested up to: 5.5.3
6
+ Stable tag: 1.0.4
7
+ License: GPLv3
8
+ Requires PHP: 5.6
9
+
10
+ Create backups quickly
11
+
12
+ == Description ==
13
+
14
+ Creating a backup of your site has never been easier!
15
+
16
+ Simply install the plugin, click on "Create backup now" - done.
17
+
18
+ You can also schedule backups, e.g. define that a backup should be taken automatically every week (or every day/month).
19
+
20
+ Use a wide choice of configuration options:
21
+ - Define exactly which files / databases should be in the backup, which not
22
+ - Define where the backup will be stored (as of now, only local option is available, but we'll expand this soon)
23
+ - Define what name your backup should have, in which instances you should receive a notification email, and much more
24
+
25
+ This plugin is also ideal if you want to migrate your site to another host.
26
+
27
+ If any questions come up, please ask us in the [Support Forum](https://wordpress.org/support/plugin/backup-backup) - we're always happy to help!
28
+
29
+ = 1.0.4 =
30
+ * Initial release
31
+
32
+ == Upgrade Notice ==
33
+
34
+ = 1.0.4 =
35
+ Initial release
uninstall.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Namespace
4
+ namespace BMI\Plugin\Uninstaller;
5
+
6
+ // Exit on direct access
7
+ if (!defined('ABSPATH')) exit;
8
+
9
+ // Get config
10
+ $dir = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR;
11
+ $config = $dir . 'config.json';
12
+ if (file_exists($config)) {
13
+ $config = json_decode(file_get_contents($config));
14
+ if (json_last_error() == JSON_ERROR_NONE) {
15
+
16
+ if (isset($config->{'OTHER:UNINSTALL:BACKUPS'})) {
17
+ if ($config->{'OTHER:UNINSTALL:BACKUPS'} === 'true' || $config->{'OTHER:UNINSTALL:BACKUPS'} === true) {
18
+ if (isset($config->{'STORAGE::LOCAL::PATH'})) {
19
+ if ($config->{'STORAGE::LOCAL::PATH'} == 'default') {
20
+ $backups = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR . 'backups';
21
+ } else {
22
+ $backups = $config->{'STORAGE::LOCAL::PATH'} . DIRECTORY_SEPARATOR . 'backups';
23
+ }
24
+
25
+ if (file_exists($backups) && is_dir($backups)) {
26
+
27
+ $files = scandir($backups);
28
+ for ($i = 0; $i < sizeof($files); ++$i) {
29
+
30
+ $file = $backups . DIRECTORY_SEPARATOR . $files[$i];
31
+ if (is_file($file) && !in_array($files[$i], ['.', '..'])) {
32
+ @unlink($file);
33
+ }
34
+
35
+ }
36
+
37
+ $files = scandir($backups);
38
+ if (sizeof($files) <= 2) rmdir($backups);
39
+
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ if (isset($config->{'OTHER:UNINSTALL:CONFIGS'})) {
46
+ if ($config->{'OTHER:UNINSTALL:CONFIGS'} === 'true' || $config->{'OTHER:UNINSTALL:CONFIGS'} === true) {
47
+
48
+ $files = scandir($dir);
49
+ for ($i = 0; $i < sizeof($files); ++$i) {
50
+
51
+ $file = $dir . DIRECTORY_SEPARATOR . $files[$i];
52
+ if (is_file($file) && !in_array($files[$i], ['.', '..'])) {
53
+ @unlink($file);
54
+ }
55
+
56
+ }
57
+
58
+ $files = scandir($dir);
59
+ if (sizeof($files) <= 2) rmdir($dir);
60
+
61
+ }
62
+ }
63
+
64
+ }
65
+ }