403Webshell
Server IP : 146.59.209.152  /  Your IP : 216.73.216.46
Web Server : Apache
System : Linux webm005.cluster131.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
User : infrafs ( 43850)
PHP Version : 8.2.29
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/i/n/f/infrafs/INFRABIKEIT/wp-content/plugins/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/i/n/f/infrafs/INFRABIKEIT/wp-content/plugins/ns-cloner-site-copier.zip
PKW�1\gHrrcss/ns-cloner.css.mapnu�[���{"version":3,"sourceRoot":"","sources":["ns-cloner.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAEF;AAAA;EAEE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAEF;EAEE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;;;AAGJ;EACE;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;IAAI;;EAA2B;IAAM;;;AAGvC;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;EACA;;;AAIA;EACE;;;AAIJ;AAAA;AAAA;AAIA;AACA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;IACE;IACA;IACA;IACA;;;AAIJ;EACE;IACE;IACA;;;AAIJ;EACE;IACE;;;EAEF;IACE;;;EAEF;IACE;;;AAKJ;EACE;IACE;;;EAEF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;EAEF;IACE;IACA;;;EAEF;IACE;;;EAEF;IACE;IACA;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AACF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;AAGI;EACE;EACA;;AAEF;EACE;;;AAKJ;EACE;;AAEF;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;;AAGJ;EACE;;AACA;EACE","file":"ns-cloner.css"}PKW�1\>د�n`n`css/ns-cloner.cssnu�[���@charset "UTF-8";
/**
 *  Layout
 */
.ns-cloner-wrapper {
  width: 100%;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

.ns-cloner-form {
  margin-bottom: 40px;
  -webkit-box-flex: 1;
  -ms-flex: 1;
  flex: 1;
  padding: 0 15px;
}

.ns-cloner-sidebar {
  width: 350px;
  padding: 0 30px 0 15px;
}

/**
 *  Header
 */
.ns-cloner-header {
  padding: 30px 40px;
  background: #1f1f1f url(../images/bg-texture.png);
  margin: 0 0 30px -20px;
}

.ns-cloner-header a {
  text-decoration: none;
}

.ns-cloner-header h1,
.ns-cloner-header span {
  display: inline-block;
  position: relative;
  left: 25px;
  bottom: 35px;
  color: #ab8718;
  font-size: 24px;
  font-weight: 400;
}

.ns-cloner-header span {
  color: white;
  font-size: 28px;
  margin-right: 25px;
  bottom: 36px;
}

.ns-cloner-header-pro {
  float: right;
  padding-top: 2px;
  text-align: center;
  line-height: 1.4em;
  border-left: solid 1px #303030;
  padding-left: 36px;
}

.ns-cloner-header-pro strong {
  display: block;
  color: #ccc;
  font-weight: 300;
  font-size: 17px;
}

.ns-cloner-header-pro a {
  display: inline-block;
  margin: 10px auto;
  font-size: 13px;
  padding: 10px 32px 12px !important;
  height: 18px !important;
  border-radius: 2px !important;
}

.ns-cloner-header-pro a:hover {
  color: #ddd;
  box-shadow: none !important;
}

/**
 *  Section boxes + sidebar widgets
 */
.ns-cloner-collapse-all,
.ns-cloner-expand-all {
  font-size: 11px !important;
  padding: 3px 8px !important;
  margin-top: -4px;
  cursor: pointer;
  border: solid #393939 1px;
  margin-left: 4px;
  background: #303030;
  border-radius: 2px;
  color: #ddd;
  float: right;
}

.ns-cloner-collapse-all small,
.ns-cloner-expand-all small {
  padding: 0 3px;
}

.ns-cloner-collapse-all:hover,
.ns-cloner-expand-all:hover {
  -webkit-box-shadow: inset 1px 1px 5px rgba(0, 0, 0, 0.3);
  box-shadow: inset 1px 1px 5px rgba(0, 0, 0, 0.3);
}

.ns-cloner-section,
.ns-cloner-sidebar .ns-side-widget {
  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1);
  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1);
  border-radius: 2px;
  margin: 0 0 20px;
  background: #f8f8f8;
}

.ns-cloner-section-header {
  cursor: pointer;
}

.ns-cloner-section-header {
  margin: 0;
  padding: 20px 25px;
  height: 1.2em;
  font-size: 16px;
  color: white;
  border: solid 1px #333;
  border-radius: 2px 2px 0 0;
  background-color: #1f1f1f;
  font-weight: 400;
}

#ns-cloner-section-modes .ns-cloner-section-header {
  cursor: default;
}

.ns-cloner-section-header h4 {
  float: left;
  margin: 0;
  font-weight: normal;
}

.ns-cloner-section-collapse {
  cursor: pointer;
}

.ns-cloner-section-collapse::before {
  content: " ";
  display: block;
  float: right;
  border-style: solid;
  border-width: 6px 4px;
  border-color: transparent transparent white;
  margin: 0;
  cursor: pointer;
  -webkit-transition: all 0.25s;
  -o-transition: all 0.25s;
  transition: all 0.25s;
}

.ns-cloner-section.closed .ns-cloner-section-collapse::before {
  margin-top: 0.4em;
  -webkit-transform: rotate(180deg);
  -ms-transform: rotate(180deg);
  transform: rotate(180deg);
}

/**
 *  Section contents / children
 */
.ns-cloner-section-content {
  padding: 20px 25px 25px;
  background: #f8f8f8;
  height: auto;
  -webkit-transition: all 0.25s;
  -o-transition: all 0.25s;
  transition: all 0.25s;
  border: solid 1px #fff;
  border-radius: 0 0 4px 4px;
  margin-top: -1px;
  position: relative;
}

.ns-cloner-section.closed .ns-cloner-section-content {
  height: 0;
  padding: 0 25px;
  border: 0;
  overflow: hidden;
}

.ns-cloner-section-content *:focus {
  -webkit-box-shadow: none !important;
  box-shadow: none !important;
  border-color: #ddd !important;
}

.ns-cloner-section-content > *:first-child,
.ns-cloner-section-content > *:first-child > *:first-child {
  margin-top: 0 !important;
}

.ns-cloner-section-content > *:last-child,
.ns-cloner-section-content > *:last-child > *:last-child {
  margin-bottom: 0 !important;
}

.ns-cloner-section-content h5 {
  font-size: 1.1em;
  margin: 0 0 0.7em;
}

.ns-cloner-section-content label + h5,
.ns-cloner-section-content input + h5,
.ns-cloner-section-content .description + h5,
.ns-cloner-section-content .ns-cloner-input-group + h5 {
  margin-top: 0.7em;
}

.ns-cloner-section-content h5 label {
  margin-top: 0;
}

.ns-cloner-section-content p {
  padding: 0.4em 0;
  margin: 0;
  border: 0;
}

.ns-cloner-section-content .description,
.ns-cloner-mode-description p {
  font-style: italic;
}

.ns-cloner-section-content .description + .description {
  padding-top: 0 !important;
}

.ns-cloner-section-content label {
  display: block;
  padding: 0.25em;
  margin-top: 0.5em;
  font-weight: 500;
  clear: both;
}

.ns-cloner-section-content input[type=text],
.ns-cloner-section-content select,
.ns-cloner-section-content textarea {
  padding: 0.5em 1em;
  margin: 0;
  height: auto;
  width: 100%;
  border-radius: 0;
  border-color: #bbb;
}

.ns-cloner-section-content strong {
  color: #be9719;
}

.ns-cloner-section-content table {
  width: 100%;
  border: solid 1px #eee;
  margin-bottom: 0.5em;
}

.ns-cloner-section-content th {
  padding: 10px;
  border-bottom: solid 1px #eee;
  text-align: left;
}

.ns-cloner-section-content th.date-col {
  width: 15em;
}

.ns-cloner-section-content th.action-col {
  width: 8em;
  text-align: center;
}

.ns-cloner-section-content td {
  padding: 5px 10px;
  border-bottom: solid 1px #eee;
}

.ns-cloner-section-content tr:last-child td {
  border-bottom: 0;
}

.ns-cloner-section-content td .button {
  display: block;
  margin: 0 auto;
  text-align: center;
  position: relative;
}

.ns-cloner-section-content td .button.working:after {
  content: url(../images/loading.gif);
  display: block;
  position: absolute;
  top: 3px;
  right: -25px;
}

/**
 *  Input groups
 */
.ns-cloner-section-content .ns-cloner-input-group {
  display: flex;
  max-width: 100%;
}

.ns-cloner-section-content .ns-cloner-input-group label {
  background-color: #eaeaea;
  padding: 0.5em 1em;
  border: solid 1px #ccc;
  position: relative;
  display: inline-block;
  bottom: 0;
  left: 1px;
  height: 35px;
  box-sizing: border-box;
  color: #777;
  margin: 0;
}

.ns-cloner-section-content .ns-cloner-input-group input {
  flex: 1;
  height: 35px;
}

.ns-cloner-section-content .ns-cloner-input-group input + label {
  left: -2px;
}

.ns-cloner-section-content .ns-cloner-input-group > *:first-child {
  border-radius: 2px 0 0 2px;
}

.ns-cloner-section-content .ns-cloner-input-group > *:last-child {
  border-radius: 0 2px 2px 0;
}

.ns-cloner-section-content .ns-cloner-input-group + .ns-cloner-input-group {
  margin-top: -1px;
}

/**
 * Checkbox groups
 */
.ns-cloner-multi-checkbox-wrapper {
  border: solid 1px #ddd;
  border-radius: 2px;
  background: #fff;
  padding: 1em 1.4em;
  overflow: auto;
  min-height: 6em;
  max-height: 12em;
  margin: 1em 0;
}

.ns-cloner-multi-checkbox-wrapper.loading {
  opacity: 0.75;
  background: url(../images/spinner.gif) no-repeat center center;
}

.ns-cloner-multi-checkbox-wrapper label {
  margin-top: 0.35em;
  font-weight: normal;
}

.ns-cloner-multi-checkbox-wrapper .description {
  font-size: 0.9em;
  color: #999;
}

/**
 *  Chosen (select elements)
 */
.ns-cloner-section .chosen-container {
  margin-bottom: 0.5em !important;
}

.ns-cloner-section .chosen-single {
  padding: 5px 12px !important;
  height: 36px !important;
  border-color: #ccc !important;
  border-radius: 2px !important;
  background: white !important;
}

.ns-cloner-section .chosen-single b {
  background-position: 0 7px !important;
}

.ns-cloner-section .chosen-choices {
  border-color: #ccc !important;
}

.ns-cloner-section .chosen-choices .search-field {
  padding: 5px 5px 2px !important;
}

.ns-cloner-section .chosen-choices .search-choice {
  padding: 8px 22px 8px 10px !important;
}

.ns-cloner-section .chosen-choices .search-choice-close {
  top: 10px !important;
  right: 5px !important;
}

.ns-cloner-section .chosen-container .chosen-results li {
  padding: 6px 8px !important;
}

.ns-cloner-section .chosen-container .chosen-results li.highlighted {
  background: #ab8718 !important;
}

/**
 *  Repeaters
 */
.ns-repeater li {
  display: flex !important;
}

C .ns-repeater li.invisible {
  visibility: hidden;
  height: 0;
  overflow: hidden;
  margin: 0;
}

.ns-repeater input[type=text] {
  display: block;
  flex: 1;
  margin-right: -2px;
  height: 35px;
}

.ns-repeater .chosen-container {
  width: 100%;
  flex-basis: 30%;
  position: relative;
  margin: 0 10px 0 15px;
  bottom: 1px;
}

.ns-repeater-add {
  margin: -0.35em 0 0.7em 0 !important;
}

.ns-repeater-remove {
  background-color: #eaeaea;
  padding: 8px 8px;
  border: solid 1px #ccc;
  position: relative;
  display: inline-block;
  bottom: 0;
  left: 1px;
  height: 35px;
  box-sizing: border-box;
  color: #777;
  margin: 0;
  cursor: pointer;
}

.ns-repeater-remove:after {
  content: "";
  font-size: 18px;
  font-family: "dashicons";
}

/**
 *  Inline validation
 */
span.ns-cloner-validating-spinner, .ns-cloner-loader-icon {
  margin-top: -30px;
  display: inline-block;
  float: right;
}
span.ns-cloner-validating-spinner:before, .ns-cloner-loader-icon:before {
  content: url(../images/loading.gif);
  padding: 0 0.5em;
  display: inline-block;
  position: relative;
  top: 3px;
  font-size: 18px;
  font-family: dashicons;
}
span.ns-cloner-validating-spinner.valid:before, .ns-cloner-loader-icon.valid:before {
  content: "";
  color: #558855;
}
span.ns-cloner-validating-spinner:first-child, .ns-cloner-loader-icon:first-child {
  float: none;
}

.ns-cloner-loader-icon {
  float: none;
}

.ns-cloner-section-content .ns-cloner-input-group .ns-cloner-validating-spinner {
  padding-top: 5px;
  margin-top: 0;
}

/**
 * 	Sidebar
 */
.ns-cloner-sidebar .ns-side-widget {
  border: solid 1px #ddd;
  text-align: center;
}

.ns-cloner-sidebar .ns-side-widget h5 {
  margin: 0;
  padding: 12px 25px;
  height: 1.2em;
  font-size: 14px;
  color: white;
  border: solid 1px #444;
  border-radius: 2px 2px 0 0;
  background-color: #4d4d4d;
  font-weight: 400;
}

.ns-cloner-sidebar .ns-side-widget h5 a {
  color: #ab8718;
  text-decoration: none;
}

.ns-cloner-sidebar .ns-side-widget-content {
  padding: 15px;
  background: #f8f8f8;
}

.ns-side-widget-content p {
  padding: 0;
  margin: 0 0 10px;
}

.ns-side-widget-content p:last-child {
  margin-bottom: 0;
}

.ns-featured-widget .ns-side-widget-content {
  padding: 0;
}

.ns-random-widget .ns-side-widget-content {
  padding: 30px;
}

.ns-links-widget .ns-side-widget-content {
  text-align: left;
}

.ns-subscribe-widget form > * {
  text-align: center;
}

.ns-subscribe-widget div#ns-subscribe-form > form button {
  background: #ab8718 !important;
  font-size: 13px;
  border-radius: 2px !important;
  text-transform: uppercase;
}

/**
 * 	Clone button + bar
 */
.ns-cloner-button-wrapper {
  padding: 15px 20px;
  position: fixed;
  left: 160px;
  bottom: 0;
  right: 0;
  background: #1f1f1f;
  z-index: 8999;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

body.folded .ns-cloner-button-wrapper {
  left: 36px;
}

.ns-cloner-button-steps {
  margin: 10px 10px 0;
  font-size: 18px;
  position: relative;
  height: 48px;
  overflow: hidden;
  z-index: 1;
  -webkit-box-flex: 1;
  -ms-flex: 1;
  flex: 1;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

.ns-cloner-button-steps:before {
  content: "";
  border-bottom: dotted 2px #555;
  height: 21px;
  position: absolute;
  width: calc( 100% - 10px );
  left: 0;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  top: 0;
}

.ns-cloner-button-steps:after {
  content: " ";
  display: inline-block;
  border-style: solid;
  border-color: transparent transparent transparent #555;
  border-width: 6px 8px;
  position: absolute;
  top: 50%;
  right: 0;
  margin-top: -10px;
}

.ns-cloner-button-steps > span {
  background: #1f1f1f;
  -webkit-box-shadow: 0 0 20px #202020;
  box-shadow: 0 0 20px #202020;
  color: #555;
  text-transform: uppercase;
  margin-right: 25px;
  padding: 10px 15px;
  display: inline-block;
  white-space: nowrap;
  text-align: center;
  -webkit-transition: all ease-in-out 0.75s;
  -o-transition: all ease-in-out 0.75s;
  transition: all ease-in-out 0.75s;
  cursor: pointer;
  position: relative;
}

.ns-cloner-button-steps > span.seen {
  color: white;
}

.ns-cloner-button-steps > span:before,
.ns-cloner-button-steps > span:before {
  content: "";
  font-family: dashicons;
  position: absolute;
  left: 50%;
  bottom: -1px;
  margin-left: -5px;
  opacity: 0;
  -webkit-transition: opacity ease-in-out 0.75s;
  -o-transition: opacity ease-in-out 0.75s;
  transition: opacity ease-in-out 0.75s;
}

.ns-cloner-button-steps > span.invalid {
  color: #c85340;
}

.ns-cloner-button-steps > span.invalid:before {
  content: "";
  color: #c85340;
  opacity: 1;
}

.ns-cloner-button-steps > span:after {
  content: " ";
  display: inline-block;
  border-style: solid;
  border-color: transparent transparent transparent #555;
  border-width: 6px 8px;
  position: absolute;
  top: 50%;
  right: -33px;
  margin-top: -10px;
}

.ns-cloner-button-steps > span:last-child:after {
  display: none;
}

.ns-cloner-button {
  float: right;
  background: #ab8718;
  padding: 16px 48px;
  margin-right: 10px;
  color: white;
  text-transform: uppercase;
  font-size: 18px;
  cursor: pointer;
  border: 0;
  outline: 0 !important;
  border-radius: 2px;
  -webkit-transition: all ease-out 0.25s;
  -o-transition: all ease-out 0.25s;
  transition: all ease-out 0.25s;
  position: relative;
  z-index: 1;
}

.ns-cloner-button:hover {
  -webkit-transform: scale(1.05);
  -ms-transform: scale(1.05);
  transform: scale(1.05);
  background: #be9719;
}

.ns-cloner-button.working {
  background-image: url(../images/gold-loading.gif);
  background-repeat: no-repeat;
  background-position: right 20px center;
  opacity: 0.5;
  cursor: default;
}

.ns-cloner-button.working:hover {
  -webkit-transform: none;
  -ms-transform: none;
  transform: none;
  background-color: #ab8718;
}

.ns-cloner-scroll-progress {
  background: #ab8718;
  position: absolute;
  left: 0;
  bottom: 0;
  height: 5px;
  -webkit-transition: width ease-in-out 0.75s;
  -o-transition: width ease-in-out 0.75s;
  transition: width ease-in-out 0.75s;
}

.ns-cloner-disclaimer {
  padding: 0.7em 0.35em 1.4em 0.35em;
}

.ns-cloner-disclaimer strong {
  color: orangered;
}

/**
 *  Progress modal
 */
.ns-cloner-processes-modal {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 9999;
  background-color: rgba(0, 0, 0, 0.7);
}

.ns-cloner-processes-modal-wrapper {
  max-width: 1024px;
  width: 90%;
  position: absolute;
  top: 10%;
  bottom: 10%;
  left: 50%;
  padding: 40px 60px;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  z-index: 9999;
  background-color: #f3f3f3;
  -webkit-transform: translateX(-50%);
  -ms-transform: translateX(-50%);
  transform: translateX(-50%);
  overflow-y: scroll;
}

.ns-cloner-processes-done {
  display: none;
}

.ns-modal-head {
  margin-bottom: 30px;
}

.ns-process-wrapper {
  display: block;
  padding: 5px 30px 30px 30px;
  margin-bottom: 15px;
  background: #fff;
}

.ns-modal-body {
  margin-bottom: 10px;
}

.ns-modal-refresh,
.ns-modal-cancel,
.ns-modal-close {
  margin-top: -10px;
  margin-left: 15px;
  cursor: pointer;
  float: right;
  color: #fff;
  outline: none;
  background-color: #555;
  padding: 10px 20px 12px;
  text-transform: uppercase;
  border-radius: 2px;
  text-decoration: none;
  text-align: center;
  border: 0;
  -webkit-box-shadow: none;
  box-shadow: none;
  height: auto;
  line-height: 1;
}

.ns-modal-cancel {
  background-color: #ddd;
  color: #555;
}

.ns-cloner-progress-bar {
  border: 1px solid #ab8718;
  height: 30px;
  background-color: #fff;
  border-radius: 2px;
  position: relative;
}

.ns-cloner-progress-bar-inner {
  background-color: #ab8718;
  width: 0;
  max-width: 100%;
  height: 32px;
  margin-top: -1px;
  -webkit-transition: all 2s ease-in-out;
  -o-transition: all 2s ease-in-out;
  transition: all 2s ease-in-out;
  background-size: 30px 30px;
  background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
  animation: animate-stripes 3s linear infinite;
}

.ns-percents {
  font-size: 14px;
  line-height: 30px;
  font-weight: 500;
  text-align: center;
  color: #fff;
  position: absolute;
  top: -10px;
  width: 50px;
  height: 50px;
  z-index: 9999;
  background: #ab8718;
  left: 50%;
  margin-left: -20px;
  border-radius: 50%;
  padding-top: 9px;
  box-sizing: border-box;
}

.ns-cloner-progress-info {
  padding-top: 8px;
}

.ns-cloner-progress-items {
  display: flex;
  margin-top: 20px;
}

.ns-cloner-progress-items > div {
  flex: 1;
  text-align: center;
  font-size: 18px;
  padding: 40px;
  background: #f8f8f8;
  color: #aaa;
  border-right: solid 1px #ddd;
}

.ns-cloner-progress-items > div:last-child {
  border-right: 0;
}

.ns-cloner-progress-items em {
  font-style: normal;
  font-size: 22px;
  color: #333;
}

.ns-cloner-progress-items small {
  display: block;
  text-transform: uppercase;
  padding: 8px;
  color: #ab8718;
  font-size: 16px;
}

.ns-cloner-loading-center {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -10px 0 0 -10px;
}

@keyframes animate-stripes {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: 60px 0;
  }
}
/**
 * 	Report after cloning
 */
.ns-cloner-report {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.45);
  z-index: 300000;
}

.ns-cloner-report-content {
  width: 50%;
  background: white;
  max-height: 75%;
  overflow: auto;
  position: relative;
  left: 20%;
  top: 32px;
  padding: 3% 5% 5%;
  border-radius: 0 0 0.7em 0.7em;
}

.ns-cloner-report-content h5 {
  font-weight: bold;
  font-size: 1.4em;
  margin-top: 0;
}

.ns-cloner-report-item {
  clear: both;
  padding: 0.7em;
  overflow: hidden;
}

.ns-cloner-report-item:nth-child(odd) {
  background: #eee;
}

.ns-cloner-report-item-label {
  float: left;
  width: 20%;
  min-width: 10em;
  font-weight: bold;
}

/**
 * 	Copy logs box before going to support
 */
.ns-cloner-extra-modal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.45);
  z-index: 300000;
  display: none;
}

.ns-cloner-extra-modal-content {
  background: white;
  width: 30%;
  padding: 1.5em 2.5%;
  top: 10vh;
  left: 35%;
  position: absolute;
  border-radius: 2px;
  max-height: 70vh;
  box-sizing: border-box;
  overflow: auto;
}

.ns-cloner-extra-modal-content p {
  margin-bottom: 1.2em !important;
}

.ns-cloner-extra-modal-content textarea {
  width: 100%;
  white-space: nowrap;
  height: 8em;
  font-size: 12px;
  padding: 1em;
  font-family: monospace;
}

/**
 * 	Utility classes
 */
.ns-cloner-small {
  font-size: 0.75em;
}

.ns-cloner-text-center {
  text-align: center;
}

.ns-cloner-gold-link {
  color: #ab8718;
  border-bottom: dotted 1px;
  font-size: smaller;
  display: inline-block;
  margin: 0 5px;
  text-decoration: none;
  cursor: pointer;
}

.ns-cloner-no-padding {
  padding: 0;
}

.ns-cloner-clear {
  clear: both;
}

.ns-cloner-info-message,
.ns-cloner-warning-message,
.ns-cloner-error-message,
.ns-cloner-success-message {
  display: block;
  line-height: 19px;
  padding: 11px 15px;
  font-size: 13px;
  text-align: left;
  margin: 0 0 15px;
  background-color: #fff;
  border-left: 4px solid #ffba00;
  -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
}

.ns-cloner-info-message p,
.ns-cloner-warning-message p,
.ns-cloner-error-message p,
.ns-cloner-success-message p {
  margin: 0;
}

.ns-cloner-info-message {
  border-left-color: #00a0d2;
}

.ns-cloner-error-message {
  border-left-color: #c85340;
}

.ns-cloner-success-message {
  border-left-color: #46b450;
}

.ns-cloner-error-message + .ns-cloner-section,
.ns-cloner-warning-message + .ns-cloner-section {
  margin-top: 0.7em;
}

.disabled-description {
  display: none;
}

input[disabled] + .disabled-description {
  display: inline;
  color: #888;
  font-size: smaller;
  font-style: italic;
}

.ns-cloner-form-button,
.ns-cloner-sidebar .button {
  background: #ab8718 !important;
  border: 0 !important;
  text-shadow: none !important;
  box-shadow: none !important;
  color: white !important;
  padding: 0.5em 1.5em !important;
  height: 3em !important;
  -webkit-transition: all 0.4s;
  -o-transition: all 0.4s;
  transition: all 0.4s;
  text-transform: uppercase;
  cursor: pointer;
  position: relative;
}

.ns-cloner-form-button:hover,
.ns-cloner-sidebar .button:hover {
  box-shadow: 0 2px 6px #ccc !important;
  transform: translateY(-2px);
}

.ns-cloner-form-button.large {
  height: 40px !important;
  padding-left: 2em !important;
  padding-right: 2em !important;
}

.ns-cloner-checkbox-label input[type=checkbox] {
  margin-right: 10px;
}

/**
 *  WordPress compatibility
 */
/* Hide update notices on cloner page */
body.toplevel_page_ns-cloner .update-nag,
body[class*=ns-cloner] .update-nag {
  display: none;
}

/**
 * Single site adaptations
 */
.ns-cloner-wrapper.disabled .ns-cloner-section,
.ns-cloner-wrapper.disabled .ns-cloner-disclaimer {
  opacity: 0.4;
}

.ns-cloner-wrapper.disabled .ns-cloner-button-wrapper {
  display: none;
}

/**
 * Media Queries
 */
@media (min-width: 1700px) {
  .ns-cloner-wrapper {
    background: url(../images/big-bg.jpg);
    background-attachment: fixed;
    background-repeat: no-repeat;
    background-position: right 60px top 0px;
  }
}
@media (min-width: 1600px) {
  .ns-cloner-form {
    flex: 0 1;
    flex-basis: 1000px;
  }
}
@media (max-width: 1200px) {
  .ns-cloner-sidebar {
    width: 275px;
  }

  .ns-cloner-button-steps {
    display: none;
  }

  .ns-cloner-button {
    width: 100%;
  }
}
@media (max-width: 960px) {
  .ns-cloner-wrapper {
    flex-wrap: wrap;
  }

  .ns-cloner-sidebar {
    width: 100%;
    margin-top: -30px;
    margin-left: 0;
    padding-left: 0;
    padding-bottom: 30px;
    display: flex;
    flex-wrap: wrap;
  }

  .ns-cloner-sidebar .ns-side-widget {
    flex: 1 1 45%;
    margin: 0 1% 20px !important;
  }

  body.auto-fold .ns-cloner-button-wrapper {
    left: 36px;
  }

  .ns-cloner-report-content {
    width: 90%;
    left: 5%;
  }
}
@media (max-width: 780px) {
  .ns-cloner-sidebar .ns-side-widget {
    flex-basis: 100%;
  }
}
@media (max-width: 780px) {
  .ns-cloner-button-wrapper {
    left: 0 !important;
  }
}
/**
* Project: https://github.com/svichas/jquery.digitScroller.js
* Author: Stefanos Vichas
* License: MIT
*/
.__digit_scroller_digit {
  position: relative;
  display: inline-block;
  -webkit-transform: translateY(0);
  -ms-transform: translateY(0);
  transform: translateY(0);
  width: 0.58em;
  text-align: center;
}

.__digit_scroller_digit._digit_up {
  -webkit-transform: translateY(-100%);
  -ms-transform: translateY(-100%);
  transform: translateY(-100%);
}

.__digit_scroller_next_digit {
  position: absolute;
  top: 100%;
  left: 0;
}

.__digit_scroller_wrap {
  display: inline-block;
  overflow: hidden;
}

/*=== Analytics === */
.ns-cloner-extra-modal#analytics-settings .ns-cloner-extra-modal-content {
  width: 50%;
  left: 25%;
}
.ns-cloner-extra-modal#analytics-settings .ns-cloner-form-button {
  margin-bottom: 5px;
}

#analytics-settings .analytics-settings-label {
  margin-top: 0.5em !important;
}
#analytics-settings .tooltip {
  position: relative;
  display: inline-block;
  border-bottom: 1px dotted black;
}
#analytics-settings .tooltip .tooltip-text {
  visibility: hidden;
  width: 200px;
  background-color: #555;
  color: #fff;
  text-align: center;
  border-radius: 6px;
  padding: 5px;
  position: absolute;
  z-index: 1;
  bottom: 125%;
  left: 50%;
  margin-left: -100px;
  opacity: 0;
  transition: opacity 0.3s;
  white-space: initial;
  text-transform: none;
  line-height: initial;
}
#analytics-settings .tooltip .tooltip-text::after {
  content: "";
  position: absolute;
  top: 100%;
  left: 50%;
  margin-left: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: #555 transparent transparent transparent;
}
#analytics-settings .tooltip:hover .tooltip-text {
  visibility: visible;
  opacity: 1;
}
#analytics-settings .tooltip.ns-cloner-form-button {
  border-bottom: none;
}
#analytics-settings .tooltip.ns-cloner-form-button .tooltip-toggle {
  border-bottom: 1px dotted black;
}

/*# sourceMappingURL=ns-cloner.css.map */
PKW�1\�(X�d�dcss/ns-cloner.scssnu�[���/**
 *  Layout
 */

.ns-cloner-wrapper {
  width: 100%;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

.ns-cloner-form {
  margin-bottom: 40px;
  -webkit-box-flex: 1;
  -ms-flex: 1;
  flex: 1;
  padding: 0 15px;
}

.ns-cloner-sidebar {
  width: 350px;
  padding: 0 30px 0 15px;
}

/**
 *  Header
 */

.ns-cloner-header {
  padding: 30px 40px;
  background: #1f1f1f url(../images/bg-texture.png);
  margin: 0 0 30px -20px;
}

.ns-cloner-header a {
  text-decoration: none;
}

.ns-cloner-header h1,
.ns-cloner-header span {
  display: inline-block;
  position: relative;
  left: 25px;
  bottom: 35px;
  color: #ab8718;
  font-size: 24px;
  font-weight: 400;
}

.ns-cloner-header span {
  color: white;
  font-size: 28px;
  margin-right: 25px;
  bottom: 36px;
}

.ns-cloner-header-pro {
  float: right;
  padding-top: 2px;
  text-align: center;
  line-height: 1.4em;
  border-left: solid 1px #303030;
  padding-left: 36px;
}

.ns-cloner-header-pro strong {
  display: block;
  color: #ccc;
  font-weight: 300;
  font-size: 17px;
}

.ns-cloner-header-pro a {
  display: inline-block;
  margin: 10px auto;
  font-size: 13px;
  padding: 10px 32px 12px !important;
  height: 18px !important;
  border-radius: 2px !important;
}

.ns-cloner-header-pro a:hover {
  color: #ddd;
  box-shadow: none !important;
}

/**
 *  Section boxes + sidebar widgets
 */

.ns-cloner-collapse-all,
.ns-cloner-expand-all {
  font-size: 11px !important;
  padding: 3px 8px !important;
  margin-top: -4px;
  cursor: pointer;
  border: solid #393939 1px;
  margin-left: 4px;
  background: #303030;
  border-radius: 2px;
  color: #ddd;
  float: right;
}

.ns-cloner-collapse-all small,
.ns-cloner-expand-all small {
  padding: 0 3px;
}
.ns-cloner-collapse-all:hover,
.ns-cloner-expand-all:hover {
  -webkit-box-shadow: inset 1px 1px 5px rgba(0, 0, 0, .3);
  box-shadow: inset 1px 1px 5px rgba(0, 0, 0, .3);
}

.ns-cloner-section,
.ns-cloner-sidebar .ns-side-widget {
  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, .1);
  box-shadow: 1px 1px 3px rgba(0, 0, 0, .1);
  border-radius: 2px;
  margin: 0 0 20px;
  background: #f8f8f8;
}

.ns-cloner-section-header {
  cursor: pointer;
}

.ns-cloner-section-header {
  margin: 0;
  padding: 20px 25px;
  height: 1.2em;
  font-size: 16px;
  color: white;
  border: solid 1px #333;
  border-radius: 2px 2px 0 0;
  background-color: #1f1f1f;
  font-weight: 400;
}

#ns-cloner-section-modes .ns-cloner-section-header {
  cursor: default;
}

.ns-cloner-section-header h4 {
  float: left;
  margin: 0;
  font-weight: normal;
}

.ns-cloner-section-collapse {
  cursor: pointer;
}

.ns-cloner-section-collapse::before {
  content: ' ';
  display: block;
  float: right;
  border-style: solid;
  border-width: 6px 4px;
  border-color: transparent transparent white;
  margin: 0;
  cursor: pointer;
  -webkit-transition: all 0.25s;
  -o-transition: all 0.25s;
  transition: all 0.25s;
}

.ns-cloner-section.closed .ns-cloner-section-collapse::before {
  margin-top: .4em;
  -webkit-transform: rotate(180deg);
  -ms-transform: rotate(180deg);
  transform: rotate(180deg);
}

/**
 *  Section contents / children
 */

.ns-cloner-section-content {
  padding: 20px 25px 25px;
  background: #f8f8f8;
  height: auto;
  -webkit-transition: all 0.25s;
  -o-transition: all 0.25s;
  transition: all 0.25s;
  border: solid 1px #fff;
  border-radius: 0 0 4px 4px;
  margin-top: -1px;
  position: relative;
}

.ns-cloner-section.closed .ns-cloner-section-content {
  height: 0;
  padding: 0 25px;
  border: 0;
  overflow: hidden;
}

.ns-cloner-section-content *:focus {
  -webkit-box-shadow: none !important;
  box-shadow: none !important;
  border-color: #ddd !important;
}

.ns-cloner-section-content > *:first-child,
.ns-cloner-section-content > *:first-child > *:first-child {
  margin-top: 0 !important;
}

.ns-cloner-section-content > *:last-child,
.ns-cloner-section-content > *:last-child > *:last-child {
  margin-bottom: 0 !important;
}

.ns-cloner-section-content h5 {
  font-size: 1.1em;
  margin: 0 0 .7em;
}

.ns-cloner-section-content label + h5,
.ns-cloner-section-content input + h5,
.ns-cloner-section-content .description + h5,
.ns-cloner-section-content .ns-cloner-input-group + h5 {
  margin-top: 0.7em;
}

.ns-cloner-section-content h5 label {
  margin-top: 0;
}

.ns-cloner-section-content p {
  padding: .4em 0;
  margin: 0;
  border: 0;
}

.ns-cloner-section-content .description,
.ns-cloner-mode-description p {
  font-style: italic;
}

.ns-cloner-section-content .description + .description {
  padding-top: 0 !important;
}

.ns-cloner-section-content label {
  display: block;
  padding: .25em;
  margin-top: .5em;
  font-weight: 500;
  clear: both;
}

.ns-cloner-section-content input[type=text],
.ns-cloner-section-content select,
.ns-cloner-section-content textarea {
  padding: .5em 1em;
  margin: 0;
  height: auto;
  width: 100%;
  border-radius: 0;
  border-color: #bbb;
}

.ns-cloner-section-content strong {
  color: #be9719;
}

.ns-cloner-section-content table {
  width: 100%;
  border: solid 1px #eee;
  margin-bottom: .5em;
}

.ns-cloner-section-content th {
  padding: 10px;
  border-bottom: solid 1px #eee;
  text-align: left;
}
.ns-cloner-section-content th.date-col {
  width: 15em;
}
.ns-cloner-section-content th.action-col {
  width: 8em;
  text-align: center;
}

.ns-cloner-section-content td {
  padding: 5px 10px;
  border-bottom: solid 1px #eee;
}

.ns-cloner-section-content tr:last-child td {
  border-bottom: 0;
}

.ns-cloner-section-content td .button {
  display: block;
  margin: 0 auto;
  text-align: center;
  position: relative;
}

.ns-cloner-section-content td .button.working:after {
  content: url(../images/loading.gif);
  display: block;
  position: absolute;
  top: 3px;
  right: -25px;
}

/**
 *  Input groups
 */

.ns-cloner-section-content .ns-cloner-input-group {
  display: flex;
  max-width: 100%;
}
.ns-cloner-section-content .ns-cloner-input-group label {
  background-color: #eaeaea;
  padding: .5em 1em;
  border: solid 1px #ccc;
  position: relative;
  display: inline-block;
  bottom: 0;
  left: 1px;
  height: 35px;
  box-sizing: border-box;
  color: #777;
  margin: 0;
}
.ns-cloner-section-content .ns-cloner-input-group input {
  flex: 1;
  height: 35px;
}
.ns-cloner-section-content .ns-cloner-input-group input + label {
  left: -2px;
}
.ns-cloner-section-content .ns-cloner-input-group > *:first-child {
  border-radius: 2px 0 0 2px;
}
.ns-cloner-section-content .ns-cloner-input-group > *:last-child {
  border-radius: 0 2px 2px 0;
}
.ns-cloner-section-content .ns-cloner-input-group + .ns-cloner-input-group {
  margin-top: -1px;
}

/**
 * Checkbox groups
 */

.ns-cloner-multi-checkbox-wrapper {
  border: solid 1px #ddd;
  border-radius: 2px;
  background: #fff;
  padding: 1em 1.4em;
  overflow: auto;
  min-height: 6em;
  max-height: 12em;
  margin: 1em 0;
}

.ns-cloner-multi-checkbox-wrapper.loading {
  opacity: 0.75;
  background: url(../images/spinner.gif) no-repeat center center;
}

.ns-cloner-multi-checkbox-wrapper label {
  margin-top: .35em;
  font-weight: normal;
}

.ns-cloner-multi-checkbox-wrapper .description {
  font-size: .9em;
  color: #999;
}

/**
 *  Chosen (select elements)
 */

.ns-cloner-section .chosen-container {
  margin-bottom: .5em !important;
}

.ns-cloner-section .chosen-single {
  padding: 5px 12px !important;
  height: 36px !important;
  border-color: #ccc !important;
  border-radius: 2px !important;
  background: white !important;
}

.ns-cloner-section .chosen-single b {
  background-position: 0 7px !important;
}

.ns-cloner-section .chosen-choices {
  border-color: #ccc !important;
}

.ns-cloner-section .chosen-choices .search-field {
  padding: 5px 5px 2px !important;
}

.ns-cloner-section .chosen-choices .search-choice {
  padding: 8px 22px 8px 10px !important;
}

.ns-cloner-section .chosen-choices .search-choice-close {
  top: 10px !important;
  right: 5px !important;
}

.ns-cloner-section .chosen-container .chosen-results li {
  padding: 6px 8px !important;
}

.ns-cloner-section .chosen-container .chosen-results li.highlighted {
  background: #ab8718 !important;
}

/**
 *  Repeaters
 */

.ns-repeater li {
  display: flex !important;
}
C
.ns-repeater li.invisible {
  visibility: hidden;
  height: 0;
  overflow: hidden;
  margin: 0;
}

.ns-repeater input[type=text] {
  display: block;
  flex: 1;
  margin-right: -2px;
  height: 35px;
}

.ns-repeater .chosen-container {
  width: 100%;
  flex-basis: 30%;
  position: relative;
  margin: 0 10px 0 15px;
  bottom: 1px;
}

.ns-repeater-add {
  margin: -.35em 0 .7em 0 !important;
}

.ns-repeater-remove {
  background-color: #eaeaea;
  padding: 8px 8px;
  border: solid 1px #ccc;
  position: relative;
  display: inline-block;
  bottom: 0;
  left: 1px;
  height: 35px;
  box-sizing: border-box;
  color: #777;
  margin: 0;
  cursor: pointer;
}

.ns-repeater-remove:after {
  content: "\f335";
  font-size: 18px;
  font-family: 'dashicons';
}

/**
 *  Inline validation
 */

span.ns-cloner-validating-spinner, .ns-cloner-loader-icon {
  margin-top: -30px;
  display: inline-block;
  float: right;
  &:before {
    content: url(../images/loading.gif);
    padding: 0 .5em;
    display: inline-block;
    position: relative;
    top: 3px;
    font-size: 18px;
    font-family: dashicons;
  }
  &.valid:before {
    content: '\f147';
    color: #558855;
  }
  &:first-child {
    float: none;
  }
}
.ns-cloner-loader-icon{
  float: none;
}

.ns-cloner-section-content .ns-cloner-input-group .ns-cloner-validating-spinner {
  padding-top: 5px;
  margin-top: 0;
}

/**
 * 	Sidebar
 */

.ns-cloner-sidebar .ns-side-widget {
  border: solid 1px #ddd;
  text-align: center;
}

.ns-cloner-sidebar .ns-side-widget h5 {
  margin: 0;
  padding: 12px 25px;
  height: 1.2em;
  font-size: 14px;
  color: white;
  border: solid 1px #444;
  border-radius: 2px 2px 0 0;
  background-color: #4d4d4d;
  font-weight: 400;
}

.ns-cloner-sidebar .ns-side-widget h5 a {
  color: #ab8718;
  text-decoration: none;
}

.ns-cloner-sidebar .ns-side-widget-content {
  padding: 15px;
  background: #f8f8f8;
}

.ns-side-widget-content p {
  padding: 0;
  margin: 0 0 10px;
}

.ns-side-widget-content p:last-child {
  margin-bottom: 0;
}

.ns-featured-widget .ns-side-widget-content {
  padding: 0;
}

.ns-random-widget .ns-side-widget-content {
  padding: 30px;
}

.ns-links-widget .ns-side-widget-content {
  text-align: left;
}

.ns-subscribe-widget form > * {
  text-align: center;
}

.ns-subscribe-widget div#ns-subscribe-form > form button {
  background: #ab8718 !important;
  font-size: 13px;
  border-radius: 2px !important;
  text-transform: uppercase;
}

/**
 * 	Clone button + bar
 */

.ns-cloner-button-wrapper {
  padding: 15px 20px;
  position: fixed;
  left: 160px;
  bottom: 0;
  right: 0;
  background: #1f1f1f;
  z-index: 8999;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

body.folded .ns-cloner-button-wrapper {
  left: 36px;
}

.ns-cloner-button-steps {
  margin: 10px 10px 0;
  font-size: 18px;
  position: relative;
  height: 48px;
  overflow: hidden;
  z-index: 1;
  -webkit-box-flex: 1;
  -ms-flex: 1;
  flex: 1;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

.ns-cloner-button-steps:before {
  content: '';
  border-bottom: dotted 2px #555;
  height: 21px;
  position: absolute;
  width: calc( 100% - 10px );
  left: 0;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  top: 0;
}

.ns-cloner-button-steps:after {
  content: ' ';
  display: inline-block;
  border-style: solid;
  border-color: transparent transparent transparent #555;
  border-width: 6px 8px;
  position: absolute;
  top: 50%;
  right: 0;
  margin-top: -10px;
}

.ns-cloner-button-steps > span {
  background: #1f1f1f;
  -webkit-box-shadow: 0 0 20px #202020;
  box-shadow: 0 0 20px #202020;
  color: #555;
  text-transform: uppercase;
  margin-right: 25px;
  padding: 10px 15px;
  display: inline-block;
  white-space: nowrap;
  text-align: center;
  -webkit-transition: all ease-in-out 0.75s;
  -o-transition: all ease-in-out 0.75s;
  transition: all ease-in-out 0.75s;
  cursor: pointer;
  position: relative;
}

.ns-cloner-button-steps > span.seen {
  color: white;
}

.ns-cloner-button-steps > span:before,
.ns-cloner-button-steps > span:before {
  content: '';
  font-family: dashicons;
  position: absolute;
  left: 50%;
  bottom: -1px;
  margin-left: -5px;
  opacity: 0;
  -webkit-transition: opacity ease-in-out 0.75s;
  -o-transition: opacity ease-in-out 0.75s;
  transition: opacity ease-in-out 0.75s;
}

.ns-cloner-button-steps > span.invalid {
  color: #c85340;
}

.ns-cloner-button-steps > span.invalid:before {
  content: "\f335";
  color: #c85340;
  opacity: 1;
}
.ns-cloner-button-steps > span:after {
  content: ' ';
  display: inline-block;
  border-style: solid;
  border-color: transparent transparent transparent #555;
  border-width: 6px 8px;
  position: absolute;
  top: 50%;
  right: -33px;
  margin-top: -10px;
}

.ns-cloner-button-steps > span:last-child:after {
  display: none;
}

.ns-cloner-button {
  float: right;
  background: #ab8718;
  padding: 16px 48px;
  margin-right: 10px;
  color: white;
  text-transform: uppercase;
  font-size: 18px;
  cursor: pointer;
  border: 0;
  outline: 0 !important;
  border-radius: 2px;
  -webkit-transition: all ease-out 0.25s;
  -o-transition: all ease-out 0.25s;
  transition: all ease-out 0.25s;
  position: relative;
  z-index: 1;
}

.ns-cloner-button:hover {
  -webkit-transform: scale(1.05);
  -ms-transform: scale(1.05);
  transform: scale(1.05);
  background: #be9719;
}

.ns-cloner-button.working {
  background-image: url(../images/gold-loading.gif);
  background-repeat: no-repeat;
  background-position: right 20px center;
  opacity: 0.5;
  cursor: default;
}

.ns-cloner-button.working:hover {
  -webkit-transform: none;
  -ms-transform: none;
  transform: none;
  background-color: #ab8718;
}

.ns-cloner-scroll-progress {
  background: #ab8718;
  position: absolute;
  left: 0;
  bottom: 0;
  height: 5px;
  -webkit-transition: width ease-in-out 0.75s;
  -o-transition: width ease-in-out 0.75s;
  transition: width ease-in-out 0.75s;
}

.ns-cloner-disclaimer {
  padding: .7em .35em 1.4em .35em;
}

.ns-cloner-disclaimer strong {
  color: orangered;
}

/**
 *  Progress modal
 */

.ns-cloner-processes-modal {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 9999;
  background-color: rgba(0, 0, 0, 0.7);
}

.ns-cloner-processes-modal-wrapper {
  max-width: 1024px;
  width: 90%;
  position: absolute;
  top: 10%;
  bottom: 10%;
  left: 50%;
  padding: 40px 60px;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  z-index: 9999;
  background-color: #f3f3f3;
  -webkit-transform: translateX(-50%);
  -ms-transform: translateX(-50%);
  transform: translateX(-50%);
  overflow-y: scroll;
}

.ns-cloner-processes-done {
  display: none;
}

.ns-modal-head {
  margin-bottom: 30px;
}

.ns-process-wrapper {
  display: block;
  padding: 5px 30px 30px 30px;
  margin-bottom: 15px;
  background: #fff;
}

.ns-modal-body {
  margin-bottom: 10px;
}

.ns-modal-refresh,
.ns-modal-cancel,
.ns-modal-close {
  margin-top: -10px;
  margin-left: 15px;
  cursor: pointer;
  float: right;
  color: #fff;
  outline: none;
  background-color: #555;
  padding: 10px 20px 12px;
  text-transform: uppercase;
  border-radius: 2px;
  text-decoration: none;
  text-align: center;
  border: 0;
  -webkit-box-shadow: none;
  box-shadow: none;
  height: auto;
  line-height: 1;
}

.ns-modal-cancel {
  background-color: #ddd;
  color: #555;
}

.ns-cloner-progress-bar {
  border: 1px solid #ab8718;
  height: 30px;
  background-color: #fff;
  border-radius: 2px;
  position: relative;
}

.ns-cloner-progress-bar-inner {
  background-color: #ab8718;
  width: 0;
  max-width: 100%;
  height: 32px;
  margin-top: -1px;
  -webkit-transition: all 2s ease-in-out;
  -o-transition: all 2s ease-in-out;
  transition: all 2s ease-in-out;
  background-size: 30px 30px;
  background-image: linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%,
          transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%,
          transparent 75%, transparent);
  animation: animate-stripes 3s linear infinite;
}

.ns-percents {
  font-size: 14px;
  line-height: 30px;
  font-weight: 500;
  text-align: center;
  color: #fff;
  position: absolute;
  top: -10px;
  width: 50px;
  height: 50px;
  z-index: 9999;
  background: #ab8718;
  left: 50%;
  margin-left: -20px;
  border-radius: 50%;
  padding-top: 9px;
  box-sizing: border-box;
}

.ns-cloner-progress-info {
  padding-top: 8px;
}

.ns-cloner-progress-items {
  display: flex;
  margin-top: 20px;
}

.ns-cloner-progress-items > div {
  flex: 1;
  text-align: center;
  font-size: 18px;
  padding: 40px;
  background: #f8f8f8;
  color: #aaa;
  border-right: solid 1px #ddd;
}

.ns-cloner-progress-items > div:last-child {
  border-right: 0;
}

.ns-cloner-progress-items em {
  font-style: normal;
  font-size: 22px;
  color: #333;
}

.ns-cloner-progress-items small {
  display: block;
  text-transform: uppercase;
  padding: 8px;
  color: #ab8718;
  font-size: 16px;
}

.ns-cloner-loading-center {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -10px 0 0 -10px;
}

@keyframes animate-stripes {
  0% {background-position: 0 0;} 100% {background-position: 60px 0;}
}

/**
 * 	Report after cloning
 */

.ns-cloner-report {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, .45);
  z-index: 300000;
}

.ns-cloner-report-content {
  width: 50%;
  background: white;
  max-height: 75%;
  overflow: auto;
  position: relative;
  left: 20%;
  top: 32px;
  padding: 3% 5% 5%;
  border-radius: 0 0 .7em .7em;
}

.ns-cloner-report-content h5 {
  font-weight: bold;
  font-size: 1.4em;
  margin-top: 0;
}

.ns-cloner-report-item {
  clear: both;
  padding: .7em;
  overflow: hidden;
}

.ns-cloner-report-item:nth-child(odd) {
  background: #eee;
}

.ns-cloner-report-item-label {
  float: left;
  width: 20%;
  min-width: 10em;
  font-weight: bold;
}

/**
 * 	Copy logs box before going to support
 */

.ns-cloner-extra-modal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, .45);
  z-index: 300000;
  display: none;
}

.ns-cloner-extra-modal-content {
  background: white;
  width: 30%;
  padding: 1.5em 2.5%;
  top: 10vh;
  left: 35%;
  position: absolute;
  border-radius: 2px;
  max-height: 70vh;
  box-sizing: border-box;
  overflow: auto;
}

.ns-cloner-extra-modal-content p {
  margin-bottom: 1.2em !important;
}

.ns-cloner-extra-modal-content textarea {
  width: 100%;
  white-space: nowrap;
  height: 8em;
  font-size: 12px;
  padding: 1em;
  font-family: monospace;
}

/**
 * 	Utility classes
 */

.ns-cloner-small {
  font-size: 0.75em;
}

.ns-cloner-text-center {
  text-align: center;
}

.ns-cloner-gold-link {
  color: #ab8718;
  border-bottom: dotted 1px;
  font-size: smaller;
  display: inline-block;
  margin: 0 5px;
  text-decoration: none;
  cursor: pointer;
}

.ns-cloner-no-padding {
  padding: 0;
}

.ns-cloner-clear {
  clear: both;
}

.ns-cloner-info-message,
.ns-cloner-warning-message,
.ns-cloner-error-message,
.ns-cloner-success-message {
  display: block;
  line-height: 19px;
  padding: 11px 15px;
  font-size: 13px;
  text-align: left;
  margin: 0 0 15px;
  background-color: #fff;
  border-left: 4px solid #ffba00;
  -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
  box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
}

.ns-cloner-info-message p,
.ns-cloner-warning-message p,
.ns-cloner-error-message p,
.ns-cloner-success-message p {
  margin: 0;
}

.ns-cloner-info-message {
  border-left-color: #00a0d2;
}

.ns-cloner-error-message {
  border-left-color: #c85340;
}

.ns-cloner-success-message {
  border-left-color: #46b450;
}

.ns-cloner-error-message + .ns-cloner-section,
.ns-cloner-warning-message + .ns-cloner-section {
  margin-top: .7em;
}

.disabled-description {
  display: none;
}

input[disabled] + .disabled-description {
  display: inline;
  color: #888;
  font-size: smaller;
  font-style: italic;
}

.ns-cloner-form-button,
.ns-cloner-sidebar .button {
  background: #ab8718 !important;
  border: 0 !important;
  text-shadow: none !important;
  box-shadow: none !important;
  color: white !important;
  padding: .5em 1.5em !important;
  height: 3em !important;
  -webkit-transition: all 0.4s;
  -o-transition: all 0.4s;
  transition: all 0.4s;
  text-transform: uppercase;
  cursor: pointer;
  position: relative;
}

.ns-cloner-form-button:hover,
.ns-cloner-sidebar .button:hover {
  box-shadow: 0 2px 6px #ccc !important;
  transform: translateY( -2px );
}

.ns-cloner-form-button.large {
  height: 40px !important;
  padding-left: 2em !important;
  padding-right: 2em !important;
}

.ns-cloner-checkbox-label{
  input[type="checkbox"] {
    margin-right: 10px;
  }
}

/**
 *  WordPress compatibility
 */

/* Hide update notices on cloner page */
body.toplevel_page_ns-cloner .update-nag,
body[class*=ns-cloner] .update-nag {
  display: none;
}

/**
 * Single site adaptations
 */

.ns-cloner-wrapper.disabled .ns-cloner-section,
.ns-cloner-wrapper.disabled .ns-cloner-disclaimer {
  opacity: 0.4;
}

.ns-cloner-wrapper.disabled .ns-cloner-button-wrapper {
  display: none;
}

/**
 * Media Queries
 */

@media ( min-width:1700px ){
  .ns-cloner-wrapper {
    background: url(../images/big-bg.jpg);
    background-attachment: fixed;
    background-repeat: no-repeat;
    background-position: right 60px top 0px;
  }
}

@media ( min-width:1600px ) {
  .ns-cloner-form {
    flex: 0 1;
    flex-basis: 1000px;
  }
}

@media ( max-width: 1200px ){
  .ns-cloner-sidebar {
    width: 275px;
  }
  .ns-cloner-button-steps {
    display: none;
  }
  .ns-cloner-button {
    width: 100%;
  }
}


@media ( max-width: 960px ) {
  .ns-cloner-wrapper {
    flex-wrap: wrap;
  }
  .ns-cloner-sidebar {
    width: 100%;
    margin-top: -30px;
    margin-left: 0;
    padding-left: 0;
    padding-bottom: 30px;
    display: flex;
    flex-wrap: wrap;
  }
  .ns-cloner-sidebar .ns-side-widget {
    flex: 1 1 45%;
    margin: 0 1% 20px !important;
  }
  body.auto-fold .ns-cloner-button-wrapper {
    left: 36px;
  }
  .ns-cloner-report-content {
    width: 90%;
    left: 5%;
  }
}
@media( max-width: 780px ){
  .ns-cloner-sidebar .ns-side-widget {
    flex-basis: 100%;
  }
}
@media( max-width: 780px ){
  .ns-cloner-button-wrapper {
    left: 0 !important;
  }
}

/**
* Project: https://github.com/svichas/jquery.digitScroller.js
* Author: Stefanos Vichas
* License: MIT
*/
.__digit_scroller_digit {
  position: relative;
  display: inline-block;
  -webkit-transform: translateY(0);
  -ms-transform: translateY(0);
  transform: translateY(0);
  width: .58em;
  text-align: center; }
.__digit_scroller_digit._digit_up {
  -webkit-transform: translateY(-100%);
  -ms-transform: translateY(-100%);
  transform: translateY(-100%); }

.__digit_scroller_next_digit {
  position: absolute;
  top: 100%;
  left: 0; }

.__digit_scroller_wrap {
  display: inline-block;
  overflow: hidden; }

/*=== Analytics === */
.ns-cloner-extra-modal{
  &#analytics-settings{
    .ns-cloner-extra-modal-content{
      width: 50%;
      left: 25%;
    }
    .ns-cloner-form-button{
      margin-bottom: 5px;
    }
  }
}
#analytics-settings{
  .analytics-settings-label{
    margin-top: 0.5em !important;
  }
  .tooltip{
    position: relative;
    display: inline-block;
    border-bottom: 1px dotted black;
    .tooltip-text{
      visibility: hidden;
      width: 200px;
      background-color: #555;
      color: #fff;
      text-align: center;
      border-radius: 6px;
      padding: 5px;
      position: absolute;
      z-index: 1;
      bottom: 125%;
      left: 50%;
      margin-left: -100px;
      opacity: 0;
      transition: opacity 0.3s;
      white-space: initial;
      text-transform: none;
      line-height: initial;
      &::after {
        content: "";
        position: absolute;
        top: 100%;
        left: 50%;
        margin-left: -5px;
        border-width: 5px;
        border-style: solid;
        border-color: #555 transparent transparent transparent;
      }
    }
    &:hover{
      .tooltip-text{
        visibility: visible;
        opacity: 1;
      }
    }
    &.ns-cloner-form-button{
      border-bottom: none;
      .tooltip-toggle{
        border-bottom: 1px dotted black;
      }
    }
  }
}PKW�1\��n���
composer.jsonnu�[���{
    "minimum-stability": "dev",
    "prefer-stable": true,
    "require": {
        "kint-php/kint": "^4.0",
        "harvesthq/chosen": "^1.8",
        "a5hleyrich/wp-background-processing": "^1.0"
    }
}
PKW�1\-���
composer.locknu�[���{
    "_readme": [
        "This file locks the dependencies of your project to a known state",
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
        "This file is @generated automatically"
    ],
    "content-hash": "e54f90dca6effa5eda8d79a5b8e53c43",
    "packages": [
        {
            "name": "a5hleyrich/wp-background-processing",
            "version": "1.0.2",
            "source": {
                "type": "git",
                "url": "https://github.com/deliciousbrains/wp-background-processing.git",
                "reference": "2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/deliciousbrains/wp-background-processing/zipball/2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800",
                "reference": "2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800",
                "shasum": ""
            },
            "require": {
                "php": ">=5.2"
            },
            "suggest": {
                "coenjacobs/mozart": "Easily wrap this library with your own prefix, to prevent collisions when multiple plugins use this library"
            },
            "type": "library",
            "autoload": {
                "classmap": [
                    "classes/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "GPL-2.0-or-later"
            ],
            "authors": [
                {
                    "name": "Delicious Brains",
                    "email": "nom@deliciousbrains.com"
                }
            ],
            "description": "WP Background Processing can be used to fire off non-blocking asynchronous requests or as a background processing tool, allowing you to queue tasks.",
            "time": "2020-07-31T07:00:11+00:00"
        },
        {
            "name": "harvesthq/chosen",
            "version": "v1.8.7",
            "source": {
                "type": "git",
                "url": "https://github.com/harvesthq/chosen-package.git",
                "reference": "ad86732b668627c131e61ee8f0e6e9ed52e4db8d"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/harvesthq/chosen-package/zipball/ad86732b668627c131e61ee8f0e6e9ed52e4db8d",
                "reference": "ad86732b668627c131e61ee8f0e6e9ed52e4db8d",
                "shasum": ""
            },
            "type": "library",
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Koen Punt",
                    "homepage": "https://github.com/koenpunt"
                },
                {
                    "name": "Patrick Filler",
                    "homepage": "https://github.com/pfiller"
                },
                {
                    "name": "Christophe Coevoet",
                    "homepage": "https://github.com/stof"
                },
                {
                    "name": "Ken Earley",
                    "homepage": "https://github.com/kenearley"
                }
            ],
            "description": "Chosen is a JavaScript plugin that makes select boxes user-friendly. It is currently available in both jQuery and Prototype flavors.",
            "homepage": "https://harvesthq.github.io/chosen/",
            "keywords": [
                "dropdown",
                "form",
                "input",
                "multiselect",
                "select",
                "ui"
            ],
            "time": "2018-06-28T20:32:51+00:00"
        },
        {
            "name": "kint-php/kint",
            "version": "4.0-alpha1",
            "source": {
                "type": "git",
                "url": "https://github.com/kint-php/kint.git",
                "reference": "5dea34eb550f0dd1ef582f3b785158c13f9c4fd4"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/kint-php/kint/zipball/5dea34eb550f0dd1ef582f3b785158c13f9c4fd4",
                "reference": "5dea34eb550f0dd1ef582f3b785158c13f9c4fd4",
                "shasum": ""
            },
            "require": {
                "php": ">=5.6"
            },
            "require-dev": {
                "friendsofphp/php-cs-fixer": "^2.0",
                "phpspec/prophecy-phpunit": "^2",
                "phpunit/phpunit": "^9.0",
                "seld/phar-utils": "^1.0",
                "symfony/finder": "^3.0 || ^4.0 || ^5.0",
                "vimeo/psalm": "dev-master"
            },
            "suggest": {
                "ext-ctype": "Simple data type tests",
                "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages",
                "ext-mbstring": "Provides string encoding detection",
                "kint-php/kint-js": "Provides a simplified dump to console.log()",
                "kint-php/kint-twig": "Provides d() and s() functions in twig templates",
                "symfony/polyfill-ctype": "Replacement for ext-ctype if missing",
                "symfony/polyfill-iconv": "Replacement for ext-iconv if missing",
                "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing"
            },
            "type": "library",
            "autoload": {
                "files": [
                    "init.php"
                ],
                "psr-4": {
                    "Kint\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Jonathan Vollebregt",
                    "homepage": "https://github.com/jnvsor"
                },
                {
                    "name": "Rokas Šleinius",
                    "homepage": "https://github.com/raveren"
                },
                {
                    "name": "Contributors",
                    "homepage": "https://github.com/kint-php/kint/graphs/contributors"
                }
            ],
            "description": "Kint - debugging tool for PHP developers",
            "homepage": "https://kint-php.github.io/kint/",
            "keywords": [
                "debug",
                "kint",
                "php"
            ],
            "time": "2020-11-25T20:18:13+00:00"
        }
    ],
    "packages-dev": [],
    "aliases": [],
    "minimum-stability": "dev",
    "stability-flags": [],
    "prefer-stable": true,
    "prefer-lowest": false,
    "platform": [],
    "platform-dev": [],
    "plugin-api-version": "1.1.0"
}
PKW�1\�j�X�'�'class-ns-cloner-request.phpnu�[���<?php
/**
 * Cloner Request class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Request class
 *
 * Utility class to define and access request data - settings for the current cloning operation
 * that are usually submitted via a POST request (but could be manually set) and then are saved
 * in a site option for the duration of that cloning process, and cleared at the end. Should
 * generally be the go-to source for POST and GET data rather than referring to those directly.
 *
 * Also handles calculating basic variables - like db prefixes, upload dirs, etc. - for cloning
 * operations and search/replace values.
 */
final class NS_Cloner_Request {

	/**
	 * Request Data
	 *
	 * @var array
	 */
	private $request = [];

	/**
	 * Option key to save stored request to
	 *
	 * @var string
	 */
	private static $option_key = 'ns_cloner_saved_request';

	/**
	 * List of default variables to be defined for source and target sites
	 *
	 * @var array
	 */
	private static $vars = [
		'prefix',
		'upload_dir',
		'upload_url',
		'url',
		'url_short',
	];

	/**
	 * Singleton instance of this class
	 *
	 * @var NS_Cloner_Request
	 */
	private static $instance;

	/**
	 * NS_Cloner_Request constructor.
	 */
	private function __construct() {
		// Load request from saved request option if present, enabling background processes to stay in sync.
		$request = (array) get_site_option( 'ns_cloner_saved_request', [] );
		// Enable $_GET and $_POST to override / fill in gaps in the saved request.
		// Verifying the nonce here shouldn't be needed, because it is checked elsewhere before performing any actions.
		// However, this check is here as a safety precaution so the cloner request object can't ever somehow get injected.
		$nonce = isset( $_REQUEST['clone_nonce'] ) ? $_REQUEST['clone_nonce'] : '';
		if ( wp_verify_nonce( $nonce, 'ns_cloner' ) ) {
			$request = array_merge( $request, wp_unslash( $_GET ), wp_unslash( $_POST ) );
		}
		$this->request = $request;
	}

	/**
	 * Disable cloning
	 */
	private function __clone() {
	}

	/**
	 * Disable unserialize
	 */
	public function __wakeup() {
	}

	/**
	 * Get singleton instance
	 *
	 * @return NS_Cloner_Request
	 */
	public static function instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Reload the request from the saved version in the database
	 *
	 * @return $this
	 */
	public function refresh() {
		$this->request = (array) get_site_option( 'ns_cloner_saved_request', [] );
		return $this;
	}

	/**
	 * Get all current request variables
	 *
	 * @return array
	 */
	public function get_request() {
		return $this->request;
	}

	/**
	 * Get a request variable
	 *
	 * @param string $key Key of request array.
	 * @param mixed  $default Default value.
	 *
	 * @return null
	 */
	public function get( $key, $default = null ) {
		return isset( $this->request[ $key ] ) ? $this->request[ $key ] : $default;
	}

	/**
	 * Set a request variable
	 *
	 * @param string $key Key of request array.
	 * @param string $value Value to set.
	 */
	public function set( $key, $value ) {
		$this->request[ $key ] = $value;
		ns_cloner()->log->log( [ "SETTING REQUEST VAR '$key' to:", $value ] );
	}

	/**
	 * Save the current request into site options for later reference by background processes
	 */
	public function save() {
		update_site_option( self::$option_key, $this->request );
		ns_cloner()->log->log( [ 'SAVING REQUEST:', $this->request ] );
	}

	/**
	 * Save the current request into site options for later reference by background processes
	 */
	public function delete() {
		delete_site_option( self::$option_key );
		ns_cloner()->log->log( 'DELETING REQUEST' );
	}

	/**
	 * Generate definitions for site variables
	 *
	 * If null, 'network', or another string is provided as the site_id, it defaults to the main site
	 * (either the only site for single installs, or the main site on the network for multisite).
	 * Teleport uses this to provide a string (remote site url) rather than an ID, and then uses
	 * the filter at the bottom to return the correct variables.
	 *
	 * IMPORTANT: This cannot be called for target values during the middle of a cloning operation,
	 * because the target options table could be empty and site_url() will return empty.
	 *
	 * @param int $site_id Blog id of site to get variables for.
	 * @return array
	 */
	public function define_vars( $site_id = null ) {
		$is_subsite = is_multisite() && ! is_null( $site_id ) && is_numeric( $site_id );
		if ( $is_subsite ) {
			switch_to_blog( $site_id );
		}
		// Get site url directly rather than with site_url(), because option/object
		// caching can result in a blank value for a newly created site.
		$option_q = 'SELECT option_value FROM ' . ns_cloner()->db->options . " WHERE option_name='siteurl'";
		$site_url = set_url_scheme( ns_cloner()->db->get_var( $option_q ) );
		// Past Cloner versions had manual checking/overrides for wp_upload_dir.
		// However, it seems that wp_upload_dir() is now more reliable, whereas the
		// overrides were beginning to cause problems. If a fix is needed on a case
		// by case basis for when wp_upload_dir() is overwritten by a filter (e.g.
		// compatibility with another plugin), we could add a small patch plugin OR
		// add a filter in ns-compatibility.php to filter ns_cloner_request_define_vars.
		$upload_dir = wp_upload_dir();
		// If the upload_url_path option is blank, _wp_upload_dir will use WP_CONTENT_URL,
		// with the domain set to the network domain, not the current blog's domain, so fix it.
		$upload_url = str_replace( WP_CONTENT_URL, $site_url, $upload_dir['baseurl'] );
		// These definitions should all work both for multisite (after using switch_blog above
		// so they have the correct sub-site values) as well as single site / whole network.
		$vars = [
			'prefix'              => ns_cloner()->db->prefix,
			'upload_dir'          => $upload_dir['basedir'],
			'upload_dir_relative' => str_replace( ABSPATH, '', $upload_dir['basedir'] ),
			'upload_url'          => $upload_url,
			'upload_url_relative' => str_replace( $site_url, '', $upload_url ),
			'url'                 => $site_url,
			'url_short'           => untrailingslashit( preg_replace( '|^(https?:)?//|', '', $site_url ) ),
		];
		if ( $is_subsite ) {
			restore_current_blog();
		}
		return apply_filters( 'ns_cloner_request_define_vars', $vars, $site_id );
	}

	/**
	 * Add source and target vars to the current cloner request
	 *
	 * Take definitions from define_vars() for source and target ids, if applicable,
	 * and add them to the current cloner request array.
	 */
	public function set_up_vars() {
		$source_id = $this->get( 'source_id' );
		if ( $source_id ) {
			foreach ( $this->define_vars( $source_id ) as $key => $value ) {
				$this->set( "source_{$key}", $value );
			}
		}
		$target_id = $this->get( 'target_id' );
		if ( $target_id ) {
			foreach ( $this->define_vars( $target_id ) as $key => $value ) {
				$this->set( "target_{$key}", $value );
			}
		}
		if ( $source_id && $target_id ) {
			$this->set_up_search_replace( $source_id, $target_id );
		}
	}

	/**
	 * Set up search / replace value arrays
	 *
	 * @param int|null $source_id ID of source site.
	 * @param int|null $target_id ID of target site.
	 */
	public function set_up_search_replace( $source_id = null, $target_id = null ) {
		$source_id  = $source_id ?: $this->get( 'source_id' );
		$target_id  = $target_id ?: $this->get( 'target_id' );
		$option_key = "ns_cloner_search_{$source_id}_replace_{$target_id}";
		// Generate arrays and save if not.
		$search  = [
			$this->request['source_upload_dir_relative'],
			$this->request['source_upload_url'],
			$this->request['source_url_short'],
			$this->request['source_prefix'] . 'user_roles',
		];
		$replace = [
			$this->request['target_upload_dir_relative'],
			$this->request['target_upload_url'],
			$this->request['target_url_short'],
			$this->request['target_prefix'] . 'user_roles',
		];

		$search  = apply_filters( 'ns_cloner_search_items_before_sequence', $search );
		$replace = apply_filters( 'ns_cloner_replace_items_before_sequence', $replace );

		// Sort and filter replacements to intelligently avoid compounding replacement issues.
		ns_set_search_replace_sequence( $search, $replace );
		// Add filters that enable custom replacements to be applied.
		$search_replace = [
			'search'  => apply_filters( 'ns_cloner_search_items', $search ),
			'replace' => apply_filters( 'ns_cloner_replace_items', $replace ),
		];
		// Save in settings for use by background processes.
		update_site_option( $option_key, $search_replace );
		ns_cloner()->log->log( [ "SETTING search/replace for source *$source_id* and target *$target_id*:", $search_replace ] );
	}

	/**
	 * Get saved search / replace value arrays
	 *
	 * @param int|null $source_id ID of source site.
	 * @param int|null $target_id ID of target site.
	 * @return array
	 */
	public function get_search_replace( $source_id = null, $target_id = null ) {
		$source_id  = $source_id ?: $this->get( 'source_id' );
		$target_id  = $target_id ?: $this->get( 'target_id' );
		$option_key = "ns_cloner_search_{$source_id}_replace_{$target_id}";
		return get_site_option( $option_key );
	}

	/**
	 * Shortcut to check if the current mode is equal to a provided one (or in a provided list).
	 *
	 * @param string|array $mode_id Mode id or array of them to compare to the current mode.
	 * @return bool
	 */
	public function is_mode( $mode_id ) {
		if ( is_array( $mode_id ) ) {
			return in_array( $this->get( 'clone_mode' ), $mode_id, true );
		} else {
			return $this->get( 'clone_mode' ) === $mode_id;
		}
	}
}

/**
 * Get the current singleton request instance
 *
 * @return NS_Cloner_Request
 */
function ns_cloner_request() {
	return NS_Cloner_Request::instance();
}

PKW�1\�Q~L]]ns-compatibility.phpnu�[���<?php
/**
 * Cloner Compatibility filters / functions.
 *
 * Location for any plugin-specific fixes, filters, or patches to keep them from cluttering up the main plugin.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Add known plugins with global tables to the global table list
 */
add_filter(
	'ns_cloner_global_table_patterns',
	function( $global_patterns ) {
		$plugin_patterns = [
			'domain_mapping.*',   // Domain mapping tables.
			'3wp_broadcast_.*',   // 3wp broadcast tables.
			'bp_.*',              // BuddyPress tables.
		];
		return array_merge( $global_patterns, $plugin_patterns );
	}
);

/**
 * Don't drop main slimstat table because it will cause a foreign key error
 * NOTE: this may cause problems in clone over mode - will have to address that down the road if necessary
 */
add_filter(
	'ns_cloner_do_drop_target_table',
	function( $do, $table ) {
		if ( strpos( $table, 'slim_stats' ) !== false ) {
			$do = false;
		}
		return $do;
	},
	10,
	2
);

/**
 * Skip copying options certain plugin options, because they will be created first
 * by the plugin and will result in a duplicate key error, or cause some other problem.
 */
add_filter(
	'ns_cloner_do_copy_row',
	function( $do, $row ) {
		$plugin_opts = [];
		// Collisimo Shipping Methods for WooCommerce.
		$plugin_opts = array_merge( $plugin_opts, [ 'lpc_db_version' ] );
		// Jetpack.
		$plugin_opts = array_merge( $plugin_opts, [ 'jetpack_activated', 'jetpack_private_options' ] );
		// WC Multilingual.
		$plugin_opts = array_merge( $plugin_opts, [ 'wcml_currency_switcher_template_objects' ] );
		// WP Mail SMTP.
		$plugin_opts = array_merge( $plugin_opts, [ 'mail_bank_update_database', 'mail-bank-version-number', 'mb_admin_notice' ] );
		// WordFence.
		$plugin_opts = array_merge( $plugin_opts, [ 'wordfence_installed' ] );
		// Yoast WP SEO.
		$plugin_opts = array_merge( $plugin_opts, [ 'wpseo_ryte' ] );
		// Woo Discount Rules.
		$plugin_opts = array_merge( $plugin_opts, [ 'awdr_activity_log_version' ] );
		// Freemius.
		$plugin_opts = array_merge( $plugin_opts, [ 'fs_accounts' ] );
		// Skip copying any of the above listed option rows.
		if ( isset( $row['option_name'] ) && in_array( $row['option_name'], $plugin_opts, true ) ) {
			$do = false;
		}
		// Handle other patterns that should be excluded.
		if ( isset( $row['option_name'] ) && preg_match( '/^gadwp_cache/', $row['option_name'] ) ) {
			$do = false;
		}

		return $do;
	},
	10,
	2
);

/**
 * Skip copying options certain plugin options, because they will be created first
 * by the plugin and will result in a duplicate key error, or cause some other problem.
 */
add_filter(
	'ns_cloner_do_search_replace',
	function( $do, $row ) {
		$excluded_meta = [];
		// WP Simple Pay has Stripe plan objects encoded.
		$excluded_meta = array_merge( $excluded_meta, [ '_single_plan_object' ] );
		// Skip doing search/replace on any of the above listed meta rows.
		if ( isset( $row['meta_key'] ) && in_array( $row['meta_key'], $excluded_meta, true ) ) {
			$do = false;
		}

		return $do;
	},
	10,
	2
);

/**
 * Clear WP Engine cache on completion because cloned sites won't use the correct
 * theme + options without flushing if object caching is enabled.
 * Based from https://github.com/a7/wpe-cache-flush/ and issue #1 on that repo.
 */
add_action(
	'ns_cloner_process_finish',
	function() {
		if ( defined( 'PWP_NAME' ) ) {
			$wpe_nonce    = wp_create_nonce( PWP_NAME . '-config' );
			$wpe_endpoint = 'admin.php?page=wpengine-common&purge-all=1&_wpnonce=' . $wpe_nonce;
			wp_remote_get( is_multisite() ? network_admin_url( $wpe_endpoint ) : admin_url( $wpe_endpoint ) );
		}
	},
	10,
	99
);

/**
 * SEO by Rank Math Pro runs activation that triggers a fatal error.
 * Have to remove manually because Rank Math doesn't give any hook or access to use remove_action.
 */
add_action(
	'ns_cloner_process_init',
	function() {
		if ( class_exists( '\RankMathPro\Installer' ) ) {
			global $wp_filter;
			foreach ( $wp_filter['wpmu_new_blog']->callbacks as $priority => $callbacks ) {
				foreach ( $callbacks as $key => $fn ) {
					if ( preg_match( '/activate_blog$/', $key ) ) {
						unset( $wp_filter['wpmu_new_blog']->callbacks[ $priority ][ $key ] );
					}
				}
			}
		}
	}
);
PKW�1\�
W@@class-ns-cloner-report.phpnu�[���<?php
/**
 * Cloner Reporting class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Report class.
 *
 * Utility class to store pieces of data about the cloning process (objects cloned, etc)
 * that should be reported to the user at the end of the process.
 */
class NS_Cloner_Report {

	/**
	 * Options key to save report under
	 *
	 * @var string
	 */
	private $report_key = 'ns_cloner_report';

	/**
	 * Save a single report item
	 *
	 * @param string $key Key of report data item.
	 * @param mixed  $value Value of report data item.
	 *
	 * @return bool
	 */
	public function add_report( $key, $value ) {
		$reports         = $this->get_all_reports();
		$reports[ $key ] = $value;
		return update_site_option( $this->report_key, $reports );
	}

	/**
	 * Increase the count for a numeric report item
	 *
	 * @param string $key Key of report item.
	 * @param int    $value Amount to increase it.
	 */
	public function increment_report( $key, $value ) {
		$reports = $this->get_all_reports();
		if ( isset( $reports[ $key ] ) ) {
			$value = $reports[ $key ] + $value;
		}
		$this->add_report( $key, $value );
	}

	/**
	 * Add a non-fatal warning to the report
	 *
	 * @param string $message Text to display in notice.
	 */
	public function add_notice( $message ) {
		ns_cloner()->log->log( [ 'WRITING notice:', $message ] );
		$notices   = $this->get_report( '_notices' ) ?: [];
		$notices[] = $message;
		$this->add_report( '_notices', $notices );
	}

	/**
	 * Get single report item
	 *
	 * @param string $key Key of report data item.
	 * @return mixed|null
	 */
	public function get_report( $key ) {
		$reports = $this->get_all_reports();
		return isset( $reports[ $key ] ) ? $reports[ $key ] : null;
	}

	/**
	 * Get an array of all saved report items
	 *
	 * @return array
	 */
	public function get_all_reports() {
		return get_site_option( $this->report_key );
	}

	/**
	 * Get an HTML template containing rendered report data
	 *
	 * @return string
	 */
	public function get_html() {
		ob_start();
		ns_cloner()->render( 'report' );
		return ob_get_clean();
	}

	/**
	 * Delete all saved report items
	 *
	 * @return void
	 */
	public function clear_all_reports() {
		delete_site_option( $this->report_key );
	}

	/**
	 * Save the start time for this cloning process
	 */
	public function set_start_time() {
		$this->add_report( '_start_time', microtime( true ) );
	}

	/**
	 * Get the start time for this cloning process
	 *
	 * @param bool $prepared Whether to format the raw timestamp before returning.
	 * @return string
	 */
	public function get_start_time( $prepared = true ) {
		$start_time = $this->get_report( '_start_time' );
		return $prepared ? $this->prepare_time( $start_time ) : $start_time;
	}

	/**
	 * Save the end time for this cloning process
	 */
	public function set_end_time() {
		$this->add_report( '_end_time', microtime( true ) );
	}

	/**
	 * Get the end time for this cloning process
	 *
	 * @param bool $prepared Whether to format the raw timestamp before returning.
	 * @return string
	 */
	public function get_end_time( $prepared = true ) {
		$end_time = $this->get_report( '_end_time' );
		return $prepared ? $this->prepare_time( $end_time ) : $end_time;
	}

	/**
	 * Get the amount of time elapsed since the saved start time
	 *
	 * @return float
	 */
	public function get_elapsed_time() {
		return microtime( true ) - $this->get_start_time( false );
	}

	/**
	 * Get date from miliseconds
	 *
	 * @param int $time Raw time value (in ms) to format.
	 * @return string
	 */
	public function prepare_time( $time ) {
		$date = DateTime::createFromFormat( 'U.u', $time );
		return $date ? $date->format( 'Y-m-d H:i:s' ) : '';
	}

}
PKW�1\Q��AhAhAlanguages/ns-cloner.potnu�[���# Copyright (C) 2019 Never Settle
# This file is distributed under the same license as the NS Cloner - Site Copier plugin.
msgid ""
msgstr ""
"Project-Id-Version: NS Cloner - Site Copier 4.0.0\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ns-cloner-site-copier\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-07-22T21:51:55+02:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"X-Generator: WP-CLI 2.2.0\n"
"X-Domain: ns-cloner\n"

#. Plugin Name of the plugin
msgid "NS Cloner - Site Copier"
msgstr ""

#. Plugin URI of the plugin
#. Author URI of the plugin
msgid "https://neversettle.it"
msgstr ""

#. Description of the plugin
msgid "The amazing NS Cloner creates a new site as an exact clone / duplicate / copy of an existing site with theme and all plugins and settings intact in just a few steps. Check out NS Cloner Pro for additional powerful add-ons and features!"
msgstr ""

#. Author of the plugin
msgid "Never Settle"
msgstr ""

#: class-ns-cloner-process-manager.php:146
msgid "Validation errors found."
msgstr ""

#: class-ns-cloner-process-manager.php:255
msgid "Start Time"
msgstr ""

#: class-ns-cloner-process-manager.php:256
msgid "End Time"
msgstr ""

#: class-ns-cloner-process-manager.php:257
msgid "Total Time"
msgstr ""

#. translators: number of items copied in clone operation
#: class-ns-cloner-process-manager.php:270
msgid "%d item processed"
msgid_plural "%d items processed"
msgstr[0] ""
msgstr[1] ""

#. translators: number of text replacements made on site content
#: class-ns-cloner-process-manager.php:278
msgid "%d replacement made"
msgid_plural "%d replacements made"
msgstr[0] ""
msgstr[1] ""

#: class-ns-cloner-process-manager.php:279
msgid "Replacements"
msgstr ""

#: class-ns-cloner-process-manager.php:309
#: templates/ns-template-logs.php:117
msgid "Log File"
msgstr ""

#: class-ns-cloner-process-manager.php:388
msgid "Source and target prefix the same. Cannot clone tables."
msgstr ""

#: class-ns-cloner-process-manager.php:456
msgid "An unknown error occurred. Check the logs for info."
msgstr ""

#: ns-cloner.php:254
msgid "Standard Clone"
msgstr ""

#: ns-cloner.php:255
msgid "Clone"
msgstr ""

#: ns-cloner.php:256
msgid "Take an existing site and create a brand new copy of it at another url."
msgstr ""

#: ns-cloner.php:264
msgid "Site cloned successfully!"
msgstr ""

#: ns-cloner.php:267
msgid "Source Site"
msgstr ""

#: ns-cloner.php:270
msgid "Target Site"
msgstr ""

#: ns-cloner.php:356
#: ns-cloner.php:357
msgid "NS Cloner"
msgstr ""

#: ns-cloner.php:371
#: ns-cloner.php:372
msgid "Logs / Status"
msgstr ""

#: ns-cloner.php:497
msgid "You don't have sufficient permissions for this action."
msgstr ""

#: processes/class-ns-cloner-files-process.php:31
msgid "Files"
msgstr ""

#: processes/class-ns-cloner-rows-process.php:31
msgid "Rows"
msgstr ""

#: processes/class-ns-cloner-tables-process.php:31
msgid "Tables"
msgstr ""

#: sections/class-ns-cloner-section-additional-settings.php:44
msgid "Additional Settings"
msgstr ""

#: sections/class-ns-cloner-section-additional-settings.php:46
msgid "Debugging"
msgstr ""

#: sections/class-ns-cloner-section-additional-settings.php:49
msgid "Enable logging"
msgstr ""

#: sections/class-ns-cloner-section-additional-settings.php:53
msgid "Logs may contain sensitive information from your database."
msgstr ""

#: sections/class-ns-cloner-section-additional-settings.php:54
msgid "If you enable logging, it's recommended to go to NS Cloner > Logs and clear your logs when you are finished."
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:46
msgid "Copy Tables"
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:48
msgid "All database tables will be copied by default. "
msgstr ""

#. translators: URL to plugin info page
#: sections/class-ns-cloner-section-advertise-pro.php:52
msgid "For more efficiency and precise control over which tables are cloned, check out <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a>."
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:61
msgid "Post Types"
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:63
msgid "All post types will be copied by default. "
msgstr ""

#. translators: URL to plugin info page
#: sections/class-ns-cloner-section-advertise-pro.php:67
msgid "With <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> you can customize which post types are cloned, giving you even more powerful flexibility."
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:76
msgid "Search and Replace"
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:78
msgid "By default, the site name and URL will be replaced in all cloned content and settings. "
msgstr ""

#. translators: URL to plugin info page
#: sections/class-ns-cloner-section-advertise-pro.php:82
msgid " <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> offers the ability to perform an unlimited number of additional custom search and replace operations."
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:91
msgid "Copy Users"
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:93
msgid "By default, just the current admin user (you) will be automatically added as a user on the new site. "
msgstr ""

#. translators: URL to plugin info page
#: sections/class-ns-cloner-section-advertise-pro.php:97
msgid "With <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> you can auto-generate new admin users, as well as have the option to clone all the existing users."
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:106
msgid "Copy Media Files"
msgstr ""

#: sections/class-ns-cloner-section-advertise-pro.php:108
msgid "By default, all media library files will be copied by default to the new site, and links referring to them updated. "
msgstr ""

#. translators: URL to plugin info page
#: sections/class-ns-cloner-section-advertise-pro.php:112
msgid "<a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> enables you to control uploads cloning, so your cloned site could optionally continue to refer to the source site's media files."
msgstr ""

#: sections/class-ns-cloner-section-create-target.php:47
msgid "Create New Site"
msgstr ""

#: sections/class-ns-cloner-section-create-target.php:47
msgid "Create Site"
msgstr ""

#: sections/class-ns-cloner-section-create-target.php:49
msgid "Give the target site a title"
msgstr ""

#: sections/class-ns-cloner-section-create-target.php:52
msgid "New Site Title"
msgstr ""

#: sections/class-ns-cloner-section-create-target.php:53
msgid "Site title"
msgstr ""

#: sections/class-ns-cloner-section-create-target.php:56
msgid "Give the target site a URL"
msgstr ""

#: sections/class-ns-cloner-section-create-target.php:60
#: sections/class-ns-cloner-section-create-target.php:64
msgid "Site URL"
msgstr ""

#: sections/class-ns-cloner-section-select-source.php:44
msgid "Select Source"
msgstr ""

#: sections/class-ns-cloner-section-select-source.php:47
#: sections/class-ns-cloner-section-select-source.php:52
msgid "The cloning source is set to the current site."
msgstr ""

#: sections/class-ns-cloner-section-select-source.php:48
msgid "This is configurable for WordPress multisite, but here you only have one site installed to choose from, so it's been automatically selected for you."
msgstr ""

#: sections/class-ns-cloner-section-select-source.php:53
msgid "You can use this plugin in Network mode  to choose from other source sites."
msgstr ""

#: sections/class-ns-cloner-section-select-source.php:60
msgid "Select a site to clone"
msgstr ""

#: sections/class-ns-cloner-section-select-source.php:76
msgid "If you haven't already, now is a great time to set up a \"template\" site exactly the way you want the new clone site to start out (theme, plugins, settings, etc.)."
msgstr ""

#: templates/ns-template-logs.php:24
msgid "Logs & Status"
msgstr ""

#: templates/ns-template-logs.php:33
msgid "Scheduled Operations"
msgstr ""

#: templates/ns-template-logs.php:37
msgid "No scheduled cloning operations."
msgstr ""

#: templates/ns-template-logs.php:41
msgid "Scheduled"
msgstr ""

#: templates/ns-template-logs.php:42
msgid "Type"
msgstr ""

#: templates/ns-template-logs.php:43
msgid "Created"
msgstr ""

#: templates/ns-template-logs.php:44
#: templates/ns-template-logs.php:62
#: templates/ns-template-logs.php:119
msgid "View"
msgstr ""

#: templates/ns-template-logs.php:45
#: templates/ns-template-logs.php:73
msgid "Delete"
msgstr ""

#: templates/ns-template-logs.php:81
msgid "Scheduled operations are created when someone clicks the clone button while another cloning operation is still running."
msgstr ""

#: templates/ns-template-logs.php:82
msgid " They may also be created via the command line or by frontend cloning (from member registrations) with Cloner Pro."
msgstr ""

#: templates/ns-template-logs.php:89
msgid "Manage Logs"
msgstr ""

#: templates/ns-template-logs.php:93
#: templates/ns-template-logs.php:112
msgid "No logs currently saved."
msgstr ""

#: templates/ns-template-logs.php:96
msgid "Logs may contain sensitive information from your database, so it's good security practice to clear them once no longer needed."
msgstr ""

#: templates/ns-template-logs.php:97
msgid "Make sure that you don't need them for support or debugging, though, because they will be deleted permanently once cleared."
msgstr ""

#: templates/ns-template-logs.php:100
msgid "Delete All Logs"
msgstr ""

#: templates/ns-template-logs.php:108
msgid "View Logs"
msgstr ""

#: templates/ns-template-logs.php:116
msgid "Date"
msgstr ""

#: templates/ns-template-logs.php:118
msgid "Size"
msgstr ""

#: templates/ns-template-logs.php:136
msgid "View Log"
msgstr ""

#: templates/ns-template-main.php:29
msgid "Select Cloning Mode"
msgstr ""

#: templates/ns-template-main.php:31
msgid "Collapse All"
msgstr ""

#: templates/ns-template-main.php:35
msgid "Expand All"
msgstr ""

#: templates/ns-template-main.php:40
msgid "No cloning modes are currently available for this site."
msgstr ""

#: templates/ns-template-main.php:61
msgid "WARNING:"
msgstr ""

#: templates/ns-template-main.php:62
msgid "We have made an incredibly complex process ridiculously easy with this powerful plugin. We have tested thoroughly and used this exact tool in our own live multisite environments. However, our comfort level should not dictate your precautions. If you're confident in your testing and back-up scheme - which you should have in place anyway ;) - then by all means - start cloning like there's no tomorrow!"
msgstr ""

#: templates/ns-template-main.php:81
msgid "Refresh"
msgstr ""

#: templates/ns-template-main.php:82
msgid "Cancel"
msgstr ""

#: templates/ns-template-main.php:93
msgid "started..."
msgstr ""

#: templates/ns-template-main.php:98
msgid "Current status"
msgstr ""

#: templates/ns-template-main.php:107
msgid "items processed"
msgstr ""

#: templates/ns-template-main.php:115
msgid "Close"
msgstr ""

#: templates/ns-template-main.php:116
msgid "finished..."
msgstr ""

#: templates/ns-template-sidebar-sub.php:16
#: templates/ns-template-sidebar.php:16
msgid "Support"
msgstr ""

#: templates/ns-template-sidebar-sub.php:19
#: templates/ns-template-sidebar.php:19
msgid "Have any issues with the Cloner, or ideas on how to make it better? We'd love to hear from you."
msgstr ""

#: templates/ns-template-sidebar-sub.php:23
#: templates/ns-template-sidebar.php:23
msgid "Support & Feature Requests"
msgstr ""

#: templates/ns-template-sidebar-sub.php:30
#: templates/ns-template-sidebar.php:44
msgid "Don't Miss Anything!"
msgstr ""

#: templates/ns-template-sidebar-sub.php:32
#: templates/ns-template-sidebar.php:46
msgid "Receive updates, beta invites, articles and more!"
msgstr ""

#: templates/ns-template-sidebar-sub.php:43
#: templates/ns-template-sidebar.php:113
msgid "Before you go..."
msgstr ""

#: templates/ns-template-sidebar-sub.php:45
#: templates/ns-template-sidebar.php:115
msgid "If you're going to open a support request, could you please copy the log urls listed below and paste them at the bottom of your support request so we can give you better and faster help? Thank you!"
msgstr ""

#: templates/ns-template-sidebar-sub.php:48
#: templates/ns-template-sidebar.php:118
msgid "(Please send privately, not on a forum - some sensitive info from your database could be included in the logs.)"
msgstr ""

#: templates/ns-template-sidebar-sub.php:52
#: templates/ns-template-sidebar.php:122
msgid "Continue to Support"
msgstr ""

#: templates/ns-template-sidebar.php:30
msgid "Do you like NS Cloner?"
msgstr ""

#: templates/ns-template-sidebar.php:33
msgid "If the Cloner has saved you lots of time, tell everyone with a 5-star rating!"
msgstr ""

#: templates/ns-template-sidebar.php:37
msgid "Rate it 5 Stars"
msgstr ""

#: templates/ns-template-sidebar.php:71
msgid "Highlighted Plugin"
msgstr ""

#: templates/ns-template-sidebar.php:94
msgid "Built by"
msgstr ""

#. translators: URL to plugin info page
#: templates/ns-template-warnings.php:32
msgid "Your current version of <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> is not supported. Please update to access all Pro features."
msgstr ""

#: templates/ns-template-warnings.php:43
msgid "The free version of NS Cloner only works on WordPress Multisite."
msgstr ""

#. translators: URL to network cloner page
#: templates/ns-template-warnings.php:47
msgid "The free version of NS Cloner only works as a Multisite Network plugin (<a href=\"%s\">go here to access the Network Cloner page</a>)."
msgstr ""

#. translators: URL to network plugins page
#: templates/ns-template-warnings.php:53
msgid "The free version of NS Cloner only works as a Network Activated plugin. Go to <a href=\"%s\">Network Admin > Plugins</a> to activate it."
msgstr ""

#. translators: URL to plugin info page
#: templates/ns-template-warnings.php:58
msgid "For cloning to and from single sites, check out <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a>."
msgstr ""

#. translators: URL to network cloner page
#: templates/ns-template-warnings.php:70
msgid "Just a heads up: the NS Cloner is most powerful and has additional features available when used as a Multisite Network plugin. You can <a href=\"%s\">go here to access the Network Cloner page</a>."
msgstr ""

#. translators: URL to network plugins page
#: templates/ns-template-warnings.php:77
msgid "Just a heads up: the NS Cloner is most powerful and has additional features available as a Network Activated plugin. You can go to <a href=\"%s\">Network Admin > Plugins</a> to activate it."
msgstr ""

#. translators: %s: path to logs directory.
#: templates/ns-template-warnings.php:90
msgid "The logs directory for NS Cloner (<code>%s</code>) is not writable by the server. The Cloner will still work, but logs won't be available in case anything needs debugging."
msgstr ""

#. translators: %d: max execution time in seconds.
#: templates/ns-template-warnings.php:104
msgid "This host's max_execution_time is set to %d seconds - we generally recommend at least 60 seconds for running the Cloner."
msgstr ""

#. translators: %d: max execution time in seconds.
#: templates/ns-template-warnings.php:105
msgid "You may want to increase the max_execution_time in php.ini (or wherever your host supports PHP configuration updates) to avoid any timeout errors."
msgstr ""

#. translators: %d: memory limit in megabytes.
#: templates/ns-template-warnings.php:114
msgid "This host's memory_limit is set to %dMB - we generally recommend at least 128MB for running the Cloner."
msgstr ""

#. translators: %d: memory limit in megabytes.
#: templates/ns-template-warnings.php:115
msgid "You may want to increase the memory_limit in php.ini (or wherever your host supports PHP configuration updates) to avoid any out-of-memory errors."
msgstr ""

#. translators: %s: url to network setup page.
#: templates/ns-template-warnings.php:139
msgid "Please check the recommended htaccess settings <a href=\"%s\" target=\"_blank\">here</a> and make sure your .htaccess file matches."
msgstr ""
PKW�1\&�w=:0:0
readme.txtnu�[���=== NS Cloner - Site Copier ===
Contributors: neversettle
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=53JXD4ENC8MM2&rm=2
Tags: automate, duplicate, copy, copier, clone, cloner, multisite, network, template
Requires at least: 4.0.0
Tested up to: 5.8
Requires PHP: 7.0
Stable tag: 4.1.9.3
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

The NS Cloner saves multisite admins and developers TONS of time by cloning existing sites in a multisite network to a completely new site in a few seconds.

== Description ==

This is by far the easiest, fastest, and most user-friendly way you will ever create fully configured sites on your multisite networks. The NS Cloner will take any existing site on your WordPress multisite network and clone it into a new site that is completely identical in theme & theme settings, plugins & plugin configurations, content, pictures, videos, and site settings.

Everything is preserved and intelligent replacements are made so that the new site settings reflect your choices for the name and title, and have automatic URL replacements and other background updates to make sure the new site works exactly the same way as if you had taken the time to set it all up manually.

**Important:** this plugin *only* works with WordPress Multisite (although the pro version works for single sites as well). You will find its menu in your network administration dashboard (wp-admin/network).

= Typical Workflow for using the NS Cloner =
1. Set up 1 or more sites exactly the way you want your clones to start out.
2. Go to your Network Dashboard > NS Cloner.
3. Select the site you that want to clone, and enter the desired URL and title of the new site.
4. Clone away with one click!

Yes, it really is that easy.

= Primary Use Cases =
* Developers who host and manage multiple client sites in their own multisite environment - this will allow you to rapidly roll out new baseline sites with all your favorite standard plugins and configurations in place. No more tedious manual repetitive entry!
* Designers who want to be able to create several versions of sites to test and play with different theme designs in parallel, without wasting time with unnecessary duplication.
* Teams who want to have a quick way to set up staging sites for collaboration, or effortlessly duplicate content for regional versions of sites, etc.
* Organizations which provide "member" sites and want to be able to reduce the site spin up time to almost nothing.
* Affiliates that host numerous sites through multisite and are looking for a way to increase reach and decrease deployment times.

== Features ==

= Core Features =
* Copies an entire site in seconds
* Works in subdomain or subdirectory mode
* Copies all widgets, menus, and theme and plugin settings
* Copies all pages, posts, custom post types and taxonomies
* Copies all uploaded media files and associated data
* Works in the background to avoid timeouts or memory shortages on large sites
* You can close your tab without interrupting cloning, or stay and watch the progress live
* Advanced validation and preemptive issue detection
* Robust process logging to help with troubleshooting
* Hook-rich cloning pipeline for developers to extend
* Translation ready

= Pro Features =

For even more powerful functionality, [check out NS Cloner Pro](https://neversettle.it/buy/wordpress-plugins/ns-cloner-pro/). In addition to all the free core features, Pro includes:

* **Teleport** *(new)* - remote cloning power: clone a subsite to a remote network, or even teleport an entire multisite network to a remote location.
* **Single Site** *(new)* - gain the ability to clone standard single sites, not just multisite, and even clone between single and multisite or vice versa.
* **WP CLI Addon** *(new)* - easily copy sites directly from the command line.
* **Search & Replace** - perform unlimited, effortless custom search and replace on cloned content.
* **Table Manager** - easily manage exactly which database tables are cloned.
* **Users Cloning** - ability to clone all WordPress users and their permissions, or instantly create new users for cloned sites.
* **Presets** - save commonly used cloning settings as shortcuts for even ore time savings.

== Installation ==

1. Log in to your WordPress network as a multisite super admin and go to /wp-admin/network
2. Use the Dashboard > Plugins > Add New tools to install NS Cloner from the WordPress.org repository or install by uploading the zip file
3. Network Activate the NS Cloner through the 'Plugins' menu in WordPress
4. Access the NS Cloner from its main menu on the Network Dashboard (/wp-admin/network)

= Standard Precautions and Notes =
* Unlike some other tools, NS Cloner supports cloning the root site (ID=1). When cloning the root site, the Cloner will automatically exclude all global network WordPress tables (like wp_blogs) as well as global tables for some common network plugins like BuddyPress. It's impossible, though, for the Cloner to recognize every network-level table for every plugin out there, so it's possible that some network-level plugin tables could be copied by the Cloner incorrectly, which could result in issues, depending on the plugin. The table manager add-on included in pro is perfect for unique scenarios where you need total table-level cloning control.
* We always try to help (and you can see the proof of that in the plugin support forum here), but we cannot promise support to users for this free version, especially with issues resulting from non-standard environments.
* We have used the NS Cloner on production systems for years without issues. That doesn't mean your scenario won't find some new condition that could cause you some headaches. Unlikely, but always possible. We recommend getting familiar with it on a test system before you deploy it to a critical network.
* And for the love - backup your data. This plugin operates at the database level to work its magic. We've run it hundreds of times on our own sites and client sites, and tested it thoroughly. It's safe. But don't take our word for it.

== Frequently Asked Questions ==

= How do I contact support, provide feedback, or make a feature request? =
You can browse our Knowledge Base, add or vote on Feature Requests, or contact us with an issue at [support.neversettle.it](http://support.neversettle.it/)

= Where can I find more documentation? =
[See these articles](https://neversettle.it/documentation/ns-cloner/) for additional information on using NS Cloner.

= What exactly does the NS Cloner copy? =
The Cloner copies everything you need to have a totally identical twin site: all media uploads, posts, pages, custom post types, taxonomies, comments, menus, WordPress options, theme and plugin settings (including which ones are active).

Users and roles are not copied (that's a pro feature), and theme/plugin files are not copied because the same files are shared by the whole multisite network, so there's no need to copy them when cloning inside a network.

= Can I clone an individual site that's not part of a network (non-multisite)? =
That is a pro feature - so, yes! With Pro you can easily clone a single WordPress site to another single site. You can even clone a site out of a network to its own individual install or vice versa.

= What happens if my site is really large? =
You're in luck! NS Cloner V4 has new background cloning capability, so you should be able to clone a site of almost any size without running into a "white screen of death" from timeouts or memory limits. You can even close your browser and come back to check on it later without interrupting the clone!


== Screenshots ==

1. Main cloning options.
2. Cloning in progress.

== Changelog ==

= 4.1.9.3 - 2022.01.06 =
* Optimize with reduction of unnecessary all hook when not cloning

= 4.1.9.2 - 2022.01.03 =
* Fix compatibility issue with WP Simple Pay

= 4.1.9.1 - 2021.12.23 =
* Optimize performance by preventing initialization for non-admin requests
* Fix unnecessary object cache flushes and add filter to disable entirely

= 4.1.8 - 2021.09.30 =
* Optimize WP site list for networks with large numbers of sites
* Add proactive resolution attempts for duplicate option keys during cloning
* Fix misc. other plugin compatibility issues

= 4.1.7 - 2021.09.02 =
* Apply styling tweaks to admin interface
* Fix bug with networks where the root/main blog ID is not equal to 1
* Fix bug with "Delete All Plugin Data" reset button not working fully
* Fix compatibility issue with Collisimo Shipping Methods plugin

= 4.1.6 - 2021.05.31 =
* Update composer dependencies for PHP 8 compatibility

= 4.1.5.3 - 2021.02.10 =
* Fix compatibility error with SEO by Rank Math Pro

= 4.1.5.2 - 2021.02.03 =
* Fix bug with new site title not being applied after cloning

= 4.1.5.1 - 2021.02.02 =
* Fix slug change that broke compatibility with pro version

= 4.1.5 - 2021.01.31 =
* Add wp_cache_flush() call to resolve object caching issues
* Add option to clear plugin data for stuck processes
* Update internationalization to follow WP recommendations
* Fix misc. warnings, typos

= 4.1.4 - 2020.12.30 =
* Fix visibility error on magic wakeup method
* Fix cache clearing mechanism for WP Engine sites
* Fix conflict with Woo Discount Rules

= 4.1.3 - 2020.11.17 =
* Add new options to help avoid database view / constraint errors
* Make compatible with pro SFTP transfer feature
* Fix inefficient database calls, unresponsive analytics setting UI

= 4.1.0 - 2020.09.25 =
* Add productivity statistics capture and analytics
* Fix jQuery 1.8 compatibility, debug notices, more misc. bugfixes

= 4.0.9 - 2020.06.15 =
* Add new performance control options
* Simplify and improve new site URL validation
* Fix handling for memory limit of -1
* Fix compatibility issue with Yoast WP SEO
* Fix other bugs with stalled clone recovery, notices from options table, etc.

= 4.0.8 - 2020.06.11 =
* Add automatic cache flush after cloning
* Add new filters for performance tweaking and search/replace control
* Fix upload_path replacement for root site with hardcoded upload_path
* Fix sites with non-latin chars in site title being unavailable for cloning
* Fix other bugs with failed finishes, database prefix irregularities, etc.

= 4.0.7 - 2020.01.30 =
* Fix non-prefixed custom tables being included in root site clone
* Fix private/public blog property not being reflected on cloned sites

= 4.0.6 - 2020.01.13 =
* Update admin styles for WP 5.3 UI changes
* Add new recovery capability for stalled cloning processes
* Fix bugs with serialized search/replace updates, unnecessary sitemeta cloning

= 4.0.5 - 2019.10.17 =
* Enable number-only site names
* Add automatic cache-flush at end of cloning for WPEngine sites
* Fix memory/time overload when queueing very large tables
* Fix misc. plugin compatibility issues

= 4.0.4 - 2019.09.02 =
* Fix database handling for null values
* Fix fatal site creation error in pre-5.1 WordPress
* Fix error on servers that don't allow multiple SQL statements in one query
* Fix misc other bugs and plugin compatibility issues

= 4.0.3 - 2019.08.19 =
* Fix missing rows due to lost insert or incorrect row query
* Fix max_allowed_packet database error

= 4.0.2 - 2019.08.15 =
* Fix timing conflicts for cleanup tasks.
* Fix issue where process would keep running after manually cancelling.
* Rewrite row processing class for much better performance and fewer queries.
* Add fallback AJAX process dispatching for environments where background requests stall.
* Add queue batching for large tables.
* Improve debug logging.

= 4.0.1 - 2019.07.26 =
* Fix lock timing on background processes to prevent frozen or conflicting processes.
* Fix handling for SQL views - exclude from table cloning and create at end instead.
* Fix empty target site url caused by object caching on some servers.

= 4.0.0 - 2019.07.22 =
* Release all new rebuilt V4.

= Pre V4.0 - see changelog.txt =

== Upgrade Notice ==

= 4.0.0 =
All new V4, with upgrades to everything - enhanced stability, power, interface and features.PKW�1\$×0
0
2sections/class-ns-cloner-section-create-target.phpnu�[���<?php
/**
 * Create Target Section Class
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Class NS_Cloner_Section_Create_Target
 *
 * Adds and validates options for url and title of the new subsite to be created.
 */
class NS_Cloner_Section_Create_Target extends NS_Cloner_Section {

	/**
	 * Mode ids that this section should be visible and active for.
	 *
	 * @var array
	 */
	public $modes_supported = array( 'core' );

	/**
	 * DOM id for section box.
	 *
	 * @var string
	 */
	public $id = 'create_target';

	/**
	 * Priority relative to other section boxes in UI.
	 *
	 * @var int
	 */
	public $ui_priority = 300;

	/**
	 * Output content for section settings box on admin page.
	 */
	public function render() {
		if ( ! is_multisite() ) {
			return;
		}
		$this->open_section_box( __( 'Create New Site', 'ns-cloner-site-copier' ), __( 'Create Site', 'ns-cloner-site-copier' ) );
		?>
		<h5><label for="target_title"><?php esc_html_e( 'Give the target site a title', 'ns-cloner-site-copier' ); ?></label></h5>
		<div class="ns-cloner-input-group">
			<input type="text" name="target_title"
				placeholder="<?php esc_attr_e( 'New Site Title', 'ns-cloner-site-copier' ); ?>"
				data-label="<?php esc_attr_e( 'Site title', 'ns-cloner-site-copier' ); ?>"
				data-required="1" />
		</div>
		<h5><label for="target_name"><?php esc_html_e( 'Give the target site a URL', 'ns-cloner-site-copier' ); ?></label></h5>
		<div class="ns-cloner-input-group">
		<?php if ( is_subdomain_install() ) : ?>
			<label><?php echo is_ssl() ? 'https://' : 'http://'; ?></label>
			<input type="text" name="target_name" class="ns-cloner-quick-validate" data-label="<?php esc_attr_e( 'Site URL', 'ns-cloner-site-copier' ); ?>" />
			<label>.<?php echo esc_html( preg_replace( '|^www\.|', '', get_current_site()->domain ) ); ?></label>
		<?php else : ?>
			<label><?php echo esc_url( trailingslashit( site_url() ) ); ?></label>
			<input type="text" name="target_name" class="ns-cloner-quick-validate" data-label="<?php esc_attr_e( 'Site URL', 'ns-cloner-site-copier' ); ?>" />
		<?php endif; ?>
		</div>
		<?php
		$this->close_section_box();
	}

	/**
	 * Check ns_cloner_request() and any validation error messages to $this->errors.
	 */
	public function validate() {
		$site_errors = ns_wp_validate_site(
			ns_cloner_request()->get( 'target_name' ),
			ns_cloner_request()->get( 'target_title' )
		);
		foreach ( $site_errors as $error ) {
			$this->errors[] = $error;
		}
	}

}
PKW�1\T�002sections/class-ns-cloner-section-advertise-pro.phpnu�[���<?php
/**
 * Advertise Pro Section Class
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Class NS_Cloner_Section_Advertise_Pro
 *
 * Add several dummy sections to advertise Pro features.
 */
class NS_Cloner_Section_Advertise_Pro extends NS_Cloner_Section {

	/**
	 * Mode ids that this section should be visible and active for.
	 *
	 * @var array
	 */
	public $modes_supported = [ 'core' ];

	/**
	 * DOM id for section box.
	 *
	 * @var string
	 */
	public $id = 'advertise_pro';

	/**
	 * Priority relative to other section boxes in UI.
	 *
	 * @var int
	 */
	public $ui_priority = 750;

	/**
	 * Output content for section settings box on admin page.
	 */
	public function render() {

		// Tables.
		$this->open_section_box( __( 'Copy Tables', 'ns-cloner-site-copier' ) );
		echo '<p>';
		esc_html_e( 'All database tables will be copied by default. ', 'ns-cloner-site-copier' );
		printf(
			wp_kses(
				/* translators: URL to plugin info page */
				__( 'For more efficiency and precise control over which tables are cloned, check out <a href="%s" target="_blank">NS Cloner Pro</a>.', 'ns-cloner-site-copier' ),
				ns_wp_kses_allowed()
			),
			esc_url( NS_CLONER_PRO_URL )
		);
		echo '</p>';
		$this->close_section_box();

		// Post types.
		$this->open_section_box( __( 'Post Types', 'ns-cloner-site-copier' ) );
		echo '<p>';
		esc_html_e( 'All post types will be copied by default. ', 'ns-cloner-site-copier' );
		printf(
			wp_kses(
				/* translators: URL to plugin info page */
				__( 'With <a href="%s" target="_blank">NS Cloner Pro</a> you can customize which post types are cloned, giving you even more powerful flexibility.', 'ns-cloner-site-copier' ),
				ns_wp_kses_allowed()
			),
			esc_url( NS_CLONER_PRO_URL )
		);
		echo '</p>';
		$this->close_section_box();

		// Search and replace.
		$this->open_section_box( __( 'Search and Replace', 'ns-cloner-site-copier' ) );
		echo '<p>';
		esc_html_e( 'By default, the site name and URL will be replaced in all cloned content and settings. ', 'ns-cloner-site-copier' );
		printf(
			wp_kses(
				/* translators: URL to plugin info page */
				__( ' <a href="%s" target="_blank">NS Cloner Pro</a> offers the ability to perform an unlimited number of additional custom search and replace operations.', 'ns-cloner-site-copier' ),
				ns_wp_kses_allowed()
			),
			esc_url( NS_CLONER_PRO_URL )
		);
		echo '</p>';
		$this->close_section_box();

		// Users.
		$this->open_section_box( __( 'Copy Users', 'ns-cloner-site-copier' ) );
		echo '<p>';
		esc_html_e( 'By default, just the current admin user (you) will be automatically added as a user on the new site. ', 'ns-cloner-site-copier' );
		printf(
			wp_kses(
				/* translators: URL to plugin info page */
				__( 'With <a href="%s" target="_blank">NS Cloner Pro</a> you can auto-generate new admin users, as well as have the option to clone all the existing users.', 'ns-cloner-site-copier' ),
				ns_wp_kses_allowed()
			),
			esc_url( NS_CLONER_PRO_URL )
		);
		echo '</p>';
		$this->close_section_box();

		// Media files.
		$this->open_section_box( __( 'Copy Media Files', 'ns-cloner-site-copier' ) );
		echo '<p>';
		esc_html_e( 'By default, all media library files will be copied by default to the new site, and links referring to them updated. ', 'ns-cloner-site-copier' );
		printf(
			wp_kses(
				/* translators: URL to plugin info page */
				__( '<a href="%s" target="_blank">NS Cloner Pro</a> enables you to control uploads cloning, so your cloned site could optionally continue to refer to the source site\'s media files.', 'ns-cloner-site-copier' ),
				ns_wp_kses_allowed()
			),
			esc_url( NS_CLONER_PRO_URL )
		);
		echo '</p>';
		$this->close_section_box();

	}

}
PKW�1\�}�_CC8sections/class-ns-cloner-section-additional-settings.phpnu�[���<?php
/**
 * Additional Settings Section class
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Class NS_Cloner_Section_Additional_Settings
 *
 * Adds extra settings box to all modes (checkbox to enable additional detailed debug logging, etc.
 */
class NS_Cloner_Section_Additional_Settings extends NS_Cloner_Section {

	/**
	 * Mode ids that this section should be visible and active for.
	 *
	 * @var array
	 */
	public $modes_supported = [ 'core', 'clone_over', 'search_replace', 'clone_teleport' ];

	/**
	 * DOM id for section box.
	 *
	 * @var string
	 */
	public $id = 'additional_settings';

	/**
	 * Priority relative to other section boxes in UI.
	 *
	 * @var int
	 */
	public $ui_priority = 1000;

	/**
	 * Do any setup before starting the cloning process (like hooks to modify the process).
	 */
	public function process_init() {
	    add_filter( 'ns_cloner_rows_per_query', [ $this, 'filter_rows_per_query' ] );
	    add_filter( 'ns_cloner_progress_update_interval', [ $this, 'filter_progress_update_interval' ] );
	    add_filter( 'ns_cloner_skip_views', [ $this, 'filter_skip_views' ] );
	    add_filter( 'ns_cloner_skip_constraints', [ $this, 'filter_skip_constraints' ] );
	}

	/**
	 * Output content for section settings box on admin page.
	 */
	public function render() {
		$this->open_section_box( __( 'Additional Settings', 'ns-cloner-site-copier' ) );
		?>
		<h5><?php esc_html_e( 'Debugging', 'ns-cloner-site-copier' ); ?></h5>
		<label>
			<input type="checkbox" name="debug" />
			<?php esc_html_e( 'Enable logging', 'ns-cloner-site-copier' ); ?>
		</label>
		<p class="description">
			<strong>
			<?php esc_html_e( 'Logs may contain sensitive information from your database.', 'ns-cloner-site-copier' ); ?>
			<?php esc_html_e( 'If you enable logging, it\'s recommended to go to NS Cloner > Logs and clear your logs when you are finished.', 'ns-cloner-site-copier' ); ?>
			</strong>
		</p>
		<h5><?php esc_html_e( 'Performance', 'ns-cloner-site-copier' ); ?></h5>
		<div class="ns-cloner-input-group">
			<label class="before"><?php esc_html_e( 'Rows per query', 'ns-cloner-site-copier' ); ?></label>
			<input type="number" name="rows_per_query" placeholder="50" />
		</div>
		<p class="description">
			<?php esc_html_e( 'This controls how many database records will be copied at one time.', 'ns-cloner-site-copier' ); ?>
            <?php esc_html_e( 'You can make cloning faster by increasing this number, but if it\'s too large for your server to handle you\'ll see SQL errors and need to reduce this setting again.', 'ns-cloner-site-copier' ); ?>
		</p>
		<div class="ns-cloner-input-group">
			<label class="before"><?php esc_html_e( 'Progress update interval', 'ns-cloner-site-copier' ); ?></label>
			<input type="number" name="progress_update_interval" placeholder="5" />
		</div>
		<p class="description">
			<?php esc_html_e( 'This is the number of items (rows or files) to clone in between updating the progress values.', 'ns-cloner-site-copier' ); ?>
            <?php esc_html_e( 'You can make cloning faster by increasing this number, but the higher it is the more jumpy and less smooth/accurate the progress bar will be.', 'ns-cloner-site-copier' ); ?>
		</p>
        <h5><?php esc_html_e( 'Database', 'ns-cloner-site-copier' ); ?></h5>
        <label>
            <input type="checkbox" name="skip_views"/>
            <?php esc_html_e( 'Skip views?', 'ns-cloner-site-copier' ); ?>
        </label>
        <p class="description">
            <strong>
			    <?php esc_html_e( 'This will prevent attempting to clone any SQL views along with tables, which can be required by plugins but can sometimes result in permissions errors.', 'ns-cloner-site-copier' ); ?>
            </strong>
        </p>
        <label>
            <input type="checkbox" name="skip_constraints"/>
            <?php esc_html_e( 'Skip constraints?', 'ns-cloner-site-copier' ); ?>
        </label>
        <p class="description">
            <strong>
                <?php esc_html_e( 'This will prevent trying to re-apply any SQL constraints to cloned tables, which help ensure data integrity but can sometimes result in permissions errors.', 'ns-cloner-site-copier' ); ?>
            </strong>
        </p>
		<?php
		$this->close_section_box();
	}

	/**
     * Adjust the number of records to include in a single query.
     *
     * @param int $default Number of rows.
     * @return int
     */
	public function filter_rows_per_query( $default ) {
		$custom = (int) ns_cloner_request()->get( 'rows_per_query' );
		return $custom > 0 ? $custom : $default;
	}

	/**
     * Adjust the number of items to clone in between updating progress.
     *
     * @param int $default Number of items.
     * @return int
     */
	public function filter_progress_update_interval( $default ) {
	    $custom = (int) ns_cloner_request()->get( 'progress_update_interval' );
	    return $custom > 0 ? $custom : $default;
	}

	/**
     * Apply checkbox value to whether to skip SQL views when cloning tables.
     *
	 * @param bool $default Whether to skip
	 * @return bool
	 */
	public function filter_skip_views( $default ) {
	    return (bool) ns_cloner_request()->get( 'skip_views', false );
	}

	/**
     * Apply checkbox value to whether to skip re-applying SQL constraints to cloned tables.
     *
	 * @param bool $default
	 * @return bool
	 */
	public function filter_skip_constraints( $default ) {
	    return (bool) ns_cloner_request()->get( 'skip_constraints', false );
	}

}
PKW�1\X��d��2sections/class-ns-cloner-section-select-source.phpnu�[���<?php
/**
 * Select Source Section Class
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Class NS_Cloner_Section_Select_Source
 *
 * Adds settings section for selecting source site to clone from.
 */
class NS_Cloner_Section_Select_Source extends NS_Cloner_Section {

	/**
	 * Mode ids that this section should be visible and active for.
	 *
	 * @var array
	 */
	public $modes_supported = [ 'core', 'clone_over', 'clone_teleport' ];

	/**
	 * DOM id for section box.
	 *
	 * @var string
	 */
	public $id = 'select_source';

	/**
	 * Priority relative to other section boxes in UI.
	 *
	 * @var int
	 */
	public $ui_priority = 200;

	/**
	 * Output content for section settings box on admin page.
	 */
	public function render() {
		$this->open_section_box( __( 'Select Source', 'ns-cloner-site-copier' ), __( 'Select Source', 'ns-cloner-site-copier' ) );
		if ( ! is_multisite() ) {
			?>
			<h5><?php esc_html_e( 'The cloning source is set to the current site.', 'ns-cloner-site-copier' ); ?></h5>
			<p><?php esc_html_e( 'This is configurable for WordPress multisite, but here you only have one site installed to choose from, so it\'s been automatically selected for you.', 'ns-cloner-site-copier' ); ?></p>
			<?php
		} elseif ( ! is_network_admin() ) {
			?>
			<h5><?php esc_html_e( 'The cloning source is set to the current site.', 'ns-cloner-site-copier' ); ?></h5>
			<p><?php esc_html_e( 'You can use this plugin in Network mode  to choose from other source sites.', 'ns-cloner-site-copier' ); ?></p>
			<select name="source_id" class="ns-cloner-site-select no-chosen" style="display:none">
				<option value="<?php echo esc_attr( get_current_blog_id() ); ?>"></option>
			</select>
			<?php
		} else {
			?>
			<h5><?php esc_html_e( 'Select a site to clone', 'ns-cloner-site-copier' ); ?></h5>
			<select name="source_id" class="ns-cloner-site-select">
				<?php foreach ( ns_wp_get_sites_list() as $id => $label ) : ?>
					<?php
					// Pre-select saved 'default' template if applicable.
					$saved = get_site_option( 'ns_cloner_default_template' );
					// Enable GET source var to override default, used by quick clone links on network sites page.
					$default = ns_cloner_request()->get( 'source', $saved );
					?>
					<option value="<?php echo esc_attr( $id ); ?>" <?php echo selected( esc_attr( $id ), $default ); ?>>
						<?php echo $label; // Don't escape this with esc_html b/c non-latin chars can result in totally empty string. ?>
					</option>
				<?php endforeach; ?>
			</select>
			<p class="description ns-cloner-clear">
				<?php esc_html_e( 'Choose an existing source site to clone.' ); ?>
				<?php esc_html_e( 'If you haven\'t already, now is a great time to set up a "template" site exactly the way you want the new clone site to start out (theme, plugins, settings, etc.).', 'ns-cloner-site-copier' ); ?>
			</p>
			<?php
		}
		$this->close_section_box();
	}

}
PKW�1\X[��+�+
changelog.txtnu�[���= 4.1.9.3 - 2022.01.06 =
* Optimize with reduction of unnecessary all hook when not cloning

= 4.1.9.2 - 2022.01.03 =
* Fix compatibility issue with WP Simple Pay

= 4.1.9.1 - 2021.12.23 =
* Optimize performance by preventing initialization for non-admin requests
* Fix unnecessary object cache flushes and add filter to disable entirely

= 4.1.8 - 2021.09.30 =
* Optimize WP site list for networks with large numbers of sites
* Add proactive resolution attempts for duplicate option keys during cloning
* Fix misc. other plugin compatibility issues

= 4.1.7 - 2021.09.02 =
* Apply styling tweaks to admin interface
* Fix bug with networks where the root/main blog ID is not equal to 1
* Fix bug with "Delete All Plugin Data" reset button not working fully
* Fix compatibility issue with Collisimo Shipping Methods plugin

= 4.1.6 - 2021.05.31 =
* Update composer dependencies for PHP 8 compatibility

= 4.1.5.3 - 2021.02.10 =
* Fix compatibility error with SEO by Rank Math Pro

= 4.1.5.2 - 2021.02.03 =
* Fix bug with new site title not being applied after cloning

= 4.1.5.1 - 2021.02.02 =
* Fix slug change that broke compatibility with pro version

= 4.1.5 - 2021.01.31 =
* Add wp_cache_flush() call to resolve object caching issues
* Add option to clear plugin data for stuck processes
* Update internationalization to follow WP recommendations
* Fix misc. warnings, typos

= 4.1.4 - 2020.12.30 =
* Fix visibility error on magic wakeup method
* Fix cache clearing mechanism for WP Engine sites
* Fix conflict with Woo Discount Rules

= 4.1.3 - 2020.11.17 =
* Add new options to help avoid database view / constraint errors
* Make compatible with pro SFTP transfer feature
* Fix inefficient database calls, unresponsive analytics setting UI

= 4.1.0 - 2020.09.25 =
* Add productivity statistics capture and analytics
* Fix jQuery 1.8 compatibility, debug notices, more misc. bugfixes

= 4.0.9 - 2020.06.15 =
* Add new performance control options
* Simplify and improve new site URL validation
* Fix handling for memory limit of -1
* Fix compatibility issue with Yoast WP SEO
* Fix other bugs with stalled clone recovery, notices from options table, etc.

= 4.0.8 - 2020.06.11 =
* Add automatic cache flush after cloning
* Add new filters for performance tweaking and search/replace control
* Fix upload_path replacement for root site with hardcoded upload_path
* Fix sites with non-latin chars in site title being unavailable for cloning
* Fix other bugs with failed finishes, database prefix irregularities, etc.

= 4.0.7 - 2020.01.30 =
* Fix non-prefixed custom tables being included in root site clone
* Fix private/public blog property not being reflected on cloned sites

= 4.0.6 - 2020.01.13 =
* Update admin styles for WP 5.3 UI changes
* Add new recovery capability for stalled cloning processes
* Fix bugs with serialized search/replace updates, unnecessary sitemeta cloning

= 4.0.5 - 2019.10.17 =
* Enable number-only site names
* Add automatic cache-flush at end of cloning for WPEngine sites
* Fix memory/time overload when queueing very large tables
* Fix misc. plugin compatibility issues

= 4.0.4 - 2019.09.02 =
* Fix database handling for null values
* Fix fatal site creation error in pre-5.1 WordPress
* Fix error on servers that don't allow multiple SQL statements in one query
* Fix misc other bugs and plugin compatibility issues

= 4.0.3 - 2019.08.19 =
* Fix missing rows due to lost insert or incorrect row query
* Fix max_allowed_packet database error

= 4.0.2 - 2019.08.15 =
* Fix timing conflicts for cleanup tasks.
* Fix issue where process would keep running after manually cancelling.
* Rewrite row processing class for much better performance and fewer queries.
* Add fallback AJAX process dispatching for environments where background requests stall.
* Add queue batching for large tables.
* Improve debug logging.

= 4.0.1 - 2019.07.26 =
* Fix lock timing on background processes to prevent frozen or conflicting processes.
* Fix handling for SQL views - exclude from table cloning and create at end instead.
* Fix empty target site url caused by object caching on some servers.

= 4.0.0 - 2019.07.22 =
* Release all new rebuilt V4.

= 3.0.7 =
* Replaced deprecated wp_get_sites() with get_sites()

= 3.0.6.0 =
* Fixed an issue where some serial arrays get treated as objects instead of arrays and search/replace was getting missed
* Updated Kint library to resolve issues on some rare environments running OPCache and XCache

= 3.0.5.9 =
* Updated PHP 7 compatibility to use proper global variable variable emulation

= 3.0.5.8 =
* Fixed bug with search and replace preventing multiple replacements in rare cases where the search is different but the replace value is the same.

= 3.0.5.7 =
* Added new feature to save default site template for re-use in cloning every time

= 3.0.5.6 =
* Update to prevent kint classes from causing fatal error when autoloaded by another plugin or tool

= 3.0.5.5 =
* Update to work around WP version changes that prevent site names with dashes in the wpmu_validate_blog_signup() check

= 3.0.5.4 =
* Fixed issue with latest version of WP where a test validation site name containing only numbers is no longer valid

= 3.0.5.3 =
* Small formatting fix to sidebar
* Fixed php Notice: Undefined variable: query when WP_DEBUG is true under certain conditions
* Updated README

= 3.0.5.2 =
* Fixed mysql errors for unquoted numeric strings and empty values

= 3.0.5.1 =
* Fixed INSERT logic bug that resulted in some rows not being copied
* Fixed extra characters in sites cloned via quick clone link
* Better javascript error reporting

= 3.0.5 =
* Refactored MySQL INSERT commands to increase performance and resolve duplicate value issues with several plugins
* Added better MySQL CONSTRAINT handling to fix compatibility issues with several plugins
* Added fix for sites using the Wishlist Member plugin

= 3.0.4.9 =
* Fixed title replacement bug

= 3.0.4.8 =
* Fixed one-click cloning issue
* Fixed a few bugs relating to upload paths and replacements

= 3.0.4.7 =
* Added WP 4.1 compatibility status
* Added additional error handling for systems that can't read external feeds for the sidebar

= 3.0.4.6 =
* Added compatibility fix for CSS & Javascript Toolbox plugin

= 3.0.4.5 =
* Adding compatibility fix for User Access Manager plugin
* Removed site title find/replace functionality

= 3.0.4.4 =
* Added support for new feature and setting in Content and Users Add-on to send notifications to new users

= 3.0.4.3 =
* Added another condition on ensuring kintParser is not already loaded from somewhere else

= 3.0.4.2 =
* Added condition to only load Kint (used for logging) if no other plugin already has

= 3.0.4.1 =
* Fixed minor issue and removed [[ *Notice*: Undefined variable: default_db_creds ]] showing up with WP_DEBUG turned on
* Corrected mismatched version between plugin and logs
* Added basic, disabled feature for emailing new users with site login and password (not currently active - primarily preparation for a new Registration Templates Add-on feature and option)

= 3.0.4 =
* Added one-click cloning from Manage Sites page
* Added pre WP 3.7 compatibility
* New search selector for source sites
* Revamped logs for better utility/readability
* Centralized ns_cloner_addon class for maintability

= 3.0.3.1 =
* Fixed bug introduced in 3.0.3 affecting subdirectory mode

= 3.0.3 =
* Added exception for subsite names to include dashes
* Updates to support new Registration Templates add-on

= 3.0.2 =
* Fixed conflicts with some other multisite plugins that were triggering validation errors when attempting a clone
* Raised number of sites shown by default in "Select Source" dropdown from 100 to 1000 and made parameters for that query filterable

= 3.0.1 =
* Fixed www vs. non-www issue on subdomain installs that were using www and generating sites like site.www.domain.com
* Added robust new detection system for identifying WP version and uploads location even under abnormal edge cases
* Added advanced validation and preemptive issue detection
* Added robust system configuration and action logging to help with troubleshooting
* Added All new Custom Add-on Architecture
* Added All new hook-rich cloning pipeline for developers to extend
* Added All new dynamic, responsive admin interface

= 2.1.4.9 =
* Fixed several small bugs reported to support that impacted specific scenarios, configurations, and plugin combinations.

= 2.1.4.8 =
* Fixed bug that was causing UTF-8 and DB character encoding issues in some environments. Primarily affected non-English sites.

= 2.1.4.7 =
* Fixed critical bug that prevented user roles from getting cloned when cloning the ROOT site only

= 2.1.4.6 =
* Fixed critical bug that was causing incompatibilities with some plugins that install their own tables to the database and in some cases the cloning operation was leaving a single custom table behind in the clone. This primarily affected Calendar plugins or other plugins where the table name began with higher letters (a, b, c) after the prefix like wp_a*, wp_b*, wp_c*

= 2.1.4.5 =
* Added support for cloning the root site with ID 1 (YAY! PLEASE SEE STANDARD PRECAUTIONS AND NOTES ON DESCRIPTION PAGE)
* Added support for WP Multisite when installed in a subdirectory rather than at the root of a domain (there were previously issues in this scenario)
* Added validation to enforce lowercase and only allowed characters in the site name field
* Added validation to enforce replacement rules that aren't always obvious (you don't want the old site name to be contained in the new site domain or the cloner's automated data replacement will corrupt your new clone's data)
* Fixed permalink bug in subdirectory mode
* Updated the way the status is returned after cloning to fix issues where the status exceeds URL length restrictions
* [EXPERIMENTAL] Added support for the ThreeWP Broadcast plugin based on user contribution (thank you John @ propanestudio.com and Aamir!)
* Many other small tweaks, updates, and fixes

= 2.1.4.4 =
* Enhanced media file copy handling from 2.1.4.3

= 2.1.4.3 =
* Added better media file copy handling in cases where themes or plugins alter wp_upload_dir() and it is returning bad paths

= 2.1.4.2 =
* Fixed bug reported by Christian (Thank you!) where some upload file paths containing the same numbers as site IDs were getting mangled

= 2.1.4.1 =
* Fixed 2.1.4 to make file copies compatible with the new uploads structure in native WP 3.5 installs
* ANNOUNCING NS Cloner Pro is now Available [HERE](https://neversettle.iljmp.com/1/ns-cloner-pro)

= 2.1.4 =
* Fixed bug in 2.1.3 that caused file copies to fail in some cases where the target folders already existed

= 2.1.3 =
* Fixed bug in 2.1.2 that forced subdirectory mode

= 2.1.2 =
* Added Auto-detect of Multisite mode and Subdirectory site support!
* Added Automatic Copy of all media files in blogs.dir/##
* Fixed some image loading fails in certain scenarios

= 2.1.1 =
* First public releasePKW�1\-�)QQimages/ns-cloner-top-logo.pngnu�[����PNG


IHDR>Z!*:�bKGD�������	pHYs��tIME�鿘�iTXtCommentCreated with GIMPd.e�IDATx��y�\U�ǿ��Nw��$��$ �!9
*��#JEeTTtd�ApL4�1�~AD"�2��Ma �%a3+ٓNw�缩ו��z����|?��Tuuխ�޽�ν��s===A�J4�)�`W�0k֬A�aUmv��<���Lځ�D�h� �Б���\�J�&{S]Ԧ��M&���c�An�E�T�\��֚������ hx�F���9�5-�)�<����^���e<l�Sնh� ]�����X�-~L��
��хo��=�(��BA��·e��_^BAPW��;�K��Ac���A�V+��s� � �f�Ü���LDz�9>�i���A�CL&c2��?/�,��%�e��A0��7,c�j�b`���~
�í�	X��rU=ID�ESA0�·we�뢷x��M�0G� �����^9����|�61�
�`��v�i�i9�!$|Y���c�,Ϗ�	�`��Č�_%"��E�A����Y��g,�I���#�'�z�����dOG���x�Al����|88�.�F�e�T�u�aI
.n����F�f��ф/���?�x��9s��!p
%|r(c��N~�"(��˟��|ߌf� y���!|��c�|{��WNΎ&��фo|e�����ׁ�\A4����]��n��	㢩� ȋz,nda���N�AϚ�e�÷�-���4A�����X��ݢi� ���:�Ep���^�<����՟ۀϋ����l��!s{4au��X�M��U�'�(c�}P����~>ۂ�hKu)�
��"���`�����:�i�{��ߪ:x�_]�?EdK�<x���S�n�0o����H�����I�_-"UQ�V`�kGp�����aX��1U�𐈬*)g��O�m�
X��A�Tu�n�`��h��])_����z��~���.`�w����u��,'_P9?f���ZU�������R�8p�ߴ�~,�~�f��5�h�9
�x�<�Dl��j�rJ�Xe���@N��	\��Z��z�z������\��t���?>$"OW�;ܖ-��>����})�wפ�ҍ~>���ޅez���E����Z�ͩm6�j"�Y��Fo��T��z�4�+}]H��YeM}t���33�uX���/����8o-)�)�z��!�ϗ\�nRՏ�ȗ*l�v�d`��#"��N�@ǫ�#��o�:u^[c����v1�))|kƶ���Yk·ED��'KN���})K#��6,�q�DdC��1w�V�n�t{'���������0��-ګDd� 
_w�n�N.��U�*���2��8�W�!z���gW����ہަ*G��z�;�9�#-zK|��T�-F�00�bU�SD�i�m�H���
���r �X"z�@�}~U�)��T���Ȕ�9���X���v��p�~�-��`�i�!�fU=!5��$�XDzTu��I�UG��xc�x};R�7VUo�'"��o��D�%5�Q���cI��yG���}0LJ����U����e�g
���ہCR_�C��U���o��t��|�|��jIFT;�;����w��p.���N�ǩs�IU]("�2��t�&�|˴T
��
��wb,�x�R��qN·�+3���ۼ��� 
4�X�M�n^
�����¶�O��-jax
{�D�^U�|��;AU���2_ڢ<UD��q�1��w"rz�NC�&��G"rYZ�t���U�������y����,S�O��w�X��^��~c9�>�b+��Z�r�]��3���^���DN�u���ºmO}��S6��i��|���9Rr�.��y{�[}��^���6h���{��ZL��b�K,�j�;�z�#�
.��J	��|1�V�[Fܗ��%�n��;��X�-y���T�UN��T1d�iPAR��:��[Ǩ��5�]�I���u�Ԡ��Zr��2�n.�*�&�R\��|(�05�5�Yr����N7Çנ�;�r�܂��v�������DS�֫T����@D��-�$��>YG4�r-� �yt���0冺a�
�շ��s���9d�d�sn
��}����ѝ��JG!;_'��o���o��'�����e�/�r�����>���{���?YU�v����o|�W��:]U��$�7%�z#�Y*|À���w��� �TD�Vp��O���E��=�\��\�2�w���|�J|��a�D�\��U�?�����5�~]E�n�����f=�)����9����!��轰q�W5������U�������
�iX>O�߮s��z=׃jܜ��ۧp)�����I�|��X�a���	ܮ�cN�[U�����1"����R�-U�BU�B���o��b`'�6lYO`������s1���`���N���UI�Dd����^D���o�V/���W�À}E�m�Bv��Ū�3���\U��@*��oU��~�$�a��7����y$�a�qU���P�"rO�ET��خ��*��Y��;�O����n���C����G�^
|�?��oc{^���8�vS\
j"�df���V�`!y�[loŜ;�R���
��m��˱ȏs|x>�-��.P����Ӏ+��{��w��ɓ���&�x̉�
��5�X7c	a�pk��h����o*�1�BJ���zU��D���`��n|���9~��ka��ت��@�גuU˥����t��b�C��.����媻@D�碑7��"3^�ƅ�
�xp36'y�[�۱x��W�.Xo����]����|^l���?��-Ó�Z���aQ	�Ș�y����%>��WzO4w�
�2�nU���~`'�[�V�jl�>�DU}Y�ŵա�����p��e���3=�+��<�e�+�V�g{��~�	,�!똾ӭ�����Ђ{���_��e3�����.�{�ɇ��\ߵT�N���L��7Z�b��.��b�-����O3�m�����Wq!u���ȧ]_▶�t�X z"�׹E<�\�C���q�n�����cJb�KX�%�X��^�������ku^��e?���dq8p���ȇ���&p���b�n�‡�Ik��*k>է���
�o�b�Ns�Q���_vk����Z�p���%X��݇����^��3T�ryԏ��2������7��X���ԍx�OU��av��f��M��cU�8Y�-nvS�b�="򚜫7���̇>C֦b,#S��#�U�]�zp�[3�C1+J����R�^^��.?�dp�7���RL�y�@1)�5N�Y�O���#�������m����.��/"/��J�lUm)n𹶄�y�#!�Q/g�Qe���Иp��Vl��&��^N1X�ه$���Z�j'�Ƹ�?E��<���:���E�|�c%V{l+:8m��S	Gx�����7(���ed�]�{R�Z�Uݱ4nHѮʥ�c��ˋ�������ꎛࠊ�"z�����ؖ�����T�)��'�i�[s����X��z����͕�+���ڷ�0�\��PGcSFO��{I�2��-p�+|�Y7� |#�œ�*.�B����W��b����u����|_��+���^b�VKW��ND�H�gp�M�!/�V}�$57��P7���h?Y+��u~��c���i�7S�h�k�edI#�7<��}$08��m�_I�nʡ�EzzN�\�z=��񠵰��Y��_CcKD0�\�3)�oIz�wO�,�.,�`��]�#���
d���O�,�]f�w��l��0��f�H�7c����䜅��]���|�޸����Z�����Rb�$�:{)6ϵ��]Mqς��b%¿���B��1�Ȟ�lT���
rw������+!�
�zbս���D���S2�3q�I8EU_TŹC�(&��z�ϭ���G:��T`��6�F�]�>�Խ9sx�?��`�vxG}��Q'c�����4�:l	>OKg�����D1Qd�g��G��즸�p�pa�
a�\���=��:��~���_%������U9U�J��6#�����ob��)0��9I
xY����o0�쿨��Z����xf�=PN��nQ��ŤB�s׊9��z��
vL���0�����cᭇ�ߟ�S�%U���KD���/RG}!�Csw�6`���P���/�$ά�v��1��yo7�=�5Pŝx"�߃�\����w���,�z?��������1U�4�ޑ��Z���&�d�ߨ�:UD�wN2䌣6�ca�y��r�9|n���E��,T�b����"l�d/��76���T�[%�;c�߅��
u_���܉eu5�d�骝laىe?�6��]�f&��z�ߕ
�%\Gq�9yoMj�c���Ο7���30��!K|�D�:�wai
(�ٜ/�Uu#�:=�2;U�l��tr����^�s�>Z�ǭ�=�������/c��JF|���U}�������~�o%ta�_ק,�77��WU�k)�+P\���;�(��2�`�m���sxe��������2���?>��|����;#b���ݰ�SU���C{�ViK�W��j��x�����a���Cܣ���Fe�l^���2��yx�QX�Q��|MXƠ�2��B,��
Ge70<�6p��]5��5��̭%i����>�=��f�*�D�[i	��*k%�;���:��T[
�f�ʭc��/Ȗ{�	7�Z����{��3�\��a<��3�b��%�*k�d��F���f�egt� ع�[��f�~�iWD�A0T�/��֊�#>M��"|À	X��
��b�Jy�� [�V�P��=ŝծ>�-��9y�:,��
��&�;�J��Ŕ B�2����D�ۨ�d���d�_�����1w���IX��y.��bN�/�N�FW��Z�#O�8U���c��E����⟻��J�:Ň�c��7c~>A�������쁭�>�ũ��=‡�VXΉ�$�`��e�o���nE��]:���y��v9�In�ͧ���X֎iU�3�,�8ӷ͛���u����X����`�!�t1�\���0�'5ˡ�E�4�vw`��Χ��B���AX|��-d_���3�<�C���v�Ç����(�g3��,<��c=�ԣ�<A�˺I�E��h� ���-��a�G_����.�\c���j���9�3�J��X�17w �p|���,��
�S�I�	,���h� �m�{�-�,{y�#"]��$�`�����D䗪:���9B�+�{<6�8�}���"B���ȋy|�2�N=��S�&ws)'~������9����@.%��A_��q�/��M�8��J�=�R}� vr_�p�z$c1�}h�߃�TA4��9Y]QZ�]ا��A0T��ʘ�eh	��`H_Bu��V��
� ���(�}�^�eVYJ��� ��[|�Ȟ�o��o���A4���Flϋ;\7g(��h� ��P9�SLM&c��{cn*����;�"�h� ���p�{������mX��$ĩ���a���f
� O
===q� إh�S����F�h��@IEND�B`�PKW�1\�/�c��images/bg-texture.pngnu�[����PNG


IHDR����\bKGD�������	pHYs��tIME�
E� sIDATx��[r� @5e�:+���XPy�տN�b�!! $�w�9��<�.���9,B�ޑ���ߨ��q�꾉C����4�D+���%̄j]W�㮝9P����kYD�m1FGu����~b#0.���%K�s�(?JFDU���E*�I��j���P��^#q	+�]�(�.��ՔVu'a�ѴF�=UC�zVEӵH�9bX���K}��A��2  ��H(sGEи�Z-�Ga�n�
+|���#*��s�pG���J��*$wT�Ww띏j�;RD�-DT]/�(��Jvc�r��U���D
�1*‹�N��1��^_LP�^��l�P=~�t�ƱqnP ��bn�EF�iV@˗�hg�	�b6(c
x��C�պ�L?��D�m�0��]�� ��H<�$^K�ը�A�#$�W7�?���,��T�B�T1���R�U��߇�� �9�s>���t�!Q&e�rL�G���X]ê�fEt:�T�%x��9�s�xDbN��9�"�YaU�_���`��^}����m�Gտl���ǵ�aU��{���G\F���wNw�ں�۶�w#slN5�)	����D�ѱi�Y:�d�g>TƳlҦrٷ�QهBI̔V��&��~DT^��䫩�P!!�?��~�U�-ٔ5)�
���]�����(",*���o���B�# *���[�S@Tq�m�d�7�$�<��Ȋ�J*)�q�`$N�|k缽�Քsg"�-v/T��:ɨBg�G�uB�<W�������;�	���a�J�L���wHzQ��eE���.T�d��C�x��j��E�܏@!Q
�]J�8���/�t�l�QiXR��ڑ��	U�}#TJ�$�E*��M,fi���j��4T��h��]o��Ȋ��$
T�gţ��3Sf�j���YcK�@5Iv޶^ڐ4F�HN�3���'�����Q���#!�
&�ڎj���gyYR�sX�BڼkϠ�I����>��t72}�J�Z����nf���fe5Y�N�ү�[�1`9ا2�G�t�",qTG�YYL���R��,����Q2��җ�8@
Kz؏�@�\5y�!��K���O�L�;�-XZ�l�v��)6{N��Y�9-3�Ұ*���,�@���~ڑ5)��a���<#X-X*(B]��*��6�jR���kU������
���9�T�,�R��������8�w�+��f]���T��I�"+1�]̂�j�E��w1Ϣ�Ϡ1�.&�|��VTk���^�j�,����O��wK�F�(
�]�41Z�+�Up���Zo�E�'1��c;!8z�%0�����n�Gt����Tw%�C�V���e�ޓ��3jT�nT050�?N�qPݩI��l��4,;�x_T�VW0]����h�2��������&�
���2 ��Ժ��j�.Z���lV!CԎ�ՃD�\tb��Q�9
�����h�]=�8k{��~	w�� 8vu��|k���'�ǁL�w�T�fz!�g��z}Q�A���Ĝ�kTuk|
����qk�@%�,}$��*&3�dpb��*�^����]�$���p�cU�b7b��i�x栊y����ѩ�3���읓h׏��|�o�� ��ְ�q+�s���˴�'LHgT3��B��P� �����Z�zD`�ܚ�8�?�^T��Smd���xQ	�se-�H�����m��w�����a~���s���_TNR�j{��I9%*���U]� $�6�'�� �*}h@T��Q���J�^�AHH��?
 -I�D�MN�iP���cb�T���$އ�wKzQaP�;$��ӣ�.HJ%L_�zD���Q�E��
|�$��S�$�Ҙ⽚�/7:�'�@�
IEND�B`�PKW�1\.J��""images/big-bg.jpgnu�[������JFIFXX��C




��C		

��U��������X��zx\ZJsLΑ����癗��K�		�I��K@�Y�������##33a��Y8���5���8��z;&`sy���j�R�3q����fk43x�k4����Mą�f��Iq�,7�M�1	���HdbRxNdbVXh'�fh�T�����l#.#7@4�������9f����B�Sa�F`����`F�
�@�N^Ddu�9f��3Ӱ�4�"v9����NLPR�4��)i`�%���@j-,=5������"#���``ff��p�k�`#Q��㙃�m#Q�����m.#Q���^F��9�2��GH��@x�ds�� �y1��2�5��A���6��@���4̼�GH �Dj:@/#Q�x��@����1@
���'$��+.2S���t���#Q�Dj:@M����JJNQI�c�P&��� 1: 	���� 1: 	��R����	O�H���`0*/Q�).�BLV^zbBHR\l<"#7�@�������
�@�i6����I�Ns���9�H���GHS�fy�x��<8�`��"5 xqN�� �Dj:@�❃0@���^)I�"�FD\V�P��Cix��;`��S�fx��� �
dD��Q�7��n.S�o.7��lA��i0� ��)012@ !3"#Pp`���f���żSzU�?m.9�7�S����)��7>��䴉4f��f����@%��PYk��er�	k��5�kXֱ�sZ�	\��W�E�>?)�OF7��2}��A�d|4X���@LR�ˉLZk\����R9��e&���@[��B&�	����]<��N5����3�d.�����ܰ�U�qM����:d�
����&9��i�`6Zd���L�C�L��,�j��˫�A6r�]5r���˨��[�<��p.`�*{!�p~`�7�;�س��Q�1b�����[Oޣ�	>��(M�ȭ�[:�uYHs���gV΂���)	��5�h&'?N��>����iع���7����;zr��d%��BB��o,��%pJ�+�W�	\�%�o�4njܕ�+rV��[��%nH��Ss��ȉ�����9�Q��\�S�霬�sL�H)�6���g%�()��D��;��>(E�b�X�V;�>��gX���� cZ �Ah���D�-Z �w�F����W�	��Ԫ~�L���%��3�<�R����/�G�8�:m�O�̥�����曝ڕO��QB�G�O4��Ԫ~�*����M��@�"Y]�Z��,�N?��O4��I���C��f������l
�\��r�UʹA#��Aw��:�5�k@ց�O	��Fy�v��[��6M��J���曝ڕO��S�7;�*��Χ�nwjU?�O4�&�$�þ�y�\
�p*�U���W�F=�|�f����#���:��#���:�ggݩ��9��*���R����*���R����hc\�`W�	\�%pJ� ��~S�<��%nJܕ�+rV��;`�qݩT�u-�M�v��n�:�O�v��n�:�O�v��~�:�O�v�q,���\
�p*�U��<�N?[�@��,`�X:��WA��i$�W,�Y\��er���+�W,��SzqrZF��i�5�kH֑�#N.*��T�`Fyޙ�B6s�x�6V�H�Q�;�����̎�;�$0zX�99 ��B>�O�,�X֩-BZ��	j�%;���+fV̭�[2�el�ٕ�+fA���N�;�]b�X���gA;��X�gjqZ��B���Q�B�,Gv�S�� �⧵7;�*����O<�s�R���~t�S�7;�*����O<�s�P.Jv?6♰o���./�-C�:��3�γ:��3�γ:�ܷ�ր�Z�#��
�00=7>���i��_�<T�MϠFŽ���O4���"�w\���;`�a�1�*fޜ�Y$Ha�<~3:��6g�2��!�C�Q	+qV�X�?�����? ������? ���)1!0@A 2Qq"Pa��p`��?���/y\����Od�T>���=�� ��,�V��e$�I9pAN�u?Ů��r*���-����P૿��B�S����X��錝�U�U2MTc���V2h�F���ɐ�aQT�!���dv��;GUM$A�� ���YU}�U_s��4��>�YS����J���o��b�n��IZ��$�V�J"I$[o�ݏ���N��a�<���[Gb�+�]eM�mk�c{O,�c�}��~�b�+�_b�+��W�m��O[ֹAA���urr[_Kyv�U��җG��a�esC����If����.�=j�*x$�^�=�S�Pu��܂ �-�R�� ��-c�â���E[��=k�ZE�Ǔ���������d2�C!�Yn0�0�0�0�.[q后G����Q(�J%e�Z�Eֲ�5��h#������|Ш޿Ԃ �>�DAAk��i�v��i�v���{K��W�E��ke{"�+�\�-�Թ�^�g$���gs;���W�$�I$�I?���I$�I>��z+L�Sƶ�>�C��Շ�hz�z���[VY��*"룒��!�~I$�I$�Q�_�����a�����7-�Y��ܵ��P�+;YS/��K)d�)���;/����+!a1Q��0@Aq �����Pp`��?!�e��ƬLI\��C$���yp�L�ዢ�9����3�g�*�/��BU5-d�Ƞ�$�(�4��}��k�C�;v/(_Z��A?_Z)���]��M��������iktR;��]�%F��O��
˞����!������Eno�H����
�?dR��aC�LrUРɒP݊�p���X���N"�}���@g-c��ɔćRߓ~5����(�7��J_`�ɨm*�gr�r��
��9����3Q(������yA�n't��_|đ�A>cP_�9�霦�Kı�E#�,K�l�sڝ�w��Ocû�zxt	��7�hbw0�n�D����4�pɛ�����~8-�̜�/C�T�,K�iRD�ı�G$ȅ�?~V7)��Lo*H�2u�7�2�&�+y���4䞁�+	7}#�L�#�G�a�/�� Ns-Bд-Bд-"*e�J�y�y�y�y
R�6}+pQkgؑ�&{��Q״bJd���"��t]��;�dC�Igq������bJ�:��	K��d(���N
--ě�[S�!4$̆h�h�h�h��}�1^�[RY�I$�6�:
3��՟�?V~��Y���g���:&��C��/!�y"д1�r���豈����
	j�Ҝ2/�����f�^J�QB�5W����T"l�vfϝ�(b�Y;3g����Yڑy*�6fϞ#���U~��L;6oF���F�R�iŴ/4�ev%)��܅3��_��{&��'�O̟�?2,��Y\�>p=��������?~A;D�J�D[��5k���%
v
G��#fl��q��6fϝ�#fl��q��6fϝ�$u(O����=-¸�o�-�-�-�-�-�-�-��*g�K[J��0Fg���?��1�bRMS�:fġ<�P��}�������������B`�%z�w���AoAoAoAoAo@���畕���f���QԱa�:4S8j�?ȩf5�A��~x�9�?9��A�T�<�].��Cˠ���NЍ��\��5,��[B�B�B�B�B�A3�y42�*/�	S%�r\�%�r\�%Ȇi&���)��.��.�A��'9��,6�"꫑B���o6U)d-��$��P)g�m��*_h]G�D�Z�Ov1�eO�f��&�-��U��ZJ�\ge��L�%$���
����?�P^1ӿ90�]E�t]E�t]
f�n�l��V~��x^��/qg,��s��-1b
��KQ��0b�S�a�2�+�k�ns��x�h�6|�x�h�6|�x�h�6|�x�h�6|�~	3���ڈ$�S�厝��T�3��ĸԸԸԸԸԸԸԸԺ�X�G~t.Cϩ����y�!8Be�<��}D��l�,A�mvfϢ�&��fl�u@�.�mvfϟ�=�E!��ܳ��6M7a	��*Q��F�1f9E��,�����v,����.����F��-�����yu;9�����I$�I$�I$�I$�I$�I$�I$��I$�I$� �I$�I$�A �I$�I$� �I$� �I$A$�I$�I$�I$�I$�I$�I�	$��I�	�I$��@$�H$�I A�I$�H�I$�H$�I$�I$�I�I$�I�H$�I$�H$�I$�I$�I�I$�I$��I$�I$�$�I$�I$��I$�I$��I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I�I$I$�II$�I$�II$�I$�A�I$�I$�$�I$�I$I$�I$�I$I$I$�I�I$�I I$�I �H$�I$�I�I�I$�I�A$I$�I�	 I$�I�I I$�I�	 I$�I�I I$�I$I$I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I�I$�I��I$�I�I$�I$�I�I I$�I�I I$�I�I I$�I�I I$�I$�I I$�I$�I$�I$�I$�I$�I$I$�I$�I�I$�I$�I�I$�I$�I�I$�I$�I�I$�I$�I�I$�I$�I$�I$�I$�I$�I�I$�I�I �I$�I$�I$I$�I$�I$I$�I$�I I$�I$�I�I$�I$ I$�I$�I$�I$�I$�I$I$�II$�I$�I�I$�I$�H I$�I$�$�I$�I$A$�I$�II$�I$�I$��I$�II$�I$�I$�I$�I �I$�II �I$�I�	$I$�I�	 I$�I�	 I$�I�	 I$�I�I$�I$�I$�I$�I$�I�I$�I$�A$I$�I$�	 I$�I$�	 I$�I$�	 I$�I$�$I$�I��I$�I$�I �I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�����? ������? ���,	!10AQaq����@��� P��p`��?�r�˗��iK#Z�e�Yn�Qk�+E3�	n�+k�O�t}��F��$e?C��{'�����K����$�������:�#V��j��@Z�U+���@���9-�"�mZ��ξ�/{�p����'�/�/�C�}"��M����@������pj+!��8�ɗӬ�޿�������;[2K���Y,��vJv2���c)��8m?��:��{��5n��:�Mb}�co�G�l��(���l�H��c`bJ��a�A4�n�wU�d`]�>��(�e�r�8�d�"%%�k[�����5������Wn�Pհ����z�n�n�L6�c94�IZ�(��X~���p3\.̦�{R�
6��x��<l��De�a�M�u�x�:�j��b�*[UB��`��p~'��$5W�D⋾l�,�,�,;���k<�<�<�	�ˆ������L����cќׯ�f�`	��|wG�==��z����_CGn'6�(����[E�3:�������b��ݛ�n{��r����fֲ�B$u�tӘHWI<k<k<k��|(�I�Y�Y�X3M@��'A����7O��>���%=��Іe�^5U_�1��E|�35�V{CK]��p�}��!ЃM�Ҫ!̴�#����JB�y��O0�Jpg����������������������@��`��s��+<����+<��YS�u��@3Y|<��;�@��x6�K��,,_#S%����7��d����!�ݑ�v0�P{!�51�_bڳ<XMI�.VR|�,��ײ��������~J(^�VQnC9@;n�n_s�O)<����٫Ї��3s�,����me���Ym�F���M�
�t���;K�v���/��_���gi~�����,�8�]6,UD��nZS���~̛v�:|���w�<:������)eR�
���
�-�6N�S;���U�w�]��^���gA�d��3������Y�.��>�9g]6N�S;��o0�a��^����t�;5E��U��\��}�rκd0Z��3������;��R��Y��8��>�9g]0%��~;g�V��S̡�‚d�+�Ph�L�_�?z�r����b�1}���_f�;�:��t�)�mbPF,:�r�:���7���~��q�~���$�а�(�5CG��L椫)u�����bA�d��3�����t�;5L�->�9g]6N�S;�AϺ�Y�M��T���su�U�\�$����ɕ�T��Zu�-j��;��x������?g�~����+@�i�U�.1|>dm�Q<�yD���'�GSQ���|�~<̡��P�=�N�S;�����3���N�S;�����3���2�*��R�W�*��q�p
��ȿg�~�"��E�<��	�6@EvC��V���W`�]Ը�0�O0�O0�O0�O0�D����D��V�i��5:�c%-T㖀��b�nf��ga��g��u��r��7��9κ�nQ����<t�u��(U��٩�:�U�췲��{-섐m��CU���L�"X�bs���
�E<�y�)�Q:[�u�����O:O:O:O:O:O:O:O:O:E���Mhx�Z���;�w$�Iܓ�'rN䏃�g,��ϐ��*���XSPo����f�υ��(@�����f�E{*��l��7�*���g�f���k�J�Z����T��W����o��ɐ�5e�_�6��=��)_h�x^�E������3o�	��'�O0�a	��邽����ٓ�'fN̝�;2vd��U�X���\({\%�m�y	�'��By���P�s�F�4�uI��3�!sl8:O5�b�ۘb�P�z��}�z�\�5��Z���_
����v���{��t�;5L�/^A��gh��Ϻ�Y�M��T�����v������t�;5L�/^A��gh��Ϻ�Y�L6���Q%��W�X�LU^K���^�S �iq�R+_�b�[Q��ϧ�O>�}<�y�����͢�b"δ��S_�U&\�0�m�{�i�T"�.�S�u�\�38�ѳןu�������v������}���5�F��Y3��g�>�9g]8�c�b��7ٱ�[)R���.|T��Qm�O���Aڝ��:
6d��8�ͫ�T���T��W�4�N�Ub���a��)���c�mt�Jܶ�����E�Z�B�{�J-�����PKW�1\8���`�`images/gold-loading.gifnu�[���GIF89a�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��"���������������������������������������������������������������������������������������������� ��!��!��#��%��'��)��*��,��.��0��2��6��:��?��B��D��F��G��I��J��K��L��M��P��Q��S��U��W��X��Z��\��`��e��k��w������Ĺ�Ȼ�˽�Ϳ����Ù�Ě�ś�ƙ�Ƙ�Ɨ�Ɨ�Ǘ�ǘ�ș�ʛ�˝�̟�͠�Ρ�΢�ϣ�Ϥ�Х�ѧ�ѧ�Ѩ�Ҫ�Ӭ�կ�״�ٷ�ں�ܼ�ݿ�����������������������������������������������������������������������������������������������!�NETSCAPE2.0!�	t,��H�����9��<S
F*�O�EQ�8g��M���UH��*�:)�>h,��'+&�y�@�t�S!'��鋥P�>mGbS�M1����s���y�
�"i�`�w�v\$��GO��Y���Ċ��+I!����ycѦ_�!�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#��������������������������������������������������������������������������������������������������!��$��%��&��'��(��+��-��/��1��2��4��6��8��9��;��<��>��@��B��C��E��G��I��K��L��N��P��T��V��Z��`��h��u���������ľ����¨�ã�Ü�Ę�ė�ŗ�Ƙ�Ț�ɛ�ɚ�ɚ�ɚ�ʚ�ʚ�ʛ�ʛ�˜�˜�˝�̞�̟�΢�Ϥ�ѧ�ҫ�ԭ�կ�ֱ�ش�ٸ�ۻ�ݾ������������������������������������������������������������������������������������������H�����!�L��u�V)L�E��()��M��h�2mB5�t�&�$O�)������7}�j,�/�N���U�yG�>U
M�*L3���#8J�VY�ǩ 2}�NTu��m��aK�IV4{��
58	XЋ�M����v☑"Jxb@!�	t,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#�������������������������������������������������������������������������������������������� ��"��$��%��&��'��(��)��)��*��-��/��1��3��5��8��<��@��C��G��M��Q��T��W¨X©Zê]Ĭ_ŭaǯfȱjʴo̷uιzϻ~ѽ����Ì�ő�Ɠ�ǔ�Ȗ�ȗ�ɘ�ə�ʛ�˝�̞�̠�΢�ϥ�Ч�Ѫ�Ҭ�Ү�Ұ�ұ�ӳ�Է�չ�ּ������������������������������������������������������������������������������������������������������������������������������������H������d�v�uR�(�;|3��x��2��Xq�tj����[��`'|�Z�,x_����c�� FP=��*��q�L��������ۄ��3������*x�t���:Z��4b�
�3Fo�͘�$����s�o�/T��
V!�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#��������������������������������������������������������������������������������������������!��&��+��.��1��4��7��:��<��>��?��@��B��C��D��E��H��J��N��P��R��U��W©Zī^ŭaŭcƮdǯfȱiȱjɳmʵq˷u̸xκ|ϼн����‹�Î�Œ�Ǖ�Ș�ʛ�ʜ�˝�̞�̟�͡�͢�Σ�ϥ�Ц�Ѩ�Ҫ�Ӭ�ԭ�կ�ְ�ֱ�ֱ�ײ�ײ�׳�׳�ش�ص�ٷ�ڹ�ۻ�ݾ����������������������������������������������������������������������������������������������������H�������[�v�naRx�V<}3£�P�e�*MJc�����dPU�P1Ż�"A_���,�M_����t :}��
Ԧ��;%�=�D��S]��9-��BHLs��$i��x�2%�%/cFt�(b����d��>ݫ0 !�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#�������������������������������������������������������������������������������������������� ��!��"��#��%��&��'��(��*��,��0��2��4��7��9��<��>��B��F��J��M��O��P��Q��R��T��U��V¨Xé[ê]ŬaƯfȱkʴq̶v͸yκ~ϼ�н�Ѿ����Ž�Ð�đ�œ�ƕ�Ɨ�Ǚ�ɛ�ʝ�ʞ�ˠ�̢�ͤ�ͦ�Χ�ϩ�Щ�Ы�ѫ�Ѭ�ҭ�Ӯ�԰�ձ�ֲ�״�ص�ٶ�ڸ�ڹ�ۻ�ܼ�ܽ�������������������������������������������������������������������������������������������H�����ٴKܻw䪉Rx'V<}3�c�� �_��ʔ���y��!2xK߼X9��׫�&x�V!,��%���aS��Q�o9)<�ϓ҂��5zJp&(�A�*p�W\���WD�0R��	�E
#�B��-�����NܮMaS!�	t,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#���������������������������������������������������������������������������������������������� ��!��"��#��$��%��'��)��,��/��2��4��7��=��B��G��J��L��N��P��R��S��T��U��V¨X©Zê\ī^Ĭ`Ʈeȱiɳnʵr̶v̸y͹}λϼ�ϼ�н�о�п�п������–�Ě�Ɵ�Ȥ�˪�ͫ�Ϊ�ϫ�Ъ�Щ�Щ�Ш�Ш�Ѩ�Ѩ�ѩ�ҩ�Ҫ�ӫ�Ӭ�Ԭ�ԭ�կ�ְ�ֲ�ش�ٶ�ڸ�ۺ�ܼ�ݾ������������������������������������������������������������������������������������H����ґ4+ܺw突RH'�:|3�k�� �h���t�T�y��u,�߼YM�Ç�`'{�X!t�o�$���eSȍ&Ap�L)<��Aq�0Q4Xߦ���+�(�j]v�g�UX����;uvS�y�H]"9U�4��`bU��;{��
!�	t,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#�������������������������������������������������������������������������������������������������� ��!��!��"��#��$��'��+��/��1��3��5��6��8��:��=��?��B��E��F��I��J��M��O��Q��S��T��V��Zë_ŭdǰiʴq̷v͸yι{κ|ϻ~м�Ѿ�Ѿ�Ѿ�ҿ�ҿ��������Š�Ì�Ď�Ő�ƒ�Ȗ�ʙ�˜�̞�Ρ�ϣ�Х�ѧ�Ҩ�Ӫ�Ԭ�կ�ֱ�״�ٶ�ڸ�ۻ�ݿ���������������������������������������������������������������������������������������������H������l[:z݌�R��W�|3���Z>{�J]�Ċ�El��ʗnb�S��*X�]=UM�{׉�|�>ˇ�`�|����`�|�����|�(.�Fp[>W
B��,��TM�-�,_�SkR–/1V���)�1�^Uƺ��K����!�	r,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�s>�z0��$������������������������������������������������������������������������ ��!��"��$��&��(��)��*��*��-��1��3��5��6��7��9��<��=��>��?��@��B��C��F��J��L��N��P��T��V¨Xê\Ŭ`Ʈdǰgɳm˶s͸xм~Ѿ����‰�‹�Ë�Ì�č�Ď�Ő�ő�Œ�ƒ�Ɠ�Ɣ�ǔ�Ǖ�ȗ�ș�ʛ�˞�̠�ͣ�Φ�Χ�ϩ�Ϭ�ϯ�ϴ�й�Ҽ�Ӿ�������������������������������������������������������������������������������������������������������������������������������������������H������<v�f9RH��=}3�{e� �p���2�hQ�\��];�K_;P9���`�z�>!,��&���Sh�&�k�H)D�oAu�")d��^G���URx��r��K�P��p[	U8�X/��R�Rx0�>u���-d-�ɊG
pAG�+^|0 !�	t,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#���������������������������������������������������������������������������������������������������� �� ��"��$��&��(��*��-��/��0��2��4��6��9��:��<��=��=��>��?��@��@��@��B��E��H��K��P��U��ZªaŮiDzqɵv˸}ͻ�Ͻ�о������Œ�Í�Î�ď�Ő�ƒ�Ɠ�ǔ�ȕ�Ȗ�ȗ�ɘ�ʙ�ʚ�˛�̝�͟�΢�Ϥ�Ц�Ѩ�ҩ�Ӫ�Ԭ�ծ�ֱ�ײ�ص�ۺ�ܽ�������������������������������������������������������������������������������������H����6�͝�y䰑JH�Q7}3�7,!6}�~M�K�<}��җnbAR��+�	�=V[�Ӈs`.}�(V�狠6}.����7}�x�W��8}�(��7��7}�(��'� .}�(nӷ��{�b!�Ďަ���KZ0ԭ���Z��È+&!�	r,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�s>�z0��$������������������������������������������������������������������������������ ��"��#��%��&��'��)��)��+��,��-��.��/��0��3��6��9��=��A��C��E��G��H��K��N��R��U¨Xê\ī_ŭaƮdǯfȱiʳm˵r͸vιyϻ|мѾ�Ҿ�ҿ����Š�Ì�ď�ő�Ɠ�Ǖ�Ȗ�ȗ�ɘ�ɘ�ə�ɚ�ɜ�ʝ�ʠ�ˣ�̧�ͪ�ͭ�ΰ�в�ѳ�Ҵ�ӳ�Գ�Դ�մ�ֵ�׶�׷�ط�ظ�ٹ�ڹ�ڻ�ۼ�ܽ����������������������������������������������������������������������������������������H����ʩ�k[�|�`QR���|3�{�[�y�81:d�Fc���g.�AS���*H)��ME�s���|�J�׋ �|���7���|�vbIp\�K
k�#�-�'�����ϗB�*Jw��AP��U*+��I�*4臛��)L��a�!�	t,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#���������������������������������������������������������������������������������������� ��"��$��%��'��(��+��.��2��5��8��:��;��<��=��?��A��C��D��G��K��N��Q��S��U��V§W¨Yé[ī]Ŭaǯfɲkʴp̶t̷u͸wκzϻ~н�Ѿ�ҿ������Š�Í�ď�ő�Ɠ�Ǖ�ȗ�ɚ�ʝ�˞�˟�ˡ�̣�ͥ�Ω�Ю�ѱ�Ӵ�շ�ָ�׹�ٺ�ڻ�ڼ�ۼ�ۼ�۽�ܽ�ܾ�ܾ�ݾ�ݿ�ݿ���������������������������������������������������������������������������������������H����ҹ�\;v߆qRH��|3�Õ�Fd�,azU
c����e�U�|�
j��OBT��y",�1���"�-�*���i#�.�$���#�.�%���,�J!Npy�C�Y>`)5R(*�&�I����@\�9�+p=a��
��I�a�!�	r,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�s>�z0��$���������������������������������������������������������������������������� ��"��#��$��%��'��)��+��,��/��1��3��6��:��=��@��B��C��E��F��I��N��R��V¨Xé[Ī]Ĭ_ŭaƮdǯgȱjɳn̷uιzϻ}мн�Ѿ�ҿ����Š�Ì�Í�Ď�Ő�Ƒ�ǔ�Ȗ�ə�ʛ�˜�̝�̟�̟�̟�̠�͡�͢�Σ�Τ�Φ�Χ�ϩ�ϫ�ϭ�а�ѳ�ѵ�Ҹ�ӻ�Կ���������������������������������������������������������������������������������������������������������������������������H������t�ܾt�b1R(�׾���S��ؾx�<�Y��W�}��ڇ.��N�*��]�J?᳷���}�&�I�۾Q
I��FP�>M
#�;Gp\�G
+�G� �}޺�YK�J��52+'�}��z���Q9��DN%���!�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#���������������������������������������������������������������������������������������� ��!��"��$��&��'��*��-��/��2��5��8��;��>��@��B��C��D��F��H��M��P��R��T¨Xê[ī]ī_ŭaƮcǰgɲl˵q͸wκ{м~н�Ѿ�Ҿ�ҿ����Š�Ì�ď�ƒ�ǔ�ȗ�ʚ�˝�̟�͟�͠�͡�΢�Σ�Τ�Υ�Φ�Ϧ�Ϩ�Щ�Ы�Ѯ�Ѱ�ҳ�Ӹ�־��������������������������������������������������������������������������������������������������������������������H����ޙ���}�x}Rx'ֺ}3��p׾{�DM�C�׻}���n�AP��*(���S7�['��Jf
��$�m�*���i#8��"���}�hӾqT�ڇ-+Ag�byx�޽JcI���u�(a���ZI�:�TK�;G
�ȱ��!�	t,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#������������������������������������������������������������������������������������������ ��#��%��'��(��*��+��,��.��0��2��3��4��6��9��;��=��@��B��E��I��L��O��R��S��U��V��X©Z©[ê\ê^ĬaŭdǰiȲnɴq˵u˶w̸y͹{κ~ϻ�ϼ�м�н�Ѿ�ҿ������Ì�ď�ő�ǔ�ȗ�ʙ�˛�͟�Ρ�ϣ�Ц�Ҩ�Ҫ�ӫ�ԭ�կ�հ�ֱ�ײ�ش�ٶ�ڸ�ڹ�ۺ�ܽ�����������������������������������������������������������������������������������������H�������ۺv�~eR��W�}3����Fm�6az�#������e�Թ}�
f��BR��}*���e��)<�j��)�s���%�M	�ڇ-�@d��Y���=PVA�˪V':�dI˷/�����eĈ/�$��~}k��ح��!�	r,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�s>�z0��$����������������������������������������������������������������������������������!��#��%��&��'��)��*��+��,��.��/��1��3��3��5��7��8��;��>��@��C��E��G��J��M��Q��T¨Xê[ë]Ĭ`Ưeȱiʳn̶s͹xϻ}н�Ҿ������‹�Ď�ď�Ő�ő�Ǔ�Ǖ�Ȗ�ɘ�ʙ�ʚ�˛�˜�˝�̞�̟�͠�Σ�Υ�ϧ�Ъ�Ѭ�ү�ӱ�Դ�յ�շ�ָ�׹�غ�ؼ�ڽ�ۿ�����������������������������������������������������������������������������������������������������H����ʹ�>t�pYR(�U>}3�����!d��%C���'[��I��)���鳅0�O��M�X0��W<�ҧ-(AI���I���E��U�/}��JM�� �MQ���`�o�j}j��2��
d�K^ƌ��*��K�:}�`�J8a@!�	t,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[`^WfbTkeQwkH�r=�x3�}*��$�������������������������������������������������������������������������������������������������� �� ��"��$��'��)��+��.��0��3��5��8��9��:��<��=��=��?��@��A��C��D��E��G��J��N��T��Y��]«cĮkŰqűuŲyij³�������¸�ĺ�Ż�Ǿ������œ�š�Ø�Ö�Ĕ�Ē�Ē�œ�ƕ�ǖ�ȗ�ə�ʚ�˝�͠�Ϥ�Х�Ч�Ѩ�ҩ�ӫ�ԭ�ծ�ְ�ײ�ش�ٶ�ڸ�۹�ܼ�ݾ�����������������������������������������������������������������������������������H������
]=~R�0V>~3��(!$q�X]�3��;~�u��J���ɣ�`5~�j<ŏ�N���x����t^���N��N!|�����ep��Y��kWl�K��=t�Жƌ��&,��Vn�F"ݫ0 !�	r,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�t;�|-��"������������������������������������������������������������������ ��!��!��"��"��#��$��&��'��(��)��+��-��.��0��2��3��6��9��<��>��A��E��H��J��L��P��Q��R��R��S��T��V��X©[ë^ŭbƮfȱkʴq̷wκ|м�Ѿ�������Î�Ï�Đ�Ē�œ�Ŕ�Ŕ�ŕ�Ɩ�Ɨ�Ƙ�ř�Ŝ�Ş�Ţ�ħ�ĭ�Ķ�����������������������������վ�ֻ�׺�׺�ػ�ڽ���������������������������������������������������������������������������������������������������������������������H����
Le��;p�2)xj�E��d���'ӢG�n��7��Ă���u�{�Z����́��]�)��>u<�Xڇ��E
U�Fջh
i�"Hi޾MK�ˇ��}�8��n,�~���H`%^��iK���ŋ�bR��8x쬱
Jxb@!�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#������������������������������������������������������������������������������������������������������������!��#��$��%��)��,��/��2��7��;��>��@��C��F��I��N��R��U��W��X��Z��]ªaĬdŮgǰlɴt̸}λ�ϼ�н�н�Ѿ�Ѿ�Ѿ�ҿ������������Œ�Í�Ď�Đ�ƒ�Ǖ�ȗ�ə�˝�͠�Σ�Х�Ч�ѩ�ҫ�Ԯ�ձ�״�ط�ٺ�۽�۾��������������������������������������������������������������������������������������������������H����4�n�P
��GQ��Jr*U�>j�Z��VH���ɻtr��}�Z
l�O��;���#�͛&����#�m_+�4�Ե�Bg��D�^)��(�*m_:UO�kj�6��f}ʤ
��}�2��kŻE�l[;{ތ��I8b@!�	q,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�t;�|-��"�������������������������������������������������������������������������������������� ��!��#��%��'��)��+��-��/��2��6��<��D��I��M��P��T��V¨Xé[ī^ŬaƮdƯgǰiȱkȲmɳoɳoɳpɳqɴrɴtʵwʷ{˸~˹�˹�˺�̼�˼�ʼ�ȼ�Ƽ�ż�ļ�ü�½�������������������ƾ�ȼ�ʸ�˵�̱�ͮ�Ϋ�Ω�Χ�Φ�Φ�Υ�Υ�Ϧ�ϧ�Ч�Щ�ѫ�ҭ�Ա�ִ�׷�ع�ټ�ۿ��������������������������������������������������������������������������������������������������H�������ƒ����(u��=�X0�=�	����Rȁ���"��$���u#��BI��d��dBK�����N��L�/��k*	B�w�BR�J��O�&�#�TD���R�"q��1����e�;w�C��6�
�o�9k�N
>!�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#����������������������������������������������������������������������������������������������"��&��*��-��0��3��5��9��;��>��@��C��G��K��N��R��U��X��[ª_«eíjîo¯s°x�����������������������������������������½�ž������¥�¡�Þ�Ü�Ú�Ę�Ŗ�Ɨ�Ƙ�Ǚ�Ț�Ț�ɛ�ʝ�̠�͢�Ϧ�ҭ�ղ�ֵ�غ�ڽ����������������������������������������������������������������������������������������������������������������������������H����*\x��)�)��G"�S���*ةڦ���ͫD�ؾf
��SFP۾R
CV#�n_'����k���H������BN��\�/��f	^����8D��т��E-(�پ}�JQ��	�ٙQe<K�1I
-�6o�<h�,
|' !�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#����������������������������������������������������������������������������������������������!��$��'��)��,��.��1��4��7��;��=��B��H��L��P��T��V��X©Zê\ī_Ůdǰjɳp̷xκϼ�о�ѿ����Ž��Ó�ĕ�ė�ę�Ŝ�Ġ�å������¿�������������������������������������������������������������������������׿�ٿ�ڿ�ھ�������������������������������������������������������������������������������������������������������H����*\Ȱ`$V	)�:�j_+���*��޾QA�lj��}���W�`FR
M��F�ݾL
-�GP޾J
5�c�r_)���i#k_,�[�$΃����T�Ծu�������Xu�T��J���z���ݴ'���N^�V�
L0 !�	w,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��#��������������������������������������������������������������������������������������������"��%��'��*��+��-��0��4��7��9��;��>��D��I��M��Q��U©Zë_ŮfDZlɴrʶv̸zͺ~μ�ϼ�о�п������“�Õ�Ø�Û�ß�á�ť�Ũ�ĩ�ë�­��ÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������H����*T���B����{H�T�v�N*(�>K	G��D�U�[
��sE�\�O
I]$ȮɄ���#8��Ƅ���#�_(����#���7����"x�?�1��ws`�|�fBw� $�����t'�*{N%�DN�]��X&�$j��~����J���;!�	s,�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^hcVtjL�q@�x5�}+��"��������������������������������������������������������������������������������������������������������#��%��)��,��.��0��1��2��3��4��6��8��:��<��>��@��A��C��F��H��J��L��O��Q��S��V��Z��`��g��p��z´�Ÿ�ȹ�ɻ�˼�ͽ�ξ�п����‘�Ò�ē�Ĕ�Ŕ�Ŕ�ƕ�ƕ�Ș�ə�ɚ�ʛ�˝�̞�̟�͠�Ρ�Σ�Ϥ�Ц�Ч�Ѫ�Ҭ�Ӯ�԰�ղ�ִ�׷�ٺ�۽�����������������������������������������������������������������������������������������H��������‚�~��W�!Ak��e3eQ �}�8v�3j�=V#����&��R�i\8��9LX�At�D"̴�Aq�b)\��Af��)t��AN���B�*맂T�m-���>d1u3	
V�9�����-a�}x��eIa)g�r�[�6��;PKW�1\����NNimages/ns-visit.pngnu�[����PNG


IHDR�#B4sRGB���gAMA���a	pHYs��~�tIME�;Q*��tEXtSoftwarepaint.net 4.0.2����IDATx^�[�U��jkk5M�L������I��Ƥ�4�C��)�R$^�Q5*�����p�㥶
6�T�D�؄xW���G�"<�~��/��9k��hO�N����63ߚ��Yk�������b„	�1���{l*�>��2'Ö�J�	g�yf188X�ڵk�(��={���>�+X�hQ1u�����/�;�b���	�{nj�s�9�r�e[o��/��bڴi���^���d�GcGuT"۩��Z�r�)�I'��p�'&�������|��%�R~'�pB��J�O�8��2eJ�8v�ܙ����Hd�h�("�H!Yl�����r1�%:lǶm۲�죏��D6<;�N(UD�(i<�)��'v@���g�e�Gc%�X�Z��"��i�B.�d"���C���}ǖ-[��죏��D6��D�%���@�����|j�6���g��s�d����b4q��z���W7�v��uLM�z���P3��f��z$���E0�H9D�·=�ЉL���*�ϑ-���M�:�dzt�v�-j�r�N�OU�7�w�:�^uM�uŗo�1���lq���LU���s;^����7![��xӤt����u}W�#r��2ɣη�bI��ޮW�~��*4�k#�����l"�>�����DF��><rd󓌉�K@NWg:酦v���U���U��|@�]��G�w�M� 4�Y�<ʚ����C� ��}���#�!�(N��#�Mm2aoSU��X��S�_�^�}U�J^e��u�^�)n'}$_�^�XF}U�J�uq�t�vD]��(���饗�M�6%���{��ŋ�RBH~���k�%��
�^x�x�������4iRI �Z��~z�����?_|����o��fC���&hro��V��o[�]�~��b���Kud|(�o�>@�z��_=��ر#�n�:������x�E W���5|��aΔ̻�"�$6}��BɰG��H�>iK����ԟ�5>�R؁اʍ7�m�
9���Î�S�54=7Έ\< ���֕��s����q��|��ō7ޘt�K.�褳�Y���_�F �J�>��b�ڵ�Ǔ��~��O�|�< <?[�jU�b�
�n�l7�|�~��O��'��?��å�C�vn\�es�-������G��������z�����s�=�s�5״�PlJ����{��s�����#gO?��ȥ�^�~j��bΜ93ɰS<߷ڪK^g�uԕW�˃�6�2�|UOv���$g�>��n��+�MQ�l�@�>� ��}�����/Ov3f�(>���$��/Ү�/]|���z�>�l1<<\���H&;(�`�D=`���Z���F�}M���X�E�O��Y�|y��I��L|�[��!
%7	�Z�"�?�scc�p��
!m�������٘������[�ѰM���f�}���X�_��	��v�>)�cܪbr
R�1r� ��NF�Ҧ_Ay��F����ˡ��Sv�<��b0��-�/H �J}^y��;J�t"��+�,��(/��4�e˖���Cc��b�/mю?��D6�ԎQ[�~ay=ۻm�'QvXjw�D�NG-||�9s���gACX]Hb���d�R�-�=��y����9S�.��m'�3�6�.0��0����_ش��S����3���mlZ9L>�o���Zy��V?�0��C�Lyo�V��Q���YuC�Aר��W�=�E��I��+W�,.��tt���;���j����SO=���@�x��c����'�|��d�;��|�$�w�<���<�L"��nhВv0�7�s��dQ���p}��?1o����{����î���z9��.��9Ӱ�2��U�c8�lFZ6?Af}�k��He��ظ�q�n��`���e����s9|ީc_�KO*���E���W]`,�4���rg�Na<��A��v��'�(������6J��^xa������@6ًp�l &Em��$@w.�u|��m��"��/1"hx7Ƀ�U?xf���'w1�]�@<�gA��_z��;-���U2��̑�K��O���l8�l�n��V��4kO6L����
�Fރ�nݬY�ҍR��>�
�l�k�ݚvDn.n�_�r���+'n\�s�GP>���*�4�����M�����7���Q��g5>����������������Pz�������x��NR��A�8�`������;�f�ʧ�b"�[ �@����_;�';zvJA;7�8���I�h����m�n6C�y=�C�������v�;9�%�]�]y;�����?x�����1c�O[~�w��"���1�z�����^Q�l�.*���;w�㠎����X7gΜ2�<���9�O2�ECҹ��sGK-h#P"��w;v�،DCGJ-Vvڹ����Gy�l@c�x���s�bh�" ���B6̩	� �W.�}�`8�3�i�{�Iq�i�w���o�A}]d���!g�~Nj�֓M����Hw�uW�t�Җ��N�
?��ô}/Y�����1ҿ�d'��+�"S���Ȗ�v
m^;����nA�1���6�o�g��wrl�`ǂb\�s9ɏ�<�$��X�^���b	Q�7�aGƏ�зƹ�0�0�q��6f~Cq.��n`�27(��82f�H��<����#���ٴ!'þ.��䦉�C��V#Y��g6��H��.>��V�(�|��t���Ț5k��F���<Ꭺ����/��<ٚ^0-�`R�)[��k-�CL>�E8�kX��Ţ�e��D^�@<�ט�	!�7%}�֓�x�;w|��q��ӑ���2q]�S��g�׆��q�lȡ���c�N��ȍx9u7�6;!^��]!��ؿ�B���"�
���E:=��޽;�� ��HiNr>s����Ǘ��J�W�ԑb`K"$�O�ΖK��N"����{[%���0�F�@áv�ʻ4��qi�ا�?l��G�v#r�Nz�F�T�[�U�����h}ͱ6��n�������?6�-���j��W
�2v��&&fY�tÎ́:;,�3���o�����:��|���U�������M����^���ˉxw�}wi�`��$ۺu��i��/s���=��u.(I��:�U�E�R���O�苣!B�<ر�t1�yf�OAmb�����Kc7?>��R�3���	�t,~�`�V���h����''j��z֥�����Hª�5O�܉�_��y�e|��Z��O�a��F��kM�x�M|vh|ԏ�����Zv������`8�<��Cţ�>�.r����O�h|�|��b�ܹ�oł@{H���q!���m�d��d�{�Xt�lJcP���U��������J>��3W�d�w72�r�R/*x�����15O������pU
��n�ɟΘ����>}?ȫ�#y�:n6�t�>(EnP�:G;�SW|͙���G]/(�Ƃ����し;?B���K"R�q�iWX�zu�o� &I�?�‡� ���W_}�͆���M�o�r�I�	S�J���:_g@xJ���l��N���:�}��c��rz�OJ���kVŬ���Xs�nݺ�J��|�X1���M$��D� ��CGClT�:+GC6!����ʶ*^]l����9ߺx^We�!�:�&q�h��i�W�ʶnM�ݠ$��|"�1T��?:Ҏ@�K/�l�&�d׫��u�.��4�*t뇽|�o�����uB��&}	u�U�G��J^�Sg[W���wB";Mܡ�C�u��@	�}�h��&�I�dӍ�h��д�n�B7z�c��G�tu�UvQީ��uU�nQ�l"�'��詫�޷EJ�:%8��ٺ���r��2�;%h�z�N}����.��񲪘�w��ɫlr�ֶS?u��+�۾����+Ɒ)D�^w�n'�ľʦ��r��:Ő�ήS�����x�ʫ�)�f>��KI6��¯$�uO�^����	��M�]��E&/!�-��t�䈈����O�l}�uL�<�\���#�Duo#����:�"����X�…�T�Q��z/����iӇ��RU��Gc|�/�c�7~]�i�&�*��>� �����S�h�IEND�B`�PKW�1\�P� �
�
images/ns-like.pngnu�[����PNG


IHDR�% ,'*sRGB���gAMA���a	pHYs��~�tIME�8lH�tEXtSoftwarepaint.net 4.0.2���
IDATx^�O����0M��h�}p�%c�v\�Up�储 (��)k�kF��(*h2m�/�;��6i�t:���ML����}����yU 1�=?|=�s��Lr>��s.�#�?�-_�'��iyl��6Rxt#��҆�b�E2]'ca1����M�F�·B�1��&���:C���p_��Q ��x���_{��w~EM�LM��P�Qj�8��Qjl��֯���?�e}��2^��}���}��:��Xc;�q����Y1v|�}�k�������]^��"��U�
i���g�H{>�M�k�Ү�aʮ���۴��m���Y>�J��O�Ҏ�aʪ�%��;v;���*nZ�5�-�8��V5(c��w��ė�!����H#�@�Ǵܣw)��!����d�2*i[-`�-\}��72q��я��*��~���V��y7ig�Z{���H#�@�Įbm��6������0�Gʪb@*v��#��]��<1�E?JP"7�K�����V�9ߠ%�5��E�<�1��"���(Y���
P8�}�(�0�Y�� �W��%�;9of�u�okE�F~��q_��Q�ʃ�=�2�ܰ�u}
�$����8 ���oA6h�*17^: �5�Ƥ�_�z�id���=�܂KAҍ�V6`C�n�:��b�1q���;*���G>�˜�)X:ךo嗲��f��Gy��A�~��
@�>�~����2�]p{��h(�9��:��mv��H��a|s:
6��1�%�
&�v�n�Z�q�N�t.��G[�E]r�]3f�ӣZji�
�@hc�HL� �mʧ�W��W������Qf�
;�…9�J�!��`���Q�x�`��X�΂R�

��Пrh�Vl�E?�N�l��K�($,�>��Zri���>��8� N�G����Ϗ�������gϞ
��W�n�p��
��'O�p�}�;��37�|]���g99x�+`*cL��l>�^���H��a	4g�F�(töQ>��kv0��^h#gf)��gJGDl@��Kw���{���'Or�<(��1���FGG����Ϸ˂�;�_X��9�<w�:~��	C����9���D��3
\y��(�FWx l~�h]��T�G?��1��'��E�T�0]�;]���%��\�"?�J+�^0+��T.�M844�M�1��ԩS�l|Ա�[ZZb|gxxXt��=�s�1���^@A�9�����`�w~�gؒ���Ez	��u�Ҋ�ť2J{(�t�(�1��4k�z
Y�N�����>�*��3�u��B��
^ʁ��|�{J����9߅�as���NiOEX���C*))9ǝ�AY]]-u��<r`�c��q��ʐX�ŽuЂ}�h��:�+du*�
�%z[)���/	����JK�C�{*��\��L���csc��9��c��㓕‰{�yx��m3
N��a��u`�{)��W(��_@�Xja;��Ù�̣�a�rDY�H?�`��㹴t}������΅�p?-\Ι����E|��q_����
�?�s����jddDr��Z����Շ8��-N�0�:4�+q0L����	\	x�Y�&�2�\���J��+Shɪ4Z�2Y�G���c�x)�芔r�d�P�(.��.1�X�p4Ա�O�>Myyy�KaE�w#�!����Rb@�&�u�y��}ɥ�M�P)d�A����?~,�F�!q0�WtY6��(�«�x��K��3\:���9��_҂�x
Y�D��a�Z�]rN�<s$���7Ї�SL9��`ظ�`��h���I�:�£��QHЧqN(q��Xa.�9��"\�0�X�v�ț�c8�K8�w##��5J,�{��#b���uw������f�l��T)/�C=ܟ_{�rD8�Op=n&��g��f�
`��L0���67����_s�]�mr;^�Z�b�[�
�؊����@b���VĮR�c ���waW��}W���m��!���Ï���%&u���N�L�l8�r.����3�dæF]��:�R(4�6�;���귻��\�௷�h8���c�uS�>��J,���/d�Ĥ�j���v��L����S�%�&�Th#gBa�����KSL�r�܄�M��p
���<ӿ0�ѯG@瘛�n��ox�c��ex��������Xu��0pI�:h���,\O�2P �a.bጀ7�{�Ή����S9"B�	q��b�w�7�pw���Ą
~h��;���������?
h�=�>�a:�(pŀ5�3��8�Uw��`$p�(΅;؇��Qb~��;����<�������B;��i}��5�Et�©�1�nb���ŋ^�����ܤ�@0�9�6|m��Z����<��<+�
lzq2���(�<�B�z�`�@��S�y>��Պ-�`�,p���T<y�}�p<���M��6���,�fZ�����G�i}:�F��XH]R*(cs;����c �Ȅ�V�9o
��Z�1w�8@A\L�jl^�%΁|Cc
�cr�i�GD#�@��_���$.�@��~��D|��xe����.�Mڒ�c�r/Qt���к��q�뜶��/˳"���O\��!��M�c��vH1�>�X�S��w��`�|�R�N\������:�D�K������<ˣ'�@�胤Π�������X���Zu��su��pn�'tQ{ڌ����$��J��2�$�œ��H՞��b�C�+�|��砼h9"����Q����0����$X�B�x

�64�Xg�P�1_n��d ��j���G��z�id��b��(f7@���ǽ��m��#v���q�P���&�|�1��~g��q��=�r<��{�8�QPʳ%�m�M�� >��*w+@�p��E��p�я�D?���R�Q�0sP�{1����e�Y�8����H#�@���X�M;C��/P���f��v��ȝ�~��-R��qN@@�����lm���g_i#s5~�ϥ������פ5Su�5^��"��U��'����^Z�TG�"jhqD��В�U�tK��Qj
�)�� �k��X�_�<H�6WR��ZZ��:\�MOy=�42
T�?O�Nп����ǭ?��/�L�M��!g�u�?/ҺS����?��w���O
\F�(��s�8nԻ�IEND�B`�PKW�1\?qj�]]images/loading.gifnu�[���GIF89a������������Ƶ�������������祥�����<<<���%%%���ddd>>>ooo...���}}}:::���AAA@@@kkk555���ggg???sss===///vvv���999!�NETSCAPE2.0��!�,@�@���Fš0Aj�B� ,F�`D*�`D��U
C2-1H"F!����BoC$aP	
Jh��#ox�OCh"x{bE#ueD�	h�		�J���f}D_�
Z`��S�	�P�BV�sA!�,
F��p�H��D�a
	C��tl.0��P�d����)0�h��@1D��@4D��B�@@�}D
K�h�A!�,C@�p( 
�C��h0N$3� 9I%)��0X��AH��CA�5�J
E A8.�7a!D�
FC
R�A!�,

< #2A2�
!&X�*�$W<����@ ���r�'3p�:Lլ��dE@���PE!!�	,
> �h�
0bb���t���L�9*�f4��D�̤pzMdqx�d�G� ���|�	"�i��E!�,[���O�! �l” WrpJR<����b8
X���01���������f�`4BCL�@$@�Pp���P��Q���h.!�,
;�"�B$�8$‘�ś
IB�J�ah:IJF�A,ac�l�@�:D�"kHi�M �$�B!�	,
B�"�$���a�,0���B(+Z��&��bA8x�à�XvD��)xDa��<=��0p�`�GƢ�B!�,\ �$��0��� ��2�13�r3j��� Q!!sZ"E�����
AD�DaH��!�D Y&�,܌6�ex$�
7)A'&.!!�,

8�"�h��$M�yBS<��A���	
�!��rHN��"Q
$&kZZ�4�)!�,
A���(,���P���(�l��˪yh�H�l
�b�xx�(��[_~XYpA!�,:�"T!�
E��8P��L00M�AO�yV�Dex��p>��}�	a10�-D���A
;PKW�1\3����images/cloner-admin-icon.pngnu�[����PNG


IHDR��
sRGB���gAMA���a	pHYs���o�dtEXtSoftwarepaint.net 4.0.3��PHIDAT8O��+O�@����$`��
���`VB�`5�dQ�vZx�B���m�ҕuX�p&\s7����dv�{���l��dY����gX��>���y�XOi�?�eS�(��XZ��C'���i��B�����Q��8�(� ²�o,1�H|�i9�)8(}�rSڄx� %���B�����0g��t	Q�#je��|��.a�${EQL�S�&)8]²,"׃W����4M�I�+ı�H��m{����-)��Rn୙Br�D��Gd�����:�u;|��a���42��*UUm�X�8>�}]cG��
y��B,��a��]��$-FIEND�B`�PKW�1\ʮ,�HHimages/spinner.gifnu�[���GIF89a���ݞ�������������뀀����!�NETSCAPE2.0!�	,@\x��.&�I�`V)@+ZD(�$˰���k�b�L��w�,��H�� �@G\��e�7S�(C�*8q��|��%L{�(t'����!�	,Px�0"&��)��C��
���F0��g���H5M�#�$��l:5̧`��L�J���D��E���`����X!�	,Px�0"F��)��C��
$PJ!n���g�ậ}����ۭ4��2�l:m�'G"�L�CZw9*e9���(=���4�$!�	,Px�0"F��)��C��E$PJ!rq�wd�1,Cw��ІFO3�m��*�ln�N��3�n(�f �	d�.��=�EC$!+!�	,Nx�0"F��)��C�č�"	��٨�������n�j��q�<*��&g"����S�Z���SL�xI��!�	,Nx�0"F��)��C�č��=�wd�FYp��F�G���3�Uq�ܤ���f"�����3'pݶ$���Xv��Ē!�	,Px�0"F��)��C�č��H~G�n���n�B@ͭ�-��'�AR����C2#�'g"�P�L���j\Nɂ�y,��HT$!�	,Ox�0"F��)��C�č��H~G����\�h7���#�|�0�R#�'g"�P\O!�)`ɜ$�C�X
�cbI!�	,Px�0"F��)��C�č��H~G�������]dn���w�$�@��=���f"�P\�إI�d\�i��y,��1�$!�	,Nx�0"F��)��C�č��H~G������ԯ�Ad�AA�_�C1��a"��h"�P\����d\N��}A��Ē!�	,Ox�0"&��)��C�č��H~G������ԯ�o��`�N��Q�<�̄ȡ���K�&`ɶ��C�X
�cbI!�	,Ox�0"F��)��C�č��H~G������ԯ��)�!��-f���&�@Bq���%`ɶ#�C�X��D�H!�	,Ox�0"F��)��C�č��H~G������ԯ����s���(	��2Lp��֬!��%`ɶ��C�X
���H!�	,Lx�0"F��)��C�č��H~G������ԯ�����\�H��f\�l����]z$��%ÒL�cq:�K!�	,Mx�0"F��)��C�č��H~G������ԯ�����WORd�I�tQ\*�5���%�rJ�cY4 ��%!�	,Lx�0"F��)��C�č��H~G������ԯ�����=��6p&���ek�F��#K���&��"K!�	,Px�0"F��)��C�č��H~G������ԯ���>
p'��ڇ��P��#z
���%n��x,��1�$!�	,Ox�0"F��)��C�č��H~G������ԯ���>
p'	n&9���0�'v�	��K�L�C�X
�cbI!�	,Px�0"F��)��C�č��H~G������ԯ�����Hp#j&����P���0�]z��Ȓ�<L�i��y,��1�$!�	,Ox�0"&��)��C�č��H~G������ԯ�����`��LF����4&B0rJE��L���C�X
�cbI!�	,Nx�0"F��)��C�č��H~G������ԯ����׏�FBr�f��B�M-U�"(�K���	��X��ג!�	,Ox�0"F��)��C�č��H~G������ԯ�����=��3�&��¥���J���`�%�ڒC�X
�ĴH!�	,Kx�0"F��)��C�č��H~G������ԯ�����N8�P��,�X�(�A�] ��3-0U�E�H��!�	,Nx�0"F��)��C�č��H~G������ԯ������E�hL��hr\(9�L� ��.�GM��=9%��,Y�i�!�	,Mx�0"F��)��C�č��H~G������ԯ���.D@P��7��%�(��%��L�cY4D�"!�	,Px�0"F��)��C�č��H~G������ԯ�����᲋����0PR���|Q���J�d\�i��y,��1�$!�	,Mx�0"F��)��C�č��H~G������ԯ���8�.�a�D�'1��ɡ����&`ɶ*�"
�t��%!�	,Lx�0"F��)��C�č��H~G������ԯc��"����@�b��,��$ʡ���K
ȒmU%���K!�	,Qx�0"&��)��C�č��H~G������D�֎�5��7ap4��G���Q5��1vI�,�WU�`hˢyL,	!�	,Px�0"F��)��C�č��H~G���D��j�1(D�:S��J`#>��t4�r(Me��	X��Jx�n<�E�)!!�	,Lx�0"F��)��C�č��H~G&
*@D(p�5����
�l^�$0��䚆	tׂ�PJ��T�,�Dzh�$�E!�	,Ox�0"F��)��C�č��3r�wdq�̚y�u�+�ʱ25�0�l��N�s4�r(���]�!��y,`GjbI!�	,Nx�0"F��)��C�č�P��&|G&L�����lB���<z.�r�1]��f"�P��ɉ|�M���Xv��Ē!�	,Px�0"F��)��C�$QJ!Qr�wdưfw[�йg��i�dD�l�^�H1Z�Q
`�w�&c�S�Z`�K)-+!�	,Px�0"F��)��C�dL'PJI
!n�w�:s�pq�N@:�HXr�Z�N�$��P9��3��"c���d�$=���1�$!�,Px�0"F��)��C�d@1p���m����p#A�<0H48�Er�\j�H��7�r(�i`E�t]�j�)z,��1�$;PKW�1\�0�P��images/ns-follow.pngnu�[����PNG


IHDR�%�'|�sRGB���gAMA���a	pHYs��~�tIME�9�t$tEXtSoftwarepaint.net 4.0.2���)IDATx^�]{p�U����$���$��qFw�u�V׭�bgj\]Gdqp\�M��pVf�	��[<�v��y,O�$<(��]��cX�7�y���Zg���mnn��<ĝ����W��s�=�~��{��#"���G��Z�;�
��e�������q=���+δ
��/_> �3����ҷ�j������҃@[�Kfô!rK\��%�垹���Ǥ��O]bqa�;/ԇ��
NQ�qy����ӡ�2��vy�ݨ��Q��Ey�v��߉��лmq��U���ت~��A�a�8�T�Ե�@�/ZsL�\��Eix/؇���/�~{[%c_�k�%��U�w�J��V	Զ�V��]Qqj���m�UU�f_�z��khyhw���k�{�6���K>��3�O,7��̃ҧ��	�Ĉ��^��J���P6�Z:���e5�|S�VC�"�����w6K�i{�5ڦ�b^���z�)}GB�."ᛑ�T�	ִ�+�$��\;]�h��1��.�*���db��.V��v4�S}^�푖�V�\>n8|��ը�VsQU��-�����J.�RN�r�2���w�IfMG?g2IWU/_����
r��B7>�P��b9�.	�;\ri�PO�r�a�&P�T�� ���Y���."�\�w`~U*���2�P��cc���Ζ��҇��H�l�F2�e�>z���SI��PU�D��o�E� �P��f�.1H���21&IX�H@��z�S�S�A�6j>b�ju��okT�B�\^xo�����ݙ�%���K�L�]Ų�����>���\�@*�p�[������n����%Q��i�daN�D��Y��J���*ؐ|�8��׃\?p���}�5�e�]�`����t��K�e�?^����q���D��jD�8 IA�p����nT6�6�\$�f,����(�!qؒD$(I�jF9���m�7��.�7z�9f2�:/�v�/w����^cS�5/�܆io��m$��H�P�"yw��V�
��Ҥ�U��˨��>f���Er��K�J��y �E@�����=_�$[v[:����WR�<yR�9"~�a�=|��\�x1nDZ
�'��ە
ev,�666��o�M��t,�khhxE��^A�mߔ���p�ԩ�uy���'N��i��f��m��}��\L�X�I�ڌj�m��
d��I�^�'���WqH*��n����d�?Xƒ��>O� ��,��k5���$}�ov�8U͈Ӥ���l�;W./�CgO�6Mƌ�	cǎUIB��'v��	dϞ=p'Nee��=ZBǰ1w�\ec��$	��s�m�37�)c\=��X�]������ޔ龆��몭������~YY����צ[�'ֵ�{����Z��	���M��Q]�1���#�y�����/$巻\�`熞�%�?��䍜&9�&I���$󞿓�%��VEV(�-��X��o-�8���0{�l�����eݺu��F�6/��iݫ��OD���IeW��y��[n��k��1������A�O�9�c���&)��v�z^/������˵���~xá-���u굲5���/E.&<+��&$W��F	l��	�3��H�)�'���	��$�ܯ%�-��*�I�}�%穩�[0SrFΐ�F͐��/J�K��\B���]DK�+uS�6}��\:AH,ske'�	�:Ȟ?���&�Nj]��ӟ�^:
�c�
�i��lݺUͯ��R$f�q���́r�r&��D�iǪ�…!��'�y
�M=�e�}|uP_"����|����=L�`9G$rߣ���E�ܟL����!/H�s%2x��*R���A[��ٔ����Bc�r�) 	�Bo��Hq��B� :9�d�c�ĶB/C��6m�{1�$�^�"l�L\&��N�>h�� ��nV�D����\^���a_��&�1��
��;�F�k��s8������	g"&=�@�F�Ŷn�e����.���_��a�7R�*�����.��J%o�d�<���?���9k\��9�Pc�&���V.�Ejx%�W2І	�,'��<܂�
L@&z��֠�d	�c3^�̏�@�\���5s��>}��W܏ޞRo^Ow�e�V�o���p>��N���㬰��zh����9:W�7�6��,mc�dnj��o>+��s$w�$E���R�5S-��i�;r��G�J���Y"��)���s�?h��>^�����[�"���E.��4	��ᶐ�a�0�4x`��N0�FLv��@�I(&5�������E�63�c�c����n��	Ÿ����|n��ZN�'�͘v|�c�՘}�b,ڲ�ьD�A<�q����U}N�_;��6p��"�@�V�7���xA��w6�|�����Xn+��d
zZ�?y�*�@,i���Jp�*Q��p��>En:^�f��>)���'�K.TG�3+{V�x�%��4���2�~$��c�+������y��Ik��C��@;#�_�e��d�M��q٧-�f��u�ɹ���ƍD���T���{�W��t���y6#�8�6|cE����y�ے�I��QU)&�ۂh��y�[�ll�~v�]�-�.7�x�:c叚��V�}l�#���E���x�Zߙ2_���M" U�-�j)��x�
 �:�W�6�t�;*��L��o�����E��B�)���e&5^q?&HbژqlX	��'�c�i��W
��|]A�u�'�E���`��6$��3^l��s`6�5 �3`h]]�%��~�����֣:!�CHv&<ɖ�$@�q֛�2غ��[s+%$gĴ�ËR��}��@�0���G��yk�pPvHR�7ĉ��������Кsݪ\��D	��%�}����rkXc�oL����>��}��=�$X	�|�A|�&�t���jb�2�k\k|�<Oq�Ζz�AGrqm|/Xɳ!	����}��3(r��o��Qґ��k�%���$m�9E*gC��Q�X���tJ�MzEr��[CV(V*����<��VA�D�\�[�@���U��O��UD%�*� G��'�\L>�;�m�D)..�6�Iu�S�G{Nߥ����9��DŽ���ݻ1�jc��c�h4�G�����=�-R��G�q���uh�s��ؚ���\aW.
]��`�K�(EKT��"��*\?>z��
�C�#�5M��3V��X�c_�@�2	N]$� OZ�H��{�H�tE(>�p�_?]$9�F˝�*>��^�*A"H�F�C�Z{!g: ��l��\L�\6x&cb͚5Kٲ2�b���kJγ�l֕��y���cK�l����3m������u�_"$������6�	�e�:��#4ɨ�"�4~�x5����z��A?�п$�qm����6Ip���I�Y� ?��&���+��< �_r&��/�H|Z��_���-���ȓ�$�g�߄9R��AUB��\�߲V]���$\�Wp[����{�Dw��_C�O�8�a˟E�?bri;:iI*M�q>IC"k���H��6�m�� a9ׄY�h;�u�!��סo$v�f��
�2��=�ґ�$�n.ɚ�{��ٵ��Œ������'�!���''Jx�x	?��D��o'#�V˰�� ٕ�V��X}^���QRW�d��кd&��V��ȕ�r%���
cR��m4��g$V#��/c�x^�̟��Z�m�8{��=z�h�Ξ�a>��}x]w���H�3�];ɡ�D�@�����
"��׸$�\S"��훚噷�2��#�ѿ���t�O�ʷ
~%w��!���^y@�?�*�T5�J���YR+�� �J����AN���
��g����U|���y���~̱W���&�'���7ۮ��>T�J[���H,�&m��E�YB+�/��@M����&?����k����ý���� ���$���� �J�$Q�6��~S��3W�/2��N�/>�%�-7��t^וllʽd6麚��g2�v���C��Մ	���cM���󒹲Y���>�8$Oy�"�S�J�� w*܊�*���e.�eF�
�_��r龝����y�Ao}�k��=���_2Y2�����G�p����	�1�<hY�H.�.��Fb��X��[<�)�MV�뇄���)���r�56N����8�3�[T��ri�	`��T?���ux%iw�f�J$3u�d�����_�ʅ$w�� Q����?���$��r��$#1�2����
؁pjH�t���-%H�����cE��1��!��(v�$K��$Z2]W�����3��9z��u����G��V.��%�[I�XeT���
T��s�X �
����I:g9�N|��9 N�
�C�b�#!A��ï��%-�! ����лJ��!�?���OcwǾ'6=�O$��>:�əY�H�2�$��*
ZB�I"�m�9�
[E��6�U��H��e��O�ikk�?X7���:
��uT���ڱ� �1���QĀ���:-#A��O�žc��*�rTAꖞF��---���%���q=��{�!	-&�)"8KQ��},)KqNZvN�^?�	��0��	�[W������8�OK��cr���m��0����q���{^�G��)	.:-�%�+�%g$u�I���,:�	���}e���%m�I	,�,���ŧ C�q	������/���h��y���ǵ�s��y~��r{�^ɛ�Cr���v���<e�jMP�;u��L١Z�7�&��D��5�\%^\-�a�?s^>���E��q=�i���9��Y�裏����G�۶�~�v-`�f��n�cG��ٳ��b[�s�
��W-7�?��4&\�^OIEND�B`�PKW�1\��7�$;$;6vendor/a5hleyrich/wp-background-processing/license.txtnu�[���        GNU GENERAL PUBLIC LICENSE
           Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
              51 Franklin St, Fifth Floor, Boston, MA 02110, USA

 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

          Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

        GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

          NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

         END OF TERMS AND CONDITIONSPKW�1\��W��(�(Lvendor/a5hleyrich/wp-background-processing/classes/wp-background-process.phpnu�[���<?php
/**
 * WP Background Process
 *
 * @package WP-Background-Processing
 */

/**
 * Abstract WP_Background_Process class.
 *
 * @abstract
 * @extends WP_Async_Request
 */
abstract class WP_Background_Process extends WP_Async_Request {

	/**
	 * Action
	 *
	 * (default value: 'background_process')
	 *
	 * @var string
	 * @access protected
	 */
	protected $action = 'background_process';

	/**
	 * Start time of current process.
	 *
	 * (default value: 0)
	 *
	 * @var int
	 * @access protected
	 */
	protected $start_time = 0;

	/**
	 * Cron_hook_identifier
	 *
	 * @var mixed
	 * @access protected
	 */
	protected $cron_hook_identifier;

	/**
	 * Cron_interval_identifier
	 *
	 * @var mixed
	 * @access protected
	 */
	protected $cron_interval_identifier;

	/**
	 * Initiate new background process
	 */
	public function __construct() {
		parent::__construct();

		$this->cron_hook_identifier     = $this->identifier . '_cron';
		$this->cron_interval_identifier = $this->identifier . '_cron_interval';

		add_action( $this->cron_hook_identifier, array( $this, 'handle_cron_healthcheck' ) );
		add_filter( 'cron_schedules', array( $this, 'schedule_cron_healthcheck' ) );
	}

	/**
	 * Dispatch
	 *
	 * @access public
	 * @return void
	 */
	public function dispatch() {
		// Schedule the cron healthcheck.
		$this->schedule_event();

		// Perform remote post.
		return parent::dispatch();
	}

	/**
	 * Push to queue
	 *
	 * @param mixed $data Data.
	 *
	 * @return $this
	 */
	public function push_to_queue( $data ) {
		$this->data[] = $data;

		return $this;
	}

	/**
	 * Save queue
	 *
	 * @return $this
	 */
	public function save() {
		$key = $this->generate_key();

		if ( ! empty( $this->data ) ) {
			update_site_option( $key, $this->data );
		}

		return $this;
	}

	/**
	 * Update queue
	 *
	 * @param string $key  Key.
	 * @param array  $data Data.
	 *
	 * @return $this
	 */
	public function update( $key, $data ) {
		if ( ! empty( $data ) ) {
			update_site_option( $key, $data );
		}

		return $this;
	}

	/**
	 * Delete queue
	 *
	 * @param string $key Key.
	 *
	 * @return $this
	 */
	public function delete( $key ) {
		delete_site_option( $key );

		return $this;
	}

	/**
	 * Generate key
	 *
	 * Generates a unique key based on microtime. Queue items are
	 * given a unique key so that they can be merged upon save.
	 *
	 * @param int $length Length.
	 *
	 * @return string
	 */
	protected function generate_key( $length = 64 ) {
		$unique  = md5( microtime() . rand() );
		$prepend = $this->identifier . '_batch_';

		return substr( $prepend . $unique, 0, $length );
	}

	/**
	 * Maybe process queue
	 *
	 * Checks whether data exists within the queue and that
	 * the process is not already running.
	 */
	public function maybe_handle() {
		// Don't lock up other requests while processing
		session_write_close();

		if ( $this->is_process_running() ) {
			// Background process already running.
			wp_die();
		}

		if ( $this->is_queue_empty() ) {
			// No data to process.
			wp_die();
		}

		check_ajax_referer( $this->identifier, 'nonce' );

		$this->handle();

		wp_die();
	}

	/**
	 * Is queue empty
	 *
	 * @return bool
	 */
	protected function is_queue_empty() {
		global $wpdb;

		$table  = $wpdb->options;
		$column = 'option_name';

		if ( is_multisite() ) {
			$table  = $wpdb->sitemeta;
			$column = 'meta_key';
		}

		$key = $wpdb->esc_like( $this->identifier . '_batch_' ) . '%';

		$count = $wpdb->get_var( $wpdb->prepare( "
			SELECT COUNT(*)
			FROM {$table}
			WHERE {$column} LIKE %s
		", $key ) );

		return ( $count > 0 ) ? false : true;
	}

	/**
	 * Is process running
	 *
	 * Check whether the current process is already running
	 * in a background process.
	 */
	protected function is_process_running() {
		if ( get_site_transient( $this->identifier . '_process_lock' ) ) {
			// Process already running.
			return true;
		}

		return false;
	}

	/**
	 * Lock process
	 *
	 * Lock the process so that multiple instances can't run simultaneously.
	 * Override if applicable, but the duration should be greater than that
	 * defined in the time_exceeded() method.
	 */
	protected function lock_process() {
		$this->start_time = time(); // Set start time of current process.

		$lock_duration = ( property_exists( $this, 'queue_lock_time' ) ) ? $this->queue_lock_time : 60; // 1 minute
		$lock_duration = apply_filters( $this->identifier . '_queue_lock_time', $lock_duration );

		set_site_transient( $this->identifier . '_process_lock', microtime(), $lock_duration );
	}

	/**
	 * Unlock process
	 *
	 * Unlock the process so that other instances can spawn.
	 *
	 * @return $this
	 */
	protected function unlock_process() {
		delete_site_transient( $this->identifier . '_process_lock' );

		return $this;
	}

	/**
	 * Get batch
	 *
	 * @return stdClass Return the first batch from the queue
	 */
	protected function get_batch() {
		global $wpdb;

		$table        = $wpdb->options;
		$column       = 'option_name';
		$key_column   = 'option_id';
		$value_column = 'option_value';

		if ( is_multisite() ) {
			$table        = $wpdb->sitemeta;
			$column       = 'meta_key';
			$key_column   = 'meta_id';
			$value_column = 'meta_value';
		}

		$key = $wpdb->esc_like( $this->identifier . '_batch_' ) . '%';

		$query = $wpdb->get_row( $wpdb->prepare( "
			SELECT *
			FROM {$table}
			WHERE {$column} LIKE %s
			ORDER BY {$key_column} ASC
			LIMIT 1
		", $key ) );

		$batch       = new stdClass();
		$batch->key  = $query->$column;
		$batch->data = maybe_unserialize( $query->$value_column );

		return $batch;
	}

	/**
	 * Handle
	 *
	 * Pass each queue item to the task handler, while remaining
	 * within server memory and time limit constraints.
	 */
	protected function handle() {
		$this->lock_process();

		do {
			$batch = $this->get_batch();

			foreach ( $batch->data as $key => $value ) {
				$task = $this->task( $value );

				if ( false !== $task ) {
					$batch->data[ $key ] = $task;
				} else {
					unset( $batch->data[ $key ] );
				}

				if ( $this->time_exceeded() || $this->memory_exceeded() ) {
					// Batch limits reached.
					break;
				}
			}

			// Update or delete current batch.
			if ( ! empty( $batch->data ) ) {
				$this->update( $batch->key, $batch->data );
			} else {
				$this->delete( $batch->key );
			}
		} while ( ! $this->time_exceeded() && ! $this->memory_exceeded() && ! $this->is_queue_empty() );

		$this->unlock_process();

		// Start next batch or complete process.
		if ( ! $this->is_queue_empty() ) {
			$this->dispatch();
		} else {
			$this->complete();
		}

		wp_die();
	}

	/**
	 * Memory exceeded
	 *
	 * Ensures the batch process never exceeds 90%
	 * of the maximum WordPress memory.
	 *
	 * @return bool
	 */
	protected function memory_exceeded() {
		$memory_limit   = $this->get_memory_limit() * 0.9; // 90% of max memory
		$current_memory = memory_get_usage( true );
		$return         = false;

		if ( $current_memory >= $memory_limit ) {
			$return = true;
		}

		return apply_filters( $this->identifier . '_memory_exceeded', $return );
	}

	/**
	 * Get memory limit
	 *
	 * @return int
	 */
	protected function get_memory_limit() {
		if ( function_exists( 'ini_get' ) ) {
			$memory_limit = ini_get( 'memory_limit' );
		} else {
			// Sensible default.
			$memory_limit = '128M';
		}

		if ( ! $memory_limit || - 1 === intval( $memory_limit ) ) {
			// Unlimited, set to 32GB.
			$memory_limit = '32000M';
		}

		return wp_convert_hr_to_bytes( $memory_limit );
	}

	/**
	 * Time exceeded.
	 *
	 * Ensures the batch never exceeds a sensible time limit.
	 * A timeout limit of 30s is common on shared hosting.
	 *
	 * @return bool
	 */
	protected function time_exceeded() {
		$finish = $this->start_time + apply_filters( $this->identifier . '_default_time_limit', 20 ); // 20 seconds
		$return = false;

		if ( time() >= $finish ) {
			$return = true;
		}

		return apply_filters( $this->identifier . '_time_exceeded', $return );
	}

	/**
	 * Complete.
	 *
	 * Override if applicable, but ensure that the below actions are
	 * performed, or, call parent::complete().
	 */
	protected function complete() {
		// Unschedule the cron healthcheck.
		$this->clear_scheduled_event();
	}

	/**
	 * Schedule cron healthcheck
	 *
	 * @access public
	 *
	 * @param mixed $schedules Schedules.
	 *
	 * @return mixed
	 */
	public function schedule_cron_healthcheck( $schedules ) {
		$interval = apply_filters( $this->identifier . '_cron_interval', 5 );

		if ( property_exists( $this, 'cron_interval' ) ) {
			$interval = apply_filters( $this->identifier . '_cron_interval', $this->cron_interval );
		}

		// Adds every 5 minutes to the existing schedules.
		$schedules[ $this->identifier . '_cron_interval' ] = array(
			'interval' => MINUTE_IN_SECONDS * $interval,
			'display'  => sprintf( __( 'Every %d Minutes' ), $interval ),
		);

		return $schedules;
	}

	/**
	 * Handle cron healthcheck
	 *
	 * Restart the background process if not already running
	 * and data exists in the queue.
	 */
	public function handle_cron_healthcheck() {
		if ( $this->is_process_running() ) {
			// Background process already running.
			exit;
		}

		if ( $this->is_queue_empty() ) {
			// No data to process.
			$this->clear_scheduled_event();
			exit;
		}

		$this->handle();

		exit;
	}

	/**
	 * Schedule event
	 */
	protected function schedule_event() {
		if ( ! wp_next_scheduled( $this->cron_hook_identifier ) ) {
			wp_schedule_event( time(), $this->cron_interval_identifier, $this->cron_hook_identifier );
		}
	}

	/**
	 * Clear scheduled event
	 */
	protected function clear_scheduled_event() {
		$timestamp = wp_next_scheduled( $this->cron_hook_identifier );

		if ( $timestamp ) {
			wp_unschedule_event( $timestamp, $this->cron_hook_identifier );
		}
	}

	/**
	 * Cancel Process
	 *
	 * Stop processing queue items, clear cronjob and delete batch.
	 *
	 */
	public function cancel_process() {
		if ( ! $this->is_queue_empty() ) {
			$batch = $this->get_batch();

			$this->delete( $batch->key );

			wp_clear_scheduled_hook( $this->cron_hook_identifier );
		}

	}

	/**
	 * Task
	 *
	 * Override this method to perform any actions required on each
	 * queue item. Return the modified item for further processing
	 * in the next pass through. Or, return false to remove the
	 * item from the queue.
	 *
	 * @param mixed $item Queue item to iterate over.
	 *
	 * @return mixed
	 */
	abstract protected function task( $item );

}PKW�1\����Gvendor/a5hleyrich/wp-background-processing/classes/wp-async-request.phpnu�[���<?php
/**
 * WP Async Request
 *
 * @package WP-Background-Processing
 */

/**
 * Abstract WP_Async_Request class.
 *
 * @abstract
 */
abstract class WP_Async_Request {

	/**
	 * Prefix
	 *
	 * (default value: 'wp')
	 *
	 * @var string
	 * @access protected
	 */
	protected $prefix = 'wp';

	/**
	 * Action
	 *
	 * (default value: 'async_request')
	 *
	 * @var string
	 * @access protected
	 */
	protected $action = 'async_request';

	/**
	 * Identifier
	 *
	 * @var mixed
	 * @access protected
	 */
	protected $identifier;

	/**
	 * Data
	 *
	 * (default value: array())
	 *
	 * @var array
	 * @access protected
	 */
	protected $data = array();

	/**
	 * Initiate new async request
	 */
	public function __construct() {
		$this->identifier = $this->prefix . '_' . $this->action;

		add_action( 'wp_ajax_' . $this->identifier, array( $this, 'maybe_handle' ) );
		add_action( 'wp_ajax_nopriv_' . $this->identifier, array( $this, 'maybe_handle' ) );
	}

	/**
	 * Set data used during the request
	 *
	 * @param array $data Data.
	 *
	 * @return $this
	 */
	public function data( $data ) {
		$this->data = $data;

		return $this;
	}

	/**
	 * Dispatch the async request
	 *
	 * @return array|WP_Error
	 */
	public function dispatch() {
		$url  = add_query_arg( $this->get_query_args(), $this->get_query_url() );
		$args = $this->get_post_args();

		return wp_remote_post( esc_url_raw( $url ), $args );
	}

	/**
	 * Get query args
	 *
	 * @return array
	 */
	protected function get_query_args() {
		if ( property_exists( $this, 'query_args' ) ) {
			return $this->query_args;
		}

		$args = array(
			'action' => $this->identifier,
			'nonce'  => wp_create_nonce( $this->identifier ),
		);

		/**
		 * Filters the post arguments used during an async request.
		 *
		 * @param array $url
		 */
		return apply_filters( $this->identifier . '_query_args', $args );
	}

	/**
	 * Get query URL
	 *
	 * @return string
	 */
	protected function get_query_url() {
		if ( property_exists( $this, 'query_url' ) ) {
			return $this->query_url;
		}

		$url = admin_url( 'admin-ajax.php' );

		/**
		 * Filters the post arguments used during an async request.
		 *
		 * @param string $url
		 */
		return apply_filters( $this->identifier . '_query_url', $url );
	}

	/**
	 * Get post args
	 *
	 * @return array
	 */
	protected function get_post_args() {
		if ( property_exists( $this, 'post_args' ) ) {
			return $this->post_args;
		}

		$args = array(
			'timeout'   => 0.01,
			'blocking'  => false,
			'body'      => $this->data,
			'cookies'   => $_COOKIE,
			'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
		);

		/**
		 * Filters the post arguments used during an async request.
		 *
		 * @param array $args
		 */
		return apply_filters( $this->identifier . '_post_args', $args );
	}

	/**
	 * Maybe handle
	 *
	 * Check for correct nonce and pass to handler.
	 */
	public function maybe_handle() {
		// Don't lock up other requests while processing
		session_write_close();

		check_ajax_referer( $this->identifier, 'nonce' );

		$this->handle();

		wp_die();
	}

	/**
	 * Handle
	 *
	 * Override this method to perform any actions required
	 * during the async request.
	 */
	abstract protected function handle();

}
PKW�1\8=����Gvendor/a5hleyrich/wp-background-processing/wp-background-processing.phpnu�[���<?php
/**
 * WP-Background Processing
 *
 * @package WP-Background-Processing
 */

/*
Plugin Name: WP Background Processing
Plugin URI: https://github.com/A5hleyRich/wp-background-processing
Description: Asynchronous requests and background processing in WordPress.
Author: Delicious Brains Inc.
Version: 1.0
Author URI: https://deliciousbrains.com/
GitHub Plugin URI: https://github.com/A5hleyRich/wp-background-processing
GitHub Branch: master
*/

if ( ! class_exists( 'WP_Async_Request' ) ) {
	require_once plugin_dir_path( __FILE__ ) . 'classes/wp-async-request.php';
}
if ( ! class_exists( 'WP_Background_Process' ) ) {
	require_once plugin_dir_path( __FILE__ ) . 'classes/wp-background-process.php';
}
PKW�1\3���5vendor/a5hleyrich/wp-background-processing/.gitignorenu�[���/vendor/
/.ideaPKW�1\�J`KKK4vendor/a5hleyrich/wp-background-processing/README.mdnu�[���# WP Background Processing

WP Background Processing can be used to fire off non-blocking asynchronous requests or as a background processing tool, allowing you to queue tasks. Check out the [example plugin](https://github.com/A5hleyRich/wp-background-processing-example) or read the [accompanying article](https://deliciousbrains.com/background-processing-wordpress/).

Inspired by [TechCrunch WP Asynchronous Tasks](https://github.com/techcrunch/wp-async-task).

__Requires PHP 5.2+__

## Install

The recommended way to install this library in your project is by loading it through Composer:

```
composer require deliciousbrains/wp-background-processing
```

It is highly recommended to prefix wrap the library class files using [the Mozart package](https://packagist.org/packages/coenjacobs/mozart), to prevent collisions with other projects using this same library.

## Usage

### Async Request

Async requests are useful for pushing slow one-off tasks such as sending emails to a background process. Once the request has been dispatched it will process in the background instantly.

Extend the `WP_Async_Request` class:

```php
class WP_Example_Request extends WP_Async_Request {

	/**
	 * @var string
	 */
	protected $action = 'example_request';

	/**
	 * Handle
	 *
	 * Override this method to perform any actions required
	 * during the async request.
	 */
	protected function handle() {
		// Actions to perform
	}

}
```

##### `protected $action`

Should be set to a unique name.

##### `protected function handle()`

Should contain any logic to perform during the non-blocking request. The data passed to the request will be accessible via `$_POST`.

##### Dispatching Requests

Instantiate your request:

`$this->example_request = new WP_Example_Request();`

Add data to the request if required:

`$this->example_request->data( array( 'value1' => $value1, 'value2' => $value2 ) );`

Fire off the request:

`$this->example_request->dispatch();`

Chaining is also supported:

`$this->example_request->data( array( 'data' => $data ) )->dispatch();`

### Background Process

Background processes work in a similar fashion to async requests but they allow you to queue tasks. Items pushed onto the queue will be processed in the background once the queue has been dispatched. Queues will also scale based on available server resources, so higher end servers will process more items per batch. Once a batch has completed the next batch will start instantly.

Health checks run by default every 5 minutes to ensure the queue is running when queued items exist. If the queue has failed it will be restarted.

Queues work on a first in first out basis, which allows additional items to be pushed to the queue even if it’s already processing.

Extend the `WP_Background_Process` class:

```php
class WP_Example_Process extends WP_Background_Process {

	/**
	 * @var string
	 */
	protected $action = 'example_process';

	/**
	 * Task
	 *
	 * Override this method to perform any actions required on each
	 * queue item. Return the modified item for further processing
	 * in the next pass through. Or, return false to remove the
	 * item from the queue.
	 *
	 * @param mixed $item Queue item to iterate over
	 *
	 * @return mixed
	 */
	protected function task( $item ) {
		// Actions to perform

		return false;
	}

	/**
	 * Complete
	 *
	 * Override if applicable, but ensure that the below actions are
	 * performed, or, call parent::complete().
	 */
	protected function complete() {
		parent::complete();

		// Show notice to user or perform some other arbitrary task...
	}

}
```

##### `protected $action`

Should be set to a unique name.

##### `protected function task( $item )`

Should contain any logic to perform on the queued item. Return `false` to remove the item from the queue or return `$item` to push it back onto the queue for further processing. If the item has been modified and is pushed back onto the queue the current state will be saved before the batch is exited.

##### `protected function complete()`

Optionally contain any logic to perform once the queue has completed.

##### Dispatching Processes

Instantiate your process:

`$this->example_process = new WP_Example_Process();`

**Note:** You must instantiate your process unconditionally. All requests should do this, even if nothing is pushed to the queue.

Push items to the queue:

```php
foreach ( $items as $item ) {
    $this->example_process->push_to_queue( $item );
}
```

Save and dispatch the queue:

`$this->example_process->save()->dispatch();`

### BasicAuth

If your site is behind BasicAuth, both async requests and background processes will fail to complete. This is because WP Background Processing relies on the [WordPress HTTP API](http://codex.wordpress.org/HTTP_API), which requires you to attach your BasicAuth credentials to requests. The easiest way to do this is using the following filter:

```php
function wpbp_http_request_args( $r, $url ) {
	$r['headers']['Authorization'] = 'Basic ' . base64_encode( USERNAME . ':' . PASSWORD );

	return $r;
}
add_filter( 'http_request_args', 'wpbp_http_request_args', 10, 2);
```

## License

[GPLv2+](http://www.gnu.org/licenses/gpl-2.0.html)
PKW�1\�R�txx8vendor/a5hleyrich/wp-background-processing/composer.jsonnu�[���{
  "name": "deliciousbrains/wp-background-processing",
  "description": "WP Background Processing can be used to fire off non-blocking asynchronous requests or as a background processing tool, allowing you to queue tasks.",
  "type": "library",
  "require": {
    "php": ">=5.2"
  },
  "suggest": {
    "coenjacobs/mozart": "Easily wrap this library with your own prefix, to prevent collisions when multiple plugins use this library"
  },
  "license": "GPL-2.0-or-later",
  "authors": [
    {
      "name": "Delicious Brains",
      "email": "nom@deliciousbrains.com"
    }
  ],
  "autoload": {
    "classmap": [ "classes/" ]
  }
}PKW�1\�ߙsuu%vendor/composer/autoload_classmap.phpnu�[���<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'WP_Async_Request' => $vendorDir . '/a5hleyrich/wp-background-processing/classes/wp-async-request.php',
    'WP_Background_Process' => $vendorDir . '/a5hleyrich/wp-background-processing/classes/wp-background-process.php',
);
PKW�1\�桌�	�	!vendor/composer/autoload_real.phpnu�[���<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit8220a43530df22c16ecbd82dcfa9b2be
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit8220a43530df22c16ecbd82dcfa9b2be', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit8220a43530df22c16ecbd82dcfa9b2be', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require_once __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInit8220a43530df22c16ecbd82dcfa9b2be::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        $loader->register(true);

        if ($useStaticLoader) {
            $includeFiles = Composer\Autoload\ComposerStaticInit8220a43530df22c16ecbd82dcfa9b2be::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire8220a43530df22c16ecbd82dcfa9b2be($fileIdentifier, $file);
        }

        return $loader;
    }
}

function composerRequire8220a43530df22c16ecbd82dcfa9b2be($fileIdentifier, $file)
{
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        require $file;

        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
    }
}
PKW�1\�z���4�4vendor/composer/ClassLoader.phpnu�[���<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    http://www.php-fig.org/psr/psr-0/
 * @see    http://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    // PSR-4
    private $prefixLengthsPsr4 = array();
    private $prefixDirsPsr4 = array();
    private $fallbackDirsPsr4 = array();

    // PSR-0
    private $prefixesPsr0 = array();
    private $fallbackDirsPsr0 = array();

    private $useIncludePath = false;
    private $classMap = array();
    private $classMapAuthoritative = false;
    private $missingClasses = array();
    private $apcuPrefix;

    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', $this->prefixesPsr0);
        }

        return array();
    }

    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param array $classMap Class to filename map
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string       $prefix  The prefix
     * @param array|string $paths   The PSR-0 root directories
     * @param bool         $prepend Whether to prepend the directories
     */
    public function add($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = (array) $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string       $prefix  The prefix/namespace, with trailing '\\'
     * @param array|string $paths   The PSR-4 base directories
     * @param bool         $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string       $prefix The prefix
     * @param array|string $paths  The PSR-0 base directories
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string       $prefix The prefix/namespace, with trailing '\\'
     * @param array|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * Unregisters this instance as an autoloader.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return bool|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);

            return true;
        }
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }
}

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 */
function includeFile($file)
{
    include $file;
}
PKW�1\#<����!vendor/composer/autoload_psr4.phpnu�[���<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Kint\\' => array($vendorDir . '/kint-php/kint/src'),
);
PKW�1\ �..vendor/composer/LICENSEnu�[���
Copyright (c) Nils Adermann, Jordi Boggiano

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

PKW�1\4H��"vendor/composer/autoload_files.phpnu�[���<?php

// autoload_files.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    '3917c79c5052b270641b5a200963dbc2' => $vendorDir . '/kint-php/kint/init.php',
);
PKW�1\t�!ו�'vendor/composer/autoload_namespaces.phpnu�[���<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
);
PKW�1\6p(::#vendor/composer/autoload_static.phpnu�[���<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInit8220a43530df22c16ecbd82dcfa9b2be
{
    public static $files = array (
        '3917c79c5052b270641b5a200963dbc2' => __DIR__ . '/..' . '/kint-php/kint/init.php',
    );

    public static $prefixLengthsPsr4 = array (
        'K' => 
        array (
            'Kint\\' => 5,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'Kint\\' => 
        array (
            0 => __DIR__ . '/..' . '/kint-php/kint/src',
        ),
    );

    public static $classMap = array (
        'WP_Async_Request' => __DIR__ . '/..' . '/a5hleyrich/wp-background-processing/classes/wp-async-request.php',
        'WP_Background_Process' => __DIR__ . '/..' . '/a5hleyrich/wp-background-processing/classes/wp-background-process.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInit8220a43530df22c16ecbd82dcfa9b2be::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInit8220a43530df22c16ecbd82dcfa9b2be::$prefixDirsPsr4;
            $loader->classMap = ComposerStaticInit8220a43530df22c16ecbd82dcfa9b2be::$classMap;

        }, null, ClassLoader::class);
    }
}
PKW�1\Ͷ`IFFvendor/composer/installed.jsonnu�[���[
    {
        "name": "a5hleyrich/wp-background-processing",
        "version": "1.0.2",
        "version_normalized": "1.0.2.0",
        "source": {
            "type": "git",
            "url": "https://github.com/deliciousbrains/wp-background-processing.git",
            "reference": "2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800"
        },
        "dist": {
            "type": "zip",
            "url": "https://api.github.com/repos/deliciousbrains/wp-background-processing/zipball/2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800",
            "reference": "2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800",
            "shasum": ""
        },
        "require": {
            "php": ">=5.2"
        },
        "suggest": {
            "coenjacobs/mozart": "Easily wrap this library with your own prefix, to prevent collisions when multiple plugins use this library"
        },
        "time": "2020-07-31T07:00:11+00:00",
        "type": "library",
        "installation-source": "dist",
        "autoload": {
            "classmap": [
                "classes/"
            ]
        },
        "notification-url": "https://packagist.org/downloads/",
        "license": [
            "GPL-2.0-or-later"
        ],
        "authors": [
            {
                "name": "Delicious Brains",
                "email": "nom@deliciousbrains.com"
            }
        ],
        "description": "WP Background Processing can be used to fire off non-blocking asynchronous requests or as a background processing tool, allowing you to queue tasks."
    },
    {
        "name": "harvesthq/chosen",
        "version": "v1.8.7",
        "version_normalized": "1.8.7.0",
        "source": {
            "type": "git",
            "url": "https://github.com/harvesthq/chosen-package.git",
            "reference": "ad86732b668627c131e61ee8f0e6e9ed52e4db8d"
        },
        "dist": {
            "type": "zip",
            "url": "https://api.github.com/repos/harvesthq/chosen-package/zipball/ad86732b668627c131e61ee8f0e6e9ed52e4db8d",
            "reference": "ad86732b668627c131e61ee8f0e6e9ed52e4db8d",
            "shasum": ""
        },
        "time": "2018-06-28T20:32:51+00:00",
        "type": "library",
        "installation-source": "dist",
        "notification-url": "https://packagist.org/downloads/",
        "license": [
            "MIT"
        ],
        "authors": [
            {
                "name": "Koen Punt",
                "homepage": "https://github.com/koenpunt"
            },
            {
                "name": "Patrick Filler",
                "homepage": "https://github.com/pfiller"
            },
            {
                "name": "Christophe Coevoet",
                "homepage": "https://github.com/stof"
            },
            {
                "name": "Ken Earley",
                "homepage": "https://github.com/kenearley"
            }
        ],
        "description": "Chosen is a JavaScript plugin that makes select boxes user-friendly. It is currently available in both jQuery and Prototype flavors.",
        "homepage": "https://harvesthq.github.io/chosen/",
        "keywords": [
            "dropdown",
            "form",
            "input",
            "multiselect",
            "select",
            "ui"
        ]
    },
    {
        "name": "kint-php/kint",
        "version": "4.0-alpha1",
        "version_normalized": "4.0.0.0-alpha1",
        "source": {
            "type": "git",
            "url": "https://github.com/kint-php/kint.git",
            "reference": "5dea34eb550f0dd1ef582f3b785158c13f9c4fd4"
        },
        "dist": {
            "type": "zip",
            "url": "https://api.github.com/repos/kint-php/kint/zipball/5dea34eb550f0dd1ef582f3b785158c13f9c4fd4",
            "reference": "5dea34eb550f0dd1ef582f3b785158c13f9c4fd4",
            "shasum": ""
        },
        "require": {
            "php": ">=5.6"
        },
        "require-dev": {
            "friendsofphp/php-cs-fixer": "^2.0",
            "phpspec/prophecy-phpunit": "^2",
            "phpunit/phpunit": "^9.0",
            "seld/phar-utils": "^1.0",
            "symfony/finder": "^3.0 || ^4.0 || ^5.0",
            "vimeo/psalm": "dev-master"
        },
        "suggest": {
            "ext-ctype": "Simple data type tests",
            "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages",
            "ext-mbstring": "Provides string encoding detection",
            "kint-php/kint-js": "Provides a simplified dump to console.log()",
            "kint-php/kint-twig": "Provides d() and s() functions in twig templates",
            "symfony/polyfill-ctype": "Replacement for ext-ctype if missing",
            "symfony/polyfill-iconv": "Replacement for ext-iconv if missing",
            "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing"
        },
        "time": "2020-11-25T20:18:13+00:00",
        "type": "library",
        "installation-source": "dist",
        "autoload": {
            "files": [
                "init.php"
            ],
            "psr-4": {
                "Kint\\": "src/"
            }
        },
        "notification-url": "https://packagist.org/downloads/",
        "license": [
            "MIT"
        ],
        "authors": [
            {
                "name": "Jonathan Vollebregt",
                "homepage": "https://github.com/jnvsor"
            },
            {
                "name": "Rokas Šleinius",
                "homepage": "https://github.com/raveren"
            },
            {
                "name": "Contributors",
                "homepage": "https://github.com/kint-php/kint/graphs/contributors"
            }
        ],
        "description": "Kint - debugging tool for PHP developers",
        "homepage": "https://kint-php.github.io/kint/",
        "keywords": [
            "debug",
            "kint",
            "php"
        ]
    }
]
PKW�1\K>��$vendor/harvesthq/chosen/package.jsonnu�[���{
  "name": "chosen-js",
  "version": "1.8.7",
  "description": "Chosen is a JavaScript plugin that makes select boxes user-friendly. It is currently available in both jQuery and Prototype flavors.",
  "keywords": [
    "select",
    "multiselect",
    "dropdown",
    "form",
    "input",
    "ui"
  ],
  "homepage": "https://harvesthq.github.io/chosen/",
  "bugs": "https://github.com/harvesthq/chosen/issues",
  "license": "MIT",
  "contributors": [
    {
      "name": "Patrick Filler",
      "url": "https://github.com/pfiller"
    },
    {
      "name": "Christophe Coevoet",
      "url": "https://github.com/stof"
    },
    {
      "name": "Ken Earley",
      "url": "https://github.com/kenearley"
    },
    {
      "name": "Koen Punt",
      "url": "https://github.com/koenpunt"
    }
  ],
  "dependencies": {},
  "files": [
    "chosen.jquery.js",
    "chosen.jquery.min.js",
    "chosen.proto.js",
    "chosen.proto.min.js",
    "chosen.css",
    "chosen.min.css",
    "chosen-sprite@2x.png",
    "chosen-sprite.png"
  ],
  "main": "chosen.jquery.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/harvesthq/chosen.git"
  }
}
PKW�1\����/�/"vendor/harvesthq/chosen/chosen.cssnu�[���/*!
Chosen, a Select Box Enhancer for jQuery and Prototype
by Patrick Filler for Harvest, http://getharvest.com

Version 1.8.7
Full source at https://github.com/harvesthq/chosen
Copyright (c) 2011-2018 Harvest http://getharvest.com

MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
This file is generated by `grunt build`, do not edit it by hand.
*/

/* @group Base */
.chosen-container {
  position: relative;
  display: inline-block;
  vertical-align: middle;
  font-size: 13px;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

.chosen-container * {
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
}

.chosen-container .chosen-drop {
  position: absolute;
  top: 100%;
  z-index: 1010;
  width: 100%;
  border: 1px solid #aaa;
  border-top: 0;
  background: #fff;
  -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
          box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
  clip: rect(0, 0, 0, 0);
  -webkit-clip-path: inset(100% 100%);
          clip-path: inset(100% 100%);
}

.chosen-container.chosen-with-drop .chosen-drop {
  clip: auto;
  -webkit-clip-path: none;
          clip-path: none;
}

.chosen-container a {
  cursor: pointer;
}

.chosen-container .search-choice .group-name, .chosen-container .chosen-single .group-name {
  margin-right: 4px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  font-weight: normal;
  color: #999999;
}

.chosen-container .search-choice .group-name:after, .chosen-container .chosen-single .group-name:after {
  content: ":";
  padding-left: 2px;
  vertical-align: top;
}

/* @end */
/* @group Single Chosen */
.chosen-container-single .chosen-single {
  position: relative;
  display: block;
  overflow: hidden;
  padding: 0 0 0 8px;
  height: 25px;
  border: 1px solid #aaa;
  border-radius: 5px;
  background-color: #fff;
  background: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #fff), color-stop(50%, #f6f6f6), color-stop(52%, #eee), to(#f4f4f4));
  background: linear-gradient(#fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%);
  background-clip: padding-box;
  -webkit-box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, 0.1);
          box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, 0.1);
  color: #444;
  text-decoration: none;
  white-space: nowrap;
  line-height: 24px;
}

.chosen-container-single .chosen-default {
  color: #999;
}

.chosen-container-single .chosen-single span {
  display: block;
  overflow: hidden;
  margin-right: 26px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.chosen-container-single .chosen-single-with-deselect span {
  margin-right: 38px;
}

.chosen-container-single .chosen-single abbr {
  position: absolute;
  top: 6px;
  right: 26px;
  display: block;
  width: 12px;
  height: 12px;
  background: url("chosen-sprite.png") -42px 1px no-repeat;
  font-size: 1px;
}

.chosen-container-single .chosen-single abbr:hover {
  background-position: -42px -10px;
}

.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
  background-position: -42px -10px;
}

.chosen-container-single .chosen-single div {
  position: absolute;
  top: 0;
  right: 0;
  display: block;
  width: 18px;
  height: 100%;
}

.chosen-container-single .chosen-single div b {
  display: block;
  width: 100%;
  height: 100%;
  background: url("chosen-sprite.png") no-repeat 0px 2px;
}

.chosen-container-single .chosen-search {
  position: relative;
  z-index: 1010;
  margin: 0;
  padding: 3px 4px;
  white-space: nowrap;
}

.chosen-container-single .chosen-search input[type="text"] {
  margin: 1px 0;
  padding: 4px 20px 4px 5px;
  width: 100%;
  height: auto;
  outline: 0;
  border: 1px solid #aaa;
  background: url("chosen-sprite.png") no-repeat 100% -20px;
  font-size: 1em;
  font-family: sans-serif;
  line-height: normal;
  border-radius: 0;
}

.chosen-container-single .chosen-drop {
  margin-top: -1px;
  border-radius: 0 0 4px 4px;
  background-clip: padding-box;
}

.chosen-container-single.chosen-container-single-nosearch .chosen-search {
  position: absolute;
  clip: rect(0, 0, 0, 0);
  -webkit-clip-path: inset(100% 100%);
          clip-path: inset(100% 100%);
}

/* @end */
/* @group Results */
.chosen-container .chosen-results {
  color: #444;
  position: relative;
  overflow-x: hidden;
  overflow-y: auto;
  margin: 0 4px 4px 0;
  padding: 0 0 0 4px;
  max-height: 240px;
  -webkit-overflow-scrolling: touch;
}

.chosen-container .chosen-results li {
  display: none;
  margin: 0;
  padding: 5px 6px;
  list-style: none;
  line-height: 15px;
  word-wrap: break-word;
  -webkit-touch-callout: none;
}

.chosen-container .chosen-results li.active-result {
  display: list-item;
  cursor: pointer;
}

.chosen-container .chosen-results li.disabled-result {
  display: list-item;
  color: #ccc;
  cursor: default;
}

.chosen-container .chosen-results li.highlighted {
  background-color: #3875d7;
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
  color: #fff;
}

.chosen-container .chosen-results li.no-results {
  color: #777;
  display: list-item;
  background: #f4f4f4;
}

.chosen-container .chosen-results li.group-result {
  display: list-item;
  font-weight: bold;
  cursor: default;
}

.chosen-container .chosen-results li.group-option {
  padding-left: 15px;
}

.chosen-container .chosen-results li em {
  font-style: normal;
  text-decoration: underline;
}

/* @end */
/* @group Multi Chosen */
.chosen-container-multi .chosen-choices {
  position: relative;
  overflow: hidden;
  margin: 0;
  padding: 0 5px;
  width: 100%;
  height: auto;
  border: 1px solid #aaa;
  background-color: #fff;
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #eee), color-stop(15%, #fff));
  background-image: linear-gradient(#eee 1%, #fff 15%);
  cursor: text;
}

.chosen-container-multi .chosen-choices li {
  float: left;
  list-style: none;
}

.chosen-container-multi .chosen-choices li.search-field {
  margin: 0;
  padding: 0;
  white-space: nowrap;
}

.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
  margin: 1px 0;
  padding: 0;
  height: 25px;
  outline: 0;
  border: 0 !important;
  background: transparent !important;
  -webkit-box-shadow: none;
          box-shadow: none;
  color: #999;
  font-size: 100%;
  font-family: sans-serif;
  line-height: normal;
  border-radius: 0;
  width: 25px;
}

.chosen-container-multi .chosen-choices li.search-choice {
  position: relative;
  margin: 3px 5px 3px 0;
  padding: 3px 20px 3px 5px;
  border: 1px solid #aaa;
  max-width: 100%;
  border-radius: 3px;
  background-color: #eeeeee;
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), to(#eee));
  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
  background-size: 100% 19px;
  background-repeat: repeat-x;
  background-clip: padding-box;
  -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
          box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
  color: #333;
  line-height: 13px;
  cursor: default;
}

.chosen-container-multi .chosen-choices li.search-choice span {
  word-wrap: break-word;
}

.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
  position: absolute;
  top: 4px;
  right: 3px;
  display: block;
  width: 12px;
  height: 12px;
  background: url("chosen-sprite.png") -42px 1px no-repeat;
  font-size: 1px;
}

.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
  background-position: -42px -10px;
}

.chosen-container-multi .chosen-choices li.search-choice-disabled {
  padding-right: 5px;
  border: 1px solid #ccc;
  background-color: #e4e4e4;
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), to(#eee));
  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
  color: #666;
}

.chosen-container-multi .chosen-choices li.search-choice-focus {
  background: #d4d4d4;
}

.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
  background-position: -42px -10px;
}

.chosen-container-multi .chosen-results {
  margin: 0;
  padding: 0;
}

.chosen-container-multi .chosen-drop .result-selected {
  display: list-item;
  color: #ccc;
  cursor: default;
}

/* @end */
/* @group Active  */
.chosen-container-active .chosen-single {
  border: 1px solid #5897fb;
  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
          box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}

.chosen-container-active.chosen-with-drop .chosen-single {
  border: 1px solid #aaa;
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #eee), color-stop(80%, #fff));
  background-image: linear-gradient(#eee 20%, #fff 80%);
  -webkit-box-shadow: 0 1px 0 #fff inset;
          box-shadow: 0 1px 0 #fff inset;
}

.chosen-container-active.chosen-with-drop .chosen-single div {
  border-left: none;
  background: transparent;
}

.chosen-container-active.chosen-with-drop .chosen-single div b {
  background-position: -18px 2px;
}

.chosen-container-active .chosen-choices {
  border: 1px solid #5897fb;
  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
          box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}

.chosen-container-active .chosen-choices li.search-field input[type="text"] {
  color: #222 !important;
}

/* @end */
/* @group Disabled Support */
.chosen-disabled {
  opacity: 0.5 !important;
  cursor: default;
}

.chosen-disabled .chosen-single {
  cursor: default;
}

.chosen-disabled .chosen-choices .search-choice .search-choice-close {
  cursor: default;
}

/* @end */
/* @group Right to Left */
.chosen-rtl {
  text-align: right;
}

.chosen-rtl .chosen-single {
  overflow: visible;
  padding: 0 8px 0 0;
}

.chosen-rtl .chosen-single span {
  margin-right: 0;
  margin-left: 26px;
  direction: rtl;
}

.chosen-rtl .chosen-single-with-deselect span {
  margin-left: 38px;
}

.chosen-rtl .chosen-single div {
  right: auto;
  left: 3px;
}

.chosen-rtl .chosen-single abbr {
  right: auto;
  left: 26px;
}

.chosen-rtl .chosen-choices li {
  float: right;
}

.chosen-rtl .chosen-choices li.search-field input[type="text"] {
  direction: rtl;
}

.chosen-rtl .chosen-choices li.search-choice {
  margin: 3px 5px 3px 0;
  padding: 3px 5px 3px 19px;
}

.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
  right: auto;
  left: 4px;
}

.chosen-rtl.chosen-container-single .chosen-results {
  margin: 0 0 4px 4px;
  padding: 0 4px 0 0;
}

.chosen-rtl .chosen-results li.group-option {
  padding-right: 15px;
  padding-left: 0;
}

.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
  border-right: none;
}

.chosen-rtl .chosen-search input[type="text"] {
  padding: 4px 5px 4px 20px;
  background: url("chosen-sprite.png") no-repeat -30px -20px;
  direction: rtl;
}

.chosen-rtl.chosen-container-single .chosen-single div b {
  background-position: 6px 2px;
}

.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
  background-position: -12px 2px;
}

/* @end */
/* @group Retina compatibility */
@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi), only screen and (min-resolution: 1.5dppx) {
  .chosen-rtl .chosen-search input[type="text"],
  .chosen-container-single .chosen-single abbr,
  .chosen-container-single .chosen-single div b,
  .chosen-container-single .chosen-search input[type="text"],
  .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
  .chosen-container .chosen-results-scroll-down span,
  .chosen-container .chosen-results-scroll-up span {
    background-image: url("chosen-sprite@2x.png") !important;
    background-size: 52px 37px !important;
    background-repeat: no-repeat !important;
  }
}

/* @end */
PKW�1\������!vendor/harvesthq/chosen/README.mdnu�[���# Chosen

Chosen is a library for making long, unwieldy select boxes more user friendly.

- jQuery support: 1.7+
- Prototype support: 1.7+

For **documentation**, usage, and examples, see:
http://harvesthq.github.io/chosen/

For **downloads**, see:
https://github.com/harvesthq/chosen/releases/

### Package managers

Chosen is available through [Bower](https://bower.io/), [npm](https://www.npmjs.com), and [Composer](https://getcomposer.org/), _however, the package names are not the same_.

To install with Bower:

```
bower install chosen
```

To install with npm:

```
npm install chosen-js
```

To install with Composer:

```
composer require harvesthq/chosen
```

The compiled files for these packages are automatically generated and stored in a [2nd Chosen repository](https://github.com/harvesthq/chosen-package). No pull requests will be accepted to that repository.

### Contributing to this project

We welcome all to participate in making Chosen the best software it can be. The repository is maintained by only a few people, but has accepted contributions from over 50 authors after reviewing hundreds of pull requests related to thousands of issues. You can help reduce the maintainers' workload (and increase your chance of having an accepted contribution to Chosen) by following the
[guidelines for contributing](contributing.md).

* [Bug reports](contributing.md#bugs)
* [Feature requests](contributing.md#features)
* [Pull requests](contributing.md#pull-requests)

### Chosen Credits

- Concept and development by [Patrick Filler](http://patrickfiller.com) for [Harvest](http://getharvest.com/).
- Design and CSS by [Matthew Lettini](http://matthewlettini.com/)
- Repository maintained by [@pfiller](http://github.com/pfiller), [@kenearley](http://github.com/kenearley), [@stof](http://github.com/stof), [@koenpunt](http://github.com/koenpunt), and [@tjschuck](http://github.com/tjschuck).
- Chosen includes [contributions by many fine folks](https://github.com/harvesthq/chosen/contributors).
PKW�1\��)d
�
�(vendor/harvesthq/chosen/chosen.jquery.jsnu�[���(function() {
  var $, AbstractChosen, Chosen, SelectParser,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  SelectParser = (function() {
    function SelectParser() {
      this.options_index = 0;
      this.parsed = [];
    }

    SelectParser.prototype.add_node = function(child) {
      if (child.nodeName.toUpperCase() === "OPTGROUP") {
        return this.add_group(child);
      } else {
        return this.add_option(child);
      }
    };

    SelectParser.prototype.add_group = function(group) {
      var group_position, i, len, option, ref, results1;
      group_position = this.parsed.length;
      this.parsed.push({
        array_index: group_position,
        group: true,
        label: group.label,
        title: group.title ? group.title : void 0,
        children: 0,
        disabled: group.disabled,
        classes: group.className
      });
      ref = group.childNodes;
      results1 = [];
      for (i = 0, len = ref.length; i < len; i++) {
        option = ref[i];
        results1.push(this.add_option(option, group_position, group.disabled));
      }
      return results1;
    };

    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
      if (option.nodeName.toUpperCase() === "OPTION") {
        if (option.text !== "") {
          if (group_position != null) {
            this.parsed[group_position].children += 1;
          }
          this.parsed.push({
            array_index: this.parsed.length,
            options_index: this.options_index,
            value: option.value,
            text: option.text,
            html: option.innerHTML,
            title: option.title ? option.title : void 0,
            selected: option.selected,
            disabled: group_disabled === true ? group_disabled : option.disabled,
            group_array_index: group_position,
            group_label: group_position != null ? this.parsed[group_position].label : null,
            classes: option.className,
            style: option.style.cssText
          });
        } else {
          this.parsed.push({
            array_index: this.parsed.length,
            options_index: this.options_index,
            empty: true
          });
        }
        return this.options_index += 1;
      }
    };

    return SelectParser;

  })();

  SelectParser.select_to_array = function(select) {
    var child, i, len, parser, ref;
    parser = new SelectParser();
    ref = select.childNodes;
    for (i = 0, len = ref.length; i < len; i++) {
      child = ref[i];
      parser.add_node(child);
    }
    return parser.parsed;
  };

  AbstractChosen = (function() {
    function AbstractChosen(form_field, options1) {
      this.form_field = form_field;
      this.options = options1 != null ? options1 : {};
      this.label_click_handler = bind(this.label_click_handler, this);
      if (!AbstractChosen.browser_is_supported()) {
        return;
      }
      this.is_multiple = this.form_field.multiple;
      this.set_default_text();
      this.set_default_values();
      this.setup();
      this.set_up_html();
      this.register_observers();
      this.on_ready();
    }

    AbstractChosen.prototype.set_default_values = function() {
      this.click_test_action = (function(_this) {
        return function(evt) {
          return _this.test_active_click(evt);
        };
      })(this);
      this.activate_action = (function(_this) {
        return function(evt) {
          return _this.activate_field(evt);
        };
      })(this);
      this.active_field = false;
      this.mouse_on_container = false;
      this.results_showing = false;
      this.result_highlighted = null;
      this.is_rtl = this.options.rtl || /\bchosen-rtl\b/.test(this.form_field.className);
      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
      this.disable_search_threshold = this.options.disable_search_threshold || 0;
      this.disable_search = this.options.disable_search || false;
      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
      this.group_search = this.options.group_search != null ? this.options.group_search : true;
      this.search_contains = this.options.search_contains || false;
      this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
      this.max_selected_options = this.options.max_selected_options || Infinity;
      this.inherit_select_classes = this.options.inherit_select_classes || false;
      this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
      this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
      this.include_group_label_in_selected = this.options.include_group_label_in_selected || false;
      this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY;
      this.case_sensitive_search = this.options.case_sensitive_search || false;
      return this.hide_results_on_select = this.options.hide_results_on_select != null ? this.options.hide_results_on_select : true;
    };

    AbstractChosen.prototype.set_default_text = function() {
      if (this.form_field.getAttribute("data-placeholder")) {
        this.default_text = this.form_field.getAttribute("data-placeholder");
      } else if (this.is_multiple) {
        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
      } else {
        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
      }
      this.default_text = this.escape_html(this.default_text);
      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
    };

    AbstractChosen.prototype.choice_label = function(item) {
      if (this.include_group_label_in_selected && (item.group_label != null)) {
        return "<b class='group-name'>" + (this.escape_html(item.group_label)) + "</b>" + item.html;
      } else {
        return item.html;
      }
    };

    AbstractChosen.prototype.mouse_enter = function() {
      return this.mouse_on_container = true;
    };

    AbstractChosen.prototype.mouse_leave = function() {
      return this.mouse_on_container = false;
    };

    AbstractChosen.prototype.input_focus = function(evt) {
      if (this.is_multiple) {
        if (!this.active_field) {
          return setTimeout(((function(_this) {
            return function() {
              return _this.container_mousedown();
            };
          })(this)), 50);
        }
      } else {
        if (!this.active_field) {
          return this.activate_field();
        }
      }
    };

    AbstractChosen.prototype.input_blur = function(evt) {
      if (!this.mouse_on_container) {
        this.active_field = false;
        return setTimeout(((function(_this) {
          return function() {
            return _this.blur_test();
          };
        })(this)), 100);
      }
    };

    AbstractChosen.prototype.label_click_handler = function(evt) {
      if (this.is_multiple) {
        return this.container_mousedown(evt);
      } else {
        return this.activate_field();
      }
    };

    AbstractChosen.prototype.results_option_build = function(options) {
      var content, data, data_content, i, len, ref, shown_results;
      content = '';
      shown_results = 0;
      ref = this.results_data;
      for (i = 0, len = ref.length; i < len; i++) {
        data = ref[i];
        data_content = '';
        if (data.group) {
          data_content = this.result_add_group(data);
        } else {
          data_content = this.result_add_option(data);
        }
        if (data_content !== '') {
          shown_results++;
          content += data_content;
        }
        if (options != null ? options.first : void 0) {
          if (data.selected && this.is_multiple) {
            this.choice_build(data);
          } else if (data.selected && !this.is_multiple) {
            this.single_set_selected_text(this.choice_label(data));
          }
        }
        if (shown_results >= this.max_shown_results) {
          break;
        }
      }
      return content;
    };

    AbstractChosen.prototype.result_add_option = function(option) {
      var classes, option_el;
      if (!option.search_match) {
        return '';
      }
      if (!this.include_option_in_results(option)) {
        return '';
      }
      classes = [];
      if (!option.disabled && !(option.selected && this.is_multiple)) {
        classes.push("active-result");
      }
      if (option.disabled && !(option.selected && this.is_multiple)) {
        classes.push("disabled-result");
      }
      if (option.selected) {
        classes.push("result-selected");
      }
      if (option.group_array_index != null) {
        classes.push("group-option");
      }
      if (option.classes !== "") {
        classes.push(option.classes);
      }
      option_el = document.createElement("li");
      option_el.className = classes.join(" ");
      if (option.style) {
        option_el.style.cssText = option.style;
      }
      option_el.setAttribute("data-option-array-index", option.array_index);
      option_el.innerHTML = option.highlighted_html || option.html;
      if (option.title) {
        option_el.title = option.title;
      }
      return this.outerHTML(option_el);
    };

    AbstractChosen.prototype.result_add_group = function(group) {
      var classes, group_el;
      if (!(group.search_match || group.group_match)) {
        return '';
      }
      if (!(group.active_options > 0)) {
        return '';
      }
      classes = [];
      classes.push("group-result");
      if (group.classes) {
        classes.push(group.classes);
      }
      group_el = document.createElement("li");
      group_el.className = classes.join(" ");
      group_el.innerHTML = group.highlighted_html || this.escape_html(group.label);
      if (group.title) {
        group_el.title = group.title;
      }
      return this.outerHTML(group_el);
    };

    AbstractChosen.prototype.results_update_field = function() {
      this.set_default_text();
      if (!this.is_multiple) {
        this.results_reset_cleanup();
      }
      this.result_clear_highlight();
      this.results_build();
      if (this.results_showing) {
        return this.winnow_results();
      }
    };

    AbstractChosen.prototype.reset_single_select_options = function() {
      var i, len, ref, result, results1;
      ref = this.results_data;
      results1 = [];
      for (i = 0, len = ref.length; i < len; i++) {
        result = ref[i];
        if (result.selected) {
          results1.push(result.selected = false);
        } else {
          results1.push(void 0);
        }
      }
      return results1;
    };

    AbstractChosen.prototype.results_toggle = function() {
      if (this.results_showing) {
        return this.results_hide();
      } else {
        return this.results_show();
      }
    };

    AbstractChosen.prototype.results_search = function(evt) {
      if (this.results_showing) {
        return this.winnow_results();
      } else {
        return this.results_show();
      }
    };

    AbstractChosen.prototype.winnow_results = function(options) {
      var escapedQuery, fix, i, len, option, prefix, query, ref, regex, results, results_group, search_match, startpos, suffix, text;
      this.no_results_clear();
      results = 0;
      query = this.get_search_text();
      escapedQuery = query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
      regex = this.get_search_regex(escapedQuery);
      ref = this.results_data;
      for (i = 0, len = ref.length; i < len; i++) {
        option = ref[i];
        option.search_match = false;
        results_group = null;
        search_match = null;
        option.highlighted_html = '';
        if (this.include_option_in_results(option)) {
          if (option.group) {
            option.group_match = false;
            option.active_options = 0;
          }
          if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
            results_group = this.results_data[option.group_array_index];
            if (results_group.active_options === 0 && results_group.search_match) {
              results += 1;
            }
            results_group.active_options += 1;
          }
          text = option.group ? option.label : option.text;
          if (!(option.group && !this.group_search)) {
            search_match = this.search_string_match(text, regex);
            option.search_match = search_match != null;
            if (option.search_match && !option.group) {
              results += 1;
            }
            if (option.search_match) {
              if (query.length) {
                startpos = search_match.index;
                prefix = text.slice(0, startpos);
                fix = text.slice(startpos, startpos + query.length);
                suffix = text.slice(startpos + query.length);
                option.highlighted_html = (this.escape_html(prefix)) + "<em>" + (this.escape_html(fix)) + "</em>" + (this.escape_html(suffix));
              }
              if (results_group != null) {
                results_group.group_match = true;
              }
            } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
              option.search_match = true;
            }
          }
        }
      }
      this.result_clear_highlight();
      if (results < 1 && query.length) {
        this.update_results_content("");
        return this.no_results(query);
      } else {
        this.update_results_content(this.results_option_build());
        if (!(options != null ? options.skip_highlight : void 0)) {
          return this.winnow_results_set_highlight();
        }
      }
    };

    AbstractChosen.prototype.get_search_regex = function(escaped_search_string) {
      var regex_flag, regex_string;
      regex_string = this.search_contains ? escaped_search_string : "(^|\\s|\\b)" + escaped_search_string + "[^\\s]*";
      if (!(this.enable_split_word_search || this.search_contains)) {
        regex_string = "^" + regex_string;
      }
      regex_flag = this.case_sensitive_search ? "" : "i";
      return new RegExp(regex_string, regex_flag);
    };

    AbstractChosen.prototype.search_string_match = function(search_string, regex) {
      var match;
      match = regex.exec(search_string);
      if (!this.search_contains && (match != null ? match[1] : void 0)) {
        match.index += 1;
      }
      return match;
    };

    AbstractChosen.prototype.choices_count = function() {
      var i, len, option, ref;
      if (this.selected_option_count != null) {
        return this.selected_option_count;
      }
      this.selected_option_count = 0;
      ref = this.form_field.options;
      for (i = 0, len = ref.length; i < len; i++) {
        option = ref[i];
        if (option.selected) {
          this.selected_option_count += 1;
        }
      }
      return this.selected_option_count;
    };

    AbstractChosen.prototype.choices_click = function(evt) {
      evt.preventDefault();
      this.activate_field();
      if (!(this.results_showing || this.is_disabled)) {
        return this.results_show();
      }
    };

    AbstractChosen.prototype.keydown_checker = function(evt) {
      var ref, stroke;
      stroke = (ref = evt.which) != null ? ref : evt.keyCode;
      this.search_field_scale();
      if (stroke !== 8 && this.pending_backstroke) {
        this.clear_backstroke();
      }
      switch (stroke) {
        case 8:
          this.backstroke_length = this.get_search_field_value().length;
          break;
        case 9:
          if (this.results_showing && !this.is_multiple) {
            this.result_select(evt);
          }
          this.mouse_on_container = false;
          break;
        case 13:
          if (this.results_showing) {
            evt.preventDefault();
          }
          break;
        case 27:
          if (this.results_showing) {
            evt.preventDefault();
          }
          break;
        case 32:
          if (this.disable_search) {
            evt.preventDefault();
          }
          break;
        case 38:
          evt.preventDefault();
          this.keyup_arrow();
          break;
        case 40:
          evt.preventDefault();
          this.keydown_arrow();
          break;
      }
    };

    AbstractChosen.prototype.keyup_checker = function(evt) {
      var ref, stroke;
      stroke = (ref = evt.which) != null ? ref : evt.keyCode;
      this.search_field_scale();
      switch (stroke) {
        case 8:
          if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
            this.keydown_backstroke();
          } else if (!this.pending_backstroke) {
            this.result_clear_highlight();
            this.results_search();
          }
          break;
        case 13:
          evt.preventDefault();
          if (this.results_showing) {
            this.result_select(evt);
          }
          break;
        case 27:
          if (this.results_showing) {
            this.results_hide();
          }
          break;
        case 9:
        case 16:
        case 17:
        case 18:
        case 38:
        case 40:
        case 91:
          break;
        default:
          this.results_search();
          break;
      }
    };

    AbstractChosen.prototype.clipboard_event_checker = function(evt) {
      if (this.is_disabled) {
        return;
      }
      return setTimeout(((function(_this) {
        return function() {
          return _this.results_search();
        };
      })(this)), 50);
    };

    AbstractChosen.prototype.container_width = function() {
      if (this.options.width != null) {
        return this.options.width;
      } else {
        return this.form_field.offsetWidth + "px";
      }
    };

    AbstractChosen.prototype.include_option_in_results = function(option) {
      if (this.is_multiple && (!this.display_selected_options && option.selected)) {
        return false;
      }
      if (!this.display_disabled_options && option.disabled) {
        return false;
      }
      if (option.empty) {
        return false;
      }
      return true;
    };

    AbstractChosen.prototype.search_results_touchstart = function(evt) {
      this.touch_started = true;
      return this.search_results_mouseover(evt);
    };

    AbstractChosen.prototype.search_results_touchmove = function(evt) {
      this.touch_started = false;
      return this.search_results_mouseout(evt);
    };

    AbstractChosen.prototype.search_results_touchend = function(evt) {
      if (this.touch_started) {
        return this.search_results_mouseup(evt);
      }
    };

    AbstractChosen.prototype.outerHTML = function(element) {
      var tmp;
      if (element.outerHTML) {
        return element.outerHTML;
      }
      tmp = document.createElement("div");
      tmp.appendChild(element);
      return tmp.innerHTML;
    };

    AbstractChosen.prototype.get_single_html = function() {
      return "<a class=\"chosen-single chosen-default\">\n  <span>" + this.default_text + "</span>\n  <div><b></b></div>\n</a>\n<div class=\"chosen-drop\">\n  <div class=\"chosen-search\">\n    <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" />\n  </div>\n  <ul class=\"chosen-results\"></ul>\n</div>";
    };

    AbstractChosen.prototype.get_multi_html = function() {
      return "<ul class=\"chosen-choices\">\n  <li class=\"search-field\">\n    <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" value=\"" + this.default_text + "\" />\n  </li>\n</ul>\n<div class=\"chosen-drop\">\n  <ul class=\"chosen-results\"></ul>\n</div>";
    };

    AbstractChosen.prototype.get_no_results_html = function(terms) {
      return "<li class=\"no-results\">\n  " + this.results_none_found + " <span>" + (this.escape_html(terms)) + "</span>\n</li>";
    };

    AbstractChosen.browser_is_supported = function() {
      if ("Microsoft Internet Explorer" === window.navigator.appName) {
        return document.documentMode >= 8;
      }
      if (/iP(od|hone)/i.test(window.navigator.userAgent) || /IEMobile/i.test(window.navigator.userAgent) || /Windows Phone/i.test(window.navigator.userAgent) || /BlackBerry/i.test(window.navigator.userAgent) || /BB10/i.test(window.navigator.userAgent) || /Android.*Mobile/i.test(window.navigator.userAgent)) {
        return false;
      }
      return true;
    };

    AbstractChosen.default_multiple_text = "Select Some Options";

    AbstractChosen.default_single_text = "Select an Option";

    AbstractChosen.default_no_result_text = "No results match";

    return AbstractChosen;

  })();

  $ = jQuery;

  $.fn.extend({
    chosen: function(options) {
      if (!AbstractChosen.browser_is_supported()) {
        return this;
      }
      return this.each(function(input_field) {
        var $this, chosen;
        $this = $(this);
        chosen = $this.data('chosen');
        if (options === 'destroy') {
          if (chosen instanceof Chosen) {
            chosen.destroy();
          }
          return;
        }
        if (!(chosen instanceof Chosen)) {
          $this.data('chosen', new Chosen(this, options));
        }
      });
    }
  });

  Chosen = (function(superClass) {
    extend(Chosen, superClass);

    function Chosen() {
      return Chosen.__super__.constructor.apply(this, arguments);
    }

    Chosen.prototype.setup = function() {
      this.form_field_jq = $(this.form_field);
      return this.current_selectedIndex = this.form_field.selectedIndex;
    };

    Chosen.prototype.set_up_html = function() {
      var container_classes, container_props;
      container_classes = ["chosen-container"];
      container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
      if (this.inherit_select_classes && this.form_field.className) {
        container_classes.push(this.form_field.className);
      }
      if (this.is_rtl) {
        container_classes.push("chosen-rtl");
      }
      container_props = {
        'class': container_classes.join(' '),
        'title': this.form_field.title
      };
      if (this.form_field.id.length) {
        container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
      }
      this.container = $("<div />", container_props);
      this.container.width(this.container_width());
      if (this.is_multiple) {
        this.container.html(this.get_multi_html());
      } else {
        this.container.html(this.get_single_html());
      }
      this.form_field_jq.hide().after(this.container);
      this.dropdown = this.container.find('div.chosen-drop').first();
      this.search_field = this.container.find('input').first();
      this.search_results = this.container.find('ul.chosen-results').first();
      this.search_field_scale();
      this.search_no_results = this.container.find('li.no-results').first();
      if (this.is_multiple) {
        this.search_choices = this.container.find('ul.chosen-choices').first();
        this.search_container = this.container.find('li.search-field').first();
      } else {
        this.search_container = this.container.find('div.chosen-search').first();
        this.selected_item = this.container.find('.chosen-single').first();
      }
      this.results_build();
      this.set_tab_index();
      return this.set_label_behavior();
    };

    Chosen.prototype.on_ready = function() {
      return this.form_field_jq.trigger("chosen:ready", {
        chosen: this
      });
    };

    Chosen.prototype.register_observers = function() {
      this.container.on('touchstart.chosen', (function(_this) {
        return function(evt) {
          _this.container_mousedown(evt);
        };
      })(this));
      this.container.on('touchend.chosen', (function(_this) {
        return function(evt) {
          _this.container_mouseup(evt);
        };
      })(this));
      this.container.on('mousedown.chosen', (function(_this) {
        return function(evt) {
          _this.container_mousedown(evt);
        };
      })(this));
      this.container.on('mouseup.chosen', (function(_this) {
        return function(evt) {
          _this.container_mouseup(evt);
        };
      })(this));
      this.container.on('mouseenter.chosen', (function(_this) {
        return function(evt) {
          _this.mouse_enter(evt);
        };
      })(this));
      this.container.on('mouseleave.chosen', (function(_this) {
        return function(evt) {
          _this.mouse_leave(evt);
        };
      })(this));
      this.search_results.on('mouseup.chosen', (function(_this) {
        return function(evt) {
          _this.search_results_mouseup(evt);
        };
      })(this));
      this.search_results.on('mouseover.chosen', (function(_this) {
        return function(evt) {
          _this.search_results_mouseover(evt);
        };
      })(this));
      this.search_results.on('mouseout.chosen', (function(_this) {
        return function(evt) {
          _this.search_results_mouseout(evt);
        };
      })(this));
      this.search_results.on('mousewheel.chosen DOMMouseScroll.chosen', (function(_this) {
        return function(evt) {
          _this.search_results_mousewheel(evt);
        };
      })(this));
      this.search_results.on('touchstart.chosen', (function(_this) {
        return function(evt) {
          _this.search_results_touchstart(evt);
        };
      })(this));
      this.search_results.on('touchmove.chosen', (function(_this) {
        return function(evt) {
          _this.search_results_touchmove(evt);
        };
      })(this));
      this.search_results.on('touchend.chosen', (function(_this) {
        return function(evt) {
          _this.search_results_touchend(evt);
        };
      })(this));
      this.form_field_jq.on("chosen:updated.chosen", (function(_this) {
        return function(evt) {
          _this.results_update_field(evt);
        };
      })(this));
      this.form_field_jq.on("chosen:activate.chosen", (function(_this) {
        return function(evt) {
          _this.activate_field(evt);
        };
      })(this));
      this.form_field_jq.on("chosen:open.chosen", (function(_this) {
        return function(evt) {
          _this.container_mousedown(evt);
        };
      })(this));
      this.form_field_jq.on("chosen:close.chosen", (function(_this) {
        return function(evt) {
          _this.close_field(evt);
        };
      })(this));
      this.search_field.on('blur.chosen', (function(_this) {
        return function(evt) {
          _this.input_blur(evt);
        };
      })(this));
      this.search_field.on('keyup.chosen', (function(_this) {
        return function(evt) {
          _this.keyup_checker(evt);
        };
      })(this));
      this.search_field.on('keydown.chosen', (function(_this) {
        return function(evt) {
          _this.keydown_checker(evt);
        };
      })(this));
      this.search_field.on('focus.chosen', (function(_this) {
        return function(evt) {
          _this.input_focus(evt);
        };
      })(this));
      this.search_field.on('cut.chosen', (function(_this) {
        return function(evt) {
          _this.clipboard_event_checker(evt);
        };
      })(this));
      this.search_field.on('paste.chosen', (function(_this) {
        return function(evt) {
          _this.clipboard_event_checker(evt);
        };
      })(this));
      if (this.is_multiple) {
        return this.search_choices.on('click.chosen', (function(_this) {
          return function(evt) {
            _this.choices_click(evt);
          };
        })(this));
      } else {
        return this.container.on('click.chosen', function(evt) {
          evt.preventDefault();
        });
      }
    };

    Chosen.prototype.destroy = function() {
      $(this.container[0].ownerDocument).off('click.chosen', this.click_test_action);
      if (this.form_field_label.length > 0) {
        this.form_field_label.off('click.chosen');
      }
      if (this.search_field[0].tabIndex) {
        this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
      }
      this.container.remove();
      this.form_field_jq.removeData('chosen');
      return this.form_field_jq.show();
    };

    Chosen.prototype.search_field_disabled = function() {
      this.is_disabled = this.form_field.disabled || this.form_field_jq.parents('fieldset').is(':disabled');
      this.container.toggleClass('chosen-disabled', this.is_disabled);
      this.search_field[0].disabled = this.is_disabled;
      if (!this.is_multiple) {
        this.selected_item.off('focus.chosen', this.activate_field);
      }
      if (this.is_disabled) {
        return this.close_field();
      } else if (!this.is_multiple) {
        return this.selected_item.on('focus.chosen', this.activate_field);
      }
    };

    Chosen.prototype.container_mousedown = function(evt) {
      var ref;
      if (this.is_disabled) {
        return;
      }
      if (evt && ((ref = evt.type) === 'mousedown' || ref === 'touchstart') && !this.results_showing) {
        evt.preventDefault();
      }
      if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
        if (!this.active_field) {
          if (this.is_multiple) {
            this.search_field.val("");
          }
          $(this.container[0].ownerDocument).on('click.chosen', this.click_test_action);
          this.results_show();
        } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
          evt.preventDefault();
          this.results_toggle();
        }
        return this.activate_field();
      }
    };

    Chosen.prototype.container_mouseup = function(evt) {
      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
        return this.results_reset(evt);
      }
    };

    Chosen.prototype.search_results_mousewheel = function(evt) {
      var delta;
      if (evt.originalEvent) {
        delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
      }
      if (delta != null) {
        evt.preventDefault();
        if (evt.type === 'DOMMouseScroll') {
          delta = delta * 40;
        }
        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
      }
    };

    Chosen.prototype.blur_test = function(evt) {
      if (!this.active_field && this.container.hasClass("chosen-container-active")) {
        return this.close_field();
      }
    };

    Chosen.prototype.close_field = function() {
      $(this.container[0].ownerDocument).off("click.chosen", this.click_test_action);
      this.active_field = false;
      this.results_hide();
      this.container.removeClass("chosen-container-active");
      this.clear_backstroke();
      this.show_search_field_default();
      this.search_field_scale();
      return this.search_field.blur();
    };

    Chosen.prototype.activate_field = function() {
      if (this.is_disabled) {
        return;
      }
      this.container.addClass("chosen-container-active");
      this.active_field = true;
      this.search_field.val(this.search_field.val());
      return this.search_field.focus();
    };

    Chosen.prototype.test_active_click = function(evt) {
      var active_container;
      active_container = $(evt.target).closest('.chosen-container');
      if (active_container.length && this.container[0] === active_container[0]) {
        return this.active_field = true;
      } else {
        return this.close_field();
      }
    };

    Chosen.prototype.results_build = function() {
      this.parsing = true;
      this.selected_option_count = null;
      this.results_data = SelectParser.select_to_array(this.form_field);
      if (this.is_multiple) {
        this.search_choices.find("li.search-choice").remove();
      } else {
        this.single_set_selected_text();
        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
          this.search_field[0].readOnly = true;
          this.container.addClass("chosen-container-single-nosearch");
        } else {
          this.search_field[0].readOnly = false;
          this.container.removeClass("chosen-container-single-nosearch");
        }
      }
      this.update_results_content(this.results_option_build({
        first: true
      }));
      this.search_field_disabled();
      this.show_search_field_default();
      this.search_field_scale();
      return this.parsing = false;
    };

    Chosen.prototype.result_do_highlight = function(el) {
      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
      if (el.length) {
        this.result_clear_highlight();
        this.result_highlight = el;
        this.result_highlight.addClass("highlighted");
        maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
        visible_top = this.search_results.scrollTop();
        visible_bottom = maxHeight + visible_top;
        high_top = this.result_highlight.position().top + this.search_results.scrollTop();
        high_bottom = high_top + this.result_highlight.outerHeight();
        if (high_bottom >= visible_bottom) {
          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
        } else if (high_top < visible_top) {
          return this.search_results.scrollTop(high_top);
        }
      }
    };

    Chosen.prototype.result_clear_highlight = function() {
      if (this.result_highlight) {
        this.result_highlight.removeClass("highlighted");
      }
      return this.result_highlight = null;
    };

    Chosen.prototype.results_show = function() {
      if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
        this.form_field_jq.trigger("chosen:maxselected", {
          chosen: this
        });
        return false;
      }
      this.container.addClass("chosen-with-drop");
      this.results_showing = true;
      this.search_field.focus();
      this.search_field.val(this.get_search_field_value());
      this.winnow_results();
      return this.form_field_jq.trigger("chosen:showing_dropdown", {
        chosen: this
      });
    };

    Chosen.prototype.update_results_content = function(content) {
      return this.search_results.html(content);
    };

    Chosen.prototype.results_hide = function() {
      if (this.results_showing) {
        this.result_clear_highlight();
        this.container.removeClass("chosen-with-drop");
        this.form_field_jq.trigger("chosen:hiding_dropdown", {
          chosen: this
        });
      }
      return this.results_showing = false;
    };

    Chosen.prototype.set_tab_index = function(el) {
      var ti;
      if (this.form_field.tabIndex) {
        ti = this.form_field.tabIndex;
        this.form_field.tabIndex = -1;
        return this.search_field[0].tabIndex = ti;
      }
    };

    Chosen.prototype.set_label_behavior = function() {
      this.form_field_label = this.form_field_jq.parents("label");
      if (!this.form_field_label.length && this.form_field.id.length) {
        this.form_field_label = $("label[for='" + this.form_field.id + "']");
      }
      if (this.form_field_label.length > 0) {
        return this.form_field_label.on('click.chosen', this.label_click_handler);
      }
    };

    Chosen.prototype.show_search_field_default = function() {
      if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
        this.search_field.val(this.default_text);
        return this.search_field.addClass("default");
      } else {
        this.search_field.val("");
        return this.search_field.removeClass("default");
      }
    };

    Chosen.prototype.search_results_mouseup = function(evt) {
      var target;
      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
      if (target.length) {
        this.result_highlight = target;
        this.result_select(evt);
        return this.search_field.focus();
      }
    };

    Chosen.prototype.search_results_mouseover = function(evt) {
      var target;
      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
      if (target) {
        return this.result_do_highlight(target);
      }
    };

    Chosen.prototype.search_results_mouseout = function(evt) {
      if ($(evt.target).hasClass("active-result") || $(evt.target).parents('.active-result').first()) {
        return this.result_clear_highlight();
      }
    };

    Chosen.prototype.choice_build = function(item) {
      var choice, close_link;
      choice = $('<li />', {
        "class": "search-choice"
      }).html("<span>" + (this.choice_label(item)) + "</span>");
      if (item.disabled) {
        choice.addClass('search-choice-disabled');
      } else {
        close_link = $('<a />', {
          "class": 'search-choice-close',
          'data-option-array-index': item.array_index
        });
        close_link.on('click.chosen', (function(_this) {
          return function(evt) {
            return _this.choice_destroy_link_click(evt);
          };
        })(this));
        choice.append(close_link);
      }
      return this.search_container.before(choice);
    };

    Chosen.prototype.choice_destroy_link_click = function(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      if (!this.is_disabled) {
        return this.choice_destroy($(evt.target));
      }
    };

    Chosen.prototype.choice_destroy = function(link) {
      if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
        if (this.active_field) {
          this.search_field.focus();
        } else {
          this.show_search_field_default();
        }
        if (this.is_multiple && this.choices_count() > 0 && this.get_search_field_value().length < 1) {
          this.results_hide();
        }
        link.parents('li').first().remove();
        return this.search_field_scale();
      }
    };

    Chosen.prototype.results_reset = function() {
      this.reset_single_select_options();
      this.form_field.options[0].selected = true;
      this.single_set_selected_text();
      this.show_search_field_default();
      this.results_reset_cleanup();
      this.trigger_form_field_change();
      if (this.active_field) {
        return this.results_hide();
      }
    };

    Chosen.prototype.results_reset_cleanup = function() {
      this.current_selectedIndex = this.form_field.selectedIndex;
      return this.selected_item.find("abbr").remove();
    };

    Chosen.prototype.result_select = function(evt) {
      var high, item;
      if (this.result_highlight) {
        high = this.result_highlight;
        this.result_clear_highlight();
        if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
          this.form_field_jq.trigger("chosen:maxselected", {
            chosen: this
          });
          return false;
        }
        if (this.is_multiple) {
          high.removeClass("active-result");
        } else {
          this.reset_single_select_options();
        }
        high.addClass("result-selected");
        item = this.results_data[high[0].getAttribute("data-option-array-index")];
        item.selected = true;
        this.form_field.options[item.options_index].selected = true;
        this.selected_option_count = null;
        if (this.is_multiple) {
          this.choice_build(item);
        } else {
          this.single_set_selected_text(this.choice_label(item));
        }
        if (this.is_multiple && (!this.hide_results_on_select || (evt.metaKey || evt.ctrlKey))) {
          if (evt.metaKey || evt.ctrlKey) {
            this.winnow_results({
              skip_highlight: true
            });
          } else {
            this.search_field.val("");
            this.winnow_results();
          }
        } else {
          this.results_hide();
          this.show_search_field_default();
        }
        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
          this.trigger_form_field_change({
            selected: this.form_field.options[item.options_index].value
          });
        }
        this.current_selectedIndex = this.form_field.selectedIndex;
        evt.preventDefault();
        return this.search_field_scale();
      }
    };

    Chosen.prototype.single_set_selected_text = function(text) {
      if (text == null) {
        text = this.default_text;
      }
      if (text === this.default_text) {
        this.selected_item.addClass("chosen-default");
      } else {
        this.single_deselect_control_build();
        this.selected_item.removeClass("chosen-default");
      }
      return this.selected_item.find("span").html(text);
    };

    Chosen.prototype.result_deselect = function(pos) {
      var result_data;
      result_data = this.results_data[pos];
      if (!this.form_field.options[result_data.options_index].disabled) {
        result_data.selected = false;
        this.form_field.options[result_data.options_index].selected = false;
        this.selected_option_count = null;
        this.result_clear_highlight();
        if (this.results_showing) {
          this.winnow_results();
        }
        this.trigger_form_field_change({
          deselected: this.form_field.options[result_data.options_index].value
        });
        this.search_field_scale();
        return true;
      } else {
        return false;
      }
    };

    Chosen.prototype.single_deselect_control_build = function() {
      if (!this.allow_single_deselect) {
        return;
      }
      if (!this.selected_item.find("abbr").length) {
        this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
      }
      return this.selected_item.addClass("chosen-single-with-deselect");
    };

    Chosen.prototype.get_search_field_value = function() {
      return this.search_field.val();
    };

    Chosen.prototype.get_search_text = function() {
      return $.trim(this.get_search_field_value());
    };

    Chosen.prototype.escape_html = function(text) {
      return $('<div/>').text(text).html();
    };

    Chosen.prototype.winnow_results_set_highlight = function() {
      var do_high, selected_results;
      selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
      do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
      if (do_high != null) {
        return this.result_do_highlight(do_high);
      }
    };

    Chosen.prototype.no_results = function(terms) {
      var no_results_html;
      no_results_html = this.get_no_results_html(terms);
      this.search_results.append(no_results_html);
      return this.form_field_jq.trigger("chosen:no_results", {
        chosen: this
      });
    };

    Chosen.prototype.no_results_clear = function() {
      return this.search_results.find(".no-results").remove();
    };

    Chosen.prototype.keydown_arrow = function() {
      var next_sib;
      if (this.results_showing && this.result_highlight) {
        next_sib = this.result_highlight.nextAll("li.active-result").first();
        if (next_sib) {
          return this.result_do_highlight(next_sib);
        }
      } else {
        return this.results_show();
      }
    };

    Chosen.prototype.keyup_arrow = function() {
      var prev_sibs;
      if (!this.results_showing && !this.is_multiple) {
        return this.results_show();
      } else if (this.result_highlight) {
        prev_sibs = this.result_highlight.prevAll("li.active-result");
        if (prev_sibs.length) {
          return this.result_do_highlight(prev_sibs.first());
        } else {
          if (this.choices_count() > 0) {
            this.results_hide();
          }
          return this.result_clear_highlight();
        }
      }
    };

    Chosen.prototype.keydown_backstroke = function() {
      var next_available_destroy;
      if (this.pending_backstroke) {
        this.choice_destroy(this.pending_backstroke.find("a").first());
        return this.clear_backstroke();
      } else {
        next_available_destroy = this.search_container.siblings("li.search-choice").last();
        if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
          this.pending_backstroke = next_available_destroy;
          if (this.single_backstroke_delete) {
            return this.keydown_backstroke();
          } else {
            return this.pending_backstroke.addClass("search-choice-focus");
          }
        }
      }
    };

    Chosen.prototype.clear_backstroke = function() {
      if (this.pending_backstroke) {
        this.pending_backstroke.removeClass("search-choice-focus");
      }
      return this.pending_backstroke = null;
    };

    Chosen.prototype.search_field_scale = function() {
      var div, i, len, style, style_block, styles, width;
      if (!this.is_multiple) {
        return;
      }
      style_block = {
        position: 'absolute',
        left: '-1000px',
        top: '-1000px',
        display: 'none',
        whiteSpace: 'pre'
      };
      styles = ['fontSize', 'fontStyle', 'fontWeight', 'fontFamily', 'lineHeight', 'textTransform', 'letterSpacing'];
      for (i = 0, len = styles.length; i < len; i++) {
        style = styles[i];
        style_block[style] = this.search_field.css(style);
      }
      div = $('<div />').css(style_block);
      div.text(this.get_search_field_value());
      $('body').append(div);
      width = div.width() + 25;
      div.remove();
      if (this.container.is(':visible')) {
        width = Math.min(this.container.outerWidth() - 10, width);
      }
      return this.search_field.width(width);
    };

    Chosen.prototype.trigger_form_field_change = function(extra) {
      this.form_field_jq.trigger("input", extra);
      return this.form_field_jq.trigger("change", extra);
    };

    return Chosen;

  })(AbstractChosen);

}).call(this);
PKW�1\�)s)s+vendor/harvesthq/chosen/chosen.proto.min.jsnu�[���/* Chosen v1.8.7 | (c) 2011-2018 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */

(function(){var e,t,s=function(e,t){return function(){return e.apply(t,arguments)}},i=function(e,t){function s(){this.constructor=e}for(var i in t)r.call(t,i)&&(e[i]=t[i]);return s.prototype=t.prototype,e.prototype=new s,e.__super__=t.prototype,e},r={}.hasOwnProperty;(t=function(){function e(){this.options_index=0,this.parsed=[]}return e.prototype.add_node=function(e){return"OPTGROUP"===e.nodeName.toUpperCase()?this.add_group(e):this.add_option(e)},e.prototype.add_group=function(e){var t,s,i,r,n,o;for(t=this.parsed.length,this.parsed.push({array_index:t,group:!0,label:e.label,title:e.title?e.title:void 0,children:0,disabled:e.disabled,classes:e.className}),o=[],s=0,i=(n=e.childNodes).length;s<i;s++)r=n[s],o.push(this.add_option(r,t,e.disabled));return o},e.prototype.add_option=function(e,t,s){if("OPTION"===e.nodeName.toUpperCase())return""!==e.text?(null!=t&&(this.parsed[t].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:e.value,text:e.text,html:e.innerHTML,title:e.title?e.title:void 0,selected:e.selected,disabled:!0===s?s:e.disabled,group_array_index:t,group_label:null!=t?this.parsed[t].label:null,classes:e.className,style:e.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1},e}()).select_to_array=function(e){var s,i,r,n,o;for(n=new t,i=0,r=(o=e.childNodes).length;i<r;i++)s=o[i],n.add_node(s);return n.parsed},e=function(){function e(t,i){this.form_field=t,this.options=null!=i?i:{},this.label_click_handler=s(this.label_click_handler,this),e.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.on_ready())}return e.prototype.set_default_values=function(){return this.click_test_action=function(e){return function(t){return e.test_active_click(t)}}(this),this.activate_action=function(e){return function(t){return e.activate_field(t)}}(this),this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.is_rtl=this.options.rtl||/\bchosen-rtl\b/.test(this.form_field.className),this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text&&this.options.allow_single_deselect,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null==this.options.enable_split_word_search||this.options.enable_split_word_search,this.group_search=null==this.options.group_search||this.options.group_search,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null==this.options.single_backstroke_delete||this.options.single_backstroke_delete,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null==this.options.display_selected_options||this.options.display_selected_options,this.display_disabled_options=null==this.options.display_disabled_options||this.options.display_disabled_options,this.include_group_label_in_selected=this.options.include_group_label_in_selected||!1,this.max_shown_results=this.options.max_shown_results||Number.POSITIVE_INFINITY,this.case_sensitive_search=this.options.case_sensitive_search||!1,this.hide_results_on_select=null==this.options.hide_results_on_select||this.options.hide_results_on_select},e.prototype.set_default_text=function(){return this.form_field.getAttribute("data-placeholder")?this.default_text=this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.default_text=this.options.placeholder_text_multiple||this.options.placeholder_text||e.default_multiple_text:this.default_text=this.options.placeholder_text_single||this.options.placeholder_text||e.default_single_text,this.default_text=this.escape_html(this.default_text),this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||e.default_no_result_text},e.prototype.choice_label=function(e){return this.include_group_label_in_selected&&null!=e.group_label?"<b class='group-name'>"+this.escape_html(e.group_label)+"</b>"+e.html:e.html},e.prototype.mouse_enter=function(){return this.mouse_on_container=!0},e.prototype.mouse_leave=function(){return this.mouse_on_container=!1},e.prototype.input_focus=function(e){if(this.is_multiple){if(!this.active_field)return setTimeout(function(e){return function(){return e.container_mousedown()}}(this),50)}else if(!this.active_field)return this.activate_field()},e.prototype.input_blur=function(e){if(!this.mouse_on_container)return this.active_field=!1,setTimeout(function(e){return function(){return e.blur_test()}}(this),100)},e.prototype.label_click_handler=function(e){return this.is_multiple?this.container_mousedown(e):this.activate_field()},e.prototype.results_option_build=function(e){var t,s,i,r,n,o,l;for(t="",l=0,r=0,n=(o=this.results_data).length;r<n&&(s=o[r],i="",""!==(i=s.group?this.result_add_group(s):this.result_add_option(s))&&(l++,t+=i),(null!=e?e.first:void 0)&&(s.selected&&this.is_multiple?this.choice_build(s):s.selected&&!this.is_multiple&&this.single_set_selected_text(this.choice_label(s))),!(l>=this.max_shown_results));r++);return t},e.prototype.result_add_option=function(e){var t,s;return e.search_match&&this.include_option_in_results(e)?(t=[],e.disabled||e.selected&&this.is_multiple||t.push("active-result"),!e.disabled||e.selected&&this.is_multiple||t.push("disabled-result"),e.selected&&t.push("result-selected"),null!=e.group_array_index&&t.push("group-option"),""!==e.classes&&t.push(e.classes),s=document.createElement("li"),s.className=t.join(" "),e.style&&(s.style.cssText=e.style),s.setAttribute("data-option-array-index",e.array_index),s.innerHTML=e.highlighted_html||e.html,e.title&&(s.title=e.title),this.outerHTML(s)):""},e.prototype.result_add_group=function(e){var t,s;return(e.search_match||e.group_match)&&e.active_options>0?((t=[]).push("group-result"),e.classes&&t.push(e.classes),s=document.createElement("li"),s.className=t.join(" "),s.innerHTML=e.highlighted_html||this.escape_html(e.label),e.title&&(s.title=e.title),this.outerHTML(s)):""},e.prototype.results_update_field=function(){if(this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing)return this.winnow_results()},e.prototype.reset_single_select_options=function(){var e,t,s,i,r;for(r=[],e=0,t=(s=this.results_data).length;e<t;e++)(i=s[e]).selected?r.push(i.selected=!1):r.push(void 0);return r},e.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},e.prototype.results_search=function(e){return this.results_showing?this.winnow_results():this.results_show()},e.prototype.winnow_results=function(e){var t,s,i,r,n,o,l,h,c,a,_,u,d,p,f;for(this.no_results_clear(),a=0,t=(l=this.get_search_text()).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),c=this.get_search_regex(t),i=0,r=(h=this.results_data).length;i<r;i++)(n=h[i]).search_match=!1,_=null,u=null,n.highlighted_html="",this.include_option_in_results(n)&&(n.group&&(n.group_match=!1,n.active_options=0),null!=n.group_array_index&&this.results_data[n.group_array_index]&&(0===(_=this.results_data[n.group_array_index]).active_options&&_.search_match&&(a+=1),_.active_options+=1),f=n.group?n.label:n.text,n.group&&!this.group_search||(u=this.search_string_match(f,c),n.search_match=null!=u,n.search_match&&!n.group&&(a+=1),n.search_match?(l.length&&(d=u.index,o=f.slice(0,d),s=f.slice(d,d+l.length),p=f.slice(d+l.length),n.highlighted_html=this.escape_html(o)+"<em>"+this.escape_html(s)+"</em>"+this.escape_html(p)),null!=_&&(_.group_match=!0)):null!=n.group_array_index&&this.results_data[n.group_array_index].search_match&&(n.search_match=!0)));return this.result_clear_highlight(),a<1&&l.length?(this.update_results_content(""),this.no_results(l)):(this.update_results_content(this.results_option_build()),(null!=e?e.skip_highlight:void 0)?void 0:this.winnow_results_set_highlight())},e.prototype.get_search_regex=function(e){var t,s;return s=this.search_contains?e:"(^|\\s|\\b)"+e+"[^\\s]*",this.enable_split_word_search||this.search_contains||(s="^"+s),t=this.case_sensitive_search?"":"i",new RegExp(s,t)},e.prototype.search_string_match=function(e,t){var s;return s=t.exec(e),!this.search_contains&&(null!=s?s[1]:void 0)&&(s.index+=1),s},e.prototype.choices_count=function(){var e,t,s;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,e=0,t=(s=this.form_field.options).length;e<t;e++)s[e].selected&&(this.selected_option_count+=1);return this.selected_option_count},e.prototype.choices_click=function(e){if(e.preventDefault(),this.activate_field(),!this.results_showing&&!this.is_disabled)return this.results_show()},e.prototype.keydown_checker=function(e){var t,s;switch(s=null!=(t=e.which)?t:e.keyCode,this.search_field_scale(),8!==s&&this.pending_backstroke&&this.clear_backstroke(),s){case 8:this.backstroke_length=this.get_search_field_value().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(e),this.mouse_on_container=!1;break;case 13:case 27:this.results_showing&&e.preventDefault();break;case 32:this.disable_search&&e.preventDefault();break;case 38:e.preventDefault(),this.keyup_arrow();break;case 40:e.preventDefault(),this.keydown_arrow()}},e.prototype.keyup_checker=function(e){var t,s;switch(s=null!=(t=e.which)?t:e.keyCode,this.search_field_scale(),s){case 8:this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0?this.keydown_backstroke():this.pending_backstroke||(this.result_clear_highlight(),this.results_search());break;case 13:e.preventDefault(),this.results_showing&&this.result_select(e);break;case 27:this.results_showing&&this.results_hide();break;case 9:case 16:case 17:case 18:case 38:case 40:case 91:break;default:this.results_search()}},e.prototype.clipboard_event_checker=function(e){if(!this.is_disabled)return setTimeout(function(e){return function(){return e.results_search()}}(this),50)},e.prototype.container_width=function(){return null!=this.options.width?this.options.width:this.form_field.offsetWidth+"px"},e.prototype.include_option_in_results=function(e){return!(this.is_multiple&&!this.display_selected_options&&e.selected)&&(!(!this.display_disabled_options&&e.disabled)&&!e.empty)},e.prototype.search_results_touchstart=function(e){return this.touch_started=!0,this.search_results_mouseover(e)},e.prototype.search_results_touchmove=function(e){return this.touch_started=!1,this.search_results_mouseout(e)},e.prototype.search_results_touchend=function(e){if(this.touch_started)return this.search_results_mouseup(e)},e.prototype.outerHTML=function(e){var t;return e.outerHTML?e.outerHTML:((t=document.createElement("div")).appendChild(e),t.innerHTML)},e.prototype.get_single_html=function(){return'<a class="chosen-single chosen-default">\n  <span>'+this.default_text+'</span>\n  <div><b></b></div>\n</a>\n<div class="chosen-drop">\n  <div class="chosen-search">\n    <input class="chosen-search-input" type="text" autocomplete="off" />\n  </div>\n  <ul class="chosen-results"></ul>\n</div>'},e.prototype.get_multi_html=function(){return'<ul class="chosen-choices">\n  <li class="search-field">\n    <input class="chosen-search-input" type="text" autocomplete="off" value="'+this.default_text+'" />\n  </li>\n</ul>\n<div class="chosen-drop">\n  <ul class="chosen-results"></ul>\n</div>'},e.prototype.get_no_results_html=function(e){return'<li class="no-results">\n  '+this.results_none_found+" <span>"+this.escape_html(e)+"</span>\n</li>"},e.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:!(/iP(od|hone)/i.test(window.navigator.userAgent)||/IEMobile/i.test(window.navigator.userAgent)||/Windows Phone/i.test(window.navigator.userAgent)||/BlackBerry/i.test(window.navigator.userAgent)||/BB10/i.test(window.navigator.userAgent)||/Android.*Mobile/i.test(window.navigator.userAgent))},e.default_multiple_text="Select Some Options",e.default_single_text="Select an Option",e.default_no_result_text="No results match",e}(),this.Chosen=function(s){function r(){return r.__super__.constructor.apply(this,arguments)}var n;return i(r,e),r.prototype.setup=function(){return this.current_selectedIndex=this.form_field.selectedIndex},r.prototype.set_up_html=function(){var e,t;return(e=["chosen-container"]).push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&e.push(this.form_field.className),this.is_rtl&&e.push("chosen-rtl"),t={class:e.join(" "),title:this.form_field.title},this.form_field.id.length&&(t.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=new Element("div",t),this.container.setStyle({width:this.container_width()}),this.is_multiple?this.container.update(this.get_multi_html()):this.container.update(this.get_single_html()),this.form_field.hide().insert({after:this.container}),this.dropdown=this.container.down("div.chosen-drop"),this.search_field=this.container.down("input"),this.search_results=this.container.down("ul.chosen-results"),this.search_field_scale(),this.search_no_results=this.container.down("li.no-results"),this.is_multiple?(this.search_choices=this.container.down("ul.chosen-choices"),this.search_container=this.container.down("li.search-field")):(this.search_container=this.container.down("div.chosen-search"),this.selected_item=this.container.down(".chosen-single")),this.results_build(),this.set_tab_index(),this.set_label_behavior()},r.prototype.on_ready=function(){return this.form_field.fire("chosen:ready",{chosen:this})},r.prototype.register_observers=function(){return this.container.observe("touchstart",function(e){return function(t){return e.container_mousedown(t)}}(this)),this.container.observe("touchend",function(e){return function(t){return e.container_mouseup(t)}}(this)),this.container.observe("mousedown",function(e){return function(t){return e.container_mousedown(t)}}(this)),this.container.observe("mouseup",function(e){return function(t){return e.container_mouseup(t)}}(this)),this.container.observe("mouseenter",function(e){return function(t){return e.mouse_enter(t)}}(this)),this.container.observe("mouseleave",function(e){return function(t){return e.mouse_leave(t)}}(this)),this.search_results.observe("mouseup",function(e){return function(t){return e.search_results_mouseup(t)}}(this)),this.search_results.observe("mouseover",function(e){return function(t){return e.search_results_mouseover(t)}}(this)),this.search_results.observe("mouseout",function(e){return function(t){return e.search_results_mouseout(t)}}(this)),this.search_results.observe("mousewheel",function(e){return function(t){return e.search_results_mousewheel(t)}}(this)),this.search_results.observe("DOMMouseScroll",function(e){return function(t){return e.search_results_mousewheel(t)}}(this)),this.search_results.observe("touchstart",function(e){return function(t){return e.search_results_touchstart(t)}}(this)),this.search_results.observe("touchmove",function(e){return function(t){return e.search_results_touchmove(t)}}(this)),this.search_results.observe("touchend",function(e){return function(t){return e.search_results_touchend(t)}}(this)),this.form_field.observe("chosen:updated",function(e){return function(t){return e.results_update_field(t)}}(this)),this.form_field.observe("chosen:activate",function(e){return function(t){return e.activate_field(t)}}(this)),this.form_field.observe("chosen:open",function(e){return function(t){return e.container_mousedown(t)}}(this)),this.form_field.observe("chosen:close",function(e){return function(t){return e.close_field(t)}}(this)),this.search_field.observe("blur",function(e){return function(t){return e.input_blur(t)}}(this)),this.search_field.observe("keyup",function(e){return function(t){return e.keyup_checker(t)}}(this)),this.search_field.observe("keydown",function(e){return function(t){return e.keydown_checker(t)}}(this)),this.search_field.observe("focus",function(e){return function(t){return e.input_focus(t)}}(this)),this.search_field.observe("cut",function(e){return function(t){return e.clipboard_event_checker(t)}}(this)),this.search_field.observe("paste",function(e){return function(t){return e.clipboard_event_checker(t)}}(this)),this.is_multiple?this.search_choices.observe("click",function(e){return function(t){return e.choices_click(t)}}(this)):this.container.observe("click",function(e){return e.preventDefault()})},r.prototype.destroy=function(){var e,t,s,i;for(this.container.ownerDocument.stopObserving("click",this.click_test_action),t=0,s=(i=["chosen:updated","chosen:activate","chosen:open","chosen:close"]).length;t<s;t++)e=i[t],this.form_field.stopObserving(e);return this.container.stopObserving(),this.search_results.stopObserving(),this.search_field.stopObserving(),null!=this.form_field_label&&this.form_field_label.stopObserving(),this.is_multiple?(this.search_choices.stopObserving(),this.container.select(".search-choice-close").each(function(e){return e.stopObserving()})):this.selected_item.stopObserving(),this.search_field.tabIndex&&(this.form_field.tabIndex=this.search_field.tabIndex),this.container.remove(),this.form_field.show()},r.prototype.search_field_disabled=function(){var e;return this.is_disabled=this.form_field.disabled||(null!=(e=this.form_field.up("fieldset"))?e.disabled:void 0)||!1,this.is_disabled?this.container.addClassName("chosen-disabled"):this.container.removeClassName("chosen-disabled"),this.search_field.disabled=this.is_disabled,this.is_multiple||this.selected_item.stopObserving("focus",this.activate_field),this.is_disabled?this.close_field():this.is_multiple?void 0:this.selected_item.observe("focus",this.activate_field)},r.prototype.container_mousedown=function(e){var t;if(!this.is_disabled)return!e||"mousedown"!==(t=e.type)&&"touchstart"!==t||this.results_showing||e.preventDefault(),null!=e&&e.target.hasClassName("search-choice-close")?void 0:(this.active_field?this.is_multiple||!e||e.target!==this.selected_item&&!e.target.up("a.chosen-single")||this.results_toggle():(this.is_multiple&&this.search_field.clear(),this.container.ownerDocument.observe("click",this.click_test_action),this.results_show()),this.activate_field())},r.prototype.container_mouseup=function(e){if("ABBR"===e.target.nodeName&&!this.is_disabled)return this.results_reset(e)},r.prototype.search_results_mousewheel=function(e){var t;if(null!=(t=e.deltaY||-e.wheelDelta||e.detail))return e.preventDefault(),"DOMMouseScroll"===e.type&&(t*=40),this.search_results.scrollTop=t+this.search_results.scrollTop},r.prototype.blur_test=function(e){if(!this.active_field&&this.container.hasClassName("chosen-container-active"))return this.close_field()},r.prototype.close_field=function(){return this.container.ownerDocument.stopObserving("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClassName("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale(),this.search_field.blur()},r.prototype.activate_field=function(){if(!this.is_disabled)return this.container.addClassName("chosen-container-active"),this.active_field=!0,this.search_field.value=this.get_search_field_value(),this.search_field.focus()},r.prototype.test_active_click=function(e){return e.target.up(".chosen-container")===this.container?this.active_field=!0:this.close_field()},r.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=t.select_to_array(this.form_field),this.is_multiple?this.search_choices.select("li.search-choice").invoke("remove"):(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field.readOnly=!0,this.container.addClassName("chosen-container-single-nosearch")):(this.search_field.readOnly=!1,this.container.removeClassName("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},r.prototype.result_do_highlight=function(e){var t,s,i,r,n;return this.result_clear_highlight(),this.result_highlight=e,this.result_highlight.addClassName("highlighted"),i=parseInt(this.search_results.getStyle("maxHeight"),10),n=this.search_results.scrollTop,r=i+n,s=this.result_highlight.positionedOffset().top,(t=s+this.result_highlight.getHeight())>=r?this.search_results.scrollTop=t-i>0?t-i:0:s<n?this.search_results.scrollTop=s:void 0},r.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClassName("highlighted"),this.result_highlight=null},r.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field.fire("chosen:maxselected",{chosen:this}),!1):(this.container.addClassName("chosen-with-drop"),this.results_showing=!0,this.search_field.focus(),this.search_field.value=this.get_search_field_value(),this.winnow_results(),this.form_field.fire("chosen:showing_dropdown",{chosen:this}))},r.prototype.update_results_content=function(e){return this.search_results.update(e)},r.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClassName("chosen-with-drop"),this.form_field.fire("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},r.prototype.set_tab_index=function(e){var t;if(this.form_field.tabIndex)return t=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field.tabIndex=t},r.prototype.set_label_behavior=function(){if(this.form_field_label=this.form_field.up("label"),null==this.form_field_label&&(this.form_field_label=$$("label[for='"+this.form_field.id+"']").first()),null!=this.form_field_label)return this.form_field_label.observe("click",this.label_click_handler)},r.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.value=this.default_text,this.search_field.addClassName("default")):(this.search_field.value="",this.search_field.removeClassName("default"))},r.prototype.search_results_mouseup=function(e){var t;if(t=e.target.hasClassName("active-result")?e.target:e.target.up(".active-result"))return this.result_highlight=t,this.result_select(e),this.search_field.focus()},r.prototype.search_results_mouseover=function(e){var t;if(t=e.target.hasClassName("active-result")?e.target:e.target.up(".active-result"))return this.result_do_highlight(t)},r.prototype.search_results_mouseout=function(e){if(e.target.hasClassName("active-result")||e.target.up(".active-result"))return this.result_clear_highlight()},r.prototype.choice_build=function(e){var t,s;return t=new Element("li",{class:"search-choice"}).update("<span>"+this.choice_label(e)+"</span>"),e.disabled?t.addClassName("search-choice-disabled"):((s=new Element("a",{href:"#",class:"search-choice-close",rel:e.array_index})).observe("click",function(e){return function(t){return e.choice_destroy_link_click(t)}}(this)),t.insert(s)),this.search_container.insert({before:t})},r.prototype.choice_destroy_link_click=function(e){if(e.preventDefault(),e.stopPropagation(),!this.is_disabled)return this.choice_destroy(e.target)},r.prototype.choice_destroy=function(e){if(this.result_deselect(e.readAttribute("rel")))return this.active_field?this.search_field.focus():this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.get_search_field_value().length<1&&this.results_hide(),e.up("li").remove(),this.search_field_scale()},r.prototype.results_reset=function(){if(this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.trigger_form_field_change(),this.active_field)return this.results_hide()},r.prototype.results_reset_cleanup=function(){var e;if(this.current_selectedIndex=this.form_field.selectedIndex,e=this.selected_item.down("abbr"))return e.remove()},r.prototype.result_select=function(e){var t,s;if(this.result_highlight)return t=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field.fire("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?t.removeClassName("active-result"):this.reset_single_select_options(),t.addClassName("result-selected"),s=this.results_data[t.getAttribute("data-option-array-index")],s.selected=!0,this.form_field.options[s.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(s):this.single_set_selected_text(this.choice_label(s)),this.is_multiple&&(!this.hide_results_on_select||e.metaKey||e.ctrlKey)?e.metaKey||e.ctrlKey?this.winnow_results({skip_highlight:!0}):(this.search_field.value="",this.winnow_results()):(this.results_hide(),this.show_search_field_default()),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.trigger_form_field_change(),this.current_selectedIndex=this.form_field.selectedIndex,e.preventDefault(),this.search_field_scale())},r.prototype.single_set_selected_text=function(e){return null==e&&(e=this.default_text),e===this.default_text?this.selected_item.addClassName("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClassName("chosen-default")),this.selected_item.down("span").update(e)},r.prototype.result_deselect=function(e){var t;return t=this.results_data[e],!this.form_field.options[t.options_index].disabled&&(t.selected=!1,this.form_field.options[t.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.trigger_form_field_change(),this.search_field_scale(),!0)},r.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect)return this.selected_item.down("abbr")||this.selected_item.down("span").insert({after:'<abbr class="search-choice-close"></abbr>'}),this.selected_item.addClassName("chosen-single-with-deselect")},r.prototype.get_search_field_value=function(){return this.search_field.value},r.prototype.get_search_text=function(){return this.get_search_field_value().strip()},r.prototype.escape_html=function(e){return e.escapeHTML()},r.prototype.winnow_results_set_highlight=function(){var e;if(this.is_multiple||(e=this.search_results.down(".result-selected.active-result")),null==e&&(e=this.search_results.down(".active-result")),null!=e)return this.result_do_highlight(e)},r.prototype.no_results=function(e){return this.search_results.insert(this.get_no_results_html(e)),this.form_field.fire("chosen:no_results",{chosen:this})},r.prototype.no_results_clear=function(){var e,t;for(e=null,t=[];e=this.search_results.down(".no-results");)t.push(e.remove());return t},r.prototype.keydown_arrow=function(){var e;return this.results_showing&&this.result_highlight?(e=this.result_highlight.next(".active-result"))?this.result_do_highlight(e):void 0:this.results_show()},r.prototype.keyup_arrow=function(){var e,t,s;return this.results_showing||this.is_multiple?this.result_highlight?(s=this.result_highlight.previousSiblings(),e=this.search_results.select("li.active-result"),(t=s.intersect(e)).length?this.result_do_highlight(t.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},r.prototype.keydown_backstroke=function(){var e;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.down("a")),this.clear_backstroke()):(e=this.search_container.siblings().last())&&e.hasClassName("search-choice")&&!e.hasClassName("search-choice-disabled")?(this.pending_backstroke=e,this.pending_backstroke&&this.pending_backstroke.addClassName("search-choice-focus"),this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClassName("search-choice-focus")):void 0},r.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus"),this.pending_backstroke=null},r.prototype.search_field_scale=function(){var e,t,s,i,r,n,o,l;if(this.is_multiple){for(n={position:"absolute",left:"-1000px",top:"-1000px",display:"none",whiteSpace:"pre"},s=0,i=(o=["fontSize","fontStyle","fontWeight","fontFamily","lineHeight","textTransform","letterSpacing"]).length;s<i;s++)n[r=o[s]]=this.search_field.getStyle(r);return(t=new Element("div").update(this.escape_html(this.get_search_field_value()))).setStyle(n),document.body.appendChild(t),l=t.measure("width")+25,t.remove(),(e=this.container.getWidth())&&(l=Math.min(e-10,l)),this.search_field.setStyle({width:l+"px"})}},r.prototype.trigger_form_field_change=function(){return n(this.form_field,"input"),n(this.form_field,"change")},n=function(e,t){var s;if(e.dispatchEvent){try{s=new Event(t,{bubbles:!0,cancelable:!0})}catch(e){(s=document.createEvent("HTMLEvents")).initEvent(t,!0,!0)}return e.dispatchEvent(s)}return e.fireEvent("on"+t,document.createEventObject())},r}()}).call(this);PKW�1\�5����,vendor/harvesthq/chosen/chosen-sprite@2x.pngnu�[����PNG


IHDRhJ�q��IDATh�횿o�@�#�P	� �����?!d�ԅ�sft⇿'R�J0�#[���Ɉ��+��������P����{R�W%����ދ��1�e,�J4�h��'�Y�2�Ny�H%?��/�4��
L�j�[��	-�85H�q���H�����qȱ�s���6�C+�%0��`QW�X����O�5��
�]:ڿ��h���Ig���7�oi����
1n� ���f���Hn�'
�!-��
hjh؝l�n��zH���A��oj��Q�FEæ�����hH
'��wԲt�c �8�H۪�/�4��
L�j��`$�8�� q�iD�S %N��9 �J�1Sp̶�;X�k}\kN[�[�t���������k�%��s�F<Uk��}dvǢ�W���b��?�O/n&�
�0p)/��Pyf'��~�|��|+a�C�˒�bKq��SB>��p��3�K�X��R~����C�gY�Ƭ��,�9���A%w;8Q�h�H�,�]n�p��Y��>�$�c
��)�ƒ�K�hw~��S�ʼn�q��P�*�w�Ҷ�����X�y{$���u�%�&�Z����'������(�8�؜��֜�b��ҍ၊�5R6�emP�0�<�F�-F��
i��#�	��z�H�|��Y��JZ�\N��IEND�B`�PKW�1\'m=ه�#vendor/harvesthq/chosen/.travis.ymlnu�[���sudo: false

language: node_js

node_js:
  - "node"

deploy:
  provider: npm
  email: chosenjs@getharvest.com
  api_key:
    # This key is for automatically publishing releases to NPM,
    # but it is encrypted for publishing publicly like this using Travis.
    # More information about how this token is generated and encrypted here:
    # https://docs.travis-ci.com/user/deployment/npm#NPM-auth-token
    secure: "WXJUezbSyFX2bDLmBpO2mLSTxVzn7FH1ll6hzGPD4PUrDCRgBW7RyXX3UnIwSknIOQ/pqDq9zRPCSxHgyWNW3dX84n4P7+5C2dlxagtsBKc/ovwGqHFOrb/U+yWgrBimXvpDQeaBveZJXPhN46YYkb4NNWlP3d6bYaXqR5qtURM="
  on:
    tags: true
    repo: harvesthq/chosen-package
PKW�1\s�^�q�q,vendor/harvesthq/chosen/chosen.jquery.min.jsnu�[���/* Chosen v1.8.7 | (c) 2011-2018 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */

(function(){var t,e,s,i,n=function(t,e){return function(){return t.apply(e,arguments)}},r=function(t,e){function s(){this.constructor=t}for(var i in e)o.call(e,i)&&(t[i]=e[i]);return s.prototype=e.prototype,t.prototype=new s,t.__super__=e.prototype,t},o={}.hasOwnProperty;(i=function(){function t(){this.options_index=0,this.parsed=[]}return t.prototype.add_node=function(t){return"OPTGROUP"===t.nodeName.toUpperCase()?this.add_group(t):this.add_option(t)},t.prototype.add_group=function(t){var e,s,i,n,r,o;for(e=this.parsed.length,this.parsed.push({array_index:e,group:!0,label:t.label,title:t.title?t.title:void 0,children:0,disabled:t.disabled,classes:t.className}),o=[],s=0,i=(r=t.childNodes).length;s<i;s++)n=r[s],o.push(this.add_option(n,e,t.disabled));return o},t.prototype.add_option=function(t,e,s){if("OPTION"===t.nodeName.toUpperCase())return""!==t.text?(null!=e&&(this.parsed[e].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:t.value,text:t.text,html:t.innerHTML,title:t.title?t.title:void 0,selected:t.selected,disabled:!0===s?s:t.disabled,group_array_index:e,group_label:null!=e?this.parsed[e].label:null,classes:t.className,style:t.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1},t}()).select_to_array=function(t){var e,s,n,r,o;for(r=new i,s=0,n=(o=t.childNodes).length;s<n;s++)e=o[s],r.add_node(e);return r.parsed},e=function(){function t(e,s){this.form_field=e,this.options=null!=s?s:{},this.label_click_handler=n(this.label_click_handler,this),t.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.on_ready())}return t.prototype.set_default_values=function(){return this.click_test_action=function(t){return function(e){return t.test_active_click(e)}}(this),this.activate_action=function(t){return function(e){return t.activate_field(e)}}(this),this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.is_rtl=this.options.rtl||/\bchosen-rtl\b/.test(this.form_field.className),this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text&&this.options.allow_single_deselect,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null==this.options.enable_split_word_search||this.options.enable_split_word_search,this.group_search=null==this.options.group_search||this.options.group_search,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null==this.options.single_backstroke_delete||this.options.single_backstroke_delete,this.max_selected_options=this.options.max_selected_options||Infinity,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null==this.options.display_selected_options||this.options.display_selected_options,this.display_disabled_options=null==this.options.display_disabled_options||this.options.display_disabled_options,this.include_group_label_in_selected=this.options.include_group_label_in_selected||!1,this.max_shown_results=this.options.max_shown_results||Number.POSITIVE_INFINITY,this.case_sensitive_search=this.options.case_sensitive_search||!1,this.hide_results_on_select=null==this.options.hide_results_on_select||this.options.hide_results_on_select},t.prototype.set_default_text=function(){return this.form_field.getAttribute("data-placeholder")?this.default_text=this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.default_text=this.options.placeholder_text_multiple||this.options.placeholder_text||t.default_multiple_text:this.default_text=this.options.placeholder_text_single||this.options.placeholder_text||t.default_single_text,this.default_text=this.escape_html(this.default_text),this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||t.default_no_result_text},t.prototype.choice_label=function(t){return this.include_group_label_in_selected&&null!=t.group_label?"<b class='group-name'>"+this.escape_html(t.group_label)+"</b>"+t.html:t.html},t.prototype.mouse_enter=function(){return this.mouse_on_container=!0},t.prototype.mouse_leave=function(){return this.mouse_on_container=!1},t.prototype.input_focus=function(t){if(this.is_multiple){if(!this.active_field)return setTimeout(function(t){return function(){return t.container_mousedown()}}(this),50)}else if(!this.active_field)return this.activate_field()},t.prototype.input_blur=function(t){if(!this.mouse_on_container)return this.active_field=!1,setTimeout(function(t){return function(){return t.blur_test()}}(this),100)},t.prototype.label_click_handler=function(t){return this.is_multiple?this.container_mousedown(t):this.activate_field()},t.prototype.results_option_build=function(t){var e,s,i,n,r,o,h;for(e="",h=0,n=0,r=(o=this.results_data).length;n<r&&(s=o[n],i="",""!==(i=s.group?this.result_add_group(s):this.result_add_option(s))&&(h++,e+=i),(null!=t?t.first:void 0)&&(s.selected&&this.is_multiple?this.choice_build(s):s.selected&&!this.is_multiple&&this.single_set_selected_text(this.choice_label(s))),!(h>=this.max_shown_results));n++);return e},t.prototype.result_add_option=function(t){var e,s;return t.search_match&&this.include_option_in_results(t)?(e=[],t.disabled||t.selected&&this.is_multiple||e.push("active-result"),!t.disabled||t.selected&&this.is_multiple||e.push("disabled-result"),t.selected&&e.push("result-selected"),null!=t.group_array_index&&e.push("group-option"),""!==t.classes&&e.push(t.classes),s=document.createElement("li"),s.className=e.join(" "),t.style&&(s.style.cssText=t.style),s.setAttribute("data-option-array-index",t.array_index),s.innerHTML=t.highlighted_html||t.html,t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.result_add_group=function(t){var e,s;return(t.search_match||t.group_match)&&t.active_options>0?((e=[]).push("group-result"),t.classes&&e.push(t.classes),s=document.createElement("li"),s.className=e.join(" "),s.innerHTML=t.highlighted_html||this.escape_html(t.label),t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.results_update_field=function(){if(this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing)return this.winnow_results()},t.prototype.reset_single_select_options=function(){var t,e,s,i,n;for(n=[],t=0,e=(s=this.results_data).length;t<e;t++)(i=s[t]).selected?n.push(i.selected=!1):n.push(void 0);return n},t.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},t.prototype.results_search=function(t){return this.results_showing?this.winnow_results():this.results_show()},t.prototype.winnow_results=function(t){var e,s,i,n,r,o,h,l,c,_,a,u,d,p,f;for(this.no_results_clear(),_=0,e=(h=this.get_search_text()).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),c=this.get_search_regex(e),i=0,n=(l=this.results_data).length;i<n;i++)(r=l[i]).search_match=!1,a=null,u=null,r.highlighted_html="",this.include_option_in_results(r)&&(r.group&&(r.group_match=!1,r.active_options=0),null!=r.group_array_index&&this.results_data[r.group_array_index]&&(0===(a=this.results_data[r.group_array_index]).active_options&&a.search_match&&(_+=1),a.active_options+=1),f=r.group?r.label:r.text,r.group&&!this.group_search||(u=this.search_string_match(f,c),r.search_match=null!=u,r.search_match&&!r.group&&(_+=1),r.search_match?(h.length&&(d=u.index,o=f.slice(0,d),s=f.slice(d,d+h.length),p=f.slice(d+h.length),r.highlighted_html=this.escape_html(o)+"<em>"+this.escape_html(s)+"</em>"+this.escape_html(p)),null!=a&&(a.group_match=!0)):null!=r.group_array_index&&this.results_data[r.group_array_index].search_match&&(r.search_match=!0)));return this.result_clear_highlight(),_<1&&h.length?(this.update_results_content(""),this.no_results(h)):(this.update_results_content(this.results_option_build()),(null!=t?t.skip_highlight:void 0)?void 0:this.winnow_results_set_highlight())},t.prototype.get_search_regex=function(t){var e,s;return s=this.search_contains?t:"(^|\\s|\\b)"+t+"[^\\s]*",this.enable_split_word_search||this.search_contains||(s="^"+s),e=this.case_sensitive_search?"":"i",new RegExp(s,e)},t.prototype.search_string_match=function(t,e){var s;return s=e.exec(t),!this.search_contains&&(null!=s?s[1]:void 0)&&(s.index+=1),s},t.prototype.choices_count=function(){var t,e,s;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,t=0,e=(s=this.form_field.options).length;t<e;t++)s[t].selected&&(this.selected_option_count+=1);return this.selected_option_count},t.prototype.choices_click=function(t){if(t.preventDefault(),this.activate_field(),!this.results_showing&&!this.is_disabled)return this.results_show()},t.prototype.keydown_checker=function(t){var e,s;switch(s=null!=(e=t.which)?e:t.keyCode,this.search_field_scale(),8!==s&&this.pending_backstroke&&this.clear_backstroke(),s){case 8:this.backstroke_length=this.get_search_field_value().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(t),this.mouse_on_container=!1;break;case 13:case 27:this.results_showing&&t.preventDefault();break;case 32:this.disable_search&&t.preventDefault();break;case 38:t.preventDefault(),this.keyup_arrow();break;case 40:t.preventDefault(),this.keydown_arrow()}},t.prototype.keyup_checker=function(t){var e,s;switch(s=null!=(e=t.which)?e:t.keyCode,this.search_field_scale(),s){case 8:this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0?this.keydown_backstroke():this.pending_backstroke||(this.result_clear_highlight(),this.results_search());break;case 13:t.preventDefault(),this.results_showing&&this.result_select(t);break;case 27:this.results_showing&&this.results_hide();break;case 9:case 16:case 17:case 18:case 38:case 40:case 91:break;default:this.results_search()}},t.prototype.clipboard_event_checker=function(t){if(!this.is_disabled)return setTimeout(function(t){return function(){return t.results_search()}}(this),50)},t.prototype.container_width=function(){return null!=this.options.width?this.options.width:this.form_field.offsetWidth+"px"},t.prototype.include_option_in_results=function(t){return!(this.is_multiple&&!this.display_selected_options&&t.selected)&&(!(!this.display_disabled_options&&t.disabled)&&!t.empty)},t.prototype.search_results_touchstart=function(t){return this.touch_started=!0,this.search_results_mouseover(t)},t.prototype.search_results_touchmove=function(t){return this.touch_started=!1,this.search_results_mouseout(t)},t.prototype.search_results_touchend=function(t){if(this.touch_started)return this.search_results_mouseup(t)},t.prototype.outerHTML=function(t){var e;return t.outerHTML?t.outerHTML:((e=document.createElement("div")).appendChild(t),e.innerHTML)},t.prototype.get_single_html=function(){return'<a class="chosen-single chosen-default">\n  <span>'+this.default_text+'</span>\n  <div><b></b></div>\n</a>\n<div class="chosen-drop">\n  <div class="chosen-search">\n    <input class="chosen-search-input" type="text" autocomplete="off" />\n  </div>\n  <ul class="chosen-results"></ul>\n</div>'},t.prototype.get_multi_html=function(){return'<ul class="chosen-choices">\n  <li class="search-field">\n    <input class="chosen-search-input" type="text" autocomplete="off" value="'+this.default_text+'" />\n  </li>\n</ul>\n<div class="chosen-drop">\n  <ul class="chosen-results"></ul>\n</div>'},t.prototype.get_no_results_html=function(t){return'<li class="no-results">\n  '+this.results_none_found+" <span>"+this.escape_html(t)+"</span>\n</li>"},t.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:!(/iP(od|hone)/i.test(window.navigator.userAgent)||/IEMobile/i.test(window.navigator.userAgent)||/Windows Phone/i.test(window.navigator.userAgent)||/BlackBerry/i.test(window.navigator.userAgent)||/BB10/i.test(window.navigator.userAgent)||/Android.*Mobile/i.test(window.navigator.userAgent))},t.default_multiple_text="Select Some Options",t.default_single_text="Select an Option",t.default_no_result_text="No results match",t}(),(t=jQuery).fn.extend({chosen:function(i){return e.browser_is_supported()?this.each(function(e){var n,r;r=(n=t(this)).data("chosen"),"destroy"!==i?r instanceof s||n.data("chosen",new s(this,i)):r instanceof s&&r.destroy()}):this}}),s=function(s){function n(){return n.__super__.constructor.apply(this,arguments)}return r(n,e),n.prototype.setup=function(){return this.form_field_jq=t(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex},n.prototype.set_up_html=function(){var e,s;return(e=["chosen-container"]).push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&e.push(this.form_field.className),this.is_rtl&&e.push("chosen-rtl"),s={"class":e.join(" "),title:this.form_field.title},this.form_field.id.length&&(s.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=t("<div />",s),this.container.width(this.container_width()),this.is_multiple?this.container.html(this.get_multi_html()):this.container.html(this.get_single_html()),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},n.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},n.prototype.register_observers=function(){return this.container.on("touchstart.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.container.on("touchend.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mousedown.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.container.on("mouseup.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mouseenter.chosen",function(t){return function(e){t.mouse_enter(e)}}(this)),this.container.on("mouseleave.chosen",function(t){return function(e){t.mouse_leave(e)}}(this)),this.search_results.on("mouseup.chosen",function(t){return function(e){t.search_results_mouseup(e)}}(this)),this.search_results.on("mouseover.chosen",function(t){return function(e){t.search_results_mouseover(e)}}(this)),this.search_results.on("mouseout.chosen",function(t){return function(e){t.search_results_mouseout(e)}}(this)),this.search_results.on("mousewheel.chosen DOMMouseScroll.chosen",function(t){return function(e){t.search_results_mousewheel(e)}}(this)),this.search_results.on("touchstart.chosen",function(t){return function(e){t.search_results_touchstart(e)}}(this)),this.search_results.on("touchmove.chosen",function(t){return function(e){t.search_results_touchmove(e)}}(this)),this.search_results.on("touchend.chosen",function(t){return function(e){t.search_results_touchend(e)}}(this)),this.form_field_jq.on("chosen:updated.chosen",function(t){return function(e){t.results_update_field(e)}}(this)),this.form_field_jq.on("chosen:activate.chosen",function(t){return function(e){t.activate_field(e)}}(this)),this.form_field_jq.on("chosen:open.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.form_field_jq.on("chosen:close.chosen",function(t){return function(e){t.close_field(e)}}(this)),this.search_field.on("blur.chosen",function(t){return function(e){t.input_blur(e)}}(this)),this.search_field.on("keyup.chosen",function(t){return function(e){t.keyup_checker(e)}}(this)),this.search_field.on("keydown.chosen",function(t){return function(e){t.keydown_checker(e)}}(this)),this.search_field.on("focus.chosen",function(t){return function(e){t.input_focus(e)}}(this)),this.search_field.on("cut.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.search_field.on("paste.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.is_multiple?this.search_choices.on("click.chosen",function(t){return function(e){t.choices_click(e)}}(this)):this.container.on("click.chosen",function(t){t.preventDefault()})},n.prototype.destroy=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.form_field_label.length>0&&this.form_field_label.off("click.chosen"),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},n.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field.disabled||this.form_field_jq.parents("fieldset").is(":disabled"),this.container.toggleClass("chosen-disabled",this.is_disabled),this.search_field[0].disabled=this.is_disabled,this.is_multiple||this.selected_item.off("focus.chosen",this.activate_field),this.is_disabled?this.close_field():this.is_multiple?void 0:this.selected_item.on("focus.chosen",this.activate_field)},n.prototype.container_mousedown=function(e){var s;if(!this.is_disabled)return!e||"mousedown"!==(s=e.type)&&"touchstart"!==s||this.results_showing||e.preventDefault(),null!=e&&t(e.target).hasClass("search-choice-close")?void 0:(this.active_field?this.is_multiple||!e||t(e.target)[0]!==this.selected_item[0]&&!t(e.target).parents("a.chosen-single").length||(e.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),t(this.container[0].ownerDocument).on("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},n.prototype.container_mouseup=function(t){if("ABBR"===t.target.nodeName&&!this.is_disabled)return this.results_reset(t)},n.prototype.search_results_mousewheel=function(t){var e;if(t.originalEvent&&(e=t.originalEvent.deltaY||-t.originalEvent.wheelDelta||t.originalEvent.detail),null!=e)return t.preventDefault(),"DOMMouseScroll"===t.type&&(e*=40),this.search_results.scrollTop(e+this.search_results.scrollTop())},n.prototype.blur_test=function(t){if(!this.active_field&&this.container.hasClass("chosen-container-active"))return this.close_field()},n.prototype.close_field=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale(),this.search_field.blur()},n.prototype.activate_field=function(){if(!this.is_disabled)return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},n.prototype.test_active_click=function(e){var s;return(s=t(e.target).closest(".chosen-container")).length&&this.container[0]===s[0]?this.active_field=!0:this.close_field()},n.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=i.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},n.prototype.result_do_highlight=function(t){var e,s,i,n,r;if(t.length){if(this.result_clear_highlight(),this.result_highlight=t,this.result_highlight.addClass("highlighted"),i=parseInt(this.search_results.css("maxHeight"),10),r=this.search_results.scrollTop(),n=i+r,s=this.result_highlight.position().top+this.search_results.scrollTop(),(e=s+this.result_highlight.outerHeight())>=n)return this.search_results.scrollTop(e-i>0?e-i:0);if(s<r)return this.search_results.scrollTop(s)}},n.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},n.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.container.addClass("chosen-with-drop"),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.get_search_field_value()),this.winnow_results(),this.form_field_jq.trigger("chosen:showing_dropdown",{chosen:this}))},n.prototype.update_results_content=function(t){return this.search_results.html(t)},n.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},n.prototype.set_tab_index=function(t){var e;if(this.form_field.tabIndex)return e=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=e},n.prototype.set_label_behavior=function(){if(this.form_field_label=this.form_field_jq.parents("label"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=t("label[for='"+this.form_field.id+"']")),this.form_field_label.length>0)return this.form_field_label.on("click.chosen",this.label_click_handler)},n.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},n.prototype.search_results_mouseup=function(e){var s;if((s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first()).length)return this.result_highlight=s,this.result_select(e),this.search_field.focus()},n.prototype.search_results_mouseover=function(e){var s;if(s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first())return this.result_do_highlight(s)},n.prototype.search_results_mouseout=function(e){if(t(e.target).hasClass("active-result")||t(e.target).parents(".active-result").first())return this.result_clear_highlight()},n.prototype.choice_build=function(e){var s,i;return s=t("<li />",{"class":"search-choice"}).html("<span>"+this.choice_label(e)+"</span>"),e.disabled?s.addClass("search-choice-disabled"):((i=t("<a />",{"class":"search-choice-close","data-option-array-index":e.array_index})).on("click.chosen",function(t){return function(e){return t.choice_destroy_link_click(e)}}(this)),s.append(i)),this.search_container.before(s)},n.prototype.choice_destroy_link_click=function(e){if(e.preventDefault(),e.stopPropagation(),!this.is_disabled)return this.choice_destroy(t(e.target))},n.prototype.choice_destroy=function(t){if(this.result_deselect(t[0].getAttribute("data-option-array-index")))return this.active_field?this.search_field.focus():this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.get_search_field_value().length<1&&this.results_hide(),t.parents("li").first().remove(),this.search_field_scale()},n.prototype.results_reset=function(){if(this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.trigger_form_field_change(),this.active_field)return this.results_hide()},n.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},n.prototype.result_select=function(t){var e,s;if(this.result_highlight)return e=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?e.removeClass("active-result"):this.reset_single_select_options(),e.addClass("result-selected"),s=this.results_data[e[0].getAttribute("data-option-array-index")],s.selected=!0,this.form_field.options[s.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(s):this.single_set_selected_text(this.choice_label(s)),this.is_multiple&&(!this.hide_results_on_select||t.metaKey||t.ctrlKey)?t.metaKey||t.ctrlKey?this.winnow_results({skip_highlight:!0}):(this.search_field.val(""),this.winnow_results()):(this.results_hide(),this.show_search_field_default()),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.trigger_form_field_change({selected:this.form_field.options[s.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,t.preventDefault(),this.search_field_scale())},n.prototype.single_set_selected_text=function(t){return null==t&&(t=this.default_text),t===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").html(t)},n.prototype.result_deselect=function(t){var e;return e=this.results_data[t],!this.form_field.options[e.options_index].disabled&&(e.selected=!1,this.form_field.options[e.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.trigger_form_field_change({deselected:this.form_field.options[e.options_index].value}),this.search_field_scale(),!0)},n.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect)return this.selected_item.find("abbr").length||this.selected_item.find("span").first().after('<abbr class="search-choice-close"></abbr>'),this.selected_item.addClass("chosen-single-with-deselect")},n.prototype.get_search_field_value=function(){return this.search_field.val()},n.prototype.get_search_text=function(){return t.trim(this.get_search_field_value())},n.prototype.escape_html=function(e){return t("<div/>").text(e).html()},n.prototype.winnow_results_set_highlight=function(){var t,e;if(e=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),null!=(t=e.length?e.first():this.search_results.find(".active-result").first()))return this.result_do_highlight(t)},n.prototype.no_results=function(t){var e;return e=this.get_no_results_html(t),this.search_results.append(e),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},n.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},n.prototype.keydown_arrow=function(){var t;return this.results_showing&&this.result_highlight?(t=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(t):void 0:this.results_show()},n.prototype.keyup_arrow=function(){var t;return this.results_showing||this.is_multiple?this.result_highlight?(t=this.result_highlight.prevAll("li.active-result")).length?this.result_do_highlight(t.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight()):void 0:this.results_show()},n.prototype.keydown_backstroke=function(){var t;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(t=this.search_container.siblings("li.search-choice").last()).length&&!t.hasClass("search-choice-disabled")?(this.pending_backstroke=t,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0},n.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},n.prototype.search_field_scale=function(){var e,s,i,n,r,o,h;if(this.is_multiple){for(r={position:"absolute",left:"-1000px",top:"-1000px",display:"none",whiteSpace:"pre"},s=0,i=(o=["fontSize","fontStyle","fontWeight","fontFamily","lineHeight","textTransform","letterSpacing"]).length;s<i;s++)r[n=o[s]]=this.search_field.css(n);return(e=t("<div />").css(r)).text(this.get_search_field_value()),t("body").append(e),h=e.width()+25,e.remove(),this.container.is(":visible")&&(h=Math.min(this.container.outerWidth()-10,h)),this.search_field.width(h)}},n.prototype.trigger_form_field_change=function(t){return this.form_field_jq.trigger("input",t),this.form_field_jq.trigger("change",t)},n}()}).call(this);PKW�1\�&^����'vendor/harvesthq/chosen/chosen.proto.jsnu�[���(function() {
  var AbstractChosen, SelectParser,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  SelectParser = (function() {
    function SelectParser() {
      this.options_index = 0;
      this.parsed = [];
    }

    SelectParser.prototype.add_node = function(child) {
      if (child.nodeName.toUpperCase() === "OPTGROUP") {
        return this.add_group(child);
      } else {
        return this.add_option(child);
      }
    };

    SelectParser.prototype.add_group = function(group) {
      var group_position, i, len, option, ref, results1;
      group_position = this.parsed.length;
      this.parsed.push({
        array_index: group_position,
        group: true,
        label: group.label,
        title: group.title ? group.title : void 0,
        children: 0,
        disabled: group.disabled,
        classes: group.className
      });
      ref = group.childNodes;
      results1 = [];
      for (i = 0, len = ref.length; i < len; i++) {
        option = ref[i];
        results1.push(this.add_option(option, group_position, group.disabled));
      }
      return results1;
    };

    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
      if (option.nodeName.toUpperCase() === "OPTION") {
        if (option.text !== "") {
          if (group_position != null) {
            this.parsed[group_position].children += 1;
          }
          this.parsed.push({
            array_index: this.parsed.length,
            options_index: this.options_index,
            value: option.value,
            text: option.text,
            html: option.innerHTML,
            title: option.title ? option.title : void 0,
            selected: option.selected,
            disabled: group_disabled === true ? group_disabled : option.disabled,
            group_array_index: group_position,
            group_label: group_position != null ? this.parsed[group_position].label : null,
            classes: option.className,
            style: option.style.cssText
          });
        } else {
          this.parsed.push({
            array_index: this.parsed.length,
            options_index: this.options_index,
            empty: true
          });
        }
        return this.options_index += 1;
      }
    };

    return SelectParser;

  })();

  SelectParser.select_to_array = function(select) {
    var child, i, len, parser, ref;
    parser = new SelectParser();
    ref = select.childNodes;
    for (i = 0, len = ref.length; i < len; i++) {
      child = ref[i];
      parser.add_node(child);
    }
    return parser.parsed;
  };

  AbstractChosen = (function() {
    function AbstractChosen(form_field, options1) {
      this.form_field = form_field;
      this.options = options1 != null ? options1 : {};
      this.label_click_handler = bind(this.label_click_handler, this);
      if (!AbstractChosen.browser_is_supported()) {
        return;
      }
      this.is_multiple = this.form_field.multiple;
      this.set_default_text();
      this.set_default_values();
      this.setup();
      this.set_up_html();
      this.register_observers();
      this.on_ready();
    }

    AbstractChosen.prototype.set_default_values = function() {
      this.click_test_action = (function(_this) {
        return function(evt) {
          return _this.test_active_click(evt);
        };
      })(this);
      this.activate_action = (function(_this) {
        return function(evt) {
          return _this.activate_field(evt);
        };
      })(this);
      this.active_field = false;
      this.mouse_on_container = false;
      this.results_showing = false;
      this.result_highlighted = null;
      this.is_rtl = this.options.rtl || /\bchosen-rtl\b/.test(this.form_field.className);
      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
      this.disable_search_threshold = this.options.disable_search_threshold || 0;
      this.disable_search = this.options.disable_search || false;
      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
      this.group_search = this.options.group_search != null ? this.options.group_search : true;
      this.search_contains = this.options.search_contains || false;
      this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
      this.max_selected_options = this.options.max_selected_options || Infinity;
      this.inherit_select_classes = this.options.inherit_select_classes || false;
      this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
      this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
      this.include_group_label_in_selected = this.options.include_group_label_in_selected || false;
      this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY;
      this.case_sensitive_search = this.options.case_sensitive_search || false;
      return this.hide_results_on_select = this.options.hide_results_on_select != null ? this.options.hide_results_on_select : true;
    };

    AbstractChosen.prototype.set_default_text = function() {
      if (this.form_field.getAttribute("data-placeholder")) {
        this.default_text = this.form_field.getAttribute("data-placeholder");
      } else if (this.is_multiple) {
        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
      } else {
        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
      }
      this.default_text = this.escape_html(this.default_text);
      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
    };

    AbstractChosen.prototype.choice_label = function(item) {
      if (this.include_group_label_in_selected && (item.group_label != null)) {
        return "<b class='group-name'>" + (this.escape_html(item.group_label)) + "</b>" + item.html;
      } else {
        return item.html;
      }
    };

    AbstractChosen.prototype.mouse_enter = function() {
      return this.mouse_on_container = true;
    };

    AbstractChosen.prototype.mouse_leave = function() {
      return this.mouse_on_container = false;
    };

    AbstractChosen.prototype.input_focus = function(evt) {
      if (this.is_multiple) {
        if (!this.active_field) {
          return setTimeout(((function(_this) {
            return function() {
              return _this.container_mousedown();
            };
          })(this)), 50);
        }
      } else {
        if (!this.active_field) {
          return this.activate_field();
        }
      }
    };

    AbstractChosen.prototype.input_blur = function(evt) {
      if (!this.mouse_on_container) {
        this.active_field = false;
        return setTimeout(((function(_this) {
          return function() {
            return _this.blur_test();
          };
        })(this)), 100);
      }
    };

    AbstractChosen.prototype.label_click_handler = function(evt) {
      if (this.is_multiple) {
        return this.container_mousedown(evt);
      } else {
        return this.activate_field();
      }
    };

    AbstractChosen.prototype.results_option_build = function(options) {
      var content, data, data_content, i, len, ref, shown_results;
      content = '';
      shown_results = 0;
      ref = this.results_data;
      for (i = 0, len = ref.length; i < len; i++) {
        data = ref[i];
        data_content = '';
        if (data.group) {
          data_content = this.result_add_group(data);
        } else {
          data_content = this.result_add_option(data);
        }
        if (data_content !== '') {
          shown_results++;
          content += data_content;
        }
        if (options != null ? options.first : void 0) {
          if (data.selected && this.is_multiple) {
            this.choice_build(data);
          } else if (data.selected && !this.is_multiple) {
            this.single_set_selected_text(this.choice_label(data));
          }
        }
        if (shown_results >= this.max_shown_results) {
          break;
        }
      }
      return content;
    };

    AbstractChosen.prototype.result_add_option = function(option) {
      var classes, option_el;
      if (!option.search_match) {
        return '';
      }
      if (!this.include_option_in_results(option)) {
        return '';
      }
      classes = [];
      if (!option.disabled && !(option.selected && this.is_multiple)) {
        classes.push("active-result");
      }
      if (option.disabled && !(option.selected && this.is_multiple)) {
        classes.push("disabled-result");
      }
      if (option.selected) {
        classes.push("result-selected");
      }
      if (option.group_array_index != null) {
        classes.push("group-option");
      }
      if (option.classes !== "") {
        classes.push(option.classes);
      }
      option_el = document.createElement("li");
      option_el.className = classes.join(" ");
      if (option.style) {
        option_el.style.cssText = option.style;
      }
      option_el.setAttribute("data-option-array-index", option.array_index);
      option_el.innerHTML = option.highlighted_html || option.html;
      if (option.title) {
        option_el.title = option.title;
      }
      return this.outerHTML(option_el);
    };

    AbstractChosen.prototype.result_add_group = function(group) {
      var classes, group_el;
      if (!(group.search_match || group.group_match)) {
        return '';
      }
      if (!(group.active_options > 0)) {
        return '';
      }
      classes = [];
      classes.push("group-result");
      if (group.classes) {
        classes.push(group.classes);
      }
      group_el = document.createElement("li");
      group_el.className = classes.join(" ");
      group_el.innerHTML = group.highlighted_html || this.escape_html(group.label);
      if (group.title) {
        group_el.title = group.title;
      }
      return this.outerHTML(group_el);
    };

    AbstractChosen.prototype.results_update_field = function() {
      this.set_default_text();
      if (!this.is_multiple) {
        this.results_reset_cleanup();
      }
      this.result_clear_highlight();
      this.results_build();
      if (this.results_showing) {
        return this.winnow_results();
      }
    };

    AbstractChosen.prototype.reset_single_select_options = function() {
      var i, len, ref, result, results1;
      ref = this.results_data;
      results1 = [];
      for (i = 0, len = ref.length; i < len; i++) {
        result = ref[i];
        if (result.selected) {
          results1.push(result.selected = false);
        } else {
          results1.push(void 0);
        }
      }
      return results1;
    };

    AbstractChosen.prototype.results_toggle = function() {
      if (this.results_showing) {
        return this.results_hide();
      } else {
        return this.results_show();
      }
    };

    AbstractChosen.prototype.results_search = function(evt) {
      if (this.results_showing) {
        return this.winnow_results();
      } else {
        return this.results_show();
      }
    };

    AbstractChosen.prototype.winnow_results = function(options) {
      var escapedQuery, fix, i, len, option, prefix, query, ref, regex, results, results_group, search_match, startpos, suffix, text;
      this.no_results_clear();
      results = 0;
      query = this.get_search_text();
      escapedQuery = query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
      regex = this.get_search_regex(escapedQuery);
      ref = this.results_data;
      for (i = 0, len = ref.length; i < len; i++) {
        option = ref[i];
        option.search_match = false;
        results_group = null;
        search_match = null;
        option.highlighted_html = '';
        if (this.include_option_in_results(option)) {
          if (option.group) {
            option.group_match = false;
            option.active_options = 0;
          }
          if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
            results_group = this.results_data[option.group_array_index];
            if (results_group.active_options === 0 && results_group.search_match) {
              results += 1;
            }
            results_group.active_options += 1;
          }
          text = option.group ? option.label : option.text;
          if (!(option.group && !this.group_search)) {
            search_match = this.search_string_match(text, regex);
            option.search_match = search_match != null;
            if (option.search_match && !option.group) {
              results += 1;
            }
            if (option.search_match) {
              if (query.length) {
                startpos = search_match.index;
                prefix = text.slice(0, startpos);
                fix = text.slice(startpos, startpos + query.length);
                suffix = text.slice(startpos + query.length);
                option.highlighted_html = (this.escape_html(prefix)) + "<em>" + (this.escape_html(fix)) + "</em>" + (this.escape_html(suffix));
              }
              if (results_group != null) {
                results_group.group_match = true;
              }
            } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
              option.search_match = true;
            }
          }
        }
      }
      this.result_clear_highlight();
      if (results < 1 && query.length) {
        this.update_results_content("");
        return this.no_results(query);
      } else {
        this.update_results_content(this.results_option_build());
        if (!(options != null ? options.skip_highlight : void 0)) {
          return this.winnow_results_set_highlight();
        }
      }
    };

    AbstractChosen.prototype.get_search_regex = function(escaped_search_string) {
      var regex_flag, regex_string;
      regex_string = this.search_contains ? escaped_search_string : "(^|\\s|\\b)" + escaped_search_string + "[^\\s]*";
      if (!(this.enable_split_word_search || this.search_contains)) {
        regex_string = "^" + regex_string;
      }
      regex_flag = this.case_sensitive_search ? "" : "i";
      return new RegExp(regex_string, regex_flag);
    };

    AbstractChosen.prototype.search_string_match = function(search_string, regex) {
      var match;
      match = regex.exec(search_string);
      if (!this.search_contains && (match != null ? match[1] : void 0)) {
        match.index += 1;
      }
      return match;
    };

    AbstractChosen.prototype.choices_count = function() {
      var i, len, option, ref;
      if (this.selected_option_count != null) {
        return this.selected_option_count;
      }
      this.selected_option_count = 0;
      ref = this.form_field.options;
      for (i = 0, len = ref.length; i < len; i++) {
        option = ref[i];
        if (option.selected) {
          this.selected_option_count += 1;
        }
      }
      return this.selected_option_count;
    };

    AbstractChosen.prototype.choices_click = function(evt) {
      evt.preventDefault();
      this.activate_field();
      if (!(this.results_showing || this.is_disabled)) {
        return this.results_show();
      }
    };

    AbstractChosen.prototype.keydown_checker = function(evt) {
      var ref, stroke;
      stroke = (ref = evt.which) != null ? ref : evt.keyCode;
      this.search_field_scale();
      if (stroke !== 8 && this.pending_backstroke) {
        this.clear_backstroke();
      }
      switch (stroke) {
        case 8:
          this.backstroke_length = this.get_search_field_value().length;
          break;
        case 9:
          if (this.results_showing && !this.is_multiple) {
            this.result_select(evt);
          }
          this.mouse_on_container = false;
          break;
        case 13:
          if (this.results_showing) {
            evt.preventDefault();
          }
          break;
        case 27:
          if (this.results_showing) {
            evt.preventDefault();
          }
          break;
        case 32:
          if (this.disable_search) {
            evt.preventDefault();
          }
          break;
        case 38:
          evt.preventDefault();
          this.keyup_arrow();
          break;
        case 40:
          evt.preventDefault();
          this.keydown_arrow();
          break;
      }
    };

    AbstractChosen.prototype.keyup_checker = function(evt) {
      var ref, stroke;
      stroke = (ref = evt.which) != null ? ref : evt.keyCode;
      this.search_field_scale();
      switch (stroke) {
        case 8:
          if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
            this.keydown_backstroke();
          } else if (!this.pending_backstroke) {
            this.result_clear_highlight();
            this.results_search();
          }
          break;
        case 13:
          evt.preventDefault();
          if (this.results_showing) {
            this.result_select(evt);
          }
          break;
        case 27:
          if (this.results_showing) {
            this.results_hide();
          }
          break;
        case 9:
        case 16:
        case 17:
        case 18:
        case 38:
        case 40:
        case 91:
          break;
        default:
          this.results_search();
          break;
      }
    };

    AbstractChosen.prototype.clipboard_event_checker = function(evt) {
      if (this.is_disabled) {
        return;
      }
      return setTimeout(((function(_this) {
        return function() {
          return _this.results_search();
        };
      })(this)), 50);
    };

    AbstractChosen.prototype.container_width = function() {
      if (this.options.width != null) {
        return this.options.width;
      } else {
        return this.form_field.offsetWidth + "px";
      }
    };

    AbstractChosen.prototype.include_option_in_results = function(option) {
      if (this.is_multiple && (!this.display_selected_options && option.selected)) {
        return false;
      }
      if (!this.display_disabled_options && option.disabled) {
        return false;
      }
      if (option.empty) {
        return false;
      }
      return true;
    };

    AbstractChosen.prototype.search_results_touchstart = function(evt) {
      this.touch_started = true;
      return this.search_results_mouseover(evt);
    };

    AbstractChosen.prototype.search_results_touchmove = function(evt) {
      this.touch_started = false;
      return this.search_results_mouseout(evt);
    };

    AbstractChosen.prototype.search_results_touchend = function(evt) {
      if (this.touch_started) {
        return this.search_results_mouseup(evt);
      }
    };

    AbstractChosen.prototype.outerHTML = function(element) {
      var tmp;
      if (element.outerHTML) {
        return element.outerHTML;
      }
      tmp = document.createElement("div");
      tmp.appendChild(element);
      return tmp.innerHTML;
    };

    AbstractChosen.prototype.get_single_html = function() {
      return "<a class=\"chosen-single chosen-default\">\n  <span>" + this.default_text + "</span>\n  <div><b></b></div>\n</a>\n<div class=\"chosen-drop\">\n  <div class=\"chosen-search\">\n    <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" />\n  </div>\n  <ul class=\"chosen-results\"></ul>\n</div>";
    };

    AbstractChosen.prototype.get_multi_html = function() {
      return "<ul class=\"chosen-choices\">\n  <li class=\"search-field\">\n    <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" value=\"" + this.default_text + "\" />\n  </li>\n</ul>\n<div class=\"chosen-drop\">\n  <ul class=\"chosen-results\"></ul>\n</div>";
    };

    AbstractChosen.prototype.get_no_results_html = function(terms) {
      return "<li class=\"no-results\">\n  " + this.results_none_found + " <span>" + (this.escape_html(terms)) + "</span>\n</li>";
    };

    AbstractChosen.browser_is_supported = function() {
      if ("Microsoft Internet Explorer" === window.navigator.appName) {
        return document.documentMode >= 8;
      }
      if (/iP(od|hone)/i.test(window.navigator.userAgent) || /IEMobile/i.test(window.navigator.userAgent) || /Windows Phone/i.test(window.navigator.userAgent) || /BlackBerry/i.test(window.navigator.userAgent) || /BB10/i.test(window.navigator.userAgent) || /Android.*Mobile/i.test(window.navigator.userAgent)) {
        return false;
      }
      return true;
    };

    AbstractChosen.default_multiple_text = "Select Some Options";

    AbstractChosen.default_single_text = "Select an Option";

    AbstractChosen.default_no_result_text = "No results match";

    return AbstractChosen;

  })();

  this.Chosen = (function(superClass) {
    var triggerHtmlEvent;

    extend(Chosen, superClass);

    function Chosen() {
      return Chosen.__super__.constructor.apply(this, arguments);
    }

    Chosen.prototype.setup = function() {
      return this.current_selectedIndex = this.form_field.selectedIndex;
    };

    Chosen.prototype.set_up_html = function() {
      var container_classes, container_props;
      container_classes = ["chosen-container"];
      container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
      if (this.inherit_select_classes && this.form_field.className) {
        container_classes.push(this.form_field.className);
      }
      if (this.is_rtl) {
        container_classes.push("chosen-rtl");
      }
      container_props = {
        'class': container_classes.join(' '),
        'title': this.form_field.title
      };
      if (this.form_field.id.length) {
        container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
      }
      this.container = new Element('div', container_props);
      this.container.setStyle({
        width: this.container_width()
      });
      if (this.is_multiple) {
        this.container.update(this.get_multi_html());
      } else {
        this.container.update(this.get_single_html());
      }
      this.form_field.hide().insert({
        after: this.container
      });
      this.dropdown = this.container.down('div.chosen-drop');
      this.search_field = this.container.down('input');
      this.search_results = this.container.down('ul.chosen-results');
      this.search_field_scale();
      this.search_no_results = this.container.down('li.no-results');
      if (this.is_multiple) {
        this.search_choices = this.container.down('ul.chosen-choices');
        this.search_container = this.container.down('li.search-field');
      } else {
        this.search_container = this.container.down('div.chosen-search');
        this.selected_item = this.container.down('.chosen-single');
      }
      this.results_build();
      this.set_tab_index();
      return this.set_label_behavior();
    };

    Chosen.prototype.on_ready = function() {
      return this.form_field.fire("chosen:ready", {
        chosen: this
      });
    };

    Chosen.prototype.register_observers = function() {
      this.container.observe("touchstart", (function(_this) {
        return function(evt) {
          return _this.container_mousedown(evt);
        };
      })(this));
      this.container.observe("touchend", (function(_this) {
        return function(evt) {
          return _this.container_mouseup(evt);
        };
      })(this));
      this.container.observe("mousedown", (function(_this) {
        return function(evt) {
          return _this.container_mousedown(evt);
        };
      })(this));
      this.container.observe("mouseup", (function(_this) {
        return function(evt) {
          return _this.container_mouseup(evt);
        };
      })(this));
      this.container.observe("mouseenter", (function(_this) {
        return function(evt) {
          return _this.mouse_enter(evt);
        };
      })(this));
      this.container.observe("mouseleave", (function(_this) {
        return function(evt) {
          return _this.mouse_leave(evt);
        };
      })(this));
      this.search_results.observe("mouseup", (function(_this) {
        return function(evt) {
          return _this.search_results_mouseup(evt);
        };
      })(this));
      this.search_results.observe("mouseover", (function(_this) {
        return function(evt) {
          return _this.search_results_mouseover(evt);
        };
      })(this));
      this.search_results.observe("mouseout", (function(_this) {
        return function(evt) {
          return _this.search_results_mouseout(evt);
        };
      })(this));
      this.search_results.observe("mousewheel", (function(_this) {
        return function(evt) {
          return _this.search_results_mousewheel(evt);
        };
      })(this));
      this.search_results.observe("DOMMouseScroll", (function(_this) {
        return function(evt) {
          return _this.search_results_mousewheel(evt);
        };
      })(this));
      this.search_results.observe("touchstart", (function(_this) {
        return function(evt) {
          return _this.search_results_touchstart(evt);
        };
      })(this));
      this.search_results.observe("touchmove", (function(_this) {
        return function(evt) {
          return _this.search_results_touchmove(evt);
        };
      })(this));
      this.search_results.observe("touchend", (function(_this) {
        return function(evt) {
          return _this.search_results_touchend(evt);
        };
      })(this));
      this.form_field.observe("chosen:updated", (function(_this) {
        return function(evt) {
          return _this.results_update_field(evt);
        };
      })(this));
      this.form_field.observe("chosen:activate", (function(_this) {
        return function(evt) {
          return _this.activate_field(evt);
        };
      })(this));
      this.form_field.observe("chosen:open", (function(_this) {
        return function(evt) {
          return _this.container_mousedown(evt);
        };
      })(this));
      this.form_field.observe("chosen:close", (function(_this) {
        return function(evt) {
          return _this.close_field(evt);
        };
      })(this));
      this.search_field.observe("blur", (function(_this) {
        return function(evt) {
          return _this.input_blur(evt);
        };
      })(this));
      this.search_field.observe("keyup", (function(_this) {
        return function(evt) {
          return _this.keyup_checker(evt);
        };
      })(this));
      this.search_field.observe("keydown", (function(_this) {
        return function(evt) {
          return _this.keydown_checker(evt);
        };
      })(this));
      this.search_field.observe("focus", (function(_this) {
        return function(evt) {
          return _this.input_focus(evt);
        };
      })(this));
      this.search_field.observe("cut", (function(_this) {
        return function(evt) {
          return _this.clipboard_event_checker(evt);
        };
      })(this));
      this.search_field.observe("paste", (function(_this) {
        return function(evt) {
          return _this.clipboard_event_checker(evt);
        };
      })(this));
      if (this.is_multiple) {
        return this.search_choices.observe("click", (function(_this) {
          return function(evt) {
            return _this.choices_click(evt);
          };
        })(this));
      } else {
        return this.container.observe("click", (function(_this) {
          return function(evt) {
            return evt.preventDefault();
          };
        })(this));
      }
    };

    Chosen.prototype.destroy = function() {
      var event, i, len, ref;
      this.container.ownerDocument.stopObserving("click", this.click_test_action);
      ref = ['chosen:updated', 'chosen:activate', 'chosen:open', 'chosen:close'];
      for (i = 0, len = ref.length; i < len; i++) {
        event = ref[i];
        this.form_field.stopObserving(event);
      }
      this.container.stopObserving();
      this.search_results.stopObserving();
      this.search_field.stopObserving();
      if (this.form_field_label != null) {
        this.form_field_label.stopObserving();
      }
      if (this.is_multiple) {
        this.search_choices.stopObserving();
        this.container.select(".search-choice-close").each(function(choice) {
          return choice.stopObserving();
        });
      } else {
        this.selected_item.stopObserving();
      }
      if (this.search_field.tabIndex) {
        this.form_field.tabIndex = this.search_field.tabIndex;
      }
      this.container.remove();
      return this.form_field.show();
    };

    Chosen.prototype.search_field_disabled = function() {
      var ref;
      this.is_disabled = this.form_field.disabled || ((ref = this.form_field.up('fieldset')) != null ? ref.disabled : void 0) || false;
      if (this.is_disabled) {
        this.container.addClassName('chosen-disabled');
      } else {
        this.container.removeClassName('chosen-disabled');
      }
      this.search_field.disabled = this.is_disabled;
      if (!this.is_multiple) {
        this.selected_item.stopObserving('focus', this.activate_field);
      }
      if (this.is_disabled) {
        return this.close_field();
      } else if (!this.is_multiple) {
        return this.selected_item.observe('focus', this.activate_field);
      }
    };

    Chosen.prototype.container_mousedown = function(evt) {
      var ref;
      if (this.is_disabled) {
        return;
      }
      if (evt && ((ref = evt.type) === 'mousedown' || ref === 'touchstart') && !this.results_showing) {
        evt.preventDefault();
      }
      if (!((evt != null) && evt.target.hasClassName("search-choice-close"))) {
        if (!this.active_field) {
          if (this.is_multiple) {
            this.search_field.clear();
          }
          this.container.ownerDocument.observe("click", this.click_test_action);
          this.results_show();
        } else if (!this.is_multiple && evt && (evt.target === this.selected_item || evt.target.up("a.chosen-single"))) {
          this.results_toggle();
        }
        return this.activate_field();
      }
    };

    Chosen.prototype.container_mouseup = function(evt) {
      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
        return this.results_reset(evt);
      }
    };

    Chosen.prototype.search_results_mousewheel = function(evt) {
      var delta;
      delta = evt.deltaY || -evt.wheelDelta || evt.detail;
      if (delta != null) {
        evt.preventDefault();
        if (evt.type === 'DOMMouseScroll') {
          delta = delta * 40;
        }
        return this.search_results.scrollTop = delta + this.search_results.scrollTop;
      }
    };

    Chosen.prototype.blur_test = function(evt) {
      if (!this.active_field && this.container.hasClassName("chosen-container-active")) {
        return this.close_field();
      }
    };

    Chosen.prototype.close_field = function() {
      this.container.ownerDocument.stopObserving("click", this.click_test_action);
      this.active_field = false;
      this.results_hide();
      this.container.removeClassName("chosen-container-active");
      this.clear_backstroke();
      this.show_search_field_default();
      this.search_field_scale();
      return this.search_field.blur();
    };

    Chosen.prototype.activate_field = function() {
      if (this.is_disabled) {
        return;
      }
      this.container.addClassName("chosen-container-active");
      this.active_field = true;
      this.search_field.value = this.get_search_field_value();
      return this.search_field.focus();
    };

    Chosen.prototype.test_active_click = function(evt) {
      if (evt.target.up('.chosen-container') === this.container) {
        return this.active_field = true;
      } else {
        return this.close_field();
      }
    };

    Chosen.prototype.results_build = function() {
      this.parsing = true;
      this.selected_option_count = null;
      this.results_data = SelectParser.select_to_array(this.form_field);
      if (this.is_multiple) {
        this.search_choices.select("li.search-choice").invoke("remove");
      } else {
        this.single_set_selected_text();
        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
          this.search_field.readOnly = true;
          this.container.addClassName("chosen-container-single-nosearch");
        } else {
          this.search_field.readOnly = false;
          this.container.removeClassName("chosen-container-single-nosearch");
        }
      }
      this.update_results_content(this.results_option_build({
        first: true
      }));
      this.search_field_disabled();
      this.show_search_field_default();
      this.search_field_scale();
      return this.parsing = false;
    };

    Chosen.prototype.result_do_highlight = function(el) {
      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
      this.result_clear_highlight();
      this.result_highlight = el;
      this.result_highlight.addClassName("highlighted");
      maxHeight = parseInt(this.search_results.getStyle('maxHeight'), 10);
      visible_top = this.search_results.scrollTop;
      visible_bottom = maxHeight + visible_top;
      high_top = this.result_highlight.positionedOffset().top;
      high_bottom = high_top + this.result_highlight.getHeight();
      if (high_bottom >= visible_bottom) {
        return this.search_results.scrollTop = (high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0;
      } else if (high_top < visible_top) {
        return this.search_results.scrollTop = high_top;
      }
    };

    Chosen.prototype.result_clear_highlight = function() {
      if (this.result_highlight) {
        this.result_highlight.removeClassName('highlighted');
      }
      return this.result_highlight = null;
    };

    Chosen.prototype.results_show = function() {
      if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
        this.form_field.fire("chosen:maxselected", {
          chosen: this
        });
        return false;
      }
      this.container.addClassName("chosen-with-drop");
      this.results_showing = true;
      this.search_field.focus();
      this.search_field.value = this.get_search_field_value();
      this.winnow_results();
      return this.form_field.fire("chosen:showing_dropdown", {
        chosen: this
      });
    };

    Chosen.prototype.update_results_content = function(content) {
      return this.search_results.update(content);
    };

    Chosen.prototype.results_hide = function() {
      if (this.results_showing) {
        this.result_clear_highlight();
        this.container.removeClassName("chosen-with-drop");
        this.form_field.fire("chosen:hiding_dropdown", {
          chosen: this
        });
      }
      return this.results_showing = false;
    };

    Chosen.prototype.set_tab_index = function(el) {
      var ti;
      if (this.form_field.tabIndex) {
        ti = this.form_field.tabIndex;
        this.form_field.tabIndex = -1;
        return this.search_field.tabIndex = ti;
      }
    };

    Chosen.prototype.set_label_behavior = function() {
      this.form_field_label = this.form_field.up("label");
      if (this.form_field_label == null) {
        this.form_field_label = $$("label[for='" + this.form_field.id + "']").first();
      }
      if (this.form_field_label != null) {
        return this.form_field_label.observe("click", this.label_click_handler);
      }
    };

    Chosen.prototype.show_search_field_default = function() {
      if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
        this.search_field.value = this.default_text;
        return this.search_field.addClassName("default");
      } else {
        this.search_field.value = "";
        return this.search_field.removeClassName("default");
      }
    };

    Chosen.prototype.search_results_mouseup = function(evt) {
      var target;
      target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
      if (target) {
        this.result_highlight = target;
        this.result_select(evt);
        return this.search_field.focus();
      }
    };

    Chosen.prototype.search_results_mouseover = function(evt) {
      var target;
      target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
      if (target) {
        return this.result_do_highlight(target);
      }
    };

    Chosen.prototype.search_results_mouseout = function(evt) {
      if (evt.target.hasClassName('active-result') || evt.target.up('.active-result')) {
        return this.result_clear_highlight();
      }
    };

    Chosen.prototype.choice_build = function(item) {
      var choice, close_link;
      choice = new Element('li', {
        "class": "search-choice"
      }).update("<span>" + (this.choice_label(item)) + "</span>");
      if (item.disabled) {
        choice.addClassName('search-choice-disabled');
      } else {
        close_link = new Element('a', {
          href: '#',
          "class": 'search-choice-close',
          rel: item.array_index
        });
        close_link.observe("click", (function(_this) {
          return function(evt) {
            return _this.choice_destroy_link_click(evt);
          };
        })(this));
        choice.insert(close_link);
      }
      return this.search_container.insert({
        before: choice
      });
    };

    Chosen.prototype.choice_destroy_link_click = function(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      if (!this.is_disabled) {
        return this.choice_destroy(evt.target);
      }
    };

    Chosen.prototype.choice_destroy = function(link) {
      if (this.result_deselect(link.readAttribute("rel"))) {
        if (this.active_field) {
          this.search_field.focus();
        } else {
          this.show_search_field_default();
        }
        if (this.is_multiple && this.choices_count() > 0 && this.get_search_field_value().length < 1) {
          this.results_hide();
        }
        link.up('li').remove();
        return this.search_field_scale();
      }
    };

    Chosen.prototype.results_reset = function() {
      this.reset_single_select_options();
      this.form_field.options[0].selected = true;
      this.single_set_selected_text();
      this.show_search_field_default();
      this.results_reset_cleanup();
      this.trigger_form_field_change();
      if (this.active_field) {
        return this.results_hide();
      }
    };

    Chosen.prototype.results_reset_cleanup = function() {
      var deselect_trigger;
      this.current_selectedIndex = this.form_field.selectedIndex;
      deselect_trigger = this.selected_item.down("abbr");
      if (deselect_trigger) {
        return deselect_trigger.remove();
      }
    };

    Chosen.prototype.result_select = function(evt) {
      var high, item;
      if (this.result_highlight) {
        high = this.result_highlight;
        this.result_clear_highlight();
        if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
          this.form_field.fire("chosen:maxselected", {
            chosen: this
          });
          return false;
        }
        if (this.is_multiple) {
          high.removeClassName("active-result");
        } else {
          this.reset_single_select_options();
        }
        high.addClassName("result-selected");
        item = this.results_data[high.getAttribute("data-option-array-index")];
        item.selected = true;
        this.form_field.options[item.options_index].selected = true;
        this.selected_option_count = null;
        if (this.is_multiple) {
          this.choice_build(item);
        } else {
          this.single_set_selected_text(this.choice_label(item));
        }
        if (this.is_multiple && (!this.hide_results_on_select || (evt.metaKey || evt.ctrlKey))) {
          if (evt.metaKey || evt.ctrlKey) {
            this.winnow_results({
              skip_highlight: true
            });
          } else {
            this.search_field.value = "";
            this.winnow_results();
          }
        } else {
          this.results_hide();
          this.show_search_field_default();
        }
        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
          this.trigger_form_field_change();
        }
        this.current_selectedIndex = this.form_field.selectedIndex;
        evt.preventDefault();
        return this.search_field_scale();
      }
    };

    Chosen.prototype.single_set_selected_text = function(text) {
      if (text == null) {
        text = this.default_text;
      }
      if (text === this.default_text) {
        this.selected_item.addClassName("chosen-default");
      } else {
        this.single_deselect_control_build();
        this.selected_item.removeClassName("chosen-default");
      }
      return this.selected_item.down("span").update(text);
    };

    Chosen.prototype.result_deselect = function(pos) {
      var result_data;
      result_data = this.results_data[pos];
      if (!this.form_field.options[result_data.options_index].disabled) {
        result_data.selected = false;
        this.form_field.options[result_data.options_index].selected = false;
        this.selected_option_count = null;
        this.result_clear_highlight();
        if (this.results_showing) {
          this.winnow_results();
        }
        this.trigger_form_field_change();
        this.search_field_scale();
        return true;
      } else {
        return false;
      }
    };

    Chosen.prototype.single_deselect_control_build = function() {
      if (!this.allow_single_deselect) {
        return;
      }
      if (!this.selected_item.down("abbr")) {
        this.selected_item.down("span").insert({
          after: "<abbr class=\"search-choice-close\"></abbr>"
        });
      }
      return this.selected_item.addClassName("chosen-single-with-deselect");
    };

    Chosen.prototype.get_search_field_value = function() {
      return this.search_field.value;
    };

    Chosen.prototype.get_search_text = function() {
      return this.get_search_field_value().strip();
    };

    Chosen.prototype.escape_html = function(text) {
      return text.escapeHTML();
    };

    Chosen.prototype.winnow_results_set_highlight = function() {
      var do_high;
      if (!this.is_multiple) {
        do_high = this.search_results.down(".result-selected.active-result");
      }
      if (do_high == null) {
        do_high = this.search_results.down(".active-result");
      }
      if (do_high != null) {
        return this.result_do_highlight(do_high);
      }
    };

    Chosen.prototype.no_results = function(terms) {
      this.search_results.insert(this.get_no_results_html(terms));
      return this.form_field.fire("chosen:no_results", {
        chosen: this
      });
    };

    Chosen.prototype.no_results_clear = function() {
      var nr, results1;
      nr = null;
      results1 = [];
      while (nr = this.search_results.down(".no-results")) {
        results1.push(nr.remove());
      }
      return results1;
    };

    Chosen.prototype.keydown_arrow = function() {
      var next_sib;
      if (this.results_showing && this.result_highlight) {
        next_sib = this.result_highlight.next('.active-result');
        if (next_sib) {
          return this.result_do_highlight(next_sib);
        }
      } else {
        return this.results_show();
      }
    };

    Chosen.prototype.keyup_arrow = function() {
      var actives, prevs, sibs;
      if (!this.results_showing && !this.is_multiple) {
        return this.results_show();
      } else if (this.result_highlight) {
        sibs = this.result_highlight.previousSiblings();
        actives = this.search_results.select("li.active-result");
        prevs = sibs.intersect(actives);
        if (prevs.length) {
          return this.result_do_highlight(prevs.first());
        } else {
          if (this.choices_count() > 0) {
            this.results_hide();
          }
          return this.result_clear_highlight();
        }
      }
    };

    Chosen.prototype.keydown_backstroke = function() {
      var next_available_destroy;
      if (this.pending_backstroke) {
        this.choice_destroy(this.pending_backstroke.down("a"));
        return this.clear_backstroke();
      } else {
        next_available_destroy = this.search_container.siblings().last();
        if (next_available_destroy && next_available_destroy.hasClassName("search-choice") && !next_available_destroy.hasClassName("search-choice-disabled")) {
          this.pending_backstroke = next_available_destroy;
          if (this.pending_backstroke) {
            this.pending_backstroke.addClassName("search-choice-focus");
          }
          if (this.single_backstroke_delete) {
            return this.keydown_backstroke();
          } else {
            return this.pending_backstroke.addClassName("search-choice-focus");
          }
        }
      }
    };

    Chosen.prototype.clear_backstroke = function() {
      if (this.pending_backstroke) {
        this.pending_backstroke.removeClassName("search-choice-focus");
      }
      return this.pending_backstroke = null;
    };

    Chosen.prototype.search_field_scale = function() {
      var container_width, div, i, len, style, style_block, styles, width;
      if (!this.is_multiple) {
        return;
      }
      style_block = {
        position: 'absolute',
        left: '-1000px',
        top: '-1000px',
        display: 'none',
        whiteSpace: 'pre'
      };
      styles = ['fontSize', 'fontStyle', 'fontWeight', 'fontFamily', 'lineHeight', 'textTransform', 'letterSpacing'];
      for (i = 0, len = styles.length; i < len; i++) {
        style = styles[i];
        style_block[style] = this.search_field.getStyle(style);
      }
      div = new Element('div').update(this.escape_html(this.get_search_field_value()));
      div.setStyle(style_block);
      document.body.appendChild(div);
      width = div.measure('width') + 25;
      div.remove();
      if (container_width = this.container.getWidth()) {
        width = Math.min(container_width - 10, width);
      }
      return this.search_field.setStyle({
        width: width + 'px'
      });
    };

    Chosen.prototype.trigger_form_field_change = function() {
      triggerHtmlEvent(this.form_field, 'input');
      return triggerHtmlEvent(this.form_field, 'change');
    };

    triggerHtmlEvent = function(element, eventType) {
      var error, evt;
      if (element.dispatchEvent) {
        try {
          evt = new Event(eventType, {
            bubbles: true,
            cancelable: true
          });
        } catch (error) {
          evt = document.createEvent('HTMLEvents');
          evt.initEvent(eventType, true, true);
        }
        return element.dispatchEvent(evt);
      } else {
        return element.fireEvent("on" + eventType, document.createEventObject());
      }
    };

    return Chosen;

  })(AbstractChosen);

}).call(this);
PKW�1\�w��"vendor/harvesthq/chosen/LICENSE.mdnu�[���#### Chosen
- by Patrick Filler for [Harvest](http://getharvest.com)
- Copyright (c) 2011-2016 by Harvest

Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKW�1\}d�>33%vendor/harvesthq/chosen/composer.jsonnu�[���{
  "name": "harvesthq/chosen",
  "description": "Chosen is a JavaScript plugin that makes select boxes user-friendly. It is currently available in both jQuery and Prototype flavors.",
  "authors": [
    {
      "name": "Patrick Filler",
      "homepage": "https://github.com/pfiller"
    },
    {
      "name": "Christophe Coevoet",
      "homepage": "https://github.com/stof"
    },
    {
      "name": "Ken Earley",
      "homepage": "https://github.com/kenearley"
    },
    {
      "name": "Koen Punt",
      "homepage": "https://github.com/koenpunt"
    }
  ],
  "keywords": [
    "select",
    "multiselect",
    "dropdown",
    "form",
    "input",
    "ui"
  ],
  "type": "library",
  "license": "MIT",
  "minimum-stability": "stable",
  "homepage": "https://harvesthq.github.io/chosen/",
  "require": {
  }
}
PKW�1\,~)"��"vendor/harvesthq/chosen/bower.jsonnu�[���{
  "name": "chosen",
  "description": "Chosen is a JavaScript plugin that makes select boxes user-friendly. It is currently available in both jQuery and Prototype flavors.",
  "keywords": [
    "select",
    "multiselect",
    "dropdown",
    "form",
    "input",
    "ui"
  ],
  "homepage": "https://harvesthq.github.io/chosen/",
  "license": "https://github.com/harvesthq/chosen/blob/master/LICENSE.md",
  "authors": [
    {
      "name": "Patrick Filler",
      "url": "https://github.com/pfiller"
    },
    {
      "name": "Christophe Coevoet",
      "url": "https://github.com/stof"
    },
    {
      "name": "Ken Earley",
      "url": "https://github.com/kenearley"
    },
    {
      "name": "Koen Punt",
      "url": "https://github.com/koenpunt"
    }
  ],
  "dependencies": {},
  "main": [
    "chosen.jquery.js",
    "chosen.css"
  ],
  "ignore": [],
  "repository": {
    "type": "git",
    "url": "https://github.com/harvesthq/chosen.git"
  }
}
PKW�1\���r�'�'&vendor/harvesthq/chosen/chosen.min.cssnu�[���/*!
Chosen, a Select Box Enhancer for jQuery and Prototype
by Patrick Filler for Harvest, http://getharvest.com

Version 1.8.7
Full source at https://github.com/harvesthq/chosen
Copyright (c) 2011-2018 Harvest http://getharvest.com

MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
This file is generated by `grunt build`, do not edit it by hand.
*/.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0);-webkit-clip-path:inset(100% 100%);clip-path:inset(100% 100%)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto;-webkit-clip-path:none;clip-path:none}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container .chosen-single .group-name:after,.chosen-container .search-choice .group-name:after{content:":";padding-left:2px;vertical-align:top}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),to(#f4f4f4));background:linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;-webkit-box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(chosen-sprite.png) no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:url(chosen-sprite.png) no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0);-webkit-clip-path:inset(100% 100%);clip-path:inset(100% 100%)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(1%,#eee),color-stop(15%,#fff));background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;-webkit-box-shadow:none;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),to(#eee));background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),to(#eee));background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;border-bottom-right-radius:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#eee),color-stop(80%,#fff));background-image:linear-gradient(#eee 20%,#fff 80%);-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:url(chosen-sprite.png) no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi),only screen and (min-resolution:1.5dppx){.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container-single .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-rtl .chosen-search input[type=text]{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}}PKW�1\.?L)vendor/harvesthq/chosen/chosen-sprite.pngnu�[����PNG


IHDR4%��^�IDATH�헱kSQƯ
.-����=�$�b�o�$((T�Hw��*����"nupA�@ P�Apq�J$p!P��M1��.�����;���=��\D�.Y�n0��@}�DMF���>Fb��1���
�c�	!6�1r��b�%G���I��J(v��fFy�O����H4B c�1�}��^��4��5Fo��G�X�ٝv�U�n�(�R�s�p����v��*��8sP���*�c�O�TQWŬ���j1Q�H}����T��+���}��֕d�/���L�Lc�F�6�˔�7��,9ʼ1IkJ�(�dJj��Lc�^��z*"Hu�j)�׿���,?<��._1�a�������°x�	/b�}�T!�����i?O�u�	oc\������eN��c:�99�\@�s� uZ���q��|yp�k�a�����6��B|���1��G����gq�u����p�+���[�*y���IEND�B`�PKW�1\����
�
vendor/kint-php/kint/README.mdnu�[���# Kint - debugging helper for PHP developers

[![](https://travis-ci.org/kint-php/kint.svg?branch=master)](https://travis-ci.org/kint-php/kint)

![Screenshot](https://kint-php.github.io/kint/images/intro.png)

## What am I looking at?

At first glance Kint is just a pretty replacement for **[var_dump()](https://secure.php.net/function.var_dump)**, **[print_r()](https://secure.php.net/function.print_r)** and **[debug_backtrace()](https://secure.php.net/function.debug_backtrace)**.

However, it's much, *much* more than that. You will eventually wonder how you developed without it.

## Installation

One of the main goals of Kint is to be **zero setup**.

[Download the file](https://raw.githubusercontent.com/kint-php/kint/master/build/kint.phar) and simply
```php
<?php

require 'kint.phar';
```

### Or, if you use Composer:

```bash
composer require kint-php/kint --dev
```

## Usage

```php
<?php

Kint::dump($GLOBALS, $_SERVER); // pass any number of parameters
d($GLOBALS, $_SERVER); // or simply use d() as a shorthand

Kint::trace(); // Debug backtrace
d(1); // Debug backtrace shorthand

s($GLOBALS); // Basic output mode

~d($GLOBALS); // Text only output mode

Kint::$enabled_mode = false; // Disable kint
d('Get off my lawn!'); // Debugs no longer have any effect
```

## Tips & Tricks

* Kint is enabled by default, set `Kint::$enabled_mode = false;` to turn it completely off.  
  The best practice is to enable Kint in a development environment only - so even if you accidentally leave a dump in production, no one will know.
* See the buttons on the right of the output? Click them to open a new tab, show the access path for the value, or show a search box.
* To see the output where you called Kint instead of the docked toolbar at the bottom of the page add the line `Kint\Renderer\RichRenderer::$folder = false;` right after you include Kint.
* There are a couple of real-time modifiers you can use:
    * `~d($var)` this call will output in plain text format.
    * `+d($var)` will disregard depth level limits and output everything.  
      *Careful, this can hang your browser on large objects!*
    * `!d($var)` will expand the output automatically.
    * `-d($var)` will attempt to `ob_clean` the previous output and flush after printing.
    * You can combine modifiers too: `~+d($var)`
* Double clicking the <kbd>+</kbd> sign will open/close it and all its children.
* Triple clicking the <kbd>+</kbd> sign in will open/close everything on the page.
* Add heavy classes to the blacklist to improve performance:  
  `Kint\Parser\BlacklistPlugin::$shallow_blacklist[] = 'Psr\Container\ContainerInterface';`
* To change display theme, use `Kint\Renderer\RichRenderer::$theme = 'theme.css';`. You can pass the absolute path to a CSS file, or use one of the built in themes:
    * `original.css` (default)
    * `solarized.css`
    * `solarized-dark.css`
    * `aante-light.css`
* Kint has *keyboard shortcuts*! When Kint is visible, press <kbd>D</kbd> on the keyboard and you will be able to traverse the tree with arrows, <kbd>H</kbd><kbd>J</kbd><kbd>K</kbd><kbd>L</kbd>, and <kbd>TAB</kbd> keys - and expand/collapse nodes with <kbd>SPACE</kbd> or <kbd>ENTER</kbd>.
* You can write plugins and wrapper functions to customize dump behavior!
* Read [the full documentation](https://kint-php.github.io/kint/) for more information

## Authors

[**Jonathan Vollebregt** (jnvsor)](https://github.com/jnvsor)  
[**Rokas Šleinius** (raveren)](https://github.com/raveren)

## License

Licensed under the MIT License
PKW�1\���$
$
%vendor/kint-php/kint/init_helpers.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

use Kint\Kint;

if (!\function_exists('d')) {
    /**
     * Alias of Kint::dump().
     *
     * @return int|string
     */
    function d()
    {
        $args = \func_get_args();

        return \call_user_func_array(['Kint', 'dump'], $args);
    }

    Kint::$aliases[] = 'd';
}

if (!\function_exists('s')) {
    /**
     * Alias of Kint::dump(), however the output is in plain text.
     *
     * Alias of Kint::dump(), however the output is in plain htmlescaped text
     * with some minor visibility enhancements added.
     *
     * If run in CLI mode, output is not escaped.
     *
     * To force rendering mode without autodetecting anything:
     *
     * Kint::$enabled_mode = Kint::MODE_PLAIN;
     * Kint::dump( $variable );
     *
     * @return int|string
     */
    function s()
    {
        if (false === Kint::$enabled_mode) {
            return 0;
        }

        $stash = Kint::$enabled_mode;

        if (Kint::MODE_TEXT !== Kint::$enabled_mode) {
            Kint::$enabled_mode = Kint::MODE_PLAIN;
            if (PHP_SAPI === 'cli' && true === Kint::$cli_detection) {
                Kint::$enabled_mode = Kint::$mode_default_cli;
            }
        }

        $args = \func_get_args();
        $out = \call_user_func_array(['Kint', 'dump'], $args);

        Kint::$enabled_mode = $stash;

        return $out;
    }

    Kint::$aliases[] = 's';
}
PKW�1\�MG���/vendor/kint-php/kint/src/Zval/DateTimeValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

use DateTime;

class DateTimeValue extends InstanceValue
{
    public $dt;

    public $hints = ['object', 'datetime'];

    public function __construct(DateTime $dt)
    {
        parent::__construct();

        $this->dt = clone $dt;
    }

    public function getValueShort()
    {
        $stamp = $this->dt->format('Y-m-d H:i:s');
        if ((int) ($micro = $this->dt->format('u'))) {
            $stamp .= '.'.$micro;
        }
        $stamp .= $this->dt->format('P T');

        return $stamp;
    }
}
PKW�1\%�	�	/vendor/kint-php/kint/src/Zval/InstanceValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

class InstanceValue extends Value
{
    public $type = 'object';
    public $classname;
    public $spl_object_hash;
    public $filename;
    public $startline;
    public $hints = ['object'];

    public function getType()
    {
        return $this->classname;
    }

    public function transplant(Value $old)
    {
        parent::transplant($old);

        if ($old instanceof self) {
            $this->classname = $old->classname;
            $this->spl_object_hash = $old->spl_object_hash;
            $this->filename = $old->filename;
            $this->startline = $old->startline;
        }
    }

    public static function sortByHierarchy($a, $b)
    {
        if (\is_string($a) && \is_string($b)) {
            $aclass = $a;
            $bclass = $b;
        } elseif (!($a instanceof Value) || !($b instanceof Value)) {
            return 0;
        } elseif ($a instanceof self && $b instanceof self) {
            $aclass = $a->classname;
            $bclass = $b->classname;
        } else {
            return 0;
        }

        if (\is_subclass_of($aclass, $bclass)) {
            return -1;
        }

        if (\is_subclass_of($bclass, $aclass)) {
            return 1;
        }

        return 0;
    }
}
PKW�1\^����'vendor/kint-php/kint/src/Zval/Value.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

use Kint\Zval\Representation\Representation;

class Value
{
    const ACCESS_NONE = null;
    const ACCESS_PUBLIC = 1;
    const ACCESS_PROTECTED = 2;
    const ACCESS_PRIVATE = 3;

    const OPERATOR_NONE = null;
    const OPERATOR_ARRAY = 1;
    const OPERATOR_OBJECT = 2;
    const OPERATOR_STATIC = 3;

    public $name;
    public $type;
    public $static = false;
    public $const = false;
    public $access = self::ACCESS_NONE;
    public $owner_class;
    public $access_path;
    public $operator = self::OPERATOR_NONE;
    public $reference = false;
    public $depth = 0;
    public $size;
    public $value;
    public $hints = [];

    protected $representations = [];

    public function __construct()
    {
    }

    public function addRepresentation(Representation $rep, $pos = null)
    {
        if (isset($this->representations[$rep->getName()])) {
            return false;
        }

        if (null === $pos) {
            $this->representations[$rep->getName()] = $rep;
        } else {
            $this->representations = \array_merge(
                \array_slice($this->representations, 0, $pos),
                [$rep->getName() => $rep],
                \array_slice($this->representations, $pos)
            );
        }

        return true;
    }

    public function replaceRepresentation(Representation $rep, $pos = null)
    {
        if (null === $pos) {
            $this->representations[$rep->getName()] = $rep;
        } else {
            $this->removeRepresentation($rep);
            $this->addRepresentation($rep, $pos);
        }
    }

    public function removeRepresentation($rep)
    {
        if ($rep instanceof Representation) {
            unset($this->representations[$rep->getName()]);
        } elseif (\is_string($rep)) {
            unset($this->representations[$rep]);
        }
    }

    public function getRepresentation($name)
    {
        if (isset($this->representations[$name])) {
            return $this->representations[$name];
        }
    }

    public function getRepresentations()
    {
        return $this->representations;
    }

    public function clearRepresentations()
    {
        $this->representations = [];
    }

    public function getType()
    {
        return $this->type;
    }

    public function getModifiers()
    {
        $out = $this->getAccess();

        if ($this->const) {
            $out .= ' const';
        }

        if ($this->static) {
            $out .= ' static';
        }

        if (\strlen($out)) {
            return \ltrim($out);
        }
    }

    public function getAccess()
    {
        switch ($this->access) {
            case self::ACCESS_PRIVATE:
                return 'private';
            case self::ACCESS_PROTECTED:
                return 'protected';
            case self::ACCESS_PUBLIC:
                return 'public';
        }
    }

    public function getName()
    {
        return $this->name;
    }

    public function getOperator()
    {
        switch ($this->operator) {
            case self::OPERATOR_ARRAY:
                return '=>';
            case self::OPERATOR_OBJECT:
                return '->';
            case self::OPERATOR_STATIC:
                return '::';
        }
    }

    public function getSize()
    {
        return $this->size;
    }

    public function getValueShort()
    {
        if ($rep = $this->value) {
            if ('boolean' === $this->type) {
                return $rep->contents ? 'true' : 'false';
            }

            if ('integer' === $this->type || 'double' === $this->type) {
                return $rep->contents;
            }
        }
    }

    public function getAccessPath()
    {
        return $this->access_path;
    }

    public function transplant(Value $old)
    {
        $this->name = $old->name;
        $this->size = $old->size;
        $this->access_path = $old->access_path;
        $this->access = $old->access;
        $this->static = $old->static;
        $this->const = $old->const;
        $this->type = $old->type;
        $this->depth = $old->depth;
        $this->owner_class = $old->owner_class;
        $this->operator = $old->operator;
        $this->reference = $old->reference;
        $this->value = $old->value;
        $this->representations += $old->representations;
        $this->hints = \array_merge($this->hints, $old->hints);
    }

    /**
     * Creates a new basic object with a name and access path.
     *
     * @param null|string $name
     * @param null|string $access_path
     *
     * @return \Kint\Zval\Value
     */
    public static function blank($name = null, $access_path = null)
    {
        $o = new self();
        $o->name = $name;
        $o->access_path = $access_path;

        return $o;
    }

    public static function sortByAccess(Value $a, Value $b)
    {
        static $sorts = [
            self::ACCESS_PUBLIC => 1,
            self::ACCESS_PROTECTED => 2,
            self::ACCESS_PRIVATE => 3,
            self::ACCESS_NONE => 4,
        ];

        return $sorts[$a->access] - $sorts[$b->access];
    }

    public static function sortByName(Value $a, Value $b)
    {
        $ret = \strnatcasecmp($a->name, $b->name);

        if (0 === $ret) {
            return (int) \is_int($b->name) - (int) \is_int($a->name);
        }

        return $ret;
    }
}
PKW�1\Nm�,d	d	Hvendor/kint-php/kint/src/Zval/Representation/MicrotimeRepresentation.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval\Representation;

use DateTime;

class MicrotimeRepresentation extends Representation
{
    public $seconds;
    public $microseconds;
    public $group;
    public $lap;
    public $total;
    public $avg;
    public $i = 0;
    public $mem = 0;
    public $mem_real = 0;
    public $mem_peak = 0;
    public $mem_peak_real = 0;
    public $hints = ['microtime'];

    public function __construct($seconds, $microseconds, $group, $lap = null, $total = null, $i = 0)
    {
        parent::__construct('Microtime');

        $this->seconds = (int) $seconds;
        $this->microseconds = (int) $microseconds;

        $this->group = $group;
        $this->lap = $lap;
        $this->total = $total;
        $this->i = $i;

        if ($i) {
            $this->avg = $total / $i;
        }

        $this->mem = \memory_get_usage();
        $this->mem_real = \memory_get_usage(true);
        $this->mem_peak = \memory_get_peak_usage();
        $this->mem_peak_real = \memory_get_peak_usage(true);
    }

    public function getDateTime()
    {
        return DateTime::createFromFormat('U u', $this->seconds.' '.\str_pad($this->microseconds, 6, '0', STR_PAD_LEFT));
    }
}
PKW�1\J�{�[[Jvendor/kint-php/kint/src/Zval/Representation/SplFileInfoRepresentation.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval\Representation;

use Kint\Utils;
use SplFileInfo;

class SplFileInfoRepresentation extends Representation
{
    public $perms = null;
    public $flags;
    public $path;
    public $realpath = null;
    public $linktarget = null;
    public $size;
    public $is_dir = false;
    public $is_file = false;
    public $is_link = false;
    public $owner = null;
    public $group = null;
    public $ctime;
    public $mtime;
    public $typename = 'Unknown file';
    public $typeflag = '-';
    public $hints = ['fspath'];

    public function __construct(SplFileInfo $fileInfo)
    {
        parent::__construct('SplFileInfo');

        if ($fileInfo->getRealPath()) {
            $this->realpath = $fileInfo->getRealPath();
            $this->perms = $fileInfo->getPerms();
            $this->size = $fileInfo->getSize();
            $this->owner = $fileInfo->getOwner();
            $this->group = $fileInfo->getGroup();
            $this->ctime = $fileInfo->getCTime();
            $this->mtime = $fileInfo->getMTime();
        }

        $this->path = $fileInfo->getPathname();

        $this->is_dir = $fileInfo->isDir();
        $this->is_file = $fileInfo->isFile();
        $this->is_link = $fileInfo->isLink();

        if ($this->is_link) {
            $this->linktarget = $fileInfo->getLinkTarget();
        }

        switch ($this->perms & 0xF000) {
            case 0xC000:
                $this->typename = 'Socket';
                $this->typeflag = 's';
                break;
            case 0x6000:
                $this->typename = 'Block device';
                $this->typeflag = 'b';
                break;
            case 0x2000:
                $this->typename = 'Character device';
                $this->typeflag = 'c';
                break;
            case 0x1000:
                $this->typename = 'Named pipe';
                $this->typeflag = 'p';
                break;
            default:
                if ($this->is_file) {
                    if ($this->is_link) {
                        $this->typename = 'File symlink';
                        $this->typeflag = 'l';
                    } else {
                        $this->typename = 'File';
                        $this->typeflag = '-';
                    }
                } elseif ($this->is_dir) {
                    if ($this->is_link) {
                        $this->typename = 'Directory symlink';
                        $this->typeflag = 'l';
                    } else {
                        $this->typename = 'Directory';
                        $this->typeflag = 'd';
                    }
                }
                break;
        }

        $this->flags = [$this->typeflag];

        // User
        $this->flags[] = (($this->perms & 0400) ? 'r' : '-');
        $this->flags[] = (($this->perms & 0200) ? 'w' : '-');
        if ($this->perms & 0100) {
            $this->flags[] = ($this->perms & 04000) ? 's' : 'x';
        } else {
            $this->flags[] = ($this->perms & 04000) ? 'S' : '-';
        }

        // Group
        $this->flags[] = (($this->perms & 0040) ? 'r' : '-');
        $this->flags[] = (($this->perms & 0020) ? 'w' : '-');
        if ($this->perms & 0010) {
            $this->flags[] = ($this->perms & 02000) ? 's' : 'x';
        } else {
            $this->flags[] = ($this->perms & 02000) ? 'S' : '-';
        }

        // Other
        $this->flags[] = (($this->perms & 0004) ? 'r' : '-');
        $this->flags[] = (($this->perms & 0002) ? 'w' : '-');
        if ($this->perms & 0001) {
            $this->flags[] = ($this->perms & 01000) ? 's' : 'x';
        } else {
            $this->flags[] = ($this->perms & 01000) ? 'S' : '-';
        }

        $this->contents = \implode($this->flags).' '.$this->owner.' '.$this->group;
        $this->contents .= ' '.$this->getSize().' '.$this->getMTime().' ';

        if ($this->is_link && $this->linktarget) {
            $this->contents .= $this->path.' -> '.$this->linktarget;
        } elseif (null !== $this->realpath && \strlen($this->realpath) < \strlen($this->path)) {
            $this->contents .= $this->realpath;
        } else {
            $this->contents .= $this->path;
        }
    }

    public function getLabel()
    {
        return $this->typename.' ('.$this->getSize().')';
    }

    public function getSize()
    {
        if ($this->size) {
            $size = Utils::getHumanReadableBytes($this->size);

            return \round($size['value'], 2).$size['unit'];
        }
    }

    public function getMTime()
    {
        $year = \date('Y', $this->mtime);

        if ($year !== \date('Y')) {
            return \date('M d Y', $this->mtime);
        }

        return \date('M d H:i', $this->mtime);
    }
}
PKW�1\``�h???vendor/kint-php/kint/src/Zval/Representation/Representation.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval\Representation;

class Representation
{
    public $label;
    public $implicit_label = false;
    public $hints = [];
    public $contents = [];

    protected $name;

    public function __construct($label, $name = null)
    {
        $this->label = $label;

        if (null === $name) {
            $name = $label;
        }

        $this->setName($name);
    }

    public function getLabel()
    {
        if (\is_array($this->contents) && \count($this->contents) > 1) {
            return $this->label.' ('.\count($this->contents).')';
        }

        return $this->label;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = \preg_replace('/[^a-z0-9]+/', '_', \strtolower($name));
    }

    public function labelIsImplicit()
    {
        return $this->implicit_label;
    }
}
PKW�1\A��;�G�GDvendor/kint-php/kint/src/Zval/Representation/ColorRepresentation.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval\Representation;

use InvalidArgumentException;

class ColorRepresentation extends Representation
{
    const COLOR_NAME = 1;
    const COLOR_HEX_3 = 2;
    const COLOR_HEX_6 = 3;
    const COLOR_RGB = 4;
    const COLOR_RGBA = 5;
    const COLOR_HSL = 6;
    const COLOR_HSLA = 7;
    const COLOR_HEX_4 = 8;
    const COLOR_HEX_8 = 9;

    public static $color_map = [
        'aliceblue' => 'f0f8ff',
        'antiquewhite' => 'faebd7',
        'aqua' => '00ffff',
        'aquamarine' => '7fffd4',
        'azure' => 'f0ffff',
        'beige' => 'f5f5dc',
        'bisque' => 'ffe4c4',
        'black' => '000000',
        'blanchedalmond' => 'ffebcd',
        'blue' => '0000ff',
        'blueviolet' => '8a2be2',
        'brown' => 'a52a2a',
        'burlywood' => 'deb887',
        'cadetblue' => '5f9ea0',
        'chartreuse' => '7fff00',
        'chocolate' => 'd2691e',
        'coral' => 'ff7f50',
        'cornflowerblue' => '6495ed',
        'cornsilk' => 'fff8dc',
        'crimson' => 'dc143c',
        'cyan' => '00ffff',
        'darkblue' => '00008b',
        'darkcyan' => '008b8b',
        'darkgoldenrod' => 'b8860b',
        'darkgray' => 'a9a9a9',
        'darkgreen' => '006400',
        'darkgrey' => 'a9a9a9',
        'darkkhaki' => 'bdb76b',
        'darkmagenta' => '8b008b',
        'darkolivegreen' => '556b2f',
        'darkorange' => 'ff8c00',
        'darkorchid' => '9932cc',
        'darkred' => '8b0000',
        'darksalmon' => 'e9967a',
        'darkseagreen' => '8fbc8f',
        'darkslateblue' => '483d8b',
        'darkslategray' => '2f4f4f',
        'darkslategrey' => '2f4f4f',
        'darkturquoise' => '00ced1',
        'darkviolet' => '9400d3',
        'deeppink' => 'ff1493',
        'deepskyblue' => '00bfff',
        'dimgray' => '696969',
        'dimgrey' => '696969',
        'dodgerblue' => '1e90ff',
        'firebrick' => 'b22222',
        'floralwhite' => 'fffaf0',
        'forestgreen' => '228b22',
        'fuchsia' => 'ff00ff',
        'gainsboro' => 'dcdcdc',
        'ghostwhite' => 'f8f8ff',
        'gold' => 'ffd700',
        'goldenrod' => 'daa520',
        'gray' => '808080',
        'green' => '008000',
        'greenyellow' => 'adff2f',
        'grey' => '808080',
        'honeydew' => 'f0fff0',
        'hotpink' => 'ff69b4',
        'indianred' => 'cd5c5c',
        'indigo' => '4b0082',
        'ivory' => 'fffff0',
        'khaki' => 'f0e68c',
        'lavender' => 'e6e6fa',
        'lavenderblush' => 'fff0f5',
        'lawngreen' => '7cfc00',
        'lemonchiffon' => 'fffacd',
        'lightblue' => 'add8e6',
        'lightcoral' => 'f08080',
        'lightcyan' => 'e0ffff',
        'lightgoldenrodyellow' => 'fafad2',
        'lightgray' => 'd3d3d3',
        'lightgreen' => '90ee90',
        'lightgrey' => 'd3d3d3',
        'lightpink' => 'ffb6c1',
        'lightsalmon' => 'ffa07a',
        'lightseagreen' => '20b2aa',
        'lightskyblue' => '87cefa',
        'lightslategray' => '778899',
        'lightslategrey' => '778899',
        'lightsteelblue' => 'b0c4de',
        'lightyellow' => 'ffffe0',
        'lime' => '00ff00',
        'limegreen' => '32cd32',
        'linen' => 'faf0e6',
        'magenta' => 'ff00ff',
        'maroon' => '800000',
        'mediumaquamarine' => '66cdaa',
        'mediumblue' => '0000cd',
        'mediumorchid' => 'ba55d3',
        'mediumpurple' => '9370db',
        'mediumseagreen' => '3cb371',
        'mediumslateblue' => '7b68ee',
        'mediumspringgreen' => '00fa9a',
        'mediumturquoise' => '48d1cc',
        'mediumvioletred' => 'c71585',
        'midnightblue' => '191970',
        'mintcream' => 'f5fffa',
        'mistyrose' => 'ffe4e1',
        'moccasin' => 'ffe4b5',
        'navajowhite' => 'ffdead',
        'navy' => '000080',
        'oldlace' => 'fdf5e6',
        'olive' => '808000',
        'olivedrab' => '6b8e23',
        'orange' => 'ffa500',
        'orangered' => 'ff4500',
        'orchid' => 'da70d6',
        'palegoldenrod' => 'eee8aa',
        'palegreen' => '98fb98',
        'paleturquoise' => 'afeeee',
        'palevioletred' => 'db7093',
        'papayawhip' => 'ffefd5',
        'peachpuff' => 'ffdab9',
        'peru' => 'cd853f',
        'pink' => 'ffc0cb',
        'plum' => 'dda0dd',
        'powderblue' => 'b0e0e6',
        'purple' => '800080',
        'rebeccapurple' => '663399',
        'red' => 'ff0000',
        'rosybrown' => 'bc8f8f',
        'royalblue' => '4169e1',
        'saddlebrown' => '8b4513',
        'salmon' => 'fa8072',
        'sandybrown' => 'f4a460',
        'seagreen' => '2e8b57',
        'seashell' => 'fff5ee',
        'sienna' => 'a0522d',
        'silver' => 'c0c0c0',
        'skyblue' => '87ceeb',
        'slateblue' => '6a5acd',
        'slategray' => '708090',
        'slategrey' => '708090',
        'snow' => 'fffafa',
        'springgreen' => '00ff7f',
        'steelblue' => '4682b4',
        'tan' => 'd2b48c',
        'teal' => '008080',
        'thistle' => 'd8bfd8',
        'tomato' => 'ff6347',
        // To quote MDN:
        // "Technically, transparent is a shortcut for rgba(0,0,0,0)."
        'transparent' => '00000000',
        'turquoise' => '40e0d0',
        'violet' => 'ee82ee',
        'wheat' => 'f5deb3',
        'white' => 'ffffff',
        'whitesmoke' => 'f5f5f5',
        'yellow' => 'ffff00',
        'yellowgreen' => '9acd32',
    ];

    public $r = 0;
    public $g = 0;
    public $b = 0;
    public $a = 1.0;
    public $variant;
    public $implicit_label = true;
    public $hints = ['color'];

    public function __construct($value)
    {
        parent::__construct('Color');

        $this->contents = $value;
        $this->setValues($value);
    }

    public function getColor($variant = null)
    {
        if (!$variant) {
            $variant = $this->variant;
        }

        switch ($variant) {
            case self::COLOR_NAME:
                $hex = \sprintf('%02x%02x%02x', $this->r, $this->g, $this->b);
                $hex_alpha = \sprintf('%02x%02x%02x%02x', $this->r, $this->g, $this->b, \round($this->a * 0xFF));

                return \array_search($hex, self::$color_map, true) ?: \array_search($hex_alpha, self::$color_map, true);
           case self::COLOR_HEX_3:
                if (0 === $this->r % 0x11 && 0 === $this->g % 0x11 && 0 === $this->b % 0x11) {
                    return \sprintf(
                        '#%1X%1X%1X',
                        \round($this->r / 0x11),
                        \round($this->g / 0x11),
                        \round($this->b / 0x11)
                    );
                }

                return false;
            case self::COLOR_HEX_6:
                return \sprintf('#%02X%02X%02X', $this->r, $this->g, $this->b);
            case self::COLOR_RGB:
                if (1.0 === $this->a) {
                    return \sprintf('rgb(%d, %d, %d)', $this->r, $this->g, $this->b);
                }

                return \sprintf('rgb(%d, %d, %d, %s)', $this->r, $this->g, $this->b, \round($this->a, 4));
            case self::COLOR_RGBA:
                return \sprintf('rgba(%d, %d, %d, %s)', $this->r, $this->g, $this->b, \round($this->a, 4));
            case self::COLOR_HSL:
                $val = self::rgbToHsl($this->r, $this->g, $this->b);
                if (1.0 === $this->a) {
                    return \vsprintf('hsl(%d, %d%%, %d%%)', $val);
                }

                return \sprintf('hsl(%d, %d%%, %d%%, %s)', $val[0], $val[1], $val[2], \round($this->a, 4));
            case self::COLOR_HSLA:
                $val = self::rgbToHsl($this->r, $this->g, $this->b);

                return \sprintf('hsla(%d, %d%%, %d%%, %s)', $val[0], $val[1], $val[2], \round($this->a, 4));
            case self::COLOR_HEX_4:
                if (0 === $this->r % 0x11 && 0 === $this->g % 0x11 && 0 === $this->b % 0x11 && 0 === ($this->a * 255) % 0x11) {
                    return \sprintf(
                        '#%1X%1X%1X%1X',
                        \round($this->r / 0x11),
                        \round($this->g / 0x11),
                        \round($this->b / 0x11),
                        \round($this->a * 0xF)
                    );
                }

                return false;

            case self::COLOR_HEX_8:
                return \sprintf('#%02X%02X%02X%02X', $this->r, $this->g, $this->b, \round($this->a * 0xFF));
        }

        return false;
    }

    public function hasAlpha($variant = null)
    {
        if (null === $variant) {
            $variant = $this->variant;
        }

        switch ($variant) {
            case self::COLOR_NAME:
            case self::COLOR_RGB:
            case self::COLOR_HSL:
                return \abs($this->a - 1) >= 0.0001;
            case self::COLOR_RGBA:
            case self::COLOR_HSLA:
            case self::COLOR_HEX_4:
            case self::COLOR_HEX_8:
                return true;
            default:
                return false;
        }
    }

    protected function setValues($value)
    {
        $value = \strtolower(\trim($value));
        // Find out which variant of color input it is
        if (isset(self::$color_map[$value])) {
            if (!$this->setValuesFromHex(self::$color_map[$value])) {
                return;
            }

            $variant = self::COLOR_NAME;
        } elseif ('#' === $value[0]) {
            $variant = $this->setValuesFromHex(\substr($value, 1));

            if (!$variant) {
                return;
            }
        } else {
            $variant = $this->setValuesFromFunction($value);

            if (!$variant) {
                return;
            }
        }

        // If something has gone horribly wrong
        if ($this->r > 0xFF || $this->g > 0xFF || $this->b > 0xFF || $this->a > 1) {
            $this->variant = null; // @codeCoverageIgnore
        } else {
            $this->variant = $variant;
            $this->r = (int) $this->r;
            $this->g = (int) $this->g;
            $this->b = (int) $this->b;
            $this->a = (float) $this->a;
        }
    }

    protected function setValuesFromHex($hex)
    {
        if (!\ctype_xdigit($hex)) {
            return null;
        }

        switch (\strlen($hex)) {
            case 3:
                $variant = self::COLOR_HEX_3;
                break;
            case 6:
                $variant = self::COLOR_HEX_6;
                break;
            case 4:
                $variant = self::COLOR_HEX_4;
                break;
            case 8:
                $variant = self::COLOR_HEX_8;
                break;
            default:
                return null;
        }

        switch ($variant) {
            case self::COLOR_HEX_4:
                $this->a = \hexdec($hex[3]) / 0xF;
                // no break
            case self::COLOR_HEX_3:
                $this->r = \hexdec($hex[0]) * 0x11;
                $this->g = \hexdec($hex[1]) * 0x11;
                $this->b = \hexdec($hex[2]) * 0x11;
                break;
            case self::COLOR_HEX_8:
                $this->a = \hexdec(\substr($hex, 6, 2)) / 0xFF;
                // no break
            case self::COLOR_HEX_6:
                $hex = \str_split($hex, 2);
                $this->r = \hexdec($hex[0]);
                $this->g = \hexdec($hex[1]);
                $this->b = \hexdec($hex[2]);
                break;
        }

        return $variant;
    }

    protected function setValuesFromFunction($value)
    {
        if (!\preg_match('/^((?:rgb|hsl)a?)\\s*\\(([0-9\\.%,\\s\\/\\-]+)\\)$/i', $value, $match)) {
            return null;
        }

        switch (\strtolower($match[1])) {
            case 'rgb':
                $variant = self::COLOR_RGB;
                break;
            case 'rgba':
                $variant = self::COLOR_RGBA;
                break;
            case 'hsl':
                $variant = self::COLOR_HSL;
                break;
            case 'hsla':
                $variant = self::COLOR_HSLA;
                break;
            default:
                return null; // @codeCoverageIgnore
        }

        $params = \preg_replace('/[,\\s\\/]+/', ',', \trim($match[2]));
        $params = \explode(',', $params);
        $params = \array_map('trim', $params);

        if (\count($params) < 3 || \count($params) > 4) {
            return null;
        }

        foreach ($params as $i => &$color) {
            if (false !== \strpos($color, '%')) {
                $color = (float) \str_replace('%', '', $color);

                if (3 === $i) {
                    $color = $color / 100;
                } elseif (\in_array($variant, [self::COLOR_RGB, self::COLOR_RGBA], true)) {
                    $color = \round($color / 100 * 0xFF);
                }
            }

            $color = (float) $color;

            if (0 === $i && \in_array($variant, [self::COLOR_HSL, self::COLOR_HSLA], true)) {
                $color = ($color % 360 + 360) % 360;
            }
        }

        /** @var non-empty-array<array-key, float> $params Psalm bug workaround */
        switch ($variant) {
            case self::COLOR_RGBA:
            case self::COLOR_RGB:
                if (\min($params) < 0 || \max($params) > 0xFF) {
                    return null;
                }
                break;
            case self::COLOR_HSLA:
            case self::COLOR_HSL:
                if (\min($params) < 0 || $params[0] > 360 || \max($params[1], $params[2]) > 100) {
                    return null;
                }
                break;
        }

        if (4 === \count($params)) {
            if ($params[3] > 1) {
                return null;
            }

            $this->a = $params[3];
        }

        if (self::COLOR_HSLA === $variant || self::COLOR_HSL === $variant) {
            $params = self::hslToRgb($params[0], $params[1], $params[2]);
        }

        list($this->r, $this->g, $this->b) = $params;

        return $variant;
    }

    /**
     * Turns HSL color to RGB. Black magic.
     *
     * @param float $h Hue
     * @param float $s Saturation
     * @param float $l Lightness
     *
     * @return int[] RGB array
     */
    public static function hslToRgb($h, $s, $l)
    {
        if (\min($h, $s, $l) < 0) {
            throw new InvalidArgumentException('The parameters for hslToRgb should be no less than 0');
        }

        if ($h > 360 || \max($s, $l) > 100) {
            throw new InvalidArgumentException('The parameters for hslToRgb should be no more than 360, 100, and 100 respectively');
        }

        $h /= 360;
        $s /= 100;
        $l /= 100;

        $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l * $s;
        $m1 = $l * 2 - $m2;

        return [
            (int) \round(self::hueToRgb($m1, $m2, $h + 1 / 3) * 0xFF),
            (int) \round(self::hueToRgb($m1, $m2, $h) * 0xFF),
            (int) \round(self::hueToRgb($m1, $m2, $h - 1 / 3) * 0xFF),
        ];
    }

    /**
     * Converts RGB to HSL. Color inversion of previous black magic is white magic?
     *
     * @param float|int $red   Red
     * @param float|int $green Green
     * @param float|int $blue  Blue
     *
     * @return float[] HSL array
     */
    public static function rgbToHsl($red, $green, $blue)
    {
        if (\min($red, $green, $blue) < 0) {
            throw new InvalidArgumentException('The parameters for rgbToHsl should be no less than 0');
        }

        if (\max($red, $green, $blue) > 0xFF) {
            throw new InvalidArgumentException('The parameters for rgbToHsl should be no more than 255');
        }

        $clrMin = \min($red, $green, $blue);
        $clrMax = \max($red, $green, $blue);
        $deltaMax = $clrMax - $clrMin;

        $L = ($clrMax + $clrMin) / 510;

        if (0 == $deltaMax) {
            $H = 0;
            $S = 0;
        } else {
            if (0.5 > $L) {
                $S = $deltaMax / ($clrMax + $clrMin);
            } else {
                $S = $deltaMax / (510 - $clrMax - $clrMin);
            }

            if ($clrMax === $red) {
                $H = ($green - $blue) / (6.0 * $deltaMax);

                if (0 > $H) {
                    $H += 1.0;
                }
            } elseif ($clrMax === $green) {
                $H = 1 / 3 + ($blue - $red) / (6.0 * $deltaMax);
            } else {
                $H = 2 / 3 + ($red - $green) / (6.0 * $deltaMax);
            }
        }

        return [
            (float) ($H * 360 % 360),
            (float) ($S * 100),
            (float) ($L * 100),
        ];
    }

    /**
     * Helper function for hslToRgb. Even blacker magic.
     *
     * @param float $m1
     * @param float $m2
     * @param float $hue
     *
     * @return float Color value
     */
    private static function hueToRgb($m1, $m2, $hue)
    {
        $hue = ($hue < 0) ? $hue + 1 : (($hue > 1) ? $hue - 1 : $hue);
        if ($hue * 6 < 1) {
            return $m1 + ($m2 - $m1) * $hue * 6;
        }
        if ($hue * 2 < 1) {
            return $m2;
        }
        if ($hue * 3 < 2) {
            return $m1 + ($m2 - $m1) * (2 / 3 - $hue) * 6;
        }

        return $m1;
    }
}
PKW�1\�@ހ,
,
Hvendor/kint-php/kint/src/Zval/Representation/DocstringRepresentation.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval\Representation;

class DocstringRepresentation extends Representation
{
    public $file;
    public $line;
    public $class;
    public $hints = ['docstring'];

    public function __construct($docstring, $file, $line, $class = null)
    {
        parent::__construct('Docstring');

        $this->file = $file;
        $this->line = $line;
        $this->class = $class;
        $this->contents = $docstring;
    }

    /**
     * Returns the representation's docstring without surrounding comments.
     *
     * Note that this will not work flawlessly.
     *
     * On comments with whitespace after the stars the lines will begin with
     * whitespace, since we can't accurately guess how much of an indentation
     * is required.
     *
     * And on lines without stars on the left this may eat bullet points.
     *
     * Long story short: If you want the docstring read the contents. If you
     * absolutely must have it without comments (ie renderValueShort) this will
     * probably do.
     *
     * @return null|string Docstring with comments stripped
     */
    public function getDocstringWithoutComments()
    {
        if (!$this->contents) {
            return null;
        }

        $string = \substr($this->contents, 3, -2);
        $string = \preg_replace('/^\\s*\\*\\s*?(\\S|$)/m', '\\1', $string);

        return \trim($string);
    }
}
PKW�1\��~�S
S
Evendor/kint-php/kint/src/Zval/Representation/SourceRepresentation.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval\Representation;

class SourceRepresentation extends Representation
{
    public $hints = ['source'];
    public $source = [];
    public $filename;
    public $line = 0;
    public $showfilename = false;

    public function __construct($filename, $line, $padding = 7)
    {
        parent::__construct('Source');

        $this->filename = $filename;
        $this->line = $line;

        $start_line = \max($line - $padding, 1);
        $length = $line + $padding + 1 - $start_line;
        $this->source = self::getSource($filename, $start_line, $length);
        if (null !== $this->source) {
            $this->contents = \implode("\n", $this->source);
        }
    }

    /**
     * Gets section of source code.
     *
     * @param string   $filename   Full path to file
     * @param int      $start_line The first line to display (1 based)
     * @param null|int $length     Amount of lines to show
     *
     * @return null|array
     */
    public static function getSource($filename, $start_line = 1, $length = null)
    {
        if (!$filename || !\file_exists($filename) || !\is_readable($filename)) {
            return null;
        }

        $source = \preg_split("/\r\n|\n|\r/", \file_get_contents($filename));
        $source = \array_combine(\range(1, \count($source)), $source);
        $source = \array_slice($source, $start_line - 1, $length, true);

        return $source;
    }
}
PKW�1\��`/vendor/kint-php/kint/src/Zval/ResourceValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

class ResourceValue extends Value
{
    public $resource_type;

    public function getType()
    {
        if ($this->resource_type) {
            return $this->resource_type.' resource';
        }

        return 'resource';
    }

    public function transplant(Value $old)
    {
        parent::transplant($old);

        if ($old instanceof self) {
            $this->resource_type = $old->resource_type;
        }
    }
}
PKW�1\�2S

1vendor/kint-php/kint/src/Zval/TraceFrameValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

use InvalidArgumentException;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Representation\SourceRepresentation;
use ReflectionFunction;
use ReflectionMethod;

class TraceFrameValue extends Value
{
    public $trace;
    public $hints = ['trace_frame'];

    public function __construct(Value $base, array $raw_frame)
    {
        parent::__construct();

        $this->transplant($base);

        if (!isset($this->value)) {
            throw new InvalidArgumentException('Tried to create TraceFrameValue from Value with no value representation');
        }

        $this->trace = [
            'function' => $raw_frame['function'],
            'line' => isset($raw_frame['line']) ? $raw_frame['line'] : null,
            'file' => isset($raw_frame['file']) ? $raw_frame['file'] : null,
            'class' => isset($raw_frame['class']) ? $raw_frame['class'] : null,
            'type' => isset($raw_frame['type']) ? $raw_frame['type'] : null,
            'object' => null,
            'args' => null,
        ];

        if ($this->trace['class'] && \method_exists($this->trace['class'], $this->trace['function'])) {
            $func = new ReflectionMethod($this->trace['class'], $this->trace['function']);
            $this->trace['function'] = new MethodValue($func);
        } elseif (!$this->trace['class'] && \function_exists($this->trace['function'])) {
            $func = new ReflectionFunction($this->trace['function']);
            $this->trace['function'] = new MethodValue($func);
        }

        foreach ($this->value->contents as $frame_prop) {
            if ('object' === $frame_prop->name) {
                $this->trace['object'] = $frame_prop;
                $this->trace['object']->name = null;
                $this->trace['object']->operator = Value::OPERATOR_NONE;
            }
            if ('args' === $frame_prop->name) {
                $this->trace['args'] = $frame_prop->value->contents;

                if ($this->trace['function'] instanceof MethodValue) {
                    foreach (\array_values($this->trace['function']->parameters) as $param) {
                        if (isset($this->trace['args'][$param->position])) {
                            $this->trace['args'][$param->position]->name = $param->getName();
                        }
                    }
                }
            }
        }

        $this->clearRepresentations();

        if (isset($this->trace['file'], $this->trace['line']) && \is_readable($this->trace['file'])) {
            $this->addRepresentation(new SourceRepresentation($this->trace['file'], $this->trace['line']));
        }

        if ($this->trace['args']) {
            $args = new Representation('Arguments');
            $args->contents = $this->trace['args'];
            $this->addRepresentation($args);
        }

        if ($this->trace['object']) {
            $callee = new Representation('object');
            $callee->label = 'Callee object ['.$this->trace['object']->classname.']';
            $callee->contents[] = $this->trace['object'];
            $this->addRepresentation($callee);
        }
    }
}
PKW�1\;�b�DD.vendor/kint-php/kint/src/Zval/ClosureValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

class ClosureValue extends InstanceValue
{
    public $parameters = [];
    public $hints = ['object', 'callable', 'closure'];

    private $paramcache;

    public function getAccessPath()
    {
        if (null !== $this->access_path) {
            return parent::getAccessPath().'('.$this->getParams().')';
        }
    }

    public function getSize()
    {
    }

    public function getParams()
    {
        if (null !== $this->paramcache) {
            return $this->paramcache;
        }

        $out = [];

        foreach ($this->parameters as $p) {
            $type = $p->getType();

            $ref = $p->reference ? '&' : '';

            if ($type) {
                $out[] = $type.' '.$ref.$p->getName();
            } else {
                $out[] = $ref.$p->getName();
            }
        }

        return $this->paramcache = \implode(', ', $out);
    }
}
PKW�1\4��[��0vendor/kint-php/kint/src/Zval/ParameterValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

use Kint\Utils;
use ReflectionException;
use ReflectionParameter;

class ParameterValue extends Value
{
    public $type_hint;
    public $default;
    public $position;
    public $hints = ['parameter'];

    public function __construct(ReflectionParameter $param)
    {
        parent::__construct();

        if (KINT_PHP70) {
            if ($type = $param->getType()) {
                $this->type_hint = Utils::getTypeString($type);
            }
        } else {
            if ($param->isArray()) {
                $this->type_hint = 'array';
            } else {
                try {
                    if ($this->type_hint = $param->getClass()) {
                        $this->type_hint = $this->type_hint->name;
                    }
                } catch (ReflectionException $e) {
                    \preg_match('/\\[\\s\\<\\w+?>\\s([\\w]+)/s', $param->__toString(), $matches);
                    $this->type_hint = isset($matches[1]) ? $matches[1] : '';
                }
            }
        }

        $this->reference = $param->isPassedByReference();
        $this->name = $param->getName();
        $this->position = $param->getPosition();

        if ($param->isDefaultValueAvailable()) {
            $default = $param->getDefaultValue();
            switch (\gettype($default)) {
                case 'NULL':
                    $this->default = 'null';
                    break;
                case 'boolean':
                    $this->default = $default ? 'true' : 'false';
                    break;
                case 'array':
                    $this->default = \count($default) ? 'array(...)' : 'array()';
                    break;
                default:
                    $this->default = \var_export($default, true);
                    break;
            }
        }
    }

    public function getType()
    {
        return $this->type_hint;
    }

    public function getName()
    {
        return '$'.$this->name;
    }

    public function getDefault()
    {
        return $this->default;
    }
}
PKW�1\�Y��yy+vendor/kint-php/kint/src/Zval/BlobValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

class BlobValue extends Value
{
    /**
     * @var array Character encodings to detect
     *
     * @see https://secure.php.net/function.mb-detect-order
     *
     * In practice, mb_detect_encoding can only successfully determine the
     * difference between the following common charsets at once without
     * breaking things for one of the other charsets:
     * - ASCII
     * - UTF-8
     * - SJIS
     * - EUC-JP
     *
     * The order of the charsets is significant. If you put UTF-8 before ASCII
     * it will never match ASCII, because UTF-8 is a superset of ASCII.
     * Similarly, SJIS and EUC-JP frequently match UTF-8 strings, so you should
     * check UTF-8 first. SJIS and EUC-JP seem to work either way, but SJIS is
     * more common so it should probably be first.
     *
     * While you're free to experiment with other charsets, remember to keep
     * this behavior in mind when setting up your char_encodings array.
     *
     * This depends on the mbstring extension
     */
    public static $char_encodings = [
        'ASCII',
        'UTF-8',
    ];

    /**
     * @var array Legacy character encodings to detect
     *
     * @see https://secure.php.net/function.iconv
     *
     * Assuming the other encoding checks fail, this will perform a
     * simple iconv conversion to check for invalid bytes. If any are
     * found it will not match.
     *
     * This can be useful for ambiguous single byte encodings like
     * windows-125x and iso-8859-x which have practically undetectable
     * differences because they use every single byte available.
     *
     * This is *NOT* reliable and should not be trusted implicitly. As
     * with char_encodings, the order of the charsets is significant.
     *
     * This depends on the iconv extension
     */
    public static $legacy_encodings = [];

    public $type = 'string';
    public $encoding = false;
    public $hints = ['string'];

    public function getType()
    {
        if (false === $this->encoding) {
            return 'binary '.$this->type;
        }

        if ('ASCII' === $this->encoding) {
            return $this->type;
        }

        return $this->encoding.' '.$this->type;
    }

    public function getValueShort()
    {
        if ($rep = $this->value) {
            return '"'.$rep->contents.'"';
        }
    }

    public function transplant(Value $old)
    {
        parent::transplant($old);

        if ($old instanceof self) {
            $this->encoding = $old->encoding;
        }
    }

    public static function strlen($string, $encoding = false)
    {
        if (\function_exists('mb_strlen')) {
            if (false === $encoding) {
                $encoding = self::detectEncoding($string);
            }

            if ($encoding && 'ASCII' !== $encoding) {
                return \mb_strlen($string, $encoding);
            }
        }

        return \strlen($string);
    }

    public static function substr($string, $start, $length = null, $encoding = false)
    {
        if (\function_exists('mb_substr')) {
            if (false === $encoding) {
                $encoding = self::detectEncoding($string);
            }

            if ($encoding && 'ASCII' !== $encoding) {
                return \mb_substr($string, $start, $length, $encoding);
            }
        }

        // Special case for substr/mb_substr discrepancy
        if ('' === $string) {
            return '';
        }

        return \substr($string, $start, isset($length) ? $length : PHP_INT_MAX);
    }

    public static function detectEncoding($string)
    {
        if (\function_exists('mb_detect_encoding')) {
            if ($ret = \mb_detect_encoding($string, self::$char_encodings, true)) {
                return $ret;
            }
        }

        // Pretty much every character encoding uses first 32 bytes as control
        // characters. If it's not a multi-byte format it's safe to say matching
        // any control character besides tab, nl, and cr means it's binary.
        if (\preg_match('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/', $string)) {
            return false;
        }

        if (\function_exists('iconv')) {
            foreach (self::$legacy_encodings as $encoding) {
                if (@\iconv($encoding, $encoding, $string) === $string) {
                    return $encoding;
                }
            }
        } elseif (!\function_exists('mb_detect_encoding')) { // @codeCoverageIgnore
            // If a user has neither mb_detect_encoding, nor iconv, nor the
            // polyfills, there's not much we can do about it...
            // Pretend it's ASCII and pray the browser renders it properly.
            return 'ASCII'; // @codeCoverageIgnore
        }

        return false;
    }
}
PKW�1\+�ln��.vendor/kint-php/kint/src/Zval/ElidedValues.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

class ElidedValues extends Value
{
    public $description = null;
    public $hints = ['elide'];

    /**
     * @param int                  $size
     * @param null|string|string[] $description
     */
    public function __construct($size, $description)
    {
        $this->description = $description;
        $this->size = $size;
        $this->value = null;
    }

    public function getAccessPath()
    {
        return null;
    }
}
PKW�1\V/�/aa0vendor/kint-php/kint/src/Zval/ThrowableValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

use Exception;
use InvalidArgumentException;
use Throwable;

class ThrowableValue extends InstanceValue
{
    public $message;
    public $hints = ['object', 'throwable'];

    public function __construct($throw)
    {
        if (!$throw instanceof Exception && (!KINT_PHP70 || !$throw instanceof Throwable)) {
            throw new InvalidArgumentException('ThrowableValue must be constructed with a Throwable');
        }

        parent::__construct();

        $this->message = $throw->getMessage();
    }

    public function getValueShort()
    {
        if (\strlen($this->message)) {
            return '"'.$this->message.'"';
        }
    }
}
PKW�1\)]�]99-vendor/kint-php/kint/src/Zval/MethodValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

use Kint\Utils;
use Kint\Zval\Representation\DocstringRepresentation;
use ReflectionFunctionAbstract;
use ReflectionMethod;

class MethodValue extends Value
{
    public $type = 'method';
    public $filename;
    public $startline;
    public $endline;
    public $parameters = [];
    public $abstract;
    public $final;
    public $internal;
    public $docstring;
    public $returntype;
    public $return_reference = false;
    public $hints = ['callable', 'method'];
    public $showparams = true;

    private $paramcache;

    public function __construct(ReflectionFunctionAbstract $method)
    {
        parent::__construct();

        $this->name = $method->getName();
        $this->filename = $method->getFileName();
        $this->startline = $method->getStartLine();
        $this->endline = $method->getEndLine();
        $this->internal = $method->isInternal();
        $this->docstring = $method->getDocComment();
        $this->return_reference = $method->returnsReference();

        foreach ($method->getParameters() as $param) {
            $this->parameters[] = new ParameterValue($param);
        }

        if (KINT_PHP70) {
            $this->returntype = $method->getReturnType();
            if ($this->returntype) {
                $this->returntype = Utils::getTypeString($this->returntype);
            }
        }

        if ($method instanceof ReflectionMethod) {
            $this->static = $method->isStatic();
            $this->operator = $this->static ? Value::OPERATOR_STATIC : Value::OPERATOR_OBJECT;
            $this->abstract = $method->isAbstract();
            $this->final = $method->isFinal();
            $this->owner_class = $method->getDeclaringClass()->name;
            $this->access = Value::ACCESS_PUBLIC;
            if ($method->isProtected()) {
                $this->access = Value::ACCESS_PROTECTED;
            } elseif ($method->isPrivate()) {
                $this->access = Value::ACCESS_PRIVATE;
            }
        }

        if ($this->internal) {
            return;
        }

        $docstring = new DocstringRepresentation(
            $this->docstring,
            $this->filename,
            $this->startline
        );

        $docstring->implicit_label = true;
        $this->addRepresentation($docstring);
        $this->value = $docstring;
    }

    public function setAccessPathFrom(InstanceValue $parent)
    {
        static $magic = [
            '__call' => true,
            '__callstatic' => true,
            '__clone' => true,
            '__construct' => true,
            '__debuginfo' => true,
            '__destruct' => true,
            '__get' => true,
            '__invoke' => true,
            '__isset' => true,
            '__set' => true,
            '__set_state' => true,
            '__sleep' => true,
            '__tostring' => true,
            '__unset' => true,
            '__wakeup' => true,
        ];

        $name = \strtolower($this->name);

        if ('__construct' === $name) {
            $this->access_path = 'new \\'.$parent->getType();
        } elseif ('__invoke' === $name) {
            $this->access_path = $parent->access_path;
        } elseif ('__clone' === $name) {
            $this->access_path = 'clone '.$parent->access_path;
            $this->showparams = false;
        } elseif ('__tostring' === $name) {
            $this->access_path = '(string) '.$parent->access_path;
            $this->showparams = false;
        } elseif (isset($magic[$name])) {
            $this->access_path = null;
        } elseif ($this->static) {
            $this->access_path = '\\'.$this->owner_class.'::'.$this->name;
        } else {
            $this->access_path = $parent->access_path.'->'.$this->name;
        }
    }

    public function getValueShort()
    {
        if (!$this->value || !($this->value instanceof DocstringRepresentation)) {
            return parent::getValueShort();
        }

        $ds = $this->value->getDocstringWithoutComments();

        if (!$ds) {
            return null;
        }

        $ds = \explode("\n", $ds);

        $out = '';

        foreach ($ds as $line) {
            if (0 === \strlen(\trim($line)) || '@' === $line[0]) {
                break;
            }

            $out .= $line.' ';
        }

        if (\strlen($out)) {
            return \rtrim($out);
        }
    }

    public function getModifiers()
    {
        $mods = [
            $this->abstract ? 'abstract' : null,
            $this->final ? 'final' : null,
            $this->getAccess(),
            $this->static ? 'static' : null,
        ];

        $out = '';

        foreach ($mods as $word) {
            if (null !== $word) {
                $out .= $word.' ';
            }
        }

        if (\strlen($out)) {
            return \rtrim($out);
        }
    }

    public function getAccessPath()
    {
        if (null !== $this->access_path) {
            if ($this->showparams) {
                return parent::getAccessPath().'('.$this->getParams().')';
            }

            return parent::getAccessPath();
        }
    }

    public function getParams()
    {
        if (null !== $this->paramcache) {
            return $this->paramcache;
        }

        $out = [];

        foreach ($this->parameters as $p) {
            $type = $p->getType();
            if ($type) {
                $type .= ' ';
            }

            $default = $p->getDefault();
            if ($default) {
                $default = ' = '.$default;
            }

            $ref = $p->reference ? '&' : '';

            $out[] = $type.$ref.$p->getName().$default;
        }

        return $this->paramcache = \implode(', ', $out);
    }

    public function getPhpDocUrl()
    {
        if (!$this->internal) {
            return null;
        }

        if ($this->owner_class) {
            $class = \strtolower($this->owner_class);
        } else {
            $class = 'function';
        }

        $funcname = \str_replace('_', '-', \strtolower($this->name));

        if (0 === \strpos($funcname, '--') && 0 !== \strpos($funcname, '-', 2)) {
            $funcname = \substr($funcname, 2);
        }

        return 'https://secure.php.net/'.$class.'.'.$funcname;
    }
}
PKW�1\�uV���,vendor/kint-php/kint/src/Zval/TraceValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

class TraceValue extends Value
{
    public $hints = ['trace'];

    public function getType()
    {
        return 'Debug Backtrace';
    }

    public function getSize()
    {
        if (!$this->size) {
            return 'empty';
        }

        return parent::getSize();
    }
}
PKW�1\������-vendor/kint-php/kint/src/Zval/StreamValue.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Zval;

use Kint\Kint;

class StreamValue extends ResourceValue
{
    public $stream_meta;

    public function __construct(array $meta = null)
    {
        parent::__construct();
        $this->stream_meta = $meta;
    }

    public function getValueShort()
    {
        if (empty($this->stream_meta['uri'])) {
            return;
        }

        $uri = $this->stream_meta['uri'];

        if (\stream_is_local($uri)) {
            return Kint::shortenPath($uri);
        }

        return $uri;
    }
}
PKW�1\>�Wx x "vendor/kint-php/kint/src/Utils.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint;

use InvalidArgumentException;
use Kint\Zval\BlobValue;
use ReflectionNamedType;
use ReflectionType;

/**
 * A collection of utility methods. Should all be static methods with no dependencies.
 */
final class Utils
{
    /**
     * @codeCoverageIgnore
     */
    private function __construct()
    {
    }

    /**
     * Turns a byte value into a human-readable representation.
     *
     * @param int $value Amount of bytes
     *
     * @return array Human readable value and unit
     */
    public static function getHumanReadableBytes($value)
    {
        static $unit = ['B', 'KB', 'MB', 'GB', 'TB'];

        $negative = $value < 0;
        $value = \abs($value);

        if ($value < 1024) {
            $i = 0;
            $value = \floor($value);
        } elseif ($value < 0xfffcccccccccccc >> 40) {
            $i = 1;
        } elseif ($value < 0xfffcccccccccccc >> 30) {
            $i = 2;
        } elseif ($value < 0xfffcccccccccccc >> 20) {
            $i = 3;
        } else {
            $i = 4;
        }

        if ($i) {
            $value = $value / \pow(1024, $i);
        }

        if ($negative) {
            $value *= -1;
        }

        return [
            'value' => \round($value, 1),
            'unit' => $unit[$i],
        ];
    }

    public static function isSequential(array $array)
    {
        return \array_keys($array) === \range(0, \count($array) - 1);
    }

    public static function isAssoc(array $array)
    {
        return (bool) \count(\array_filter(\array_keys($array), 'is_string'));
    }

    public static function composerGetExtras($key = 'kint')
    {
        $extras = [];

        if (0 === \strpos(KINT_DIR, 'phar://')) {
            // Only run inside phar file, so skip for code coverage
            return $extras; // @codeCoverageIgnore
        }

        $folder = KINT_DIR.'/vendor';

        for ($i = 0; $i < 4; ++$i) {
            $installed = $folder.'/composer/installed.json';

            if (\file_exists($installed) && \is_readable($installed)) {
                $packages = \json_decode(\file_get_contents($installed), true);

                foreach ($packages as $package) {
                    if (isset($package['extra'][$key]) && \is_array($package['extra'][$key])) {
                        $extras = \array_replace($extras, $package['extra'][$key]);
                    }
                }

                $folder = \dirname($folder);

                if (\file_exists($folder.'/composer.json') && \is_readable($folder.'/composer.json')) {
                    $composer = \json_decode(\file_get_contents($folder.'/composer.json'), true);

                    if (isset($composer['extra'][$key]) && \is_array($composer['extra'][$key])) {
                        $extras = \array_replace($extras, $composer['extra'][$key]);
                    }
                }

                break;
            }

            $folder = \dirname($folder);
        }

        return $extras;
    }

    /**
     * @codeCoverageIgnore
     */
    public static function composerSkipFlags()
    {
        $extras = self::composerGetExtras();

        if (!empty($extras['disable-facade']) && !\defined('KINT_SKIP_FACADE')) {
            \define('KINT_SKIP_FACADE', true);
        }

        if (!empty($extras['disable-helpers']) && !\defined('KINT_SKIP_HELPERS')) {
            \define('KINT_SKIP_HELPERS', true);
        }
    }

    public static function isTrace(array $trace)
    {
        if (!self::isSequential($trace)) {
            return false;
        }

        static $bt_structure = [
            'function' => 'string',
            'line' => 'integer',
            'file' => 'string',
            'class' => 'string',
            'object' => 'object',
            'type' => 'string',
            'args' => 'array',
        ];

        $file_found = false;

        foreach ($trace as $frame) {
            if (!\is_array($frame) || !isset($frame['function'])) {
                return false;
            }

            foreach ($frame as $key => $val) {
                if (!isset($bt_structure[$key])) {
                    return false;
                }

                if (\gettype($val) !== $bt_structure[$key]) {
                    return false;
                }

                if ('file' === $key) {
                    $file_found = true;
                }
            }
        }

        return $file_found;
    }

    public static function traceFrameIsListed(array $frame, array $matches)
    {
        if (isset($frame['class'])) {
            $called = [\strtolower($frame['class']), \strtolower($frame['function'])];
        } else {
            $called = \strtolower($frame['function']);
        }

        return \in_array($called, $matches, true);
    }

    public static function normalizeAliases(array &$aliases)
    {
        static $name_regex = '[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*';

        foreach ($aliases as $index => &$alias) {
            if (\is_array($alias) && 2 === \count($alias)) {
                $alias = \array_values(\array_filter($alias, 'is_string'));

                if (2 === \count($alias) &&
                    \preg_match('/^'.$name_regex.'$/', $alias[1]) &&
                    \preg_match('/^\\\\?('.$name_regex.'\\\\)*'.$name_regex.'$/', $alias[0])
                ) {
                    $alias = [
                        \strtolower(\ltrim($alias[0], '\\')),
                        \strtolower($alias[1]),
                    ];
                } else {
                    unset($aliases[$index]);
                    continue;
                }
            } elseif (\is_string($alias)) {
                if (\preg_match('/^\\\\?('.$name_regex.'\\\\)*'.$name_regex.'$/', $alias)) {
                    $alias = \explode('\\', \strtolower($alias));
                    $alias = \end($alias);
                } else {
                    unset($aliases[$index]);
                    continue;
                }
            } else {
                unset($aliases[$index]);
            }
        }

        $aliases = \array_values($aliases);
    }

    public static function truncateString($input, $length = PHP_INT_MAX, $end = '...', $encoding = false)
    {
        $length = (int) $length;
        $endlength = BlobValue::strlen($end);

        if ($endlength >= $length) {
            throw new InvalidArgumentException('Can\'t truncate a string to '.$length.' characters if ending with string '.$endlength.' characters long');
        }

        if (BlobValue::strlen($input, $encoding) > $length) {
            return BlobValue::substr($input, 0, $length - $endlength, $encoding).$end;
        }

        return $input;
    }

    public static function getTypeString(ReflectionType $type)
    {
        if ($type instanceof ReflectionNamedType) {
            $name = $type->getName();
            if ($type->allowsNull() && false === \strpos($name, '|')) {
                $name = '?'.$name;
            }

            return $name;
        }

        return (string) $type; // @codeCoverageIgnore
    }
}
PKW�1\7�
��/vendor/kint-php/kint/src/Parser/ProxyPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use InvalidArgumentException;
use Kint\Zval\Value;

class ProxyPlugin extends Plugin
{
    protected $types;
    protected $triggers;
    protected $callback;

    public function __construct(array $types, $triggers, $callback)
    {
        if (!\is_int($triggers)) {
            throw new InvalidArgumentException('ProxyPlugin triggers must be an int bitmask');
        }

        if (!\is_callable($callback)) {
            throw new InvalidArgumentException('ProxyPlugin callback must be callable');
        }

        $this->types = $types;
        $this->triggers = $triggers;
        $this->callback = $callback;
    }

    public function getTypes()
    {
        return $this->types;
    }

    public function getTriggers()
    {
        return $this->triggers;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        return \call_user_func_array($this->callback, [&$var, &$o, $trigger, $this->parser]);
    }
}
PKW�1\Ӂ���6vendor/kint-php/kint/src/Parser/ClassStaticsPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\InstanceValue;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;
use ReflectionClass;
use ReflectionProperty;

class ClassStaticsPlugin extends Plugin
{
    private static $cache = [];

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        $class = \get_class($var);
        $reflection = new ReflectionClass($class);

        // Constants
        // TODO: PHP 7.1 allows private consts but reflection doesn't have a way to check them yet
        if (!isset(self::$cache[$class])) {
            $consts = [];

            foreach ($reflection->getConstants() as $name => $val) {
                $const = Value::blank($name, '\\'.$class.'::'.$name);
                $const->const = true;
                $const->depth = $o->depth + 1;
                $const->owner_class = $class;
                $const->operator = Value::OPERATOR_STATIC;
                $const = $this->parser->parse($val, $const);

                $consts[] = $const;
            }

            self::$cache[$class] = $consts;
        }

        $statics = new Representation('Static class properties', 'statics');
        $statics->contents = self::$cache[$class];

        foreach ($reflection->getProperties(ReflectionProperty::IS_STATIC) as $static) {
            $prop = new Value();
            $prop->name = '$'.$static->getName();
            $prop->depth = $o->depth + 1;
            $prop->static = true;
            $prop->operator = Value::OPERATOR_STATIC;
            $prop->owner_class = $static->getDeclaringClass()->name;

            $prop->access = Value::ACCESS_PUBLIC;
            if ($static->isProtected()) {
                $prop->access = Value::ACCESS_PROTECTED;
            } elseif ($static->isPrivate()) {
                $prop->access = Value::ACCESS_PRIVATE;
            }

            if ($this->parser->childHasPath($o, $prop)) {
                $prop->access_path = '\\'.$prop->owner_class.'::'.$prop->name;
            }

            if (KINT_PHP74 && !$static->isInitialized()) {
                $prop->type = 'uninitialized';
                $statics->contents[] = $prop;
            } else {
                $static->setAccessible(true);
                $static = $static->getValue();
                $statics->contents[] = $this->parser->parse($static, $prop);
            }
        }

        if (empty($statics->contents)) {
            return;
        }

        \usort($statics->contents, ['Kint\\Parser\\ClassStaticsPlugin', 'sort']);

        $o->addRepresentation($statics);
    }

    private static function sort(Value $a, Value $b)
    {
        $sort = ((int) $a->const) - ((int) $b->const);
        if ($sort) {
            return $sort;
        }

        $sort = Value::sortByAccess($a, $b);
        if ($sort) {
            return $sort;
        }

        return InstanceValue::sortByHierarchy($a->owner_class, $b->owner_class);
    }
}
PKW�1\oTQ??5vendor/kint-php/kint/src/Parser/SplFileInfoPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\SplFileInfoRepresentation;
use Kint\Zval\Value;
use SplFileInfo;
use SplFileObject;

class SplFileInfoPlugin extends Plugin
{
    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_COMPLETE;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof SplFileInfo || $var instanceof SplFileObject) {
            return;
        }

        $r = new SplFileInfoRepresentation(clone $var);
        $o->addRepresentation($r, 0);
        $o->size = $r->getSize();
    }
}
PKW�1\%��E0vendor/kint-php/kint/src/Parser/MysqliPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Value;
use Mysqli;
use Throwable;

/**
 * Adds support for Mysqli object parsing.
 *
 * Due to the way mysqli is implemented in PHP, this will cause
 * warnings on certain Mysqli objects if screaming is enabled.
 */
class MysqliPlugin extends Plugin
{
    // These 'properties' are actually globals
    protected $always_readable = [
        'client_version' => true,
        'connect_errno' => true,
        'connect_error' => true,
    ];

    // These are readable on empty mysqli objects, but not on failed connections
    protected $empty_readable = [
        'client_info' => true,
        'errno' => true,
        'error' => true,
    ];

    // These are only readable on connected mysqli objects
    protected $connected_readable = [
        'affected_rows' => true,
        'error_list' => true,
        'field_count' => true,
        'host_info' => true,
        'info' => true,
        'insert_id' => true,
        'server_info' => true,
        'server_version' => true,
        'sqlstate' => true,
        'protocol_version' => true,
        'thread_id' => true,
        'warning_count' => true,
    ];

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_COMPLETE;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof Mysqli) {
            return;
        }

        try {
            $connected = \is_string(@$var->sqlstate);
        } catch (Throwable $t) { // @codeCoverageIgnore
            $connected = false; // @codeCoverageIgnore
        }

        try {
            $empty = !$connected && \is_string(@$var->client_info);
        } catch (Throwable $t) { // @codeCoverageIgnore
            $empty = false; // @codeCoverageIgnore
        }

        foreach ($o->value->contents as $key => $obj) {
            if (isset($this->connected_readable[$obj->name])) {
                if (!$connected) {
                    continue;
                }
            } elseif (isset($this->empty_readable[$obj->name])) {
                if (!$connected && !$empty) {
                    continue;
                }
            } elseif (!isset($this->always_readable[$obj->name])) {
                continue;
            }

            if ('null' !== $obj->type) {
                continue;
            }

            $param = $var->{$obj->name};

            if (null === $param) {
                continue;
            }

            $base = Value::blank($obj->name, $obj->access_path);

            $base->depth = $obj->depth;
            $base->owner_class = $obj->owner_class;
            $base->operator = $obj->operator;
            $base->access = $obj->access;
            $base->reference = $obj->reference;

            $o->value->contents[$key] = $this->parser->parse($param, $base);
        }
    }
}
PKW�1\ .��0vendor/kint-php/kint/src/Parser/BinaryPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\BlobValue;
use Kint\Zval\Value;

class BinaryPlugin extends Plugin
{
    public function getTypes()
    {
        return ['string'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$o instanceof BlobValue || !\in_array($o->encoding, ['ASCII', 'UTF-8'], true)) {
            $o->value->hints[] = 'binary';
        }
    }
}
PKW�1\!�E�
�
0vendor/kint-php/kint/src/Parser/Base64Plugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

class Base64Plugin extends Plugin
{
    /**
     * The minimum length before a string will be considered for base64 decoding.
     *
     * @var int
     */
    public static $min_length_hard = 16;

    /**
     * The minimum length before the base64 decoding will take precedence.
     *
     * @var int
     */
    public static $min_length_soft = 50;

    public function getTypes()
    {
        return ['string'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (\strlen($var) < self::$min_length_hard || \strlen($var) % 4) {
            return;
        }

        if (\preg_match('/^[A-Fa-f0-9]+$/', $var)) {
            return;
        }

        if (!\preg_match('/^[A-Za-z0-9+\\/=]+$/', $var)) {
            return;
        }

        $data = \base64_decode($var, true);

        if (false === $data) {
            return;
        }

        $base_obj = new Value();
        $base_obj->depth = $o->depth + 1;
        $base_obj->name = 'base64_decode('.$o->name.')';

        if ($o->access_path) {
            $base_obj->access_path = 'base64_decode('.$o->access_path.')';
        }

        $r = new Representation('Base64');
        $r->contents = $this->parser->parse($data, $base_obj);

        if (\strlen($var) > self::$min_length_soft) {
            $o->addRepresentation($r, 0);
        } else {
            $o->addRepresentation($r);
        }
    }
}
PKW�1\������3vendor/kint-php/kint/src/Parser/ThrowablePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Exception;
use Kint\Zval\Representation\SourceRepresentation;
use Kint\Zval\ThrowableValue;
use Kint\Zval\Value;
use Throwable;

class ThrowablePlugin extends Plugin
{
    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof Exception && (!KINT_PHP70 || !$var instanceof Throwable)) {
            return;
        }

        $throw = new ThrowableValue($var);
        $throw->transplant($o);
        $r = new SourceRepresentation($var->getFile(), $var->getLine());
        $r->showfilename = true;
        $throw->addRepresentation($r, 0);

        $o = $throw;
    }
}
PKW�1\7��]@@/vendor/kint-php/kint/src/Parser/TracePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Utils;
use Kint\Zval\TraceFrameValue;
use Kint\Zval\TraceValue;
use Kint\Zval\Value;

class TracePlugin extends Plugin
{
    public static $blacklist = ['spl_autoload_call'];

    public function getTypes()
    {
        return ['array'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$o->value) {
            return;
        }

        /** @var array[] $trace Psalm workaround */
        $trace = $this->parser->getCleanArray($var);

        if (\count($trace) !== \count($o->value->contents) || !Utils::isTrace($trace)) {
            return;
        }

        $traceobj = new TraceValue();
        $traceobj->transplant($o);
        $rep = $traceobj->value;

        $old_trace = $rep->contents;

        Utils::normalizeAliases(self::$blacklist);

        $rep->contents = [];

        foreach ($old_trace as $frame) {
            $index = $frame->name;

            if (!isset($trace[$index]['function'])) {
                // Something's very very wrong here, but it's probably a plugin's fault
                continue;
            }

            if (Utils::traceFrameIsListed($trace[$index], self::$blacklist)) {
                continue;
            }

            $rep->contents[$index] = new TraceFrameValue($frame, $trace[$index]);
        }

        \ksort($rep->contents);
        $rep->contents = \array_values($rep->contents);

        $traceobj->clearRepresentations();
        $traceobj->addRepresentation($rep);
        $traceobj->size = \count($rep->contents);
        $o = $traceobj;
    }
}
PKW�1\]9Q��4vendor/kint-php/kint/src/Parser/ArrayLimitPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use InvalidArgumentException;
use Kint\Utils;
use Kint\Zval\ElidedValues;
use Kint\Zval\Value;

class ArrayLimitPlugin extends Plugin
{
    /**
     * Maximum size of arrays before limiting.
     *
     * @var int
     */
    public static $trigger = 100;

    /**
     * Maximum amount of items to show in a limited array.
     *
     * @var int
     */
    public static $limit = 20;

    /**
     * Don't limit arrays with string keys.
     *
     * @var bool
     */
    public static $numeric_only = true;

    public function getTypes()
    {
        return ['array'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_BEGIN;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (self::$limit >= self::$trigger) {
            throw new InvalidArgumentException('ArrayLimitPlugin::$limit can not be lower than ArrayLimitPlugin::$trigger');
        }

        if (\count($var) < self::$trigger) {
            return;
        }

        if (self::$numeric_only && Utils::isAssoc($var)) {
            return;
        }

        $var2 = \array_slice($var, 0, self::$limit);

        $base = clone $o;

        $obj = $this->parser->parse($var2, $base);

        if (!$obj instanceof Value || 'array' != $obj->type) {
            return;
        }

        $sparekeys = \array_slice(\array_keys($var), self::$limit);
        $skip = new ElidedValues(\count($sparekeys), $sparekeys);
        $skip->depth = $obj->depth + 1;

        if (isset($obj->value->contents) && \is_array($obj->value->contents)) {
            $obj->value->contents[] = $skip;
        }

        $obj->size = \count($var);

        $o = $obj;
        $this->parser->haltParse();
    }
}
PKW�1\wSR�	�	0vendor/kint-php/kint/src/Parser/StreamPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\Representation;
use Kint\Zval\ResourceValue;
use Kint\Zval\StreamValue;
use Kint\Zval\Value;

class StreamPlugin extends Plugin
{
    public function getTypes()
    {
        return ['resource'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$o instanceof ResourceValue || 'stream' !== $o->resource_type) {
            return;
        }

        if (!$meta = \stream_get_meta_data($var)) {
            return;
        }

        $rep = new Representation('Stream');
        $rep->implicit_label = true;

        $base_obj = new Value();
        $base_obj->depth = $o->depth;

        if ($o->access_path) {
            $base_obj->access_path = 'stream_get_meta_data('.$o->access_path.')';
        }

        $rep->contents = $this->parser->parse($meta, $base_obj);

        if (!\in_array('depth_limit', $rep->contents->hints, true)) {
            $rep->contents = $rep->contents->value->contents;
        }

        $o->addRepresentation($rep, 0);
        $o->value = $rep;

        $stream = new StreamValue($meta);
        $stream->transplant($o);
        $o = $stream;
    }
}
PKW�1\��'�``3vendor/kint-php/kint/src/Parser/SerializePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

class SerializePlugin extends Plugin
{
    /**
     * Disables automatic unserialization on arrays and objects.
     *
     * As the PHP manual notes:
     *
     * > Unserialization can result in code being loaded and executed due to
     * > object instantiation and autoloading, and a malicious user may be able
     * > to exploit this.
     *
     * The natural way to stop that from happening is to just refuse to unserialize
     * stuff by default. Which is what we're doing for anything that's not scalar.
     *
     * @var bool
     */
    public static $safe_mode = true;
    public static $options = [true];

    public function getTypes()
    {
        return ['string'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        $trimmed = \rtrim($var);

        if ('N;' !== $trimmed && !\preg_match('/^(?:[COabis]:\\d+[:;]|d:\\d+(?:\\.\\d+);)/', $trimmed)) {
            return;
        }

        if (!self::$safe_mode || !\in_array($trimmed[0], ['C', 'O', 'a'], true)) {
            // Second parameter only supported on PHP 7
            if (KINT_PHP70) {
                // Suppress warnings on unserializeable variable
                $data = @\unserialize($trimmed, self::$options);
            } else {
                $data = @\unserialize($trimmed);
            }

            if (false === $data && 'b:0;' !== \substr($trimmed, 0, 4)) {
                return;
            }
        }

        $base_obj = new Value();
        $base_obj->depth = $o->depth + 1;
        $base_obj->name = 'unserialize('.$o->name.')';

        if ($o->access_path) {
            $base_obj->access_path = 'unserialize('.$o->access_path;
            if (!KINT_PHP70 || self::$options === [true]) {
                $base_obj->access_path .= ')';
            } elseif (self::$options === [false]) {
                $base_obj->access_path .= ', false)';
            } else {
                $base_obj->access_path .= ', Serialize::$options)';
            }
        }

        $r = new Representation('Serialized');

        if (isset($data)) {
            $r->contents = $this->parser->parse($data, $base_obj);
        } else {
            $base_obj->hints[] = 'blacklist';
            $r->contents = $base_obj;
        }

        $o->addRepresentation($r, 0);
    }
}
PKW�1\�.��r	r	3vendor/kint-php/kint/src/Parser/TimestampPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Value;

class TimestampPlugin extends Plugin
{
    public static $blacklist = [
        2147483648,
        2147483647,
        1073741824,
        1073741823,
    ];

    public function getTypes()
    {
        return ['string', 'integer'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (\is_string($var) && !\ctype_digit($var)) {
            return;
        }

        if (\in_array($var, self::$blacklist, true)) {
            return;
        }

        $len = \strlen($var);

        // Guess for anything between March 1973 and November 2286
        if (9 === $len || 10 === $len) {
            // If it's an int or string that's this short it probably has no other meaning
            // Additionally it's highly unlikely the shortValue will be clipped for length
            // If you're writing a plugin that interferes with this, just put your
            // parser plugin further down the list so that it gets loaded afterwards.
            $o->value->label = 'Timestamp';
            $o->value->hints[] = 'timestamp';
        }
    }
}
PKW�1\������1vendor/kint-php/kint/src/Parser/ClosurePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Closure;
use Kint\Zval\ClosureValue;
use Kint\Zval\ParameterValue;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;
use ReflectionFunction;

class ClosurePlugin extends Plugin
{
    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof Closure) {
            return;
        }

        $object = new ClosureValue();
        $object->transplant($o);
        $o = $object;
        $object->removeRepresentation('properties');

        $closure = new ReflectionFunction($var);

        $o->filename = $closure->getFileName();
        $o->startline = $closure->getStartLine();

        foreach ($closure->getParameters() as $param) {
            $o->parameters[] = new ParameterValue($param);
        }

        $p = new Representation('Parameters');
        $p->contents = &$o->parameters;
        $o->addRepresentation($p, 0);

        $statics = [];

        if ($v = $closure->getClosureThis()) {
            $statics = ['this' => $v];
        }

        if (\count($statics = $statics + $closure->getStaticVariables())) {
            $statics_parsed = [];

            foreach ($statics as $name => &$static) {
                $obj = Value::blank('$'.$name);
                $obj->depth = $o->depth + 1;
                $statics_parsed[$name] = $this->parser->parse($static, $obj);
                if (null === $statics_parsed[$name]->value) {
                    $statics_parsed[$name]->access_path = null;
                }
            }

            $r = new Representation('Uses');
            $r->contents = $statics_parsed;
            $o->addRepresentation($r, 0);
        }
    }
}
PKW�1\���

2vendor/kint-php/kint/src/Parser/IteratorPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;
use Traversable;

class IteratorPlugin extends Plugin
{
    /**
     * List of classes and interfaces to blacklist.
     *
     * Certain classes (Such as PDOStatement) irreversibly lose information
     * when traversed. Others are just huge. Either way, put them in here
     * and you won't have to worry about them being parsed.
     *
     * @var array
     */
    public static $blacklist = [
        'DOMNamedNodeMap',
        'DOMNodeList',
        'mysqli_result',
        'PDOStatement',
        'SplFileObject',
    ];

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof Traversable) {
            return;
        }

        foreach (self::$blacklist as $class) {
            if ($var instanceof $class) {
                $b = new Value();
                $b->name = $class.' Iterator Contents';
                $b->access_path = 'iterator_to_array('.$o->access_path.', true)';
                $b->depth = $o->depth + 1;
                $b->hints[] = 'blacklist';

                $r = new Representation('Iterator');
                $r->contents = [$b];

                $o->addRepresentation($r);

                return;
            }
        }

        $data = \iterator_to_array($var);

        $base_obj = new Value();
        $base_obj->depth = $o->depth;

        if ($o->access_path) {
            $base_obj->access_path = 'iterator_to_array('.$o->access_path.')';
        }

        $r = new Representation('Iterator');
        $r->contents = $this->parser->parse($data, $base_obj);
        $r->contents = $r->contents->value->contents;

        $primary = $o->getRepresentations();
        $primary = \reset($primary);
        if ($primary && $primary === $o->value && [] === $primary->contents) {
            $o->addRepresentation($r, 0);
        } else {
            $o->addRepresentation($r);
        }
    }
}
PKW�1\s��*vendor/kint-php/kint/src/Parser/Plugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Value;

abstract class Plugin
{
    protected $parser;

    public function setParser(Parser $p)
    {
        $this->parser = $p;
    }

    /**
     * An array of types (As returned by gettype) for all data this plugin can operate on.
     *
     * @return array List of types
     */
    public function getTypes()
    {
        return [];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_NONE;
    }

    abstract public function parse(&$var, Value &$o, $trigger);
}
PKW�1\GV:vendor/kint-php/kint/src/Parser/SimpleXMLElementPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\BlobValue;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;
use SimpleXMLElement;

class SimpleXMLElementPlugin extends Plugin
{
    /**
     * Show all properties and methods.
     *
     * @var bool
     */
    public static $verbose = false;

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof SimpleXMLElement) {
            return;
        }

        $o->hints[] = 'simplexml_element';

        if (!self::$verbose) {
            $o->removeRepresentation('properties');
            $o->removeRepresentation('iterator');
            $o->removeRepresentation('methods');
        }

        // Attributes
        $a = new Representation('Attributes');

        $base_obj = new Value();
        $base_obj->depth = $o->depth;

        if ($o->access_path) {
            $base_obj->access_path = '(string) '.$o->access_path;
        }

        if ($attribs = $var->attributes()) {
            $attribs = \iterator_to_array($attribs);
            $attribs = \array_map('strval', $attribs);
        } else {
            $attribs = [];
        }

        // XML attributes are by definition strings and don't have children,
        // so up the depth limit in case we're just below the limit since
        // there won't be any recursive stuff anyway.
        $a->contents = $this->parser->parseDeep($attribs, $base_obj)->value->contents;

        $o->addRepresentation($a, 0);

        // Children
        // We need to check children() separately from the values we already parsed because
        // text contents won't show up in children() but they will show up in properties.
        //
        // Why do we still need to check for attributes if we already have an attributes()
        // method? Hell if I know!
        $children = $var->children();

        if ($o->value) {
            $c = new Representation('Children');

            foreach ($o->value->contents as $value) {
                if ('@attributes' === $value->name) {
                    continue;
                }

                if (isset($children->{$value->name})) {
                    $i = 0;

                    while (isset($children->{$value->name}[$i])) {
                        $base_obj = new Value();
                        $base_obj->depth = $o->depth + 1;
                        $base_obj->name = $value->name;
                        if ($value->access_path) {
                            $base_obj->access_path = $value->access_path.'['.$i.']';
                        }

                        $value = $this->parser->parse($children->{$value->name}[$i], $base_obj);

                        if ($value->access_path && 'string' === $value->type) {
                            $value->access_path = '(string) '.$value->access_path;
                        }

                        $c->contents[] = $value;

                        ++$i;
                    }
                }
            }

            $o->size = \count($c->contents);

            if (!$o->size) {
                $o->size = null;

                if (\strlen((string) $var)) {
                    $base_obj = new BlobValue();
                    $base_obj->depth = $o->depth + 1;
                    $base_obj->name = $o->name;
                    if ($o->access_path) {
                        $base_obj->access_path = '(string) '.$o->access_path;
                    }

                    $value = (string) $var;

                    $c = new Representation('Contents');
                    $c->implicit_label = true;
                    $c->contents = [$this->parser->parseDeep($value, $base_obj)];
                }
            }

            $o->addRepresentation($c, 0);
        }
    }
}
PKW�1\�ʷ*�*5vendor/kint-php/kint/src/Parser/DOMDocumentPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use DOMNamedNodeMap;
use DOMNode;
use DOMNodeList;
use Kint\Zval\InstanceValue;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

/**
 * The DOMDocument parser plugin is particularly useful as it is both the only
 * way to see inside the DOMNode without print_r, and the only way to see mixed
 * text and node inside XML (SimpleXMLElement will strip out the text).
 */
class DOMDocumentPlugin extends Plugin
{
    /**
     * List of properties to skip parsing.
     *
     * The properties of a DOMNode can do a *lot* of damage to debuggers. The
     * DOMNode contains not one, not two, not three, not four, not 5, not 6,
     * not 7 but 8 different ways to recurse into itself:
     * * firstChild
     * * lastChild
     * * previousSibling
     * * nextSibling
     * * ownerDocument
     * * parentNode
     * * childNodes
     * * attributes
     *
     * All of this combined: the tiny SVGs used as the caret in Kint are already
     * enough to make parsing and rendering take over a second, and send memory
     * usage over 128 megs. So we blacklist every field we don't strictly need
     * and hope that that's good enough.
     *
     * In retrospect - this is probably why print_r does the same
     *
     * @var array
     */
    public static $blacklist = [
        'parentNode' => 'DOMNode',
        'firstChild' => 'DOMNode',
        'lastChild' => 'DOMNode',
        'previousSibling' => 'DOMNode',
        'nextSibling' => 'DOMNode',
        'ownerDocument' => 'DOMDocument',
    ];

    /**
     * Show all properties and methods.
     *
     * @var bool
     */
    public static $verbose = false;

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$o instanceof InstanceValue) {
            return;
        }

        if ($var instanceof DOMNamedNodeMap || $var instanceof DOMNodeList) {
            return $this->parseList($var, $o, $trigger);
        }

        if ($var instanceof DOMNode) {
            return $this->parseNode($var, $o);
        }
    }

    protected function parseList(&$var, InstanceValue &$o, $trigger)
    {
        // Recursion should never happen, should always be stopped at the parent
        // DOMNode.  Depth limit on the other hand we're going to skip since
        // that would show an empty iterator and rather useless. Let the depth
        // limit hit the children (DOMNodeList only has DOMNode as children)
        if ($trigger & Parser::TRIGGER_RECURSION) {
            return;
        }

        $o->size = $var->length;
        if (0 === $o->size) {
            $o->replaceRepresentation(new Representation('Iterator'));
            $o->size = null;

            return;
        }

        // Depth limit
        // Make empty iterator representation since we need it in DOMNode to point out depth limits
        if ($this->parser->getDepthLimit() && $o->depth + 1 >= $this->parser->getDepthLimit()) {
            $b = new Value();
            $b->name = $o->classname.' Iterator Contents';
            $b->access_path = 'iterator_to_array('.$o->access_path.')';
            $b->depth = $o->depth + 1;
            $b->hints[] = 'depth_limit';

            $r = new Representation('Iterator');
            $r->contents = [$b];
            $o->replaceRepresentation($r, 0);

            return;
        }

        $data = \iterator_to_array($var);

        $r = new Representation('Iterator');
        $o->replaceRepresentation($r, 0);

        foreach ($data as $key => $item) {
            $base_obj = new Value();
            $base_obj->depth = $o->depth + 1;
            $base_obj->name = $item->nodeName;

            if ($o->access_path) {
                if ($var instanceof DOMNamedNodeMap) {
                    $base_obj->access_path = $o->access_path.'->getNamedItem('.\var_export($key, true).')';
                } elseif ($var instanceof DOMNodeList) {
                    $base_obj->access_path = $o->access_path.'->item('.\var_export($key, true).')';
                } else {
                    $base_obj->access_path = 'iterator_to_array('.$o->access_path.')';
                }
            }

            $r->contents[] = $this->parser->parse($item, $base_obj);
        }
    }

    protected function parseNode(&$var, InstanceValue &$o)
    {
        // Fill the properties
        // They can't be enumerated through reflection or casting,
        // so we have to trust the docs and try them one at a time
        $known_properties = [
            'nodeValue',
            'childNodes',
            'attributes',
        ];

        if (self::$verbose) {
            $known_properties = [
                'nodeName',
                'nodeValue',
                'nodeType',
                'parentNode',
                'childNodes',
                'firstChild',
                'lastChild',
                'previousSibling',
                'nextSibling',
                'attributes',
                'ownerDocument',
                'namespaceURI',
                'prefix',
                'localName',
                'baseURI',
                'textContent',
            ];
        }

        $childNodes = [];
        $attributes = [];

        $rep = $o->value;

        foreach ($known_properties as $prop) {
            $prop_obj = $this->parseProperty($o, $prop, $var);
            $rep->contents[] = $prop_obj;

            if ('childNodes' === $prop) {
                $childNodes = $prop_obj->getRepresentation('iterator');
            } elseif ('attributes' === $prop) {
                $attributes = $prop_obj->getRepresentation('iterator');
            }
        }

        if (!self::$verbose) {
            $o->removeRepresentation('methods');
            $o->removeRepresentation('properties');
        }

        // Attributes and comments and text nodes don't
        // need children or attributes of their own
        if (\in_array($o->classname, ['DOMAttr', 'DOMText', 'DOMComment'], true)) {
            return;
        }

        // Set the attributes
        if ($attributes) {
            $a = new Representation('Attributes');
            foreach ($attributes->contents as $attribute) {
                $a->contents[] = self::textualNodeToString($attribute);
            }
            $o->addRepresentation($a, 0);
        }

        // Set the children
        if ($childNodes) {
            $c = new Representation('Children');

            if (1 === \count($childNodes->contents) && ($node = \reset($childNodes->contents)) && \in_array('depth_limit', $node->hints, true)) {
                $n = new InstanceValue();
                $n->transplant($node);
                $n->name = 'childNodes';
                $n->classname = 'DOMNodeList';
                $c->contents = [$n];
            } else {
                foreach ($childNodes->contents as $index => $node) {
                    // Shortcircuit text nodes to plain strings
                    if ('DOMText' === $node->classname || 'DOMComment' === $node->classname) {
                        $node = self::textualNodeToString($node);

                        // And remove them if they're empty
                        if (\ctype_space($node->value->contents) || '' === $node->value->contents) {
                            continue;
                        }
                    }

                    $c->contents[] = $node;
                }
            }

            $o->addRepresentation($c, 0);
        }

        if (isset($c) && \count($c->contents)) {
            $o->size = \count($c->contents);
        }

        if (!$o->size) {
            $o->size = null;
        }
    }

    protected function parseProperty(InstanceValue $o, $prop, &$var)
    {
        // Duplicating (And slightly optimizing) the Parser::parseObject() code here
        $base_obj = new Value();
        $base_obj->depth = $o->depth + 1;
        $base_obj->owner_class = $o->classname;
        $base_obj->name = $prop;
        $base_obj->operator = Value::OPERATOR_OBJECT;
        $base_obj->access = Value::ACCESS_PUBLIC;

        if (null !== $o->access_path) {
            $base_obj->access_path = $o->access_path;

            if (\preg_match('/^[A-Za-z0-9_]+$/', $base_obj->name)) {
                $base_obj->access_path .= '->'.$base_obj->name;
            } else {
                $base_obj->access_path .= '->{'.\var_export($base_obj->name, true).'}';
            }
        }

        if (!isset($var->{$prop})) {
            $base_obj->type = 'null';
        } elseif (isset(self::$blacklist[$prop])) {
            $b = new InstanceValue();
            $b->transplant($base_obj);
            $base_obj = $b;

            $base_obj->hints[] = 'blacklist';
            $base_obj->classname = self::$blacklist[$prop];
        } elseif ('attributes' === $prop) {
            $base_obj = $this->parser->parseDeep($var->{$prop}, $base_obj);
        } else {
            $base_obj = $this->parser->parse($var->{$prop}, $base_obj);
        }

        return $base_obj;
    }

    protected static function textualNodeToString(InstanceValue $o)
    {
        if (empty($o->value) || empty($o->value->contents) || empty($o->classname)) {
            return;
        }

        if (!\in_array($o->classname, ['DOMText', 'DOMAttr', 'DOMComment'], true)) {
            return;
        }

        foreach ($o->value->contents as $property) {
            if ('nodeValue' === $property->name) {
                $ret = clone $property;
                $ret->name = $o->name;

                return $ret;
            }
        }
    }
}
PKW�1\ۭb
��/vendor/kint-php/kint/src/Parser/TablePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

class TablePlugin extends Plugin
{
    public function getTypes()
    {
        return ['array'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (empty($o->value->contents)) {
            return;
        }

        $array = $this->parser->getCleanArray($var);

        if (\count($array) < 2) {
            return;
        }

        // Ensure this is an array of arrays and that all child arrays have the
        // same keys. We don't care about their children - if there's another
        // "table" inside we'll just make another one down the value tab
        $keys = null;
        foreach ($array as $elem) {
            if (!\is_array($elem) || \count($elem) < 2) {
                return;
            }

            if (null === $keys) {
                $keys = \array_keys($elem);
            } elseif (\array_keys($elem) !== $keys) {
                return;
            }
        }

        // Ensure none of the child arrays are recursion or depth limit. We
        // don't care if their children are since they are the table cells
        foreach ($o->value->contents as $childarray) {
            if (empty($childarray->value->contents)) {
                return;
            }
        }

        // Objects by reference for the win! We can do a copy-paste of the value
        // representation contents and just slap a new hint on there and hey
        // presto we have our table representation with no extra memory used!
        $table = new Representation('Table');
        $table->contents = $o->value->contents;
        $table->hints[] = 'table';
        $o->addRepresentation($table, 0);
    }
}
PKW�1\��|�F�F*vendor/kint-php/kint/src/Parser/Parser.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use DomainException;
use Exception;
use Kint\Zval\BlobValue;
use Kint\Zval\InstanceValue;
use Kint\Zval\Representation\Representation;
use Kint\Zval\ResourceValue;
use Kint\Zval\Value;
use ReflectionObject;
use stdClass;

class Parser
{
    /**
     * Plugin triggers.
     *
     * These are constants indicating trigger points for plugins
     *
     * BEGIN: Before normal parsing
     * SUCCESS: After successful parsing
     * RECURSION: After parsing cancelled by recursion
     * DEPTH_LIMIT: After parsing cancelled by depth limit
     * COMPLETE: SUCCESS | RECURSION | DEPTH_LIMIT
     *
     * While a plugin's getTriggers may return any of these
     */
    const TRIGGER_NONE = 0;
    const TRIGGER_BEGIN = 1;
    const TRIGGER_SUCCESS = 2;
    const TRIGGER_RECURSION = 4;
    const TRIGGER_DEPTH_LIMIT = 8;
    const TRIGGER_COMPLETE = 14;

    protected $caller_class;
    protected $depth_limit = false;
    protected $marker;
    protected $object_hashes = [];
    protected $parse_break = false;
    protected $plugins = [];

    /**
     * @param false|int   $depth_limit Maximum depth to parse data
     * @param null|string $caller      Caller class name
     */
    public function __construct($depth_limit = false, $caller = null)
    {
        $this->marker = \uniqid("kint\0", true);

        $this->caller_class = $caller;

        if ($depth_limit) {
            $this->depth_limit = $depth_limit;
        }
    }

    /**
     * Set the caller class.
     *
     * @param null|string $caller Caller class name
     */
    public function setCallerClass($caller = null)
    {
        $this->noRecurseCall();

        $this->caller_class = $caller;
    }

    public function getCallerClass()
    {
        return $this->caller_class;
    }

    /**
     * Set the depth limit.
     *
     * @param false|int $depth_limit Maximum depth to parse data
     */
    public function setDepthLimit($depth_limit = false)
    {
        $this->noRecurseCall();

        $this->depth_limit = $depth_limit;
    }

    public function getDepthLimit()
    {
        return $this->depth_limit;
    }

    /**
     * Disables the depth limit and parses a variable.
     *
     * This should not be used unless you know what you're doing!
     *
     * @param mixed $var The input variable
     * @param Value $o   The base object
     *
     * @return Value
     */
    public function parseDeep(&$var, Value $o)
    {
        $depth_limit = $this->depth_limit;
        $this->depth_limit = false;

        $out = $this->parse($var, $o);

        $this->depth_limit = $depth_limit;

        return $out;
    }

    /**
     * Parses a variable into a Kint object structure.
     *
     * @param mixed $var The input variable
     * @param Value $o   The base object
     *
     * @return Value
     */
    public function parse(&$var, Value $o)
    {
        $o->type = \strtolower(\gettype($var));

        if (!$this->applyPlugins($var, $o, self::TRIGGER_BEGIN)) {
            return $o;
        }

        switch ($o->type) {
            case 'array':
                return $this->parseArray($var, $o);
            case 'boolean':
            case 'double':
            case 'integer':
            case 'null':
                return $this->parseGeneric($var, $o);
            case 'object':
                return $this->parseObject($var, $o);
            case 'resource':
                return $this->parseResource($var, $o);
            case 'string':
                return $this->parseString($var, $o);
            case 'unknown type':
            case 'resource (closed)':
            default:
                return $this->parseResourceClosed($var, $o);
        }
    }

    public function addPlugin(Plugin $p)
    {
        if (!$types = $p->getTypes()) {
            return false;
        }

        if (!$triggers = $p->getTriggers()) {
            return false;
        }

        $p->setParser($this);

        foreach ($types as $type) {
            if (!isset($this->plugins[$type])) {
                $this->plugins[$type] = [
                    self::TRIGGER_BEGIN => [],
                    self::TRIGGER_SUCCESS => [],
                    self::TRIGGER_RECURSION => [],
                    self::TRIGGER_DEPTH_LIMIT => [],
                ];
            }

            foreach ($this->plugins[$type] as $trigger => &$pool) {
                if ($triggers & $trigger) {
                    $pool[] = $p;
                }
            }
        }

        return true;
    }

    public function clearPlugins()
    {
        $this->plugins = [];
    }

    public function haltParse()
    {
        $this->parse_break = true;
    }

    public function childHasPath(InstanceValue $parent, Value $child)
    {
        if ('object' === $parent->type && (null !== $parent->access_path || $child->static || $child->const)) {
            if (Value::ACCESS_PUBLIC === $child->access) {
                return true;
            }

            if (Value::ACCESS_PRIVATE === $child->access && $this->caller_class) {
                if ($this->caller_class === $child->owner_class) {
                    return true;
                }
            } elseif (Value::ACCESS_PROTECTED === $child->access && $this->caller_class) {
                if ($this->caller_class === $child->owner_class) {
                    return true;
                }

                if (\is_subclass_of($this->caller_class, $child->owner_class)) {
                    return true;
                }

                if (\is_subclass_of($child->owner_class, $this->caller_class)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Returns an array without the recursion marker in it.
     *
     * DO NOT pass an array that has had it's marker removed back
     * into the parser, it will result in an extra recursion
     *
     * @param array $array Array potentially containing a recursion marker
     *
     * @return array Array with recursion marker removed
     */
    public function getCleanArray(array $array)
    {
        unset($array[$this->marker]);

        return $array;
    }

    protected function noRecurseCall()
    {
        $bt = \debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS);

        $caller_frame = [
            'function' => __FUNCTION__,
        ];

        while (isset($bt[0]['object']) && $bt[0]['object'] === $this) {
            $caller_frame = \array_shift($bt);
        }

        foreach ($bt as $frame) {
            if (isset($frame['object']) && $frame['object'] === $this) {
                throw new DomainException(__CLASS__.'::'.$caller_frame['function'].' cannot be called from inside a parse');
            }
        }
    }

    private function parseGeneric(&$var, Value $o)
    {
        $rep = new Representation('Contents');
        $rep->contents = $var;
        $rep->implicit_label = true;
        $o->addRepresentation($rep);
        $o->value = $rep;

        $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS);

        return $o;
    }

    /**
     * Parses a string into a Kint BlobValue structure.
     *
     * @param string $var The input variable
     * @param Value  $o   The base object
     *
     * @return Value
     */
    private function parseString(&$var, Value $o)
    {
        $string = new BlobValue();
        $string->transplant($o);
        $string->encoding = BlobValue::detectEncoding($var);
        $string->size = \strlen($var);

        $rep = new Representation('Contents');
        $rep->contents = $var;
        $rep->implicit_label = true;

        $string->addRepresentation($rep);
        $string->value = $rep;

        $this->applyPlugins($var, $string, self::TRIGGER_SUCCESS);

        return $string;
    }

    /**
     * Parses an array into a Kint object structure.
     *
     * @param array $var The input variable
     * @param Value $o   The base object
     *
     * @return Value
     */
    private function parseArray(array &$var, Value $o)
    {
        $array = new Value();
        $array->transplant($o);
        $array->size = \count($var);

        if (isset($var[$this->marker])) {
            --$array->size;
            $array->hints[] = 'recursion';

            $this->applyPlugins($var, $array, self::TRIGGER_RECURSION);

            return $array;
        }

        $rep = new Representation('Contents');
        $rep->implicit_label = true;
        $array->addRepresentation($rep);
        $array->value = $rep;

        if (!$array->size) {
            $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS);

            return $array;
        }

        if ($this->depth_limit && $o->depth >= $this->depth_limit) {
            $array->hints[] = 'depth_limit';

            $this->applyPlugins($var, $array, self::TRIGGER_DEPTH_LIMIT);

            return $array;
        }

        $copy = \array_values($var);

        // It's really really hard to access numeric string keys in arrays,
        // and it's really really hard to access integer properties in
        // objects, so we just use array_values and index by counter to get
        // at it reliably for reference testing. This also affects access
        // paths since it's pretty much impossible to access these things
        // without complicated stuff you should never need to do.
        $i = 0;

        // Set the marker for recursion
        $var[$this->marker] = $array->depth;

        $refmarker = new stdClass();

        foreach ($var as $key => &$val) {
            if ($key === $this->marker) {
                continue;
            }

            $child = new Value();
            $child->name = $key;
            $child->depth = $array->depth + 1;
            $child->access = Value::ACCESS_NONE;
            $child->operator = Value::OPERATOR_ARRAY;

            if (null !== $array->access_path) {
                if (\is_string($key) && (string) (int) $key === $key) {
                    $child->access_path = 'array_values('.$array->access_path.')['.$i.']'; // @codeCoverageIgnore
                } else {
                    $child->access_path = $array->access_path.'['.\var_export($key, true).']';
                }
            }

            $stash = $val;
            $copy[$i] = $refmarker;
            if ($val === $refmarker) {
                $child->reference = true;
                $val = $stash;
            }

            $rep->contents[] = $this->parse($val, $child);
            ++$i;
        }

        $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS);
        unset($var[$this->marker]);

        return $array;
    }

    /**
     * Parses an object into a Kint InstanceValue structure.
     *
     * @param object $var The input variable
     * @param Value  $o   The base object
     *
     * @return Value
     */
    private function parseObject(&$var, Value $o)
    {
        $hash = \spl_object_hash($var);
        $values = (array) $var;

        $object = new InstanceValue();
        $object->transplant($o);
        $object->classname = \get_class($var);
        $object->spl_object_hash = $hash;
        $object->size = \count($values);

        if (isset($this->object_hashes[$hash])) {
            $object->hints[] = 'recursion';

            $this->applyPlugins($var, $object, self::TRIGGER_RECURSION);

            return $object;
        }

        $this->object_hashes[$hash] = $object;

        if ($this->depth_limit && $o->depth >= $this->depth_limit) {
            $object->hints[] = 'depth_limit';

            $this->applyPlugins($var, $object, self::TRIGGER_DEPTH_LIMIT);
            unset($this->object_hashes[$hash]);

            return $object;
        }

        $reflector = new ReflectionObject($var);

        if ($reflector->isUserDefined()) {
            $object->filename = $reflector->getFileName();
            $object->startline = $reflector->getStartLine();
        }

        $rep = new Representation('Properties');

        $copy = \array_values($values);
        $refmarker = new stdClass();
        $i = 0;

        // Reflection will not show parent classes private properties, and if a
        // property was unset it will happly trigger a notice looking for it.
        foreach ($values as $key => &$val) {
            // Casting object to array:
            // private properties show in the form "\0$owner_class_name\0$property_name";
            // protected properties show in the form "\0*\0$property_name";
            // public properties show in the form "$property_name";
            // http://www.php.net/manual/en/language.types.array.php#language.types.array.casting

            $child = new Value();
            $child->depth = $object->depth + 1;
            $child->owner_class = $object->classname;
            $child->operator = Value::OPERATOR_OBJECT;
            $child->access = Value::ACCESS_PUBLIC;

            $split_key = \explode("\0", $key, 3);

            if (3 === \count($split_key) && '' === $split_key[0]) {
                $child->name = $split_key[2];
                if ('*' === $split_key[1]) {
                    $child->access = Value::ACCESS_PROTECTED;
                } else {
                    $child->access = Value::ACCESS_PRIVATE;
                    $child->owner_class = $split_key[1];
                }
            } elseif (KINT_PHP72) {
                $child->name = (string) $key;
            } else {
                $child->name = $key; // @codeCoverageIgnore
            }

            if ($this->childHasPath($object, $child)) {
                $child->access_path = $object->access_path;

                if (!KINT_PHP72 && \is_int($child->name)) {
                    $child->access_path = 'array_values((array) '.$child->access_path.')['.$i.']'; // @codeCoverageIgnore
                } elseif (\preg_match('/^[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*$/', $child->name)) {
                    $child->access_path .= '->'.$child->name;
                } else {
                    $child->access_path .= '->{'.\var_export((string) $child->name, true).'}';
                }
            }

            $stash = $val;
            $copy[$i] = $refmarker;
            if ($val === $refmarker) {
                $child->reference = true;
                $val = $stash;
            }

            $rep->contents[] = $this->parse($val, $child);
            ++$i;
        }

        $object->addRepresentation($rep);
        $object->value = $rep;
        $this->applyPlugins($var, $object, self::TRIGGER_SUCCESS);
        unset($this->object_hashes[$hash]);

        return $object;
    }

    /**
     * Parses a resource into a Kint ResourceValue structure.
     *
     * @param resource $var The input variable
     * @param Value    $o   The base object
     *
     * @return Value
     */
    private function parseResource(&$var, Value $o)
    {
        $resource = new ResourceValue();
        $resource->transplant($o);
        $resource->resource_type = \get_resource_type($var);

        $this->applyPlugins($var, $resource, self::TRIGGER_SUCCESS);

        return $resource;
    }

    /**
     * Parses a closed resource into a Kint object structure.
     *
     * @param mixed $var The input variable
     * @param Value $o   The base object
     *
     * @return Value
     */
    private function parseResourceClosed(&$var, Value $o)
    {
        $o->type = 'resource (closed)';
        $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS);

        return $o;
    }

    /**
     * Applies plugins for an object type.
     *
     * @param mixed $var     variable
     * @param Value $o       Kint object parsed so far
     * @param int   $trigger The trigger to check for the plugins
     *
     * @return bool Continue parsing
     */
    private function applyPlugins(&$var, Value &$o, $trigger)
    {
        $break_stash = $this->parse_break;

        /** @var bool Psalm bug workaround */
        $this->parse_break = false;

        $plugins = [];

        if (isset($this->plugins[$o->type][$trigger])) {
            $plugins = $this->plugins[$o->type][$trigger];
        }

        foreach ($plugins as $plugin) {
            try {
                $plugin->parse($var, $o, $trigger);
            } catch (Exception $e) {
                \trigger_error(
                    'An exception ('.\get_class($e).') was thrown in '.$e->getFile().' on line '.$e->getLine().' while executing Kint Parser Plugin "'.\get_class($plugin).'". Error message: '.$e->getMessage(),
                    E_USER_WARNING
                );
            }

            if ($this->parse_break) {
                $this->parse_break = $break_stash;

                return false;
            }
        }

        $this->parse_break = $break_stash;

        return true;
    }
}
PKW�1\�&���2vendor/kint-php/kint/src/Parser/DateTimePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use DateTime;
use Kint\Zval\DateTimeValue;
use Kint\Zval\Value;

class DateTimePlugin extends Plugin
{
    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof DateTime) {
            return;
        }

        $object = new DateTimeValue($var);
        $object->transplant($o);

        $o = $object;
    }
}
PKW�1\���k**:vendor/kint-php/kint/src/Parser/SplObjectStoragePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Value;
use SplObjectStorage;

class SplObjectStoragePlugin extends Plugin
{
    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_COMPLETE;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof SplObjectStorage || !($r = $o->getRepresentation('iterator'))) {
            return;
        }

        $r = $o->getRepresentation('iterator');
        if ($r) {
            $o->size = !\is_array($r->contents) ? null : \count($r->contents);
        }
    }
}
PKW�1\��+��.vendor/kint-php/kint/src/Parser/JsonPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

class JsonPlugin extends Plugin
{
    public function getTypes()
    {
        return ['string'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!isset($var[0]) || ('{' !== $var[0] && '[' !== $var[0])) {
            return;
        }

        $json = \json_decode($var, true);

        if (!$json) {
            return;
        }

        $json = (array) $json;

        $base_obj = new Value();
        $base_obj->depth = $o->depth;

        if ($o->access_path) {
            $base_obj->access_path = 'json_decode('.$o->access_path.', true)';
        }

        $r = new Representation('Json');
        $r->contents = $this->parser->parse($json, $base_obj);

        if (!\in_array('depth_limit', $r->contents->hints, true)) {
            $r->contents = $r->contents->value->contents;
        }

        $o->addRepresentation($r, 0);
    }
}
PKW�1\b��/vendor/kint-php/kint/src/Parser/ColorPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\ColorRepresentation;
use Kint\Zval\Value;

class ColorPlugin extends Plugin
{
    public function getTypes()
    {
        return ['string'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (\strlen($var) > 32) {
            return;
        }

        $trimmed = \strtolower(\trim($var));

        if (!isset(ColorRepresentation::$color_map[$trimmed]) && !\preg_match('/^(?:(?:rgb|hsl)[^\\)]{6,}\\)|#[0-9a-fA-F]{3,8})$/', $trimmed)) {
            return;
        }

        $rep = new ColorRepresentation($var);

        if ($rep->variant) {
            $o->removeRepresentation($o->value);
            $o->addRepresentation($rep, 0);
            $o->hints[] = 'color';
        }
    }
}
PKW�1\XuK�{{-vendor/kint-php/kint/src/Parser/XmlPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use DOMDocument;
use Exception;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

class XmlPlugin extends Plugin
{
    /**
     * Which method to parse the variable with.
     *
     * DOMDocument provides more information including the text between nodes,
     * however it's memory usage is very high and it takes longer to parse and
     * render. Plus it's a pain to work with. So SimpleXML is the default.
     *
     * @var string
     */
    public static $parse_method = 'SimpleXML';

    public function getTypes()
    {
        return ['string'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if ('<?xml' !== \substr($var, 0, 5)) {
            return;
        }

        if (!\method_exists(\get_class($this), 'xmlTo'.self::$parse_method)) {
            return;
        }

        $xml = \call_user_func([\get_class($this), 'xmlTo'.self::$parse_method], $var, $o->access_path);

        if (empty($xml)) {
            return;
        }

        list($xml, $access_path, $name) = $xml;

        $base_obj = new Value();
        $base_obj->depth = $o->depth + 1;
        $base_obj->name = $name;
        $base_obj->access_path = $access_path;

        $r = new Representation('XML');
        $r->contents = $this->parser->parse($xml, $base_obj);

        $o->addRepresentation($r, 0);
    }

    protected static function xmlToSimpleXML($var, $parent_path)
    {
        try {
            $errors = \libxml_use_internal_errors(true);
            $xml = \simplexml_load_string($var);
            \libxml_use_internal_errors($errors);
        } catch (Exception $e) {
            if (isset($errors)) {
                \libxml_use_internal_errors($errors);
            }

            return;
        }

        if (false === $xml) {
            return;
        }

        if (null === $parent_path) {
            $access_path = null;
        } else {
            $access_path = 'simplexml_load_string('.$parent_path.')';
        }

        $name = $xml->getName();

        return [$xml, $access_path, $name];
    }

    /**
     * Get the DOMDocument info.
     *
     * The documentation of DOMDocument::loadXML() states that while you can
     * call it statically, it will give an E_STRICT warning. On my system it
     * actually gives an E_DEPRECATED warning, but it works so we'll just add
     * an error-silencing '@' to the access path.
     *
     * If it errors loading then we wouldn't have gotten this far in the first place.
     *
     * @param string      $var         The XML string
     * @param null|string $parent_path The path to the parent, in this case the XML string
     *
     * @return null|array The root element DOMNode, the access path, and the root element name
     */
    protected static function xmlToDOMDocument($var, $parent_path)
    {
        // There's no way to check validity in DOMDocument without making errors. For shame!
        if (!self::xmlToSimpleXML($var, $parent_path)) {
            return null;
        }

        $xml = new DOMDocument();
        $xml->loadXML($var);
        $xml = $xml->firstChild;

        if (null === $parent_path) {
            $access_path = null;
        } else {
            $access_path = '@\\DOMDocument::loadXML('.$parent_path.')->firstChild';
        }

        $name = isset($xml->nodeName) ? $xml->nodeName : null;

        return [$xml, $access_path, $name];
    }
}
PKW�1\���W��3vendor/kint-php/kint/src/Parser/MicrotimePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\MicrotimeRepresentation;
use Kint\Zval\Value;

class MicrotimePlugin extends Plugin
{
    private static $last = null;
    private static $start = null;
    private static $times = 0;
    private static $group = 0;

    public function getTypes()
    {
        return ['string', 'double'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (0 !== $o->depth) {
            return;
        }

        if (\is_string($var)) {
            if ('microtime()' !== $o->name || !\preg_match('/^0\\.[0-9]{8} [0-9]{10}$/', $var)) {
                return;
            }

            $usec = (int) \substr($var, 2, 6);
            $sec = (int) \substr($var, 11, 10);
        } else {
            if ('microtime(...)' !== $o->name) {
                return;
            }

            $sec = \floor($var);
            $usec = $var - $sec;
            $usec = \floor($usec * 1000000);
        }

        $time = $sec + ($usec / 1000000);

        if (null !== self::$last) {
            $last_time = self::$last[0] + (self::$last[1] / 1000000);
            $lap = $time - $last_time;
            ++self::$times;
        } else {
            $lap = null;
            self::$start = $time;
        }

        self::$last = [$sec, $usec];

        if (null !== $lap) {
            $total = $time - self::$start;
            $r = new MicrotimeRepresentation($sec, $usec, self::$group, $lap, $total, self::$times);
        } else {
            $r = new MicrotimeRepresentation($sec, $usec, self::$group);
        }
        $r->contents = $var;
        $r->implicit_label = true;

        $o->removeRepresentation($o->value);
        $o->addRepresentation($r);
        $o->hints[] = 'microtime';
    }

    public static function clean()
    {
        self::$last = null;
        self::$start = null;
        self::$times = 0;
        ++self::$group;
    }
}
PKW�1\}��o2vendor/kint-php/kint/src/Parser/ToStringPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;
use ReflectionClass;

class ToStringPlugin extends Plugin
{
    public static $blacklist = [
        'SimpleXMLElement',
        'SplFileObject',
    ];

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        $reflection = new ReflectionClass($var);
        if (!$reflection->hasMethod('__toString')) {
            return;
        }

        foreach (self::$blacklist as $class) {
            if ($var instanceof $class) {
                return;
            }
        }

        $r = new Representation('toString');
        $r->contents = (string) $var;

        $o->addRepresentation($r);
    }
}
PKW�1\�7��
�
6vendor/kint-php/kint/src/Parser/ClassMethodsPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\InstanceValue;
use Kint\Zval\MethodValue;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;
use ReflectionClass;

class ClassMethodsPlugin extends Plugin
{
    private static $cache = [];

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        $class = \get_class($var);

        // assuming class definition will not change inside one request
        if (!isset(self::$cache[$class])) {
            $methods = [];

            $reflection = new ReflectionClass($class);

            foreach ($reflection->getMethods() as $method) {
                $methods[] = new MethodValue($method);
            }

            \usort($methods, ['Kint\\Parser\\ClassMethodsPlugin', 'sort']);

            self::$cache[$class] = $methods;
        }

        if (!empty(self::$cache[$class])) {
            $rep = new Representation('Available methods', 'methods');

            // Can't cache access paths
            foreach (self::$cache[$class] as $m) {
                $method = clone $m;
                $method->depth = $o->depth + 1;

                if (!$this->parser->childHasPath($o, $method)) {
                    $method->access_path = null;
                } else {
                    $method->setAccessPathFrom($o);
                }

                if ($method->owner_class !== $class && $ds = $method->getRepresentation('docstring')) {
                    $ds = clone $ds;
                    $ds->class = $method->owner_class;
                    $method->replaceRepresentation($ds);
                }

                $rep->contents[] = $method;
            }

            $o->addRepresentation($rep);
        }
    }

    private static function sort(MethodValue $a, MethodValue $b)
    {
        $sort = ((int) $a->static) - ((int) $b->static);
        if ($sort) {
            return $sort;
        }

        $sort = Value::sortByAccess($a, $b);
        if ($sort) {
            return $sort;
        }

        $sort = InstanceValue::sortByHierarchy($a->owner_class, $b->owner_class);
        if ($sort) {
            return $sort;
        }

        return $a->startline - $b->startline;
    }
}
PKW�1\�N�pp5vendor/kint-php/kint/src/Parser/ArrayObjectPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use ArrayObject;
use Kint\Zval\Value;

class ArrayObjectPlugin extends Plugin
{
    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_BEGIN;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (!$var instanceof ArrayObject) {
            return;
        }

        $flags = $var->getFlags();

        if (ArrayObject::STD_PROP_LIST === $flags) {
            return;
        }

        $var->setFlags(ArrayObject::STD_PROP_LIST);

        $o = $this->parser->parse($var, $o);

        $var->setFlags($flags);

        $this->parser->haltParse();
    }
}
PKW�1\lŽ
�
3vendor/kint-php/kint/src/Parser/BlacklistPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\InstanceValue;
use Kint\Zval\Value;

class BlacklistPlugin extends Plugin
{
    /**
     * List of classes and interfaces to blacklist.
     *
     * @var array
     */
    public static $blacklist = [];

    /**
     * List of classes and interfaces to blacklist except when dumped directly.
     *
     * @var array
     */
    public static $shallow_blacklist = [];

    public function getTypes()
    {
        return ['object'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_BEGIN;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        foreach (self::$blacklist as $class) {
            if ($var instanceof $class) {
                return $this->blacklistValue($var, $o);
            }
        }

        if ($o->depth <= 0) {
            return;
        }

        foreach (self::$shallow_blacklist as $class) {
            if ($var instanceof $class) {
                return $this->blacklistValue($var, $o);
            }
        }
    }

    protected function blacklistValue(&$var, Value &$o)
    {
        $object = new InstanceValue();
        $object->transplant($o);
        $object->classname = \get_class($var);
        $object->spl_object_hash = \spl_object_hash($var);
        $object->clearRepresentations();
        $object->value = null;
        $object->size = null;
        $object->hints[] = 'blacklist';

        $o = $object;

        $this->parser->haltParse();
    }
}
PKW�1\͡��~~0vendor/kint-php/kint/src/Parser/FsPathPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Parser;

use Kint\Zval\Representation\SplFileInfoRepresentation;
use Kint\Zval\Value;
use SplFileInfo;

class FsPathPlugin extends Plugin
{
    public static $blacklist = ['/', '.'];

    public function getTypes()
    {
        return ['string'];
    }

    public function getTriggers()
    {
        return Parser::TRIGGER_SUCCESS;
    }

    public function parse(&$var, Value &$o, $trigger)
    {
        if (\strlen($var) > 2048) {
            return;
        }

        if (!\preg_match('/[\\/\\'.DIRECTORY_SEPARATOR.']/', $var)) {
            return;
        }

        if (\preg_match('/[?<>"*|]/', $var)) {
            return;
        }

        if (!@\file_exists($var)) {
            return;
        }

        if (\in_array($var, self::$blacklist, true)) {
            return;
        }

        $r = new SplFileInfoRepresentation(new SplFileInfo($var));
        $r->hints[] = 'fspath';
        $o->addRepresentation($r, 0);
    }
}
PKW�1\
�2�gUgU!vendor/kint-php/kint/src/Kint.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint;

use InvalidArgumentException;
use Kint\Parser\Parser;
use Kint\Parser\Plugin;
use Kint\Renderer\Renderer;
use Kint\Renderer\TextRenderer;
use Kint\Zval\Value;

class Kint
{
    const MODE_RICH = 'r';
    const MODE_TEXT = 't';
    const MODE_CLI = 'c';
    const MODE_PLAIN = 'p';

    /**
     * @var mixed Kint mode
     *
     * false: Disabled
     * true: Enabled, default mode selection
     * other: Manual mode selection
     */
    public static $enabled_mode = true;

    /**
     * Default mode.
     *
     * @var string
     */
    public static $mode_default = self::MODE_RICH;

    /**
     * Default mode in CLI with cli_detection on.
     *
     * @var string
     */
    public static $mode_default_cli = self::MODE_CLI;

    /**
     * @var bool Return output instead of echoing
     */
    public static $return;

    /**
     * @var string format of the link to the source file in trace entries.
     *
     * Use %f for file path, %l for line number.
     *
     * [!] EXAMPLE (works with for phpStorm and RemoteCall Plugin):
     *
     * Kint::$file_link_format = 'http://localhost:8091/?message=%f:%l';
     */
    public static $file_link_format = '';

    /**
     * @var bool whether to display where kint was called from
     */
    public static $display_called_from = true;

    /**
     * @var array base directories of your application that will be displayed instead of the full path.
     *
     * Keys are paths, values are replacement strings
     *
     * [!] EXAMPLE (for Laravel 5):
     *
     * Kint::$app_root_dirs = [
     *     base_path() => '<BASE>',
     *     app_path() => '<APP>',
     *     config_path() => '<CONFIG>',
     *     database_path() => '<DATABASE>',
     *     public_path() => '<PUBLIC>',
     *     resource_path() => '<RESOURCE>',
     *     storage_path() => '<STORAGE>',
     * ];
     *
     * Defaults to [$_SERVER['DOCUMENT_ROOT'] => '<ROOT>']
     */
    public static $app_root_dirs = [];

    /**
     * @var int max array/object levels to go deep, if zero no limits are applied
     */
    public static $max_depth = 6;

    /**
     * @var bool expand all trees by default for rich view
     */
    public static $expanded = false;

    /**
     * @var bool enable detection when Kint is command line.
     *
     * Formats output with whitespace only; does not HTML-escape it
     */
    public static $cli_detection = true;

    /**
     * @var array Kint aliases. Add debug functions in Kint wrappers here to fix modifiers and backtraces
     */
    public static $aliases = [
        ['Kint\\Kint', 'dump'],
        ['Kint\\Kint', 'trace'],
        ['Kint\\Kint', 'dumpArray'],
    ];

    /**
     * @var array<mixed, string> Array of modes to renderer class names
     */
    public static $renderers = [
        self::MODE_RICH => 'Kint\\Renderer\\RichRenderer',
        self::MODE_PLAIN => 'Kint\\Renderer\\PlainRenderer',
        self::MODE_TEXT => 'Kint\\Renderer\\TextRenderer',
        self::MODE_CLI => 'Kint\\Renderer\\CliRenderer',
    ];

    public static $plugins = [
        'Kint\\Parser\\ArrayLimitPlugin',
        'Kint\\Parser\\ArrayObjectPlugin',
        'Kint\\Parser\\Base64Plugin',
        'Kint\\Parser\\BlacklistPlugin',
        'Kint\\Parser\\ClassMethodsPlugin',
        'Kint\\Parser\\ClassStaticsPlugin',
        'Kint\\Parser\\ClosurePlugin',
        'Kint\\Parser\\ColorPlugin',
        'Kint\\Parser\\DateTimePlugin',
        'Kint\\Parser\\FsPathPlugin',
        'Kint\\Parser\\IteratorPlugin',
        'Kint\\Parser\\JsonPlugin',
        'Kint\\Parser\\MicrotimePlugin',
        'Kint\\Parser\\SimpleXMLElementPlugin',
        'Kint\\Parser\\SplFileInfoPlugin',
        'Kint\\Parser\\SplObjectStoragePlugin',
        'Kint\\Parser\\StreamPlugin',
        'Kint\\Parser\\TablePlugin',
        'Kint\\Parser\\ThrowablePlugin',
        'Kint\\Parser\\TimestampPlugin',
        'Kint\\Parser\\TracePlugin',
        'Kint\\Parser\\XmlPlugin',
    ];

    protected static $plugin_pool = [];

    protected $parser;
    protected $renderer;

    public function __construct(Parser $p, Renderer $r)
    {
        $this->parser = $p;
        $this->renderer = $r;
    }

    public function setParser(Parser $p)
    {
        $this->parser = $p;
    }

    public function getParser()
    {
        return $this->parser;
    }

    public function setRenderer(Renderer $r)
    {
        $this->renderer = $r;
    }

    public function getRenderer()
    {
        return $this->renderer;
    }

    public function setStatesFromStatics(array $statics)
    {
        $this->renderer->setStatics($statics);

        $this->parser->setDepthLimit(isset($statics['max_depth']) ? $statics['max_depth'] : false);
        $this->parser->clearPlugins();

        if (!isset($statics['plugins'])) {
            return;
        }

        $plugins = [];

        foreach ($statics['plugins'] as $plugin) {
            if ($plugin instanceof Plugin) {
                $plugins[] = $plugin;
            } elseif (\is_string($plugin) && \is_subclass_of($plugin, 'Kint\\Parser\\Plugin')) {
                if (!isset(static::$plugin_pool[$plugin])) {
                    /** @psalm-suppress UnsafeInstantiation */
                    $p = new $plugin();
                    static::$plugin_pool[$plugin] = $p;
                }
                $plugins[] = static::$plugin_pool[$plugin];
            }
        }

        $plugins = $this->renderer->filterParserPlugins($plugins);

        foreach ($plugins as $plugin) {
            $this->parser->addPlugin($plugin);
        }
    }

    public function setStatesFromCallInfo(array $info)
    {
        $this->renderer->setCallInfo($info);

        if (isset($info['modifiers']) && \is_array($info['modifiers']) && \in_array('+', $info['modifiers'], true)) {
            $this->parser->setDepthLimit(false);
        }

        $this->parser->setCallerClass(isset($info['caller']['class']) ? $info['caller']['class'] : null);
    }

    /**
     * Renders a list of vars including the pre and post renders.
     *
     * @param array $vars Data to dump
     * @param array $base Base Zval\Value objects
     *
     * @return string
     */
    public function dumpAll(array $vars, array $base)
    {
        if (\array_keys($vars) !== \array_keys($base)) {
            throw new InvalidArgumentException('Kint::dumpAll requires arrays of identical size and keys as arguments');
        }

        $output = $this->renderer->preRender();

        if ([] === $vars) {
            $output .= $this->renderer->renderNothing();
        }

        foreach ($vars as $key => $arg) {
            if (!$base[$key] instanceof Value) {
                throw new InvalidArgumentException('Kint::dumpAll requires all elements of the second argument to be Value instances');
            }
            $output .= $this->dumpVar($arg, $base[$key]);
        }

        $output .= $this->renderer->postRender();

        return $output;
    }

    /**
     * Dumps and renders a var.
     *
     * @param mixed $var  Data to dump
     * @param Value $base Base object
     *
     * @return string
     */
    public function dumpVar(&$var, Value $base)
    {
        return $this->renderer->render(
            $this->parser->parse($var, $base)
        );
    }

    /**
     * Gets all static settings at once.
     *
     * @return array Current static settings
     */
    public static function getStatics()
    {
        return [
            'aliases' => static::$aliases,
            'app_root_dirs' => static::$app_root_dirs,
            'cli_detection' => static::$cli_detection,
            'display_called_from' => static::$display_called_from,
            'enabled_mode' => static::$enabled_mode,
            'expanded' => static::$expanded,
            'file_link_format' => static::$file_link_format,
            'max_depth' => static::$max_depth,
            'mode_default' => static::$mode_default,
            'mode_default_cli' => static::$mode_default_cli,
            'plugins' => static::$plugins,
            'renderers' => static::$renderers,
            'return' => static::$return,
        ];
    }

    /**
     * Creates a Kint instances based on static settings.
     *
     * Also calls setStatesFromStatics for you
     *
     * @param array $statics array of statics as returned by getStatics
     *
     * @return null|\Kint\Kint
     */
    public static function createFromStatics(array $statics)
    {
        $mode = false;

        if (isset($statics['enabled_mode'])) {
            $mode = $statics['enabled_mode'];

            if (true === $mode && isset($statics['mode_default'])) {
                $mode = $statics['mode_default'];

                if (PHP_SAPI === 'cli' && !empty($statics['cli_detection']) && isset($statics['mode_default_cli'])) {
                    $mode = $statics['mode_default_cli'];
                }
            }
        }

        if (false === $mode) {
            return null;
        }

        if (!isset($statics['renderers'][$mode])) {
            $renderer = new TextRenderer();
        } else {
            /** @var Renderer */
            $renderer = new $statics['renderers'][$mode]();
        }

        /** @psalm-suppress UnsafeInstantiation */
        return new static(new Parser(), $renderer);
    }

    /**
     * Creates base objects given parameter info.
     *
     * @param array $params Parameters as returned from getCallInfo
     * @param int   $argc   Number of arguments the helper was called with
     *
     * @return Value[] Base objects for the arguments
     */
    public static function getBasesFromParamInfo(array $params, $argc)
    {
        static $blacklist = [
            'null',
            'true',
            'false',
            'array(...)',
            'array()',
            '[...]',
            '[]',
            '(...)',
            '()',
            '"..."',
            'b"..."',
            "'...'",
            "b'...'",
        ];

        $params = \array_values($params);
        $bases = [];

        for ($i = 0; $i < $argc; ++$i) {
            if (isset($params[$i])) {
                $param = $params[$i];
            } else {
                $param = null;
            }

            if (!isset($param['name']) || \is_numeric($param['name'])) {
                $name = null;
            } elseif (\in_array(\strtolower($param['name']), $blacklist, true)) {
                $name = null;
            } else {
                $name = $param['name'];
            }

            if (isset($param['path'])) {
                $access_path = $param['path'];

                if (!empty($param['expression'])) {
                    $access_path = '('.$access_path.')';
                }
            } else {
                $access_path = '$'.$i;
            }

            $bases[] = Value::blank($name, $access_path);
        }

        return $bases;
    }

    /**
     * Gets call info from the backtrace, alias, and argument count.
     *
     * Aliases must be normalized beforehand (Utils::normalizeAliases)
     *
     * @param array   $aliases Call aliases as found in Kint::$aliases
     * @param array[] $trace   Backtrace
     * @param int     $argc    Number of arguments
     *
     * @return array{params:null|array, modifiers:array, callee:null|array, caller:null|array, trace:array[]} Call info
     */
    public static function getCallInfo(array $aliases, array $trace, $argc)
    {
        $found = false;
        $callee = null;
        $caller = null;
        $miniTrace = [];

        foreach ($trace as $index => $frame) {
            if (Utils::traceFrameIsListed($frame, $aliases)) {
                $found = true;
                $miniTrace = [];
            }

            if (!Utils::traceFrameIsListed($frame, ['spl_autoload_call'])) {
                $miniTrace[] = $frame;
            }
        }

        if ($found) {
            $callee = \reset($miniTrace) ?: null;
            $caller = \next($miniTrace) ?: null;
        }

        foreach ($miniTrace as $index => $frame) {
            if ((0 === $index && $callee === $frame) || isset($frame['file'], $frame['line'])) {
                unset($frame['object'], $frame['args']);
                $miniTrace[$index] = $frame;
            } else {
                unset($miniTrace[$index]);
            }
        }

        $miniTrace = \array_values($miniTrace);

        $call = static::getSingleCall($callee ?: [], $argc);

        $ret = [
            'params' => null,
            'modifiers' => [],
            'callee' => $callee,
            'caller' => $caller,
            'trace' => $miniTrace,
        ];

        if ($call) {
            $ret['params'] = $call['parameters'];
            $ret['modifiers'] = $call['modifiers'];
        }

        return $ret;
    }

    /**
     * Dumps a backtrace.
     *
     * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace(true))
     *
     * @return int|string
     */
    public static function trace()
    {
        if (false === static::$enabled_mode) {
            return 0;
        }

        Utils::normalizeAliases(static::$aliases);

        $call_info = static::getCallInfo(static::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \func_num_args());

        $statics = static::getStatics();

        if (\in_array('~', $call_info['modifiers'], true)) {
            $statics['enabled_mode'] = static::MODE_TEXT;
        }

        $kintstance = static::createFromStatics($statics);
        if (!$kintstance) {
            // Should never happen
            return 0; // @codeCoverageIgnore
        }

        if (\in_array('-', $call_info['modifiers'], true)) {
            while (\ob_get_level()) {
                \ob_end_clean();
            }
        }

        $kintstance->setStatesFromStatics($statics);
        $kintstance->setStatesFromCallInfo($call_info);

        $trimmed_trace = [];
        $trace = \debug_backtrace(true);

        foreach ($trace as $frame) {
            if (Utils::traceFrameIsListed($frame, static::$aliases)) {
                $trimmed_trace = [];
            }

            $trimmed_trace[] = $frame;
        }

        \array_shift($trimmed_trace);

        $output = $kintstance->dumpAll(
            [$trimmed_trace],
            [Value::blank('Kint\\Kint::trace()', 'debug_backtrace(true)')]
        );

        if (static::$return || \in_array('@', $call_info['modifiers'], true)) {
            return $output;
        }

        echo $output;

        if (\in_array('-', $call_info['modifiers'], true)) {
            \flush(); // @codeCoverageIgnore
        }

        return 0;
    }

    /**
     * Dumps some data.
     *
     * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace(true))
     *
     * @return int|string
     */
    public static function dump()
    {
        if (false === static::$enabled_mode) {
            return 0;
        }

        Utils::normalizeAliases(static::$aliases);

        $args = \func_get_args();

        $call_info = static::getCallInfo(static::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \count($args));

        $statics = static::getStatics();

        if (\in_array('~', $call_info['modifiers'], true)) {
            $statics['enabled_mode'] = static::MODE_TEXT;
        }

        $kintstance = static::createFromStatics($statics);
        if (!$kintstance) {
            // Should never happen
            return 0; // @codeCoverageIgnore
        }

        if (\in_array('-', $call_info['modifiers'], true)) {
            while (\ob_get_level()) {
                \ob_end_clean();
            }
        }

        $kintstance->setStatesFromStatics($statics);
        $kintstance->setStatesFromCallInfo($call_info);

        $bases = static::getBasesFromParamInfo(
            isset($call_info['params']) ? $call_info['params'] : [],
            \count($args)
        );
        $output = $kintstance->dumpAll($args, $bases);

        if (static::$return || \in_array('@', $call_info['modifiers'], true)) {
            return $output;
        }

        echo $output;

        if (\in_array('-', $call_info['modifiers'], true)) {
            \flush(); // @codeCoverageIgnore
        }

        return 0;
    }

    /**
     * generic path display callback, can be configured in app_root_dirs; purpose is
     * to show relevant path info and hide as much of the path as possible.
     *
     * @param string $file
     *
     * @return string
     */
    public static function shortenPath($file)
    {
        $file = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $file)), 'strlen'));

        $longest_match = 0;
        $match = '/';

        foreach (static::$app_root_dirs as $path => $alias) {
            if (empty($path)) {
                continue;
            }

            $path = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $path)), 'strlen'));

            if (\array_slice($file, 0, \count($path)) === $path && \count($path) > $longest_match) {
                $longest_match = \count($path);
                $match = $alias;
            }
        }

        if ($longest_match) {
            $file = \array_merge([$match], \array_slice($file, $longest_match));

            return \implode('/', $file);
        }

        // fallback to find common path with Kint dir
        $kint = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', KINT_DIR)), 'strlen'));

        foreach ($file as $i => $part) {
            if (!isset($kint[$i]) || $kint[$i] !== $part) {
                return ($i ? '.../' : '/').\implode('/', \array_slice($file, $i));
            }
        }

        return '/'.\implode('/', $file);
    }

    public static function getIdeLink($file, $line)
    {
        return \str_replace(['%f', '%l'], [$file, $line], static::$file_link_format);
    }

    /**
     * Returns specific function call info from a stack trace frame, or null if no match could be found.
     *
     * @param array $frame The stack trace frame in question
     * @param int   $argc  The amount of arguments received
     *
     * @return null|array{parameters:array, modifiers:array} params and modifiers, or null if a specific call could not be determined
     */
    protected static function getSingleCall(array $frame, $argc)
    {
        if (!isset($frame['file'], $frame['line'], $frame['function']) || !\is_readable($frame['file'])) {
            return null;
        }

        if (empty($frame['class'])) {
            $callfunc = $frame['function'];
        } else {
            $callfunc = [$frame['class'], $frame['function']];
        }

        $calls = CallFinder::getFunctionCalls(
            \file_get_contents($frame['file']),
            $frame['line'],
            $callfunc
        );

        $return = null;

        foreach ($calls as $call) {
            $is_unpack = false;

            // Handle argument unpacking as a last resort
            foreach ($call['parameters'] as $i => &$param) {
                if (0 === \strpos($param['name'], '...')) {
                    if ($i < $argc && $i === \count($call['parameters']) - 1) {
                        for ($j = 1; $j + $i < $argc; ++$j) {
                            $call['parameters'][] = [
                                'name' => 'array_values('.\substr($param['name'], 3).')['.$j.']',
                                'path' => 'array_values('.\substr($param['path'], 3).')['.$j.']',
                                'expression' => false,
                            ];
                        }

                        $param['name'] = 'reset('.\substr($param['name'], 3).')';
                        $param['path'] = 'reset('.\substr($param['path'], 3).')';
                        $param['expression'] = false;
                    } else {
                        $call['parameters'] = \array_slice($call['parameters'], 0, $i);
                    }

                    $is_unpack = true;
                    break;
                }

                if ($i >= $argc) {
                    continue 2;
                }
            }

            if ($is_unpack || \count($call['parameters']) === $argc) {
                if (null === $return) {
                    $return = $call;
                } else {
                    // If we have multiple calls on the same line with the same amount of arguments,
                    // we can't be sure which it is so just return null and let them figure it out
                    return null;
                }
            }
        }

        return $return;
    }
}
PKW�1\�0f6A6A'vendor/kint-php/kint/src/CallFinder.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint;

class CallFinder
{
    private static $ignore = [
        T_CLOSE_TAG => true,
        T_COMMENT => true,
        T_DOC_COMMENT => true,
        T_INLINE_HTML => true,
        T_OPEN_TAG => true,
        T_OPEN_TAG_WITH_ECHO => true,
        T_WHITESPACE => true,
    ];

    /**
     * Things we need to do specially for operator tokens:
     * - Refuse to strip spaces around them
     * - Wrap the access path in parentheses if there
     *   are any of these in the final short parameter.
     */
    private static $operator = [
        T_AND_EQUAL => true,
        T_BOOLEAN_AND => true,
        T_BOOLEAN_OR => true,
        T_ARRAY_CAST => true,
        T_BOOL_CAST => true,
        T_CLASS => true,
        T_CLONE => true,
        T_CONCAT_EQUAL => true,
        T_DEC => true,
        T_DIV_EQUAL => true,
        T_DOUBLE_CAST => true,
        T_FUNCTION => true,
        T_INC => true,
        T_INCLUDE => true,
        T_INCLUDE_ONCE => true,
        T_INSTANCEOF => true,
        T_INT_CAST => true,
        T_IS_EQUAL => true,
        T_IS_GREATER_OR_EQUAL => true,
        T_IS_IDENTICAL => true,
        T_IS_NOT_EQUAL => true,
        T_IS_NOT_IDENTICAL => true,
        T_IS_SMALLER_OR_EQUAL => true,
        T_LOGICAL_AND => true,
        T_LOGICAL_OR => true,
        T_LOGICAL_XOR => true,
        T_MINUS_EQUAL => true,
        T_MOD_EQUAL => true,
        T_MUL_EQUAL => true,
        T_NEW => true,
        T_OBJECT_CAST => true,
        T_OR_EQUAL => true,
        T_PLUS_EQUAL => true,
        T_REQUIRE => true,
        T_REQUIRE_ONCE => true,
        T_SL => true,
        T_SL_EQUAL => true,
        T_SR => true,
        T_SR_EQUAL => true,
        T_STRING_CAST => true,
        T_UNSET_CAST => true,
        T_XOR_EQUAL => true,
        T_POW => true,
        T_POW_EQUAL => true,
        T_DOUBLE_ARROW => true,
        '!' => true,
        '%' => true,
        '&' => true,
        '*' => true,
        '+' => true,
        '-' => true,
        '.' => true,
        '/' => true,
        ':' => true,
        '<' => true,
        '=' => true,
        '>' => true,
        '?' => true,
        '^' => true,
        '|' => true,
        '~' => true,
    ];

    private static $strip = [
        '(' => true,
        ')' => true,
        '[' => true,
        ']' => true,
        '{' => true,
        '}' => true,
        T_OBJECT_OPERATOR => true,
        T_DOUBLE_COLON => true,
        T_NS_SEPARATOR => true,
    ];

    private static $classcalls = [
        T_DOUBLE_COLON => true,
        T_OBJECT_OPERATOR => true,
    ];

    private static $namespace = [
        T_STRING => true,
    ];

    public static function getFunctionCalls($source, $line, $function)
    {
        static $up = [
            '(' => true,
            '[' => true,
            '{' => true,
            T_CURLY_OPEN => true,
            T_DOLLAR_OPEN_CURLY_BRACES => true,
        ];
        static $down = [
            ')' => true,
            ']' => true,
            '}' => true,
        ];
        static $modifiers = [
            '!' => true,
            '@' => true,
            '~' => true,
            '+' => true,
            '-' => true,
        ];
        static $identifier = [
            T_DOUBLE_COLON => true,
            T_STRING => true,
            T_NS_SEPARATOR => true,
        ];

        if (KINT_PHP70) {
            self::$operator[T_SPACESHIP] = true;
        }

        if (KINT_PHP74) {
            self::$operator[T_COALESCE_EQUAL] = true;
        }

        if (KINT_PHP80) {
            $up[T_ATTRIBUTE] = true; // @codeCoverageIgnore
            self::$operator[T_MATCH] = true; // @codeCoverageIgnore
            self::$strip[T_NULLSAFE_OBJECT_OPERATOR] = true; // @codeCoverageIgnore
            self::$classcalls[T_NULLSAFE_OBJECT_OPERATOR] = true; // @codeCoverageIgnore
            self::$namespace[T_NAME_FULLY_QUALIFIED] = true; // @codeCoverageIgnore
            self::$namespace[T_NAME_QUALIFIED] = true; // @codeCoverageIgnore
            self::$namespace[T_NAME_RELATIVE] = true; // @codeCoverageIgnore
            $identifier[T_NAME_FULLY_QUALIFIED] = true; // @codeCoverageIgnore
            $identifier[T_NAME_QUALIFIED] = true; // @codeCoverageIgnore
            $identifier[T_NAME_RELATIVE] = true; // @codeCoverageIgnore
        }

        $tokens = \token_get_all($source);
        $cursor = 1;
        $function_calls = [];
        // Performance optimization preventing backwards loops
        $prev_tokens = [null, null, null];

        if (\is_array($function)) {
            $class = \explode('\\', $function[0]);
            $class = \strtolower(\end($class));
            $function = \strtolower($function[1]);
        } else {
            $class = null;
            $function = \strtolower($function);
        }

        // Loop through tokens
        foreach ($tokens as $index => $token) {
            if (!\is_array($token)) {
                continue;
            }

            // Count newlines for line number instead of using $token[2]
            // since certain situations (String tokens after whitespace) may
            // not have the correct line number unless you do this manually
            $cursor += \substr_count($token[1], "\n");
            if ($cursor > $line) {
                break;
            }

            // Store the last real tokens for later
            if (isset(self::$ignore[$token[0]])) {
                continue;
            }

            $prev_tokens = [$prev_tokens[1], $prev_tokens[2], $token];

            // Check if it's the right type to be the function we're looking for
            if (!isset(self::$namespace[$token[0]])) {
                continue;
            }

            $ns = \explode('\\', \strtolower($token[1]));

            if (\end($ns) !== $function) {
                continue;
            }

            // Check if it's a function call
            $nextReal = self::realTokenIndex($tokens, $index);
            if (!isset($nextReal, $tokens[$nextReal]) || '(' !== $tokens[$nextReal]) {
                continue;
            }

            // Check if it matches the signature
            if (null === $class) {
                if ($prev_tokens[1] && isset(self::$classcalls[$prev_tokens[1][0]])) {
                    continue;
                }
            } else {
                if (!$prev_tokens[1] || T_DOUBLE_COLON !== $prev_tokens[1][0]) {
                    continue;
                }

                if (!$prev_tokens[0] || !isset(self::$namespace[$prev_tokens[0][0]])) {
                    continue;
                }

                if (isset($prev_tokens[0][1])) {
                    $ns = \explode('\\', \strtolower($prev_tokens[0][1]));
                } else {
                    $ns = [''];
                }

                if (\end($ns) !== $class) {
                    continue;
                }
            }

            $inner_cursor = $cursor;
            $depth = 1; // The depth respective to the function call
            $offset = $nextReal + 1; // The start of the function call
            $instring = false; // Whether we're in a string or not
            $realtokens = false; // Whether the current scope contains anything meaningful or not
            $paramrealtokens = false; // Whether the current parameter contains anything meaningful
            $params = []; // All our collected parameters
            $shortparam = []; // The short version of the parameter
            $param_start = $offset; // The distance to the start of the parameter

            // Loop through the following tokens until the function call ends
            while (isset($tokens[$offset])) {
                $token = $tokens[$offset];

                // Ensure that the $inner_cursor is correct and
                // that $token is either a T_ constant or a string
                if (\is_array($token)) {
                    $inner_cursor += \substr_count($token[1], "\n");
                }

                if (!isset(self::$ignore[$token[0]]) && !isset($down[$token[0]])) {
                    $paramrealtokens = $realtokens = true;
                }

                // If it's a token that makes us to up a level, increase the depth
                if (isset($up[$token[0]])) {
                    if (1 === $depth) {
                        $shortparam[] = $token;
                        $realtokens = false;
                    }

                    ++$depth;
                } elseif (isset($down[$token[0]])) {
                    --$depth;

                    // If this brings us down to the parameter level, and we've had
                    // real tokens since going up, fill the $shortparam with an ellipsis
                    if (1 === $depth) {
                        if ($realtokens) {
                            $shortparam[] = '...';
                        }
                        $shortparam[] = $token;
                    }
                } elseif ('"' === $token[0]) {
                    // Strings use the same symbol for up and down, but we can
                    // only ever be inside one string, so just use a bool for that
                    if ($instring) {
                        --$depth;
                        if (1 === $depth) {
                            $shortparam[] = '...';
                        }
                    } else {
                        ++$depth;
                    }

                    $instring = !$instring;

                    $shortparam[] = '"';
                } elseif (1 === $depth) {
                    if (',' === $token[0]) {
                        $params[] = [
                            'full' => \array_slice($tokens, $param_start, $offset - $param_start),
                            'short' => $shortparam,
                        ];
                        $shortparam = [];
                        $paramrealtokens = false;
                        $param_start = $offset + 1;
                    } elseif (T_CONSTANT_ENCAPSED_STRING === $token[0] && \strlen($token[1]) > 2) {
                        $shortparam[] = $token[1][0].'...'.$token[1][0];
                    } else {
                        $shortparam[] = $token;
                    }
                }

                // Depth has dropped to 0 (So we've hit the closing paren)
                if ($depth <= 0) {
                    if ($paramrealtokens) {
                        $params[] = [
                            'full' => \array_slice($tokens, $param_start, $offset - $param_start),
                            'short' => $shortparam,
                        ];
                    }

                    break;
                }

                ++$offset;
            }

            // If we're not passed (or at) the line at the end
            // of the function call, we're too early so skip it
            if ($inner_cursor < $line) {
                continue;
            }

            // Format the final output parameters
            foreach ($params as &$param) {
                $name = self::tokensFormatted($param['short']);
                $expression = false;
                foreach ($name as $token) {
                    if (self::tokenIsOperator($token)) {
                        $expression = true;
                        break;
                    }
                }

                $param = [
                    'name' => self::tokensToString($name),
                    'path' => self::tokensToString(self::tokensTrim($param['full'])),
                    'expression' => $expression,
                ];
            }

            // Get the modifiers
            --$index;

            while (isset($tokens[$index])) {
                if (!isset(self::$ignore[$tokens[$index][0]]) && !isset($identifier[$tokens[$index][0]])) {
                    break;
                }

                --$index;
            }

            $mods = [];

            while (isset($tokens[$index])) {
                if (isset(self::$ignore[$tokens[$index][0]])) {
                    --$index;
                    continue;
                }

                if (isset($modifiers[$tokens[$index][0]])) {
                    $mods[] = $tokens[$index];
                    --$index;
                    continue;
                }

                break;
            }

            $function_calls[] = [
                'parameters' => $params,
                'modifiers' => $mods,
            ];
        }

        return $function_calls;
    }

    private static function realTokenIndex(array $tokens, $index)
    {
        ++$index;

        while (isset($tokens[$index])) {
            if (!isset(self::$ignore[$tokens[$index][0]])) {
                return $index;
            }

            ++$index;
        }

        return null;
    }

    /**
     * We need a separate method to check if tokens are operators because we
     * occasionally add "..." to short parameter versions. If we simply check
     * for `$token[0]` then "..." will incorrectly match the "." operator.
     *
     * @param array|string $token The token to check
     *
     * @return bool
     */
    private static function tokenIsOperator($token)
    {
        return '...' !== $token && isset(self::$operator[$token[0]]);
    }

    private static function tokensToString(array $tokens)
    {
        $out = '';

        foreach ($tokens as $token) {
            if (\is_string($token)) {
                $out .= $token;
            } elseif (\is_array($token)) {
                $out .= $token[1];
            }
        }

        return $out;
    }

    private static function tokensTrim(array $tokens)
    {
        foreach ($tokens as $index => $token) {
            if (isset(self::$ignore[$token[0]])) {
                unset($tokens[$index]);
            } else {
                break;
            }
        }

        $tokens = \array_reverse($tokens);

        foreach ($tokens as $index => $token) {
            if (isset(self::$ignore[$token[0]])) {
                unset($tokens[$index]);
            } else {
                break;
            }
        }

        return \array_reverse($tokens);
    }

    private static function tokensFormatted(array $tokens)
    {
        $space = false;
        $attribute = false;

        $tokens = self::tokensTrim($tokens);

        $output = [];
        $last = null;

        foreach ($tokens as $index => $token) {
            if (isset(self::$ignore[$token[0]])) {
                if ($space) {
                    continue;
                }

                $next = $tokens[self::realTokenIndex($tokens, $index)];

                /** @var array|string $last */
                if ($attribute && ']' === $last[0]) {
                    $attribute = false; // @codeCoverageIgnore
                } elseif (isset(self::$strip[$last[0]]) && !self::tokenIsOperator($next)) {
                    continue;
                }

                if (isset(self::$strip[$next[0]]) && $last && !self::tokenIsOperator($last)) {
                    continue;
                }

                $token = ' ';
                $space = true;
            } else {
                if (KINT_PHP80 && $last && T_ATTRIBUTE == $last[0]) {
                    $attribute = true; // @codeCoverageIgnore
                }

                $space = false;
                $last = $token;
            }

            $output[] = $token;
        }

        return $output;
    }
}
PKW�1\?
��3vendor/kint-php/kint/src/Renderer/PlainRenderer.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer;

use Kint\Kint;
use Kint\Zval\BlobValue;
use Kint\Zval\Value;

class PlainRenderer extends TextRenderer
{
    public static $pre_render_sources = [
        'script' => [
            ['Kint\\Renderer\\PlainRenderer', 'renderJs'],
            ['Kint\\Renderer\\Text\\MicrotimePlugin', 'renderJs'],
        ],
        'style' => [
            ['Kint\\Renderer\\PlainRenderer', 'renderCss'],
        ],
        'raw' => [],
    ];

    /**
     * Path to the CSS file to load by default.
     *
     * @var string
     */
    public static $theme = 'plain.css';

    /**
     * Output htmlentities instead of utf8.
     *
     * @var bool
     */
    public static $disable_utf8 = false;

    public static $needs_pre_render = true;

    public static $always_pre_render = false;

    protected $force_pre_render = false;
    protected $pre_render;

    public function __construct()
    {
        parent::__construct();

        $this->pre_render = self::$needs_pre_render;

        if (self::$always_pre_render) {
            $this->setPreRender(true);
        }
    }

    public function setCallInfo(array $info)
    {
        parent::setCallInfo($info);

        if (\in_array('@', $this->call_info['modifiers'], true)) {
            $this->setPreRender(true);
        }
    }

    public function setStatics(array $statics)
    {
        parent::setStatics($statics);

        if (!empty($statics['return'])) {
            $this->setPreRender(true);
        }
    }

    public function setPreRender($pre_render)
    {
        $this->pre_render = $pre_render;
        $this->force_pre_render = true;
    }

    public function getPreRender()
    {
        return $this->pre_render;
    }

    public function colorValue($string)
    {
        return '<i>'.$string.'</i>';
    }

    public function colorType($string)
    {
        return '<b>'.$string.'</b>';
    }

    public function colorTitle($string)
    {
        return '<u>'.$string.'</u>';
    }

    public function renderTitle(Value $o)
    {
        if (self::$disable_utf8) {
            return $this->utf8ToHtmlentity(parent::renderTitle($o));
        }

        return parent::renderTitle($o);
    }

    public function preRender()
    {
        $output = '';

        if ($this->pre_render) {
            foreach (self::$pre_render_sources as $type => $values) {
                $contents = '';
                foreach ($values as $v) {
                    $contents .= \call_user_func($v, $this);
                }

                if (!\strlen($contents)) {
                    continue;
                }

                switch ($type) {
                    case 'script':
                        $output .= '<script class="kint-plain-script">'.$contents.'</script>';
                        break;
                    case 'style':
                        $output .= '<style class="kint-plain-style">'.$contents.'</style>';
                        break;
                    default:
                        $output .= $contents;
                }
            }

            // Don't pre-render on every dump
            if (!$this->force_pre_render) {
                self::$needs_pre_render = false;
            }
        }

        return $output.'<div class="kint-plain">';
    }

    public function postRender()
    {
        if (self::$disable_utf8) {
            return $this->utf8ToHtmlentity(parent::postRender()).'</div>';
        }

        return parent::postRender().'</div>';
    }

    public function ideLink($file, $line)
    {
        $path = $this->escape(Kint::shortenPath($file)).':'.$line;
        $ideLink = Kint::getIdeLink($file, $line);

        if (!$ideLink) {
            return $path;
        }

        $class = '';

        if (\preg_match('/https?:\\/\\//i', $ideLink)) {
            $class = 'class="kint-ide-link" ';
        }

        return '<a '.$class.'href="'.$this->escape($ideLink).'">'.$path.'</a>';
    }

    public function escape($string, $encoding = false)
    {
        if (false === $encoding) {
            $encoding = BlobValue::detectEncoding($string);
        }

        $original_encoding = $encoding;

        if (false === $encoding || 'ASCII' === $encoding) {
            $encoding = 'UTF-8';
        }

        $string = \htmlspecialchars($string, ENT_NOQUOTES, $encoding);

        // this call converts all non-ASCII characters into numeirc htmlentities
        if (\function_exists('mb_encode_numericentity') && 'ASCII' !== $original_encoding) {
            $string = \mb_encode_numericentity($string, [0x80, 0xffff, 0, 0xffff], $encoding);
        }

        return $string;
    }

    protected function utf8ToHtmlentity($string)
    {
        return \str_replace(
            ['┌', '═', '┐', '│', '└', '─', '┘'],
            ['&#9484;', '&#9552;', '&#9488;', '&#9474;', '&#9492;', '&#9472;', '&#9496;'],
            $string
        );
    }

    protected static function renderJs()
    {
        return \file_get_contents(KINT_DIR.'/resources/compiled/shared.js').\file_get_contents(KINT_DIR.'/resources/compiled/plain.js');
    }

    protected static function renderCss()
    {
        if (\file_exists(KINT_DIR.'/resources/compiled/'.self::$theme)) {
            return \file_get_contents(KINT_DIR.'/resources/compiled/'.self::$theme);
        }

        return \file_get_contents(self::$theme);
    }
}
PKW�1\��p)�F�F2vendor/kint-php/kint/src/Renderer/RichRenderer.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer;

use Kint\Kint;
use Kint\Utils;
use Kint\Zval\BlobValue;
use Kint\Zval\InstanceValue;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

class RichRenderer extends Renderer
{
    /**
     * RichRenderer value plugins should implement Kint\Renderer\Rich\ValuePluginInterface.
     */
    public static $value_plugins = [
        'blacklist' => 'Kint\\Renderer\\Rich\\BlacklistPlugin',
        'callable' => 'Kint\\Renderer\\Rich\\CallablePlugin',
        'closure' => 'Kint\\Renderer\\Rich\\ClosurePlugin',
        'color' => 'Kint\\Renderer\\Rich\\ColorPlugin',
        'depth_limit' => 'Kint\\Renderer\\Rich\\DepthLimitPlugin',
        'elide' => 'Kint\\Renderer\\Rich\\ElidedPlugin',
        'recursion' => 'Kint\\Renderer\\Rich\\RecursionPlugin',
        'simplexml_element' => 'Kint\\Renderer\\Rich\\SimpleXMLElementPlugin',
        'trace_frame' => 'Kint\\Renderer\\Rich\\TraceFramePlugin',
    ];

    /**
     * RichRenderer tab plugins should implement Kint\Renderer\Rich\TabPluginInterface.
     */
    public static $tab_plugins = [
        'binary' => 'Kint\\Renderer\\Rich\\BinaryPlugin',
        'color' => 'Kint\\Renderer\\Rich\\ColorPlugin',
        'docstring' => 'Kint\\Renderer\\Rich\\DocstringPlugin',
        'microtime' => 'Kint\\Renderer\\Rich\\MicrotimePlugin',
        'source' => 'Kint\\Renderer\\Rich\\SourcePlugin',
        'table' => 'Kint\\Renderer\\Rich\\TablePlugin',
        'timestamp' => 'Kint\\Renderer\\Rich\\TimestampPlugin',
    ];

    public static $pre_render_sources = [
        'script' => [
            ['Kint\\Renderer\\RichRenderer', 'renderJs'],
            ['Kint\\Renderer\\Rich\\MicrotimePlugin', 'renderJs'],
        ],
        'style' => [
            ['Kint\\Renderer\\RichRenderer', 'renderCss'],
        ],
        'raw' => [],
    ];

    /**
     * Whether or not to render access paths.
     *
     * Access paths can become incredibly heavy with very deep and wide
     * structures. Given mostly public variables it will typically make
     * up one quarter of the output HTML size.
     *
     * If this is an unacceptably large amount and your browser is groaning
     * under the weight of the access paths - your first order of buisiness
     * should be to get a new browser. Failing that, use this to turn them off.
     *
     * @var bool
     */
    public static $access_paths = true;

    /**
     * The maximum length of a string before it is truncated.
     *
     * Falsey to disable
     *
     * @var int
     */
    public static $strlen_max = 80;

    /**
     * Path to the CSS file to load by default.
     *
     * @var string
     */
    public static $theme = 'original.css';

    /**
     * Assume types and sizes don't need to be escaped.
     *
     * Turn this off if you use anything but ascii in your class names,
     * but it'll cause a slowdown of around 10%
     *
     * @var bool
     */
    public static $escape_types = false;

    /**
     * Move all dumps to a folder at the bottom of the body.
     *
     * @var bool
     */
    public static $folder = false;

    /**
     * Sort mode for object properties.
     *
     * @var int
     */
    public static $sort = self::SORT_NONE;

    public static $needs_pre_render = true;
    public static $needs_folder_render = true;

    public static $always_pre_render = false;

    protected $plugin_objs = [];
    protected $expand = false;
    protected $force_pre_render = false;
    protected $pre_render;
    protected $use_folder;

    public function __construct()
    {
        $this->pre_render = self::$needs_pre_render;
        $this->use_folder = self::$folder;

        if (self::$always_pre_render) {
            $this->setForcePreRender();
        }
    }

    public function setCallInfo(array $info)
    {
        parent::setCallInfo($info);

        if (\in_array('!', $this->call_info['modifiers'], true)) {
            $this->setExpand(true);
            $this->use_folder = false;
        }

        if (\in_array('@', $this->call_info['modifiers'], true)) {
            $this->setForcePreRender();
        }
    }

    public function setStatics(array $statics)
    {
        parent::setStatics($statics);

        if (!empty($statics['expanded'])) {
            $this->setExpand(true);
        }

        if (!empty($statics['return'])) {
            $this->setForcePreRender();
        }
    }

    public function setExpand($expand)
    {
        $this->expand = $expand;
    }

    public function getExpand()
    {
        return $this->expand;
    }

    public function setForcePreRender()
    {
        $this->force_pre_render = true;
        $this->pre_render = true;
    }

    public function setPreRender($pre_render)
    {
        $this->setForcePreRender(); // TODO: Remove line in next major version
        $this->pre_render = $pre_render;
    }

    public function getPreRender()
    {
        return $this->pre_render;
    }

    public function setUseFolder($use_folder)
    {
        $this->use_folder = $use_folder;
    }

    public function getUseFolder()
    {
        return $this->use_folder;
    }

    public function render(Value $o)
    {
        if ($plugin = $this->getPlugin(self::$value_plugins, $o->hints)) {
            if (\strlen($output = $plugin->renderValue($o))) {
                return $output;
            }
        }

        $children = $this->renderChildren($o);
        $header = $this->renderHeaderWrapper($o, (bool) \strlen($children), $this->renderHeader($o));

        return '<dl>'.$header.$children.'</dl>';
    }

    public function renderNothing()
    {
        return '<dl><dt><var>No argument</var></dt></dl>';
    }

    public function renderHeaderWrapper(Value $o, $has_children, $contents)
    {
        $out = '<dt';

        if ($has_children) {
            $out .= ' class="kint-parent';

            if ($this->expand) {
                $out .= ' kint-show';
            }

            $out .= '"';
        }

        $out .= '>';

        if (self::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) {
            $out .= '<span class="kint-access-path-trigger" title="Show access path">&rlarr;</span>';
        }

        if ($has_children) {
            $out .= '<span class="kint-popup-trigger" title="Open in new window">&boxbox;</span>';

            if (0 === $o->depth) {
                $out .= '<span class="kint-search-trigger" title="Show search box">&telrec;</span>';
                $out .= '<input type="text" class="kint-search" value="">';
            }

            $out .= '<nav></nav>';
        }

        $out .= $contents;

        if (!empty($ap)) {
            $out .= '<div class="access-path">'.$this->escape($ap).'</div>';
        }

        return $out.'</dt>';
    }

    public function renderHeader(Value $o)
    {
        $output = '';

        if (null !== ($s = $o->getModifiers())) {
            $output .= '<var>'.$s.'</var> ';
        }

        if (null !== ($s = $o->getName())) {
            $output .= '<dfn>'.$this->escape($s).'</dfn> ';

            if ($s = $o->getOperator()) {
                $output .= $this->escape($s, 'ASCII').' ';
            }
        }

        if (null !== ($s = $o->getType())) {
            if (self::$escape_types) {
                $s = $this->escape($s);
            }

            if ($o->reference) {
                $s = '&amp;'.$s;
            }

            $output .= '<var>'.$s.'</var> ';
        }

        if (null !== ($s = $o->getSize())) {
            if (self::$escape_types) {
                $s = $this->escape($s);
            }
            $output .= '('.$s.') ';
        }

        if (null !== ($s = $o->getValueShort())) {
            $s = \preg_replace('/\\s+/', ' ', $s);

            if (self::$strlen_max) {
                $s = Utils::truncateString($s, self::$strlen_max);
            }

            $output .= $this->escape($s);
        }

        return \trim($output);
    }

    public function renderChildren(Value $o)
    {
        $contents = [];
        $tabs = [];

        foreach ($o->getRepresentations() as $rep) {
            $result = $this->renderTab($o, $rep);
            if (\strlen($result)) {
                $contents[] = $result;
                $tabs[] = $rep;
            }
        }

        if (empty($tabs)) {
            return '';
        }

        $output = '<dd>';

        if (1 === \count($tabs) && $tabs[0]->labelIsImplicit()) {
            $output .= \reset($contents);
        } else {
            $output .= '<ul class="kint-tabs">';

            foreach ($tabs as $i => $tab) {
                if (0 === $i) {
                    $output .= '<li class="kint-active-tab">';
                } else {
                    $output .= '<li>';
                }

                $output .= $this->escape($tab->getLabel()).'</li>';
            }

            $output .= '</ul><ul>';

            foreach ($contents as $tab) {
                $output .= '<li>'.$tab.'</li>';
            }

            $output .= '</ul>';
        }

        return $output.'</dd>';
    }

    public function preRender()
    {
        $output = '';

        if ($this->pre_render) {
            foreach (self::$pre_render_sources as $type => $values) {
                $contents = '';
                foreach ($values as $v) {
                    $contents .= \call_user_func($v, $this);
                }

                if (!\strlen($contents)) {
                    continue;
                }

                switch ($type) {
                    case 'script':
                        $output .= '<script class="kint-rich-script">'.$contents.'</script>';
                        break;
                    case 'style':
                        $output .= '<style class="kint-rich-style">'.$contents.'</style>';
                        break;
                    default:
                        $output .= $contents;
                }
            }

            // Don't pre-render on every dump
            if (!$this->force_pre_render) {
                self::$needs_pre_render = false;
            }
        }

        $output .= '<div class="kint-rich';

        if ($this->use_folder) {
            $output .= ' kint-file';

            if (self::$needs_folder_render || $this->force_pre_render) {
                $output = $this->renderFolder().$output;

                if (!$this->force_pre_render) {
                    self::$needs_folder_render = false;
                }
            }
        }

        $output .= '">';

        return $output;
    }

    public function postRender()
    {
        if (!$this->show_trace) {
            return '</div>';
        }

        $output = '<footer>';
        $output .= '<span class="kint-popup-trigger" title="Open in new window">&boxbox;</span> ';

        if (!empty($this->call_info['trace']) && \count($this->call_info['trace']) > 1) {
            $output .= '<nav></nav>';
        }

        if (isset($this->call_info['callee']['file'])) {
            $output .= 'Called from '.$this->ideLink(
                $this->call_info['callee']['file'],
                $this->call_info['callee']['line']
            );
        }

        if (isset($this->call_info['callee']['function']) && (
                !empty($this->call_info['callee']['class']) ||
                !\in_array(
                    $this->call_info['callee']['function'],
                    ['include', 'include_once', 'require', 'require_once'],
                    true
                )
            )
        ) {
            $output .= ' [';
            if (isset($this->call_info['callee']['class'])) {
                $output .= $this->call_info['callee']['class'];
            }
            if (isset($this->call_info['callee']['type'])) {
                $output .= $this->call_info['callee']['type'];
            }
            $output .= $this->call_info['callee']['function'].'()]';
        }

        if (!empty($this->call_info['trace']) && \count($this->call_info['trace']) > 1) {
            $output .= '<ol>';
            foreach ($this->call_info['trace'] as $index => $step) {
                if (!$index) {
                    continue;
                }

                $output .= '<li>'.$this->ideLink($step['file'], $step['line']); // closing tag not required
                if (isset($step['function'])
                    && !\in_array($step['function'], ['include', 'include_once', 'require', 'require_once'], true)
                ) {
                    $output .= ' [';
                    if (isset($step['class'])) {
                        $output .= $step['class'];
                    }
                    if (isset($step['type'])) {
                        $output .= $step['type'];
                    }
                    $output .= $step['function'].'()]';
                }
            }
            $output .= '</ol>';
        }

        $output .= '</footer></div>';

        return $output;
    }

    public function escape($string, $encoding = false)
    {
        if (false === $encoding) {
            $encoding = BlobValue::detectEncoding($string);
        }

        $original_encoding = $encoding;

        if (false === $encoding || 'ASCII' === $encoding) {
            $encoding = 'UTF-8';
        }

        $string = \htmlspecialchars($string, ENT_NOQUOTES, $encoding);

        // this call converts all non-ASCII characters into numeirc htmlentities
        if (\function_exists('mb_encode_numericentity') && 'ASCII' !== $original_encoding) {
            $string = \mb_encode_numericentity($string, [0x80, 0xffff, 0, 0xffff], $encoding);
        }

        return $string;
    }

    public function ideLink($file, $line)
    {
        $path = $this->escape(Kint::shortenPath($file)).':'.$line;
        $ideLink = Kint::getIdeLink($file, $line);

        if (!$ideLink) {
            return $path;
        }

        $class = '';

        if (\preg_match('/https?:\\/\\//i', $ideLink)) {
            $class = 'class="kint-ide-link" ';
        }

        return '<a '.$class.'href="'.$this->escape($ideLink).'">'.$path.'</a>';
    }

    protected function renderTab(Value $o, Representation $rep)
    {
        if ($plugin = $this->getPlugin(self::$tab_plugins, $rep->hints)) {
            if (\strlen($output = $plugin->renderTab($rep))) {
                return $output;
            }
        }

        if (\is_array($rep->contents)) {
            $output = '';

            if ($o instanceof InstanceValue && 'properties' === $rep->getName()) {
                foreach (self::sortProperties($rep->contents, self::$sort) as $obj) {
                    $output .= $this->render($obj);
                }
            } else {
                foreach ($rep->contents as $obj) {
                    $output .= $this->render($obj);
                }
            }

            return $output;
        }

        if (\is_string($rep->contents)) {
            $show_contents = false;

            // If it is the value representation of a string and its whitespace
            // was truncated in the header, always display the full string
            if ('string' !== $o->type || $o->value !== $rep) {
                $show_contents = true;
            } else {
                if (\preg_match('/(:?[\\r\\n\\t\\f\\v]| {2})/', $rep->contents)) {
                    $show_contents = true;
                } elseif (self::$strlen_max && BlobValue::strlen($o->getValueShort()) > self::$strlen_max) {
                    $show_contents = true;
                }

                if (empty($o->encoding)) {
                    $show_contents = false;
                }
            }

            if ($show_contents) {
                return '<pre>'.$this->escape($rep->contents)."\n</pre>";
            }
        }

        if ($rep->contents instanceof Value) {
            return $this->render($rep->contents);
        }
    }

    protected function getPlugin(array $plugins, array $hints)
    {
        if ($plugins = $this->matchPlugins($plugins, $hints)) {
            $plugin = \end($plugins);

            if (!isset($this->plugin_objs[$plugin])) {
                $this->plugin_objs[$plugin] = new $plugin($this);
            }

            return $this->plugin_objs[$plugin];
        }
    }

    protected static function renderJs()
    {
        return \file_get_contents(KINT_DIR.'/resources/compiled/shared.js').\file_get_contents(KINT_DIR.'/resources/compiled/rich.js');
    }

    protected static function renderCss()
    {
        if (\file_exists(KINT_DIR.'/resources/compiled/'.self::$theme)) {
            return \file_get_contents(KINT_DIR.'/resources/compiled/'.self::$theme);
        }

        return \file_get_contents(self::$theme);
    }

    protected static function renderFolder()
    {
        return '<div class="kint-rich kint-folder"><dl><dt class="kint-parent"><nav></nav>Kint</dt><dd class="kint-foldout"></dd></dl></div>';
    }
}
PKW�1\f���8vendor/kint-php/kint/src/Renderer/Rich/ClosurePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Kint;
use Kint\Zval\ClosureValue;
use Kint\Zval\Value;

class ClosurePlugin extends Plugin implements ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        $children = $this->renderer->renderChildren($o);

        if (!($o instanceof ClosureValue)) {
            $header = $this->renderer->renderHeader($o);
        } else {
            $header = '';

            if (null !== ($s = $o->getModifiers())) {
                $header .= '<var>'.$s.'</var> ';
            }

            if (null !== ($s = $o->getName())) {
                $header .= '<dfn>'.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')</dfn> ';
            }

            $header .= '<var>Closure</var> ';
            $header .= $this->renderer->escape(Kint::shortenPath($o->filename)).':'.(int) $o->startline;
        }

        $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header);

        return '<dl>'.$header.$children.'</dl>';
    }
}
PKW�1\t����7vendor/kint-php/kint/src/Renderer/Rich/ElidedPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\ElidedValues;
use Kint\Zval\Value;

class ElidedPlugin extends Plugin implements ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        if ($s = $o->getSize()) {
            $header = $this->renderer->renderHeaderWrapper(
                $o,
                true,
                '<var>Elided</var> '.$s.' values'
            );
        } else {
            $header = $this->renderer->renderHeaderWrapper($o, true, '<var>Elided</var>');
        }

        if ($o instanceof ElidedValues && null !== $o->description) {
            $children = '<dd><pre>'.\implode('<br>', (array) $o->description).'</pre></dd>';
        } else {
            $children = '';
        }

        return '<dl>'.$header.$children.'</dl>';
    }
}
PKW�1\��S1XX?vendor/kint-php/kint/src/Renderer/Rich/ValuePluginInterface.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Value;

interface ValuePluginInterface extends PluginInterface
{
    public function renderValue(Value $o);
}
PKW�1\��
�**Avendor/kint-php/kint/src/Renderer/Rich/SimpleXMLElementPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Renderer\RichRenderer;
use Kint\Zval\BlobValue;
use Kint\Zval\Value;

class SimpleXMLElementPlugin extends Plugin implements ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        $children = $this->renderer->renderChildren($o);

        $header = '';

        if (null !== ($s = $o->getModifiers())) {
            $header .= '<var>'.$s.'</var> ';
        }

        if (null !== ($s = $o->getName())) {
            $header .= '<dfn>'.$this->renderer->escape($s).'</dfn> ';

            if ($s = $o->getOperator()) {
                $header .= $this->renderer->escape($s, 'ASCII').' ';
            }
        }

        if (null !== ($s = $o->getType())) {
            $s = $this->renderer->escape($s);

            if ($o->reference) {
                $s = '&amp;'.$s;
            }

            $header .= '<var>'.$this->renderer->escape($s).'</var> ';
        }

        if (null !== ($s = $o->getSize())) {
            $header .= '('.$this->renderer->escape($s).') ';
        }

        if (null === $s && $c = $o->getRepresentation('contents')) {
            $c = \reset($c->contents);

            if ($c && null !== ($s = $c->getValueShort())) {
                if (RichRenderer::$strlen_max && BlobValue::strlen($s) > RichRenderer::$strlen_max) {
                    $s = \substr($s, 0, RichRenderer::$strlen_max).'...';
                }
                $header .= $this->renderer->escape($s);
            }
        }

        $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header);

        return '<dl>'.$header.$children.'</dl>';
    }
}
PKW�1\kk	^��:vendor/kint-php/kint/src/Renderer/Rich/BlacklistPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Value;

class BlacklistPlugin extends Plugin implements ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        return '<dl>'.$this->renderLockedHeader($o, '<var>Blacklisted</var>').'</dl>';
    }
}
PKW�1\(0%)qq:vendor/kint-php/kint/src/Renderer/Rich/MicrotimePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Utils;
use Kint\Zval\Representation\MicrotimeRepresentation;
use Kint\Zval\Representation\Representation;

class MicrotimePlugin extends Plugin implements TabPluginInterface
{
    public function renderTab(Representation $r)
    {
        if (!($r instanceof MicrotimeRepresentation)) {
            return false;
        }

        $out = $r->getDateTime()->format('Y-m-d H:i:s.u');
        if (null !== $r->lap) {
            $out .= '<br><b>SINCE LAST CALL:</b> <span class="kint-microtime-lap">'.\round($r->lap, 4).'</span>s.';
        }
        if (null !== $r->total) {
            $out .= '<br><b>SINCE START:</b> '.\round($r->total, 4).'s.';
        }
        if (null !== $r->avg) {
            $out .= '<br><b>AVERAGE DURATION:</b> <span class="kint-microtime-avg">'.\round($r->avg, 4).'</span>s.';
        }

        $bytes = Utils::getHumanReadableBytes($r->mem);
        $out .= '<br><b>MEMORY USAGE:</b> '.$r->mem.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')';
        $bytes = Utils::getHumanReadableBytes($r->mem_real);
        $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')';

        $bytes = Utils::getHumanReadableBytes($r->mem_peak);
        $out .= '<br><b>PEAK MEMORY USAGE:</b> '.$r->mem_peak.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')';
        $bytes = Utils::getHumanReadableBytes($r->mem_peak_real);
        $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')';

        return '<pre data-kint-microtime-group="'.$r->group.'">'.$out.'</pre>';
    }

    public static function renderJs()
    {
        return \file_get_contents(KINT_DIR.'/resources/compiled/microtime.js');
    }
}
PKW�1\�gX0��7vendor/kint-php/kint/src/Renderer/Rich/BinaryPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Representation\Representation;

class BinaryPlugin extends Plugin implements TabPluginInterface
{
    public static $line_length = 0x10;
    public static $chunk_length = 0x4;

    public function renderTab(Representation $r)
    {
        $out = '<pre>';

        $chunks = \str_split($r->contents, self::$line_length);

        foreach ($chunks as $index => $chunk) {
            $out .= \sprintf('%08X', $index * self::$line_length).":\t";
            $out .= \implode(' ', \str_split(\str_pad(\bin2hex($chunk), 2 * self::$line_length, ' '), self::$chunk_length));
            $out .= "\t".\preg_replace('/[^\\x20-\\x7E]/', '.', $chunk)."\n";
        }

        $out .= '</pre>';

        return $out;
    }
}
PKW�1\^<��MM:vendor/kint-php/kint/src/Renderer/Rich/PluginInterface.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Renderer\RichRenderer;

interface PluginInterface
{
    public function __construct(RichRenderer $r);
}
PKW�1\��]q�	�	:vendor/kint-php/kint/src/Renderer/Rich/DocstringPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Kint;
use Kint\Zval\Representation\DocstringRepresentation;
use Kint\Zval\Representation\Representation;

class DocstringPlugin extends Plugin implements TabPluginInterface
{
    public function renderTab(Representation $r)
    {
        if (!($r instanceof DocstringRepresentation)) {
            return false;
        }

        $docstring = [];
        foreach (\explode("\n", $r->contents) as $line) {
            $docstring[] = \trim($line);
        }

        $docstring = \implode("\n", $docstring);

        $location = [];

        if ($r->class) {
            $location[] = 'Inherited from '.$this->renderer->escape($r->class);
        }
        if ($r->file && $r->line) {
            $location[] = 'Defined in '.$this->renderer->escape(Kint::shortenPath($r->file)).':'.((int) $r->line);
        }

        $location = \implode("\n", $location);

        if ($location) {
            if (\strlen($docstring)) {
                $docstring .= "\n\n";
            }

            $location = '<small>'.$location.'</small>';
        } elseif (0 === \strlen($docstring)) {
            return '';
        }

        return '<pre>'.$this->renderer->escape($docstring).$location.'</pre>';
    }
}
PKW�1\vgMM1vendor/kint-php/kint/src/Renderer/Rich/Plugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Renderer\RichRenderer;
use Kint\Zval\Value;

abstract class Plugin implements PluginInterface
{
    protected $renderer;

    public function __construct(RichRenderer $r)
    {
        $this->renderer = $r;
    }

    /**
     * Renders a locked header.
     *
     * @param string $content
     */
    public function renderLockedHeader(Value $o, $content)
    {
        $header = '<dt class="kint-parent kint-locked">';

        if (RichRenderer::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) {
            $header .= '<span class="kint-access-path-trigger" title="Show access path">&rlarr;</span>';
        }

        $header .= '<span class="kint-popup-trigger" title="Open in new window">&boxbox;</span><nav></nav>';

        if (null !== ($s = $o->getModifiers())) {
            $header .= '<var>'.$s.'</var> ';
        }

        if (null !== ($s = $o->getName())) {
            $header .= '<dfn>'.$this->renderer->escape($s).'</dfn> ';

            if ($s = $o->getOperator()) {
                $header .= $this->renderer->escape($s, 'ASCII').' ';
            }
        }

        if (null !== ($s = $o->getType())) {
            $s = $this->renderer->escape($s);

            if ($o->reference) {
                $s = '&amp;'.$s;
            }

            $header .= '<var>'.$s.'</var> ';
        }

        if (null !== ($s = $o->getSize())) {
            $header .= '('.$this->renderer->escape($s).') ';
        }

        $header .= $content;

        if (!empty($ap)) {
            $header .= '<div class="access-path">'.$this->renderer->escape($ap).'</div>';
        }

        return $header.'</dt>';
    }
}
PKW�1\�?��7vendor/kint-php/kint/src/Renderer/Rich/SourcePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Representation\Representation;
use Kint\Zval\Representation\SourceRepresentation;

class SourcePlugin extends Plugin implements TabPluginInterface
{
    public function renderTab(Representation $r)
    {
        if (!($r instanceof SourceRepresentation) || empty($r->source)) {
            return false;
        }

        $source = $r->source;

        // Trim empty lines from the start and end of the source
        foreach ($source as $linenum => $line) {
            if (\strlen(\trim($line)) || $linenum === $r->line) {
                break;
            }

            unset($source[$linenum]);
        }

        foreach (\array_reverse($source, true) as $linenum => $line) {
            if (\strlen(\trim($line)) || $linenum === $r->line) {
                break;
            }

            unset($source[$linenum]);
        }

        $output = '';

        foreach ($source as $linenum => $line) {
            if ($linenum === $r->line) {
                $output .= '<div class="kint-highlight">'.$this->renderer->escape($line)."\n".'</div>';
            } else {
                $output .= '<div>'.$this->renderer->escape($line)."\n".'</div>';
            }
        }

        if ($output) {
            \reset($source);

            $data = '';
            if ($r->showfilename) {
                $data = ' data-kint-filename="'.$this->renderer->escape($r->filename).'"';
            }

            return '<div><pre class="kint-source"'.$data.' style="counter-reset: kint-l '.((int) \key($source) - 1).';">'.$output.'</pre></div><div></div>';
        }
    }
}
PKW�1\�i����;vendor/kint-php/kint/src/Renderer/Rich/DepthLimitPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Value;

class DepthLimitPlugin extends Plugin implements ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        return '<dl>'.$this->renderLockedHeader($o, '<var>Depth Limit</var>').'</dl>';
    }
}
PKW�1\հg�ee6vendor/kint-php/kint/src/Renderer/Rich/TablePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Renderer\RichRenderer;
use Kint\Zval\BlobValue;
use Kint\Zval\Representation\Representation;

class TablePlugin extends Plugin implements TabPluginInterface
{
    public static $respect_str_length = true;

    public function renderTab(Representation $r)
    {
        $out = '<pre><table><thead><tr><th></th>';

        $firstrow = \reset($r->contents);

        foreach ($firstrow->value->contents as $field) {
            $out .= '<th>'.$this->renderer->escape($field->name).'</th>';
        }

        $out .= '</tr></thead><tbody>';

        foreach ($r->contents as $row) {
            $out .= '<tr><th>';
            $out .= $this->renderer->escape($row->name);
            $out .= '</th>';

            foreach ($row->value->contents as $field) {
                $out .= '<td';
                $type = '';
                $size = '';
                $ref = '';

                if (null !== ($s = $field->getType())) {
                    $type = $this->renderer->escape($s);

                    if ($field->reference) {
                        $ref = '&amp;';
                        $type = $ref.$type;
                    }

                    if (null !== ($s = $field->getSize())) {
                        $size .= ' ('.$this->renderer->escape($s).')';
                    }
                }

                if ($type) {
                    $out .= ' title="'.$type.$size.'"';
                }

                $out .= '>';

                switch ($field->type) {
                    case 'boolean':
                        $out .= $field->value->contents ? '<var>'.$ref.'true</var>' : '<var>'.$ref.'false</var>';
                        break;
                    case 'integer':
                    case 'double':
                        $out .= (string) $field->value->contents;
                        break;
                    case 'null':
                        $out .= '<var>'.$ref.'null</var>';
                        break;
                    case 'string':
                        if ($field->encoding) {
                            $val = $field->value->contents;
                            if (RichRenderer::$strlen_max && self::$respect_str_length && BlobValue::strlen($val) > RichRenderer::$strlen_max) {
                                $val = \substr($val, 0, RichRenderer::$strlen_max).'...';
                            }

                            $out .= $this->renderer->escape($val);
                        } else {
                            $out .= '<var>'.$type.'</var>';
                        }
                        break;
                    case 'array':
                        $out .= '<var>'.$ref.'array</var>'.$size;
                        break;
                    case 'object':
                        $out .= '<var>'.$ref.$this->renderer->escape($field->classname).'</var>'.$size;
                        break;
                    case 'resource':
                        $out .= '<var>'.$ref.'resource</var>';
                        break;
                    default:
                        $out .= '<var>'.$ref.'unknown</var>';
                        break;
                }

                if (\in_array('blacklist', $field->hints, true)) {
                    $out .= ' <var>Blacklisted</var>';
                } elseif (\in_array('recursion', $field->hints, true)) {
                    $out .= ' <var>Recursion</var>';
                } elseif (\in_array('depth_limit', $field->hints, true)) {
                    $out .= ' <var>Depth Limit</var>';
                }

                $out .= '</td>';
            }

            $out .= '</tr>';
        }

        $out .= '</tbody></table></pre>';

        return $out;
    }
}
PKW�1\��y&��:vendor/kint-php/kint/src/Renderer/Rich/RecursionPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Value;

class RecursionPlugin extends Plugin implements ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        return '<dl>'.$this->renderLockedHeader($o, '<var>Recursion</var>').'</dl>';
    }
}
PKW�1\Z�ZE
E
;vendor/kint-php/kint/src/Renderer/Rich/TraceFramePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\TraceFrameValue;
use Kint\Zval\Value;

class TraceFramePlugin extends Plugin implements ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        if (!$o instanceof TraceFrameValue) {
            return;
        }

        if (!empty($o->trace['file']) && !empty($o->trace['line'])) {
            $header = '<var>'.$this->renderer->ideLink($o->trace['file'], (int) $o->trace['line']).'</var> ';
        } else {
            $header = '<var>PHP internal call</var> ';
        }

        if ($o->trace['class']) {
            $header .= $this->renderer->escape($o->trace['class'].$o->trace['type']);
        }

        if (\is_string($o->trace['function'])) {
            $function = $this->renderer->escape($o->trace['function'].'()');
        } else {
            $function = $this->renderer->escape(
                $o->trace['function']->getName().'('.$o->trace['function']->getParams().')'
            );

            if (null !== ($url = $o->trace['function']->getPhpDocUrl())) {
                $function = '<a href="'.$url.'" target=_blank>'.$function.'</a>';
            }
        }

        $header .= '<dfn>'.$function.'</dfn>';

        $children = $this->renderer->renderChildren($o);
        $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header);

        return '<dl>'.$header.$children.'</dl>';
    }
}
PKW�1\�O�//9vendor/kint-php/kint/src/Renderer/Rich/CallablePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Renderer\RichRenderer;
use Kint\Zval\BlobValue;
use Kint\Zval\ClosureValue;
use Kint\Zval\MethodValue;
use Kint\Zval\Value;

class CallablePlugin extends Plugin implements ValuePluginInterface
{
    protected static $method_cache = [];

    public function renderValue(Value $o)
    {
        if ($o instanceof MethodValue) {
            return $this->renderMethod($o);
        }

        if ($o instanceof ClosureValue) {
            return $this->renderClosure($o);
        }

        return $this->renderCallable($o);
    }

    protected function renderClosure(ClosureValue $o)
    {
        $children = $this->renderer->renderChildren($o);

        $header = '';

        if (null !== ($s = $o->getModifiers())) {
            $header .= '<var>'.$s.'</var> ';
        }

        if (null !== ($s = $o->getName())) {
            $header .= '<dfn>'.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')</dfn>';
        }

        if (null !== ($s = $o->getValueShort())) {
            if (RichRenderer::$strlen_max && BlobValue::strlen($s) > RichRenderer::$strlen_max) {
                $s = \substr($s, 0, RichRenderer::$strlen_max).'...';
            }
            $header .= ' '.$this->renderer->escape($s);
        }

        return '<dl>'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'</dl>';
    }

    protected function renderCallable(Value $o)
    {
        $children = $this->renderer->renderChildren($o);

        $header = '';

        if (null !== ($s = $o->getModifiers())) {
            $header .= '<var>'.$s.'</var> ';
        }

        if (null !== ($s = $o->getName())) {
            $header .= '<dfn>'.$this->renderer->escape($s).'</dfn>';
        }

        if (null !== ($s = $o->getValueShort())) {
            if (RichRenderer::$strlen_max && BlobValue::strlen($s) > RichRenderer::$strlen_max) {
                $s = \substr($s, 0, RichRenderer::$strlen_max).'...';
            }
            $header .= ' '.$this->renderer->escape($s);
        }

        return '<dl>'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'</dl>';
    }

    protected function renderMethod(MethodValue $o)
    {
        if (!empty(self::$method_cache[$o->owner_class][$o->name])) {
            $children = self::$method_cache[$o->owner_class][$o->name]['children'];

            $header = $this->renderer->renderHeaderWrapper(
                $o,
                (bool) \strlen($children),
                self::$method_cache[$o->owner_class][$o->name]['header']
            );

            return '<dl>'.$header.$children.'</dl>';
        }

        $children = $this->renderer->renderChildren($o);

        $header = '';

        if (null !== ($s = $o->getModifiers()) || $o->return_reference) {
            $header .= '<var>'.$s;

            if ($o->return_reference) {
                if ($s) {
                    $header .= ' ';
                }
                $header .= $this->renderer->escape('&');
            }

            $header .= '</var> ';
        }

        if (null !== ($s = $o->getName())) {
            $function = $this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')';

            if (null !== ($url = $o->getPhpDocUrl())) {
                $function = '<a href="'.$url.'" target=_blank>'.$function.'</a>';
            }

            $header .= '<dfn>'.$function.'</dfn>';
        }

        if (!empty($o->returntype)) {
            $header .= ': <var>';

            if ($o->return_reference) {
                $header .= $this->renderer->escape('&');
            }

            $header .= $this->renderer->escape($o->returntype).'</var>';
        } elseif ($o->docstring) {
            if (\preg_match('/@return\\s+(.*)\\r?\\n/m', $o->docstring, $matches)) {
                if (\trim($matches[1])) {
                    $header .= ': <var>'.$this->renderer->escape(\trim($matches[1])).'</var>';
                }
            }
        }

        if (null !== ($s = $o->getValueShort())) {
            if (RichRenderer::$strlen_max && BlobValue::strlen($s) > RichRenderer::$strlen_max) {
                $s = \substr($s, 0, RichRenderer::$strlen_max).'...';
            }
            $header .= ' '.$this->renderer->escape($s);
        }

        if (\strlen($o->owner_class) && \strlen($o->name)) {
            self::$method_cache[$o->owner_class][$o->name] = [
                'header' => $header,
                'children' => $children,
            ];
        }

        $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header);

        return '<dl>'.$header.$children.'</dl>';
    }
}
PKW�1\�G�uu=vendor/kint-php/kint/src/Renderer/Rich/TabPluginInterface.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Representation\Representation;

interface TabPluginInterface extends PluginInterface
{
    public function renderTab(Representation $o);
}
PKW�1\*��qq:vendor/kint-php/kint/src/Renderer/Rich/TimestampPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use DateTime;
use DateTimeZone;
use Kint\Zval\Representation\Representation;

class TimestampPlugin extends Plugin implements TabPluginInterface
{
    public function renderTab(Representation $r)
    {
        $dt = DateTime::createFromFormat('U', $r->contents);

        if ($dt) {
            return '<pre>'.$dt->setTimeZone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s T').'</pre>';
        }
    }
}
PKW�1\��ܶ6vendor/kint-php/kint/src/Renderer/Rich/ColorPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Rich;

use Kint\Zval\Representation\ColorRepresentation;
use Kint\Zval\Representation\Representation;
use Kint\Zval\Value;

class ColorPlugin extends Plugin implements TabPluginInterface, ValuePluginInterface
{
    public function renderValue(Value $o)
    {
        $r = $o->getRepresentation('color');

        if (!$r instanceof ColorRepresentation) {
            return;
        }

        $children = $this->renderer->renderChildren($o);

        $header = $this->renderer->renderHeader($o);
        $header .= '<div class="kint-color-preview"><div style="background:';
        $header .= $r->getColor(ColorRepresentation::COLOR_RGBA);
        $header .= '"></div></div>';

        $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header);

        return '<dl>'.$header.$children.'</dl>';
    }

    public function renderTab(Representation $r)
    {
        if (!$r instanceof ColorRepresentation) {
            return;
        }

        $out = '';

        if ($color = $r->getColor(ColorRepresentation::COLOR_NAME)) {
            $out .= '<dfn>'.$color."</dfn>\n";
        }
        if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_3)) {
            $out .= '<dfn>'.$color."</dfn>\n";
        }
        if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_6)) {
            $out .= '<dfn>'.$color."</dfn>\n";
        }

        if ($r->hasAlpha()) {
            if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_4)) {
                $out .= '<dfn>'.$color."</dfn>\n";
            }
            if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_8)) {
                $out .= '<dfn>'.$color."</dfn>\n";
            }
            if ($color = $r->getColor(ColorRepresentation::COLOR_RGBA)) {
                $out .= '<dfn>'.$color."</dfn>\n";
            }
            if ($color = $r->getColor(ColorRepresentation::COLOR_HSLA)) {
                $out .= '<dfn>'.$color."</dfn>\n";
            }
        } else {
            if ($color = $r->getColor(ColorRepresentation::COLOR_RGB)) {
                $out .= '<dfn>'.$color."</dfn>\n";
            }
            if ($color = $r->getColor(ColorRepresentation::COLOR_HSL)) {
                $out .= '<dfn>'.$color."</dfn>\n";
            }
        }

        if (!\strlen($out)) {
            return false;
        }

        return '<pre>'.$out.'</pre>';
    }
}
PKW�1\�w�dd:vendor/kint-php/kint/src/Renderer/Text/BlacklistPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Text;

use Kint\Zval\Value;

class BlacklistPlugin extends Plugin
{
    public function render(Value $o)
    {
        $out = '';

        if (0 == $o->depth) {
            $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL;
        }

        $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('BLACKLISTED').PHP_EOL;

        return $out;
    }
}
PKW�1\J�4��:vendor/kint-php/kint/src/Renderer/Text/MicrotimePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Text;

use Kint\Renderer\PlainRenderer;
use Kint\Renderer\Rich\MicrotimePlugin as RichPlugin;
use Kint\Renderer\TextRenderer;
use Kint\Utils;
use Kint\Zval\Representation\MicrotimeRepresentation;
use Kint\Zval\Value;

class MicrotimePlugin extends Plugin
{
    protected $useJs = false;

    public function __construct(TextRenderer $r)
    {
        parent::__construct($r);

        if ($this->renderer instanceof PlainRenderer) {
            $this->useJs = true;
        }
    }

    public function render(Value $o)
    {
        $r = $o->getRepresentation('microtime');

        if (!$r instanceof MicrotimeRepresentation) {
            return false;
        }

        $out = '';

        if (0 == $o->depth) {
            $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL;
        }

        $out .= $this->renderer->renderHeader($o);
        $out .= $this->renderer->renderChildren($o).PHP_EOL;

        $indent = \str_repeat(' ', ($o->depth + 1) * $this->renderer->indent_width);

        if ($this->useJs) {
            $out .= '<span data-kint-microtime-group="'.$r->group.'">';
        }

        $out .= $indent.$this->renderer->colorType('TIME:').' ';
        $out .= $this->renderer->colorValue($r->getDateTime()->format('Y-m-d H:i:s.u')).PHP_EOL;

        if (null !== $r->lap) {
            $out .= $indent.$this->renderer->colorType('SINCE LAST CALL:').' ';

            $lap = \round($r->lap, 4);

            if ($this->useJs) {
                $lap = '<span class="kint-microtime-lap">'.$lap.'</span>';
            }

            $out .= $this->renderer->colorValue($lap.'s').'.'.PHP_EOL;
        }
        if (null !== $r->total) {
            $out .= $indent.$this->renderer->colorType('SINCE START:').' ';
            $out .= $this->renderer->colorValue(\round($r->total, 4).'s').'.'.PHP_EOL;
        }
        if (null !== $r->avg) {
            $out .= $indent.$this->renderer->colorType('AVERAGE DURATION:').' ';

            $avg = \round($r->avg, 4);

            if ($this->useJs) {
                $avg = '<span class="kint-microtime-avg">'.$avg.'</span>';
            }

            $out .= $this->renderer->colorValue($avg.'s').'.'.PHP_EOL;
        }

        $bytes = Utils::getHumanReadableBytes($r->mem);
        $mem = $r->mem.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')';
        $bytes = Utils::getHumanReadableBytes($r->mem_real);
        $mem .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')';

        $out .= $indent.$this->renderer->colorType('MEMORY USAGE:').' ';
        $out .= $this->renderer->colorValue($mem).'.'.PHP_EOL;

        $bytes = Utils::getHumanReadableBytes($r->mem_peak);
        $mem = $r->mem_peak.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')';
        $bytes = Utils::getHumanReadableBytes($r->mem_peak_real);
        $mem .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')';

        $out .= $indent.$this->renderer->colorType('PEAK MEMORY USAGE:').' ';
        $out .= $this->renderer->colorValue($mem).'.'.PHP_EOL;

        if ($this->useJs) {
            $out .= '</span>';
        }

        return $out;
    }

    public static function renderJs()
    {
        return RichPlugin::renderJs();
    }
}
PKW�1\�ta�ee;vendor/kint-php/kint/src/Renderer/Text/DepthLimitPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Text;

use Kint\Zval\Value;

class DepthLimitPlugin extends Plugin
{
    public function render(Value $o)
    {
        $out = '';

        if (0 == $o->depth) {
            $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL;
        }

        $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('DEPTH LIMIT').PHP_EOL;

        return $out;
    }
}
PKW�1\��eqbb:vendor/kint-php/kint/src/Renderer/Text/RecursionPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Text;

use Kint\Zval\Value;

class RecursionPlugin extends Plugin
{
    public function render(Value $o)
    {
        $out = '';

        if (0 == $o->depth) {
            $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL;
        }

        $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('RECURSION').PHP_EOL;

        return $out;
    }
}
PKW�1\���@6vendor/kint-php/kint/src/Renderer/Text/TracePlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Text;

use Kint\Zval\MethodValue;
use Kint\Zval\Value;

class TracePlugin extends Plugin
{
    public function render(Value $o)
    {
        $out = '';

        if (0 == $o->depth) {
            $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL;
        }

        $out .= $this->renderer->renderHeader($o).':'.PHP_EOL;

        $indent = \str_repeat(' ', ($o->depth + 1) * $this->renderer->indent_width);

        $i = 1;
        foreach ($o->value->contents as $frame) {
            $framedesc = $indent.\str_pad($i.': ', 4, ' ');

            if ($frame->trace['file']) {
                $framedesc .= $this->renderer->ideLink($frame->trace['file'], $frame->trace['line']).PHP_EOL;
            } else {
                $framedesc .= 'PHP internal call'.PHP_EOL;
            }

            $framedesc .= $indent.'    ';

            if ($frame->trace['class']) {
                $framedesc .= $this->renderer->escape($frame->trace['class']);

                if ($frame->trace['object']) {
                    $framedesc .= $this->renderer->escape('->');
                } else {
                    $framedesc .= '::';
                }
            }

            if (\is_string($frame->trace['function'])) {
                $framedesc .= $this->renderer->escape($frame->trace['function']).'(...)';
            } elseif ($frame->trace['function'] instanceof MethodValue) {
                $framedesc .= $this->renderer->escape($frame->trace['function']->getName());
                $framedesc .= '('.$this->renderer->escape($frame->trace['function']->getParams()).')';
            }

            $out .= $this->renderer->colorType($framedesc).PHP_EOL.PHP_EOL;

            if ($source = $frame->getRepresentation('source')) {
                $line_wanted = $source->line;
                $source = $source->source;

                // Trim empty lines from the start and end of the source
                foreach ($source as $linenum => $line) {
                    if (\trim($line) || $linenum === $line_wanted) {
                        break;
                    }

                    unset($source[$linenum]);
                }

                foreach (\array_reverse($source, true) as $linenum => $line) {
                    if (\trim($line) || $linenum === $line_wanted) {
                        break;
                    }

                    unset($source[$linenum]);
                }

                foreach ($source as $lineno => $line) {
                    if ($lineno == $line_wanted) {
                        $out .= $indent.$this->renderer->colorValue($this->renderer->escape($line)).PHP_EOL;
                    } else {
                        $out .= $indent.$this->renderer->escape($line).PHP_EOL;
                    }
                }
            }

            ++$i;
        }

        return $out;
    }
}
PKW�1\�?���1vendor/kint-php/kint/src/Renderer/Text/Plugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Text;

use Kint\Renderer\TextRenderer;
use Kint\Zval\Value;

abstract class Plugin
{
    protected $renderer;

    public function __construct(TextRenderer $r)
    {
        $this->renderer = $r;
    }

    abstract public function render(Value $o);
}
PKW�1\�S7vendor/kint-php/kint/src/Renderer/Text/ElidedPlugin.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer\Text;

use Kint\Zval\Value;

class ElidedPlugin extends Plugin
{
    public function render(Value $o)
    {
        $out = '';

        if (0 == $o->depth) {
            $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL;
        }

        $out .= \str_repeat(' ', $o->depth * $this->renderer->indent_width);

        if ($s = $o->getSize()) {
            $out .= $this->renderer->colorValue('ELIDED '.$s.' VALUES').PHP_EOL;
        } else {
            $out .= $this->renderer->colorValue('ELIDED').PHP_EOL;
        }

        return $out;
    }
}
PKW�1\��N*%*%2vendor/kint-php/kint/src/Renderer/TextRenderer.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer;

use Kint\Kint;
use Kint\Utils;
use Kint\Zval\InstanceValue;
use Kint\Zval\Value;

class TextRenderer extends Renderer
{
    /**
     * TextRenderer plugins should be instances of Kint\Renderer\Text\Plugin.
     */
    public static $plugins = [
        'blacklist' => 'Kint\\Renderer\\Text\\BlacklistPlugin',
        'depth_limit' => 'Kint\\Renderer\\Text\\DepthLimitPlugin',
        'microtime' => 'Kint\\Renderer\\Text\\MicrotimePlugin',
        'recursion' => 'Kint\\Renderer\\Text\\RecursionPlugin',
        'trace' => 'Kint\\Renderer\\Text\\TracePlugin',
        'elide' => 'Kint\\Renderer\\Text\\ElidedPlugin',
    ];

    /**
     * Parser plugins must be instanceof one of these or
     * it will be removed for performance reasons.
     */
    public static $parser_plugin_whitelist = [
        'Kint\\Parser\\ArrayLimitPlugin',
        'Kint\\Parser\\ArrayObjectPlugin',
        'Kint\\Parser\\BlacklistPlugin',
        'Kint\\Parser\\MicrotimePlugin',
        'Kint\\Parser\\StreamPlugin',
        'Kint\\Parser\\TracePlugin',
    ];

    /**
     * The maximum length of a string before it is truncated.
     *
     * Falsey to disable
     *
     * @var int
     */
    public static $strlen_max = 0;

    /**
     * The default width of the terminal for headers.
     *
     * @var int
     */
    public static $default_width = 80;

    /**
     * Indentation width.
     *
     * @var int
     */
    public static $default_indent = 4;

    /**
     * Decorate the header and footer.
     *
     * @var bool
     */
    public static $decorations = true;

    /**
     * Sort mode for object properties.
     *
     * @var int
     */
    public static $sort = self::SORT_NONE;

    public $header_width = 80;
    public $indent_width = 4;

    protected $plugin_objs = [];

    public function __construct()
    {
        $this->header_width = self::$default_width;
        $this->indent_width = self::$default_indent;
    }

    public function render(Value $o)
    {
        if ($plugin = $this->getPlugin(self::$plugins, $o->hints)) {
            if (\strlen($output = $plugin->render($o))) {
                return $output;
            }
        }

        $out = '';

        if (0 == $o->depth) {
            $out .= $this->colorTitle($this->renderTitle($o)).PHP_EOL;
        }

        $out .= $this->renderHeader($o);
        $out .= $this->renderChildren($o).PHP_EOL;

        return $out;
    }

    public function renderNothing()
    {
        if (self::$decorations) {
            return $this->colorTitle(
                $this->boxText('No argument', $this->header_width)
            ).PHP_EOL;
        }

        return $this->colorTitle('No argument').PHP_EOL;
    }

    public function boxText($text, $width)
    {
        $out = '┌'.\str_repeat('─', $width - 2).'┐'.PHP_EOL;

        if (\strlen($text)) {
            $text = Utils::truncateString($text, $width - 4);
            $text = \str_pad($text, $width - 4);

            $out .= '│ '.$this->escape($text).' │'.PHP_EOL;
        }

        $out .= '└'.\str_repeat('─', $width - 2).'┘';

        return $out;
    }

    public function renderTitle(Value $o)
    {
        $name = (string) $o->getName();

        if (self::$decorations) {
            return $this->boxText($name, $this->header_width);
        }

        return Utils::truncateString($name, $this->header_width);
    }

    public function renderHeader(Value $o)
    {
        $output = [];

        if ($o->depth) {
            if (null !== ($s = $o->getModifiers())) {
                $output[] = $s;
            }

            if (null !== $o->name) {
                $output[] = $this->escape(\var_export($o->name, true));

                if (null !== ($s = $o->getOperator())) {
                    $output[] = $this->escape($s);
                }
            }
        }

        if (null !== ($s = $o->getType())) {
            if ($o->reference) {
                $s = '&'.$s;
            }

            $output[] = $this->colorType($this->escape($s));
        }

        if (null !== ($s = $o->getSize())) {
            $output[] = '('.$this->escape($s).')';
        }

        if (null !== ($s = $o->getValueShort())) {
            if (self::$strlen_max) {
                $s = Utils::truncateString($s, self::$strlen_max);
            }
            $output[] = $this->colorValue($this->escape($s));
        }

        return \str_repeat(' ', $o->depth * $this->indent_width).\implode(' ', $output);
    }

    public function renderChildren(Value $o)
    {
        if ('array' === $o->type) {
            $output = ' [';
        } elseif ('object' === $o->type) {
            $output = ' (';
        } else {
            return '';
        }

        $children = '';

        if ($o->value && \is_array($o->value->contents)) {
            if ($o instanceof InstanceValue && 'properties' === $o->value->getName()) {
                foreach (self::sortProperties($o->value->contents, self::$sort) as $obj) {
                    $children .= $this->render($obj);
                }
            } else {
                foreach ($o->value->contents as $child) {
                    $children .= $this->render($child);
                }
            }
        }

        if ($children) {
            $output .= PHP_EOL.$children;
            $output .= \str_repeat(' ', $o->depth * $this->indent_width);
        }

        if ('array' === $o->type) {
            $output .= ']';
        } else {
            $output .= ')';
        }

        return $output;
    }

    public function colorValue($string)
    {
        return $string;
    }

    public function colorType($string)
    {
        return $string;
    }

    public function colorTitle($string)
    {
        return $string;
    }

    public function postRender()
    {
        if (self::$decorations) {
            $output = \str_repeat('═', $this->header_width);
        } else {
            $output = '';
        }

        if (!$this->show_trace) {
            return $this->colorTitle($output);
        }

        if ($output) {
            $output .= PHP_EOL;
        }

        return $this->colorTitle($output.$this->calledFrom().PHP_EOL);
    }

    public function filterParserPlugins(array $plugins)
    {
        $return = [];

        foreach ($plugins as $index => $plugin) {
            foreach (self::$parser_plugin_whitelist as $whitelist) {
                if ($plugin instanceof $whitelist) {
                    $return[] = $plugin;
                    continue 2;
                }
            }
        }

        return $return;
    }

    public function ideLink($file, $line)
    {
        return $this->escape(Kint::shortenPath($file)).':'.$line;
    }

    public function escape($string, $encoding = false)
    {
        return $string;
    }

    protected function calledFrom()
    {
        $output = '';

        if (isset($this->call_info['callee']['file'])) {
            $output .= 'Called from '.$this->ideLink(
                $this->call_info['callee']['file'],
                $this->call_info['callee']['line']
            );
        }

        if (isset($this->call_info['callee']['function']) && (
                !empty($this->call_info['callee']['class']) ||
                !\in_array(
                    $this->call_info['callee']['function'],
                    ['include', 'include_once', 'require', 'require_once'],
                    true
                )
            )
        ) {
            $output .= ' [';
            if (isset($this->call_info['callee']['class'])) {
                $output .= $this->call_info['callee']['class'];
            }
            if (isset($this->call_info['callee']['type'])) {
                $output .= $this->call_info['callee']['type'];
            }
            $output .= $this->call_info['callee']['function'].'()]';
        }

        return $output;
    }

    protected function getPlugin(array $plugins, array $hints)
    {
        if ($plugins = $this->matchPlugins($plugins, $hints)) {
            $plugin = \end($plugins);

            if (!isset($this->plugin_objs[$plugin])) {
                $this->plugin_objs[$plugin] = new $plugin($this);
            }

            return $this->plugin_objs[$plugin];
        }
    }
}
PKW�1\�*"  1vendor/kint-php/kint/src/Renderer/CliRenderer.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer;

use Exception;
use Kint\Zval\Value;
use Throwable;

class CliRenderer extends TextRenderer
{
    /**
     * @var bool enable colors when Kint is run in *UNIX* command line
     */
    public static $cli_colors = true;

    /**
     * Forces utf8 output on windows.
     *
     * @var bool
     */
    public static $force_utf8 = false;

    /**
     * Detects the terminal width on startup.
     *
     * @var bool
     */
    public static $detect_width = true;

    /**
     * The minimum width to detect terminal size as.
     *
     * Less than this is ignored and falls back to default width.
     *
     * @var int
     */
    public static $min_terminal_width = 40;

    protected static $terminal_width = null;

    protected $windows_output = false;

    protected $colors = false;

    public function __construct()
    {
        parent::__construct();

        if (!self::$force_utf8) {
            $this->windows_output = KINT_WIN;
        }

        if (!self::$terminal_width) {
            if (!KINT_WIN && self::$detect_width) {
                try {
                    self::$terminal_width = \exec('tput cols');
                } catch (Exception $e) {
                    self::$terminal_width = self::$default_width;
                } catch (Throwable $t) {
                    self::$terminal_width = self::$default_width;
                }
            }

            if (self::$terminal_width < self::$min_terminal_width) {
                self::$terminal_width = self::$default_width;
            }
        }

        $this->colors = $this->windows_output ? false : self::$cli_colors;

        $this->header_width = self::$terminal_width;
    }

    public function colorValue($string)
    {
        if (!$this->colors) {
            return $string;
        }

        return "\x1b[32m".\str_replace("\n", "\x1b[0m\n\x1b[32m", $string)."\x1b[0m";
    }

    public function colorType($string)
    {
        if (!$this->colors) {
            return $string;
        }

        return "\x1b[35;1m".\str_replace("\n", "\x1b[0m\n\x1b[35;1m", $string)."\x1b[0m";
    }

    public function colorTitle($string)
    {
        if (!$this->colors) {
            return $string;
        }

        return "\x1b[36m".\str_replace("\n", "\x1b[0m\n\x1b[36m", $string)."\x1b[0m";
    }

    public function renderTitle(Value $o)
    {
        if ($this->windows_output) {
            return $this->utf8ToWindows(parent::renderTitle($o));
        }

        return parent::renderTitle($o);
    }

    public function preRender()
    {
        return PHP_EOL;
    }

    public function postRender()
    {
        if ($this->windows_output) {
            return $this->utf8ToWindows(parent::postRender());
        }

        return parent::postRender();
    }

    public function escape($string, $encoding = false)
    {
        return \str_replace("\x1b", '\\x1b', $string);
    }

    protected function utf8ToWindows($string)
    {
        return \str_replace(
            ['┌', '═', '┐', '│', '└', '─', '┘'],
            ["\xda", "\xdc", "\xbf", "\xb3", "\xc0", "\xc4", "\xd9"],
            $string
        );
    }
}
PKW�1\������.vendor/kint-php/kint/src/Renderer/Renderer.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

namespace Kint\Renderer;

use Kint\Zval\InstanceValue;
use Kint\Zval\Value;

abstract class Renderer
{
    const SORT_NONE = 0;
    const SORT_VISIBILITY = 1;
    const SORT_FULL = 2;

    protected $call_info = [];
    protected $statics = [];
    protected $show_trace = true;

    abstract public function render(Value $o);

    abstract public function renderNothing();

    public function setCallInfo(array $info)
    {
        if (!isset($info['params'])) {
            $info['params'] = null;
        }

        if (!isset($info['modifiers']) || !\is_array($info['modifiers'])) {
            $info['modifiers'] = [];
        }

        if (!isset($info['callee'])) {
            $info['callee'] = null;
        }

        if (!isset($info['caller'])) {
            $info['caller'] = null;
        }

        if (!isset($info['trace']) || !\is_array($info['trace'])) {
            $info['trace'] = [];
        }

        $this->call_info = [
            'params' => $info['params'],
            'modifiers' => $info['modifiers'],
            'callee' => $info['callee'],
            'caller' => $info['caller'],
            'trace' => $info['trace'],
        ];
    }

    public function getCallInfo()
    {
        return $this->call_info;
    }

    public function setStatics(array $statics)
    {
        $this->statics = $statics;
        $this->setShowTrace(!empty($statics['display_called_from']));
    }

    public function getStatics()
    {
        return $this->statics;
    }

    public function setShowTrace($show_trace)
    {
        $this->show_trace = $show_trace;
    }

    public function getShowTrace()
    {
        return $this->show_trace;
    }

    /**
     * Returns the first compatible plugin available.
     *
     * @param array $plugins Array of hints to class strings
     * @param array $hints   Array of object hints
     *
     * @return array Array of hints to class strings filtered and sorted by object hints
     */
    public function matchPlugins(array $plugins, array $hints)
    {
        $out = [];

        foreach ($hints as $key) {
            if (isset($plugins[$key])) {
                $out[$key] = $plugins[$key];
            }
        }

        return $out;
    }

    public function filterParserPlugins(array $plugins)
    {
        return $plugins;
    }

    public function preRender()
    {
        return '';
    }

    public function postRender()
    {
        return '';
    }

    public static function sortPropertiesFull(Value $a, Value $b)
    {
        $sort = Value::sortByAccess($a, $b);
        if ($sort) {
            return $sort;
        }

        $sort = Value::sortByName($a, $b);
        if ($sort) {
            return $sort;
        }

        return InstanceValue::sortByHierarchy($a->owner_class, $b->owner_class);
    }

    /**
     * Sorts an array of Value.
     *
     * @param Value[] $contents Object properties to sort
     * @param int     $sort
     *
     * @return Value[]
     */
    public static function sortProperties(array $contents, $sort)
    {
        switch ($sort) {
            case self::SORT_VISIBILITY:
                // Containers to quickly stable sort by type
                $containers = [
                    Value::ACCESS_PUBLIC => [],
                    Value::ACCESS_PROTECTED => [],
                    Value::ACCESS_PRIVATE => [],
                    Value::ACCESS_NONE => [],
                ];

                foreach ($contents as $item) {
                    $containers[$item->access][] = $item;
                }

                return \call_user_func_array('array_merge', $containers);
            case self::SORT_FULL:
                \usort($contents, ['Kint\\Renderer\\Renderer', 'sortPropertiesFull']);
                // no break
            default:
                return $contents;
        }
    }
}
PKW�1\]Ș�.
.
"vendor/kint-php/kint/composer.jsonnu�[���{
    "name": "kint-php/kint",
    "description": "Kint - debugging tool for PHP developers",
    "keywords": ["kint", "php", "debug"],
    "type": "library",
    "homepage": "https://kint-php.github.io/kint/",
    "license": "MIT",
    "authors": [
        {
            "name": "Jonathan Vollebregt",
            "homepage": "https://github.com/jnvsor"
        },
        {
            "name": "Rokas Šleinius",
            "homepage": "https://github.com/raveren"
        },
        {
            "name": "Contributors",
            "homepage": "https://github.com/kint-php/kint/graphs/contributors"
        }
    ],
    "require": {
        "php": ">=5.6"
    },
    "require-dev": {
        "friendsofphp/php-cs-fixer": "^2.0",
        "phpunit/phpunit": "^9.0",
        "phpspec/prophecy-phpunit": "^2",
        "symfony/finder": "^3.0 || ^4.0 || ^5.0",
        "seld/phar-utils": "^1.0",
        "vimeo/psalm": "dev-master"
    },
    "autoload": {
        "files": ["init.php"],
        "psr-4": {
            "Kint\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Kint\\Test\\": "tests/"
        }
    },
    "config": {
        "platform": {
            "php": "7.4"
        }
    },
    "scripts": {
        "post-update-cmd": "npm ci",
        "post-install-cmd": "@post-update-cmd",
        "clean": [
            "rm -rf resources/compiled/",
            "rm -rf build/"
        ],
        "format": [
            "@format:php",
            "@format:js",
            "@format:sass"
        ],
        "format:php": "php-cs-fixer fix",
        "format:js": "npm run format:js",
        "format:sass": "npm run format:sass",
        "build": [
            "@build:sass",
            "@build:js",
            "@build:php"
        ],
        "build:sass": "npm run build:sass",
        "build:js": "npm run build:js",
        "build:php": "php ./build.php",
        "analyze": "psalm --show-info=false"
    },
    "suggest": {
        "kint-php/kint-twig": "Provides d() and s() functions in twig templates",
        "kint-php/kint-js": "Provides a simplified dump to console.log()",
        "ext-mbstring": "Provides string encoding detection",
        "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages",
        "ext-ctype": "Simple data type tests",
        "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing",
        "symfony/polyfill-iconv": "Replacement for ext-iconv if missing",
        "symfony/polyfill-ctype": "Replacement for ext-ctype if missing"
    }
}
PKW�1\���N��4vendor/kint-php/kint/resources/compiled/microtime.jsnu�[���void 0===window.kintMicrotimeInitialized&&(window.kintMicrotimeInitialized=1,window.addEventListener("load",function(){"use strict";var c={},t=Array.prototype.slice.call(document.querySelectorAll("[data-kint-microtime-group]"),0);t.forEach(function(t){var i,e;t.querySelector(".kint-microtime-lap")&&(i=t.getAttribute("data-kint-microtime-group"),e=parseFloat(t.querySelector(".kint-microtime-lap").innerHTML),t=parseFloat(t.querySelector(".kint-microtime-avg").innerHTML),void 0===c[i]&&(c[i]={}),(void 0===c[i].min||c[i].min>e)&&(c[i].min=e),(void 0===c[i].max||c[i].max<e)&&(c[i].max=e),c[i].avg=t)}),t.forEach(function(t){var i,e,r,o,n,a=t.querySelector(".kint-microtime-lap");null!==a&&(i=parseFloat(a.textContent),o=t.dataset.kintMicrotimeGroup,e=c[o].avg,r=c[o].max,o=c[o].min,i===(t.querySelector(".kint-microtime-avg").textContent=e)&&i===o&&i===r||(e<i?(n=(i-e)/(r-e),a.style.background="hsl("+(40-40*n)+", 100%, 65%)"):(n=e===o?0:(e-i)/(e-o),a.style.background="hsl("+(40+80*n)+", 100%, 65%)")))})}));
PKW�1\:�##7vendor/kint-php/kint/resources/compiled/aante-light.cssnu�[���.kint-rich{font-size:13px;overflow-x:auto;white-space:nowrap;background:rgba(255,255,255,0.9)}.kint-rich.kint-folder{position:fixed;bottom:0;left:0;right:0;z-index:999999;width:100%;margin:0;display:block}.kint-rich.kint-folder dd.kint-foldout{max-height:calc(100vh - 100px);padding-right:8px;overflow-y:scroll;display:none}.kint-rich.kint-folder dd.kint-foldout.kint-show{display:block}.kint-rich::selection,.kint-rich::-moz-selection,.kint-rich::-webkit-selection{background:#aaa;color:#1d1e1e}.kint-rich .kint-focused{box-shadow:0 0 3px 2px red}.kint-rich,.kint-rich::before,.kint-rich::after,.kint-rich *,.kint-rich *::before,.kint-rich *::after{box-sizing:border-box;border-radius:0;color:#1d1e1e;float:none !important;font-family:Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;line-height:15px;margin:0;padding:0;text-align:left}.kint-rich{margin:8px 0}.kint-rich dt,.kint-rich dl{width:auto}.kint-rich dt,.kint-rich div.access-path{background:#f8f8f8;border:1px solid #d7d7d7;color:#1d1e1e;display:block;font-weight:bold;list-style:none outside none;overflow:auto;padding:4px}.kint-rich dt:hover,.kint-rich div.access-path:hover{border-color:#aaa}.kint-rich>dl dl{padding:0 0 0 12px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAxNTAiPjxwYXRoIGQ9Ik02IDdoMThsLTkgMTV6bTAgMzBoMThsLTkgMTV6bTAgNDVoMThsLTktMTV6bTAgMzBoMThsLTktMTV6bTAgMTJsMTggMThtLTE4IDBsMTgtMTgiIGZpbGw9IiM1NTUiLz48cGF0aCBkPSJNNiAxMjZsMTggMThtLTE4IDBsMTgtMTgiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSIjNTU1Ii8+PC9zdmc+") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #d7d7d7}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#06f;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:red}.kint-rich dfn{font-style:normal;font-family:monospace;color:#1d1e1e}.kint-rich pre{color:#1d1e1e;margin:0 0 0 12px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #d7d7d7;background:#f8f8f8;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(29,30,30,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#f8f8f8;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#1d1e1e;background:#f8f8f8}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #d7d7d7;border-top-width:0;border-bottom-width:0;padding:4px;float:right !important;margin:-4px 0;color:#1d1e1e;background:#f8f8f8;height:24px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#f8f8f8;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#f8f8f8}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#f8f8f8;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#1d1e1e}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#1d1e1e;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#1d1e1e;border-bottom:1px dotted #1d1e1e}.kint-rich ul{list-style:none;padding-left:12px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #d7d7d7}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 12px;padding-left:0;background:#f8f8f8;border:1px solid #d7d7d7;border-top:0}.kint-rich ul.kint-tabs>li{background:#f8f8f8;border:1px solid #d7d7d7;cursor:pointer;display:inline-block;height:24px;margin:2px;padding:0 12px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#aaa;color:red}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#f8f8f8;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:20px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#aaa;color:red}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #d7d7d7;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="%23FFF" d="M0 0h1v2h1V1H0z"/></svg>');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#aaa}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #d7d7d7;padding:2px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#f8f8f8;color:#1d1e1e}.kint-rich table td{background:#f8f8f8;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #aaa inset}.kint-rich table tr:hover var{color:red}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:4px;padding-bottom:4px;border-bottom:1px solid #f8f8f8}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #aaa;padding-right:8px;margin-right:8px}.kint-rich pre.kint-source>div.kint-highlight{background:#f8f8f8}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #aaa,0 1px #aaa,1px 0 #aaa,0 -1px #aaa;color:#f8f8f8;font-weight:bold}.kint-rich .kint-focused{box-shadow:0 0 3px 2px red}.kint-rich dt{font-weight:normal}.kint-rich dt.kint-parent{margin-top:4px}.kint-rich dl dl{margin-top:4px;padding-left:25px;border-left:none}.kint-rich>dl>dt{background:#f8f8f8}.kint-rich ul{margin:0;padding-left:0}.kint-rich ul:not(.kint-tabs)>li{border-left:0}.kint-rich ul.kint-tabs{background:#f8f8f8;border:1px solid #d7d7d7;border-width:0 1px 1px 1px;padding:4px 0 0 12px;margin-left:-1px;margin-top:-1px}.kint-rich ul.kint-tabs li,.kint-rich ul.kint-tabs li+li{margin:0 0 0 4px}.kint-rich ul.kint-tabs li{border-bottom-width:0;height:25px}.kint-rich ul.kint-tabs li:first-child{margin-left:0}.kint-rich ul.kint-tabs li.kint-active-tab{border-top:1px solid #d7d7d7;background:#fff;font-weight:bold;padding-top:0;border-bottom:1px solid #fff !important;margin-bottom:-1px}.kint-rich ul.kint-tabs li.kint-active-tab:hover{border-bottom:1px solid #fff}.kint-rich ul>li>pre{border:1px solid #d7d7d7}.kint-rich dt:hover+dd>ul{border-color:#aaa}.kint-rich pre{background:#fff;margin-top:4px;margin-left:25px}.kint-rich .kint-source{margin-left:-1px}.kint-rich .kint-source .kint-highlight{background:#cfc}.kint-rich .kint-parent.kint-show>.kint-search{border-bottom-width:1px}.kint-rich table td{background:#fff}.kint-rich table td>dl{padding:0;margin:0}.kint-rich table td>dl>dt.kint-parent{margin:0}.kint-rich table td:first-child,.kint-rich table td,.kint-rich table th{padding:2px 4px}.kint-rich table dd,.kint-rich table dt{background:#fff}.kint-rich table tr:hover>td{box-shadow:none;background:#cfc}
PKW�1\�����*�*/vendor/kint-php/kint/resources/compiled/rich.jsnu�[���void 0===window.kintRich&&(window.kintRich=function(){"use strict";var n={selectText:function(e){var t=window.getSelection(),a=document.createRange();a.selectNodeContents(e),t.removeAllRanges(),t.addRange(a)},each:function(e,t){Array.prototype.slice.call(document.querySelectorAll(e),0).forEach(t)},hasClass:function(e,t){return!!e.classList&&(void 0===t&&(t="kint-show"),e.classList.contains(t))},addClass:function(e,t){void 0===t&&(t="kint-show"),e.classList.add(t)},removeClass:function(e,t){return void 0===t&&(t="kint-show"),e.classList.remove(t),e},toggle:function(e,t){var a=n.getChildren(e);a&&(void 0===t&&(t=n.hasClass(e)),t?n.removeClass(e):n.addClass(e),1===a.childNodes.length&&(a=a.childNodes[0].childNodes[0])&&n.hasClass(a,"kint-parent")&&n.toggle(a,t))},toggleChildren:function(e,t){var a=n.getChildren(e);if(a){var r=a.getElementsByClassName("kint-parent"),o=r.length;for(void 0===t&&(t=!n.hasClass(e));o--;)n.toggle(r[o],t)}},toggleAll:function(e){for(var t=document.getElementsByClassName("kint-parent"),a=t.length,r=!n.hasClass(e.parentNode);a--;)n.toggle(t[a],r)},switchTab:function(e){var t,a=e.previousSibling,r=0;for(n.removeClass(e.parentNode.getElementsByClassName("kint-active-tab")[0],"kint-active-tab"),n.addClass(e,"kint-active-tab");a;)1===a.nodeType&&r++,a=a.previousSibling;t=e.parentNode.nextSibling.childNodes;for(var o=0;o<t.length;o++)o===r?(t[o].style.display="block",1===t[o].childNodes.length&&(a=t[o].childNodes[0].childNodes[0])&&n.hasClass(a,"kint-parent")&&n.toggle(a,!1)):t[o].style.display="none"},mktag:function(e){return"<"+e+">"},openInNewWindow:function(e){var t=window.open();t&&(t.document.open(),t.document.write(n.mktag("html")+n.mktag("head")+n.mktag("title")+"Kint ("+(new Date).toISOString()+")"+n.mktag("/title")+n.mktag('meta charset="utf-8"')+document.getElementsByClassName("kint-rich-script")[0].outerHTML+document.getElementsByClassName("kint-rich-style")[0].outerHTML+n.mktag("/head")+n.mktag("body")+'<input style="width: 100%" placeholder="Take some notes!"><div class="kint-rich">'+e.parentNode.outerHTML+"</div>"+n.mktag("/body")),t.document.close())},sortTable:function(e,a){var t=e.tBodies[0];[].slice.call(e.tBodies[0].rows).sort(function(e,t){if(e=e.cells[a].textContent.trim().toLocaleLowerCase(),t=t.cells[a].textContent.trim().toLocaleLowerCase(),isNaN(e)||isNaN(t)){if(isNaN(e)&&!isNaN(t))return 1;if(isNaN(t)&&!isNaN(e))return-1}else e=parseFloat(e),t=parseFloat(t);return e<t?-1:t<e?1:0}).forEach(function(e){t.appendChild(e)})},showAccessPath:function(e){for(var t=e.childNodes,a=0;a<t.length;a++)if(n.hasClass(t[a],"access-path"))return void(n.hasClass(t[a],"kint-show")?n.removeClass(t[a]):(n.addClass(t[a]),n.selectText(t[a])))},showSearchBox:function(e){var t=e.querySelector(".kint-search");t&&(n.hasClass(t)?(n.removeClass(t),n.removeClass(e.parentNode,"kint-search-root")):(n.addClass(e),n.addClass(t),t.focus(),t.select(),n.search(t)))},search:function(e){var t=e.parentNode.parentNode;e.value.length?(e=n.findMatches(t,e.value),n.highlightMatches(t,e)):n.removeClass(t,"kint-search-root")},findMatches:function(e,t){for(var a=null,r=0;r<e.children.length;r++)if("DD"===e.children[r].tagName){a=e.children[r];break}if(!a)return[];var o=a.querySelectorAll("dfn"),s=[];return t=t.toLowerCase(),[].forEach.call(o,function(e){-1!=e.innerText.toLowerCase().indexOf(t)&&s.push(e)}),s},highlightMatches:function(e,t){var a=e.querySelectorAll(".kint-search-match");[].forEach.call(a,function(e){n.removeClass(e,"kint-search-match")}),n.addClass(e,"kint-search-root");for(var r=0;r<t.length;r++){for(var o,s=t[r];s!=e;)"DL"===s.tagName?n.addClass(s,"kint-search-match"):"LI"===s.tagName&&(s.parentNode.previousElementSibling.classList.contains("kint-tabs")&&(o=[].slice.call(s.parentNode.children).indexOf(s),n.addClass([].slice.call(s.parentNode.previousElementSibling.children)[o],"kint-search-match")),s=s.parentNode),s=s.parentNode;n.addClass(t[r],"kint-search-match")}},getParentByClass:function(e,t){for(void 0===t&&(t="kint-rich");(e=e.parentNode)&&!n.hasClass(e,t););return e},getParentHeader:function(e,t){for(var a=e.nodeName.toLowerCase();"dd"!==a&&"dt"!==a&&n.getParentByClass(e);)a=(e=e.parentNode).nodeName.toLowerCase();return n.getParentByClass(e)?("dd"===a&&t&&(e=e.previousElementSibling),e&&"dt"===e.nodeName.toLowerCase()&&n.hasClass(e,"kint-parent")?e:void 0):null},getChildren:function(e){for(;e=e.nextElementSibling,e&&"dd"!==e.nodeName.toLowerCase(););return e},isFolderOpen:function(){if(n.folder&&n.folder.querySelector("dd.kint-foldout"))return n.hasClass(n.folder.querySelector("dd.kint-foldout").previousSibling)},initLoad:function(){n.style=window.kintShared.dedupe("style.kint-rich-style",n.style),n.script=window.kintShared.dedupe("script.kint-rich-script",n.script),n.folder=window.kintShared.dedupe(".kint-rich.kint-folder",n.folder);var t,e=document.querySelectorAll("input.kint-search");[].forEach.call(e,function(t){function e(e){window.clearTimeout(a),void 0!==t.value&&(t.value,a=window.setTimeout(function(){n.search(t)},500))}var a=null;t.removeEventListener("keyup",e),t.addEventListener("keyup",e)}),n.folder&&(t=n.folder.querySelector("dd"),[].forEach.call(document.querySelectorAll(".kint-rich.kint-file"),function(e){e.parentNode!==n.folder&&t.appendChild(e)}),document.body.appendChild(n.folder),n.addClass(n.folder))},keyboardNav:{targets:[],target:0,active:!1,fetchTargets:function(){var e=n.keyboardNav.targets[n.keyboardNav.target];n.keyboardNav.targets=[],n.each(".kint-rich nav, .kint-tabs>li:not(.kint-active-tab)",function(e){n.isFolderOpen()&&!n.folder.contains(e)||0===e.offsetWidth&&0===e.offsetHeight||n.keyboardNav.targets.push(e)}),n.keyboardNav.target=n.keyboardNav.targets.indexOf(e)},sync:function(e){var t=document.querySelector(".kint-focused");t&&n.removeClass(t,"kint-focused"),n.keyboardNav.active&&(t=n.keyboardNav.targets[n.keyboardNav.target],n.addClass(t,"kint-focused"),e||n.keyboardNav.scroll(t))},scroll:function(e){var t=function(e){return e.offsetTop+(e.offsetParent?t(e.offsetParent):0)},a=t(e);n.folder?(e=n.folder.querySelector("dd.kint-foldout")).scrollTo(0,a-e.clientHeight/2):window.scrollTo(0,a-window.innerHeight/2)},moveCursor:function(e){for(n.keyboardNav.target+=e;n.keyboardNav.target<0;)n.keyboardNav.target+=n.keyboardNav.targets.length;for(;n.keyboardNav.target>=n.keyboardNav.targets.length;)n.keyboardNav.target-=n.keyboardNav.targets.length;n.keyboardNav.sync()},setCursor:function(e){if(n.isFolderOpen()&&!n.folder.contains(e))return!1;n.keyboardNav.fetchTargets();for(var t=0;t<n.keyboardNav.targets.length;t++)if(e===n.keyboardNav.targets[t])return n.keyboardNav.target=t,!0;return!1}},mouseNav:{lastClickTarget:null,lastClickTimer:null,lastClickCount:0,renewLastClick:function(){window.clearTimeout(n.mouseNav.lastClickTimer),n.mouseNav.lastClickTimer=window.setTimeout(function(){n.mouseNav.lastClickTarget=null,n.mouseNav.lastClickTimer=null,n.mouseNav.lastClickCount=0},250)}},style:null,script:null,folder:null};return window.addEventListener("click",function(e){var t=e.target,a=t.nodeName.toLowerCase();if(n.mouseNav.lastClickTarget&&n.mouseNav.lastClickTimer&&n.mouseNav.lastClickCount)return t=n.mouseNav.lastClickTarget,void(1===n.mouseNav.lastClickCount?(n.toggleChildren(t.parentNode),n.keyboardNav.setCursor(t),n.keyboardNav.sync(!0),n.mouseNav.lastClickCount++,n.mouseNav.renewLastClick()):(n.toggleAll(t),n.keyboardNav.setCursor(t),n.keyboardNav.sync(!0),n.keyboardNav.scroll(t),window.clearTimeout(n.mouseNav.lastClickTimer),n.mouseNav.lastClickTarget=null,n.mouseNav.lastClickTarget=null,n.mouseNav.lastClickCount=0));if(n.getParentByClass(t)){if("dfn"===a)n.selectText(t);else if("th"===a)return void(e.ctrlKey||n.sortTable(t.parentNode.parentNode.parentNode,t.cellIndex));if((t=n.getParentHeader(t))&&(n.keyboardNav.setCursor(t.querySelector("nav")),n.keyboardNav.sync(!0)),t=e.target,"li"===a&&"kint-tabs"===t.parentNode.className)"kint-active-tab"!==t.className&&n.switchTab(t),(t=n.getParentHeader(t,!0))&&(n.keyboardNav.setCursor(t.querySelector("nav")),n.keyboardNav.sync(!0));else if("nav"===a)"footer"===t.parentNode.nodeName.toLowerCase()?(n.keyboardNav.setCursor(t),n.keyboardNav.sync(!0),t=t.parentNode,n.hasClass(t)?n.removeClass(t):n.addClass(t)):(n.toggle(t.parentNode),n.keyboardNav.fetchTargets(),n.mouseNav.lastClickCount=1,n.mouseNav.lastClickTarget=t,n.mouseNav.renewLastClick());else if(n.hasClass(t,"kint-popup-trigger")){var r=t.parentNode;if("footer"===r.nodeName.toLowerCase())r=r.previousSibling;else for(;r&&!n.hasClass(r,"kint-parent");)r=r.parentNode;n.openInNewWindow(r)}else n.hasClass(t,"kint-access-path-trigger")?n.showAccessPath(t.parentNode):n.hasClass(t,"kint-search-trigger")?n.showSearchBox(t.parentNode):n.hasClass(t,"kint-search")||("pre"===a&&3===e.detail?n.selectText(t):n.getParentByClass(t,"kint-source")&&3===e.detail?n.selectText(n.getParentByClass(t,"kint-source")):n.hasClass(t,"access-path")?n.selectText(t):"a"!==a&&(t=n.getParentHeader(t))&&(n.toggle(t),n.keyboardNav.fetchTargets()))}},!0),window.addEventListener("keydown",function(e){if(e.target===document.body&&!e.altKey&&!e.ctrlKey){if(68===e.keyCode){if(n.keyboardNav.active)n.keyboardNav.active=!1;else if(n.keyboardNav.active=!0,n.keyboardNav.fetchTargets(),0===n.keyboardNav.targets.length)return void(n.keyboardNav.active=!1);return n.keyboardNav.sync(),void e.preventDefault()}if(n.keyboardNav.active){if(9===e.keyCode)return n.keyboardNav.moveCursor(e.shiftKey?-1:1),void e.preventDefault();if(38===e.keyCode||75===e.keyCode)return n.keyboardNav.moveCursor(-1),void e.preventDefault();if(40===e.keyCode||74===e.keyCode)return n.keyboardNav.moveCursor(1),void e.preventDefault();var t,a,r=n.keyboardNav.targets[n.keyboardNav.target];if("li"===r.nodeName.toLowerCase()){if(32===e.keyCode||13===e.keyCode)return n.switchTab(r),n.keyboardNav.fetchTargets(),n.keyboardNav.sync(),void e.preventDefault();if(39===e.keyCode||76===e.keyCode)return n.keyboardNav.moveCursor(1),void e.preventDefault();if(37===e.keyCode||72===e.keyCode)return n.keyboardNav.moveCursor(-1),void e.preventDefault()}r=r.parentNode,65===e.keyCode?(n.showAccessPath(r),e.preventDefault()):"footer"===r.nodeName.toLowerCase()&&n.hasClass(r.parentNode,"kint-rich")?32===e.keyCode||13===e.keyCode?(n.hasClass(r)?n.removeClass(r):n.addClass(r),e.preventDefault()):37===e.keyCode||72===e.keyCode?(n.removeClass(r),e.preventDefault()):39!==e.keyCode&&76!==e.keyCode||(n.addClass(r),e.preventDefault()):32===e.keyCode||13===e.keyCode?(n.toggle(r),n.keyboardNav.fetchTargets(),e.preventDefault()):39!==e.keyCode&&76!==e.keyCode&&37!==e.keyCode&&72!==e.keyCode||(t=37===e.keyCode||72===e.keyCode,n.hasClass(r)?n.toggleChildren(r,t):!t||(a=n.getParentHeader(r.parentNode.parentNode,!0))&&(r=a,n.keyboardNav.setCursor(r.querySelector("nav")),n.keyboardNav.sync()),n.toggle(r,t),n.keyboardNav.fetchTargets(),e.preventDefault())}}},!0),n}()),window.kintShared.runOnce(window.kintRich.initLoad);
PKW�1\²�W' ' :vendor/kint-php/kint/resources/compiled/solarized-dark.cssnu�[���.kint-rich{font-size:13px;overflow-x:auto;white-space:nowrap;background:#073642}.kint-rich.kint-folder{position:fixed;bottom:0;left:0;right:0;z-index:999999;width:100%;margin:0;display:block}.kint-rich.kint-folder dd.kint-foldout{max-height:calc(100vh - 100px);padding-right:10px;overflow-y:scroll;display:none}.kint-rich.kint-folder dd.kint-foldout.kint-show{display:block}.kint-rich::selection,.kint-rich::-moz-selection,.kint-rich::-webkit-selection{background:#268bd2;color:#839496}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #2aa198}.kint-rich,.kint-rich::before,.kint-rich::after,.kint-rich *,.kint-rich *::before,.kint-rich *::after{box-sizing:border-box;border-radius:0;color:#839496;float:none !important;font-family:Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;line-height:15px;margin:0;padding:0;text-align:left}.kint-rich{margin:10px 0}.kint-rich dt,.kint-rich dl{width:auto}.kint-rich dt,.kint-rich div.access-path{background:#002b36;border:1px solid #586e75;color:#839496;display:block;font-weight:bold;list-style:none outside none;overflow:auto;padding:5px}.kint-rich dt:hover,.kint-rich div.access-path:hover{border-color:#268bd2}.kint-rich>dl dl{padding:0 0 0 15px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzAgMTUwIj48ZGVmcz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNNCAzYTI0IDMyIDAgMCAxIDAgMjQgNDAgMjAtMTAgMCAxIDIzLTEyQTQwIDIwIDEwIDAgMSA0IDN6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSIjOTNhMWExIiBzdHJva2U9IiM5M2ExYTEiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxnIGZpbGw9IiM1ODZlNzUiIHN0cm9rZT0iIzU4NmU3NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzMCkiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxwYXRoIGQ9Ik02IDEyNmwxOCAxOG0tMTggMGwxOC0xOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM1ODZlNzUiLz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #586e75}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#268bd2;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#2aa198}.kint-rich dfn{font-style:normal;font-family:monospace;color:#93a1a1}.kint-rich pre{color:#839496;margin:0 0 0 15px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #586e75;background:#002b36;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(131,148,150,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#002b36;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#839496;background:#002b36}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #586e75;border-top-width:0;border-bottom-width:0;padding:5px;float:right !important;margin:-5px 0;color:#93a1a1;background:#073642;height:26px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#252525;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#1b1b1b}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#073642;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#839496}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#839496;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#93a1a1;border-bottom:1px dotted #93a1a1}.kint-rich ul{list-style:none;padding-left:15px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #586e75}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 15px;padding-left:0;background:#002b36;border:1px solid #586e75;border-top:0}.kint-rich ul.kint-tabs>li{background:#073642;border:1px solid #586e75;cursor:pointer;display:inline-block;height:30px;margin:3px;padding:0 15px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#268bd2;color:#2aa198}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#002b36;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:25px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#268bd2;color:#2aa198}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #586e75;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="%23FFF" d="M0 0h1v2h1V1H0z"/></svg>');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#268bd2}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2.5px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #586e75;padding:2.5px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#073642;color:#93a1a1}.kint-rich table td{background:#002b36;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #268bd2 inset}.kint-rich table tr:hover var{color:#2aa198}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:5px;padding-bottom:5px;border-bottom:1px solid #073642}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #268bd2;padding-right:10px;margin-right:10px}.kint-rich pre.kint-source>div.kint-highlight{background:#073642}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #268bd2,0 1px #268bd2,1px 0 #268bd2,0 -1px #268bd2;color:#002b36;font-weight:bold}body{background:#073642;color:#fff}.kint-rich{box-shadow:0 0 5px 3px #073642}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #859900 inset;border-radius:7px}.kint-rich>dl>dt,.kint-rich ul.kint-tabs{box-shadow:4px 0 2px -3px #268bd2 inset}.kint-rich ul.kint-tabs li.kint-active-tab{padding-top:7px;height:34px}.kint-rich footer li{color:#ddd}
PKW�1\:NP��5vendor/kint-php/kint/resources/compiled/solarized.cssnu�[���.kint-rich{font-size:13px;overflow-x:auto;white-space:nowrap;background:rgba(255,255,255,0.9)}.kint-rich.kint-folder{position:fixed;bottom:0;left:0;right:0;z-index:999999;width:100%;margin:0;display:block}.kint-rich.kint-folder dd.kint-foldout{max-height:calc(100vh - 100px);padding-right:10px;overflow-y:scroll;display:none}.kint-rich.kint-folder dd.kint-foldout.kint-show{display:block}.kint-rich::selection,.kint-rich::-moz-selection,.kint-rich::-webkit-selection{background:#268bd2;color:#657b83}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #2aa198}.kint-rich,.kint-rich::before,.kint-rich::after,.kint-rich *,.kint-rich *::before,.kint-rich *::after{box-sizing:border-box;border-radius:0;color:#657b83;float:none !important;font-family:Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;line-height:15px;margin:0;padding:0;text-align:left}.kint-rich{margin:10px 0}.kint-rich dt,.kint-rich dl{width:auto}.kint-rich dt,.kint-rich div.access-path{background:#fdf6e3;border:1px solid #93a1a1;color:#657b83;display:block;font-weight:bold;list-style:none outside none;overflow:auto;padding:5px}.kint-rich dt:hover,.kint-rich div.access-path:hover{border-color:#268bd2}.kint-rich>dl dl{padding:0 0 0 15px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzAgMTUwIj48ZGVmcz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNNCAzYTI0IDMyIDAgMCAxIDAgMjQgNDAgMjAtMTAgMCAxIDIzLTEyQTQwIDIwIDEwIDAgMSA0IDN6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSIjOTNhMWExIiBzdHJva2U9IiM5M2ExYTEiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxnIGZpbGw9IiM1ODZlNzUiIHN0cm9rZT0iIzU4NmU3NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzMCkiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxwYXRoIGQ9Ik02IDEyNmwxOCAxOG0tMTggMGwxOC0xOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM1ODZlNzUiLz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #93a1a1}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#268bd2;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#2aa198}.kint-rich dfn{font-style:normal;font-family:monospace;color:#586e75}.kint-rich pre{color:#657b83;margin:0 0 0 15px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #93a1a1;background:#fdf6e3;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(101,123,131,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#fdf6e3;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#657b83;background:#fdf6e3}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #93a1a1;border-top-width:0;border-bottom-width:0;padding:5px;float:right !important;margin:-5px 0;color:#586e75;background:#eee8d5;height:26px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#e2e2e2;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#f0f0f0}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#eee8d5;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#657b83}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#657b83;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#586e75;border-bottom:1px dotted #586e75}.kint-rich ul{list-style:none;padding-left:15px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #93a1a1}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 15px;padding-left:0;background:#fdf6e3;border:1px solid #93a1a1;border-top:0}.kint-rich ul.kint-tabs>li{background:#eee8d5;border:1px solid #93a1a1;cursor:pointer;display:inline-block;height:30px;margin:3px;padding:0 15px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#268bd2;color:#2aa198}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#fdf6e3;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:25px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#268bd2;color:#2aa198}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #93a1a1;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="%23FFF" d="M0 0h1v2h1V1H0z"/></svg>');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#268bd2}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2.5px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #93a1a1;padding:2.5px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#eee8d5;color:#586e75}.kint-rich table td{background:#fdf6e3;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #268bd2 inset}.kint-rich table tr:hover var{color:#2aa198}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:5px;padding-bottom:5px;border-bottom:1px solid #eee8d5}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #268bd2;padding-right:10px;margin-right:10px}.kint-rich pre.kint-source>div.kint-highlight{background:#eee8d5}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #268bd2,0 1px #268bd2,1px 0 #268bd2,0 -1px #268bd2;color:#fdf6e3;font-weight:bold}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #859900 inset;border-radius:7px}.kint-rich>dl>dt,.kint-rich ul.kint-tabs{box-shadow:4px 0 2px -3px #268bd2 inset}.kint-rich ul.kint-tabs li.kint-active-tab{padding-top:7px;height:34px}
PKW�1\q1vendor/kint-php/kint/resources/compiled/shared.jsnu�[���void 0===window.kintShared&&(window.kintShared=function(){"use strict";var e={dedupe:function(e,n){return[].forEach.call(document.querySelectorAll(e),function(e){n&&n.ownerDocument.contains(n)||(n=e),e!==n&&e.parentNode.removeChild(e)}),n},runOnce:function(e){"complete"===document.readyState?e():window.addEventListener("load",e)}};return window.addEventListener("click",function(e){var n;e.target.classList.contains("kint-ide-link")&&((n=new XMLHttpRequest).open("GET",e.target.href),n.send(null),e.preventDefault())}),e}());
PKW�1\<�`�FF0vendor/kint-php/kint/resources/compiled/plain.jsnu�[���void 0===window.kintPlain&&(window.kintPlain=function(){"use strict";var i={initLoad:function(){i.style=window.kintShared.dedupe("style.kint-plain-style",i.style),i.script=window.kintShared.dedupe("script.kint-plain-script",i.script)},style:null,script:null};return i}()),window.kintShared.runOnce(window.kintPlain.initLoad);
PKW�1\����4vendor/kint-php/kint/resources/compiled/original.cssnu�[���.kint-rich{font-size:13px;overflow-x:auto;white-space:nowrap;background:rgba(255,255,255,0.9)}.kint-rich.kint-folder{position:fixed;bottom:0;left:0;right:0;z-index:999999;width:100%;margin:0;display:block}.kint-rich.kint-folder dd.kint-foldout{max-height:calc(100vh - 100px);padding-right:8px;overflow-y:scroll;display:none}.kint-rich.kint-folder dd.kint-foldout.kint-show{display:block}.kint-rich::selection,.kint-rich::-moz-selection,.kint-rich::-webkit-selection{background:#0092db;color:#1d1e1e}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #5cb730}.kint-rich,.kint-rich::before,.kint-rich::after,.kint-rich *,.kint-rich *::before,.kint-rich *::after{box-sizing:border-box;border-radius:0;color:#1d1e1e;float:none !important;font-family:Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;line-height:15px;margin:0;padding:0;text-align:left}.kint-rich{margin:8px 0}.kint-rich dt,.kint-rich dl{width:auto}.kint-rich dt,.kint-rich div.access-path{background:#e0eaef;border:1px solid #b6cedb;color:#1d1e1e;display:block;font-weight:bold;list-style:none outside none;overflow:auto;padding:4px}.kint-rich dt:hover,.kint-rich div.access-path:hover{border-color:#0092db}.kint-rich>dl dl{padding:0 0 0 12px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAxNTAiPjxnIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0iI0ZGRiI+PHBhdGggZD0iTTEgMWgyOHYyOEgxem01IDE0aDE4bS05IDlWNk0xIDYxaDI4djI4SDF6bTUgMTRoMTgiIHN0cm9rZT0iIzM3OSIvPjxwYXRoIGQ9Ik0xIDMxaDI4djI4SDF6bTUgMTRoMThtLTkgOVYzNk0xIDkxaDI4djI4SDF6bTUgMTRoMTgiIHN0cm9rZT0iIzVBMyIvPjxwYXRoIGQ9Ik0xIDEyMWgyOHYyOEgxem01IDVsMTggMThtLTE4IDBsMTgtMTgiIHN0cm9rZT0iI0NDQyIvPjwvZz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #b6cedb}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#0092db;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#5cb730}.kint-rich dfn{font-style:normal;font-family:monospace;color:#1d1e1e}.kint-rich pre{color:#1d1e1e;margin:0 0 0 12px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #b6cedb;background:#e0eaef;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(29,30,30,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#e0eaef;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#1d1e1e;background:#e0eaef}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #b6cedb;border-top-width:0;border-bottom-width:0;padding:4px;float:right !important;margin:-4px 0;color:#1d1e1e;background:#c1d4df;height:24px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#d0d0d0;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#e8e8e8}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#c1d4df;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#1d1e1e}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#1d1e1e;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#1d1e1e;border-bottom:1px dotted #1d1e1e}.kint-rich ul{list-style:none;padding-left:12px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #b6cedb}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 12px;padding-left:0;background:#e0eaef;border:1px solid #b6cedb;border-top:0}.kint-rich ul.kint-tabs>li{background:#c1d4df;border:1px solid #b6cedb;cursor:pointer;display:inline-block;height:24px;margin:2px;padding:0 12px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#0092db;color:#5cb730}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#e0eaef;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:20px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#0092db;color:#5cb730}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #b6cedb;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="%23FFF" d="M0 0h1v2h1V1H0z"/></svg>');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#0092db}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #b6cedb;padding:2px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#c1d4df;color:#1d1e1e}.kint-rich table td{background:#e0eaef;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #0092db inset}.kint-rich table tr:hover var{color:#5cb730}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:4px;padding-bottom:4px;border-bottom:1px solid #c1d4df}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #0092db;padding-right:8px;margin-right:8px}.kint-rich pre.kint-source>div.kint-highlight{background:#c1d4df}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #0092db,0 1px #0092db,1px 0 #0092db,0 -1px #0092db;color:#e0eaef;font-weight:bold}.kint-rich>dl>dt{background:linear-gradient(to bottom, #e3ecf0 0, #c0d4df 100%)}.kint-rich ul.kint-tabs{background:linear-gradient(to bottom, #9dbed0 0px, #b2ccda 100%)}.kint-rich>dl:not(.kint-trace)>dd>ul.kint-tabs li{background:#e0eaef}.kint-rich>dl:not(.kint-trace)>dd>ul.kint-tabs li.kint-active-tab{background:#c1d4df}.kint-rich>dl.kint-trace>dt{background:linear-gradient(to bottom, #c0d4df 0px, #e3ecf0 100%)}.kint-rich .kint-source .kint-highlight{background:#f0eb96}
PKW�1\׵ mEE1vendor/kint-php/kint/resources/compiled/plain.cssnu�[���.kint-plain{background:rgba(255,255,255,0.9);white-space:pre;display:block;font-family:monospace;color:#222}.kint-plain i{color:#d00;font-style:normal}.kint-plain u{color:#030;text-decoration:none;font-weight:bold}.kint-plain .kint-microtime-lap{font-weight:bold;text-shadow:1px 0 #fff, 0 1px #fff, -1px 0 #fff, 0 -1px #fff}
PKW�1\��7�vvvendor/kint-php/kint/LICENSEnu�[���The MIT License (MIT)

Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PKW�1\�|l,�	�	vendor/kint-php/kint/init.phpnu�[���<?php

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

use Kint\Kint;
use Kint\Utils;

if (\defined('KINT_DIR')) {
    return;
}

if (\version_compare(PHP_VERSION, '5.6') < 0) {
    throw new Exception('Kint 4.0 requires PHP 5.6 or higher');
}

\define('KINT_DIR', __DIR__);
\define('KINT_WIN', DIRECTORY_SEPARATOR !== '/');
\define('KINT_PHP70', (\version_compare(PHP_VERSION, '7.0') >= 0));
\define('KINT_PHP71', (\version_compare(PHP_VERSION, '7.1') >= 0));
\define('KINT_PHP72', (\version_compare(PHP_VERSION, '7.2') >= 0));
\define('KINT_PHP73', (\version_compare(PHP_VERSION, '7.3') >= 0));
\define('KINT_PHP74', (\version_compare(PHP_VERSION, '7.4') >= 0));
\define('KINT_PHP80', (\version_compare(PHP_VERSION, '8.0') >= 0));

// Dynamic default settings
Kint::$file_link_format = \ini_get('xdebug.file_link_format');
if (isset($_SERVER['DOCUMENT_ROOT'])) {
    Kint::$app_root_dirs = [
        $_SERVER['DOCUMENT_ROOT'] => '<ROOT>',
        \realpath($_SERVER['DOCUMENT_ROOT']) => '<ROOT>',
    ];
}

Utils::composerSkipFlags();

if ((!\defined('KINT_SKIP_FACADE') || !KINT_SKIP_FACADE) && !\class_exists('Kint')) {
    \class_alias('Kint\\Kint', 'Kint');
}

if (!\defined('KINT_SKIP_HELPERS') || !KINT_SKIP_HELPERS) {
    require_once __DIR__.'/init_helpers.php';
}
PKW�1\ߥ��vendor/autoload.phpnu�[���<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit8220a43530df22c16ecbd82dcfa9b2be::getLoader();
PKW�1\m_e6{{class-ns-cloner-schedule.phpnu�[���<?php
/**
 * Cloner Scheduling / cron class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Class NS_Cloner_Schedule
 *
 * Manages the cron schedule for cloning operations.
 * Mainly used right now for registration templates.
 */
class NS_Cloner_Schedule {

	/**
	 * Cron hook id for scheduled events.
	 *
	 * @var string
	 */
	private $cron_id = 'ns_cloner_cron';

	/**
	 * Option/sitemeta key for scheduled event queue.
	 *
	 * @var string
	 */
	private $cron_data_key = 'ns_cloner_scheduled';

	/**
	 * NS_Cloner_Schedule constructor.
	 */
	public function __construct() {
		// Register handler for cloner cron events.
		add_action( $this->cron_id, [ $this, 'handle' ] );
		// Add new (default 2 min) interval to existing wp cron intervals.
		add_filter( 'cron_schedules', [ $this, 'register_interval' ] );
	}

	/**
	 * Register new WP cron interval
	 *
	 * @param array $schedules Existing schedule intervals.
	 * @return array
	 */
	public function register_interval( $schedules ) {
		$ref               = $this->cron_id . '_interval';
		$minutes           = apply_filters( 'ns_cloner_cron_interval', 2 );
		$schedules[ $ref ] = array(
			'interval' => MINUTE_IN_SECONDS * $minutes,
			'display'  => sprintf( 'Every %d Minutes', $minutes ),
		);
		return $schedules;
	}

	/**
	 * Schedule a cloning operation for the future
	 *
	 * @param array  $request Request to set for scheduled operation.
	 * @param int    $time Time to schedule event.
	 * @param string $caller Description of calling source, for debugging/management.
	 */
	public function add( $request, $time, $caller ) {
		// Add timing info to the request for info / debugging.
		$request = array_merge(
			$request,
			[
				'user_id'    => get_current_user_id(),
				'_caller'    => $caller,
				'_created'   => time(),
				'_scheduled' => $time,
			]
		);
		// Add the scheduled request to the queue of scheduled operations.
		$scheduled          = $this->get();
		$scheduled[ $time ] = $request;
		// Sort by key (time) to save operations in the order they were scheduled, if there's more than one.
		ksort( $scheduled );
		$this->update( $scheduled );
		// Process event - decide whether run now or later.
		if ( $time <= time() && ! ns_cloner()->process_manager->is_in_progress() ) {
			// Run now if applicable (no need to wait for scheduler).
			$this->handle();
		} else {
			// Schedule for future.
			$next = wp_next_scheduled( $this->cron_id );
			if ( ! $next || $next > $time ) {
				wp_schedule_event( $time, $this->cron_id . '_interval', $this->cron_id );
			}
		}
	}

	/**
	 * Get all scheduled clone requests
	 *
	 * @return array
	 */
	public function get() {
		return get_site_option( $this->cron_data_key, [] );
	}

	/**
	 * Update the queue of scheduled operations.
	 *
	 * @param array $scheduled Queue of operation requests.
	 */
	public function update( $scheduled ) {
		update_site_option( $this->cron_data_key, $scheduled );
	}

	/**
	 * Remove an item or items from the scheduled queue of cloning operations.
	 *
	 * @param int|string $index Index of operation to delete, defaults to all of them.
	 */
	public function delete( $index = null ) {
		if ( ! $index ) {
			delete_site_option( $this->cron_data_key );
		} else {
			$scheduled = $this->get();
			if ( isset( $scheduled[ $index ] ) ) {
				unset( $scheduled[ $index ] );
				$this->update( $scheduled );
			}
		}
	}

	/**
	 * Handle the fulfillment of a scheduled cron cloner operation
	 */
	public function handle() {
		// Ensure that plugin functions are available in cron environment.
		include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
		$scheduled = $this->get();
		if ( ns_cloner()->process_manager->is_in_progress() ) {
			// Do wrap up for any hanging operations that didn't call their own finish() for one reason or another.
			ns_cloner()->process_manager->maybe_finish();
		} elseif ( empty( $this->get() ) ) {
			// Cancel the cron event if there are no scheduled operations to come back for.
			wp_clear_scheduled_hook( $this->cron_id );
		} else {
			// There is at least one operation, and no cloning is in progress, so get started.
			$next_request = array_shift( $scheduled );
			foreach ( $next_request as $key => $value ) {
				ns_cloner_request()->set( $key, $value );
			}
			ns_cloner_request()->set_up_vars();
			// Run init to begin.
			ns_cloner()->process_manager->init();
			// Update -  using array_shift() means scheduled_ops already had the current operation removed from it.
			$this->update( $scheduled );
		}
	}

}
PKW�1\e�J��#abstracts/class-ns-cloner-addon.phpnu�[���<?php
/**
 * Cloner Addon base class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Base class for all NS Cloner addons
 *
 * Add-ons used to be their own standalone plugins - they are now just logical containers
 * for groups of related functionality (modes, settings, and their supporting functions)
 */
abstract class NS_Cloner_Addon {

	/**
	 * Display name for the addon (not currently used/displayed).
	 *
	 * This was used in the previous architecture where each addon was a standalone plugin,
	 * and extensions were bought separately. Leaving here in case we ever use it again.
	 *
	 * @var string
	 */
	public $title = '';

	/**
	 * Path to the plugin directory that contains the addon.
	 *
	 * Should be defined in the constructor of the child class.
	 * Useful for registering sections and background processes
	 * (provide path to NS_Cloner functions autoload them).
	 *
	 * @var string
	 */
	public $plugin_path = '';

	/**
	 * URL to the plugin directory that contains the addon.
	 *
	 * Should be defined in the constructor of the child class.
	 * Useful for enqueueing assets
	 *
	 * @var string
	 */
	public $plugin_url = '';

	/**
	 * Registers actions to save repetition for descendant classes
	 */
	public function __construct() {
		add_action( 'ns_cloner_init', array( $this, 'init' ) );
		add_action( 'ns_cloner_enqueue_scripts', array( $this, 'admin_enqueue' ) );
	}

	/**
	 * Runs after core modes and sections are loaded - use this to register new modes and sections
	 */
	public function init() {
	}

	/**
	 * Runs on wp_enqueue_scripts, but only on Cloner admin pages
	 */
	public function admin_enqueue() {
	}

}

PKW�1\#N��B�B%abstracts/class-ns-cloner-process.phpnu�[���<?php
/**
 * Cloner Background Process base class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Process base class.
 *
 * Extends WP_Background_Process with progress-tracking framework to enable individual
 * Cloner child processes to automatically track and report their progress.
 */
abstract class NS_Cloner_Process extends WP_Background_Process {

	/**
	 * Prefix for saved options
	 *
	 * @var string
	 */
	protected $prefix = 'ns_cloner';

	/**
	 * Unique key for the current batch
	 *
	 * @var string
	 */
	protected $batch_key = '';

	/**
	 * Unique value for transient lock to differentiate dispatches/instances
	 *
	 * @var string
	 */
	protected $lock_id = '';

	/**
	 * Number of completed tasks in the current session
	 *
	 * @var int
	 */
	protected $task_count = 0;

	/**
	 * User friendly label for what type of object this process handles
	 *
	 * @var string
	 */
	public $report_label = '';

	/**
	 * Push to queue, modified to limit to a maximum batch size.
	 *
	 * @param mixed $data Data.
	 *
	 * @return $this
	 */
	public function push_to_queue( $data ) {
		$this->data[] = $data;

		// Check for exceeding maximum batch size.
		$max_batch = apply_filters( $this->identifier . '_max_batch', 5000 );
		if ( count( $this->data ) >= $max_batch ) {
			ns_cloner()->log->log( "REACHING max batch of *$max_batch* in queue - autosaving and starting new" );
			$this->save();
		}

		return $this;
	}

	/**
	 * Save queue
	 *
	 * @return $this
	 */
	public function save() {
		$this->batch_key = $this->generate_key();
		if ( ! empty( $this->data ) ) {
			// Save the batch/queue items themselves.
			update_site_option( $this->batch_key, $this->data );
			ns_cloner()->log->log( "SAVING batch for $this->identifier with " . count( $this->data ) . ' items.' );
			ns_cloner()->log->handle_any_db_errors();
			// Save progress data for this batch.
			// If we want to have an item whose progress is not tracked, we can add 'ignore_progress' to it.
			// Only items without an ignore_progress key will affect the total and completed progress values.
			$tracked_items = array_filter(
				$this->data,
				function( $item ) {
					return ! isset( $item['ignore_progress'] );
				}
			);
			$this->update_batch_progress(
				$this->batch_key,
				[
					'total'     => count( $tracked_items ),
					'completed' => 0,
				]
			);
			// Clear the data in case this process is reused on the same request for another batch.
			$this->data = [];
		}
		return $this;
	}

	/**
	 * Get a nonce for dispatching this process.
	 *
	 * @return string
	 */
	public function get_nonce() {
		return wp_create_nonce( $this->identifier );
	}

	/**
	 * Dispatch process
	 *
	 * Modify this to immediately run complete if the queue is empty,
	 * so that other dependent background processes can begin.
	 */
	public function dispatch() {
		if ( $this->is_queue_empty() ) {
			$this->complete();
		} else {
			update_site_option( "{$this->identifier}_dispatched", time() );
			ns_cloner()->log->log( "DISPATCHING *$this->identifier* to " . add_query_arg( $this->get_query_args(), $this->get_query_url() ) );
			$response = parent::dispatch();
			ns_cloner()->log->log( [ 'RECEIVED response to dispatch', $response ] );
		}
		return $this;
	}

	/**
	 * Is process running
	 *
	 * Change this from protected in the parent to public visibility here,
	 * and use lock method that does hard write to the db to prevent overlap.
	 *
	 * @return bool
	 */
	public function is_process_running() {
		ns_cloner()->process_manager->doing_cloning();
		$lock_value = ns_cloner()->db->get_var(
			ns_prepare_option_query(
				'SELECT {value} FROM {table} WHERE {key} = %s',
				$this->identifier . '_lock'
			)
		);
		if ( isset( $_REQUEST['force_process'] ) ) {
			ns_cloner()->log->log( "FORCING manual run for *$this->identifier* - overriding any existing instances" );
			if ( $lock_value ) {
				ns_cloner()->log->log( "FOUND existing lock $lock_value so deleting it" );
				ns_cloner()->db->query(
					ns_prepare_option_query(
						'DELETE FROM {table} WHERE {key} = %s',
						$this->identifier . '_lock'
					)
				);
			}
		} elseif ( empty( $lock_value ) ) {
			ns_cloner()->log->log( "CHECKING for running *$this->identifier* - none found" );
			return false;
		} elseif ( $lock_value === $this->lock_id ) {
			ns_cloner()->log->log( "CHECKING for running *$this->identifier* - the running process is the current one ($this->lock_id)" );
			return false;
		} else {
			ns_cloner()->log->log( "CHECKING for running *$this->identifier* - found $lock_value" );
			return true;
		}
	}

	/**
	 * Lock process
	 *
	 * Add delay to locking to prevent race conditions, and modified to use direct database
	 * calls rather than transients, because transients can caching
	 */
	protected function lock_process() {
		// Set start time so we can track and avoid timeout.
		$this->start_time = time();
		// Generate unique id for this lock/instance - lets us check in is_process_running()
		// whether the set lock belongs to the current session/instance or another one.
		$this->lock_id = wp_generate_password();
		// Save the lock to db.
		ns_cloner()->log->log( "LOCKING *$this->identifier* with id $this->lock_id" );
		ns_cloner()->db->query(
			ns_prepare_option_query(
				'INSERT INTO {table} ({key}, {value}) VALUES (%s, %s)',
				[ $this->identifier . '_lock', $this->lock_id ]
			)
		);
		// Then wait 0.5 seconds to make sure a simultaneous lock hasn't been set.
		// Query DB directly because cache won't know if another instance overwrote the lock.
		// If the set lock isn't from this (earlier) instance, bail and let the later instance take over.
		usleep( apply_filters( 'ns_cloner_process_lock_delay', 0.5 * 1000000 ) );
		if ( $this->get_lock() !== $this->lock_id ) {
			ns_cloner()->log->log( "DETECTED simultaneous *$this->identifier* - ending" );
			exit;
		}
	}

	/**
	 * Get the current lock instance id for a process, if present
	 *
	 * @return string|null
	 */
	protected function get_lock() {
		return ns_cloner()->db->get_var(
			ns_prepare_option_query(
				'SELECT {value} FROM {table} WHERE {key} = %s',
				$this->identifier . '_lock'
			)
		);
	}

	/**
	 * Handle
	 *
	 * Pass each queue item to the task handler, while remaining
	 * within server memory and time limit constraints.
	 */
	public function handle() {
		// Initialize sections because this is what all the section hooks get set up on.
		ns_cloner()->process_manager->doing_cloning();
		ns_cloner()->log->log_break();
		ns_cloner()->log->log( "HANDLING <b>$this->action</b> async request" );
		ns_cloner()->log->log( [ 'DISPATCHED from:', isset( $_REQUEST['ajax'] ) ? 'client' : 'server' ] );
		// Remove dispatched flag/timestamp so frontend won't keep dispatching it.
		delete_site_option( "{$this->identifier}_dispatched" );
		// Pass back to parent for handling.
		parent::handle();
	}

	/**
	 * Task
	 *
	 * Override this method to perform any actions required on each
	 * queue item. Return the modified item for further processing
	 * in the next pass through. Or, return false to remove the
	 * item from the queue.
	 *
	 * @param mixed $item Queue item to iterate over.
	 *
	 * @return mixed
	 */
	protected function task( $item ) {
		// If we want to have an item whose progress is not tracked, we can add 'ignore_progress' to it.
		// Only items without an ignore_progress key will affect the total and completed progress values.
		if ( ! isset( $item['ignore_progress'] ) ) {
			$this->task_count++;
		}
		// Update task count only if it's above threshold. Update too often and you lose performance,
		// update too seldom and you lose responsiveness in the progress UI.
		$progress_update_interval = apply_filters( 'ns_cloner_progress_update_interval', 5, $this->identifier );
		if ( $this->task_count >= $progress_update_interval ) {
			$progress = $this->get_batch_progress( $this->batch_key );
			$this->update_batch_progress(
				$this->batch_key,
				[ 'completed' => $progress['completed'] + $this->task_count ]
			);
			$this->task_count = 0;
		}
		return false;
	}

	/**
	 * Unlock process
	 *
	 * Unlock the process so that other instances can spawn.
	 * Modified to include after_handle() - see that function for details.
	 *
	 * @return $this
	 */
	protected function unlock_process() {
		$this->after_handle();
		ns_cloner()->db->query(
			ns_prepare_option_query(
				'DELETE FROM {table} WHERE {key} = %s',
				$this->identifier . '_lock'
			)
		);
		return $this;
	}

	/**
	 * Run actions after completing a set of tasks.
	 *
	 * This is so we have a way to do a complete-type action that runs not just at the veru end but after each
	 * session of the process (i.e. after resources limits are reached and it's going to dispatch a new
	 * version of itself). That's useful for submitting remote requests, saving progress, anything that
	 * needs current state of cross-task variables.
	 */
	protected function after_handle() {
		$progress = $this->get_batch_progress( $this->batch_key );
		$this->update_batch_progress(
			$this->batch_key,
			[ 'completed' => $progress['completed'] + $this->task_count ]
		);
	}

	/**
	 * Complete.
	 *
	 * Override if applicable, but ensure that the below actions are
	 * performed, or, call parent::complete().
	 */
	protected function complete() {
		ns_cloner()->log->log( "COMPLETING *$this->identifier*" );
		parent::complete();
		// Add action so that dependent processes can start.
		do_action( $this->identifier . '_complete' );
		// Check if this was the last process to complete, and the operation can be finished.
		ns_cloner()->process_manager->maybe_finish();
	}

	/**
	 * Cancel
	 *
	 * Different from cancel_process in parent. This removes ALL batches,
	 * not just the top one, and it removes saved progress for batches that
	 * have been completed (thus should be called after progress data is no
	 * longer needed - i.e. reporting has already been made). It also clears
	 * any scheduled cron health check in the future.
	 */
	public function cancel() {
		ns_cloner()->db->query(
			ns_prepare_option_query(
				'DELETE FROM {table} WHERE {key} LIKE %s',
				$this->identifier . '_%'
			)
		);
		wp_clear_scheduled_hook( $this->cron_hook_identifier );
		ns_cloner()->log->log( "ENDING $this->action background process and clearing data." );
	}

	/**
	 * Is queue empty
	 *
	 * Change this from protected in the parent to public visibility here
	 *
	 * @return bool
	 */
	public function is_queue_empty() {
		return parent::is_queue_empty();
	}

	/**
	 * Time exceeded.
	 *
	 * Uses parent's time checking, but adds checking for if the cloner has exited.
	 * This is because a process could load a large batch of items into it's memory,
	 * and then just keep looping through them even after 'exit' has been called,
	 * which can make the manual cancel button not work. Still, we don't want to
	 * check EVERY single item because that will decrease performance. Checking
	 * every 5 items is the compromise.
	 *
	 * @return bool
	 */
	protected function time_exceeded() {
		$exceeded = parent::time_exceeded();
		if ( $exceeded ) {
			ns_cloner()->log->log( "EXCEEDED TIME for $this->identifier" );
		}
		// Task count will count from 1-5 and then start over - see task() - so check for exit flag every 5th task.
		if ( 1 === $this->task_count ) {
			// Check exited flag directly to bypass options cache.
			$exited = ns_cloner()->db->get_var(
				ns_prepare_option_query(
					'SELECT {value} FROM {table} WHERE {key} = %s',
					'ns_cloner_exited'
				)
			);
			if ( $exited ) {
				// Need to call cancel, even though it will have already been called once,
				// to erase the extra progress records that may after been recorded since then.
				$this->cancel();
				return true;
			}
		}
		// Normally just use inherited time checking.
		return $exceeded;
	}

	/**
	 * Memory exceeded
	 *
	 * Simply add logging to parent method.
	 *
	 * @return bool
	 */
	protected function memory_exceeded() {
		$exceeded = parent::memory_exceeded();
		if ( $exceeded ) {
			ns_cloner()->log->log( "EXCEEDED MEMORY for $this->identifier with usage of " . size_format( memory_get_usage( true ) ) );
		}
		return $exceeded;
	}

	/**
	 * Get memory limit
	 *
	 * Override because parent doesn't handle values for other units than MB.
	 *
	 * @return int
	 */
	protected function get_memory_limit() {
		if ( function_exists( 'ini_get' ) ) {
			$memory_limit = ini_get( 'memory_limit' );
			if ( ! $memory_limit || -1 == $memory_limit ) {
				// Unlimited, set to 32GB.
				$memory_limit = '32G';
			}
		} else {
			// Sensible default.
			$memory_limit = '128M';
		}

		return wp_convert_hr_to_bytes( $memory_limit );
	}

	/**
	 * Get the next batch for this process, and save the unique batch key to reference progress
	 *
	 * @return stdClass
	 */
	public function get_batch() {
		// Use this as a convenient hook to check for a newer log file, and keep long running
		// background processes from writing to the same log file forever and making it gigantic.
		ns_cloner()->log->refresh();
		// Get batch and store key.
		$batch           = parent::get_batch();
		$this->batch_key = $batch->key;
		return $batch;
	}

	/**
	 * Get progress of all existing background process batches.
	 *
	 * Query for progress rows, not the batch data entries themselves, because the batch
	 * data will be deleted by handle() once the batch is complete, but the batch
	 * progress will remain saved for reference until it is cleared with cancel().
	 *
	 * Note that the result uses the batch key, but the value is the value of the
	 * progress record. Essentially this takes the two records that get saved for
	 * every batch - one to store the data and one to store the completion progress
	 * of that batch - and combines them with they key of one and that value of the
	 * other, so the data could easily be retrieved using the batch key (if it hasn't
	 * been completed and deleted yet), but the more often used progress data is the
	 * the easiest to access (provided right in the returned result).
	 *
	 * @return array
	 */
	private function get_batches() {
		$batches = [];
		// Get all progress records for this bg process.
		$progress_rows = ns_cloner()->db->get_results(
			ns_prepare_option_query(
				"SELECT {key} as 'key', {value} as 'value' FROM {table} WHERE {key} LIKE %s	ORDER BY {id} ASC",
				$this->identifier . '_progress_%'
			)
		);
		foreach ( $progress_rows as $row ) {
			$batch_key = str_replace( 'progress', 'batch', $row->key );
			$progress  = json_decode( $row->value, true );
			// Add to results - keyed by the *batch key* but the value is the *progress value*.
			$batches[ $batch_key ] = $progress;
		}
		return $batches;
	}

	/**
	 * Update information about this process' current progress
	 *
	 * @param string $batch_key Unique key of batch to get progress for.
	 * @param array  $data Progress data to update.
	 */
	public function update_batch_progress( $batch_key, $data ) {
		$progress_key = str_replace( 'batch', 'progress', $batch_key );
		if ( empty( $data ) ) {
			// Delete the progress it if was set to a blank value.
			delete_site_option( $progress_key );
			ns_cloner()->log->log( "DELETING progress for <b>$batch_key</b>" );
		} else {
			// Otherwise, update progress with the provided values.
			$progress     = $this->get_batch_progress( $batch_key );
			$new_progress = wp_json_encode( array_merge( $progress, $data ) );
			update_site_option( $progress_key, $new_progress );
			ns_cloner()->log->log( [ 'UPDATING ' . $progress_key, $new_progress ] );
		}
	}

	/**
	 * Get information about this process' current progress
	 *
	 * @param string $batch_key Unique key of batch to get progress for.
	 * @return array|mixed
	 */
	public function get_batch_progress( $batch_key ) {
		$progress_key = str_replace( 'batch', 'progress', $batch_key );
		$progress     = json_decode( get_site_option( $progress_key ), true );
		if ( ! is_array( $progress ) ) {
			$progress = [
				'total'     => 0,
				'completed' => 0,
			];
		}
		return $progress;
	}

	/**
	 * Get total progress of all batches, not just the current one
	 *
	 * @return array|mixed
	 */
	public function get_total_progress() {
		$progress = [
			'completed' => 0,
			'total'     => 0,
		];
		// Loop through each batch and aggregate progress data.
		foreach ( $this->get_batches() as $batch_key => $batch_progress ) {
			// Add item counts together.
			$progress['completed'] += $batch_progress['completed'];
			$progress['total']     += $batch_progress['total'];
		}
		return $progress;
	}

}

PKW�1\$�}���%abstracts/class-ns-cloner-section.phpnu�[���<?php
/**
 * Cloner Section base class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Base class for all NS Cloner sections (self contained steps in the cloning process)
 *
 * Child classes will most commonly provide process_init(), render() and validate() functions.
 * See below for details on those - they  will all automatically be called at proper point.
 * Naming is critical, because we load everything dynamically / automatically. If properly named, sections can
 * be added to the Cloner without modifying any original code, just by using the add-on architecture and hooks.
 * General rules:
 * - the file name must be in the format 'ns-cloner-section-new-stuff.php'
 * - the class name must be in the format 'NS_Cloner_Section_New_Stuff'
 * - the $id property must be in the format 'new_stuff'
 */
abstract class NS_Cloner_Section {

	/**
	 *  Slug to use as id for the html section and any other time section needs to be referenced.
	 *
	 * @var string
	 */
	public $id;

	/**
	 * Array of mode ids that are supported by this section
	 *
	 * @var array
	 */
	public $modes_supported = [];

	/**
	 * Display order relative to other sections (lower number is displayed higher on page).
	 *
	 * @var int
	 */
	public $ui_priority;

	/**
	 * List of errors populated by the validate() method.
	 *
	 * @var array
	 */
	protected $errors = [];

	/**
	 * NS_Cloner_Section constructor.
	 */
	public function __construct() {
		// Automatically register these hooks so children don't have to repeat.
		add_action( 'ns_cloner_render_sections', array( $this, 'render' ), $this->ui_priority );
		// Enable new modes to use existing sections by adding supported modes.
		$this->modes_supported = apply_filters( "ns_cloner_section_{$this->id}_modes_supported", $this->modes_supported );
	}


	/**
	 * Call the process_init() method, but only if the current clone mode is supported by this section.
	 *
	 * This function gets called via NS_Cloner_Manager->doing_cloning() for each cloning process session
	 * (e.g. once when process started, once when each background process is handled, when a progress check
	 * triggers finish() in the process manager, etc). See doing_cloning() for more info.
	 */
	public function maybe_process_init() {
		if ( ns_cloner_request()->is_mode( $this->modes_supported ) ) {
			ns_cloner()->log->log( "ENTERING *process_init* for the *{$this->id}* section." );
			$this->process_init();
		}
	}

	/**
	 * Do any setup before starting the cloning process.
	 *
	 * This is where sections should add register any cloning process related hooks.
	 */
	public function process_init() {
	}

	/**
	 * Output first part of HTML for section settings page on the cloner admin page.
	 *
	 * @param string $title Title to be shown on admin page settings box.
	 * @param string $step_label Label to be shown in list of steps in clone bar at the bottom of the admin screen.
	 * @param string $help_text Additional help text to explain section usage.
	 */
	public function open_section_box( $title, $step_label = '', $help_text = '' ) {
		$mode_list = join( ' ', $this->modes_supported );
		?>
		<section class="ns-cloner-section" id="ns-cloner-section-<?php echo esc_attr( $this->id ); ?>" data-modes="<?php echo esc_attr( $mode_list ); ?>" data-button-step="<?php echo esc_attr( $step_label ); ?>">
		<div class="ns-cloner-section-header">
			<h4><?php echo esc_html( $title ); ?></h4>
			<span class="ns-cloner-section-help"><?php echo esc_html( $help_text ); ?></span>
			<span class="ns-cloner-section-collapse"></span>
		</div>
		<div class="ns-cloner-section-content">
		<?php
		do_action( "ns_cloner_open_section_box_{$this->id}" );
	}

	/**
	 * Output the HTML content of the section settings box on the cloner admin page.
	 */
	public function render() {
	}

	/**
	 * Output last part of HTML for section settings page on the cloner admin page.
	 */
	public function close_section_box() {
		do_action( "ns_cloner_close_section_box_{$this->id}" );
		?>
		</div><!-- /.ns-cloner-section-content -->
		</section><!-- /.ns-cloner-section -->
		<?php
	}

	/**
	 * Check ns_cloner_request() and any validation error messages to $this->errors
	 *
	 * @return void
	 */
	public function validate() {
	}

	/**
	 * Get array of error messages for this section.
	 *
	 * @return array
	 */
	public function get_errors() {
		return $this->errors;
	}
}

?>
PKW�1\�K��-�-&features/class-ns-cloner-analytics.phpnu�[���<?php

if ( ! class_exists( 'NS_Cloner_Export_Analytics_Process' ) ) {
	require_once NS_CLONER_V4_PLUGIN_DIR . 'processes/class-ns-cloner-export-analytics-process.php';
}

/**
 * Class NS_Cloner_Analytics
 */
class NS_Cloner_Analytics {
	/**
	 * Available analytics modes
	 *
	 * @var array
	 */
	protected $user_modes;

	/**
	 * Currently saved analytics mode
	 *
	 * @var mixed|void
	 */
	protected $user_saved_mode;

	/**
	 * Analytics saved mode option name
	 *
	 * @var string
	 */
	protected $user_saved_mode_option_name = 'ns_cloner_analytics_mode';

	/**
	 * Datetime analytics mode was last saved
	 *
	 * @var mixed|void
	 */
	protected $user_last_saved_mode;

	/**
	 * Datetime analytics mode was last saved option name
	 *
	 * @var string
	 */
	protected $user_last_saved_mode_option_name = 'ns_cloner_analytics_mode_last_saved';

	/**
	 * DB table name for analytics entries
	 *
	 * @var string
	 */
	protected $db_analytics_table;

	/**
	 * Service client endpoint URL for sending analytics rows
	 *
	 * @var string
	 */
	protected $service_client_url = 'https://fba.atouchpoint.com/api/send-cloner-analytics';

	/**
	 * Singleton instance
	 *
	 * @var null
	 */
	private static $instance = null;

	/**
	 * Get singleton instance
	 *
	 * @return NS_Cloner_Analytics|null
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * NS_Cloner_Analytics constructor.
	 */
	public function __construct() {
		$this->user_modes           = array(
			'share'             => array(
				'text' => __( 'Yes, Share', 'ns-cloner-site-copier' )
			),
			'share_anonymously' => array(
				'text'    => __( 'Yes, Share Anonymously', 'ns-cloner-site-copier' ),
				'tooltip' => __( 'Your domain name will be anonymized and we won\'t know 
				where the stats are from (but they are still helpful to us!) Thank you!', 'ns-cloner-site-copier' )
			),
			'no_share'          => array(
				'text' => __( 'No, Dismiss', 'ns-cloner-site-copier' )
			)
		);
		$this->user_saved_mode      = get_site_option( $this->user_saved_mode_option_name, get_option( $this->user_saved_mode_option_name ) );
		$this->user_last_saved_mode = get_site_option( $this->user_last_saved_mode_option_name, get_option( $this->user_last_saved_mode_option_name ) );
		global $wpdb;
		$this->db_analytics_table = $wpdb->base_prefix . 'ns_cloner_logs';
		add_action( 'ns_cloner_before_render_main', array( $this, 'maybe_show_analytics_settings_modal' ) );
		add_action( 'wp_ajax_ns_cloner_save_analytics_mode', array( $this, 'save_selected_mode_ajax' ) );
		add_filter( 'ns_cloner_site_tables', array( $this, 'exclude_analytics_db_table_from_cloner' ) );
	}

	/**
	 * Public method to get analytics modes
	 *
	 * @return array
	 */
	public function get_user_modes() {
		return $this->user_modes;
	}

	/**
	 * Public method to get saved analytics mode
	 *
	 * @return mixed
	 */
	public function get_user_saved_mode() {
		return $this->user_saved_mode;
	}

	/**
	 * Show analytics mode selection modal if the conditions pass
	 */
	public function maybe_show_analytics_settings_modal() {
		if ( $this->is_sharable() ) {
			// Do not show analytics settings modal
			return;
		}

		if ( empty( $this->user_saved_mode ) ||
		     ( 'no_share' == $this->user_saved_mode && $this->is_time_to_show_settings_modal() ) ) {
			ns_cloner()->render( 'analytics-settings-modal' );
		}
	}

	/**
	 * Check whether 3 months pasted since analytics mode was last saved
	 *
	 * @return bool
	 */
	protected function is_time_to_show_settings_modal() {
		if ( empty( $this->user_last_saved_mode ) ) {
			return true;
		}

		return strtotime( $this->user_last_saved_mode . ' + 3 month' ) <= current_time( 'timestamp' );
	}

	/**
	 * Ajax handle for saving analytics mode
	 */
	public function save_selected_mode_ajax() {
		$mode = isset( $_POST['mode'] ) ? sanitize_text_field( wp_unslash( $_POST['mode'] ) ) : '';
		if ( ! empty( $mode ) && in_array( $mode, array_keys( $this->user_modes ), true ) ) {
			$this->user_saved_mode      = $mode;
			$this->user_last_saved_mode = current_time( 'mysql' );
			update_site_option( $this->user_saved_mode_option_name, $this->user_saved_mode );
			update_site_option( $this->user_last_saved_mode_option_name, $this->user_last_saved_mode );

			if ( 'share' === $mode || 'share_anonymously' === $mode ) {
				$this->share_mode_activated();
			}

			wp_send_json_success();
		}

		wp_send_json_error();
	}

	/**
	 * Get DB table name for analytics rows
	 *
	 * @return string
	 */
	public function get_db_log_table() {
		return $this->db_analytics_table;
	}

	/**
	 * Hook handle to remove db analytics table from cloning
	 *
	 * @param $tables
	 *
	 * @return mixed
	 */
	public function exclude_analytics_db_table_from_cloner( $tables ) {
		if ( count( $tables ) > 0 ) {
			foreach ( $tables as $key => $table_name ) {
				if ( $this->db_analytics_table === $table_name ) {
					unset( $tables[ $key ] );
					break;
				}
			}
		}

		return $tables;
	}

	/**
	 * Is current mode provides sharing data
	 *
	 * @return bool
	 */
	public function is_sharable() {
		return 'share' === $this->user_saved_mode || 'share_anonymously' === $this->user_saved_mode;
	}

	/**
	 * Actions on share mode activated
	 */
	protected function share_mode_activated() {
		$not_sent_results = $this->get_not_synced_cloner_results();
		if ( is_array( $not_sent_results ) && count( $not_sent_results ) > 0 ) {
			// Start background export to client.
			$background_export = new NS_Cloner_Export_Analytics_Process();
			foreach ( $not_sent_results as $result ) {
				$background_export->push_to_queue( array(
					'data' => $result
				) );
				$background_export->save()->dispatch();
			}
		}
	}

	/**
	 * Process actions on cloner operations completed
	 *
	 * @param array $cloner_processes
	 * @param $cloner_mode
	 * @param $cloner_time_spent
	 * @param $cloner_error
	 */
	public function process_cloner_result( array $cloner_processes, $cloner_mode, $cloner_time_spent, $cloner_error ) {
		$tables_count = $rows_count = $files_count = $users_count = null;
		if ( empty( $cloner_error ) && count( $cloner_processes ) > 0 ) {
			switch ( $cloner_mode ) {
				case 'clone_teleport' :
					if ( isset( $cloner_processes['teleport_tables'] ) &&
					     isset( $cloner_processes['teleport_tables']['completed'] ) ) {
						$tables_count = $cloner_processes['teleport_tables']['completed'];
					}
					if ( isset( $cloner_processes['teleport_rows'] ) &&
					     isset( $cloner_processes['teleport_rows']['completed'] ) ) {
						$rows_count = $cloner_processes['teleport_rows']['completed'];
					}
					if ( isset( $cloner_processes['teleport_files'] ) &&
					     isset( $cloner_processes['teleport_files']['completed'] ) ) {
						$files_count = $cloner_processes['teleport_files']['completed'];
					}
					if ( isset( $cloner_processes['teleport_users'] ) &&
					     isset( $cloner_processes['teleport_users']['completed'] ) ) {
						$users_count = $cloner_processes['teleport_users']['completed'];
					}
					break;
				case 'search_replace':
					if ( isset( $cloner_processes['tables_search'] ) &&
					     isset( $cloner_processes['tables_search']['completed'] ) ) {
						$tables_count = $cloner_processes['tables_search']['completed'];
					}
					if ( isset( $cloner_processes['rows_search'] ) &&
					     isset( $cloner_processes['rows_search']['completed'] ) ) {
						$rows_count = $cloner_processes['rows_search']['completed'];
					}
					break;
				default :
					if ( isset( $cloner_processes['tables'] ) &&
					     isset( $cloner_processes['tables']['completed'] ) ) {
						$tables_count = $cloner_processes['tables']['completed'];
					}
					if ( isset( $cloner_processes['rows'] ) &&
					     isset( $cloner_processes['rows']['completed'] ) ) {
						$rows_count = $cloner_processes['rows']['completed'];
					}
					if ( isset( $cloner_processes['files'] ) &&
					     isset( $cloner_processes['files']['completed'] ) ) {
						$files_count = $cloner_processes['files']['completed'];
					}
					if ( isset( $cloner_processes['users'] ) &&
					     isset( $cloner_processes['users']['completed'] ) ) {
						$users_count = $cloner_processes['users']['completed'];
					}
					break;
			}
		}
		$wp_data = array( 'is_multisite' => is_multisite() );
		if ( is_multisite() ) {
			$wp_data['is_subdomain'] = ! is_main_site();
		}

		//Prepare analytics row data.
		$data = array(
			'version'            => defined( 'NS_CLONER_PRO_VERSION' ) ? 'pro' : 'free',
			'is_success'         => empty( $cloner_error ),
			'clone_mode'         => $cloner_mode,
			'date'               => current_time( 'mysql' ),
			'time_spent_sec'     => (int) $cloner_time_spent,
			'tables_count'       => $tables_count,
			'rows_count'         => $rows_count,
			'files_count'        => $files_count,
			'users_count'        => $users_count,
			'replacements_count' => (int) ns_cloner()->report->get_report( '_replacements' ),
			'wp_data'            => json_encode( $wp_data ),
			'is_synced'          => false
		);

		if ( $this->is_sharable() ) {
			//Send data to remote service.
			$exported = $this->export_result_to_client( $data );
			if ( $exported ) {
				$data['is_synced'] = true;
			}
		}

		//Save analytics row in WP DB table.
		$this->save_result_to_db( $data );
	}

	/**
	 * Save
	 *
	 * @param array $data
	 *
	 * @return false|int
	 */
	protected function save_result_to_db( array $data ) {
		global $wpdb;
		$data['is_synced'] = $this->is_sharable();

		return $wpdb->insert( $this->db_analytics_table, $data );
	}

	/**
	 * Get cloner results from DB that were not synced to client
	 *
	 * @return array|null
	 */
	protected function get_not_synced_cloner_results() {
		global $wpdb;

		return $wpdb->get_results( "
			SELECT * FROM {$this->db_analytics_table}
			WHERE is_synced = 0
		", ARRAY_A );
	}

	/**
	 * Export cloner results to analytics service
	 *
	 * @param array $data
	 *
	 * @return bool
	 */
	public function export_result_to_client( array $data ) {
		if ( ! $this->is_sharable() ) {
			return false;
		}

		//If the data comes from background process it contains id of row saved in WP DB and is_synced - exclude it.
		if ( isset( $data['id'] ) ) {
			unset( $data['id'] );
		}
		if ( isset( $data['is_synced'] ) ) {
			unset( $data['is_synced'] );
		}

		$is_anonymous = 'share_anonymously' === $this->user_saved_mode;
		$domain       = network_site_url();
		if ( $is_anonymous ) {
			//Anonymize domain.
			$domain = parse_url( $domain, PHP_URL_SCHEME ) . '://***.**';
		}
		$data['domain'] = $domain;

		//Send data to remote endpoint.
		$result = wp_remote_request( $this->service_client_url, array(
			'headers' => array(
				'Content-Type' => 'application/json',
				'Accept'       => 'application/json'
			),
			'method'  => 'POST',
			'body'    => json_encode( $data )
		) );

		if ( is_wp_error( $result ) ) {
			return false;
		}

		$body_decoded = json_decode( $result['body'], true );

		return isset( $body_decoded['success'] ) && $body_decoded['success'];
	}
}

/**
 * class singleton function
 *
 * @return NS_Cloner_Analytics|null
 */
function ns_cloner_analytics() {
	return NS_Cloner_Analytics::get_instance();
}

//Instantiate analytics.
ns_cloner_analytics();PKW�1\��-ɺ�lib/kint/config.phpnu�[���<?php
isset( $GLOBALS['_kint_settings'] ) or $GLOBALS['_kint_settings'] = array();
$_kintSettings = &$GLOBALS['_kint_settings'];


/** @var bool if set to false, kint will become silent, same as Kint::enabled(false) or Kint::$enabled = false */
$_kintSettings['enabled'] = true;


/**
 * @var bool whether to display where kint was called from
 */
$_kintSettings['displayCalledFrom'] = true;


/**
 * @var string format of the link to the source file in trace entries. Use %f for file path, %l for line number.
 * Defaults to xdebug.file_link_format if not set.
 *
 * [!] EXAMPLE (works with for phpStorm and RemoteCall Plugin):
 *
 * $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
 *
 */
$_kintSettings['fileLinkFormat'] = ini_get( 'xdebug.file_link_format' );


/**
 * @var array base directories of your application that will be displayed instead of the full path. Keys are paths,
 * values are replacement strings
 *
 * Defaults to array( $_SERVER['DOCUMENT_ROOT'] => '&lt;ROOT&gt;' )
 *
 * [!] EXAMPLE (for Kohana framework):
 *
 * $_kintSettings['appRootDirs'] = array(
 *      APPPATH => 'APPPATH', // make sure the constants are already defined at the time of including this config file
 *      SYSPATH => 'SYSPATH',
 *      MODPATH => 'MODPATH',
 *      DOCROOT => 'DOCROOT',
 * );
 *
 * [!] EXAMPLE #2 (for a semi-universal approach)
 *
 * $_kintSettings['appRootDirs'] = array(
 *      realpath( __DIR__ . '/../../..' ) => 'ROOT', // go up as many levels as needed in the realpath() param
 * );
 *
 * $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
 *
 */
$_kintSettings['appRootDirs'] = array(
	$_SERVER['DOCUMENT_ROOT'] => '&lt;ROOT&gt;',
);


/**
 * @var callable|null
 *
 * @param array $step each step of the backtrace is passed to this callback to clean it up or skip it entirely
 *
 * @return array|null you can return null if you want to bypass outputting this step
 *
 * [!] EXAMPLE:
 *
 * $_kintSettings['traceCleanupCallback'] = function( $traceStep ) {
 *      if ( isset( $traceStep['class'] ) && strtolower( $traceStep['class'] ) === 'errorHandler' ) {
 *           return null;
 *      }
 *
 *      if ( isset( $traceStep['function'] ) && strtolower( $traceStep['function'] ) === '__tostring' ) {
 *          $traceStep['function'] = "[object converted to string]";
 *      }
 *
 *       return $traceStep;
 * };
 */
$_kintSettings['traceCleanupCallback'] = null;


/** @var int max length of string before it is truncated and displayed separately in full. Zero or false to disable */
$_kintSettings['maxStrLength'] = 60;

/** @var array possible alternative char encodings in order of probability, eg. array('windows-1251') */
$_kintSettings['charEncodings'] = array();


/** @var int max array/object levels to go deep, if zero no limits are applied */
$_kintSettings['maxLevels'] = 12;


/** @var bool whether dumped indexed arrays that are in ideal sequence are displayed */
$_kintSettings['hideSequentialKeys'] = true;


/** @var string name of theme for rich view */
$_kintSettings['theme'] = 'original';


/**
 * @var callback filters array/object keys before outputting; return false if you do not wish to see it in the output
 *
 * @param string $key the key being output
 * @param mixed  $val the contents of the dumped element in case you need it
 *
 * @return bool return false to skip displaying
 *
 * [!] EXAMPLE:
 *
 * $_kintSettings['keyFilterCallback'] = function( $key, $val ) {
 *     if ( preg_match( '#_mt$#', $key ) ) {
 *         return false;
 *     }
 *
 *     if ( $val === '--testing--' ) {
 *         return false;
 *     }
 *
 *     // no need to return true to continue output
 * };
 *
 */
$_kintSettings['keyFilterCallback'] = null;


/** @var bool only set to true if you want to develop kint and know what you're doing */
$_kintSettings['devel'] = false;


unset( $_kintSettings );
PKW�1\4�.�^�^#class-ns-cloner-process-manager.phpnu�[���<?php
/**
 * Cloner Process Management class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Class NS_Cloner_Process_Manager
 *
 * Manages the cloning process - order of steps, status of background processes, validation, tracking progress,
 * and doing startup and shutdown actions at beginning and end with process_init and process_finish.
 */
class NS_Cloner_Process_Manager {

	/**
	 * Errors generated by cloning process
	 *
	 * Important: notice this is multi-dimensional, unlike the flat $errors property of sections.
	 *
	 * @var array $errors {
	 *      @type string $message Description of error
	 *      @type string $section Optional id of section that generated the error
	 * }
	 */
	private $errors;

	/**
	 * Record new error
	 *
	 * @param string $message Error message.
	 * @param array  $data Additional data to store with message, such as associated section id.
	 */
	public function add_error( $message, $data = [] ) {
		$error          = [ 'message' => $message ];
		$this->errors[] = array_merge( $error, $data );
	}

	/**
	 * Get errors property
	 *
	 * @return array
	 */
	public function get_errors() {
		return $this->errors;
	}

	/**
	 * Save a SQL query to be executed when the cloning process is complete
	 *
	 * Used for table renames, alter queries, etc.
	 *
	 * @param string $query Valid SQL command.
	 * @param int    $priority Priority of execution. Higher = sooner.
	 */
	public function add_finish_query( $query, $priority = 10 ) {
		$queries = get_site_option( 'ns_cloner_finish_queries', [] );
		if ( ! isset( $queries[ $priority ] ) ) {
			// Create an array for this priority if it doesn't exist.
			$queries[ $priority ] = [ $query ];
		} else {
			// Or just add it to existing priority queue.
			$queries[ $priority ][] = $query;
		}
		update_site_option( 'ns_cloner_finish_queries', $queries );
	}

	/**
	 * Gets all finish queries queued by add_finish_query()
	 *
	 * Formats into a flat array since they are store grouped by priority, for example:
	 * [ 0 => [ 'queryA', 'queryB' ], 10 => [ 'queryC', 'queryD' ] ] will be changed to:
	 * [ 'queryA', 'queryB', 'queryC', 'queryD' ]
	 *
	 * @return array
	 */
	public function get_finish_queries() {
		$result  = [];
		$queries = get_site_option( 'ns_cloner_finish_queries', [] );
		// Order by key, since they'll be grouped by priority.
		ksort( $queries );
		// Flatten, put all queries together in one array.
		foreach ( $queries as $priority => $priority_queries ) {
			$result = array_merge( $result, $priority_queries );
		}
		return $result;
	}

	/*
	______________________________________
	|
	|  Process Methods
	|_____________________________________
	*/

	/**
	 * Define the current request as a cloning process request.
	 *
	 * This registers a DOING_CLONING constant to easily recognize when a clone request is happening
	 * in other code, and it calls process_init for all active sections to register section hooks,
	 * so that we can count on those being active when cloning is happening and not at other times.
	 * Also starts the log (prior to log->start(), any log calls are ignored).
	 *
	 * Example: select tables section filters result of ns_cloner()->get_site_tables, and should
	 * only do so during cloning process when selected tables have been submitted, not during ajax
	 * request to fetch available tables to select.
	 */
	public function doing_cloning() {
		if ( ! defined( 'DOING_CLONING' ) ) {
			define( 'DOING_CLONING', true );
			// Register all section hooks.
			foreach ( ns_cloner()->sections as $section ) {
				$section->maybe_process_init();
			}
			// Activate logging.
			ns_cloner()->log->start();
		}
	}

	/**
	 * Start cloning process
	 */
	public function init() {
		// Initialize reporting, logging, section hooks.
		ns_cloner()->report->set_start_time();
		$this->doing_cloning();

		// Run startup hook - useful for adjusting the process before anything starts.
		do_action( 'ns_cloner_process_init', ns_cloner_request()->get( 'clone_mode' ) );

		// Don't allow more than one cloning process to be run at one time.
		if ( $this->is_in_progress() ) {
			$this->add_error( __( 'A cloning process is already in progress. Please wait until it completes.', 'ns_cloner' ) );
			return;
		}

		// Validate the current request (trigger individual section validation).
		$this->validate();

		// Check for errors, and don't proceed if found.
		if ( ! empty( $this->errors ) ) {
			$this->add_error( __( 'Validation errors found.', 'ns-cloner-site-copier' ) );
			return;
		} else {
			do_action( 'ns_cloner_validated' );
		}

		// Delete the exit flag from the last time.
		delete_site_option( 'ns_cloner_exited' );

		// Set the current user id, so that the original user id can always be accessed by background processes.
		ns_cloner_request()->set( 'user_id', get_current_user_id() );

		// Save request so it will be available to background processes.
		// Most modes will update and save it again later, but this makes sure the base request is always saved.
		ns_cloner_request()->save();

		// Trigger all the actions registered for this clone mode (start background processes, etc).
		$clone_mode = ns_cloner_request()->get( 'clone_mode' );
		do_action( "ns_cloner_process_{$clone_mode}" );
	}

	/**
	 * Validate request variables for the current cloning mode
	 *
	 * This populates the $errors property but does nothing else - it is up to the
	 * calling function to check the value of $errors and determine action accordingly.
	 * Implements the 'ns_cloner_validation_errors' hook to allow things other than
	 * sections to perform validation if needed.
	 *
	 * @param string $section_id ID for specific section to validate ($id property of section class).
	 *      If blank, validate all sections that are supported for the current clone mode.
	 */
	public function validate( $section_id = '' ) {
		$clone_mode = ns_cloner_request()->get( 'clone_mode' );

		// Validate sections.
		if ( ! empty( $section_id ) ) {
			$sections = [ ns_cloner()->get_section( $section_id ) ];
		} else {
			$sections = ns_cloner()->sections;
		}
		foreach ( $sections as $id => $section ) {
			if ( in_array( $clone_mode, $section->modes_supported, true ) ) {
				$section->validate();
				foreach ( $section->get_errors() as $error_message ) {
					$this->add_error( $error_message, [ 'section' => $section->id ] );
				}
			}
		}
	}

	/**
	 * Calls $this->finish only if all current processes are complete
	 *
	 * Sometimes this could get called twice in a short time window, so use locking.
	 * The lock, like NS_Cloner_Process::process_lock, uses direct database queries,
	 * not via transient or site options functions because those have caching that
	 * can get in the way.
	 */
	public function maybe_finish() {
		// Check that this isn't already being run in another parallel session.
		if ( $lock = $this->get_finish_lock() ) {
			ns_cloner()->log->log( "DETECTED already running finish $lock, skipping" );
			return;
		}
		// If it's not in progress, finish already happened.
		if ( $this->is_in_progress() ) {
			$progress = $this->get_progress();
			if ( 'complete' === $progress['status'] ) {
				// Set a unique lock.
				$finish_lock_id = wp_generate_password( 8 );
				ns_cloner()->db->query(
					ns_prepare_option_query(
						"INSERT INTO {table} ( {key}, {value} ) VALUES( %s, %s )",
						[ 'ns_cloner_finish_lock', $finish_lock_id ]
					)
				);
				ns_cloner()->log->log( "SETTING finish lock *$finish_lock_id*" );
				// Then wait 0.5 seconds and check again to make sure a simultaneous lock hasn't been set.
				// If the set lock isn't from this (earlier) instance, bail and let the later instance take over.
				usleep( apply_filters( 'ns_cloner_process_lock_delay', 0.5 * 1000000 ) );
				$current_lock = $this->get_finish_lock();
				if ( $current_lock !== $finish_lock_id ) {
					ns_cloner()->log->log( "DETECTED simultaneous finish call *$current_lock*, ending" );
					exit;
				}
				$this->finish();
				// Remove lock for next time.
				ns_cloner()->db->query(
					ns_prepare_option_query(
						"DELETE FROM {table} WHERE {key} = %s",
						'ns_cloner_finish_lock'
					)
				);
			}
		}
	}

	/**
	 * Get the unique ID of the current finish lock, if there is one.
	 *
	 * @return string|null
	 */
	protected function get_finish_lock(){
		return ns_cloner()->db->get_var(
			ns_prepare_option_query(
				'SELECT {value} FROM {table} WHERE {key} = %s',
				'ns_cloner_finish_lock'
			)
		);
	}

	/**
	 * Finish the cloning process
	 */
	public function finish() {
		$this->doing_cloning();
		ns_cloner()->log->log( 'ENTERING *finish*' );
		$target_id     = ns_cloner_request()->get( 'target_id' );
		$target_title  = ns_cloner_request()->get( 'target_title' );
		$target_prefix = ns_cloner_request()->get( 'target_prefix' );

		// Use this do do any finish/cleanup/reporting actions.
		do_action( 'ns_cloner_process_finish' );

		// Perform any cleanup queries registered during process.
		foreach ( $this->get_finish_queries() as $query ) {
			ns_cloner()->log->log( "RUNNING finish query: $query" );
			ns_cloner()->db->query( $query );
			ns_cloner()->log->handle_any_db_errors();
		}

		// Update target title since it will have been overwritten by cloned options.
		// Use direct db query because otherwise object caching + cache flush can cause update to be lost.
		if ( ns_cloner_request()->is_mode( 'core' ) ) {
			if ( ! empty( $target_id ) && ! empty( $target_title ) ) {
				ns_cloner()->db->update(
					$target_prefix . 'options',
					[ 'option_value' => $target_title ],
					[ 'option_name' => 'blogname' ]
				);
			}
		}

		// Flush caches for clone over.
		// This can prevent issues, but also is expensive for large redis caches, so allow disabling.
		$do_cache_flush = ns_cloner_request()->is_mode([ 'clone_over', 'search_replace' ]);
		if ( apply_filters( 'ns_cloner_do_cache_flush', $do_cache_flush ) ) {
			switch_to_blog( $target_id );
			wp_cache_flush();
			restore_current_blog();
		}

		// Log and report timing details.
		ns_cloner()->report->set_end_time();
		$start_time = ns_cloner()->report->get_start_time();
		$end_time   = ns_cloner()->report->get_end_time();
		$total_time = ns_cloner()->report->get_elapsed_time();
		$minutes    = floor( $total_time / 60 );
		$seconds    = ceil( $total_time % 60 );
		ns_cloner()->report->add_report( __( 'Start Time', 'ns-cloner-site-copier' ), $start_time );
		ns_cloner()->report->add_report( __( 'End Time', 'ns-cloner-site-copier' ), $end_time );
		ns_cloner()->report->add_report( __( 'Total Time', 'ns-cloner-site-copier' ), "{$minutes} min. {$seconds} sec." );
		ns_cloner()->log->log( 'END TIME: ' . $end_time );
		ns_cloner()->log->log( 'TOTAL_TIME: ' . "{$minutes} min. {$seconds} sec." );

		// Report details specific to the current mode (via report function provided when registering the mode).
		call_user_func( ns_cloner()->get_mode()->report );

		// Report number of items processed by each background process (tables, rows, users, files, etc).
		foreach ( $this->get_current_processes() as $process_id => $progress ) {
			$process = ns_cloner()->get_process( $process_id );
			if ( ! empty( $process->report_label ) ) {
				$completed = $progress['completed'];
				/* translators: number of items copied in clone operation */
				$report_string = _n( '%d item processed', '%d items processed', $completed, 'ns-cloner-site-copier' );
				ns_cloner()->report->add_report( $process->report_label, sprintf( $report_string, $completed ) );
			}
		}

		// Report number of text replacements made in site content.
		$replacements = (int) ns_cloner()->report->get_report( '_replacements' );
		/* translators: number of text replacements made on site content */
		$report_string = _n( '%d replacement made', '%d replacements made', $replacements, 'ns-cloner-site-copier' );
		ns_cloner()->report->add_report( __( 'Replacements', 'ns-cloner-site-copier' ), sprintf( $report_string, $replacements ) );

		// Clear all process data (except report).
		$this->exit_processes();
	}

	/**
	 * End all background processes and reset their data, plus clear saved reports and request data.
	 *
	 * @param mixed $error Optional error message to end log with if exiting unexpectedly.
	 */
	public function exit_processes( $error = '' ) {
		$this->doing_cloning();
		ns_cloner()->log->log( 'ENTERING *exit_processes*' );

		// Process Cloner analytics.
		ns_cloner_analytics()->process_cloner_result(
			$this->get_current_processes(),
			ns_cloner_request()->get( 'clone_mode' ),
			ns_cloner()->report->get_elapsed_time(),
			$error
		);

		// Log and report the error, if present.
		if ( $error ) {
			ns_cloner()->log->log( [ 'CALLED exit with error message:', $error ] );
			ns_cloner()->log->log( [ 'Other errors from prccess_manager:', $this->get_errors() ] );
			// Add this to the errors array so that it can be displayed immediately by any ajax requests
			// that will see it (for example, process_init).
			$this->add_error( $error );
			// Also add to the report, so that if the error was caused by a background progress OR
			// the page got closed or for some other reason the error won't be shown via ajax, it can
			// be shown next time the page is open. Note that if $clear_report is true, this gets erased.
			ns_cloner()->report->add_report( '_error', $error );
		}

		// Report log file location for debugging.
		if ( ns_cloner()->log->is_debug() ) {
			ns_cloner()->report->add_report( __( 'Log File', 'ns-cloner-site-copier' ), ns_cloner()->log->get_url() );
		}

		// Cancel running background processes, as well as clear data from any completed ones.
		foreach ( $this->get_current_processes(true) as $process_id => $progress ) {
			$process = ns_cloner()->get_process( $process_id );
			$process->cancel();
		}

		// Save flag so that currently running batches can end (otherwise the data might be in memory
		// of another session and keep running for a while before realizing that the queue was cleared.
		update_site_option( 'ns_cloner_exited', '1' );

		// Log the current saved report data.
		ns_cloner()->log->log( [ 'REPORT DATA:', ns_cloner()->report->get_all_reports() ] );

		// Provide last hook while request, report and log are still accessible.
		do_action( 'ns_cloner_process_exit' );

		// Clear saved request data and end log.
		delete_site_option( 'ns_cloner_finish_queries' );
		ns_cloner()->db->query(
			ns_prepare_option_query(
				'DELETE FROM {table} WHERE {key} = %s',
				'ns_cloner_finish_lock'
			)
		);
		ns_cloner_request()->delete();
		ns_cloner()->log->end();
	}

	/*
	______________________________________
	|
	|  Cloning Steps
	|_____________________________________
	*/

	/**
	 * Create a new site/blog on the network (step 1 for core mode)
	 */
	public function create_site() {
		$source_id    = ns_cloner_request()->get( 'source_id' );
		$target_name  = ns_cloner_request()->get( 'target_name', '' );
		$target_title = ns_cloner_request()->get( 'target_title', '' );

		// Sanitize.
		$target_name = strtolower( trim( $target_name ) );

		// Try to create new site.
		$source    = get_site( $source_id );
		$site_data = [
			'title'   => $target_title,
			'user_id' => ns_cloner_request()->get( 'user_id' ),
			'public'  => $source->public,
			'lang_id' => $source->lang_id,
		];
		if ( is_subdomain_install() ) {
			$site_data += [
				'domain' => $target_name . '.' . preg_replace( '|^www\.|', '', get_current_site()->domain ),
				'path'   => get_current_site()->path,
			];
		} else {
			$site_data += [
				'domain' => get_current_site()->domain,
				'path'   => get_current_site()->path . $target_name . '/',
			];
		}
		ns_cloner()->log->log( [ 'Attempting to create site with data:', $site_data ] );
		if ( function_exists( 'wp_insert_site' ) ) {
			$target_id = wp_insert_site( $site_data );
		} else {
			// Backwards compatibility for pre 5.1.
			$target_id = wpmu_create_blog(
				$site_data['domain'],
				$site_data['path'],
				$site_data['title'],
				$site_data['user_id']
			);
		}

		// Handle results.
		if ( ! is_wp_error( $target_id ) ) {
			ns_cloner()->log->log( "New site '$target_title' (" . get_site_url( $target_id ) . ') created.' );
			ns_cloner_request()->set( 'target_id', $target_id );
			ns_cloner_request()->set_up_vars();
			ns_cloner_request()->save();
		} else {
			$this->exit_processes( 'Error creating site:' . $target_id->get_error_message() );
		}
	}

	/**
	 * Clone the source site's tables (step 2 for core mode)
	 */
	public function copy_tables() {
		$tables_process = ns_cloner()->get_process( 'tables' );
		$source_prefix  = ns_cloner_request()->get( 'source_prefix' );
		$target_prefix  = ns_cloner_request()->get( 'target_prefix' );
		$source_id      = ns_cloner_request()->get( 'source_id' );
		$target_id      = ns_cloner_request()->get( 'target_id' );

		// Makes sure that the target prefix is not somehow the same as the source.
		// Shouldn't be possible, but is irreversibly destructive if it does, so make sure.
		if ( $source_prefix === $target_prefix ) {
			$this->exit_processes( __( 'Source and target prefix the same. Cannot clone tables.', 'ns-cloner-site-copier' ) );
			return;
		}

		// Queue table cloning background process.
		$source_tables = ns_reorder_tables( ns_cloner()->get_site_tables( $source_id ) );
		foreach ( $source_tables as $source_table ) {
			$target_table = preg_replace( "|^$source_prefix|", $target_prefix, $source_table );
			$target_table = apply_filters( 'ns_cloner_target_table', $target_table );
			$table_data   = [
				'source_table' => $source_table,
				'target_table' => $target_table,
				'source_id'    => $source_id,
				'target_id'    => $target_id,
			];
			$tables_process->push_to_queue( $table_data );
			ns_cloner()->log->log( "QUEUEING clone of *$source_table* to *$target_table*" );
		}

		// Run Background Process for cloning tables.
		$tables_process->save()->dispatch();
	}

	/**
	 * Copy the source site's files (step 3 for core mode)
	 */
	public function copy_files() {
		$files_process = ns_cloner()->get_process( 'files' );
		$source_dir    = ns_cloner_request()->get( 'source_upload_dir' );
		$target_dir    = ns_cloner_request()->get( 'target_upload_dir' );

		// Makes sure that the target uploads dir is not somehow the same as the source.
		// Shouldn't be possible, but is irreversibly destructive if it does, so make sure.
		if ( $source_dir === $target_dir && ns_cloner_request()->get( 'do_copy_files', true ) ) {
			$this->exit_processes( __( 'Source and target uploads directories are the same. Cannot clone files.', 'ns-cloner-site-copier' ) );
			return;
		}

		// Queue file copy background process.
		$num_files = ns_recursive_dir_copy_by_process( $source_dir, $target_dir, $files_process );
		ns_cloner()->log->log( "QUEUEING *$num_files* files from *$source_dir* to *$target_dir*" );

		// Run background process for copying files.
		$files_process->save()->dispatch();
	}

	/*
	______________________________________
	|
	|  Manage Progress
	|_____________________________________
	*/

	/**
	 * Get progress data for currently running background process
	 *
	 * This uses current processes to get the progress data for each individual background process,
	 * and then it aggregates them together, much like NS_Cloner_Process::get_total_progress()
	 * aggregates batches into overall progress for the process, except this then further aggregates
	 * those by-process progress results into an overall view of the entire cloning operation, across
	 * all background processes.
	 *
	 * @return array|bool
	 */
	public function get_progress() {
		$by_process  = [];
		$total       = 0;
		$completed   = 0;
		$queue_empty = true;
		$processes   = $this->get_current_processes();

		// If no processes and no report, there's nothing to return - get_progress shouldn't have needed
		// to be called, so there was probably an error and exit_processes() was called.
		if ( empty( $processes ) && empty( ns_cloner()->report->get_all_reports() ) ) {
			// Try to get error message.
			$default_error = __( 'An unknown error occurred. Check the logs for info.', 'ns-cloner-site-copier' );
			$this->add_error( ns_cloner()->report->get_report( '_error' ) ?: $default_error );
			return false;
		}

		// If there are no processes but there IS a report, it means that the operation has finished.
		if ( empty( $processes ) && ! empty( ns_cloner()->report->get_all_reports() ) ) {
			return [
				'status' => 'reported',
				'report' => ns_cloner()->report->get_all_reports(),
			];
		}

		// Otherwise - process must be in progress, so prepare progress data.
		foreach ( $processes as $process_id => $progress ) {
			$process = ns_cloner()->get_process( $process_id );
			// Calculate the combined total of expected and completed objects for all background processes.
			$total     += $progress['total'];
			$completed += $progress['completed'];
			// Make sure to check both for running and empty queue, because the queue could be empty
			// but still have a pending teleport request that was fired via $process->after_handle().
			if ( ! $process->is_queue_empty() || $process->is_process_running() ) {
				$queue_empty = false;
			}
			// Also prepare to return data for each individual process.
			$by_process[ $process_id ] = [
				'label'      => $process->report_label,
				'progress'   => $progress,
				'dispatched' => get_site_option( "ns_cloner_{$process_id}_process_dispatched" ),
				'nonce'      => $process->get_nonce(),
			];
		}
		return [
			'total'      => $total,
			'completed'  => $completed,
			'percentage' => $total > 0 ? round( ( 100 * $completed ) / $total ) : 0,
			'status'     => $queue_empty ? 'complete' : 'in_progress',
			'processes'  => $by_process,
		];
	}

	/**
	 * Get all background process batches in the database, and group by which process created them
	 *
	 * @param bool $suppress_filters Whether to enable checking all processes, or only a filtered subset.
	 * @return array
	 */
	private function get_current_processes( $suppress_filters = false ) {
		$processes     = [];
		$all_processes = ns_cloner()->processes;
		// Add filter here so that addons/mode can disable checking for unused processes to speed up code.
		if ( ! $suppress_filters ) {
			$all_processes = apply_filters('ns_cloner_processes_to_check', $all_processes);
		}
		ns_cloner()->log->log( [ 'CHECKING progress for processes:', array_keys( $all_processes ) ] );
		foreach ( $all_processes as $process_id => $process ) {
			$progress = $process->get_total_progress();
			// Only add to the results if it this process has more than one object in it.
			// Check both the total (for normal cases), as well as is_queue_empty so that if
			// an error occurs and a process is running but missing progress data, it isn't invisible.
			if ( $progress['total'] > 0 || ! $process->is_queue_empty() ) {
				$processes[ $process_id ] = $progress;
			}
		}
		return $processes;
	}

	/**
	 * Check if there are any background processes in progress
	 *
	 * Note that this will return true if there are background processes with the status 'complete',
	 * even if none have the actual 'in_progress' status - the idea is that if they have not been
	 * cleared via $this->exit_processes(), the overall operation is still in progress.
	 *
	 * @param bool $suppress_filters Whether to enable checking all processes, or only a filtered subset.
	 * @return bool
	 */
	public function is_in_progress( $suppress_filters = false ) {
		return count( $this->get_current_processes( $suppress_filters ) ) > 0;
	}

}
PKW�1\��b�8�8*processes/class-ns-cloner-rows-process.phpnu�[���<?php
/**
 * Copy Rows Background Process
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Rows Process class.
 *
 * Processes a queue of table rows and copies each one from a source table to a target table.
 */
class NS_Cloner_Rows_Process extends NS_Cloner_Process {

	/**
	 * Ajax action hook
	 *
	 * @var string
	 */
	protected $action = 'rows_process';

	/**
	 * Array of preloaded rows from table
	 *
	 * @var array
	 */
	protected $preloaded = [];

	/**
	 * Array of primary key column names and last touched value by table.
	 *
	 * @var array
	 */
	protected $primary_keys = [];

	/**
	 * SQL query string compiled to insert row data
	 *
	 * @var string
	 */
	protected $insert_query = '';

	/**
	 * Number of rows to include in a single insert statement.
	 *
	 * @var int
	 */
	protected $rows_per_query = 50;

	/**
	 * Number of rows added to current insert statement.
	 * Used in conjunction with $rows_per_query.
	 *
	 * @var int
	 */
	protected $rows_count = 0;

	/**
	 * Current table for insert query
	 * Used to track when to start a new insert statement when switching tables.
	 *
	 * @var string
	 */
	protected $current_table = '';

	/**
	 * Initialize and set label
	 */
	public function __construct() {
		parent::__construct();
		$this->report_label = __( 'Rows', 'ns-cloner-site-copier' );

		// Load stored primary keys from past processes.
		$this->primary_keys = get_site_option( $this->identifier . '_primary_keys', [] );
		ns_cloner()->log->log( [ 'LOADING previous primary keys', $this->primary_keys ] );

		// Create dependency - this will auto-dispatch when table processing is complete.
		add_action( 'ns_cloner_tables_process_complete', [ $this, 'dispatch' ] );
	}

	/**
	 * Task
	 *
	 * Override this method to perform any actions required on each
	 * queue item. Return the modified item for further processing
	 * in the next pass through. Or, return false to remove the
	 * item from the queue.
	 *
	 * @param mixed $item Queue item to iterate over.
	 *
	 * @return mixed
	 */
	protected function task( $item ) {

		$source_table = $item['source_table'];
		$target_table = $item['target_table'];
		$source_id    = $item['source_id'];
		$target_id    = $item['target_id'];
		$row_num      = $item['row_num'];
		$row          = $this->get_row( $source_id, $source_table, $row_num );

		// Skip if row is empty.
		if ( empty( $row ) ) {
			ns_cloner()->log->log( "SKIPPING row *$row_num* in *$source_table* because content was empty" );
			return parent::task( $item );
		}

		// Set flag to skip any junk rows which shouldn't/needn't be copied.
		$is_cloner_data = isset( $row['option_name'] ) && preg_match( '/^ns_cloner/', $row['option_name'] );
		$is_transient   = isset( $row['option_name'] ) && preg_match( '/(_transient_rss_|_transient_(timeout_)?feed_)/', $row['option_name'] );
		$is_edit_meta   = isset( $row['meta_key'] ) && preg_match( '/(ns_cloner|_edit_lock|_edit_last)/', $row['meta_key'] );
		$do_copy_row    = apply_filters( 'ns_cloner_do_copy_row', ( ! $is_cloner_data && ! $is_transient && ! $is_edit_meta ), $row, $item );
		if ( ! $do_copy_row ) {
			ns_cloner()->log->log( [ "SKIPPING row in *$source_table* because do_copy_row was false:", $row ] );
			return parent::task( $item );
		}

		// Perform replacements.
		$replaced_in_row   = 0;
		$search_replace    = ns_cloner_request()->get_search_replace( $source_id, $target_id );
		$is_upload_path    = isset( $row['option_name'] ) && 'upload_path' === $row['option_name'];
		$do_search_replace = apply_filters( 'ns_cloner_do_search_replace', ( ! $is_upload_path ), $row, $item );
		if ( $do_search_replace ) {
			foreach ( $row as $field => $value ) {
				$replaced_in_column = ns_recursive_search_replace(
					$value,
					$search_replace['search'],
					$search_replace['replace'],
					ns_cloner_request()->get( 'case_sensitive', false )
				);
				$replaced_in_row   += $replaced_in_column;
				$row[ $field ]      = $value;
			}
			if ( $replaced_in_row > 0 ) {
				ns_cloner()->log->log( "PERFORMED *$replaced_in_row* replacements in *$target_table*" );
				ns_cloner()->report->increment_report( '_replacements', $replaced_in_row );
			}
		} else {
			ns_cloner()->log->log( [ "SKIPPING row replacements in *$source_table* because do_copy_row was false:", $row ] );
		}

		// Remove primary key, if it's a table like wp_options where:
		// 1. The key isn't linked to anything else, so doesn't matter if it changes, and
		// 2. There's a possibility that the table will be added to during the clone process.
		$non_essential_keys = apply_filters(
			'ns_cloner_non_essential_primary_keys',
			[
				'options'  => 'option_id',
				'sitemeta' => 'meta_id',
			]
		);
		foreach ( $non_essential_keys as $table => $key ) {
			if ( preg_match( "/_{$table}$/", $source_table ) ) {
				unset( $row[ $key ] );
			}
		}

		// Insert new row.
		$this->insert_row( $row, $target_table );

		return parent::task( $item );

	}

	/**
	 * Get the actual data for this row
	 *
	 * This preloads a number (default: 250) of rows ahead, so a query doesn't have to be run for each row.
	 * We don't want to load too many and risk maxing out memory, but we also don't want to query too often.
	 *
	 * @param int    $source_id ID of sources site.
	 * @param string $source_table Source table name.
	 * @param int    $row_num Index of row to be copied.
	 * @return array
	 */
	protected function get_row( $source_id, $source_table, $row_num ) {
		$source_prefix  = is_multisite() ? ns_cloner()->db->get_blog_prefix( $source_id ) : ns_cloner()->db->prefix;

		// Make sure the table array is initialized.
		if ( ! isset( $this->preloaded[ $source_table ] ) ) {
			$this->preloaded[ $source_table ] = [];
		}

		// Get the primary key for this table.
		if ( ! isset( $this->primary_keys[ $source_table ] ) ) {
			// Be careful about multiple keys - this can cause issues for some tables like term_relationships.
			// Best to default to LIMIT fetching if there are multiple primary keys, even though that's slower.
			$key_data = ns_cloner()->db->get_results( "SHOW KEYS FROM $source_table WHERE Key_name = 'PRIMARY'" );
			$this->primary_keys[ $source_table ] = [
				'name'  => $key_data && 1 === count( $key_data ) ? $key_data[0]->Column_name : false,
				'value' => 0,
			];
			ns_cloner()->log->log( [ "CHECKING primary key for *$source_table*", $key_data ] );
		}
		$primary_key_name = $this->primary_keys[ $source_table ]['name'];
		$primary_key_val  = $this->primary_keys[ $source_table ]['value'];

		// Try to preload the next set of data if the current row number isn't already preloaded.
		if ( ! isset( $this->preloaded[ $source_table ][ $row_num ] ) ) {
			$preload_amount = apply_filters( 'ns_cloner_rows_preload_amount', 250 );
			// Query the results - handle tables with primary keys more efficiently, but fallback to handle any strange ones that don't.
			if ( $primary_key_name ) {
				// Handle numeric vs non numeric primary keys - comparisons don't work reliably on non numeric,
				// so again fall back to limit statement if more efficient primary key comparison isn't possible.
				if ( is_numeric( $primary_key_val ) && $primary_key_val > 0 ) {
					$where = "WHERE `$primary_key_name` > $primary_key_val ";
					$limit = "LIMIT $preload_amount";
				} else {
					$where = 'WHERE 1=1';
					$limit = "LIMIT $row_num, $preload_amount";
				}
				$order = "ORDER BY `$primary_key_name` ASC";
			} else {
				$where = 'WHERE 1=1';
				$limit = "LIMIT $row_num, $preload_amount";
				$order = '';
			}
			// Compile query, and add filters so that content filtering can be applied at query
			// time for things like excluding certain post types, etc.
			$query = "SELECT $source_table.* FROM `$source_table`"
				. ' ' . apply_filters( 'ns_cloner_rows_where', $where, $source_table, $source_prefix )
				. ' ' . apply_filters( 'ns_cloner_rows_order', $order, $source_table, $source_prefix )
				. ' ' . apply_filters( 'ns_cloner_rows_limit', $limit, $source_table, $source_prefix );
			// Run it!
			ns_cloner()->log->log( [ "PRELOADING rows for *$source_table* with query:", $query ] );
			$rows = ns_cloner()->db->get_results( $query, ARRAY_A );
			// Assign the correct keys for the next preloaded batch, starting with the current row_num, not 0.
			$indexes = array_keys( array_fill( $row_num, count( $rows ), '' ) );
			// Store this batch of data in $preloaded - stays loaded as long as the current instance runs.
			$this->preloaded[ $source_table ] = array_combine( $indexes, $rows );
			ns_cloner()->log->log( 'PRELOADED *' . count( $this->preloaded[ $source_table ] ) . "* rows for *$source_table*" );
		}

		// Return the requested row now, since it should always be in the preloaded array now.
		// (still handle missing row possibility in case something went wrong with the preload query).
		if ( isset( $this->preloaded[ $source_table ][ $row_num ] ) ) {
			$row = $this->preloaded[ $source_table ][ $row_num ];
			if ( $primary_key_name ) {
				$this->primary_keys[ $source_table ]['value'] = $row[ $primary_key_name ];
			}
			return $row;
		} else {
			ns_cloner()->report->add_notice( "Missing row *$row_num* in *$source_table* - could not be preloaded" );
			return [];
		}
	}

	/**
	 * Perform the row insertion, or queue and insert together
	 *
	 * @param array  $row Row of data to insert.
	 * @param string $target_table Name of table to insert into.
	 */
	protected function insert_row( $row, $target_table ) {
		$row         = apply_filters( 'ns_cloner_insert_values', $row, $target_table );
		$field_names = array_map( 'ns_sql_backquote', array_keys( $row ) );
		$field_list  = implode( ', ', $field_names );

		// Add necessary syntax before row values are appended.
		if ( empty( $this->insert_query ) ) {
			// Start off insert statement if one hasn't been started yet.
			$this->insert_query = "INSERT INTO `$target_table` ( $field_list ) VALUES\n";
		} elseif ( ! empty( $this->current_table ) && $this->current_table !== $target_table ) {
			// Track current table and force start of new insert statement if needed.
			$this->insert_query .= ";\nINSERT INTO `$target_table` ( $field_list ) VALUES\n";
		} else {
			// If still under the maximum rows per query, just add a comma and keep using current insert.
			$this->insert_query .= ",\n";
		}

		// Prepare data and add this row to the query.
		$formats             = implode( ', ', ns_prepare_row_formats( $row, $target_table ) );
		$this->insert_query .= ns_cloner()->db->prepare( "( $formats )\n", $row );
		$this->current_table = $target_table;
		$this->rows_count++;

		// Insert the previous accumulated query and start new, if reaching max query size.
		if ( ! empty( $this->insert_query ) && $this->is_query_maxed() ) {
			$this->insert_batch();
		}
	}

	/**
	 * Insert the whole current group of accumulated row insertions.
	 */
	public function insert_batch() {
		ns_cloner()->log->log( "INSERTING $this->rows_count rows into $this->current_table" );
		// Break into single queries to handle servers where multiple insert statements in one query are not allowed.
		$inserts = preg_split( '/;(?=\sINSERT)/', $this->insert_query );
		foreach ( $inserts as $query ) {
			ns_cloner()->db->query( $query );
			// Handle any errors.
			if ( ! empty( ns_cloner()->db->last_error ) ) {
				if ( false !== strpos( ns_cloner()->db->last_error, 'Duplicate entry' ) ) {
					ns_cloner()->log->log( [ 'DUPLICATE entry for query:', $query ] );
					$is_duplicate_option = preg_match( "/Duplicate entry '([^'])' for key 'option_name'/", ns_cloner()->db->last_error, $db_error_matches );
					if ( $is_duplicate_option ) {
						// For duplicates in the options table, try deleting the row and reinserting.
						// (Often caused by a plugin that initializes values when site is partly cloned).
						$option_name = $db_error_matches[1];
						ns_cloner()->log->log( [ 'TRYING to remove duplicate option:', $option_name ] );
						ns_cloner()->db->last_error = '';
						ns_cloner()->db->query( "DELETE FROM $this->current_table WHERE option_name = '$option_name'" );
						// See if it worked.
						if ( ns_cloner()->db->last_error ) {
							ns_cloner()->log->log( 'FAILED to remove duplicate option' );
							ns_cloner()->report->add_notice( ns_cloner()->db->last_error . ' for table ' . $this->current_table );
							ns_cloner()->db->last_error = '';
						} else {
							ns_cloner()->log->log( 'WORKED to remove duplicate option' );
						}
					} else {
						// For other duplicate entries, warn but don't bail.
						ns_cloner()->report->add_notice( ns_cloner()->db->last_error . ' for table ' . $this->current_table );
						ns_cloner()->db->last_error = '';
					}
				} else {
					ns_cloner()->log->handle_any_db_errors();
				}
			}
		}
		// Reset.
		$this->insert_query = '';
		$this->rows_count   = 0;
	}

	/**
	 * Run parent after-handling, plus save the most recent primary key for current tables
	 */
	protected function after_handle() {
		// Run insert for the accumulated rows.
		if ( ! empty( $this->insert_query ) ) {
			$this->insert_batch();
		}
		// Save most recent primary key so we know where to pick up again.
		ns_cloner()->log->log( [ 'SAVING primary key data for rows process:', $this->primary_keys ] );
		update_site_option( $this->identifier . '_primary_keys', $this->primary_keys );
		parent::after_handle();
	}

	/**
	 * Run parent cancel, plus delete stored primary key data.
	 */
	public function cancel() {
		delete_site_option( $this->identifier . '_primary_keys' );
		parent::cancel();
	}

	/**
	 * Check if current insert query is close to max size, in rows or length
	 *
	 * @return bool
	 */
	protected function is_query_maxed() {
		$packet_max          = ns_get_sql_variable( 'max_allowed_packet', 50000 );
		$exceeded_packet_max = strlen( $this->insert_query ) >= .9 * $packet_max;
		$rows_per_query      = apply_filters( 'ns_cloner_rows_per_query', $this->rows_per_query, $this->identifier );
		$exceeded_row_max    = $this->rows_count >= $rows_per_query;
		return $exceeded_row_max || $exceeded_packet_max;
	}


}
PKW�1\�	Ғ��6processes/class-ns-cloner-export-analytics-process.phpnu�[���<?php

/**
 * Class NS_Cloner_Export_Analytics_Process
 */
class NS_Cloner_Export_Analytics_Process extends WP_Background_Process {
	protected $action = 'background_export_analytics';

	/**
	 * Process individual analytics entry
	 *
	 * @param mixed $item
	 *
	 * @return mixed
	 */
	protected function task( $item ) {
		$row_data = $item['data'];
		$result   = ns_cloner_analytics()->export_result_to_client( $row_data );
		if ( $result ) {
			//Update row in DB to is_synced = true.
			$this->set_log_synced( $row_data['id'] );
		}

		return false;
	}

	/**
	 * Set log entry as synced
	 *
	 * @param $id
	 *
	 * @return bool
	 */
	protected function set_log_synced( $id ) {
		global $wpdb;

		return $wpdb->update(
			ns_cloner_analytics()->get_db_log_table(),
			array( 'is_synced' => true ),
			array( 'id' => $id )
		);
	}
}

//Instantiate class for background handling.
return new NS_Cloner_Export_Analytics_Process();PKW�1\ �K�
�
+processes/class-ns-cloner-files-process.phpnu�[���<?php
/**
 * Copy Files Background Process
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Files_Process class.
 *
 * Processes a queue of files and copies them to the uploads directory of a target site.
 */
class NS_Cloner_Files_Process extends NS_Cloner_Process {

	/**
	 * Ajax action.
	 *
	 * @var string
	 */
	protected $action = 'files_process';

	/**
	 * Initialize and set label
	 */
	public function __construct() {
		parent::__construct();
		$this->report_label = __( 'Files', 'ns-cloner-site-copier' );

		// Set a lower maximum batch size for files since queue items are bigger (more text for paths).
		add_filter( $this->identifier . '_max_batch', [ $this, 'max_batch' ] );
	}

	/**
	 * Process item.
	 *
	 * @param mixed $item Queue item to process.
	 * @return bool
	 */
	protected function task( $item ) {
		$source      = $item['source'];
		$destination = $item['destination'];

		// Make sure source file exists and destination filed does NOT exist.
		if ( ! is_file( $source ) ) {
			ns_cloner()->log->log( "Source file <b>$source</b> not found. Skipping copy." );
			return false;
		} elseif ( is_file( $destination ) && ! ns_cloner_request()->is_mode( 'clone_over' ) ) {
			ns_cloner()->log->log( "Destination file <b>$destination</b> already exists. Skipping copy." );
			return parent::task( $item );
		}

		// Create destination directory if it doesn't exist already.
		$destination_dir = dirname( $destination );
		if ( ! is_dir( $destination_dir ) ) {
			$missing_dirs = [];
			// Go back up the tree until we get to a dir that DOES exist.
			while ( ! is_dir( $destination_dir ) ) {
				$missing_dirs[]  = $destination_dir;
				$destination_dir = dirname( $destination_dir );
			}
			// Fill in all levels of missing directories.
			foreach ( array_reverse( $missing_dirs ) as $dir ) {
				if ( mkdir( $dir ) ) {
					ns_cloner()->log->log( "Creating directory $dir" );
				} else {
					ns_cloner()->log->log( "Could not create destination $dir. Skipping copy of $source." );
					return false;
				}
			}
		}

		// Attempt to copy file.
		if ( copy( $source, $destination ) ) {
			ns_cloner()->log->log( "Copied file <b>$source</b> to <b>$destination</b>." );
			return parent::task( $item );
		} else {
			ns_cloner()->log->log( "Failed copying file <b>$source</b> to <b>$destination</b>." );
			return false;
		}

	}

	/**
	 * Set a lower maximum batch size for files since queue items are bigger (more text for paths).
	 *
	 * @param int $max Default maximum number of batch items.
	 * @return int
	 */
	public function max_batch( $max ){
		return 2500;
	}

}
PKW�1\�
��AA,processes/class-ns-cloner-tables-process.phpnu�[���<?php
/**
 * Copy Tables Background Process
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Tables_Process class.
 *
 * Processes a queue of tables, and delegates and dispatches a new row process for each one.
 */
class NS_Cloner_Tables_Process extends NS_Cloner_Process {

	/**
	 * Ajax action hook
	 *
	 * @var string
	 */
	protected $action = 'tables_process';

	/**
	 * Initialize and set label
	 */
	public function __construct() {
		parent::__construct();
		$this->report_label = __( 'Tables', 'ns-cloner-site-copier' );
	}

	/**
	 * Task
	 *
	 * Override this method to perform any actions required on each
	 * queue item. Return the modified item for further processing
	 * in the next pass through. Or, return false to remove the
	 * item from the queue.
	 *
	 * @param mixed $item Queue item to iterate over.
	 *
	 * @return mixed
	 */
	protected function task( $item ) {

		$rows_process  = ns_cloner()->get_process( 'rows' );
		$source_prefix = ns_cloner()->db->get_blog_prefix( $item['source_id'] );
		$target_prefix = ns_cloner()->db->get_blog_prefix( $item['target_id'] );
		$source_table  = $item['source_table'];
		$target_table  = $item['target_table'];

		// Implement filter to enable leaving a target table in place, if needed.
		// Otherwise, target table will be dropped and replaced.
		if ( apply_filters( 'ns_cloner_do_drop_target_table', true, $target_table ) ) {
			$drop_query  = "DROP TABLE IF EXISTS `$target_table`";
			$drop_result = ns_cloner()->db->query( $drop_query );
			ns_cloner()->log->handle_any_db_errors();
			$create_query = ns_sql_create_table_query( $source_table, $target_table, $source_prefix, $target_prefix );
			// If it was a view, the create query will be returned empty, so skip.
			if ( empty( $create_query ) ) {
				return false;
			}
			$create_result = ns_cloner()->db->query( $create_query );
			ns_cloner()->log->handle_any_db_errors();
			// Abandon this item if table could not be created -
			// don't mark complete by calling parent::task(), or queue rows.
			if ( false === $create_result ) {
				ns_cloner()->log->log( "SKIPPING TABLE *$source_table*. Could not create table." );
				return false;
			}
		}

		// Save row process batches that will actually do the cloning queries.
		// Note that it saves but doesn't dispatch here, because that would cause
		// multiple async requests for this same process, and race conditions.
		// Instead, we'll dispatch it once at the end in the complete() method.
		$where      = apply_filters( 'ns_cloner_rows_where', 'WHERE 1=1', $source_table, $source_prefix );
		$count_rows = ns_cloner()->db->get_var( "SELECT COUNT(*) rows_qty FROM `$source_table` $where" );
		ns_cloner()->log->log( [ "SELECTED $count_rows with query:", "SELECT COUNT(*) rows_qty FROM `$source_table` $where" ] );
		if ( $count_rows > 0 ) {
			// Enable picking up a partially-queued table if it was massive and had to cut out in the middle.
			if ( isset( $item['next_row'] ) ) {
				$next_row = $item['next_row'];
				ns_cloner()->log->log( "RESTARTING partially queued table at row *$next_row*" );
			} else {
				$next_row = 0;
			}
			$next_row = isset( $item['next_row'] ) ? $item['next_row'] : 0;
			// Add a rows process item for each found row in the table.
			for ( $i = $next_row; $i < $count_rows; $i++ ) {
				$row_data = [
					'row_num'      => $i,
					'source_table' => $source_table,
					'target_table' => $target_table,
					'source_id'    => $item['source_id'],
					'target_id'    => $item['target_id'],
				];
				$rows_process->push_to_queue( $row_data );
				// Check every 5000 rows for timeout.
				if ( $i && 0 === $i % 5000 ) {
					if ( $this->time_exceeded() || $this->memory_exceeded() ) {
						// Return item to be re-processed, with indicator of how many rows were already queued.
						ns_cloner()->log->log( "STOPPING partially queued table at row $i due to resource limits" );
						$item['next_row'] = $i + 1;
						return $item;
					}
				}
			}
			$rows_process->save();
			ns_cloner()->log->log( "QUEUEING *$count_rows* rows from *$source_table* to *$target_table*" );
		} else {
			ns_cloner()->log->log( "SKIPPING TABLE *$source_table*, 0 rows found." );
		}

		return parent::task( $item );

	}

}
PKW�1\rT5""templates/ns-template-logs.phpnu�[���<?php
/**
 * Template for the logs management page
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

// Delete logs if submitted.
if ( ns_cloner_request()->get( 'delete_logs' ) && ns_cloner()->check_permissions() ) {
	ns_cloner()->log->delete_logs();
}

// Delete plugin data if submitted.
if ( ns_cloner_request()->get( 'delete_plugin_data' ) && ns_cloner()->check_permissions() ) {
	ns_cloner()->delete_plugin_data();
}

?>

<div class="ns-cloner-header">
	<a href="<?php echo esc_url( network_admin_url( 'admin.php?page=' . ns_cloner()->menu_slug ) ); ?>">
		<img src="<?php echo esc_url( NS_CLONER_V4_PLUGIN_URL . 'images/ns-cloner-top-logo.png' ); ?>" alt="NS Cloner" />
	</a>
	<span>/</span>
	<h1><?php esc_html_e( 'Logs & Status', 'ns-cloner-site-copier' ); ?></h1>
</div>

<div class="ns-cloner-wrapper">

	<form class="ns-cloner-form ns-cloner-logs-form" method="post">

		<div class="ns-cloner-section">
			<div class="ns-cloner-section-header">
				<h4><?php esc_html_e( 'Scheduled Operations', 'ns-cloner-site-copier' ); ?></h4>
			</div>
			<div class="ns-cloner-section-content">
				<?php if ( empty( ns_cloner()->schedule->get() ) ) : ?>
					<h5><?php esc_html_e( 'No scheduled cloning operations.', 'ns-cloner-site-copier' ); ?></h5>
				<?php else : ?>
					<table class="ns-cloner-ops-table">
						<tr>
							<th class="date-col"><?php esc_html_e( 'Scheduled', 'ns-cloner-site-copier' ); ?></th>
							<th><?php esc_html_e( 'Type', 'ns-cloner-site-copier' ); ?></th>
							<th><?php esc_html_e( 'Created', 'ns-cloner-site-copier' ); ?></th>
							<th class="action-col"><?php esc_html_e( 'View', 'ns-cloner-site-copier' ); ?></th>
							<th class="action-col"><?php esc_html_e( 'Delete', 'ns-cloner-site-copier' ); ?></th>
						</tr>
						<?php foreach ( ns_cloner()->schedule->get() as $i => $data ) : ?>
							<tr data-index="<?php echo esc_attr( $i ); ?>">
								<td>
									<?php echo esc_html( date( 'r', $data['_scheduled'] ) ); ?>
								</td>
								<td>
									<?php $mode = ns_cloner()->get_mode( $data['clone_mode'] ); ?>
									<?php echo esc_html( $mode ? $mode->title : $data['clone_mode'] ); ?>
								</td>
								<td class="date-col">
									<?php echo esc_html( date( 'Y-m-d H:i', $data['_created'] ) ); ?>
									via <?php echo esc_html( $data['_caller'] ); ?>
								</td>
								<td>
									<button class="button ns-cloner-scheduled-view" data-cloner-modal="<?php echo esc_attr( "op_$i" ); ?>">
										<?php esc_html_e( 'View', 'ns-cloner-site-copier' ); ?>
									</button>
									<div class="ns-cloner-extra-modal" id="<?php echo esc_attr( "op_$i" ); ?>">
										<div class="ns-cloner-extra-modal-content">
											<pre><?php echo esc_html( print_r( $data, true ) ); ?></pre>
											<button class="button ns-cloner-form-button close">Close</button>
										</div>
									</div>
								</td>
								<td>
									<button class="button ns-cloner-scheduled-delete" data-index="<?php echo esc_attr( $i ); ?>">
										<?php esc_html_e( 'Delete', 'ns-cloner-site-copier' ); ?>
									</button>
								</td>
							</tr>
						<?php endforeach; ?>
					</table>
				<?php endif; ?>
				<p class="description">
					<?php esc_html_e( 'Scheduled operations are created when someone clicks the clone button while another cloning operation is still running.', 'ns-cloner-site-copier' ); ?>
					<?php esc_html_e( 'They may also be created via the command line or by frontend cloning (from member registrations) with Cloner Pro.', 'ns-cloner-site-copier' ); ?>
				</p>
			</div>
		</div>

        <div class="ns-cloner-section">
            <div class="ns-cloner-section-header">
                <h4><?php esc_html_e( 'NS Cloner Statistics', 'ns-cloner-site-copier' ); ?></h4>
            </div>
            <div class="ns-cloner-section-content" id="analytics-settings">
                <?php
                $analytics_modes      = ns_cloner_analytics()->get_user_modes();
                $analytics_saved_mode = ns_cloner_analytics()->get_user_saved_mode();
                ?>
                <?php foreach ( $analytics_modes as $mode_value => $mode_data ) : ?>
                    <label class="analytics-settings-label">
                        <input type="radio" name="cloner_analytics_mode" value="<?php echo esc_attr( $mode_value ); ?>" <?php checked( $mode_value, $analytics_saved_mode ); ?>>
                        <span class="<?php echo !empty( $mode_data['tooltip'] ) ? 'tooltip' : ''; ?>">
                            <?php echo esc_html( $mode_data['text'] ); ?>
                            <?php if ( !empty( $mode_data['tooltip'] ) ) : ?>
                                <span class="tooltip-text"><?php echo esc_html( $mode_data['tooltip'] ); ?></span>
                            <?php endif; ?>
                        </span>
                    </label>

                <?php endforeach; ?>
            </div>
        </div>

		<div class="ns-cloner-section">
			<div class="ns-cloner-section-header">
				<h4><?php esc_html_e( 'Manage Logs', 'ns-cloner-site-copier' ); ?></h4>
			</div>
			<div class="ns-cloner-section-content">
				<?php if ( empty( ns_cloner()->log->get_logs() ) ) : ?>
					<h5><?php esc_html_e( 'No logs currently saved.', 'ns-cloner-site-copier' ); ?></h5>
				<?php else : ?>
					<p>
						<?php esc_html_e( 'Logs may contain sensitive information from your database, so it\'s good security practice to clear them once no longer needed.', 'ns-cloner-site-copier' ); ?>
						<?php esc_html_e( 'Make sure that you don\'t need them for support or debugging, though, because they will be deleted permanently once cleared.', 'ns-cloner-site-copier' ); ?>
					</p>
					<p>
						<input type="submit" name="delete_logs" class="button ns-cloner-form-button large" value="<?php esc_attr_e( 'Delete All Logs', 'ns-cloner-site-copier' ); ?>" />
					</p>
				<?php endif; ?>
			</div>
		</div>

		<div class="ns-cloner-section">
			<div class="ns-cloner-section-header">
				<h4><?php esc_html_e( 'Clear Plugin Data', 'ns-cloner-site-copier' ); ?></h4>
			</div>
			<div class="ns-cloner-section-content">
                <p>
                    <?php esc_html_e( 'This will clear all plugin settings and any in-progress cloning data.', 'ns-cloner-site-copier' ); ?>
                    <?php esc_html_e( 'This is helpful in cases where a cloning operation gets stuck in limbo and the cancel button isn\'t working.', 'ns-cloner-site-copier' ); ?>
                </p>
                <p>
                    <a class="button ns-cloner-form-button large ns-cloner-options-delete">
                        <?php _e( 'Delete All Plugin Data', 'ns-cloner-site-copier' ); ?>
                    </a>
                </p>
			</div>
		</div>

		<div class="ns-cloner-section">
			<div class="ns-cloner-section-header">
				<h4><?php esc_html_e( 'View Logs', 'ns-cloner-site-copier' ); ?></h4>
			</div>
			<div class="ns-cloner-section-content">
				<?php if ( empty( ns_cloner()->log->get_logs() ) ) : ?>
					<h5><?php esc_html_e( 'No logs currently saved.', 'ns-cloner-site-copier' ); ?></h5>
				<?php else : ?>
					<table class="ns-cloner-logs-table">
						<tr>
							<th class="date-col"><?php esc_html_e( 'Date', 'ns-cloner-site-copier' ); ?></th>
							<th><?php esc_html_e( 'Log File', 'ns-cloner-site-copier' ); ?></th>
							<th><?php esc_html_e( 'Size', 'ns-cloner-site-copier' ); ?></th>
							<th class="action-col"><?php esc_html_e( 'View', 'ns-cloner-site-copier' ); ?></th>
						</tr>
						<?php foreach ( ns_cloner()->log->get_logs() as $log ) : ?>
							<tr>
								<td>
									<?php echo esc_html( date( 'r', $log['date'] ) ); ?>
								</td>
								<td>
									<a href="<?php echo esc_url( $log['url'] ); ?>" target="_blank">
										<?php echo esc_html( basename( $log['url'] ) ); ?>
									</a>
								</td>
								<td>
									<?php echo esc_html( $log['size'] ); ?>
								</td>
								<td>
									<a class="button" href="<?php echo esc_url( $log['url'] ); ?>" target="_blank">
										<?php esc_html_e( 'View Log', 'ns-cloner-site-copier' ); ?>
									</a>
								</td>
							</tr>
						<?php endforeach; ?>
					</table>
				<?php endif; ?>
			</div>
		</div>

		<div class="clear"></div>
		<input type="hidden" name="clone_nonce" value="<?php echo esc_attr( wp_create_nonce( 'ns_cloner' ) ); ?>" />

	</form>

	<?php ns_cloner()->render( 'sidebar-sub' ); ?>

</div>
PKW�1\I�+ƞ�templates/ns-template-main.phpnu�[���<?php
/**
 * Template for main cloner admin page
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

?>
<div class="ns-cloner-header">
	<a href="<?php echo esc_url( network_admin_url( 'admin.php?page=' . ns_cloner()->menu_slug ) ); ?>">
		<img src="<?php echo esc_url( NS_CLONER_V4_PLUGIN_URL . 'images/ns-cloner-top-logo.png' ); ?>" alt="NS Cloner" />
	</a>
	<?php if ( ! defined( 'NS_CLONER_PRO_VERSION' ) ) : ?>
	<div class="ns-cloner-header-pro">
		<strong>Want even more<br/> cloning power?</strong>
		<a href="<?php echo esc_url( NS_CLONER_PRO_URL ); ?>" class="ns-cloner-form-button" target="_blank">Get Pro</a>
	</div>
	<?php endif; ?>
</div>

<div class="ns-cloner-wrapper <?php echo empty( ns_cloner()->get_modes() ) ? 'disabled' : 'enabled'; ?>">

	<form class="ns-cloner-form ns-cloner-main-form" method="post" enctype="multipart/form-data">

		<!-- premptive environment warnings -->
		<?php ns_cloner()->render( 'warnings' ); ?>

		<!-- mode selector -->
		<div class="ns-cloner-section" id="ns-cloner-section-modes">
			<div class="ns-cloner-section-header">
				<h4><?php esc_html_e( 'Select Cloning Mode', 'ns-cloner-site-copier' ); ?></h4>
				<span class="ns-cloner-collapse-all">
					<small>&#9650;</small> <?php esc_html_e( 'Collapse All', 'ns-cloner-site-copier' ); ?>
				</span>
				<span class="ns-cloner-expand-all">
					<small>&#9660;</small>
					<?php esc_html_e( 'Expand All', 'ns-cloner-site-copier' ); ?>
				</span>
			</div>
			<div class="ns-cloner-section-content">
				<?php if ( empty( ns_cloner()->get_modes() ) ) : ?>
				<h5><?php esc_html_e( 'No cloning modes are currently available for this site.', 'ns-cloner-site-copier' ); ?></h5>
				<?php else : ?>
				<select class="ns-cloner-select-mode" name="clone_mode">
					<?php foreach ( ns_cloner()->get_modes() as $mode_id => $details ) : ?>
						<option value="<?php echo esc_attr( $mode_id ); ?>"
								data-description="<?php echo esc_attr( wpautop( $details->description ) ); ?>"
								data-button-text="<?php echo esc_attr( $details->button_text ); ?>">
							<?php echo esc_html( $details->title ); ?>
						</option>
					<?php endforeach; ?>
				</select>
				<div class="ns-cloner-mode-description"></div>
				<?php endif; ?>
			</div>
		</div>

		<!-- sections -->
		<?php do_action( 'ns_cloner_render_sections' ); ?>

		<!-- warning text -->
		<div class="ns-cloner-disclaimer">
			<strong><?php esc_html_e( 'WARNING:', 'ns-cloner-site-copier' ); ?></strong>
			<?php esc_html_e( 'We have made an incredibly complex process ridiculously easy with this powerful plugin. We have tested thoroughly and used this exact tool in our own live multisite environments. However, our comfort level should not dictate your precautions. If you\'re confident in your testing and back-up scheme - which you should have in place anyway ;) - then by all means - start cloning like there\'s no tomorrow!', 'ns-cloner-site-copier' ); ?>
		</div>

	</form>

	<!-- sidebhar -->
	<?php ns_cloner()->render( 'sidebar' ); ?>

	<!-- clone button -->
	<div class="ns-cloner-button-wrapper">
		<div class="ns-cloner-button-steps"></div>
		<input class="ns-cloner-button" type="submit"/>
		<div class="ns-cloner-scroll-progress"></div>
	</div>

	<div class="ns-cloner-processes-modal">
		<div class="ns-cloner-processes-modal-wrapper">
			<div class="ns-cloner-processes-working">
				<div class="ns-modal-head">
					<button class="ns-modal-refresh"><?php esc_html_e( 'Refresh', 'ns-cloner-site-copier' ); ?></button>
					<button class="ns-modal-cancel"><?php esc_html_e( 'Cancel', 'ns-cloner-site-copier' ); ?></button>
					<h1>
						<span class="ns-modal-title">
						<?php
						// Display the title of the current in progress clone mode if applicable.
						if ( ns_cloner()->process_manager->is_in_progress() ) :
							$mode = ns_cloner_request()->get( 'clone_mode' );
							echo esc_html( $mode ? ns_cloner()->get_mode( $mode )->title : 'Unrecognized mode' );
						endif;
						?>
						</span>
						<?php esc_html_e( 'started...', 'ns-cloner-site-copier' ); ?>
					</h1>
				</div>
				<div class="ns-modal-body">
					<div class="ns-cloner-warning-message ajax-on" style="display:none">
						<?php esc_html_e( 'It appears background processing may be getting blocked on the server (or could just be running slowly). Activating backup AJAX processing to ensure completion, so please keep this window open.', 'ns-cloner-site-copier' ); ?>
					</div>
					<div class="ns-cloner-warning-message ajax-force" style="display:none">
						<?php esc_html_e( 'One or more of the cloning processes below have gone more than 60 seconds without showing progress. If at least one item is still progressing, it\'s probably fine and you can ignore this.', 'ns-cloner-site-copier' ); ?>
						<?php esc_html_e( 'If you\'ve been waiting a while and everything is stopped, though, you can try forcing a continuation (if so, expect to see some "Duplicate entry" notices at the end from resuming the failed process).', 'ns-cloner-site-copier' ); ?>
						<a href="#" class="ns-cloner-ajax-force-trigger"><?php esc_html_e( 'Click here to try continuing.', 'ns-cloner-site-copier' ); ?></a>
					</div>
					<div class="ns-process-wrapper ns-create-site">
						<h2><?php esc_html_e( 'Current status', 'ns-cloner-site-copier' ); ?>:</h2>
						<div class="ns-cloner-progress-bar">
							<div class="ns-percents">0%</div>
							<div class="ns-cloner-progress-bar-inner">
							</div>
						</div>
						<div class="ns-cloner-progress-info">
							<span class="objects-migrated">0</span> of
							<span class="total-objects">all</span>
							<?php esc_html_e( 'items processed', 'ns-cloner-site-copier' ); ?>
						</div>
						<div class="ns-cloner-progress-items"></div>
					</div>
				</div>
			</div>
			<div class="ns-cloner-processes-done">
				<div class="ns-modal-head">
					<button class="ns-modal-close"><?php esc_html_e( 'Close', 'ns-cloner-site-copier' ); ?></button>
					<h1><span class="ns-modal-title"></span> <?php esc_html_e( 'finished...', 'ns-cloner-site-copier' ); ?></h1>
				</div>
				<div class="ns-modal-body">
					<div class="ns-process-report">
						<?php
						// Show report on previous clone operation if for some reason it wasn't seen.
						ns_cloner()->render( 'report' );
						?>
					</div>
				</div>
			</div>
		</div>
	</div>

</div>
PKW�1\���X�%�%"templates/ns-template-warnings.phpnu�[���<?php
/**
 * Template for displaying warnings about possible issues before cloning (on cloner admin page).
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/*
 * Handle different possible scenarios with Pro and single vs multisite usage; there are a few possibilities:
 *
 * 1. If they have an OLD PRO VERSION, they should be alerted, no matter whether on network or single admin.
 * 2. If they are ON NON-NETWORK ADMIN with NO PRO VERSION, they should be:
 *     a. If single site, alerted why it's disabled.
 *     b. If multisite and network activated, given link to network admin.
 *     c. if multisite and not network activated, directed to network activate.
 * 3. If they are ON NON-NETWORK ADMIN with NEW PRO VERSION, they should be:
 *     b. If multisite and network activated, given link to network admin.
 *     c. if multisite and not network activated, directed to network activate.
 */

// #1: Warn about incompatible pre-v4 pro plugin if it's present
if ( remove_action( 'ns_cloner_before_construct', 'ns_cloner_addon_content_users_init' ) ) {
	echo "<span class='ns-cloner-error-message'>";
	// If remove_action returned true, then pre-v4 pro was installed, so show notice to explain why pro features are missing.
	$url_function = is_multisite() ? 'network_admin_url' : 'admin_url';
	printf(
		wp_kses(
			/* translators: URLs to plugins page and plugin license page */
			__( 'NS Cloner Pro needs to be updated for compatibility with NS Cloner 4. Please <a href="%s" target="_blank">click here</a> to check for the latest version, and then click "Update now" on NS Cloner Pro when you are redirected to the plugins page (you\'ll need to have <a href="%s" target="_blank">entered an active license</a> for the new version to show up).', 'ns-cloner-site-copier' ),
			ns_wp_kses_allowed()
		),
		esc_url( $url_function( 'plugins.php?check_for_updates=yes' ) ),
		esc_url( $url_function( 'admin.php?page=ns_cloner_pro_dashboard' ) )
	);
	echo '</span>';
}

// #2: Warn if activating core for single site without pro.
if ( ! is_network_admin() && ! defined( 'NS_CLONER_PRO_VERSION' ) ) {
	if ( ! is_multisite() ) {
		$message = __( 'The free version of NS Cloner only works on WordPress Multisite.', 'ns-cloner-site-copier' );
	} elseif ( is_plugin_active_for_network( plugin_basename( NS_CLONER_V4_PLUGIN_DIR . '/ns-cloner.php' ) ) ) {
		$message = sprintf(
			/* translators: URL to network cloner page */
			__( 'The free version of NS Cloner only works as a Multisite Network plugin (<a href="%s">go here to access the Network Cloner page</a>).', 'ns-cloner-site-copier' ),
			network_admin_url( 'admin.php?page=' . ns_cloner()->menu_slug )
		);
	} elseif ( is_multisite() ) {
		$message = sprintf(
			/* translators: URL to network plugins page */
			__( 'The free version of NS Cloner only works as a Network Activated plugin. Go to <a href="%s">Network Admin > Plugins</a> to activate it.', 'ns-cloner-site-copier' ),
			network_admin_url( 'plugins.php' )
		);
	}
	/* translators: URL to plugin info page */
	$pro_text = __( 'For cloning to and from single sites, check out <a href="%s" target="_blank">NS Cloner Pro</a>.', 'ns-cloner-site-copier' );
	$pro_link = sprintf( $pro_text, esc_url( NS_CLONER_PRO_URL ) );
	echo "<span class='ns-cloner-warning-message'>" . wp_kses( $message . ' ' . $pro_link, ns_wp_kses_allowed() ) . '</span>';
	// No other warnings matter now.
	return;
}

// #3: Notice if the installation is multisite but they're using it from a single site admin.
if ( ! is_network_admin() && defined( 'NS_CLONER_PRO_VERSION' ) ) {
	if ( is_plugin_active_for_network( plugin_basename( NS_CLONER_V4_PLUGIN_DIR . '/ns-cloner.php' ) ) ) {
		$message = sprintf(
			/* translators: URL to network cloner page */
			__( 'Just a heads up: the NS Cloner is most powerful and has additional features available when used as a Multisite Network plugin. You can <a href="%s">go here to access the Network Cloner page</a>.', 'ns-cloner-site-copier' ),
			network_admin_url( 'admin.php?page=' . ns_cloner()->menu_slug )
		);
		echo "<span class='ns-cloner-info-message'>" . wp_kses( $message, ns_wp_kses_allowed() ) . '</span>';
	} elseif ( is_multisite() ) {
		$message = sprintf(
			/* translators: URL to network plugins page */
			__( 'Just a heads up: the NS Cloner is most powerful and has additional features available as a Network Activated plugin. You can go to <a href="%s">Network Admin > Plugins</a> to activate it.', 'ns-cloner-site-copier' ),
			network_admin_url( 'plugins.php' )
		);
		echo "<span class='ns-cloner-info-message'>" . wp_kses( $message, ns_wp_kses_allowed() ) . '</span>';
	}
}

// Warn if logs are not writeable.
if ( ! is_writeable( NS_CLONER_LOG_DIR ) ) {
	echo "<span class='ns-cloner-warning-message'>";
	echo wp_kses(
		sprintf(
			// translators: %s: path to logs directory.
			__( 'The logs directory for NS Cloner (<code>%s</code>) is not writable by the server. The Cloner will still work, but logs won\'t be available in case anything needs debugging.', 'ns-cloner-site-copier' ),
			NS_CLONER_LOG_DIR
		),
		ns_wp_kses_allowed()
	);
	echo '</span>';
}

// Warn if max execution time is less than one minute.
$max_execution_time = intval( ini_get( 'max_execution_time' ) );
// 0 means unlimited, so make sure it's greater than that but less than a reasonable limit
if ( $max_execution_time > 0 && $max_execution_time < 60 ) {
	echo "<span class='ns-cloner-warning-message'>";
	// translators: %d: max execution time in seconds.
	echo esc_html( sprintf( __( 'This host\'s max_execution_time is set to %d seconds - we generally recommend at least 60 seconds for running the Cloner.', 'ns-cloner-site-copier' ), $max_execution_time ) );
	esc_html_e( 'You may want to increase the max_execution_time in php.ini (or wherever your host supports PHP configuration updates) to avoid any timeout errors.', 'ns-cloner-site-copier' );
	echo '</span>';
}

// Warn if memory limit is less than 128M.
if ( function_exists( 'ini_get' ) ) {
	$memory_limit = ini_get( 'memory_limit' );
	if ( $memory_limit && -1 != $memory_limit && wp_convert_hr_to_bytes( $memory_limit ) < 128 * MB_IN_BYTES ) {
		echo "<span class='ns-cloner-warning-message'>";
		// translators: %d: memory limit in megabytes.
		echo esc_html( sprintf( __( 'This host\'s memory_limit is set to %dMB - we generally recommend at least 128MB for running the Cloner.', 'ns-cloner-site-copier' ), $memory_limit ) );
		esc_html_e( 'You may want to increase the memory_limit in php.ini (or wherever your host supports PHP configuration updates) to avoid any out-of-memory errors.', 'ns-cloner-site-copier' );
		echo '</span>';
	}
}

// Warn if .htaccess does not contain multisite file rewrite (but only if not on iis7).
if ( is_multisite() && ! iis7_supports_permalinks() ) {
	// Foolproof htaccess path detection stolen from wp-admin/includes/network.php.
	$slashed_home      = trailingslashit( get_option( 'home' ) );
	$base              = wp_parse_url( $slashed_home, PHP_URL_PATH );
	$document_root_fix = str_replace( '\\', '/', realpath( $_SERVER['DOCUMENT_ROOT'] ) );
	$abspath_fix       = str_replace( '\\', '/', ABSPATH );
	$home_path         = 0 === strpos( $abspath_fix, $document_root_fix ) ? $document_root_fix . $base : get_home_path();
	if ( file_exists( $home_path . '.htaccess' ) ) {
		$htaccess = file_get_contents( $home_path . '.htaccess' );
		// Set patterns which tell us that multisite file rewrite is there.
		$pre_3_5_rewrite  = 'wp-includes/ms-files.php';
		$post_3_5_rewrite = '(wp-(content|admin|includes)';
		// Show error if neither pattern occurs.
		if ( false === strpos( $htaccess, $pre_3_5_rewrite ) && false === strpos( $htaccess, $post_3_5_rewrite ) ) {
			echo "<span class='ns-cloner-warning-message'>";
			esc_html_e( 'It appears that you have a non-standard (possibly incorrect) .htaccess file for a multisite install. Cloned sites will not work if rewrites are not configured correctly. ' );
			printf(
				wp_kses(
					// translators: %s: url to network setup page.
					__( 'Please check the recommended htaccess settings <a href="%s" target="_blank">here</a> and make sure your .htaccess file matches.', 'ns-cloner-site-copier' ),
					ns_wp_kses_allowed()
				),
				esc_url( network_admin_url( 'setup.php' ) )
			);
			echo '</span>';
		}
	}
}

// Warn if AJAX requests return a 401 (probably because of HTTP basic auth), b/c process dispatching won't work if so.
$test_response = wp_remote_get( admin_url( 'admin-ajax.php' ) );
if ( is_wp_error( $test_response ) || 401 === wp_remote_retrieve_response_code( $test_response ) ) {
	echo "<span class='ns-cloner-warning-message'>";
	esc_html_e( 'It appears you have HTTP basic auth or something else blocking remote requests to your site, which means background cloning won\'t work. ', 'ns-cloner-site-copier' );
	esc_html_e( 'The Cloner will default to AJAX processing, so you should be able to still clone sites successfully, but progress will stop if you leave this page. ', 'ns-cloner-site-copier' );
	printf(
		wp_kses(
			// translators: %s: url to network setup page.
			__( 'If you have basic auth enabled, you can <a href="%s" target="_blank">add a workaround</a>.', 'ns-cloner-site-copier' ),
			ns_wp_kses_allowed()
		),
		'https://neversettle.it/documentation/ns-cloner/cloning-on-a-password-protected-site/'
	);
	if ( is_wp_error( $test_response ) ) {
		echo esc_html( ' Error: ' . $test_response->get_error_message() . '.' );
	}
	echo '</span>';
}
PKW�1\,(��	�	%templates/ns-template-sidebar-sub.phpnu�[���<?php
/**
 * Sidebar for settings pages
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

?>
<div class="ns-cloner-sidebar">

	<div class="ns-side-widget ns-support-widget">
		<h5><?php esc_html_e( 'Support', 'ns-cloner-site-copier' ); ?></h5>
		<div class="ns-side-widget-content">
			<p>
				<?php esc_html_e( 'Have any issues with the Cloner, or ideas on how to make it better? We\'d love to hear from you.', 'ns-cloner-site-copier' ); ?>
			</p>
			<p>
				<a href="http://support.neversettle.it" class="button" data-cloner-modal="copy-logs" target="_blank">
					<?php esc_html_e( 'Support & Feature Requests', 'ns-cloner-site-copier' ); ?>
				</a>
			</p>
		</div>
	</div>

	<div class="ns-side-widget ns-subscribe-widget">
		<h5><?php esc_html_e( 'Don\'t Miss Anything!', 'ns-cloner-site-copier' ); ?></h5>
		<div class="ns-side-widget-content">
			<p><?php esc_html_e( 'Receive updates, beta invites, articles and more!', 'ns-cloner-site-copier' ); ?></p>
			<!-- Begin Active Campaign Signup Form -->
			<div class="_form_28" id="ns-subscribe-form"></div>
			<?php wp_enqueue_script( 'ns-subscribe', 'https://neversettle.activehosted.com/f/embed.php?id=28', [], '28', true ); ?>
			<!-- End Active Campaign Signup Form -->
		</div>
	</div>

	<?php if ( ! empty( ns_cloner()->log->get_recent_logs() ) ) : ?>
		<div class="ns-cloner-extra-modal" id="copy-logs">
			<div class="ns-cloner-extra-modal-content">
				<h3><?php esc_html_e( 'Before you go...', 'ns-cloner-site-copier' ); ?></h3>
				<p>
					<?php esc_html_e( 'If you\'re going to open a support request, could you please copy the log urls listed below and paste them at the bottom of your support request so we can give you better and faster help? Thank you!', 'ns-cloner-site-copier' ); ?>
				</p>
				<p class="description">
					<?php esc_html_e( '(Please send privately, not on a forum - some sensitive info from your database could be included in the logs.)', 'ns-cloner-site-copier' ); ?>
				</p>
				<textarea onclick="this.select();return false;"><?php echo esc_textarea( join( "\n", ns_cloner()->log->get_recent_logs() ) ); ?></textarea>
				<p>
					<a href="http://support.neversettle.it" class="button" target="_blank"><?php esc_html_e( 'Continue to Support', 'ns-cloner-site-copier' ); ?></a>
				</p>
			</div>
		</div>
	<?php endif; ?>

</div>
PKW�1\��WW2templates/ns-template-analytics-settings-modal.phpnu�[���<?php
$user_modes = ns_cloner_analytics()->get_user_modes();
?>
<div class="ns-cloner-extra-modal load" id="analytics-settings">
    <div class="ns-cloner-extra-modal-content">
        <h3><?php esc_html_e( 'NS Cloner Statistics', 'ns-cloner-site-copier' ); ?></h3>
        <p>
			<?php esc_html_e( 'We\'d be grateful if you are willing to allow the NS Cloner to share cloning statistics with us to help improve the plugin and offer better support. 
            It won\'t include any actual data from your site except the raw domain name at most. 
            But you have full control over this and can update it at any time from the Cloner Logs/Status page.', 'ns-cloner-site-copier' ); ?>
        </p>
        <p>
            <?php esc_html_e( 'By default NO stats are shared - are you willing to Opt-In?', 'ns-cloner-site-copier' ); ?>
        </p>
		<?php foreach ( $user_modes as $value => $mode_details ) : ?>
            <button class="button ns-cloner-form-button save-analytics-mode <?php echo !empty( $mode_details['tooltip'] ) ? 'tooltip' : ''; ?>" data-mode="<?php echo esc_attr( $value ); ?>"
                    data-tooltip="<?php echo ! empty( $mode_details['tooltip'] ) ? esc_attr( $mode_details['tooltip'] ) : ''; ?>">
	            <span class="tooltip-toggle"><?php echo esc_html( $mode_details['text'] ); ?></span>
	            <?php if ( !empty( $mode_details['tooltip'] ) ) : ?>
                    <span class="tooltip-text"><?php echo esc_html( $mode_details['tooltip'] ); ?></span>
	            <?php endif; ?>
            </button>
		<?php endforeach; ?>
    </div>
</div>PKW�1\m��ۧ�!templates/ns-template-sidebar.phpnu�[���<?php
/**
 * Template for sidebar on main cloning admin page.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

?>
<div class="ns-cloner-sidebar">

	<div class="ns-side-widget ns-support-widget">
		<h5><?php esc_html_e( 'Support', 'ns-cloner-site-copier' ); ?></h5>
		<div class="ns-side-widget-content">
			<p>
				<?php esc_html_e( 'Have any issues with the Cloner, or ideas on how to make it better? We\'d love to hear from you.', 'ns-cloner-site-copier' ); ?>
			</p>
			<p>
				<a href="http://support.neversettle.it" class="button" data-cloner-modal="copy-logs" target="_blank">
					<?php esc_html_e( 'Support & Feature Requests', 'ns-cloner-site-copier' ); ?>
				</a>
			</p>
		</div>
	</div>

	<div class="ns-side-widget ns-rate-widget">
		<h5><?php esc_html_e( 'Do you like NS Cloner?', 'ns-cloner-site-copier' ); ?></h5>
		<div class="ns-side-widget-content">
			<p>
				<?php esc_html_e( 'If the Cloner has saved you lots of time, tell everyone with a 5-star rating!', 'ns-cloner-site-copier' ); ?>
			</p>
			<p>
				<a href="http://wordpress.org/support/view/plugin-reviews/ns-cloner-site-copier?rate=5#postform" target="_blank" class="button">
					<?php esc_html_e( 'Rate it 5 Stars', 'ns-cloner-site-copier' ); ?>
				</a>
			</p>
		</div>
	</div>

	<div class="ns-side-widget ns-subscribe-widget">
		<h5><?php esc_html_e( 'Don\'t Miss Anything!', 'ns-cloner-site-copier' ); ?></h5>
		<div class="ns-side-widget-content">
			<p><?php esc_html_e( 'Receive updates, beta invites, articles and more!', 'ns-cloner-site-copier' ); ?></p>
			<!-- Begin Active Campaign Signup Form -->
			<div class="_form_28" id="ns-subscribe-form"></div>
			<?php wp_enqueue_script( 'ns-subscribe', 'https://neversettle.activehosted.com/f/embed.php?id=28', [], '28', true ); ?>
			<!-- End Active Campaign Signup Form -->
		</div>
	</div>

	<div class="ns-side-widget ns-featured-widget">
		<div class="ns-side-widget-content">
			<?php
			$feed = fetch_feed( 'http://neversettle.it/plugin-widget-status/featured/feed/' );
			if ( ! is_wp_error( $feed ) && is_array( $feed->get_items() ) && count( $feed->get_items() ) > 0 ) :
				$items        = $feed->get_items();
				$featured     = array_shift( $items );
				$thumbnail_el = $featured->get_item_tags( 'http://neversettle.it/', 'thumbnail' );
				?>
				<a href="<?php echo esc_url( $featured->get_link() ); ?>" target="_blank">
					<img style="max-width:100%; width:100%; margin-bottom:-5px;" src="<?php echo esc_url( $thumbnail_el[0]['data'] ); ?>" alt="Featured Product" />
				</a>
			<?php endif; ?>
		</div>
	</div>

	<div class="ns-side-widget ns-links-widget">
		<h5>
			<?php esc_html_e( 'Built by', 'ns-cloner-site-copier' ); ?>
			<a href="http://neversettle.it/home/?utm_campaign=in+plugin+referral&utm_source=ns-cloner&utm_medium=plugin&utm_content=social+button+to+ns">Never Settle</a>
		</h5>
		<div class="ns-side-widget-content">
			<a href="http://neversettle.it/home/?utm_campaign=in+plugin+referral&utm_source=ns-cloner&utm_medium=plugin&utm_content=social+button+to+ns" target="_blank">
				<img src="<?php echo esc_url( NS_CLONER_V4_PLUGIN_URL . 'images/ns-visit.png' ); ?>" alt="Visit NS" />
			</a>
			<a href="http://facebook.com/neversettle.it" target="_blank">
				<img src="<?php echo esc_url( NS_CLONER_V4_PLUGIN_URL . 'images/ns-like.png' ); ?>" alt="Like NS" />
			</a>
			<a href="https://twitter.com/neversettleit" target="_blank">
				<img src="<?php echo esc_url( NS_CLONER_V4_PLUGIN_URL . 'images/ns-follow.png' ); ?>" alt="Follow NS" />
			</a>
		</div>
	</div>

	<?php if ( ! empty( ns_cloner()->log->get_recent_logs() ) ) : ?>
	<div class="ns-cloner-extra-modal" id="copy-logs">
		<div class="ns-cloner-extra-modal-content">
			<h3><?php esc_html_e( 'Before you go...', 'ns-cloner-site-copier' ); ?></h3>
			<p>
				<?php esc_html_e( 'If you\'re going to open a support request, could you please copy the log urls listed below and paste them at the bottom of your support request so we can give you better and faster help? Thank you!', 'ns-cloner-site-copier' ); ?>
			</p>
			<p class="description">
				<?php esc_html_e( '(Please send privately, not on a forum - some sensitive info from your database could be included in the logs.)', 'ns-cloner-site-copier' ); ?>
			</p>
			<textarea onclick="this.select();return false;"><?php echo esc_textarea( join( "\n", ns_cloner()->log->get_recent_logs() ) ); ?></textarea>
			<p>
				<a href="http://support.neversettle.it" class="button" target="_blank"><?php esc_html_e( 'Continue to Support', 'ns-cloner-site-copier' ); ?></a>
			</p>
		</div>
	</div>
	<?php endif; ?>

</div>
PKW�1\t��		 templates/ns-template-report.phpnu�[���<?php
/**
 * Template to report the results of a cloning operation (loaded by ajax).
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

$reports = ns_cloner()->report->get_all_reports();
// If page gets reloaded while in progress, don't show and clear report.
if ( ! empty( $reports ) && ! ns_cloner()->process_manager->is_in_progress() ) {
	?>
		<div class="ns-cloner-report-content">
			<?php if ( isset( $reports['_error'] ) ) : ?>
				<span class="ns-cloner-error-message"><?php echo esc_html( $reports['_error'] ); ?></span>
			<?php elseif ( isset( $reports['_message'] ) ) : ?>
				<h5><?php echo esc_html( $reports['_message'] ); ?></h5>
			<?php endif; ?>
			<?php if ( isset( $reports['_notices'] ) ) : ?>
				<?php foreach ( $reports['_notices'] as $notice ) : ?>
				<span class="ns-cloner-warning-message"><?php echo esc_html( $notice ); ?></span>
				<?php endforeach; ?>
			<?php endif; ?>
			<?php foreach ( $reports as $label => $value ) : ?>
				<?php
				// Skip special/hidden messages that start with underscore.
				if ( strpos( $label, '_' ) === 0 ) {
					continue;
				}
				// Format links - for logs just display the last.
				if ( preg_match( '/^http/', $value ) ) {
					$value = "<a href='$value' target='_blank'>" . str_replace( NS_CLONER_V4_PLUGIN_URL, '', $value ) . '</a>';
				}
				?>
				<div class="ns-cloner-report-item">
					<div class="ns-cloner-report-item-label"><?php echo esc_html( $label ); ?>:</div>
					<div class="ns-cloner-report-item-value"><?php echo wp_kses( $value, ns_wp_kses_allowed() ); ?></div>
				</div>
			<?php endforeach; ?>
		</div>
	<?php
	// Clear now that they've been displayed once.
	ns_cloner()->report->clear_all_reports();
}
?>
PKW�1\�/�tr|r|js/ns-cloner.jsnu�[���/**
 * NS Cloner - main JS library.
 *
 * @package NS_Cloner
 */

jQuery(
	function ( $ ) {

		/**
		 * Sections
		 */

		// Default pro promotion sections to closed.
		$( '.ns-cloner-section[id$=promo]' ).addClass( 'closed' );

		// Close report when close button is clicked.
		$( 'input.ns-cloner-close-report' ).click(
			function () {
				$( '.ns-cloner-report' ).fadeOut();
			}
		);

		// Set up action when clone mode select is changed.
		$( '.ns-cloner-select-mode' ).change(
			function () {
				$( '.ns-cloner-main-form' ).trigger( 'ns_cloner_form_refresh' );
			}
		);

		// Set up action when source site is changed.
		$( '.ns-cloner-site-select' ).change(
			function ( e ) {
				$( '.ns-cloner-main-form' ).trigger( 'ns_cloner_source_refresh', [ $( this ).val() ] );
			}
		);

		// Make section slide up / down when section toggle is clicked.
		$( '.ns-cloner-section-header' ).click(
			function () {
				$( this ).parents( '.ns-cloner-section' ).not( '#ns-cloner-section-modes' ).toggleClass( 'closed' );
			}
		);

		// Make all sections slide up / down when all toggles is clicked.
		$( '.ns-cloner-collapse-all' ).click(
			function () {
				var $sections = $( '.ns-cloner-section' ).not( '#ns-cloner-section-modes' );
				$sections.addClass( 'closed' );
			}
		);
		$( '.ns-cloner-expand-all' ).click(
			function () {
				var $sections = $( '.ns-cloner-section' ).not( '#ns-cloner-section-modes' );
				$sections.removeClass( 'closed' );
			}
		);

		/**
		 * Section Fields
		 */

		// When modifying a text field that should show immediate validation, trigger it.
		$( '.ns-cloner-section' ).on(
			'input',
			'input.ns-cloner-quick-validate',
			function () {
				var input   = $( this );
				var section = input.parents( '.ns-cloner-section' );
				// Show spinner next to field to indicate that validation is in progress.
				var input_group = input.parents( '.ns-cloner-input-group' );
				var input_ref   = input_group.length ? input_group.children( ':last:not(span)' ) : $( this );
				if ( input_ref.nextAll( '.ns-cloner-validating-spinner' ).length === 0 ) {
					input_ref.after( '<span class="ns-cloner-validating-spinner"></span>' );
				}
				// Remove any error messages.
				section.find( '.ns-cloner-error-message' ).remove();
				// Cancel any already scheduled validation for this field.
				if ( input.data( 'validation_timeout' ) ) {
					window.clearTimeout( input.data( 'validation_timeout' ) );
				}
				// Schedule validation in 1 second so that validation will only take place once a second.
				var timeout = window.setTimeout(
					function () {
						ns_cloner_form.validate_section( section.attr( 'id' ) );
						input.data( 'validation_timeout', false );
					},
					1000
				);
				// Save the timeout so it can be deferred (cleared and reset) if another change is made before the timeout ends.
				input.data( 'validation_timeout', timeout );
			}
		);

		// Add autocomplete for search box.
		$( '.ns-cloner-section-content select' ).not( '.no-chosen' ).each(
			function() {
				$( this ).chosen(
					{
						width: '100%',
						max_selected_options: $( this ).attr( 'data-max' )
					}
				);
			}
		);

		// Turn on repeaters.
		$( '.ns-repeater' ).nsRepeater();

		/**
		 * Modals
		 */

		// Show copy logs box before going to support, then close copy logs box once continue button is clicked.
		$( '[data-cloner-modal]' ).click(
			function ( e ) {
				var id    = $( this ).attr( 'data-cloner-modal' );
				var modal = $( '#' + id );
				if (  modal.length ) {
					modal.fadeIn();
					e.preventDefault();
				}
			}
		);
		$( '.ns-cloner-extra-modal .close' ).click(
			function ( e ) {
				$( this ).parents( '.ns-cloner-extra-modal' ).fadeOut();
				e.preventDefault();
			}
		);
		$( '.ns-cloner-extra-modal' ).click(
			function ( e ) {
				if ( e.target === this ) {
					$( this ).fadeOut();
				}
			}
		);

		// Force page to reload so if a migration is in progress it will be opened again.
		$( document ).on(
			'click',
			'.ns-modal-refresh, .ns-modal-close',
			function () {
				window.location.reload();
			}
		);

		// Enable cancelling a clone process.
		$( document ).on(
			'click',
			'.ns-modal-cancel',
			function () {
				if ( window.confirm( "Are you sure you want to cancel this cloning process?" ) ) {
					ns_cloner_form.ajax(
						{ action: 'ns_cloner_process_exit' },
						function () {
							$( '.ns-cloner-processes-working' ).next( 'h2' ).text( 'Cleaning up...' );
							// Delay a few seconds to give active processes the chance to recognize the exit flag,
							// so that the progress modal won't pop up when
							window.setTimeout( function(){
								window.location.reload();
							}, 10000 );
						}
					);
					$( '.ns-cloner-processes-working' ).slideUp().after(
						'<h2 style="text-align:center">Canceling...</h2>' +
						'<img src="' + ns_cloner.loading_img + '" class="ns-cloner-loading-center" alt="loading..." />'
					);
				}
			}
		);

		// Automatically open progress modal and start checking progress,
		// if an operation is already in progress when page is loaded.
		if ( ns_cloner.in_progress ) {
			$( '.ns-cloner-processes-modal' ).show( 500 );
			$( window ).on('load',
				function () {
					ns_cloner_form.get_progress();
				}
			);
		}

		// Automatically open modal and show report if the report from the last clone operation was not seen.
		if ( $( '.ns-cloner-report-content' ).children().length ) {
			$( '.ns-cloner-processes-working' ).hide();
			$( '.ns-cloner-processes-done' ).show();
			$( '.ns-cloner-processes-modal' ).show( 500 );
		}

		/**
		 * Bottom Bar and Button
		 */

		// Update the steps in the bottom bar when scrolling.
		$( document ).on(
			'scroll',
			function () {
				// Highlight the current step in the bottom bar - current determined by the latest section fully visible in the viewport.
				var sections = $( '.ns-cloner-section:visible' ).toArray().reverse();
				// Pass back to jQuery since it's now an array, not a jQuery object.
				$( sections ).each(
					function () {
						// calculate scroll offset required to be above bottom of viewport, including the bottom button bar.
						var bottom_of_viewport = $( window ).scrollTop() + $( window ).height() - 90;
						var bottom_of_element  = $( this ).offset().top + $( this ).height();
						if ( bottom_of_element < bottom_of_viewport ) {
							// Highlight the current step in the bottom bar.
							var step_label = $( '[data-section="' + $( this ).attr( 'id' ) + '"]' );
							step_label.addClass( 'seen' ).prevAll().addClass( 'seen' );
							return false;
						}
					}
				);
				// Adjust width of scroll progress bar
				// (for more accurate correlation of progress bar to steps in bottom bar, calculate relative to content, not whole page).
				var content_offset = $( '.ns-cloner-wrapper' ).offset().top;
				var scroll_max     = $( document ).height() - $( window ).height() - content_offset;
				var scroll_value   = $( window ).scrollTop() - content_offset;
				var scroll_percent = Math.round( 100 * (scroll_value / scroll_max) );
				$( '.ns-cloner-scroll-progress' ).css( 'width', scroll_percent + '%' );
			}
		);

		// Scroll to a section when clicking on its step in the bottom bar.
		$( '.ns-cloner-button-steps' ).on(
			'click',
			'span',
			function () {
				var section = $( '#' + $( this ).attr( 'data-section' ) );
				$( 'html,body' ).animate( { scrollTop: section.offset().top - 50 } );
			}
		);

		/**
		 * Refresh UI based on mode selection
		 */

		// Update ui when refresh is triggered by changed setting, etc.
		$( '.ns-cloner-main-form' ).on(
			'ns_cloner_form_refresh',
			function () {
				var $mode_selector   = $( '.ns-cloner-select-mode' );
				var $selected_option = $mode_selector.children( 'option[value=' + $mode_selector.val() + ']' );
				// Show correct metaboxes.
				var mode_slug        = $mode_selector.val();
				var mode_title       = $selected_option.text().trim();
				var mode_description = $selected_option.attr( 'data-description' );
				var mode_button_text = $selected_option.attr( 'data-button-text' );
				$( '.ns-cloner-section' ).filter( ':not([data-modes~=' + mode_slug + '],[data-modes=all])' ).not( '#ns-cloner-section-modes' ).slideUp().promise().done(
					function () {
						$( '.ns-cloner-section' ).filter( '[data-modes~=' + mode_slug + ']' ).slideDown();
					}
				);
				// Show correct description for current mode.
				$( '.ns-cloner-mode-description' ).fadeOut(
					function () {
						$( this ).html( mode_description ).fadeIn();
					}
				);
				// Set modal title based on current clone mode title (lowercased to look better).
				$( '.ns-modal-title' ).text( mode_title.charAt( 0 ).toUpperCase() + mode_title.slice( 1 ).toLowerCase() );
				// Fade out submit button - make updates to it later at same time as button steps,
				// so that animation timing won't mess up width calculations.
				$( '.ns-cloner-button' ).animate( { opacity: 0 } );
				// Fade out the steps in bottom bar, update active steps, then fade back in.
				$( '.ns-cloner-button-steps' ).animate(
					{ opacity: 0 },
					function () {
						// Remove current steps list.
						$( this ).html( '' );
						// Add new step for each visible section that has a non-empty data-button-step attribute.
						$( '.ns-cloner-section[data-modes~=' + mode_slug + ']:not([data-button-step=""])' ).each(
							function () {
								var section_id = $( this ).attr( 'id' );
								var label_text = $( this ).attr( 'data-button-step' );
								$( '<span/>', { 'data-section': section_id } ).text( label_text ).appendTo( '.ns-cloner-button-steps' );
							}
						);
						// Update submit button label.
						$( '.ns-cloner-button' ).val( mode_button_text );
						// Adjust font size so all steps fit on one line.
						var bar_width           = $( this ).width() - 20;
						var item_spacing        = $( this ).children().length * 55;
						var width_per_character = Math.floor( (bar_width - item_spacing) / $( this ).text().length );
						if ( width_per_character < 11 ) {
							var reduction_needed = 11 - width_per_character;
							$( this ).css( 'font-size', 18 - reduction_needed + 'px' );
						} else {
							$( this ).css( 'font-size', '18px' );
						}
						// Fade all steps back in.
						$( this ).animate( { opacity: 1 } );
						$( '.ns-cloner-button' ).animate( { opacity: 1 } );
					}
				);
				// Enable classes to provide hook for different behavior for different modes (eg teleport).
				$( '.ns-cloner-button' ).attr( 'data-mode', mode_slug );
			}
		);

		// Trigger initial setup when page loads.
		$( window ).on('load',
			function () {
				$( '.ns-cloner-main-form' )
					.trigger( 'ns_cloner_form_refresh' )
					.trigger( 'ns_cloner_source_refresh', $( '.ns-cloner-site-select').val() );
			}
		);

		// Force re-dispatch mode.
		$( '.ns-cloner-ajax-force-trigger' ).click(
			function(e){
				e.preventDefault();
				$( this ).parent().remove();
				ns_cloner_form.ajax_force = true;
			}
		);

		// Move license nag down to alerts section.
		$( '.notice-error:contains("NS Cloner")' )
			.removeClass( 'notice' )
			.addClass( 'ns-cloner-warning-message' )
			.remove()
			.prependTo( '.ns-cloner-form' );

		/**
		 * Form Submission
		 */

		// Validate and either show errors or submit form when clone button is clicked.
		$( document ).on(
			'click',
			'.ns-cloner-button',
			function ( e ) {
				e.preventDefault();
				// Show loading indicator and prevent double submissions.
				if ( $( this ).is( '.working' ) ) {
					return false;
				} else {
					$( this ).addClass( 'working' );
				}
				// Remove old error messages.
				$( '.ns-cloner-main-form' ).find( '.ns-cloner-error-message' ).remove();
				$( '.ns-cloner-button-steps > span' ).removeClass( 'invalid' );
				// Submit process_init request that will begin cloning process.
				ns_cloner_form.submit();
			}
		);

		/**
		 * Status page
		 */

		// Cancel/delete a scheduled cloning operation.
		$( '.ns-cloner-scheduled-delete' ).on(
			'click',
			function( e ){
				var button = $( this ).addClass( 'working' );
				ns_cloner_form.ajax(
					{
						'action' : 'ns_cloner_delete_schedule',
						'index'  : button.attr( 'data-index' )
					},
					function( result ){
						button.removeClass( 'working' );
						if ( true === result.success ) {
							button.parents( 'tr' ).slideUp();
						} else {
							alert( 'Item not found, deletion failed.' );
						}
					}
				);
				e.preventDefault();
			}
		);

		// Delete plugin options data.
		$( '.ns-cloner-options-delete' ).on(
			'click',
			function( e ){
				var button = $( this ).addClass( 'working' );
				ns_cloner_form.ajax(
					{
						'action' : 'ns_cloner_delete_options',
					},
					function( result ){
						button.removeClass( 'working' );
						if ( true === result.success ) {
							button.hide().after('<span class="ns-cloner-success-message">Data cleared successfully.</span>');
						} else {
							alert( 'Clearing data failed, please try again.' );
						}
					}
				);
				e.preventDefault();
			}
		);

		/**
		 * Utility functions
		 */

		window.ns_cloner_form = {

			'ajax': function ( data, success ) {
				// Automatically set the nonce.
				data.clone_nonce = ns_cloner.nonce;
				// Submit the ajax request.
				$.ajax(
					{
						type: 'POST',
						url: ns_cloner.ajaxurl + '?flag=' + data.action,
						dataType: 'JSON',
						data: data,
						success: success,
						error: function ( xhr, status, error ) {
							console.error( error );
						}
					}
				);
			},

			'validate_section': function ( section_id ) {
				var section    = $( '#' + section_id );
				var step_label = $( '[data-section="' + section_id + '"]' );
				// Make sure there's no pending validation request.
				if ( ! section.length || section.is( '.validating' ) ) {
					return;
				} else {
					section.addClass( 'validating' ).trigger( 'validation.start' );
				}
				// Get validation response and update ui.
				var data = ns_cloner_form.get_data(
					{
						'action': 'ns_cloner_validate_section',
						'section_id': section_id.replace( 'ns-cloner-section-', '' )
					}
				);
				ns_cloner_form.ajax(
					data,
					function ( response ) {
						// Don't bother validating if form has already been submitted -
						// let the process_init action handle any remaining validation errors.
						if ( $( '.ns-cloner-button' ).is( '.working' ) ) {
							return;
						}
						// Display validation results.
						var spinner = section.find( '.ns-cloner-validating-spinner' );
						section.removeClass( 'validating' );
						if ( response.success ) {
							spinner.addClass( 'valid' ).delay( 2000 ).fadeOut(
								function () {
									$( this ).remove();
								}
							);
							section.trigger( 'validation.success' );
							step_label.removeClass( 'invalid' ).addClass( 'valid' );
						} else {
							spinner.remove();
							section.trigger( 'validation.error' );
							step_label.removeClass( 'valid' ).addClass( 'invalid' );
							$.each(
								response.data,
								function ( index, item ) {
									var error_message = '<span class="ns-cloner-error-message">' + item.message + '</span>';
									section.find( '.ns-cloner-section-content' ).prepend( error_message );
								}
							);
						}
					}
				);
			},

			'submit': function () {
				// Set up data to post.
				var data = ns_cloner_form.get_data(
					{
						'action': 'ns_cloner_process_init'
					}
				);
				// Check first for any empty required fields (having data-required attr or instant validation).
				// Can't use regular HTML required attr because browser can get funny with fields in hidden sections.
				// This just speeds up validation with basic client-side checking. Probably not worth doing full
				// client site validation, but this is low hanging fruit to make UX a little better with fast
				// response if a field just gets missed by mistake.
				var missing_required = false;
				$( '.ns-cloner-section:visible' ).find( '[data-required], .ns-cloner-quick-validate' ).each(
					function(){
						if ( ! $( this ).val() ) {
							var label = $( this ).attr( 'data-label' );
							$( this ).parents( '.ns-cloner-section-content' )
							.prepend( '<span class="ns-cloner-error-message">' + label + ' is required.</span>' )
							.parent().removeClass( 'closed' );
							missing_required = true;
						}
					}
				);
				if ( missing_required ) {
					$( '.ns-cloner-button' ).removeClass( 'working' );
					// Scroll to location of first error message.
					var first_error = $( '.ns-cloner-error-message:first' );
					$( 'html,body' ).animate( { scrollTop: first_error.offset().top - 50 } );
					return;
				}
				// Submit request to begin the next step.
				ns_cloner_form.ajax(
					data,
					function ( response ) {
						$( '.ns-cloner-button' ).removeClass( 'working' );
						if ( response.success === true ) {
							// Validation + startup was successful, so start showing progress.
							$( '.ns-cloner-processes-modal' ).show( 500 );
							ns_cloner_form.get_progress();
						} else if ( response.success === false ) {
							// Validation + startup was not successful so show errors.
							$.each(
								response.data,
								function ( index, item ) {
									var error_message = $( '<span class="ns-cloner-error-message">' + item.message + '</span>' );
									// Add the error message to the appropriate section if associated with one, otherwise to the top of the form.
									if ( item.section ) {
										var section_id = 'ns-cloner-section-' + item.section;
										$( '#' + section_id )
										.removeClass( 'closed' )
										.find( '.ns-cloner-section-content' )
										.prepend( error_message );
										$( '[data-section="' + section_id + '"]' ).addClass( 'invalid' );
									} else {
										$( '.ns-cloner-main-form' ).prepend( error_message );
									}
								}
							);
							// Scroll to location of first error message.
							var first_error = $( '.ns-cloner-error-message:first' );
							$( 'html,body' ).animate( { scrollTop: first_error.offset().top - 50 } );
						} else {
							// Server error - invalid response (data.success not explicitly set as true OR false).
							alert( 'Sorry, an unidentified error occurred.' );
						}
					}
				);
			},

			'get_data': function ( data ) {
				if ( ! data ) {
					data = {};
				}
				var form = $( '.ns-cloner-main-form' );
				// Get all inputs that are in visible sections and have a name attribute.
				form.find( '.ns-cloner-section:visible [name]' ).each(
					function () {
						var name = $( this ).attr( 'name' );
						if ( name.match( /\[\]$/ ) ) {
							// Handles arrays, with more than one input sharing the same name.
							var plain_name     = name.replace( '[]', '' );
							var all_with_name  = $( '[name="' + name + '"]' );
							data[ plain_name ] = [];
							all_with_name.each(
								function () {
									if ( $( this ).is( 'select, [type=text], [type=hidden], :selected, :checked' ) ) {
										data[ plain_name ].push( $( this ).val() );
									}
								}
							);
							// Add empty string to cause data to be sent if a blank array.
							// This is so the backend can tell the difference between all items being unchecked
							// versus the field not being visible/sent at all - e.g. with tables, if all are
							// unchecked, we should apply the filter and have 0 tables copied, but if the control
							// wasn't shown (say the request was created programatically), we should default to
							// including all tables. This is necessary because jQuery ajax ignores blank arrays,
							// so a name/key won't get sent at all if it doesn't have at least a blank value.
							if ( ! data[ plain_name ].length ) {
								data[ plain_name ].push( '' );
							}
						} else {
							// Handle single elements.
							if ( $( this ).is( '[type=checkbox],[type=radio]' ) ) {
								value = $( this ).is( ":checked" ) ? 1 : '';
							} else {
								value = $( this ).val();
							}
							data[ name ] = value;
						}
					}
				);
				return data;
			},

			'get_progress': function () {
				var data = {
					'action': 'ns_cloner_get_progress'
				};
				// Note - there's a difference of response.data.status vs response.status.
				// 1) response.data.status is the status 'complete' or 'in_progress' of the cloning operation.
				// 2) response.status is the status 'success' or 'error' of wp_send_json_success/error.
				ns_cloner_form.ajax(
					data,
					function ( response ) {
						if ( response.data.report ) {
							// If a report was returned, we're all done - show it and hide the progress section.
							$( '.ns-process-report' ).html( response.data.report );
							$( '.ns-cloner-processes-working' ).slideUp(
								function () {
									$( '.ns-cloner-processes-done' ).slideDown();
								}
							);
						} else if ( true === response.success ) {
							// Cloning progress is not complete, so update progress and set timer to check progress again.
							ns_cloner_form.show_progress( response.data );
							window.setTimeout( ns_cloner_form.get_progress, 3000 );
						} else {
							// An error occurred.
							$( '.ns-modal-body' ).slideUp(
								function () {
									var error = response.data.pop();
									$( this ).after( '<span class="ns-cloner-error-message">' + error.message + '</span>' );
								}
							);
						}
					}
				);
			},

			'show_progress': function ( data ) {
				// Update progress bar.
				$( '.ns-create-site .ns-percents' ).text( Math.min( 100, data.percentage ) + '%' );
				$( '.ns-create-site .ns-cloner-progress-bar-inner' ).css( 'width', data.percentage + '%' );
				$( '.ns-cloner-processes-modal .objects-migrated' ).text( data.completed );
				$( '.ns-cloner-processes-modal .total-objects' ).text( data.total );
				// Update item counts.
				for ( var process in data.processes ) {
					var process_data = data.processes[ process ];
					var progress     = process_data.progress;
					var item         = $( '#' + process + '_progress' );
					// Before updating process progress, make sure it hasn't gone backward, and skip if so.
					// This sometimes happens right at the end due to finish() being called and deleting progress during cleanup.
					var last = ns_cloner_form.last_progress[ process ];
					if ( ! last || progress.completed > last.total ) {
						last = {
							total: progress.completed,
							time: new Date().valueOf()
						};
						ns_cloner_form.last_progress[ process ] = last;
						// If it was stalled (restart option shown) and now progress is added, we no longer need restart.
						ns_cloner_form.stalled[ process ] = false;
					}
					// Show progress for individual process.
					if ( item.length ) {
						var progress_display = item.find( 'em:first' ).data( 'scroller' );
						var total_display    = item.find( 'em:last' ).data( 'scroller' );
						// Update if existing - don't scroll total, because it will take too long for large numbers.
						var lag = progress.completed - progress_display.getCurrentValue();
						if (  lag > 500 || lag < -500 ) {
							progress_display.jumpTo( progress.completed );
						} else {
							progress_display.scrollTo( progress.completed );
						}
						total_display.jumpTo( progress.total );
					} else {
						// Or add new item if not.
						$( '.ns-cloner-progress-items' ).append(
							'<div id="' + process + '_progress">' +
							'<em>' + progress.completed + '</em> of <em>' + progress.total + '</em>' +
							'<small>' + process_data.label + '</small>' +
							'</div>'
						);
						$( '#' + process + '_progress' ).find( 'em' ).each(
							function () {
								$( this ).data( 'scroller', $( this ).digitScroller() );
							}
						);
					}
					// Auto re-dispatch if this process was dispatched more than 5 seconds ago but never marked received.
					var since_dispatched = ( Date.now() / 1000 ) - process_data.dispatched;
					if ( process_data.dispatched && since_dispatched > 5 && ! ns_cloner_form.ajax_force ) {
						ns_cloner_form.ajax(
							{
								'action' : 'ns_cloner_' + process + '_process',
								'nonce'  : process_data.nonce,
								'ajax'   : true
							}
						);
						$( '.ns-cloner-warning-message.ajax-on' ).show();
					}
					// Mark process as stalled if it's been more than 60 seconds since last progress.
					var since_last_progress = last && last.time ? new Date().valueOf() - last.time : 0;
					if ( ! process_data.dispatched && since_last_progress > 60000 && progress.completed != progress.total ) {
						$( '.ns-cloner-warning-message.ajax-force' ).show();
						ns_cloner_form.stalled[ process ] = true;
					}
					// Manually re-dispatch with force_process to override any locks, if manual restart clicked.
					if ( ns_cloner_form.stalled[ process ] && ns_cloner_form.ajax_force ) {
						ns_cloner_form.ajax(
							{
								'action' : 'ns_cloner_' + process + '_process',
								'nonce'  : process_data.nonce,
								'ajax'   : true,
								'force_process' : true,
							}
						);
						ns_cloner_form.stalled[ process ] = false;
						ns_cloner_form.last_progress[ process ].time = new Date().valueOf();
					}

				}
			},

			'last_progress': {},

			'stalled': {},

			'ajax_force': false,

		};

		$(document).ready(function () {
			$('.ns-cloner-extra-modal.load').fadeIn();
        });

		$(document).on('click', '#analytics-settings .save-analytics-mode', function () {
			var button = $(this).css({ opacity: 0.75 });
			button.find('span').text('Saving...');
			save_analytics_mode(button.attr('data-mode'), button.closest('.ns-cloner-extra-modal'));
        });

		$(document).on('change', '#analytics-settings [name=cloner_analytics_mode]', function () {
            save_analytics_mode($(this).val());
        });

		function save_analytics_mode(mode, modal) {
            $.post(
                ns_cloner.ajaxurl,
                {
                    action: 'ns_cloner_save_analytics_mode',
                    mode: mode
                },
                function (response) {
                    if (typeof response.success !== 'undefined' && response.success === true && modal) {
                        modal.fadeOut();
                    }
                }
            );
        }
	}
);

/**
 * Lightweight custom jQuery plugin to create simple repeater input UI
 *
 * Uses format
 * <ul class="ns-repeater">
 *    <li>
 *    <!-- any input fields to be repeated -->
 *    <span class="ns-repeater-remove" title="remove"></span>
 *    </li>
 * </ul>
 * <input type="button" class="button ns-repeater-add" value="Add"/>
 */
jQuery.fn.nsRepeater = function () {
	this.on(
		'click',
		'.ns-repeater-remove',
		function () {
			var repeater = jQuery( this ).parents( '.ns-repeater' );
			var item     = jQuery( this ).parent( 'li' );
			if ( repeater.find( 'li' ).length > 1 ) {
				item.remove();
			} else {
				item.hide().addClass( 'invisible' );
				item.find( 'textarea,input,select' ).removeAttr( 'checked selected' ).val( '' );
			}
		}
	);
	this.next( '.ns-repeater-add' ).click(
		function () {
				var repeater = jQuery( this ).prev( '.ns-repeater' );
				var item     = repeater.children( 'li:last' ).clone();
				item.show().removeClass( 'invisible' );
				item.find( 'textarea,input,select' ).removeAttr( 'checked selected' ).val( '' );
				repeater.append( item );
				repeater.children('li:last').find('.chosen-container').remove();
				repeater.children('li:last').find('select').chosen();
		}
	);
};

/**
 * Project: https://github.com/svichas/jquery.digitScroller.js
 * Author: Stefanos Vichas
 * License: MIT
 */

! function ( o ) {
	o.fn.digitScroller = function ( s ) {
		var r, e                       = o( this ),
			l                          = (s = o.extend( {}, { scrollTo: 0, scrollDuration: 0 }, s ), "" == e.html() ? "0" : e.html()), n = ! 1;
		return this.init               = function () {
			return this.initDom(), this
		}, this.getCurrentValue        = function () {
			var t = 0;
			return e.find( ".__digit_scroller_digit" ).each(
				function () {
						t += o( this ).find( ".__digit_scroller_current_digit" ).html()
				}
			), parseInt( this.removeFrontZeros( t ) )
		}, this.transitionToUp         = function ( t ) {
			e.find( ".__digit_scroller_digit" ).eq( t ).css( "transition", "transform " + s.scrollDuration + "ms ease" ).addClass( "_digit_up" )
		}, this.setNextNumberToCurrent = function () {
			return e.find( ".__digit_scroller_digit" ).each(
				function () {
						o( this ).find( ".__digit_scroller_current_digit" ).html( o( this ).find( ".__digit_scroller_next_digit" ).html() )
				}
			), e.find( ".__digit_scroller_digit" ).css( "transition", "transform 0ms ease 0s" ).removeClass( "_digit_up" ), ! 0
		}, this.updateNextValue        = function ( t ) {
			var r = this, n = 0;
			for ( t = this.addZeros( t, l.length ), i = e.find( ".__digit_scroller_digit" ).length; i < t.length; i ++ ) {
				e.append( this.cunstuctDigit( "0" ) );
			}
			e.find( ".__digit_scroller_digit" ).each(
				function () {
						o( this ).find( ".__digit_scroller_next_digit" ).html() != t.charAt( n ) && (o( this ).find( ".__digit_scroller_next_digit" ).html( t.charAt( n ) ), r.transitionToUp( n, ! 0 )), n ++
				}
			), setTimeout( this.setNextNumberToCurrent, s.scrollDuration - 25 )
		}, this.addZeros               = function ( t, i ) {
			if ( (t = String( t )).length >= i ) {
				return t;
			}
			for ( var r = t.length; r < i; r ++ ) {
				t = "0" + t;
			}
			return t
		}, this.removeFrontZeros       = function ( t ) {
			return t.includes( "-" ) ? t.replace( new RegExp( "^[0]*" ), "" ) : t
		}, this.initDom                = function () {
			if ( e.hasClass( "__digit_scroller_wrap" ) ) {
				return ! 1;
			}
			e.addClass( "__digit_scroller_wrap" ), e.html( "" );
			for ( var t = 0; t < l.length; t ++ ) {
				e.append( this.cunstuctDigit( l[t] ) );
			}
			return ! 0
		}, this.cunstuctDigit          = function ( t ) {
			return o( "<span/>", { class: "__digit_scroller_digit" } ).append(
				o(
					"<span/>",
					{
						class: "__digit_scroller_current_digit",
						html: t
					}
				)
			).append( o( "<span/>", { class: "__digit_scroller_next_digit", html: t } ) )
		}, this.coreScroll             = function () {
			var t = this.getCurrentValue();
			if ( t == s.scrollTo ) {
				return n = ! 1, void clearInterval( r );
			}
			s.scrollTo > t ? t ++ : t --, this.updateNextValue( t )
		}, this.scrollTo               = function ( t ) {
			if ( ! n ) {
				var i = this;
				n     = ! 0, s.scrollTo = t, this.coreScroll(), r = setInterval(
					function () {
							i.coreScroll()
					},
					s.scrollDuration
				)
			}
			return this
		}, this.jumpTo                 = function ( t ) {
			return this.updateNextValue( t ), this
		}, this.scrollDuration         = function ( t ) {
			return s.scrollDuration = t, this
		}, this.init()
	}
}( jQuery );
PKW�1\��C%��class-ns-cloner-ajax.phpnu�[���<?php
/**
 * Cloner AJAX class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Ajax class.
 *
 * Centralizes AJAX hooks in one place and maps those hooks to their corresponding actions and results.
 */
class NS_Cloner_Ajax {

	/**
	 * NS_Cloner_Ajax constructor.
	 */
	public function __construct() {
		add_action( 'wp_ajax_ns_cloner_search_sites', [ $this, 'search_sites' ] );
		add_action( 'wp_ajax_ns_cloner_validate_section', [ $this, 'validate_section' ] );
		add_action( 'wp_ajax_ns_cloner_process_init', [ $this, 'process_init' ] );
		add_action( 'wp_ajax_ns_cloner_get_progress', [ $this, 'get_progress' ] );
		add_action( 'wp_ajax_ns_cloner_process_finish', [ $this, 'process_finish' ] );
		add_action( 'wp_ajax_ns_cloner_process_exit', [ $this, 'process_exit' ] );
		add_action( 'wp_ajax_ns_cloner_delete_schedule', [ $this, 'delete_schedule' ] );
		add_action( 'wp_ajax_ns_cloner_delete_options', [ $this, 'delete_options' ] );
	}

	/**
	 * Output JSON encoded list of blogs matching a posted search term
	 */
	public function search_sites() {
		$this->check_nonce();
		$matching_sites = [];
		$search_term    = ns_cloner_request()->get( 'term' );
		$search_value   = esc_sql( ns_cloner()->db->esc_like( $search_term ) );
		$search_column  = is_subdomain_install() ? 'domain' : 'path';
		$blogs_table    = ns_cloner()->db->blogs;
		$results        = ns_cloner()->db->get_results( "SELECT blog_id FROM $blogs_table WHERE $search_column LIKE '%$search_value%'" );
		foreach ( $results as $result ) {
			$details          = get_blog_details( $result->blog_id );
			$matching_sites[] = [
				'value' => $details->blog_id,
				'label' => "$details->blogname ($details->siteurl)",
			];
		}
		wp_send_json( $matching_sites );
	}

	/**
	 * Pre-validate a single section of the Cloner form
	 */
	public function validate_section() {
		$this->check_nonce();
		$section_id = ns_cloner_request()->get( 'section_id' );
		ns_cloner()->process_manager->validate( $section_id );
		$this->send_response();
	}

	/**
	 * Start the cloning process and associated background processes
	 */
	public function process_init() {
		$this->check_nonce();
		ns_cloner()->process_manager->init();
		$this->send_response();
	}

	/**
	 * Abort / cancel the current cloning process
	 */
	public function process_exit() {
		$this->check_nonce();
		ns_cloner()->process_manager->exit_processes( 'Process canceled by user' );
		// Clear reports so it doesn't pop up the next time that they load the Cloner page.
		ns_cloner()->report->clear_all_reports();
		// Use standard wp function here rather than $this->send_response because if it was aborted
		// manually, it should just end smoothly - don't show any errors in any case.
		wp_send_json_success();
	}

	/**
	 * Check the status / progress of the active process and return progress data
	 */
	public function get_progress() {
		$this->check_nonce();
		// Always try to see if it's complete and we should finish it.
		ns_cloner()->process_manager->maybe_finish();
		// Get results of progress.
		$progress = ns_cloner()->process_manager->get_progress();
		// Send results back to browser.
		if ( 'reported' === $progress['status'] ) {
			// Format report into html if cloning is done.
			$this->send_response( [ 'report' => ns_cloner()->report->get_html() ] );
		} else {
			// Otherwise send progress data to update the UI.
			$this->send_response( $progress );
		}
	}

	/**
	 * Clear an item or all items from the scheduled cloning operations queue
	 */
	public function delete_schedule() {
		$this->check_nonce();
		$index = ns_cloner_request()->get( 'index' );
		ns_cloner()->schedule->delete( $index );
		$this->send_response();
	}

	/**
	 * Clear all plugin options data (settings and current operation)
	 */
	public function delete_options() {
		$this->check_nonce();
		$options_table = is_multisite() ? ns_cloner()->db->sitemeta : ns_cloner()->db->options;
		$options_key   = is_multisite() ? 'meta_key' : 'option_name';
		ns_cloner()->db->query( "DELETE FROM $options_table WHERE $options_key LIKE 'ns_cloner%'" );
		wp_send_json_success();
	}

	/**
	 * Validate nonce AND check user capability
	 */
	private function check_nonce() {
		ns_cloner()->check_permissions();
	}

	/**
	 * Send appropriate json response after checking the process manager for errors.
	 *
	 * @param mixed $success_data Data to pass to wp_send_json_success(), if successful.
	 */
	private function send_response( $success_data = null ) {
		if ( ! empty( ns_cloner()->process_manager->get_errors() ) ) {
			// Clear reports so it doesn't pop up the next time that they load the Cloner page.
			ns_cloner()->report->clear_all_reports();
			wp_send_json_error( ns_cloner()->process_manager->get_errors() );
		} else {
			wp_send_json_success( $success_data );
		}
	}

}
PKW�1\�zb>b>class-ns-cloner-log.phpnu�[���<?php
/**
 * Cloner Logging class.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * NS_Cloner_Log class.
 *
 * Utility class for creating debug logs while running cloning processes.
 */
class NS_Cloner_Log {

	/**
	 * Filepath to summary log
	 *
	 * @var string
	 */
	private $log_file;

	/**
	 * File pointer for current log from fopen
	 *
	 * @var resource
	 */
	private $log_handle;

	/**
	 * Whether 'all' hook has been hooked
	 *
	 * @var bool
	 */
	private $log_all_hooked = false;

	/**
	 * List of keys for verbose/sensitive data that should not be logged
	 *
	 * @var array
	 */
	public $hidden_keys = [];

	/**
	 * Regex for matching log filenames.
	 *
	 * @var string
	 */
	public $log_file_pattern = '/ns-cloner-(\d{8})-(\d{6})(?:-\w{8})?\.html/';

	/**
	 * A random hex color code defined for the current session, in order to differentiate
	 * different requests in the log where there may by multiple async requests weaving
	 * in and out of each other.
	 *
	 * @var string
	 */
	private $random_color;

	/**
	 * NS_Cloner_Log constructor.
	 */
	public function __construct() {
		// Prevent Kint from grouping all data in debug bar at bottom of screen.
		Kint\Renderer\RichRenderer::$folder = false;
	}

	/**
	 * Determine if logging is enabled or not
	 *
	 * @return bool
	 */
	public function is_debug() {
		$debug = (bool) ns_cloner_request()->get( 'debug' );
		return apply_filters( 'ns_cloner_is_debug', $debug );
	}

	/**
	 * Generate a new log filename
	 *
	 * @return string
	 */
	public function generate_file() {
		// Add a hash to the filename, to make it super hard to crawl for logs.
		$hash      = strtolower( wp_generate_password( 8, false ) );
		$timestamp = date( 'Ymd-His' );
		return NS_CLONER_LOG_DIR . "ns-cloner-{$timestamp}-{$hash}.html";
	}

	/**
	 * Set the log file and open append pointer/handle
	 *
	 * @param string $filename Path to log file.
	 */
	public function set_file( $filename ) {
		$this->log_file = apply_filters( 'ns_cloner_log_file', $filename );
		ns_cloner_request()->set( 'log_file', $this->log_file );
		ns_cloner_request()->save();
		// Open file pointer for logging.
		if ( ! empty( $this->log_file ) && is_writeable( dirname( $this->log_file ) ) ) {
			$this->log_handle = fopen( $this->log_file, 'a' );
		}
	}

	/**
	 * Start logging - define the log file path, and add header if needed
	 *
	 * This should be called at the beginning of any process where logging
	 * should be performed, because log() function calls made before start()
	 * will be ignored. This enables easy control of when logging should happen
	 * and shouldn't - i.e. not causing logging during validation, other misc
	 * ajax requests, etc.
	 */
	public function start() {
		// Make sure debug/logging is on.
		if ( ! $this->is_debug() ) {
			return;
		}
		// Set up log if needed (don't bother if start() was already called in this session).
		if ( ! is_resource( $this->log_handle ) ) {
			// Define the log file.
			if ( ns_cloner_request()->get( 'log_file' ) ) {
				// Set log file to the saved request value, if present.
				// (Enables using the same log file between background processes).
				$this->set_file( ns_cloner_request()->get( 'log_file' ) );
			} else {
				// Define the default log file if it's not yet saved.
				$this->set_file( $this->generate_file() );
				$this->header();
			}
			// Set a random hex color for this session's log messages.
			$this->random_color = '#';
			foreach ( [ 'r', 'b', 'g' ] as $col ) {
				$hex    = dechex( wp_rand( 0, 255 ) );
				$padded = str_pad( $hex, 2, '0', STR_PAD_LEFT );
				// Concatenate each color.
				$this->random_color .= $padded;
			}
			// Define keys of sensitive data that should not be included in log.
			$this->hidden_keys = apply_filters( 'ns_cloner_hidden_keys', [] );
		}
		// Check if log needs split due to size (larger than 5MB) for performance.
		if ( is_resource( $this->log_handle ) && filesize( $this->log_file ) > 5 * 1024 * 1024 ) {
			$old = $this->log_file;
			$new = $this->generate_file();
			$this->log( 'CONTINUING IN: <a href="' . $this->get_url( $new ) . '"></a>' . $new . '</a>' );
			$this->end( false );
			$this->set_file( $new );
			$this->header();
			$this->log( 'CONTINUING FROM: <a href="' . $this->get_url( $old ) . '">' . $old . '</a>' );
		}
		// Hook to WP 'all' hook to automatically log all hooks that start with ns_cloner.
		if ( ! $this->log_all_hooked ) {
			add_action( 'all', [ $this, 'log_hook' ] );
			$this->log_all_hooked = true;
		}
	}

	/**
	 * Checks for a newer log file and switches to that one if so.
	 *
	 * Helpful for running in the middle of long background processes so
	 * logs don't way exceed the max log size.
	 */
	public function refresh() {
		$current_log = ns_cloner_request()->refresh()->get( 'log_file' );
		if ( ! empty( $current_log ) && $current_log !== $this->log_file ) {
			$this->end( false );
			$this->log_file   = $current_log;
			$this->log_handle = fopen( $this->log_file, 'a' );
		}
	}

	/**
	 * End logging - optionally add footer.
	 *
	 * Footer param is available because it will mess up formatting if we close a log
	 * that another background process is still writing to - if that's a possibility,
	 * don't worry about it and let the browser autoclose the tags.
	 *
	 * @param bool $do_footer Whether to output footer / closing tags.
	 */
	public function end( $do_footer = true ) {
		if ( $do_footer ) {
			$this->footer();
		}
		if ( is_resource( $this->log_handle ) ) {
			fclose( $this->log_handle );
		}
	}

	/**
	 * Run after a wpdb function call to check for and log any sql errors
	 *
	 * Also, log all queries in when additional debugging is on.
	 *
	 * @return void
	 */
	public function handle_any_db_errors() {
		if ( ! empty( ns_cloner()->db->last_error ) ) {
			// If there was an error, log it and the query it was for.
			$this->log( 'SQL ERROR: ' . ns_cloner()->db->last_error );
			$this->log( 'FOR QUERY: ' . ns_cloner()->db->last_query );
			ns_cloner()->process_manager->exit_processes( ns_cloner()->db->last_error );
		}
	}

	/*
	______________________________________
	|
	|  Log Outputs
	|_____________________________________
	*/

	/**
	 * Write data to log file
	 *
	 * This fails silently if the log file is not writable, so it's up to the caller to check
	 * for a writable log file and alert the user if there is a problem. Note that this accepts
	 * an array for the message. This is useful for including a string label to describe a
	 * variable (1st array element) followed by the variable itself for debugging (2nd el).
	 *
	 * @param mixed $message String or data to log.
	 * @param bool  $raw Whether to include timestamp and tr/td tags.
	 * @return bool
	 */
	public function log( $message, $raw = false ) {
		// Remove this temporarily to prevent infinite loop.
		remove_action( 'all', [ $this, 'log_hook' ] );

		// If debug is off or the log directory isn't writable, don't log.
		if ( ! is_resource( $this->log_handle ) ) {
			return false;
		}

		// Shortcut if raw - don't bother formatting it.
		if ( $raw ) {
			fwrite( $this->log_handle, $message );
			return true;
		}

		// Calculate current time into process and set up message.
		$time      = number_format( ns_cloner()->report->get_elapsed_time(), 4 );
		$formatted = '';
		foreach ( (array) $message as $message_part ) {
			if ( is_string( $message_part ) ) {
				// Auto convert asterisks to bold tags.
				$text       = preg_replace( '/(?<=\s)\*(.+?)\*(?=\s|:|$)/', ' <b>$1</b>', $message_part );
				$formatted .= "<span>$text</span>";
			} else {
				// Remove any sensitive data.
				if ( is_array( $message_part ) ) {
					foreach ( $this->hidden_keys as $key ) {
						if ( isset( $message_part[ $key ] ) ) {
							$message_part[ $key ] = '[redacted from log]';
						}
					}
				}
				// Use Kint formatting for non-strings, except for during WP CLI because it goes crazy.
				ob_start();
				if ( defined( 'WP_CLI' ) && WP_CLI ) {
					echo '<pre class="no-kint">';
					var_dump( $message_part );
					echo '</pre>';
				} else {
					Kint::dump( $message_part );
				}
				$formatted .= ob_get_clean();
			}
		}

		// Log it!
		$time_cell    = "<td>{$time}s</td>";
		$color_cell   = "<td style='color:{$this->random_color}'>&#11044;</td>";
		$message_cell = "<td>{$formatted}</td>";
		$message_row  = "<tr>{$time_cell}{$color_cell}{$message_cell}</tr>";
		fwrite( $this->log_handle, $message_row );
		add_action( 'all', [ $this, 'log_hook' ] );
		return true;

	}

	/**
	 * Add separator line to log
	 * "break" name of the method class is not compatible with php 5.6
	 */
	public function log_break() {
		$this->log( '-----------------------------------------------------------------------------------------------------------' );
	}

	/**
	 * Called on 'all' hook in order to catch and record any hook starting with ns_cloner
	 */
	public function log_hook() {
		global $wp_actions;
		$args = func_get_args();
		$hook = $args[0];
		// Skip if not a cloner hook, if the logger is not loaded yet, or if no hooks are registered.
		if ( 0 !== strpos( $hook, 'ns_cloner_' ) ) {
			return;
		}
		// Skip if the hook has been marked as private (not logged).
		if ( in_array( $hook, ns_cloner()->hidden_hooks ) ) {
			return;
		}
		// Log as hook or action.
		$is_action = isset( $wp_actions[ $hook ] );
		if ( $is_action ) {
			$this->log( "DOING ACTION: {$hook}" );
		} elseif ( defined ( 'WP_NS_CLONER_DEBUG' ) && WP_NS_CLONER_DEBUG ) {
			// Filters are much more verbose an can contain more sensitive info in args so skip by default.
			$this->log( [ "APPLYING FILTER: {$hook} with args:", array_slice( $args, 1 ) ] );
		}
	}

	/**
	 * Open the HTML for a detail log and auto-log environment info
	 */
	public function header() {

		// Begin html document.
		$open = '
		<html>
			<head>
				<style>
					table{ width:100%; border: solid 1px #ddd; }
					td{ padding: 0 .9em; border-bottom: solid 1px #ddd; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; }
					td:first-child{ background:#ddd; font:bold .9em monospace; text-align:center; color:#555; width:3em; }
					td span { float:left; display:inline-block; padding: 4px 6px 4px 0; }
					.no-kint { clear: left;  border: solid 1px #ddd; padding: 10px 20px;margin-bottom: 10px;background: #eee; }
					.kint{ display:inline-block; margin: 0 0 0 6px !important; }
					.kint footer{ display:none; }
				</style>
			</head>
			<body>
				<table cellspacing="0" cellpadding="4" width="100%">';
		$this->log( $open, true );

		global $wp_version, $wp_db_version, $required_php_version, $required_mysql_version;
		$this->log( 'ENVIRONMENT DIAGNOSTICS:' );
		$this->log( 'PHP Version Required:   ' . $this->b( $required_php_version ) );
		$this->log( 'PHP Version Current:    ' . $this->b( phpversion() ) );
		$this->log( 'MySQL Version Required: ' . $this->b( $required_mysql_version ) );
		$this->log( 'MySQL Version Current:  ' . $this->b( ns_get_sql_variable( 'version' ) ) );
		$this->log( 'WP Version:             ' . $this->b( $wp_version ) );
		$this->log( 'WP DB Version:          ' . $this->b( $wp_db_version ) );
		$this->log( 'WP Memory Limit:        ' . $this->b( WP_MEMORY_LIMIT ) );
		$this->log( 'WP Debug Mode:          ' . $this->b( WP_DEBUG ) );
		$this->log( 'WP Multisite:           ' . $this->b( MULTISITE ) );
		$this->log( 'WP Subdomain Install:   ' . $this->b( defined( 'SUBDOMAIN_INSTALL ' ) ? SUBDOMAIN_INSTALL : false ) );
		$this->log( 'PHP Post Max Size:      ' . $this->b( ini_get( 'post_max_size' ) ) );
		$this->log( 'PHP Upload Max Size:    ' . $this->b( ini_get( 'upload_max_size' ) ) );
		$this->log( 'PHP Memory Limit:       ' . $this->b( ini_get( 'memory_limit' ) ) );
		$this->log( 'PHP Max Input Vars:     ' . $this->b( ini_get( 'max_input_vars' ) ) );
		$this->log( 'PHP Max Execution Time: ' . $this->b( ini_get( 'max_execution_time' ) ) );

		$this->log_break();

		$this->log( 'PLUGIN DIAGNOSTICS:' );
		foreach ( get_plugins() as $plugin_file => $data ) {
			$network = true === $data['Network'] ? ' Network Enabled' : '';
			$this->log( $data['Name'] . ' ' . $data['Version'] . ' by ' . $data['Author'] . ' ' . $network );
		}

		$this->log_break();

		$this->log( 'REQUEST DIAGNOSTICS:' );
		$this->log( [ 'RAW REQUEST:', $_POST ] );
		$this->log( [ 'FILTERED REQUEST:', ns_cloner_request()->get_request() ] );

		$this->log_break();

		$this->log( 'START TIME:     ' . ns_cloner()->report->get_start_time() );
		$this->log( 'CLONER VERSION: ' . ns_cloner()->version );
		$this->log( 'ACTION:         ' . ns_cloner_request()->get( 'action' ) );
		$this->log( 'CLONING MODE:   ' . ns_cloner_request()->get( 'clone_mode' ) );

		$this->log_break();
	}

	/**
	 * Close the HTML of the log file - call when all logging is complete
	 */
	public function footer() {
		$close = '</table></body></html>';
		$this->log( $close, true );
	}

	/**
	 * Wrap a string in bold tags
	 *
	 * @param string $string Text to wrap.
	 * @return string
	 */
	public function b( $string ) {
		return "<strong> $string </strong>";
	}

	/*
	______________________________________
	|
	|  Management / UI methods
	|_____________________________________
	*/

	/**
	 * Get the URL for the current log file
	 *
	 * @param string|null $file Filename, defaults to current log file.
	 * @return string
	 */
	public function get_url( $file = null ) {
		$log_file    = $file ?: $this->log_file;
		$log_dir_url = NS_CLONER_V4_PLUGIN_URL . basename( NS_CLONER_LOG_DIR );
		return $log_dir_url . '/' . basename( $log_file );
	}

	/**
	 * Retrieves an array of urls for detail log files from X number of past days
	 *
	 * @return array
	 */
	public function get_logs() {
		$logs = [];
		if ( is_dir( NS_CLONER_LOG_DIR ) ) {
			// Reverse to put newest first.
			foreach ( scandir( NS_CLONER_LOG_DIR ) as $file ) {
				// Only include matching html files, and parse timestamp from them.
				if ( preg_match( $this->log_file_pattern, $file, $date_matches ) ) {
					$timestamp = strtotime( "$date_matches[1] $date_matches[2]" );
					// Add data for display in logs table.
					$logs[] = [
						'file' => $file,
						'date' => $timestamp,
						'url'  => $this->get_url( $file ),
						'size' => size_format( filesize( NS_CLONER_LOG_DIR . "/$file" ) ),
					];
				}
			}
		}
		krsort( $logs );
		return $logs;
	}

	/**
	 * Retrieves an array of urls for detail log files from X number of past days
	 *
	 * @param int $days Number of days to get logs from.
	 * @return array
	 */
	public function get_recent_logs( $days = 7 ) {
		$recent_logs = array();
		if ( is_dir( NS_CLONER_LOG_DIR ) ) {
			foreach ( scandir( NS_CLONER_LOG_DIR ) as $file ) {
				if ( preg_match( $this->log_file_pattern, $file, $date_matches ) ) {
					// Check if it's in the requested time period.
					$seconds_since_this_log = strtotime( 'now' ) - strtotime( "$date_matches[1] $date_matches[2]" );
					if ( $seconds_since_this_log <= $days * DAY_IN_SECONDS ) {
						$recent_logs[] = NS_CLONER_LOG_DIR . $file;
					}
				}
			}
		}
		return $recent_logs;
	}

	/**
	 * Delete all log files from the logs directory
	 */
	public function delete_logs() {
		if ( is_dir( NS_CLONER_LOG_DIR ) ) {
			foreach ( scandir( NS_CLONER_LOG_DIR ) as $file ) {
				// Only include html log files.
				if ( ! preg_match( '/html$/', $file ) ) {
					continue;
				}
				unlink( NS_CLONER_LOG_DIR . "$file" );
			}
		}
	}

}
PKW�1\9���s�s
ns-cloner.phpnu�[���<?php
/**
 * Plugin Name: NS Cloner - Site Copier
 * Plugin URI: https://neversettle.it
 * Description: The amazing NS Cloner creates a new site as an exact clone / duplicate / copy of an existing site with theme and all plugins and settings intact in just a few steps. Check out NS Cloner Pro for additional powerful add-ons and features!
 * Version: 4.1.9.3
 * Author: Never Settle
 * Author URI: https://neversettle.it
 * Requires at least: 4.0.0
 * Tested up to: 5.8
 * License: GPLv2 or later
 *
 * Text Domain: ns-cloner-site-copier
 * Domain Path: /languages
 *
 * @package   NeverSettle\NS-Cloner
 * @author    Never Settle
 * @copyright Copyright (c) 2012-2018, Never Settle (dev@neversettle.it)
 * @license   http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

// Define plugin constants.
define( 'NS_CLONER_PRO_PLUGIN', 'ns-cloner-pro-v4/ns-cloner-pro.php' );
define( 'NS_CLONER_PRO_URL', 'https://neversettle.it/buy/wordpress-plugins/ns-cloner-pro/?utm_campaign=in+plugin+referral&utm_source=ns-cloner&utm_medium=plugin&utm_content=pro+features' );
define( 'NS_CLONER_V4_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'NS_CLONER_V4_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
define( 'NS_CLONER_LOG_DIR', NS_CLONER_V4_PLUGIN_DIR . 'logs/' );

// Load external libraries.
require_once NS_CLONER_V4_PLUGIN_DIR . 'vendor/autoload.php';

// Load function files.
require_once NS_CLONER_V4_PLUGIN_DIR . 'ns-utils.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'ns-compatibility.php';

// Load cloner core classes.
require_once NS_CLONER_V4_PLUGIN_DIR . 'class-ns-cloner-process-manager.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'class-ns-cloner-schedule.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'class-ns-cloner-ajax.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'class-ns-cloner-report.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'class-ns-cloner-log.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'class-ns-cloner-request.php';

// Load extendable base classes.
require_once NS_CLONER_V4_PLUGIN_DIR . 'abstracts/class-ns-cloner-addon.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'abstracts/class-ns-cloner-section.php';
require_once NS_CLONER_V4_PLUGIN_DIR . 'abstracts/class-ns-cloner-process.php';

//Load cloner features classes.
require_once NS_CLONER_V4_PLUGIN_DIR . 'features/class-ns-cloner-analytics.php';

/**
 * Main core of NS_Cloner plugin.
 *
 * This class is an umbrella for all cloner components - managing instances of each of the other utility classes,
 * addons, sections, background processes, etc. and letting them refer to each other. It also handles all the basic
 * admin hooks for menus, assets, notices, templates, etc.
 */
final class NS_Cloner {

	/**
	 * Version
	 *
	 * @var string
	 */
	public $version = '4.1.9.3';

	/**
	 * Menu Slug
	 *
	 * @var string
	 */
	public $menu_slug = 'ns-cloner';

	/**
	 * Capability required to access plugin on network admin
	 *
	 * @var string
	 */
	public $capability = '';

	/**
	 * List of notices to show in admin notice area
	 *
	 * @var array
	 */
	public $admin_notices = [];

	/**
	 * Addons
	 *
	 * @var array
	 */
	public $addons = [];

	/**
	 * Clone modes
	 *
	 * @var array
	 */
	public $clone_modes = [];

	/**
	 * Section objects
	 *
	 * @var array
	 */
	public $sections = [];

	/**
	 * Background process objects
	 *
	 * @var array
	 */
	public $processes = [];

	/**
	 * Instance of NS_Cloner_Process_Manager
	 *
	 * @var NS_Cloner_Process_Manager
	 */
	public $process_manager;

	/**
	 * Instance of NS_Cloner_Schedule
	 *
	 * @var NS_Cloner_Schedule
	 */
	public $schedule;

	/**
	 * Instance of NS_Cloner_Ajax
	 *
	 * @var NS_Cloner_Ajax
	 */
	public $ajax;

	/**
	 * Instance of NS_Cloner_Report
	 *
	 * @var NS_Cloner_Report
	 */
	public $report;

	/**
	 * Instance of NS_Cloner_Log
	 *
	 * @var NS_Cloner_Log object
	 */
	public $log;

	/**
	 * Shortcut reference to access $wpdb without declaring a global in every method
	 *
	 * @var wpdb object
	 */
	public $db;

	/**
	 * Prefix to add to temporary tables by modes that require them
	 *
	 * @var string
	 */
	public $temp_prefix = '_mig_';

	/**
	 * List of hooks that should not be logged, since by default all hooks beginning with ns_cloner are
	 *
	 * @var array
	 */
	public $hidden_hooks = [];

	/**
	 * Singleton instance of NS_Cloner
	 *
	 * @var NS_Cloner
	 */
	private static $instance = null;

	/**
	 * Get singleton instance of NS_Cloner.
	 *
	 * @return NS_Cloner
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	/**
	 * NS_Cloner constructor.
	 */
	private function __construct() {
		// Set instance to prevent infinite loop.
		self::$instance = $this;

		// Create $wpdb access shortcut to save declaring global every place it's used.
		global $wpdb;
		$this->db = $wpdb;

		// Set required capability for cloner pages and operations.
		$default_capability = is_multisite() ? 'manage_sites' : 'manage_options';
		$this->capability   = apply_filters( 'ns_cloner_capability', $default_capability );

		// Add css for admin.
		add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue' ] );

		// Add admin menus.
		add_action( 'network_admin_menu', [ $this, 'admin_menu_pages' ] );
		add_action( 'admin_menu', [ $this, 'admin_menu_pages' ] );
		add_action( 'admin_bar_menu', [ $this, 'admin_bar_menu' ], 21 );

		// Add quick-clone link.
		add_action( 'manage_sites_action_links', [ $this, 'admin_quick_clone_link' ], 10, 2 );

		// Install custom tables after cloner init.
		add_action( 'ns_cloner_init', [ $this, 'install_tables' ] );

		// Only load rest of plugin if it could be needed (not on frontend).
		$should_load = is_admin() || (wp_doing_ajax() && is_user_logged_in()) || ( defined( 'WP_CLI' ) && WP_CLI );
		if ( apply_filters( 'ns_cloner_should_load', $should_load ) ) {
			// Bootstrap full cloner and addons once translation/localization is ready.
			add_action( 'plugins_loaded', [ $this, 'init' ] );
		}
	}

	/**
	 * Initialize Cloner modes, sections, UI, etc.
	 *
	 * The difference between this and the constructor is that anything that needs to use localization has to go here.
	 */
	public function init() {
		load_plugin_textdomain(
			'ns-cloner-site-copier',
			false,
			NS_CLONER_V4_PLUGIN_DIR . 'languages/'
		);

		// Setup class instances.
		$this->process_manager = new NS_Cloner_Process_Manager();
		$this->schedule        = new NS_Cloner_Schedule();
		$this->ajax            = new NS_Cloner_Ajax();
		$this->report          = new NS_Cloner_Report();
		$this->log             = new NS_Cloner_Log();

		// This doesn't need a reference since it's a singleton,
		// but it should be initialized here so it's vars will get set up.
		ns_cloner_request();

		/*
		 * Use this action to load addons, or any other files with need a guarantee that the cloner core classes will
		 * be present, but before any other cloner-specific hooks are run, like ns_cloner_core_modes below.
		 */
		do_action( 'ns_cloner_before_init' );

		// Define the standard, default clone mode.
		$core_modes = apply_filters(
			'ns_cloner_core_modes',
			[
				'core' => [
					'title'       => __( 'Standard Clone', 'ns-cloner-site-copier' ),
					'button_text' => __( 'Clone', 'ns-cloner-site-copier' ),
					'description' => __( 'Take an existing site and create a brand new copy of it at another url.', 'ns-cloner-site-copier' ),
					'steps'       => [
						[ $this->process_manager, 'create_site' ],
						[ $this->process_manager, 'copy_tables' ],
						[ $this->process_manager, 'copy_files' ],
					],
					'report'      => function() {
						// Success message.
						ns_cloner()->report->add_report( '_message', __( 'Site cloned successfully!', 'ns-cloner-site-copier' ) );
						// Source site.
						$source_id = ns_cloner_request()->get( 'source_id' );
						ns_cloner()->report->add_report( __( 'Source Site', 'ns-cloner-site-copier' ), ns_site_link( $source_id ) );
						// Target site.
						$target_id = ns_cloner_request()->get( 'target_id' );
						ns_cloner()->report->add_report( __( 'Target Site', 'ns-cloner-site-copier' ), ns_site_link( $target_id ) );
					},
				],
			]
		);
		foreach ( $core_modes as $id => $details ) {
			$this->register_mode( $id, $details );
		}

		// Register core sections.
		$core_sections = apply_filters(
			'ns_cloner_core_sections',
			[
				'select_source',
				'create_target',
				'advertise_pro',
				'additional_settings',
			]
		);
		foreach ( $core_sections as $core_section ) {
			$this->register_section( $core_section );
		}

		// Register background processes.
		$processes = apply_filters(
			'ns_cloner_core_processes',
			[
				'tables',
				'rows',
				'files',
			]
		);
		foreach ( $processes as $process ) {
			$this->register_process( $process );
		}

		/*
		 * This action automatically triggers the init() function for each registered addon.
		 */
		do_action( 'ns_cloner_init' );

	}

	/*
	______________________________________
	|
	|  Admin Setup & Hooks
	|_____________________________________
	*/

	/**
	 * Load admin assets.
	 *
	 * Runs on admin_enqueue_scripts hook.
	 */
	public function admin_enqueue() {
		// Only load cloner assets when on the main cloner page or a subpage of it.
		if ( false !== strpos( get_current_screen()->id, 'ns-cloner' ) ) {
			// Add libs / dependent assets.
			wp_register_script( 'chosen', NS_CLONER_V4_PLUGIN_URL . 'vendor/harvesthq/chosen/chosen.jquery.min.js', [ 'jquery' ], '1.8.7', true );
			wp_register_style( 'chosen', NS_CLONER_V4_PLUGIN_URL . 'vendor/harvesthq/chosen/chosen.min.css', [], '1.8.7' );
			// Add cloner assets.
			wp_enqueue_style( 'ns-cloner', NS_CLONER_V4_PLUGIN_URL . 'css/ns-cloner.css', [ 'chosen' ], $this->version );
			wp_enqueue_script( 'ns-cloner', NS_CLONER_V4_PLUGIN_URL . 'js/ns-cloner.js', [ 'chosen' ], $this->version, true );
			wp_localize_script(
				'ns-cloner',
				'ns_cloner',
				array(
					'nonce'       => wp_create_nonce( 'ns_cloner' ),
					'ajaxurl'     => admin_url( '/admin-ajax.php' ),
					'loading_img' => NS_CLONER_V4_PLUGIN_URL . 'images/spinner.gif',
					'in_progress' => $this->process_manager->is_in_progress( true ),
				)
			);
			// Run action so addons can easily enqueue scripts only on cloner pages without having to use conditionals.
			do_action( 'ns_cloner_enqueue_scripts' );
		}
	}

	/**
	 * Register admin pages.
	 *
	 * Runs on admin_menu_pages hook.
	 */
	public function admin_menu_pages() {
		add_menu_page(
			__( 'NS Cloner', 'ns-cloner-site-copier' ),
			__( 'NS Cloner', 'ns-cloner-site-copier' ),
			$this->capability,
			$this->menu_slug,
			function() {
				ns_cloner()->render( 'main' );
			},
			plugin_dir_url( __FILE__ ) . 'images/cloner-admin-icon.png',
			is_network_admin() ? 40 : 100
		);
		// Enable addons to register submenus.
		$submenu = apply_filters( 'ns_cloner_submenu', [] );
		// Add logs submenu at bottom.
		$submenu['ns-cloner-logs'] = [
			$this->menu_slug,
			__( 'Logs / Status', 'ns-cloner-site-copier' ),
			__( 'Logs / Status', 'ns-cloner-site-copier' ),
			$this->capability,
			'ns-cloner-logs',
			function() {
				ns_cloner()->render( 'logs' );
			},
		];
		// Register each submenu item with WP.
		foreach ( apply_filters( 'ns_cloner_submenu', $submenu ) as $item ) {
			call_user_func_array( 'add_submenu_page', $item );
		}
	}

	/**
	 * Add link to admin bar network dropdown for Cloner
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar object.
	 */
	public function admin_bar_menu( $wp_admin_bar ) {
		if ( is_multisite() && current_user_can( 'manage_network' ) ) {
			$wp_admin_bar->add_menu(
				[
					'id'     => 'ns-cloner',
					'title'  => 'NS Cloner',
					'href'   => network_admin_url( 'admin.php?page=' . $this->menu_slug ),
					'parent' => 'network-admin',
				]
			);
		}
	}

	/**
	 * Add shortcut link to clone a site in the quick edit actions on the Network > Sites page.
	 *
	 * @param array $links Array of action links.
	 * @param int   $blog_id Blog ID of current row.
	 * @return array
	 */
	public function admin_quick_clone_link( $links, $blog_id ) {
		$clone_link     = 'admin.php?' . http_build_query(
			[
				'page'        => $this->menu_slug,
				'source'      => $blog_id,
				'clone_nonce' => wp_create_nonce( 'ns_cloner' ),
			]
		);
		$links['clone'] = '<span class="clone"><a href="' . network_admin_url( $clone_link ) . '" target="_blank">Clone</a></span>';
		return $links;
	}

	/*
	______________________________________
	|
	|  Utility Functions
	|_____________________________________
	*/

	/**
	 * Include template.
	 *
	 * @param string $template Name of template (ns-template-{$template}.php).
	 * @param string $plugin_dir Path of directory containing the template.
	 */
	public static function render( $template, $plugin_dir = NS_CLONER_V4_PLUGIN_DIR ) {
		$template_file = apply_filters( 'ns_cloner_template_file', 'ns-template-' . $template . '.php', $template );
		$template_dir  = apply_filters( 'ns_cloner_template_dir', $plugin_dir . '/templates/', $template );
		do_action( "ns_cloner_before_render_{$template}", $plugin_dir );
		include_once $template_dir . $template_file;
		do_action( "ns_cloner_after_render_{$template}", $plugin_dir );
	}

	/**
	 * Retrieve list of database tables for a specific site.
	 *
	 * @param int  $site_id Database prefix of the site.
	 * @param bool $exclude_global Exclude global tables from the list (only relevant for main site).
	 * @return array
	 */
	public function get_site_tables( $site_id, $exclude_global = true ) {
		$wp_global_tables  = $this->db->tables( 'global', false, $site_id );
		$all_global_tables = apply_filters( 'ns_cloner_global_tables', $wp_global_tables );
		$global_pattern    = "/^{$this->db->base_prefix}(" . implode( '|', $all_global_tables ) . ')$/';
		$subsite_pattern   = "/^{$this->db->base_prefix}\d+_/";
		$temp_pattern      = '/^' . ns_cloner()->temp_prefix . '/';
		$has_base_prefix   = $this->db->get_blog_prefix( $site_id ) === $this->db->base_prefix;

		if ( empty( $site_id ) || ! is_multisite() ) {
			// All tables - don't filter by any id.
			$prefix = $this->db->esc_like( $this->db->base_prefix );
			$tables = $this->db->get_col( "SHOW TABLES LIKE '{$prefix}%'" );
		} elseif ( ! is_main_site( $site_id ) ) {
			// Sub site tables - a prefix like wp_2_ so we can get all matches without having to filter out global tables.
			$prefix = $this->db->esc_like( $this->db->get_blog_prefix( $site_id ) );
			$tables = $this->db->get_col( "SHOW TABLES LIKE '{$prefix}%'" );
			// Handle special case of a site that USED to be a main site, but then the main site got changed.
			// That means that it will have the base prefix and match everything, so we have to exclude tables
			// from other subsites, from temp tables, and from the global table list.
			if ( $has_base_prefix ) {
				$tables = array_filter(
					$tables,
					function( $table ) use ( $global_pattern, $subsite_pattern, $temp_pattern ) {
						return ! preg_match( $global_pattern, $table )
							&& ! preg_match( $subsite_pattern, $table )
							&& ! preg_match( $temp_pattern, $table );
					}
				);
			}
		} else {
			// Root site tables - a main prefix like wp_ requires that we filter out both global and other subsites' tables.
			$prefix     = $this->db->esc_like( $this->db->base_prefix );
			$all_tables = $this->db->get_col( "SHOW TABLES LIKE '{$prefix}%'" );
			$tables     = array_filter(
				$all_tables,
				function( $table ) use ( $global_pattern, $subsite_pattern, $temp_pattern, $site_id, $exclude_global ) {
					if ( $this->db->base_prefix !== $this->db->get_blog_prefix( $site_id ) ) {
						// For sites where main ID != 1 (example: base = wp_, main site prefix = wp_2_),
						// anything that matches the prefix (example: wp_2_) counts as a site table.
						return preg_match( '/^' . $this->db->get_blog_prefix( $site_id ) . '/', $table )
							|| ( preg_match( $global_pattern, $table ) && ! $exclude_global );
					} else {
						// For normal WP sites where base prefix and main site prefix are the same (example: wp_ for both),
						// we need to exclude all the other temp tables, subsite tables like wp_3_, and possibly global
						// tables (depending on the $exclude_global parameter) that would get otherwise be included.
						return ! preg_match( $subsite_pattern, $table )
							&& ! preg_match( $temp_pattern, $table )
							&& ( ! preg_match( $global_pattern, $table ) || ! $exclude_global );
					}
				}
			);
		}
		// Apply optional filter and return.
		return apply_filters( 'ns_cloner_site_tables', $tables, $site_id );
	}

	/**
	 * Check whether the current user can run a clone operation and whether nonce is valid, then optionally die or return false.
	 *
	 * @param bool $die Whether to die on failure.
	 * @return bool
	 */
	public function check_permissions( $die = true ) {
		$current_action      = ns_cloner_request()->get( 'action', 'default' );
		$required_capability = apply_filters( "ns_cloner_capability_{$current_action}", $this->capability );
		// Check that current user has sufficient permissions.
		if ( ! current_user_can( $required_capability ) ) {
			if ( $die ) {
				if ( wp_doing_ajax() ) {
					wp_die( -1, 403 );
				} else {
					wp_die( esc_html( __( 'You don\'t have sufficient permissions for this action.', 'ns-cloner-site-copier' ) ) );
				}
			} else {
				return false;
			}
		}
		// Check that there is a valid nonce present.
		$valid_nonce = check_ajax_referer( 'ns_cloner', 'clone_nonce', $die );
		if ( ! $valid_nonce ) {
			return false;
		}
		return true;
	}

	/*
	______________________________________
	|
	|  Addon Registration
	|_____________________________________
	*/

	/**
	 * Addons call this to load and register themselves with the Cloner.
	 *
	 * This has no direct impact on functionality, but just makes it easier to refer to the
	 * addon instance elsewhere without re-instantiating or using a global or singleton.
	 *
	 * @param string $id Lowercase, underscore separated unique part of addon classname.
	 *                   Example: 'some_thing' for the class NS_Cloner_Addon_Some_Thing.
	 * @param string $dir Grandparent path (containing /addons/{file}.php).
	 * @return bool
	 */
	public function register_addon( $id, $dir = NS_CLONER_V4_PLUGIN_DIR ) {
		$filename  = str_replace( '_', '-', strtolower( "class-ns-cloner-addon-{$id}.php" ) );
		$path      = apply_filters( 'ns_cloner_addon_path', untrailingslashit( $dir ) . "/addons/{$filename}", $id );
		$suffix    = str_replace( ' ', '_', ucwords( str_replace( '-', ' ', $id ) ) );
		$classname = "NS_Cloner_Addon_{$suffix}";
		include_once $path;
		if ( class_exists( $classname ) ) {
			$this->addons[ $id ] = new $classname();
			return true;
		}
		return false;
	}

	/**
	 * Get the instance of an addon class by its id
	 *
	 * @param string $id Lowercase, underscore separated unique part of addon classname.
	 *                   Example: 'some_thing' for the class NS_Cloner_Addon_Some_Thing.
	 * @return object|bool
	 */
	public function get_addon( $id ) {
		return isset( $this->addons[ $id ] ) ? $this->addons[ $id ] : false;
	}

	/*
	______________________________________
	|
	|  Background Process Registration
	|_____________________________________
	*/

	/**
	 * Includes and registers a background process with the cloner.
	 *
	 * Similar to register_addon, this has no functional impact other than providing an
	 * easy way to reference a background process instance.
	 *
	 * @param string $id Lowercase, underscore separated unique part of process classname.
	 *                   Example: 'some_thing' for the class NS_Cloner_Some_Thing_Process.
	 * @param string $dir Grandparent path (containing /processes/{file}.php).
	 * @return bool
	 */
	public function register_process( $id, $dir = NS_CLONER_V4_PLUGIN_DIR ) {
		$filename  = str_replace( '_', '-', strtolower( "class-ns-cloner-{$id}-process.php" ) );
		$path      = apply_filters( 'ns_cloner_process_path', trailingslashit( $dir ) . "processes/{$filename}", $id );
		$suffix    = implode(
			'_',
			array_map(
				function ( $word ) {
					return ucfirst( $word );
				},
				explode( '_', $id )
			)
		);
		$classname = "NS_Cloner_{$suffix}_Process";
		include_once $path;
		if ( class_exists( $classname ) ) {
			$this->processes[ $id ] = new $classname();
			return true;
		}
		return false;
	}

	/**
	 * Get the instance of an background process class by its id.
	 *
	 * @param string $id Lowercase, underscore separated unique part of process classname.
	 *                   Example: 'some_thing' for the class NS_Cloner_Some_Thing_Process.
	 * @return NS_Cloner_Process
	 */
	public function get_process( $id ) {
		return isset( $this->processes[ $id ] ) ? $this->processes[ $id ] : new $id();
	}

	/*
	______________________________________
	|
	|  Section Registration
	|_____________________________________
	*/

	/**
	 * Addons (or core) call this to include and register new section classes.
	 *
	 * Sections may in turn add ui, validation, processing (new steps or hooking to actions in existing steps), reporting, etc.
	 * Addons can also use the ns_cloner_section_pat filter to override an existing section.
	 *
	 * @param string $id The $id property of the section (must match classname and filename).
	 *                   Example: 'some_thing' for the class NS_Cloner_Section_Some_Thing.
	 * @param string $dir Grandparent path (containing /sections/{file}.php).
	 * @return bool
	 */
	public function register_section( $id, $dir = NS_CLONER_V4_PLUGIN_DIR ) {
		$filename  = str_replace( '_', '-', strtolower( "class-ns-cloner-section-{$id}.php" ) );
		$path      = apply_filters( 'ns_cloner_section_path', trailingslashit( $dir ) . "sections/{$filename}", $id );
		$suffix    = str_replace( ' ', '_', ucwords( str_replace( '-', ' ', $id ) ) );
		$classname = "NS_Cloner_Section_{$suffix}";
		include_once $path;
		if ( class_exists( $classname ) ) {
			$this->sections[ $id ] = new $classname();
			return true;
		}
		return false;
	}

	/**
	 * Get the instance of an section class by its id.
	 *
	 * @param string $id The $id property of the section (must match classname and filename).
	 *                   Example: 'some_thing' for the class NS_Cloner_Section_Some_Thing.
	 * @return object|bool
	 */
	public function get_section( $id ) {
		return isset( $this->sections[ $id ] ) ? $this->sections[ $id ] : false;
	}

	/*
	______________________________________
	|
	|  Cloning Mode Registration
	|_____________________________________
	*/

	/**
	 * Addons call this to register a new mode in the dropdown (or override/replace an existing one).
	 *
	 * Note that details are provided as an array but stored (and thus later returned) as an object
	 * for ease of reference. This also fills in defaults so the mode properties can be safely referred
	 * to elsewhere without having to check isset().
	 *
	 * @param string $id Slug of section, separated by underscores.
	 * @param array  $details {
	 *     Properties of mode.
	 *     @type string $title User-friendly title of mode.
	 *     @type string description Describes what the mode does.
	 *     @type string $button_text Text for submit button on main cloner page when mode is active.
	 *     @type boolean $multisite_only Show this mode only on multisite installations.
	 *     @type array $steps Array of functions to call when this mode is running - cloning steps.
	 *     @type callable $report Function that adds mode-specific report items to the summary shown after running mode.
	 * }
	 */
	public function register_mode( $id, $details ) {
		$defaults = [
			'title'          => '',
			'button_text'    => '',
			'description'    => '',
			'multisite_only' => true,
			'steps'          => [],
			'report'         => function(){},
		];
		// Register by adding to the clone_modes array.
		$this->clone_modes[ $id ] = (object) wp_parse_args( $details, $defaults );
		// Auto-register any provided steps for this clone mode.
		foreach ( $this->clone_modes[ $id ]->steps as $index => $callback ) {
			// Make 1st step priority 10, 2nd is 20, etc. - makes it easier to add new steps in between existing ones.
			$priority = ( $index + 1 ) * 10;
			$this->register_step( $callback, $id, $priority );
		}
	}

	/**
	 * Get the data assigned to a specific mode
	 *
	 * @param string $id ID of clone mode.
	 * @return object|bool
	 */
	public function get_mode( $id = '' ) {
		$id = ! empty( $id ) ? $id : ns_cloner_request()->get( 'clone_mode' );
		return isset( $this->clone_modes[ $id ] ) ? $this->clone_modes[ $id ] : false;
	}

	/**
	 * Get array of registered clone modes, optionally filtered to only those that should be visible.
	 *
	 * @param bool $show_hidden Whether to include modes that should not be publicly available.
	 * @return array
	 */
	public function get_modes( $show_hidden = false ) {
		$modes = [];
		foreach ( $this->clone_modes as $mode_id => $details ) {
			// Skip clone modes that don't support single site usage, if this is not network admin.
			if ( ! $show_hidden && ! is_network_admin() && true === $details->multisite_only ) {
				continue;
			}
			// Skip hidden clone modes beginning with an underscore (similar convention to hidden post_meta keys).
			if ( ! $show_hidden && substr( $mode_id, 0, 1 ) === '_' ) {
				continue;
			}
			$modes[ $mode_id ] = $details;
		}
		return $modes;
	}

	/*
	______________________________________
	|
	|  Cloning Step Registration
	|_____________________________________
	*/

	/**
	 * Adds a new step to existing clone mode(s)
	 *
	 * This works as a wrapper for add_action, with the key addition that it enables easy addition
	 * of a step for 1 OR multiple clone modes. Then by adding an action for each step, every step
	 * (including default steps for each mode, which will have register_step() called automatically by
	 * register_mode()) will be called according to its priority when NS_Cloner_Processes::process_init
	 * runs the ns_cloner_process_{clone_mode} action.
	 *
	 * @see NS_Cloner_Process_Manager::init()
	 * @param callable     $callback Function to call during process_init.
	 * @param array|string $clone_mode Mode or modes that support this step (and should call it).
	 * @param int          $priority Priority for add_action().
	 */
	public function register_step( $callback, $clone_mode, $priority = 100 ) {
		$clone_modes = (array) $clone_mode;
		foreach ( $clone_modes as $clone_mode_id ) {
			add_action(
				"ns_cloner_process_{$clone_mode_id}",
				function() use ( $callback ) {
					// Get the function name to refer to and log it.
					$callback_name = is_array( $callback ) ? $callback[1] : $callback;
					$callback_ref  = is_array( $callback ) ? get_class( $callback[0] ) . '::' . $callback[1] : $callback;
					$this->log->log_break();
					$this->log->log( "STARTING clone step {$callback_ref}." );
					// Make sure a previous step didn't trigger an error, and that this step isn't disabled by filters.
					$do_step = empty( $this->report->get_report( '_error' ) ) && ! get_site_option( 'ns_cloner_exited' );
					if ( apply_filters( "ns_cloner_do_step_{$callback_name}", $do_step ) ) {
						call_user_func( $callback );
					} else {
						$this->log->log( "SKIPPING because ns_cloner_do_step_{$callback_name} was false." );
					}
				},
				$priority
			);
		}
	}

	/**
	 * Install custom Cloner tables
	 */
	public function install_tables() {
		if ( get_site_option( 'ns_cloner_installed_version' ) !== $this->version ) {
			// Required for using dbDelta function
			require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
			$table_name = ns_cloner_analytics()->get_db_log_table();
			global $wpdb;
			$query = "
	            CREATE TABLE `{$table_name}` (
	            id BIGINT(20) unsigned NOT NULL AUTO_INCREMENT, 
	            version VARCHAR(50) NOT NULL,
	            is_success INT(1) NOT NULL,
	            clone_mode VARCHAR(100) NOT NULL,
	            date DATETIME NOT NULL,
	            time_spent_sec INT(20) NOT NULL,
	            tables_count int(20) DEFAULT NULL,
	            rows_count INT(20) DEFAULT NULL,
	            files_count INT(20) DEFAULT NULL,
	            users_count INT(20) DEFAULT NULL,
	            replacements_count INT(20) DEFAULT NULL,
	            wp_data TEXT DEFAULT NULL,
	            is_synced INT(1) NOT NULL,
	            PRIMARY KEY (id)
	            ) {$wpdb->get_charset_collate()};
	        ";
			dbDelta($query);
			update_site_option( 'ns_cloner_installed_version', $this->version );
		}
	}
}

/**
 * Return singleton instance of NS_Cloner (replaces the global $ns_cloner variable used in previous versions)
 *
 * @return NS_Cloner
 */
function ns_cloner() {
	return NS_Cloner::get_instance();
}
ns_cloner();
PKW�1\��{)�H�Hns-utils.phpnu�[���<?php
/**
 * Cloner utility functions.
 *
 * @package NS_Cloner
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Organize a sequence of search/replace values.
 *
 * This orders values and adds new corrective search/replace pairs to avoid compounding replacement issues.
 * Note search and replace params are BY REFERENCE.
 *
 * @param array $search Strings of search text to sort/process.
 * @param array $replace Strings of replacement text to sort/process (keeping same order as $search of course so no mix ups).
 * @param bool  $case_sensitive Whether search/replace will be case sensitive.
 * @return void
 */
function ns_set_search_replace_sequence( &$search, &$replace, $case_sensitive = false ) {
	/*
	 * Sort string replacements by order longest to shortest to prevent a situation like
	 * Source Site w/ url="neversettle.it",upload_dir="/neversettle.it/wp-content/uploads" and
	 * Target Site w/url="blog.neversettle.it",upload_dir="/neversettle.it/wp-content/uploads/sites/2".
	 * This could result in target upload_dir being "/blog.neversettle.it/wp-content/uploads"
	 * id the url replacement is applied before upload_dir replacement.
	 */
	$search_replace = array_combine( $search, $replace );
	uksort(
		$search_replace,
		function( $a, $b ) {
			return strlen( $b ) - strlen( $a );
		}
	);
	$search      = array_keys( $search_replace );
	$new_search  = $search;
	$replace     = array_values( $search_replace );
	$new_replace = $replace;

	/*
	 * If any search terms are found in replace terms which have already been inserted (ie came earlier in the find/replace sequence), remove this search term plus
	 * its accompanying replacement from the string-based search/replace and a correction to change that replacement back again so replacements won't be compounded.
	 * This prevents a situation like Source Site w/ title="Brown",url="brown.com" and Target Site w/ title="Brown Subsite",url="subsite.brown.com"
	 * resulting in target urls like "subsite.Brown Subsite.com" when title replacement is applied after url replacement.
	 */
	$fix_insertion_index = 1;
	foreach ( $search as $index => $search_text ) {
		// Figure out what the desired replace text is from other array in case we need it.
		$replace_text = $replace[ $index ];
		// Get replacements earlier in array (which could've already been inserted into text so we need to watch out for them).
		$past_replacements = array_slice( $replace, 0, $index );
		// Identify any of those replacements which the search text and save as array of conflicts.
		$conflicting_replacements = array_filter(
			$past_replacements,
			function ( $past_replace_text ) use ( $search_text, $case_sensitive ) {
				$search_func = $case_sensitive ? 'strpos' : 'stripos';
				return false !== $search_func( $past_replace_text, $search_text );
			}
		);
		if ( ! empty( $conflicting_replacements ) ) {
			ns_cloner()->log->log( "Conflicting replacement found: search text '$search_text' appears in one or more previous replacement(s): '" . join( "','", $conflicting_replacements ) . "'" );
			foreach ( $conflicting_replacements as $conflicting_replacement ) {
				// If it's an exact match, assume it's supposed to happen and skip fixing it.
				if ( $conflicting_replacement === $search_text ) {
					ns_cloner()->log->log( "Replacement is same as search for: '$search_text'. Taking no action." );
					continue;
				}
				// Insert into the search/replace arrays right after the current item which will produce the bad replacement.
				$replace_func       = $case_sensitive ? 'str_replace' : 'str_ireplace';
				$conflicting_search = $replace_func( $search_text, $replace_text, $conflicting_replacement );
				array_splice( $new_search, $fix_insertion_index, 0, $conflicting_search );
				array_splice( $new_replace, $fix_insertion_index, 0, $conflicting_replacement );
				$fix_insertion_index ++;
			}
		}
		$fix_insertion_index ++;
	}

	// Update variables by reference - no return needed.
	$search  = $new_search;
	$replace = $new_replace;
}

/**
 * Recursively search and replace
 *
 * @param mixed $data           String or array which to do search/replace on - passed by reference.
 * @param array $search         Strings to look for.
 * @param array $replace        Replacements for $search values.
 * @param bool  $case_sensitive Whether string search should be case sensitive.
 *
 * @return int number of replacements made
 */
function ns_recursive_search_replace( &$data, $search, $replace, $case_sensitive = false ) {
	$was_serialized    = is_serialized( $data );
	$data              = maybe_unserialize( $data );
	$replacement_count = 0;
	// Run through replacements for different data types.
	if ( is_array( $data ) ) {
		foreach ( $data as $key => $value ) {
			$replacement_count += ns_recursive_search_replace( $data[ $key ], $search, $replace, $case_sensitive );
		}
	} elseif ( is_object( $data ) ) {
		foreach ( $data as $key => $value ) {
			$replacement_count += ns_recursive_search_replace( $data->$key, $search, $replace, $case_sensitive );
		}
	} elseif ( is_string( $data ) ) {
		$replace_func = $case_sensitive ? 'str_replace' : 'str_ireplace';
		$data         = $replace_func( $search, $replace, $data, $replacement_count );
	}
	// Reserialize if it was serialized originally.
	if ( $was_serialized ) {
		$data = serialize( $data );
	}
	// Return number of replacements made for informational/reporting purposes.
	return $replacement_count;
}

/**
 * Copy directories and files recursively by queueing them in a background process
 *
 * Skip directories called 'sites' to avoid copying all sites storage in WP > 3.5
 *
 * @param string                $src Source directory path.
 * @param string                $dst Destination directory path (Relative).
 * @param WP_Background_Process $process Background process to use for queueing files.
 * @param int                   $num File number in queue.
 * @return int Number of files found
 */
function ns_recursive_dir_copy_by_process( $src, $dst, $process, $num = 0 ) {
	if ( is_dir( $src ) ) {
		$files = scandir( $src );
		// Specify items to ignore when copying.
		$ignore = apply_filters( 'ns_cloner_dir_copy_ignore', [ 'sites', '.', '..' ] );
		// Recursively copy files that aren't in the ignore array.
		foreach ( $files as $file ) {
			if ( ! in_array( $file, $ignore, true ) ) {
				$num += ns_recursive_dir_copy_by_process( "$src/$file", "$dst/$file", $process, $num );
			}
		}
	} elseif ( file_exists( $src ) ) {
		$file = [
			'number'      => ++ $num,
			'source'      => $src,
			'destination' => $dst,
		];
		$process->push_to_queue( $file );
	}

	return $num;
}

/**
 * Validate a potential new site and return an array of error messages.
 *
 * We used to use wpmu_validate_blog_signup here, but that caused too many issues due to the extra
 * validation place on front-end signups vs. admin creations (cloning should have the same rules
 * that apply to an admin in Sites > Add New, not front end registration).
 *
 * This is now a custom combination of logic from site-new.php and wpmu_validate_blog_signup().
 *
 * @param string $site_name Domain/subdirectory of new site.
 * @param string $site_title Title of new site.
 * @return array
 */
function ns_wp_validate_site( $site_name, $site_title ) {
	global $domain;
	$errors        = [];
	// Preempt any spaces and uppercase chars.
	$site_name = strtolower( trim( $site_name ) );
	// Require some name.
	if ( empty( $site_name ) ) {
		$errors[] = __( 'Site URL is required.', 'ns-cloner-site-copier' );
	} elseif ( ! preg_match( '|^([a-z0-9-])+$|', $site_name ) ) {
		$errors[] = __( 'Site URLs can only contain letters (a-z), numbers and hyphens.', 'ns-cloner-site-copier' );
	}
	if ( is_multisite() ) {
		// Check if the domain/path has been used already.
		$current_network = get_network();
		$base            = $current_network->path;
		if ( is_subdomain_install() ) {
			$mydomain = $site_name . '.' . preg_replace( '|^www\.|', '', $domain );
			$path     = $base;
		} else {
			$mydomain = "$site_name";
			$path     = $base . $site_name . '/';
		}
		if ( domain_exists( $mydomain, $path, get_network()->id ) ) {
			$errors[] = __('Sorry, that site already exists!', 'ns-cloner-site-copier');
		}
		// Validate against WP illegal / reserved names.
		$illegal_names  = get_site_option( 'illegal_names', [] );
		$illegal_dirs   = get_subdirectory_reserved_names();
		$illegal_values = is_subdomain_install() ? $illegal_names : array_merge ( $illegal_names, $illegal_dirs );
		if ( in_array ( $site_name, $illegal_values ) ) {
			$errors[] = __('That URL is reserved by WordPress.', 'ns-cloner-site-copier');
		}
	}
	// Require some title.
	if ( empty( $site_title ) ) {
		$errors[] = __( 'A site title is required', 'ns-cloner-site-copier' );
	}
	return apply_filters( 'ns_cloner_validate_site_errors', $errors, $site_name, $site_title );
}

/**
 * Get a list of sites with formatted labels for select element
 *
 * @return array
 */
function ns_wp_get_sites_list() {
	$list = [];
	if ( function_exists( 'get_sites' ) ) {
		// Get sites for WP 4.6 and later.
		$sites = get_sites( [ 'number' => 9999 ] );
	} elseif ( function_exists( 'wp_get_sites' ) ) {
		// Get sites for WP 4.5 and earlier, and map results to objects instead of arrays.
		$sites = wp_get_sites( [ 'limit' => 9999 ] );
		foreach ( $sites as $index => $site ) {
			$sites[ $index ] = (object) $site;
		}
	} else {
		// Not multisite, or really ancient.
		$sites = [];
	}
	// Loop through sites and prepare labels.
	if ( count( $sites ) > 500 ) {
		// For networks with more than 500 sites, show fewer details to avoid extra queries.
		foreach ( $sites as $site ) {
			$list[ $site->blog_id ] = ( is_subdomain_install() ? $site->domain : $site->path ) . ' - ID:' . $site->blog_id;
		}
	} else {
		// For smaller networks, show more detailed results.
		foreach ( $sites as $site ) {
			$details                = get_blog_details( $site->blog_id );
			$name                   = substr( $details->blogname, 0, 30 );
			$list[ $site->blog_id ] = $name . ' - ' . ns_short_url( $details->siteurl ) . ' - ID:' . $site->blog_id;
		}
	}
	return apply_filters( 'ns_cloner_sites_list', $list );
}

/**
 * Get allowed HTML elements and attributes to use with wp_kses
 *
 * @return array
 */
function ns_wp_kses_allowed() {
	return [
		'a'    => [
			'href'   => [],
			'target' => [],
			'class'  => [],
		],
		'em'   => [],
		'code' => [],
	];
}

/**
 * Remove protocol and trailing slash from URL for display
 *
 * @param string $url URL to shorten.
 * @return string
 */
function ns_short_url( $url ) {
	return untrailingslashit( str_replace( [ 'https://', 'http://', '//' ], '', $url ) );
}

/**
 * Get the link for a specific site/blog, with blogname as the anchor text
 *
 * @param mixed $site_id ID of blog/site, or array of IDs.
 * @param bool  $html Whether to return an HTML link, or just the url.
 * @return string
 */
function ns_site_link( $site_id = null, $html = true ) {
	// Force html off for CLI report messages.
	if ( defined( 'WP_CLI' ) && WP_CLI ) {
		$html = false;
	}
	if ( is_multisite() && ( is_numeric( $site_id ) || is_array( $site_id ) ) ) {
		// Multisite.
		$links    = [];
		$site_ids = is_array( $site_id ) ? $site_id : [ $site_id ];
		foreach ( $site_ids as $id ) {
			$details = get_blog_details( $id );
			$links[] = $html ? "<a href='{$details->siteurl}' target='_blank'>{$details->blogname}</a>" : $details->siteurl;
		}
		return join( ', ', $links );
	} else {
		// Single site.
		return $html ? '<a href="' . site_url() . '" target="_blank">' . get_bloginfo( 'name' ) . '</a>' : site_url();
	}
}

/**
 * Generate a create statement for a table that's going to be cloned
 *
 * This removes any constraints / foreign keys from the query to prevent conflicts,
 * and then adds them back at the end with alter table statements. The prefixes have
 * to be provided separately, because we could have a temp target table name, but
 * still want to name the constraint properly with the final target prefix.
 *
 * @param string $source_table Name of table to use for defining the structure.
 * @param string $target_table Name of new table to create.
 * @param string $source_prefix DB prefix for source site.
 * @param string $target_prefix DB prefix for target site.
 * @return string
 */
function ns_sql_create_table_query( $source_table, $target_table, $source_prefix, $target_prefix ) {
	// Create cloned table structure.
	$query             = ns_cloner()->db->get_var( "SHOW CREATE TABLE `$source_table`", 1 );
	$newline           = '(?:\r|\n|\r\n)';
	$view              = '/^CREATE (.*) VIEW/';
	$constraint        = "/,$newline+\s*((?:CONSTRAINT|FOREIGN\s+KEY).+?)(?=,?$newline)/";
	$raw_target_prefix = $target_prefix;
	$target_prefix     = apply_filters( 'ns_cloner_target_table', $target_prefix );
	// Handle views, by creating at end after real tables are copied, and returning blank query for now.
	if ( preg_match( $view, $query ) ) {
		ns_cloner()->log->log( "DETECTING that table *$source_table* is a view. Skipping." );
		// Replace prefix for other table names that view refers to.
		if ( ! apply_filters( 'ns_cloner_skip_views', false ) ) {
			$view_query = str_replace ("`$source_prefix", "`$target_prefix", $query );
			ns_cloner()->process_manager->add_finish_query( $view_query, 200 );
		}
		return '';
	}
	// Match all constraints / foreign keys in create table query.
	preg_match_all( $constraint, $query, $constraint_matches );
	// Save constraints to be applied later in alter table queries.
	if ( ! apply_filters( 'ns_cloner_skip_constraints', false ) ) {
		foreach ( $constraint_matches[1] as $constraint_def ) {
			// Redefine final target table name based on source, instead of using $target_table,
			// because for teleport and clone over, $target_table will have a temp prefix that shouldn't be in alter query.
			$constraint_table = preg_replace("|^$source_prefix|", $raw_target_prefix, $source_table);
			// Rename prefixes in constraint. Can't look for a backquote before the prefix (assume prefix is at beginning),
			// because some plugins like Woo add extra prefixes like fk_{wpdb_prefix}_something, etc.
			$constraint_def = str_replace($source_prefix, $raw_target_prefix, $constraint_def);
			// Store alter query in site_options. Use high priority to make sure it executes after all table renames.
			ns_cloner()->process_manager->add_finish_query( "ALTER TABLE `$constraint_table` ADD $constraint_def;", 100 );
		}
	}
	// Now remove constraint statements from the create table query.
	$query = preg_replace( $constraint, '', $query );
	// And rename it to create the new target table.
	$query = str_replace( "$source_table", "$target_table", $query );
	ns_cloner()->log->log( [ "GENERATING create table query for *$target_table*:", $query ] );
	return $query;
}

/**
 * Add backquotes to tables and db names in SQL queries from phpMyAdmin.
 *
 * @param mixed $value Data to wrap in backquotes.
 * @return mixed
 */
function ns_sql_backquote( $value ) {
	if ( ! empty( $value ) && '*' !== $value ) {
		if ( is_array( $value ) ) {
			return array_map( 'ns_sql_backquote', $value );
		} elseif ( 0 !== strpos( $value, '`' ) ) {
			return '`' . $value . '`';
		}
	}
	return $value;
}

/**
 * Quote/format value(s) correctly for being used in an insert query
 *
 * @param mixed $value Data to wrap in quotes.
 * @return mixed
 */
function ns_sql_quote( $value ) {
	if ( is_array( $value ) ) {
		return array_map( 'ns_sql_quote', $value );
	} else {
		if ( is_null( $value ) ) {
			return 'NULL';
		} else {
			return "'" . esc_sql( $value ) . "'";
		}
	}
}

/**
 * Get a MySQL variable. [Originally from the Diagnosis plugin by Gary Jones]
 *
 * @param string $variable MySQL variable name to get.
 * @param mixed  $default Default if variable isn't found.
 * @return string
 */
function ns_get_sql_variable( $variable, $default = '' ) {
	$result = ns_cloner()->db->get_row( "SHOW VARIABLES LIKE '$variable';", ARRAY_A );
	return isset( $result['Value'] ) && $result['Value'] ? $result['Value'] : $default;
}

/**
 * Auto-insert the proper multisite-compatible table and column values into an option query
 *
 * @param string $query SQL options/sitemeta query to make replacements on.
 * @param array  $args Arguments to pass to wpdb::prepare.
 * @return string|array
 */
function ns_prepare_option_query( $query, $args = [] ) {
	$details = [
		'{table}' => is_multisite() ? ns_cloner()->db->sitemeta : ns_cloner()->db->options,
		'{id}'    => is_multisite() ? 'meta_id' : 'option_id',
		'{key}'   => is_multisite() ? 'meta_key' : 'option_name',
		'{value}' => is_multisite() ? 'meta_value' : 'option_value',
	];
	// Replace table/column references with actual values based on whether this is multisite or no.
	$query = str_replace( array_keys( $details ), array_values( $details ), $query );
	// Run normal db query prep.
	$query = ns_cloner()->db->prepare( $query, $args );
	return $query;
}

/**
 * Take a row of data and return the correct placeholders for a prepared statement.
 *
 * Use WPDB defined format for default wp table columns, or default to string.
 *
 * @param array  $row Data to get placeholders for.
 * @param string $table Table name.
 * @return array
 */
function ns_prepare_row_formats( &$row, $table ) {
	$formats = [];
	foreach ( $row as $field => $value ) {
		if ( is_null( $value ) ) {
			$formats[] = 'NULL';
			unset( $row[$field] );
		} else {
			$formats[] = apply_filters( 'ns_cloner_row_format', '%s', $field, $table );
		}
	}
	return $formats;
}

/**
 * Organize a list of tables in execution order.
 *
 * Right now that just means putting sitemeta or options first, so that its row count
 * can get counted accurately before the Cloner starts adding temp batch data to it.
 *
 * @param string[] $tables List of table names.
 * @return string[]
 */
function ns_reorder_tables( $tables ) {
	$options_index = null;
	foreach ( $tables as $i => $table ) {
		if ( preg_match( '/(options|sitemeta)$/', $table ) ) {
			$options_index = $i;
		}
	}
	if ( null !== $options_index ) {
		$value = $tables[ $options_index ];
		unset( $tables[ $options_index ] );
		array_unshift( $tables, $value );
	}
	return $tables;
}PKW�1\gHrrcss/ns-cloner.css.mapnu�[���PKW�1\>د�n`n`�css/ns-cloner.cssnu�[���PKW�1\�(X�d�dfucss/ns-cloner.scssnu�[���PKW�1\��n���
U�composer.jsonnu�[���PKW�1\-���
l�composer.locknu�[���PKW�1\�j�X�'�'��class-ns-cloner-request.phpnu�[���PKW�1\�Q~L]]�ns-compatibility.phpnu�[���PKW�1\�
W@@u0class-ns-cloner-report.phpnu�[���PKW�1\Q��AhAhA�?languages/ns-cloner.potnu�[���PKW�1\&�w=:0:0
��readme.txtnu�[���PKW�1\$×0
0
2"�sections/class-ns-cloner-section-create-target.phpnu�[���PKW�1\T�002��sections/class-ns-cloner-section-advertise-pro.phpnu�[���PKW�1\�}�_CC8F�sections/class-ns-cloner-section-additional-settings.phpnu�[���PKW�1\X��d��2��sections/class-ns-cloner-section-select-source.phpnu�[���PKW�1\X[��+�+
6�changelog.txtnu�[���PKW�1\-�)QQ_images/ns-cloner-top-logo.pngnu�[���PKW�1\�/�c���2images/bg-texture.pngnu�[���PKW�1\.J��""(;images/big-bg.jpgnu�[���PKW�1\8���`�`�]images/gold-loading.gifnu�[���PKW�1\����NN��images/ns-visit.pngnu�[���PKW�1\�P� �
�
C�images/ns-like.pngnu�[���PKW�1\?qj�]]?�images/loading.gifnu�[���PKW�1\3������images/cloner-admin-icon.pngnu�[���PKW�1\ʮ,�HH�images/spinner.gifnu�[���PKW�1\�0�P����images/ns-follow.pngnu�[���PKW�1\��7�$;$;6�vendor/a5hleyrich/wp-background-processing/license.txtnu�[���PKW�1\��W��(�(L$Dvendor/a5hleyrich/wp-background-processing/classes/wp-background-process.phpnu�[���PKW�1\����GVmvendor/a5hleyrich/wp-background-processing/classes/wp-async-request.phpnu�[���PKW�1\8=����Gdzvendor/a5hleyrich/wp-background-processing/wp-background-processing.phpnu�[���PKW�1\3���5�}vendor/a5hleyrich/wp-background-processing/.gitignorenu�[���PKW�1\�J`KKK4~vendor/a5hleyrich/wp-background-processing/README.mdnu�[���PKW�1\�R�txx8’vendor/a5hleyrich/wp-background-processing/composer.jsonnu�[���PKW�1\�ߙsuu%��vendor/composer/autoload_classmap.phpnu�[���PKW�1\�桌�	�	!l�vendor/composer/autoload_real.phpnu�[���PKW�1\�z���4�4i�vendor/composer/ClassLoader.phpnu�[���PKW�1\#<����!K�vendor/composer/autoload_psr4.phpnu�[���PKW�1\ �..e�vendor/composer/LICENSEnu�[���PKW�1\4H��"��vendor/composer/autoload_files.phpnu�[���PKW�1\t�!ו�'�vendor/composer/autoload_namespaces.phpnu�[���PKW�1\6p(::#��vendor/composer/autoload_static.phpnu�[���PKW�1\Ͷ`IFF��vendor/composer/installed.jsonnu�[���PKW�1\K>��$�vendor/harvesthq/chosen/package.jsonnu�[���PKW�1\����/�/"��vendor/harvesthq/chosen/chosen.cssnu�[���PKW�1\������!�/vendor/harvesthq/chosen/README.mdnu�[���PKW�1\��)d
�
�(8vendor/harvesthq/chosen/chosen.jquery.jsnu�[���PKW�1\�)s)s+x�vendor/harvesthq/chosen/chosen.proto.min.jsnu�[���PKW�1\�5����,�cvendor/harvesthq/chosen/chosen-sprite@2x.pngnu�[���PKW�1\'m=ه�#:gvendor/harvesthq/chosen/.travis.ymlnu�[���PKW�1\s�^�q�q,jvendor/harvesthq/chosen/chosen.jquery.min.jsnu�[���PKW�1\�&^����'1�vendor/harvesthq/chosen/chosen.proto.jsnu�[���PKW�1\�w��"�vendor/harvesthq/chosen/LICENSE.mdnu�[���PKW�1\}d�>33%&�vendor/harvesthq/chosen/composer.jsonnu�[���PKW�1\,~)"��"��vendor/harvesthq/chosen/bower.jsonnu�[���PKW�1\���r�'�'&��vendor/harvesthq/chosen/chosen.min.cssnu�[���PKW�1\.?L)�vendor/harvesthq/chosen/chosen-sprite.pngnu�[���PKW�1\����
�
v�vendor/kint-php/kint/README.mdnu�[���PKW�1\���$
$
%��vendor/kint-php/kint/init_helpers.phpnu�[���PKW�1\�MG���/�vendor/kint-php/kint/src/Zval/DateTimeValue.phpnu�[���PKW�1\%Ć�	�	/@�vendor/kint-php/kint/src/Zval/InstanceValue.phpnu�[���PKW�1\^����'F�vendor/kint-php/kint/src/Zval/Value.phpnu�[���PKW�1\Nm�,d	d	HWvendor/kint-php/kint/src/Zval/Representation/MicrotimeRepresentation.phpnu�[���PKW�1\J�{�[[J3vendor/kint-php/kint/src/Zval/Representation/SplFileInfoRepresentation.phpnu�[���PKW�1\``�h???5vendor/kint-php/kint/src/Zval/Representation/Representation.phpnu�[���PKW�1\A��;�G�GD�=vendor/kint-php/kint/src/Zval/Representation/ColorRepresentation.phpnu�[���PKW�1\�@ހ,
,
H�vendor/kint-php/kint/src/Zval/Representation/DocstringRepresentation.phpnu�[���PKW�1\��~�S
S
E��vendor/kint-php/kint/src/Zval/Representation/SourceRepresentation.phpnu�[���PKW�1\��`/}�vendor/kint-php/kint/src/Zval/ResourceValue.phpnu�[���PKW�1\�2S

1[�vendor/kint-php/kint/src/Zval/TraceFrameValue.phpnu�[���PKW�1\;�b�DD.Ƴvendor/kint-php/kint/src/Zval/ClosureValue.phpnu�[���PKW�1\4��[��0h�vendor/kint-php/kint/src/Zval/ParameterValue.phpnu�[���PKW�1\�Y��yy+��vendor/kint-php/kint/src/Zval/BlobValue.phpnu�[���PKW�1\+�ln��.r�vendor/kint-php/kint/src/Zval/ElidedValues.phpnu�[���PKW�1\V/�/aa0]�vendor/kint-php/kint/src/Zval/ThrowableValue.phpnu�[���PKW�1\)]�]99-�vendor/kint-php/kint/src/Zval/MethodValue.phpnu�[���PKW�1\�uV���,�
vendor/kint-php/kint/src/Zval/TraceValue.phpnu�[���PKW�1\������-vendor/kint-php/kint/src/Zval/StreamValue.phpnu�[���PKW�1\>�Wx x "(vendor/kint-php/kint/src/Utils.phpnu�[���PKW�1\7�
��/�;vendor/kint-php/kint/src/Parser/ProxyPlugin.phpnu�[���PKW�1\Ӂ���6�Dvendor/kint-php/kint/src/Parser/ClassStaticsPlugin.phpnu�[���PKW�1\oTQ??5Vvendor/kint-php/kint/src/Parser/SplFileInfoPlugin.phpnu�[���PKW�1\%��E0�]vendor/kint-php/kint/src/Parser/MysqliPlugin.phpnu�[���PKW�1\ .��0nvendor/kint-php/kint/src/Parser/BinaryPlugin.phpnu�[���PKW�1\!�E�
�
0uvendor/kint-php/kint/src/Parser/Base64Plugin.phpnu�[���PKW�1\������3Z�vendor/kint-php/kint/src/Parser/ThrowablePlugin.phpnu�[���PKW�1\7��]@@/��vendor/kint-php/kint/src/Parser/TracePlugin.phpnu�[���PKW�1\]9Q��4,�vendor/kint-php/kint/src/Parser/ArrayLimitPlugin.phpnu�[���PKW�1\wSR�	�	0�vendor/kint-php/kint/src/Parser/StreamPlugin.phpnu�[���PKW�1\��'�``3�vendor/kint-php/kint/src/Parser/SerializePlugin.phpnu�[���PKW�1\�.��r	r	3ܸvendor/kint-php/kint/src/Parser/TimestampPlugin.phpnu�[���PKW�1\������1��vendor/kint-php/kint/src/Parser/ClosurePlugin.phpnu�[���PKW�1\���

2��vendor/kint-php/kint/src/Parser/IteratorPlugin.phpnu�[���PKW�1\s��*Y�vendor/kint-php/kint/src/Parser/Plugin.phpnu�[���PKW�1\GV:��vendor/kint-php/kint/src/Parser/SimpleXMLElementPlugin.phpnu�[���PKW�1\�ʷ*�*5��vendor/kint-php/kint/src/Parser/DOMDocumentPlugin.phpnu�[���PKW�1\ۭb
��/#	vendor/kint-php/kint/src/Parser/TablePlugin.phpnu�[���PKW�1\��|�F�F*S/	vendor/kint-php/kint/src/Parser/Parser.phpnu�[���PKW�1\�&���2>v	vendor/kint-php/kint/src/Parser/DateTimePlugin.phpnu�[���PKW�1\���k**:i}	vendor/kint-php/kint/src/Parser/SplObjectStoragePlugin.phpnu�[���PKW�1\��+��.��	vendor/kint-php/kint/src/Parser/JsonPlugin.phpnu�[���PKW�1\b��/6�	vendor/kint-php/kint/src/Parser/ColorPlugin.phpnu�[���PKW�1\XuK�{{-��	vendor/kint-php/kint/src/Parser/XmlPlugin.phpnu�[���PKW�1\���W��3��	vendor/kint-php/kint/src/Parser/MicrotimePlugin.phpnu�[���PKW�1\}��o2{�	vendor/kint-php/kint/src/Parser/ToStringPlugin.phpnu�[���PKW�1\�7��
�
6��	vendor/kint-php/kint/src/Parser/ClassMethodsPlugin.phpnu�[���PKW�1\�N�pp58�	vendor/kint-php/kint/src/Parser/ArrayObjectPlugin.phpnu�[���PKW�1\lŽ
�
3
�	vendor/kint-php/kint/src/Parser/BlacklistPlugin.phpnu�[���PKW�1\͡��~~0��	vendor/kint-php/kint/src/Parser/FsPathPlugin.phpnu�[���PKW�1\
�2�gUgU!��	vendor/kint-php/kint/src/Kint.phpnu�[���PKW�1\�0f6A6A'�>
vendor/kint-php/kint/src/CallFinder.phpnu�[���PKW�1\?
��3!�
vendor/kint-php/kint/src/Renderer/PlainRenderer.phpnu�[���PKW�1\��p)�F�F2N�
vendor/kint-php/kint/src/Renderer/RichRenderer.phpnu�[���PKW�1\f���8��
vendor/kint-php/kint/src/Renderer/Rich/ClosurePlugin.phpnu�[���PKW�1\t����7��
vendor/kint-php/kint/src/Renderer/Rich/ElidedPlugin.phpnu�[���PKW�1\��S1XX?�
vendor/kint-php/kint/src/Renderer/Rich/ValuePluginInterface.phpnu�[���PKW�1\��
�**A�
vendor/kint-php/kint/src/Renderer/Rich/SimpleXMLElementPlugin.phpnu�[���PKW�1\kk	^��:wvendor/kint-php/kint/src/Renderer/Rich/BlacklistPlugin.phpnu�[���PKW�1\(0%)qq:�
vendor/kint-php/kint/src/Renderer/Rich/MicrotimePlugin.phpnu�[���PKW�1\�gX0��7�vendor/kint-php/kint/src/Renderer/Rich/BinaryPlugin.phpnu�[���PKW�1\^<��MM:�vendor/kint-php/kint/src/Renderer/Rich/PluginInterface.phpnu�[���PKW�1\��]q�	�	:U$vendor/kint-php/kint/src/Renderer/Rich/DocstringPlugin.phpnu�[���PKW�1\vgMM1S.vendor/kint-php/kint/src/Renderer/Rich/Plugin.phpnu�[���PKW�1\�?��7:vendor/kint-php/kint/src/Renderer/Rich/SourcePlugin.phpnu�[���PKW�1\�i����;yEvendor/kint-php/kint/src/Renderer/Rich/DepthLimitPlugin.phpnu�[���PKW�1\հg�ee6�Kvendor/kint-php/kint/src/Renderer/Rich/TablePlugin.phpnu�[���PKW�1\��y&��:x_vendor/kint-php/kint/src/Renderer/Rich/RecursionPlugin.phpnu�[���PKW�1\Z�ZE
E
;�evendor/kint-php/kint/src/Renderer/Rich/TraceFramePlugin.phpnu�[���PKW�1\�O�//9Xpvendor/kint-php/kint/src/Renderer/Rich/CallablePlugin.phpnu�[���PKW�1\�G�uu=�vendor/kint-php/kint/src/Renderer/Rich/TabPluginInterface.phpnu�[���PKW�1\*��qq:ҍvendor/kint-php/kint/src/Renderer/Rich/TimestampPlugin.phpnu�[���PKW�1\��ܶ6��vendor/kint-php/kint/src/Renderer/Rich/ColorPlugin.phpnu�[���PKW�1\�w�dd:1�vendor/kint-php/kint/src/Renderer/Text/BlacklistPlugin.phpnu�[���PKW�1\J�4��:��vendor/kint-php/kint/src/Renderer/Text/MicrotimePlugin.phpnu�[���PKW�1\�ta�ee;��vendor/kint-php/kint/src/Renderer/Text/DepthLimitPlugin.phpnu�[���PKW�1\��eqbb:��vendor/kint-php/kint/src/Renderer/Text/RecursionPlugin.phpnu�[���PKW�1\���@6��vendor/kint-php/kint/src/Renderer/Text/TracePlugin.phpnu�[���PKW�1\�?���1�vendor/kint-php/kint/src/Renderer/Text/Plugin.phpnu�[���PKW�1\�S76�vendor/kint-php/kint/src/Renderer/Text/ElidedPlugin.phpnu�[���PKW�1\��N*%*%2��vendor/kint-php/kint/src/Renderer/TextRenderer.phpnu�[���PKW�1\�*"  1?
vendor/kint-php/kint/src/Renderer/CliRenderer.phpnu�[���PKW�1\������.�vendor/kint-php/kint/src/Renderer/Renderer.phpnu�[���PKW�1\]Ș�.
.
"�2vendor/kint-php/kint/composer.jsonnu�[���PKW�1\���N��4e=vendor/kint-php/kint/resources/compiled/microtime.jsnu�[���PKW�1\:�##7�Avendor/kint-php/kint/resources/compiled/aante-light.cssnu�[���PKW�1\�����*�*/<evendor/kint-php/kint/resources/compiled/rich.jsnu�[���PKW�1\²�W' ' :j�vendor/kint-php/kint/resources/compiled/solarized-dark.cssnu�[���PKW�1\:NP��5��vendor/kint-php/kint/resources/compiled/solarized.cssnu�[���PKW�1\q1(�vendor/kint-php/kint/resources/compiled/shared.jsnu�[���PKW�1\<�`�FF0��vendor/kint-php/kint/resources/compiled/plain.jsnu�[���PKW�1\����4?�vendor/kint-php/kint/resources/compiled/original.cssnu�[���PKW�1\׵ mEE1#�vendor/kint-php/kint/resources/compiled/plain.cssnu�[���PKW�1\��7�vv�vendor/kint-php/kint/LICENSEnu�[���PKW�1\�|l,�	�	��vendor/kint-php/kint/init.phpnu�[���PKW�1\ߥ��Y
vendor/autoload.phpnu�[���PKW�1\m_e6{{N
class-ns-cloner-schedule.phpnu�[���PKW�1\e�J��#
abstracts/class-ns-cloner-addon.phpnu�[���PKW�1\#N��B�B%Z 
abstracts/class-ns-cloner-process.phpnu�[���PKW�1\$�}���%�c
abstracts/class-ns-cloner-section.phpnu�[���PKW�1\�K��-�-&�u
features/class-ns-cloner-analytics.phpnu�[���PKW�1\��-ɺ�ߣ
lib/kint/config.phpnu�[���PKW�1\4�.�^�^#ܳ
class-ns-cloner-process-manager.phpnu�[���PKW�1\��b�8�8*�processes/class-ns-cloner-rows-process.phpnu�[���PKW�1\�	Ғ��6�Kprocesses/class-ns-cloner-export-analytics-process.phpnu�[���PKW�1\ �K�
�
+�Oprocesses/class-ns-cloner-files-process.phpnu�[���PKW�1\�
��AA,[processes/class-ns-cloner-tables-process.phpnu�[���PKW�1\rT5""�ltemplates/ns-template-logs.phpnu�[���PKW�1\I�+ƞ���templates/ns-template-main.phpnu�[���PKW�1\���X�%�%"�templates/ns-template-warnings.phpnu�[���PKW�1\,(��	�	%�templates/ns-template-sidebar-sub.phpnu�[���PKW�1\��WW2��templates/ns-template-analytics-settings-modal.phpnu�[���PKW�1\m��ۧ�!��templates/ns-template-sidebar.phpnu�[���PKW�1\t��		 ��templates/ns-template-report.phpnu�[���PKW�1\�/�tr|r|��js/ns-cloner.jsnu�[���PKW�1\��C%���vclass-ns-cloner-ajax.phpnu�[���PKW�1\�zb>b>��class-ns-cloner-log.phpnu�[���PKW�1\9���s�s
,�ns-cloner.phpnu�[���PKW�1\��{)�H�H?=ns-utils.phpnu�[���PK���Io�

Youez - 2016 - github.com/yon3zu
LinuXploit