�PNG  IHDR22?�� pHYs  �� OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*! J�!��Q�EEȠ�����Q, � ��!���������{�kּ������>���� �H3Q5� �B�������.@� $p�d!s�#�~<<+"��x� �M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH���� � 0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4���������x����6��_-��"bb���ϫp@�t~��,/��;�m��%�h^ �u��f�@����W�p�~<�5�j>{�-�]c�K'Xt����o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A��,���� �`6�B$��BB d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(�� A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=� �C��7�F� �dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8, �c˱"� ���V����cϱw�E� 6wB aAHXLXN�H� $4� 7 �Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[ �b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w ��Ljg(�gw��L�Ӌ�T071���oUX*�*|�� �J�&�*/T����ު U�U�T��^S}�FU3S� Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k ��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN �(���~���)�)�4L�1e\k����X�H�Q�G�6������E�Y��A�J'\'Gg����S�Sݧ �M=:��.�k���Dw�n��^��Lo��y���}/�T�m���G X� $� �<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��= ���Z~s�r:V:ޚΜ�?}����/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z���������ۯ�6�i�ܟ�4�)�Y3s���C�Q��? ��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�������!h�쐭!��Α�i�P~���a�a��~ '���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl������� �{�/�]py�����.,:�@L�N8��A*��%�w%� y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y- �B��TZ(�*�geWf�͉�9���+��̳�ې7�����ᒶ��KW-X潬j9�������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n �ڴ �V����E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa��n��{��4���[���>ɾ�UUM�f�e�I���?�������m]�Nmq����#�׹���=TR��+�G�����w- 6 U����#pDy��� �� :�v�{���vg/jB��F�S��[b[�O�>����z�G��499�?r����C�d�&����ˮ/~�����јѡ�򗓿m|������������x31^�V���w�w��O�| (�h���SЧ��������c3-� cHRMz%������u0�`:�o�_�F5IDATx��ytUս�?�;���fN$$��@B�!�k��� -*�gE���j�O�kQ�ʠ`U�B_ �AÐ0%�Ȕ�@r3ޛ;߳��$�@��v����^�s����������$��ߢ !�W��5�̱'-٘������4�>�Rƫ$�G��0U�H}�_ _� #��k�MJ/=�9Du *ڲ�k�PQ;0��j|�*�$�^컂脛y���>�z×� B��� ��(�:$�ʔ_�6��C!B����MVx��a��ζyY����j��ƋY2�9�F�{r��r�딟F��Q��hY6��� x��[l��RC��������nt@��;P��3��� F�w��7��:�P���ɋ'���mj���Bƪ�$�Q�L��y��߷g��\���z����v5�p�v$�v櫻�`6~K �Y�X����,�:��"�o�e0II"(��,������l_�C���/4�+f�E�!q��:����u����c��樼.UE�@� �]K�W���$-�h]�JG���Dz)�`��.�A/ ���mᏣc�3jK� �!�>���$�Q�!�_�? \�C2(E �M$Z I{�U���s�ǣ���=��@Բe ޻��W�����@ �w����}�9v,)��.}*|"�s��di���,���G�]W�AC�������|<����[��ߕ������K�*�G nߴ!��‹��J�!��6(L�a)��Am��������;adf��:�xm��nh�;֦I��(���o�C~ډa?�=��s����h��E������xp����)���_���t��W�����´;8���`dz=(��@@�+,�;�`�fhl��XȌ�3,uI�~z(J����� �ZX�A����H'�À�㜦�82|��a�n�z2��I���� ���EY�h�ε<�0�q�{��C��v�˅��?"@��χ�x�WS+��N�~�KQ�J�8ل�� _.W��� !TU{�����,��"�� �;�������HI S� ��))�o�1�H�D� ���� (� ;����"Ҕ��,���� �F=���O��&�Ph>�`���y��߲ &S��P�<��'��1s�1cĂ�N����2)����@�u��tv��<�+�-&�����h��[!FSG���' � z z0��<����8d&�����E0�,��<��"!P�b4��� �{S�����X����.�囤���T��hEF��X�q0"-<����h���]�Py*����F⩍��@v�˂�Y08�� .q��a��s����(!<̫1�3�L�H��7sYW�`��qtu�\7��?�@�Y�� %Ka�x�GZ�*W�P��y�����N0r9��Z�c�%���q,��k�����!!,��>���IB��� �x1�Xu�Y���v-���ֺ��N������JP��a�2`�e5��w��u;�6�i���̃��(K���ťa��(l51��JL��O'%���]���ٖ뿉!��{*�p+f ���i8��D�ȑ���ܩ�M��V��ӟz��x�7Z�1i}�^͜���6e����x��)u�d�ˏ�V�eG�\�X1�����=n�U'�~Y����L�\,�(d!x ,�:�TW8� M`r���@��r+v�Q0��>^;˴�VbF��('����� �*O��i��j�Ӆ����^�S3&� ���{������.ی�� N;��NU%d0�Ce\r"�C�b��&t7N�7��� �ȪD�[%l�۪�$��'m?�A9tI�9>��NVL ��� 6v~M�����ъ�B���0����9$&=ώm��W�0���L���&��E���f�f��'+�9��hv��7,���M��6�D�&�^� �����8 D֮�����o��k^z��O��hP�8q�5d*��YVq3�{��������#LX4�?��jP=3�~�؅c�ݰ�̱�ұ��8̲��2�G�����j��έ�9��w7���U�X�w�85C��?!I&���o&����L���I#�^�eV�,�^t5�k� �xs˛\��U�8��."���{���ǵ�l4��ݼ�;��r"���G�/~���gJV�N糦��ZZ^k+NN�D��I$�=OE�z����|*�*{��%k���G��>�`9��b;�s���8,�qs��c��.b��q�%�>r��n�R�Ƨ�%�,�A��le#�8���}; 21�0�b�&�QX�f���q�00����$>�h�N�'�a3��A���/�r ��L5�8�GԲ'�����w;��c#�q1���h$*��V^�k��QĽ�b:i������� ����H F#�_���,��]g����Ը����`RUU���� ��"�qD���>-��ϤI�~��3�̴�����NZ[[555�eeek7�m����YF#[��Đ��R��i��L�H�r ��@��J-�Pŝ��_|�-��6y��ks�V�U~��6���w.����(��0A� 4��f��� /���C�xŊ�ٳ����z=6�����rg���mKo��o�/����a�g���?'9%9��P��斓��~���L{�� �H��{AW��B��$����v�1b�&Mb�ر��ر#�0`�`xMBp! )Z�Nmo�mZ�g�}�eذaWTVV ���'99��C5��&�&+5�bT>|8��PUUETT����&���t��~TE%��'������b�tEGG;RSS�S�N�v��ѯ��t����u1@�ޚ"f��͈���r'L�Ph��m��ƌ�74o��`�x�q�P���NRSS�X,�����l&&&��MFFA!-��`��ҷ�n��Yuu�����x<I�LB%����KԒ50�!�3�bz�����ʸKL���;---�l6[��`��������Ȏ;�����egg4��!D�T��jWujyZ��������K����%����p�^���X,6��sV=�ܖ����6�3�X ���4ҿ��A2�&����_k�;d�� �VfOIEND�B`� 0x0x
PHP 8.1.31
Preview: ftpquota Size: 32.20 KB
//sbin/ftpquota
#!/usr/bin/perl
# -------------------------------------------------------------------------
# Copyright (C) 2000-2017 TJ Saunders <tj@castaglia.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
# -------------------------------------------------------------------------

use strict;

use Fcntl qw(:flock);
use File::Basename qw(basename);
use Getopt::Long;
use IO::Seekable;

my $program = basename($0);
my $verbose = 0;

# These formats are highly dependent on the quota record definitions in
# mod_quotatab.h. Should those definitions change, these format strings will
# need to be adjusted accordingly.
my $limit_format = "Z81I1C1I1d3L3";
my $tally_format = "Z81I1d3L3";

# These sizes are determined by the sizes of the quota_limit_t and
# quota_tally_t structs (NOT using C's sizeof(), though -- alignment issues)
my $limit_reclen = 126;
my $tally_reclen = 121;

# the values for these variables is similarly dependent on the actual
# values defined in mod_quotatab.h
my $ALL_QUOTA = 10;
my $USER_QUOTA = 20;
my $GROUP_QUOTA = 30;
my $CLASS_QUOTA = 40;

my $HARD_LIMIT = 1;
my $SOFT_LIMIT = 2;

my $LIMIT_TABLE = 100;
my $TALLY_TABLE = 101;

my $LIMIT_MAGIC = hex(7626);
my $TALLY_MAGIC = hex(7644);

my $default_limit_table = "./ftpquota.limittab";
my $default_tally_table = "./ftpquota.tallytab";
my $default_name = "";
my $default_quota_type = $ALL_QUOTA;
my $default_limit_type = $HARD_LIMIT;
my $default_per_session = 0;
my $default_bytes_in = -1.0;
my $default_bytes_out = -1.0;
my $default_bytes_xfer = -1.0;
my $default_files_in = 0;
my $default_files_out = 0;
my $default_files_xfer = 0;

my $byte_units = "byte";

my %opts = ();
GetOptions(\%opts, 'Bu=n', 'bytes-upload=n', 'Bd=n', 'bytes-download=n',
  'Bt=n', 'bytes-xfer=n', 'Fu=n', 'files-upload=n', 'Fd=n', 'files-download=n',
  'Ft=n', 'files-xfer', 'L|limit-type=s', 'N|name=s', 'P|per-session',
  'Q|quota-type=s', 'help', 'table-path=s', 'units=s', 'verbose', 'type=s',
  'add-record', 'create-table', 'delete-record', 'show-records',
  'update-record');

usage() if (defined($opts{'help'}));

my ($table, $table_type);
my %record = ();

parse_options();

if (defined($opts{'add-record'})) {
  open_table();
  wlock_table();
  add_record();
  unlock_table();
  close_table();
  exit 0;
}

if (defined($opts{'create-table'})) {
  open_table();
  close_table();
  exit 0;
}

if (defined($opts{'delete-record'})) {
  open_table();
  wlock_table();
  delete_record();
  unlock_table();
  close_table();
  exit 0;
}

if (defined($opts{'show-records'})) {
  open_table();
  rlock_table();
  print_table();
  unlock_table();
  close_table();
  exit 0;
}

if (defined($opts{'update-record'})) {
  open_table();
  wlock_table();
  update_record();
  unlock_table();
  close_table();
  exit 0;
}

# if no operations have been specified, note this and exit
print STDOUT "$program: no operations to perform, exiting\n";

exit;

# -------------------------------------------------------------------------
sub add_record {
  print STDOUT "$program: adding record\n" if $verbose;

  my $add_quota_type;

  # first, find the matching record.  Note that this option requires
  # both --name and --quota-type

  if (!defined($opts{'Q'})) {
    print STDOUT "$program: --add-record requires --quota-type option\n";
    exit(1);

  } else {
    $add_quota_type = get_quota_type(quota_type => $opts{'Q'});
  }

  if ($add_quota_type != $ALL_QUOTA) {
    if (!defined($opts{'N'})) {
      print STDOUT "$program: --add-record requires --name option\n";
      exit(1);
    }
  }

  # now, see if there is a matching record already in the table
  if (find_record(name => $opts{'N'}, quota_type => $add_quota_type)) {
    print STDOUT "$program: unable to add record: matching record already exists\n";
    exit(1);
  }

  # move to the end of the table, and write the new record
  set_table_position(0, SEEK_END);

  my $formatted_record;

  if ($table_type == $LIMIT_TABLE) {
    $formatted_record = pack($limit_format,
      $record{'name'}, $record{'quota_type'},
      $record{'per_session'}, $record{'limit_type'},
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});

  } elsif ($table_type == $TALLY_TABLE) {

    $formatted_record = pack($tally_format,
      $record{'name'}, $record{'quota_type'},
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});
  }

  write_record(record => $formatted_record);
}

# -------------------------------------------------------------------------
sub check_table {
  my $data;

  print STDOUT "$program: checking table '$table'\n" if $verbose;

  sysread TABLE, $data, 4;

  # unpack what was read in
  my ($magic) = unpack("L", $data);

  if ($table_type == $LIMIT_TABLE) {

    if ($magic != $LIMIT_MAGIC) {
      print STDOUT "$program: bad header: $magic != $LIMIT_MAGIC\n" if
        $verbose;
      die "$program: mismatched table header, exiting\n";

    } else {
      print STDOUT "$program: table has correct header\n" if $verbose;
    }

  } elsif ($table_type == $TALLY_TABLE) {

    if ($magic != $TALLY_MAGIC) {
      print STDOUT "$program: bad header magics: $magic != $TALLY_MAGIC\n" if
        $verbose;
      die "$program: mismatched table header, exiting\n";

    } else {
     print STDOUT "$program: table has correct header\n" if $verbose;
    }
  }
}

# -------------------------------------------------------------------------
sub close_table {
  print STDOUT "$program: closing table '$table'\n" if $verbose;

  close(TABLE);
}

# -------------------------------------------------------------------------
sub delete_record {
  print STDOUT "$program: deleting record\n" if $verbose;

  my $delete_quota_type;

  # first, find the matching record.  Note that this option requires
  # both --name and --quota-type

  if (!defined($opts{'Q'})) {
    print STDOUT "$program: --delete-record requires --quota-type option\n";
    exit(1);

  } else {
    $delete_quota_type = get_quota_type(quota_type => $opts{'Q'});
  }

  if ($delete_quota_type != $ALL_QUOTA) {
    if (!defined($opts{'N'})) {
      print STDOUT "$program: --delete-record requires --name option\n";
      exit(1);
    }
  }

  # now, find the matching record in the table
  unless (find_record(name => $opts{'N'}, quota_type => $delete_quota_type)) {
    print STDOUT "$program: unable to delete record: no match found\n";
    exit(1);
  }
  rewind_record();

  print STDOUT "$program: modifying table '$table'\n" if $verbose;

  # first, record the current file position
  my $position = get_table_position();

  # next, advance past this record to be deleted, and read in the
  # rest of the file

  seek_record(1);

  my ($nrecords, @records) = read_table();

  # Rewind the previous position, and "delete" that record by simply
  # overwriting it.  Note that this approach works for file tables --
  # tables in other formats, such as SQL, will have a much easier time
  # deleting a quota record.

  set_table_position($position, SEEK_SET);

  if ($nrecords > 0) {
    for (my $i = 0; $i < $nrecords; $i++) {
      write_record(record => $records[$i]);
    }

    # Truncate the table
    truncate_table(len => get_table_position() - 4);

  } else {

    # Truncate the table
    truncate_table(len => $position - 4);
  }

  # done
  exit(0);
}

# -------------------------------------------------------------------------
sub find_record {
  my %args = @_;
  my $nrecords = 0;
 
  my $search_name = $args{'name'};
  my $search_quota_type = $args{'quota_type'};

  while (my $record = read_record()) {
    $nrecords++;

    my ($name, $quota_type, @junk);

    # unpack the binary record structure
    if ($table_type == $LIMIT_TABLE) {
      ($name, $quota_type, @junk) = unpack($limit_format, $record);

    } elsif ($table_type == $TALLY_TABLE) {
      ($name, $quota_type, @junk) = unpack($tally_format, $record);
    }

    # remove any NULs from $name
    $name =~ s/(\0*)?//;

    if ($search_quota_type == $ALL_QUOTA and
        $quota_type == $ALL_QUOTA) {
      return $record;

    } elsif ($name eq $search_name and
             $quota_type == $search_quota_type) {
      return $record;
    }
  }

  return undef;
}

# -------------------------------------------------------------------------
sub get_display_bytes {
  my %args = @_;

  my $bytes = $args{'bytes'};

  if ($byte_units eq "byte") {
    # no calculation necessary

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "bytes:\t%.2f", $bytes;
    } else {
      return sprintf "bytes:\tunlimited";
    }

  } elsif ($byte_units eq "kilo") {
    # divide by 1024.0
    my $adj_bytes = $bytes / 1024.0;

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "Kb:\t%.2f", $adj_bytes;
    } else {
      return sprintf "Kb:\tunlimited";
    }

  } elsif ($byte_units eq "mega") {
    # divide by 1024.0 * 1024.0
    my $adj_bytes = $bytes / (1024.0 * 1024.0);

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "Mb:\t%.2f", $adj_bytes;
    } else {
      return sprintf "Mb:\tunlimited";
    }

  } elsif ($byte_units eq "giga") {
    # divide by 1024.0 * 1024.0 * 1024.0
    my $adj_bytes = $bytes / (1024.0 * 1024.0 * 1024.0);

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "Gb:\t%.2f", $adj_bytes;
    } else {
      return sprintf "Gb:\tunlimited";
    }
  }
}

# -------------------------------------------------------------------------
sub get_quota_type {
  my %args = @_;

  my $quota_type = $args{'quota_type'};

  # given the command-line --quote-type option value, return the
  # corresponding numeric value

  if ($quota_type eq "all") {
    return $ALL_QUOTA;

  } elsif ($quota_type eq "user") {
    return $USER_QUOTA;

  } elsif ($quota_type eq "group") {
    return $GROUP_QUOTA;

  } elsif ($quota_type eq "class") {
    return $CLASS_QUOTA;

  } else {
    print STDERR "$program: unknown quota type: $quota_type\n";
    exit(1);
  }
}

# -------------------------------------------------------------------------
sub get_table_position {
  return sysseek(TABLE, 0, 1);
}

# -------------------------------------------------------------------------
sub open_table {

  # if the table doesn't exist, create it if requested
  if (defined($opts{'create-table'})) {
    die "$program: cannot create existing table\n" if (-e $table);

    print STDOUT "$program: creating new table\n" if $verbose;

    open(TABLE, "> $table") or
      die "$program: unable to create $table: $!\n";

    print STDOUT "$program: writing header for new table\n" if $verbose;

    # write out the identifying header for the table type
    if ($table_type == $LIMIT_TABLE) {
      syswrite TABLE, pack("L", $LIMIT_MAGIC);

    } elsif ($table_type == $TALLY_TABLE) {
      syswrite TABLE, pack("L", $TALLY_MAGIC);
    }

  } else {

    print STDOUT "$program: opening table '$table'\n" if $verbose;

    if (defined($opts{'show-records'})) {
      open(TABLE, "< $table") or
        die "$program: unable to open $table: $!\n";

    } else {
      open(TABLE, "+< $table") or
        die "$program: unable to open $table: $!\n";
    }

    check_table();
  }
}

# -------------------------------------------------------------------------
sub parse_options {

  $verbose = 1 if (defined($opts{'verbose'}));

  if (defined($opts{'type'})) {

    die "$program: unknown table type: $opts{'type'}\n" if
      ($opts{'type'} ne 'limit' and $opts{'type'} ne 'tally');

    if ($opts{'type'} eq 'limit') {
      $table_type = $LIMIT_TABLE;
      $table = $default_limit_table;
    }

    if ($opts{'type'} eq 'tally') {
      $table_type = $TALLY_TABLE;
      $table = $default_tally_table;
    }

  } else {
    die "$program: missing required --type parameter\n";
  }

  $table = $opts{'table-path'} if (defined($opts{'table-path'}));

  if (defined($opts{'N'})) {
    $record{'name'} = $opts{'N'};

    # make sure the name is not too long
    die "$program: name is too long, must be less than 80 characters\n"
      if (length($record{'name'}) >= 80);

  } else {
    $record{'name'} = $default_name;
  }

  if (defined($opts{'P'})) {
    $record{'per_session'} = 1;

  } else {
    $record{'per_session'} = $default_per_session;
  }

  if (defined($opts{'Q'})) {
    if ($opts{'Q'} eq "all") {
      $record{'quota_type'} = $ALL_QUOTA;

    } elsif ($opts{'Q'} eq "user") {
      $record{'quota_type'} = $USER_QUOTA;

      # it's an error if there's no -N option present as well
      unless (defined($opts{'N'})) {
        print STDOUT "$program: quota type \"user\" requires --name option\n";
        exit(1);
      }

    } elsif ($opts{'Q'} eq "group") {
      $record{'quota_type'} = $GROUP_QUOTA;

      # it's an error if there's no -N option present as well
      unless (defined($opts{'N'})) {
        print STDOUT "$program: quota type \"group\" requires --name option\n";
        exit(1);
      }

    } elsif ($opts{'Q'} eq "class") {
      $record{'quota_type'} = $CLASS_QUOTA;

      # it's an error if there's no -N option present as well
      unless (defined($opts{'N'})) {
        print STDOUT "$program: quota type \"class\" requires --name option\n";
        exit(1);
      }

    } else {
      print STDERR "$program: unknown quota type: $opts{'Q'}\n";
      exit(1);
    }

  } else {
    $record{'quota_type'} = $ALL_QUOTA;
  }

  if (defined($opts{'L'})) {
    if ($opts{'L'} eq "hard") {
      $record{'limit_type'} = $HARD_LIMIT;

    } elsif ($opts{'L'} eq "soft") {
      $record{'limit_type'} = $SOFT_LIMIT;
 
    } else {
      print STDERR "$program: unknown limit type: $opts{'L'}\n";
      exit(1);
    }

  } else {
    $record{'limit_type'} = $HARD_LIMIT;
  }

  # process the --units option, if present
  if (defined($opts{'units'})) {

    if ($opts{'units'} eq "B" or $opts{'units'} eq "byte") {
      $byte_units = "byte";

    } elsif ($opts{'units'} eq "Kb" or $opts{'units'} eq "kilo") {
      $byte_units = "kilo";

    } elsif ($opts{'units'} eq "Mb" or $opts{'units'} eq "mega") {
      $byte_units = "mega";

    } elsif ($opts{'units'} eq "Gb" or $opts{'units'} eq "giga") {
      $byte_units = "giga";

    } else {
      print STDERR "$program: unknown unit type: $opts{'units'}\n";
      exit(1);
    }
  }

  if (defined($opts{'Bu'}) || defined($opts{'bytes-upload'})) {
    if (defined($opts{'Bu'}) && defined($opts{'bytes-upload'})) {
      print STDOUT "$program: do not use both --Bu and --bytes-upload options\n";
      exit(1);
    }

    $record{'bytes_in'} = $opts{'Bu'} if (defined($opts{'Bu'}));
    $record{'bytes_in'} = $opts{'bytes-upload'} if
      (defined($opts{'bytes-upload'}));

    if ($record{'bytes_in'} <= 0.0) {
      print STDERR "$program: notice: upload bytes value '", $record{'bytes_in'}, "' means 'unlimited'\n";
    }

    if ($record{'bytes_in'} != $default_bytes_in) {
      if ($byte_units eq "kilo") {
        $record{'bytes_in'} = $record{'bytes_in'} * 1024.0;

      } elsif ($byte_units eq "mega") {
        $record{'bytes_in'} = $record{'bytes_in'} * 1024.0 * 1024.0;

      } elsif ($byte_units eq "giga") {
        $record{'bytes_in'} = $record{'bytes_in'} * 1024.0 * 1024.0 * 1024.0;
      }
    }

  } else {

    $record{'bytes_in'} = $default_bytes_in if ($table_type == $LIMIT_TABLE);
    $record{'bytes_in'} = 0.0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Bd'}) || defined($opts{'bytes-download'})) {
    if (defined($opts{'Bd'}) && defined($opts{'bytes-download'})) {
      print STDOUT "$program: do not use both --Bd and --bytes-download options\n";
      exit(1);
    }

    $record{'bytes_out'} = $opts{'Bd'} if (defined($opts{'Bd'}));
    $record{'bytes_out'} = $opts{'bytes-download'} if
      (defined($opts{'bytes-download'}));

    if ($record{'bytes_out'} <= 0.0) {
      print STDERR "$program: notice: download bytes value '", $record{'bytes_out'}, "' means 'unlimited'\n";
    }

    if ($record{'bytes_out'} != $default_bytes_out) {
      if ($byte_units eq "kilo") {
        $record{'bytes_out'} = $record{'bytes_out'} * 1024.0;

      } elsif ($byte_units eq "mega") {
        $record{'bytes_out'} = $record{'bytes_out'} * 1024.0 * 1024.0;

      } elsif ($byte_units eq "giga") {
        $record{'bytes_out'} = $record{'bytes_out'} * 1024.0 * 1024.0 * 1024.0;
      }
    }

  } else {

    $record{'bytes_out'} = $default_bytes_out if ($table_type == $LIMIT_TABLE);
    $record{'bytes_out'} = 0.0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Bx'}) || defined($opts{'bytes-xfer'})) {
    if (defined($opts{'Bx'}) && defined($opts{'bytes-xfer'})) {
      print STDOUT "$program: do not use both --Bx and --bytes-xfer options\n";
      exit(1);
    }

    $record{'bytes_xfer'} = $opts{'Bx'} if (defined($opts{'Bx'}));
    $record{'bytes_xfer'} = $opts{'bytes-xfer'} if
      (defined($opts{'bytes-xfer'}));

    if ($record{'bytes_xfer'} <= 0.0) {
      print STDERR "$program: notice: transfer bytes value '", $record{'bytes_xfer'}, "' means 'unlimited'\n";
    }

    if ($record{'bytes_xfer'} != $default_bytes_xfer) {
      if ($byte_units eq "kilo") {
        $record{'bytes_xfer'} = $record{'bytes_xfer'} * 1024.0;

      } elsif ($byte_units eq "mega") {
        $record{'bytes_xfer'} = $record{'bytes_xfer'} * 1024.0 * 1024.0;

      } elsif ($byte_units eq "giga") {
        $record{'bytes_xfer'} =
          $record{'bytes_xfer'} * 1024.0 * 1024.0 * 1024.0;
      }
    }

  } else {

    $record{'bytes_xfer'} = $default_bytes_xfer if
      ($table_type == $LIMIT_TABLE);
    $record{'bytes_xfer'} = 0.0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Fu'}) || defined($opts{'files-upload'})) {
    if (defined($opts{'Fu'}) && defined($opts{'files-upload'})) {
      print STDOUT "$program: do not use both --Fu and --files-upload options\n";
      exit(1);
    }

    $record{'files_in'} = $opts{'Fu'} if (defined($opts{'Fu'}));
    $record{'files_in'} = $opts{'files-upload'} if
      (defined($opts{'files-upload'}));

    if ($record{'files_in'} <= 0) {
      print STDERR "$program: notice: upload files value '", $record{'files_in'}, "' means 'unlimited'\n";
    }

  } else {

    $record{'files_in'} = $default_files_in if ($table_type == $LIMIT_TABLE);
    $record{'files_in'} = 0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Fd'}) || defined($opts{'files-download'})) {
    if (defined($opts{'Fd'}) && defined($opts{'files-download'})) {
      print STDOUT "$program: do not use both --Fd and --files-download options\n";
      exit(1);
    }

    $record{'files_out'} = $opts{'Fd'} if (defined($opts{'Fd'}));
    $record{'files_out'} = $opts{'files-download'} if
      (defined($opts{'files-download'}));

    if ($record{'files_out'} <= 0) {
      print STDERR "$program: notice: download files value '", $record{'files_out'}, "' means 'unlimited'\n";
    }

  } else {

    $record{'files_out'} = $default_files_out if ($table_type == $LIMIT_TABLE);
    $record{'files_out'} = 0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Fx'}) || defined($opts{'files-xfer'})) {
    if (defined($opts{'Fx'}) && defined($opts{'files-xfer'})) {
      print STDOUT "$program: do not use both --Fx and --files-xfer options\n";
      exit(1);
    }

    $record{'files_xfer'} = $opts{'Fx'} if (defined($opts{'Fx'}));
    $record{'files_xfer'} = $opts{'files-xfer'} if
      (defined($opts{'files-xfer'}));

    if ($record{'files_xfer'} <= 0) {
      print STDERR "$program: notice: transfer files value '", $record{'files_xfer'}, "' means 'unlimited'\n";
    }

  } else {

    $record{'files_xfer'} = $default_files_xfer if
      ($table_type == $LIMIT_TABLE);
    $record{'files_xfer'} = 0 if ($table_type == $TALLY_TABLE);
  }
}

# -------------------------------------------------------------------------
sub print_record {
  my %args = @_;

  my $record = $args{'record'};

  my ($name, $quota_type, $per_session, $limit_type, $bytes_in, $bytes_out,
    $bytes_xfer, $files_in, $files_out, $files_xfer);

  if ($table_type == $LIMIT_TABLE) {
    ($name, $quota_type, $per_session, $limit_type, $bytes_in, $bytes_out,
     $bytes_xfer, $files_in, $files_out, $files_xfer) = unpack($limit_format,
     $record);

  } elsif ($table_type == $TALLY_TABLE) {

    ($name, $quota_type, $bytes_in, $bytes_out, $bytes_xfer,
     $files_in, $files_out, $files_xfer) = unpack($tally_format, $record);
  }


  # make the symbolic values legible
  $quota_type = "All" if ($quota_type == $ALL_QUOTA);
  $quota_type = "User" if ($quota_type == $USER_QUOTA);
  $quota_type = "Group" if ($quota_type == $GROUP_QUOTA);
  $quota_type = "Class" if ($quota_type == $CLASS_QUOTA);

  if ($table_type == $LIMIT_TABLE) {
    $limit_type = "Hard" if ($limit_type == $HARD_LIMIT);
    $limit_type = "Soft" if ($limit_type == $SOFT_LIMIT);

    if ($per_session eq 1) {
      $per_session = "True";

    } else {
      $per_session = "False";
    }
  }

  # print "unlimited" if quota is unlimited, but only for limit tables
  if ($table_type == $LIMIT_TABLE) {
    $bytes_in = "unlimited" if ($bytes_in <= 0.0);
    $bytes_out = "unlimited" if ($bytes_out <= 0.0);
    $bytes_xfer = "unlimited" if ($bytes_xfer <= 0.0);

    $files_in = "unlimited" if ($files_in <= 0);
    $files_out = "unlimited" if ($files_out <= 0);
    $files_xfer = "unlimited" if ($files_xfer <= 0);
  }

  print STDOUT "-------------------------------------------\n";
  print STDOUT "  Name: $name\n";
  print STDOUT "  Quota Type: $quota_type\n";

  if ($table_type == $LIMIT_TABLE) {
    print STDOUT "  Per Session: $per_session\n";
    print STDOUT "  Limit Type: $limit_type\n";
  }

  print STDOUT "    Uploaded ", get_display_bytes('bytes' => $bytes_in), "\n";
  print STDOUT "    Downloaded ", get_display_bytes('bytes' => $bytes_out),
    "\n";
  print STDOUT "    Transferred ", get_display_bytes('bytes' => $bytes_xfer),
    "\n";

  print STDOUT "    Uploaded files:\t$files_in\n";
  print STDOUT "    Downloaded files:\t$files_out\n";
  print STDOUT "    Transferred files:\t$files_xfer\n";
}

# -------------------------------------------------------------------------
sub print_table {
  my $have_records = 0;

  while (my $record = read_record()) {
    $have_records = 1;
    print_record(record => $record);
  }
  print STDOUT "$program: (empty table)\n" unless ($have_records);

  # done
  exit(0);
}

# -------------------------------------------------------------------------
sub read_record {
  my $record;
  my $bread;

  if ($table_type == $LIMIT_TABLE) {
    $bread = sysread TABLE, $record, $limit_reclen;

  } elsif ($table_type == $TALLY_TABLE) {
    $bread = sysread TABLE, $record, $tally_reclen;
  }

  if ($bread) {
    return $record;

  } else {
    return undef;
  }
}

# -------------------------------------------------------------------------
sub read_table {
  my @records = ();
  my $nrecords_read = 0;

  # read from TABLE
  while (my $record = read_record()) {
    $nrecords_read++;
    push(@records, $record);
  }

  return ($nrecords_read, @records);
}

# -------------------------------------------------------------------------
sub rewind_record {
  if ($table_type == $LIMIT_TABLE) {
    sysseek TABLE, -$limit_reclen, 1;

  } elsif ($table_type == $TALLY_TABLE) {
    sysseek TABLE, -$tally_reclen, 1;
  }
}

# -------------------------------------------------------------------------
sub rlock_table {
  print STDOUT "$program: read-locking table '$table'\n" if $verbose;

  flock(TABLE, LOCK_SH);
}

# -------------------------------------------------------------------------
sub seek_record {
  my ($n) = @_;

  if ($table_type == $LIMIT_TABLE) {
    sysseek TABLE, $limit_reclen, $n;
  
  } elsif ($table_type == $TALLY_TABLE) {
    sysseek TABLE, $tally_reclen, $n;
  }
}

# -------------------------------------------------------------------------
sub set_table_position {
  my ($position, $whence) = @_;

  my $result = sysseek(TABLE, $position, $whence);

  print STDOUT "$program: set table position to $result\n" if $verbose;

  return $result;
}

# -------------------------------------------------------------------------
sub truncate_table {
  my %args = @_;

  my $length = $args{'len'};

  # don't forget about the header (4 bytes)
  truncate TABLE, $length + 4;
}

# -------------------------------------------------------------------------
sub unlock_table {
  print STDOUT "$program: unlocking table '$table'\n" if $verbose;

  flock(TABLE, LOCK_UN);
}

# -------------------------------------------------------------------------
sub update_record {
  my $current_record;
  my $search_quota_type;

  # first, find the matching record.  Note that this option requires
  # both --name and --quota-type

  if (!defined($opts{'Q'})) {
    print STDOUT "$program: --update-record requires --quota-type option\n";
    exit(1);

  } else {
    $search_quota_type = get_quota_type(quota_type => $opts{'Q'});
  }

  if ($search_quota_type != $ALL_QUOTA) {
    if (!defined($opts{'N'})) {
      print STDOUT "$program: --update-record requires --name option\n";
      exit(1);
    }
  }

  # now, find the matching record in the table
  open_table();
  unless ($current_record = find_record(name => $opts{'N'},
      quota_type => $search_quota_type)) {
    print STDOUT "$program: unable to update record: no match found\n";
    exit(1);
  }
  rewind_record();

  print STDOUT "$program: updating table '$table'\n" if $verbose;

  # now, adjust the current record with the updated values in the requested
  # record

  my ($name, $quota_type, $per_session, $limit_type, @junk);

  if ($table_type == $LIMIT_TABLE) { 
    ($name, $quota_type, $per_session, $limit_type,
      @junk) = unpack($limit_format, $current_record);

  } elsif ($table_type == $TALLY_TABLE) {

    ($name, $quota_type, @junk) = unpack($tally_format, $current_record);
  }

  my $formatted_record;

  if ($table_type == $LIMIT_TABLE) {
    $formatted_record = pack($limit_format, $name, $quota_type,
      $record{'per_session'}, $record{'limit_type'},
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});

  } elsif ($table_type == $TALLY_TABLE) {

    $formatted_record = pack($tally_format, $name, $quota_type,
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});
  }

  write_record(record => $formatted_record);

  # done
  exit(0);
}

# -------------------------------------------------------------------------
sub wlock_table {
  print STDOUT "$program: write-locking table '$table'\n" if $verbose;

  flock(TABLE, LOCK_EX);
}

# -------------------------------------------------------------------------
sub write_record {
  my %args = @_;
  my $record = $args{'record'};

  print STDOUT "$program: writing record\n" if $verbose;

  die "$program: error writing table: $!\n" unless
    syswrite TABLE, $record;
}

# -------------------------------------------------------------------------
sub usage {

  print STDOUT <<END_OF_USAGE;

usage: $program [options]

 The following options describe the type of operation to be performed:

  --add-record         Create a new record with the specified limits.  Any
                       limits left unspecified with have their default 
                       values.  This option requires the --name and 
                       --quota-type options.

  --create-table       Create the table if not present.  Used to initialize
                       a table.  The default limit table path is
                       "$default_limit_table".  The default tally table path is
                       "$default_tally_table".

  --delete-record      Deletes a quota record from the table.  This option
                       requires the --name and --quote-type options.

  --show-records       Prints out all of the quota records in the table in
                       a legible format.

  --update-record      Updates a quota record with the specified limits.  Any
                       limits left unspecified will be updated with their
                       default value.  This option requires the --name and
                       --quota-type options.

 The following option describes the type of table on which to operate:

  --type               Specifies a table type to use.  The allowable options
                       are: "limit" or "tally".  This is required.

 The following options are used to specify specific quota limits:

  --Bu                 Specifies the limit of the number of bytes that may be
  --bytes-upload       uploaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Bd                 Specifies the limit of the number of bytes that may be
  --bytes-download     downloaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Bx                 Specifies the limit of the number of bytes that may be
  --bytes-xfer         transferred.  Note that this total includes uploads,
                       downloads, AND directory listings.  Defaults to
                       -1 (unlimited).  Note that any value value less than or
                       equal to zero is treated as "unlimited".

  --Fu                 Specifies the limit of the number of files that may be
  --files-upload       uploaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Fd                 Specifies the limit of the number of files that may be
  --files-download     downloaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Fx                 Specifies the limit of the number of files that may be
  --files-xfer         transferred, including uploads and downloads.  Defaults
                       to -1 (unlimited).  Note that any value less than or
                       equal to zero is treated as "unlimited".

  -L                   Specifies the type of limit, "hard" or "soft", of
  --limit-type         the bytes limits.  If "hard", any uploaded files that
                       push the bytes used counter past the limit will be
                       automatically deleted; if "soft", those extra bytes
                       will be allowed, but future uploads will be denied.
                       This option only makes sense if --type is "limit".

  -N                   Specifies a name for the quota record.  This name
  --name               will be the user/login name, group name, or class
                       name, depending on the quota type.  This option
                       is ignored if the quota type specified is "all".

  -P
  --per-session        Specifies that the quota limit is to be applied only
                       to each session, rather than persisting across
                       sessions.  By default, quotas are persistent.

  -Q                   Specifies a "quota type" for this record, where
  --quota-type         the type means to which category of FTP users this
                       quota will apply.  The quota type must be one of:
                       "user", "group", "class", or "all".

 The following options are miscellaneous:

  --help               Displays this message.

  --table-path         Specifies the path to a quota table file to use.

  --units              Specifies whether to treats bytes as is, in kilobytes,
                       megabytes, or gigabytes.  Allowable options are:
                       "B" or "byte", "Kb" or "kilo", "Mb" or "mega",
                       and "Gb" or "giga".  Defaults to "byte".

  --verbose            Toggles more verbose information about the doings of
                       the tool as it works.

END_OF_USAGE

  exit 0;
}

# -------------------------------------------------------------------------

Directory Contents

Dirs: 0 × Files: 473
Name Size Perms Modified Actions
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
9.64 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
3.00 KB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
8.63 KB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
139 B lrwxr-xr-x 2019-06-17 23:55:38
Edit Download
14.38 KB lrwxr-xr-x 2020-02-25 17:13:45
Edit Download
860 B lrwxr-xr-x 2019-12-07 02:13:44
Edit Download
3.00 KB lrwxr-xr-x 2025-06-26 16:57:26
Edit Download
36.90 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
36.90 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
67.38 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
692.07 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
7.06 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
7.06 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
1.46 MB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
8.63 KB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
2.17 KB lrwxr-xr-x 2025-06-26 16:57:26
Edit Download
78.27 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
13.22 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
30.01 KB lrwxr-xr-x 2018-11-12 17:11:53
Edit Download
38.38 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
34.32 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
14.15 KB lrwxr-xr-x 2020-07-23 00:33:50
Edit Download
27.20 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
14.49 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
118.26 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
70.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
66.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
102.30 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
30.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
102.59 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
206.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
46.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
952 B lrwxr-xr-x 2011-04-26 15:10:00
Edit Download
66.20 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
62.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
58.20 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
42.34 KB lrwxr-xr-x 2019-09-05 10:38:40
Edit Download
60.34 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
60.34 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
54.63 KB lrwxr-xr-x 2020-02-13 20:44:42
Edit Download
1.51 KB lrwxr-xr-x 2020-02-04 13:11:12
Edit Download
844 B lrwxr-xr-x 2020-02-04 13:11:12
Edit Download
135.54 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
105.32 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
38.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
225.80 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
16.11 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
16.11 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
150.47 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
508.98 KB lrwxr-xr-x 2023-01-31 22:10:35
Edit Download
15.92 KB lrwxr-xr-x 2023-01-31 22:10:35
Edit Download
50.23 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
119.00 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
171.02 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
171.02 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
54.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
98.40 KB lrwxr-xr-x 2024-09-11 12:08:49
Edit Download
3.58 KB lrwxr-xr-x 2019-08-03 10:51:13
Edit Download
4.34 KB lrwxr-xr-x 2019-08-03 10:51:13
Edit Download
30.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
18.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
42.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
106.55 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
30.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
7.13 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
5.27 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
22.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
30.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
34.30 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
375.05 KB lrwxr-xr-x 2020-01-30 16:25:08
Edit Download
11.03 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
10.28 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
148.03 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
4.74 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
72.76 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
18.31 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
26.33 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
34.33 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
18.30 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
26.33 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
8.08 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
59.25 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
5.19 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
5.04 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
4.34 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
14.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
54.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
150.27 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
18.33 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
74.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
23.54 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
54.27 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.16 KB lrwxr-xr-x 2020-02-15 15:52:17
Edit Download
38.26 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
122.25 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
1.92 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
14.30 KB lrwxr-xr-x 2020-02-13 18:38:21
Edit Download
70.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
34.67 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
32.20 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
23.45 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
14.15 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
12.15 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
210.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
82.29 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
14.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
14.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
67.38 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
90.95 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
86.77 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
62.24 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
94.86 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
62.18 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
58.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
58.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
909.34 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
1.11 MB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
897.03 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
8.54 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
215.70 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
905.28 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
4.73 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
3.47 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
140.34 KB lrwxr-xr-x 2019-08-21 12:36:14
Edit Download
14.15 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
102.35 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
30.40 KB lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
1.02 MB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
1.55 MB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
2.58 KB lrwxr-xr-x 2019-12-07 02:13:44
Edit Download
60.23 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
16.64 KB lrwxr-xr-x 2019-06-21 18:56:55
Edit Download
597.62 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
6.89 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
6.89 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
62.92 KB lrwxr-xr-x 2020-02-13 19:39:57
Edit Download
34.38 KB lrwxr-xr-x 2020-02-13 19:39:57
Edit Download
18.15 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
394.10 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
410.30 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
366.29 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
5.16 KB lrwxr-xr-x 2016-09-29 18:33:24
Edit Download
30.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
15.39 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
13.99 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
26.38 KB lrwxr-xr-x 2020-02-13 18:38:21
Edit Download
46.16 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
387 B lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
1.00 MB lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
4.30 KB lrwxr-xr-x 2023-07-26 07:44:39
Edit Download
82.09 KB lrwxr-xr-x 2019-01-21 10:11:39
Edit Download
14.16 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
110.34 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
3.32 KB lrwxr-xr-x 2020-02-04 13:11:12
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
10.07 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
232.05 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
78.19 KB lrwxr-xr-x 2020-03-20 14:12:10
Edit Download
22.23 KB lrwxr-xr-x 2020-07-23 00:33:50
Edit Download
3.78 KB lrwxr-xr-x 2017-04-28 19:58:22
Edit Download
589.65 KB lrwxr-xr-x 2020-09-28 16:29:11
Edit Download
325.49 KB lrwxr-xr-x 2020-09-28 16:29:11
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
451.53 KB lrwxr-xr-x 2020-02-15 15:52:17
Edit Download
42.16 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
106.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
86.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
366.24 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
22.17 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
11.55 KB lrwxr-xr-x 2022-01-26 17:11:24
Edit Download
14.30 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
86.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
106.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.83 MB lrwxr-xr-x 2022-04-08 09:37:10
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
14.15 KB lrwxr-xr-x 2020-03-07 11:09:49
Edit Download
118.86 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
158.89 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
158.89 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
46.48 KB lrwxr-xr-x 2025-05-06 13:36:15
Edit Download
31.05 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
34.15 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
126.20 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
69.27 MB lrwxr-xr-x 2024-03-27 20:24:33
Edit Download
1.04 KB lrwxr-xr-x 2021-12-10 12:55:20
Edit Download
798 B lrwxr-xr-x 2024-06-28 16:59:34
Edit Download
98.80 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
18.30 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
1.50 MB lrwxr-xr-x 2024-04-23 15:42:29
Edit Download
1.67 MB lrwxr-xr-x 2024-04-23 15:42:29
Edit Download
14.30 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
58.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
42.26 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
34.26 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
78.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
54.26 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
2.18 KB lrwxr-xr-x 2019-07-20 15:43:51
Edit Download
2.45 KB lrwxr-xr-x 2021-11-02 14:33:46
Edit Download
14.45 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
19.86 KB lrwxr-xr-x 2021-09-17 06:05:34
Edit Download
42.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
42.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
2.82 KB lrwxr-xr-x 2020-08-12 00:15:04
Edit Download
14.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
18.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
14.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
4.07 KB lrwxr-xr-x 2019-06-25 22:04:32
Edit Download
86.25 KB lrwxr-xr-x 2020-12-01 15:18:05
Edit Download
14.23 KB lrwxr-xr-x 2020-12-01 15:18:05
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
4.55 MB lrwxr-xr-x 2025-03-25 18:57:03
Edit Download
5.41 MB lrwxr-xr-x 2025-03-13 18:12:52
Edit Download
7.11 KB lrwxr-xr-x 2020-03-27 07:44:39
Edit Download
7.11 KB lrwxr-xr-x 2020-03-27 07:44:39
Edit Download
6.24 KB lrwxr-xr-x 2020-03-27 07:44:39
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
146.41 KB lrwxr-xr-x 2020-11-02 10:02:17
Edit Download
543 B lrwxr-xr-x 2020-02-13 23:04:46
Edit Download
5.23 KB lrwxr-xr-x 2020-02-13 23:04:46
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
1.02 MB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
1.64 KB lrwxr-xr-x 2020-02-27 19:30:14
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
58.17 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
54.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
54.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
22.26 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
2.86 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
2.86 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
904 B lrwxr-xr-x 2019-12-07 02:13:44
Edit Download
66.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
58.55 KB lrwxr-xr-x 2023-12-05 05:16:50
Edit Download
58.55 KB lrwxr-xr-x 2023-12-05 05:16:50
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
710.20 KB lrwxr-xr-x 2022-05-03 08:48:35
Edit Download
48.29 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
46.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
78.24 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
66.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
3.23 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
3.21 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
9.04 KB lrwxr-xr-x 2019-06-21 18:56:55
Edit Download
14.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
14.07 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
14.13 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
138.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
190.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
885 B lrwxr-xr-x 2021-07-14 22:08:18
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
2.36 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
863.79 KB lrwxr-xr-x 2025-04-11 12:16:08
Edit Download
47.32 KB lrwxr-xr-x 2022-05-25 11:14:20
Edit Download
50.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
18.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
22.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
50.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
30.23 KB lrwxr-xr-x 2023-10-31 11:35:56
Edit Download
1.41 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
936 B lrwxr-xr-x 2023-12-05 05:16:50
Edit Download
529.45 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
1,019.76 KB lrwxr-xr-x 2024-02-08 13:08:41
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
126.23 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
106.55 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
106 B lrwxr-xr-x 2025-04-22 10:15:47
Edit Download
4.82 KB lrwxr-xr-x 2023-07-17 14:14:04
Edit Download
14.30 KB lrwxr-xr-x 2021-09-06 03:01:13
Edit Download
42.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
42.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
5.29 KB lrwxr-xr-x 2024-09-24 17:46:09
Edit Download
1.00 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
9.68 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
7.50 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
1.00 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
782 B lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
14.72 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
3.33 KB lrwxr-xr-x 2020-03-27 23:00:03
Edit Download
8.20 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
5.71 KB lrwxr-xr-x 2016-08-21 16:54:00
Edit Download
3.98 KB lrwxr-xr-x 2016-08-21 16:54:11
Edit Download
6.10 KB lrwxr-xr-x 2016-08-21 16:54:20
Edit Download
64 B lrwxr-xr-x 2022-12-02 15:20:54
Edit Download
301 B lrwxr-xr-x 2015-03-27 17:50:35
Edit Download
64 B lrwxr-xr-x 2022-12-02 15:20:54
Edit Download
470 B lrwxr-xr-x 2025-03-25 19:38:31
Edit Download
1.66 KB lrwxr-xr-x 2019-10-10 22:32:01
Edit Download
7.25 KB lrwxr-xr-x 2021-03-18 18:48:17
Edit Download
2.99 KB lrwxr-xr-x 2023-06-16 10:22:06
Edit Download
9.18 KB lrwxr-xr-x 2019-10-18 23:05:50
Edit Download
34.56 KB lrwxr-xr-x 2019-12-16 23:51:51
Edit Download
1.71 KB lrwxr-xr-x 2021-03-31 22:55:11
Edit Download
16.76 KB lrwxr-xr-x 2019-06-21 18:56:55
Edit Download
7.43 KB lrwxr-xr-x 2024-01-24 09:14:48
Edit Download
1.49 KB lrwxr-xr-x 2022-12-02 15:20:54
Edit Download
59.66 KB lrwxr-xr-x 2020-02-10 07:23:53
Edit Download
54.32 KB lrwxr-xr-x 2020-02-10 07:23:53
Edit Download
143.71 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
98.89 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
139.49 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
42.30 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.73 KB lrwxr-xr-x 2022-08-02 15:34:43
Edit Download
13.99 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
51.82 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
68.55 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
68.55 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
218.20 KB lrwxr-xr-x 2023-04-04 11:56:28
Edit Download
18.58 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
46.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.38 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
695 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
90.28 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
620.09 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
14.01 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
800 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
42.02 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
34.14 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
1.26 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
187.34 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
74.15 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
30.02 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
782 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
1.02 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
685 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
86.01 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
563.15 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
17.99 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
102.11 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
5.86 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
42.15 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
9.99 KB lrwxr-xr-x 2018-03-15 11:50:56
Edit Download
62.29 KB lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
114.34 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).
© 2026 0xNothings — Secure File Manager. All rights reserved. Built with ❤️ & Tailwind x Dark UI
Upload
https://weelorum.com/post-sitemap.xml 2026-06-12T09:08:42+00:00 https://weelorum.com/page-sitemap.xml 2026-07-23T13:01:23+00:00 https://weelorum.com/portfolio-sitemap.xml 2026-06-22T17:36:07+00:00 https://weelorum.com/category-sitemap.xml 2026-06-12T09:08:42+00:00 https://weelorum.com/post_tag-sitemap.xml 2026-01-27T20:15:41+00:00 https://weelorum.com/portfolio_technology-sitemap.xml 2026-03-01T20:04:38+00:00 https://weelorum.com/portfolio_industry-sitemap.xml 2026-03-01T20:04:38+00:00 https://weelorum.com/portfolio_service-sitemap.xml 2026-03-01T20:04:38+00:00 https://weelorum.com/author-sitemap.xml 2026-02-22T16:40:15+00:00