copyparty 1.16.3__py3-none-any.whl → 1.16.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- copyparty/__main__.py +2 -2
- copyparty/__version__.py +2 -2
- copyparty/httpcli.py +8 -11
- copyparty/tcpsrv.py +6 -6
- copyparty/up2k.py +9 -1
- copyparty/web/a/u2c.py +48 -4
- copyparty/web/browser.css.gz +0 -0
- copyparty/web/browser.js.gz +0 -0
- copyparty/web/deps/marked.js.gz +0 -0
- copyparty/web/svcs.html +0 -2
- copyparty/web/up2k.js.gz +0 -0
- {copyparty-1.16.3.dist-info → copyparty-1.16.5.dist-info}/METADATA +7 -2
- {copyparty-1.16.3.dist-info → copyparty-1.16.5.dist-info}/RECORD +17 -17
- {copyparty-1.16.3.dist-info → copyparty-1.16.5.dist-info}/LICENSE +0 -0
- {copyparty-1.16.3.dist-info → copyparty-1.16.5.dist-info}/WHEEL +0 -0
- {copyparty-1.16.3.dist-info → copyparty-1.16.5.dist-info}/entry_points.txt +0 -0
- {copyparty-1.16.3.dist-info → copyparty-1.16.5.dist-info}/top_level.txt +0 -0
    
        copyparty/__main__.py
    CHANGED
    
    | @@ -1075,7 +1075,7 @@ def add_cert(ap, cert_path): | |
| 1075 1075 | 
             
            def add_auth(ap):
         | 
| 1076 1076 | 
             
                ses_db = os.path.join(E.cfg, "sessions.db")
         | 
| 1077 1077 | 
             
                ap2 = ap.add_argument_group('IdP / identity provider / user authentication options')
         | 
| 1078 | 
            -
                ap2.add_argument("--idp-h-usr", metavar="HN", type=u, default="", help="bypass the copyparty authentication checks  | 
| 1078 | 
            +
                ap2.add_argument("--idp-h-usr", metavar="HN", type=u, default="", help="bypass the copyparty authentication checks if the request-header \033[33mHN\033[0m contains a username to associate the request with (for use with authentik/oauth/...)\n\033[1;31mWARNING:\033[0m if you enable this, make sure clients are unable to specify this header themselves; must be washed away and replaced by a reverse-proxy")
         | 
| 1079 1079 | 
             
                ap2.add_argument("--idp-h-grp", metavar="HN", type=u, default="", help="assume the request-header \033[33mHN\033[0m contains the groupname of the requesting user; can be referenced in config files for group-based access control")
         | 
| 1080 1080 | 
             
                ap2.add_argument("--idp-h-key", metavar="HN", type=u, default="", help="optional but recommended safeguard; your reverse-proxy will insert a secret header named \033[33mHN\033[0m into all requests, and the other IdP headers will be ignored if this header is not present")
         | 
| 1081 1081 | 
             
                ap2.add_argument("--idp-gsep", metavar="RE", type=u, default="|:;+,", help="if there are multiple groups in \033[33m--idp-h-grp\033[0m, they are separated by one of the characters in \033[33mRE\033[0m")
         | 
| @@ -1729,7 +1729,7 @@ def main(argv  = None)  : | |
| 1729 1729 | 
             
                    except:
         | 
| 1730 1730 | 
             
                        lprint("\nfailed to disable quick-edit-mode:\n" + min_ex() + "\n")
         | 
| 1731 1731 |  | 
| 1732 | 
            -
                if al.ansi:
         | 
| 1732 | 
            +
                if not al.ansi:
         | 
| 1733 1733 | 
             
                    al.wintitle = ""
         | 
| 1734 1734 |  | 
| 1735 1735 | 
             
                # propagate implications
         | 
    
        copyparty/__version__.py
    CHANGED
    
    
    
        copyparty/httpcli.py
    CHANGED
    
    | @@ -537,8 +537,14 @@ class HttpCli(object): | |
| 537 537 | 
             
                        except:
         | 
| 538 538 | 
             
                            pass
         | 
| 539 539 |  | 
| 540 | 
            +
                    self.pw = uparam.get("pw") or self.headers.get("pw") or bauth or cookie_pw
         | 
| 541 | 
            +
                    self.uname = (
         | 
| 542 | 
            +
                        self.asrv.sesa.get(self.pw)
         | 
| 543 | 
            +
                        or self.asrv.iacct.get(self.asrv.ah.hash(self.pw))
         | 
| 544 | 
            +
                        or "*"
         | 
| 545 | 
            +
                    )
         | 
| 546 | 
            +
             | 
| 540 547 | 
             
                    if self.args.idp_h_usr:
         | 
| 541 | 
            -
                        self.pw = ""
         | 
| 542 548 | 
             
                        idp_usr = self.headers.get(self.args.idp_h_usr) or ""
         | 
| 543 549 | 
             
                        if idp_usr:
         | 
| 544 550 | 
             
                            idp_grp = (
         | 
| @@ -583,20 +589,11 @@ class HttpCli(object): | |
| 583 589 | 
             
                                idp_grp = ""
         | 
| 584 590 |  | 
| 585 591 | 
             
                            if idp_usr in self.asrv.vfs.aread:
         | 
| 592 | 
            +
                                self.pw = ""
         | 
| 586 593 | 
             
                                self.uname = idp_usr
         | 
| 587 594 | 
             
                                self.html_head += "<script>var is_idp=1</script>\n"
         | 
| 588 595 | 
             
                            else:
         | 
| 589 596 | 
             
                                self.log("unknown username: [%s]" % (idp_usr), 1)
         | 
| 590 | 
            -
                                self.uname = "*"
         | 
| 591 | 
            -
                        else:
         | 
| 592 | 
            -
                            self.uname = "*"
         | 
| 593 | 
            -
                    else:
         | 
| 594 | 
            -
                        self.pw = uparam.get("pw") or self.headers.get("pw") or bauth or cookie_pw
         | 
| 595 | 
            -
                        self.uname = (
         | 
| 596 | 
            -
                            self.asrv.sesa.get(self.pw)
         | 
| 597 | 
            -
                            or self.asrv.iacct.get(self.asrv.ah.hash(self.pw))
         | 
| 598 | 
            -
                            or "*"
         | 
| 599 | 
            -
                        )
         | 
| 600 597 |  | 
| 601 598 | 
             
                    if self.args.ipu and self.uname == "*":
         | 
| 602 599 | 
             
                        self.uname = self.conn.ipu_iu[self.conn.ipu_nm.map(self.ip)]
         | 
    
        copyparty/tcpsrv.py
    CHANGED
    
    | @@ -399,17 +399,17 @@ class TcpSrv(object): | |
| 399 399 | 
             
                        if not netdevs:
         | 
| 400 400 | 
             
                            continue
         | 
| 401 401 |  | 
| 402 | 
            -
                         | 
| 403 | 
            -
                         | 
| 402 | 
            +
                        add = []
         | 
| 403 | 
            +
                        rem = []
         | 
| 404 404 | 
             
                        for k, v in netdevs.items():
         | 
| 405 405 | 
             
                            if k not in self.netdevs:
         | 
| 406 | 
            -
                                added = " | 
| 406 | 
            +
                                add.append("\n  added %s = %s" % (k, v))
         | 
| 407 407 | 
             
                        for k, v in self.netdevs.items():
         | 
| 408 408 | 
             
                            if k not in netdevs:
         | 
| 409 | 
            -
                                 | 
| 409 | 
            +
                                rem.append("\nremoved %s = %s" % (k, v))
         | 
| 410 410 |  | 
| 411 | 
            -
                        t = "network change detected:\ | 
| 412 | 
            -
                        self.log("tcpsrv", t. | 
| 411 | 
            +
                        t = "network change detected:\033[32m%s\033[33m%s"
         | 
| 412 | 
            +
                        self.log("tcpsrv", t % ("".join(add), "".join(rem)), 3)
         | 
| 413 413 | 
             
                        self.netdevs = netdevs
         | 
| 414 414 | 
             
                        self._distribute_netdevs()
         | 
| 415 415 |  | 
    
        copyparty/up2k.py
    CHANGED
    
    | @@ -3077,7 +3077,8 @@ class Up2k(object): | |
| 3077 3077 | 
             
                                    if cur:
         | 
| 3078 3078 | 
             
                                        dupe = (cj["prel"], cj["name"], cj["lmod"])
         | 
| 3079 3079 | 
             
                                        try:
         | 
| 3080 | 
            -
                                            self.dupesched[src] | 
| 3080 | 
            +
                                            if dupe not in self.dupesched[src]:
         | 
| 3081 | 
            +
                                                self.dupesched[src].append(dupe)
         | 
| 3081 3082 | 
             
                                        except:
         | 
| 3082 3083 | 
             
                                            self.dupesched[src] = [dupe]
         | 
| 3083 3084 |  | 
| @@ -4652,6 +4653,13 @@ class Up2k(object): | |
| 4652 4653 | 
             
                                t = "forgetting partial upload {} ({})"
         | 
| 4653 4654 | 
             
                                p = self._vis_job_progress(job)
         | 
| 4654 4655 | 
             
                                self.log(t.format(wark, p))
         | 
| 4656 | 
            +
             | 
| 4657 | 
            +
                            src = djoin(ptop, vrem)
         | 
| 4658 | 
            +
                            zi = len(self.dupesched.pop(src, []))
         | 
| 4659 | 
            +
                            if zi:
         | 
| 4660 | 
            +
                                t = "...and forgetting %d links in dupesched"
         | 
| 4661 | 
            +
                                self.log(t % (zi,))
         | 
| 4662 | 
            +
             | 
| 4655 4663 | 
             
                            assert wark
         | 
| 4656 4664 | 
             
                            del reg[wark]
         | 
| 4657 4665 |  | 
    
        copyparty/web/a/u2c.py
    CHANGED
    
    | @@ -1,8 +1,8 @@ | |
| 1 1 | 
             
            #!/usr/bin/env python3
         | 
| 2 2 | 
             
            from __future__ import print_function, unicode_literals
         | 
| 3 3 |  | 
| 4 | 
            -
            S_VERSION = "2. | 
| 5 | 
            -
            S_BUILD_DT = "2024- | 
| 4 | 
            +
            S_VERSION = "2.7"
         | 
| 5 | 
            +
            S_BUILD_DT = "2024-12-06"
         | 
| 6 6 |  | 
| 7 7 | 
             
            """
         | 
| 8 8 | 
             
            u2c.py: upload to copyparty
         | 
| @@ -1031,8 +1031,8 @@ class Ctl(object): | |
| 1031 1031 | 
             
                        handshake(self.ar, file, False)
         | 
| 1032 1032 |  | 
| 1033 1033 | 
             
                def _fancy(self):
         | 
| 1034 | 
            +
                    atexit.register(self.cleanup_vt100)
         | 
| 1034 1035 | 
             
                    if VT100 and not self.ar.ns:
         | 
| 1035 | 
            -
                        atexit.register(self.cleanup_vt100)
         | 
| 1036 1036 | 
             
                        ss.scroll_region(3)
         | 
| 1037 1037 |  | 
| 1038 1038 | 
             
                    Daemon(self.hasher)
         | 
| @@ -1040,6 +1040,7 @@ class Ctl(object): | |
| 1040 1040 | 
             
                        Daemon(self.handshaker)
         | 
| 1041 1041 | 
             
                        Daemon(self.uploader)
         | 
| 1042 1042 |  | 
| 1043 | 
            +
                    last_sp = -1
         | 
| 1043 1044 | 
             
                    while True:
         | 
| 1044 1045 | 
             
                        with self.exit_cond:
         | 
| 1045 1046 | 
             
                            self.exit_cond.wait(0.07)
         | 
| @@ -1078,6 +1079,12 @@ class Ctl(object): | |
| 1078 1079 | 
             
                        else:
         | 
| 1079 1080 | 
             
                            txt = " "
         | 
| 1080 1081 |  | 
| 1082 | 
            +
                        if not VT100:  # OSC9;4 (taskbar-progress)
         | 
| 1083 | 
            +
                            sp = int(self.up_b * 100 / self.nbytes) or 1
         | 
| 1084 | 
            +
                            if last_sp != sp:
         | 
| 1085 | 
            +
                                last_sp = sp
         | 
| 1086 | 
            +
                                txt += "\033]9;4;1;%d\033\\" % (sp,)
         | 
| 1087 | 
            +
             | 
| 1081 1088 | 
             
                        if not self.up_br:
         | 
| 1082 1089 | 
             
                            spd = self.hash_b / ((time.time() - self.t0) or 1)
         | 
| 1083 1090 | 
             
                            eta = (self.nbytes - self.hash_b) / (spd or 1)
         | 
| @@ -1095,6 +1102,8 @@ class Ctl(object): | |
| 1095 1102 | 
             
                        tail = "\033[K\033[u" if VT100 and not self.ar.ns else "\r"
         | 
| 1096 1103 |  | 
| 1097 1104 | 
             
                        t = "%s eta @ %s/s, %s, %d# left\033[K" % (self.eta, spd, sleft, nleft)
         | 
| 1105 | 
            +
                        if not self.hash_b:
         | 
| 1106 | 
            +
                            t = " now hashing..."
         | 
| 1098 1107 | 
             
                        eprint(txt + "\033]0;{0}\033\\\r{0}{1}".format(t, tail))
         | 
| 1099 1108 |  | 
| 1100 1109 | 
             
                    if self.ar.wlist:
         | 
| @@ -1115,7 +1124,10 @@ class Ctl(object): | |
| 1115 1124 | 
             
                        handshake(self.ar, file, False)
         | 
| 1116 1125 |  | 
| 1117 1126 | 
             
                def cleanup_vt100(self):
         | 
| 1118 | 
            -
                     | 
| 1127 | 
            +
                    if VT100:
         | 
| 1128 | 
            +
                        ss.scroll_region(None)
         | 
| 1129 | 
            +
                    else:
         | 
| 1130 | 
            +
                        eprint("\033]9;4;0\033\\")
         | 
| 1119 1131 | 
             
                    eprint("\033[J\033]0;\033\\")
         | 
| 1120 1132 |  | 
| 1121 1133 | 
             
                def cb_hasher(self, file, ofs):
         | 
| @@ -1536,6 +1548,38 @@ source file/folder selection uses rsync syntax, meaning that: | |
| 1536 1548 | 
             
                        except:
         | 
| 1537 1549 | 
             
                            pass
         | 
| 1538 1550 |  | 
| 1551 | 
            +
                # msys2 doesn't uncygpath absolute paths with whitespace
         | 
| 1552 | 
            +
                if not VT100:
         | 
| 1553 | 
            +
                    zsl = []
         | 
| 1554 | 
            +
                    for fn in ar.files:
         | 
| 1555 | 
            +
                        if re.search("^/[a-z]/", fn):
         | 
| 1556 | 
            +
                            fn = r"%s:\%s" % (fn[1:2], fn[3:])
         | 
| 1557 | 
            +
                        zsl.append(fn.replace("/", "\\"))
         | 
| 1558 | 
            +
                    ar.files = zsl
         | 
| 1559 | 
            +
             | 
| 1560 | 
            +
                fok = []
         | 
| 1561 | 
            +
                fng = []
         | 
| 1562 | 
            +
                for fn in ar.files:
         | 
| 1563 | 
            +
                    if os.path.exists(fn):
         | 
| 1564 | 
            +
                        fok.append(fn)
         | 
| 1565 | 
            +
                    elif VT100:
         | 
| 1566 | 
            +
                        fng.append(fn)
         | 
| 1567 | 
            +
                    else:
         | 
| 1568 | 
            +
                        # windows leaves glob-expansion to the invoked process... okayyy let's get to work
         | 
| 1569 | 
            +
                        from glob import glob
         | 
| 1570 | 
            +
             | 
| 1571 | 
            +
                        fns = glob(fn)
         | 
| 1572 | 
            +
                        if fns:
         | 
| 1573 | 
            +
                            fok.extend(fns)
         | 
| 1574 | 
            +
                        else:
         | 
| 1575 | 
            +
                            fng.append(fn)
         | 
| 1576 | 
            +
             | 
| 1577 | 
            +
                if fng:
         | 
| 1578 | 
            +
                    t = "some files/folders were not found:\n  %s"
         | 
| 1579 | 
            +
                    raise Exception(t % ("\n  ".join(fng),))
         | 
| 1580 | 
            +
             | 
| 1581 | 
            +
                ar.files = fok
         | 
| 1582 | 
            +
             | 
| 1539 1583 | 
             
                if ar.drd:
         | 
| 1540 1584 | 
             
                    ar.dr = True
         | 
| 1541 1585 |  | 
    
        copyparty/web/browser.css.gz
    CHANGED
    
    | Binary file | 
    
        copyparty/web/browser.js.gz
    CHANGED
    
    | Binary file | 
    
        copyparty/web/deps/marked.js.gz
    CHANGED
    
    | Binary file | 
    
        copyparty/web/svcs.html
    CHANGED
    
    | @@ -53,7 +53,6 @@ | |
| 53 53 | 
             
                            {% if s %}
         | 
| 54 54 | 
             
                            <li>running <code>rclone mount</code> on LAN (or just dont have valid certificates)? add <code>--no-check-certificate</code></li>
         | 
| 55 55 | 
             
                            {% endif %}
         | 
| 56 | 
            -
                            <li>running <code>rclone mount</code> as root? add <code>--allow-other</code></li>
         | 
| 57 56 | 
             
                            <li>old version of rclone? replace all <code>=</code> with <code> </code> (space)</li>
         | 
| 58 57 | 
             
                        </ul>
         | 
| 59 58 |  | 
| @@ -137,7 +136,6 @@ | |
| 137 136 | 
             
                            {% if args.ftps %}
         | 
| 138 137 | 
             
                            <li>running on LAN (or just dont have valid certificates)? add <code>no_check_certificate=true</code> to the config command</li>
         | 
| 139 138 | 
             
                            {% endif %}
         | 
| 140 | 
            -
                            <li>running <code>rclone mount</code> as root? add <code>--allow-other</code></li>
         | 
| 141 139 | 
             
                            <li>old version of rclone? replace all <code>=</code> with <code> </code> (space)</li>
         | 
| 142 140 | 
             
                        </ul>
         | 
| 143 141 | 
             
                        <p>if you want to use the native FTP client in windows instead (please dont), press <code>win+R</code> and run this command:</p>
         | 
    
        copyparty/web/up2k.js.gz
    CHANGED
    
    | Binary file | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            Metadata-Version: 2.1
         | 
| 2 2 | 
             
            Name: copyparty
         | 
| 3 | 
            -
            Version: 1.16. | 
| 3 | 
            +
            Version: 1.16.5
         | 
| 4 4 | 
             
            Summary:   Portable file server with accelerated resumable uploads, deduplication, WebDAV, FTP, zeroconf, media indexer, video thumbnails, audio transcoding, and write-only folders
         | 
| 5 5 | 
             
            Author-email: ed <copyparty@ocv.me>
         | 
| 6 6 | 
             
            License: MIT
         | 
| @@ -394,6 +394,9 @@ same order here too | |
| 394 394 |  | 
| 395 395 | 
             
            * [Chrome issue 1352210](https://bugs.chromium.org/p/chromium/issues/detail?id=1352210) -- plaintext http may be faster at filehashing than https (but also extremely CPU-intensive)
         | 
| 396 396 |  | 
| 397 | 
            +
            * [Chrome issue 383568268](https://issues.chromium.org/issues/383568268) -- filereaders in webworkers can OOM / crash the browser-tab
         | 
| 398 | 
            +
              * copyparty has a workaround which seems to work well enough
         | 
| 399 | 
            +
             | 
| 397 400 | 
             
            * [Firefox issue 1790500](https://bugzilla.mozilla.org/show_bug.cgi?id=1790500) -- entire browser can crash after uploading ~4000 small files
         | 
| 398 401 |  | 
| 399 402 | 
             
            * Android: music playback randomly stops due to [battery usage settings](#fix-unreliable-playback-on-android)
         | 
| @@ -1543,7 +1546,9 @@ replace copyparty passwords with oauth and such | |
| 1543 1546 |  | 
| 1544 1547 | 
             
            you can disable the built-in password-based login system, and instead replace it with a separate piece of software (an identity provider) which will then handle authenticating / authorizing of users; this makes it possible to login with passkeys / fido2 / webauthn / yubikey / ldap / active directory / oauth / many other single-sign-on contraptions
         | 
| 1545 1548 |  | 
| 1546 | 
            -
            a  | 
| 1549 | 
            +
            * the regular config-defined users will be used as a fallback for requests which don't include a valid (trusted) IdP username header
         | 
| 1550 | 
            +
             | 
| 1551 | 
            +
            some popular identity providers are [Authelia](https://www.authelia.com/) (config-file based) and [authentik](https://goauthentik.io/) (GUI-based, more complex)
         | 
| 1547 1552 |  | 
| 1548 1553 | 
             
            there is a [docker-compose example](./docs/examples/docker/idp-authelia-traefik) which is hopefully a good starting point (alternatively see [./docs/idp.md](./docs/idp.md) if you're the DIY type)
         | 
| 1549 1554 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            copyparty/__init__.py,sha256=iRCNvMPg6k9WG_O2uCtlkD4vWogH8EgP9elp9XwSIJs,2610
         | 
| 2 | 
            -
            copyparty/__main__.py,sha256= | 
| 3 | 
            -
            copyparty/__version__.py,sha256= | 
| 2 | 
            +
            copyparty/__main__.py,sha256=QMgJweEFGzSHpKE54CcJe2sIHwwa8Kf3NRQqch58h0Q,113241
         | 
| 3 | 
            +
            copyparty/__version__.py,sha256=qn_oNmlkJlFLhCQtoyBt5ojEXnzjKAyGucJ0Y9SRkSU,252
         | 
| 4 4 | 
             
            copyparty/authsrv.py,sha256=CIK5OKl38LehdAt4hidCMpsATdJhPABJPkJStpQpp9U,103405
         | 
| 5 5 | 
             
            copyparty/broker_mp.py,sha256=QdOXXvV2Xn6J0CysEqyY3GZbqxQMyWnTpnba-a5lMc0,4987
         | 
| 6 6 | 
             
            copyparty/broker_mpw.py,sha256=PpSS4SK3pItlpfD8OwVr3QmJEPKlUgaf2nuMOozixgU,3347
         | 
| @@ -11,7 +11,7 @@ copyparty/cfg.py,sha256=UUmFpFbTm750Nv9RnofS80-FTpWT37EggEtmkE1wbxE,10374 | |
| 11 11 | 
             
            copyparty/dxml.py,sha256=lZpg-kn-kQsXRtNY1n6fRaS-b7uXzMCyv8ovKnhZcZc,1548
         | 
| 12 12 | 
             
            copyparty/fsutil.py,sha256=5CshJWO7CflfaRRNOb3JxghUH7W5rmS_HWNmKfx42MM,4538
         | 
| 13 13 | 
             
            copyparty/ftpd.py,sha256=T97SFS7JFtvRLbJX8C4fJSYwe13vhN3-E6emtlVmqLA,17608
         | 
| 14 | 
            -
            copyparty/httpcli.py,sha256= | 
| 14 | 
            +
            copyparty/httpcli.py,sha256=DRE8V3YxUk7YIBGSnmuH0px1ZSqtJciY15k1Rk8ThBI,207587
         | 
| 15 15 | 
             
            copyparty/httpconn.py,sha256=mQSgljh0Q-jyWjF4tQLrHbRKRe9WKl19kGqsGMsJpWo,6880
         | 
| 16 16 | 
             
            copyparty/httpsrv.py,sha256=PXLZlT6iuJZYG9ajNsAaNgRK3UtS4CrOGFGXOpkRtOk,18235
         | 
| 17 17 | 
             
            copyparty/ico.py,sha256=eWSxEae4wOCfheHl-m-wchYvFRAR_97kJDb4NGaB-Z8,3561
         | 
| @@ -26,12 +26,12 @@ copyparty/star.py,sha256=tV5BbX6AiQ7N4UU8DYtSTckNYeoeey4DBqq4LjfymbY,3818 | |
| 26 26 | 
             
            copyparty/sutil.py,sha256=JTMrQwcWH85hXB_cKG206eDZ967WZDGaP00AWvl_gB0,3214
         | 
| 27 27 | 
             
            copyparty/svchub.py,sha256=sAHkiPGzzKACLqKlem2V-bps9Xh-wHlcfwaNywxcd5A,40877
         | 
| 28 28 | 
             
            copyparty/szip.py,sha256=HFtnwOiBgx0HMLUf-h_T84zSlRijPxmhRo5PM613kRA,8602
         | 
| 29 | 
            -
            copyparty/tcpsrv.py,sha256= | 
| 29 | 
            +
            copyparty/tcpsrv.py,sha256=H7z9tzYRCm-kZwktnm_wP-v2MXaIOygx9yfdk1xkqRo,19889
         | 
| 30 30 | 
             
            copyparty/tftpd.py,sha256=FRCALO3PigoBlwUrqxoKHM_xk7wT2O0GPG1TvNRtjOY,13606
         | 
| 31 31 | 
             
            copyparty/th_cli.py,sha256=o6FMkerYvAXS455z3DUossVztu_nzFlYSQhs6qN6Jt8,4636
         | 
| 32 32 | 
             
            copyparty/th_srv.py,sha256=LBcB4LpsF-H7L52Z0Dhn9LogRjJVPp1GKa8MeIMIBnw,29596
         | 
| 33 33 | 
             
            copyparty/u2idx.py,sha256=kF4TE-j78Faq_f4vGh5So5raYDYLt2UDpza6yBA3f54,13687
         | 
| 34 | 
            -
            copyparty/up2k.py,sha256= | 
| 34 | 
            +
            copyparty/up2k.py,sha256=KQZcpqWRwjvmJLFEo3ejVWDroQi10jQdvgxuASDpUlY,174476
         | 
| 35 35 | 
             
            copyparty/util.py,sha256=UyaYXfVO4nOkqhSMi9SZn2zK2W9texb9CL9rsqMak8I,95135
         | 
| 36 36 | 
             
            copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 37 37 | 
             
            copyparty/bos/bos.py,sha256=Wb7eWsXJgR5AFlBR9ZOyKrLTwy-Kct9RrGiOu4Jo37Y,1622
         | 
| @@ -55,9 +55,9 @@ copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUu | |
| 55 55 | 
             
            copyparty/stolen/ifaddr/_shared.py,sha256=uNC4SdEIgdSLKvuUzsf1aM-H1Xrc_9mpLoOT43YukGs,6206
         | 
| 56 56 | 
             
            copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
         | 
| 57 57 | 
             
            copyparty/web/baguettebox.js.gz,sha256=_amC3ipOrXKEFz8DsVP-JEl49VjMQYiKyF78eWfG-uk,7965
         | 
| 58 | 
            -
            copyparty/web/browser.css.gz,sha256= | 
| 58 | 
            +
            copyparty/web/browser.css.gz,sha256=kurx_iA-KxLYx8PqJsn0bJVjkAxP-0YTOHSV9l_oouo,11645
         | 
| 59 59 | 
             
            copyparty/web/browser.html,sha256=KCkZ_LwzQnj9xhXKYptAxp6W3nVGiDoSJ4ioZDo7rQ0,4827
         | 
| 60 | 
            -
            copyparty/web/browser.js.gz,sha256= | 
| 60 | 
            +
            copyparty/web/browser.js.gz,sha256=7YbcHLByMAc71j3nKKUrCEExAzfenYnHPBSrnJ8iJFA,89833
         | 
| 61 61 | 
             
            copyparty/web/browser2.html,sha256=NRUZ08GH-e2YcGXcoz0UjYg6JIVF42u4IMX4HHwWTmg,1587
         | 
| 62 62 | 
             
            copyparty/web/cf.html,sha256=lJThtNFNAQT1ClCHHlivAkDGE0LutedwopXD62Z8Nys,589
         | 
| 63 63 | 
             
            copyparty/web/dbg-audio.js.gz,sha256=Ma-KZtK8LnmiwNvNKFKXMPYl_Nn_3U7GsJ6-DRWC2HE,688
         | 
| @@ -77,15 +77,15 @@ copyparty/web/shares.js.gz,sha256=emeY2-wjkh8x1JgaW6ny5fcC7XpZzZzfE1f-sEyntQ4,94 | |
| 77 77 | 
             
            copyparty/web/splash.css.gz,sha256=VxFqPvNdZtWb0u1C_GW2yYwrHq0lqPMitft9GYcv56k,1087
         | 
| 78 78 | 
             
            copyparty/web/splash.html,sha256=wc8El8_5BR3EMuVik8WYAkkEQ4S6-VepR1B1F8qAYgI,6190
         | 
| 79 79 | 
             
            copyparty/web/splash.js.gz,sha256=EEfsi9YGtPTYRB6MPX8Dfg4YyfqncI9ldJS7_MGVOhs,2710
         | 
| 80 | 
            -
            copyparty/web/svcs.html,sha256= | 
| 80 | 
            +
            copyparty/web/svcs.html,sha256=5cAp6RAkvqfDAbO9kxuDgXcmuDH20ZN2fse0uzCXb5s,11564
         | 
| 81 81 | 
             
            copyparty/web/svcs.js.gz,sha256=k81ZvZ3I-f4fMHKrNGGOgOlvXnCBz0mVjD-8mieoWCA,520
         | 
| 82 82 | 
             
            copyparty/web/ui.css.gz,sha256=v8U-1tetZzuzTpITjq8NWj1gg3jEiYDIIE8aE0dx63k,2800
         | 
| 83 | 
            -
            copyparty/web/up2k.js.gz,sha256= | 
| 83 | 
            +
            copyparty/web/up2k.js.gz,sha256=0keU0ljh9B41VsoVMpi-NtuYjtGl00xUgNH20CIbz8Y,23449
         | 
| 84 84 | 
             
            copyparty/web/util.js.gz,sha256=MMDIZbxzBwBYE5eYLzhGGpC7h257oEFZaBKZwJ4uhc8,15077
         | 
| 85 85 | 
             
            copyparty/web/w.hash.js.gz,sha256=l3GpSJD6mcU-1CRWkIj7PybgbjlfSr8oeO3vortIrQk,1105
         | 
| 86 86 | 
             
            copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 87 87 | 
             
            copyparty/web/a/partyfuse.py,sha256=9p5Hpg_IBiSimv7j9kmPhCGpy-FLXSRUOYnLjJ5JifU,28049
         | 
| 88 | 
            -
            copyparty/web/a/u2c.py,sha256= | 
| 88 | 
            +
            copyparty/web/a/u2c.py,sha256=1XcH5XfC2UuGrpTnLVHCe4KFU0Vl6uC02CZz04rvKOc,51612
         | 
| 89 89 | 
             
            copyparty/web/a/webdav-cfg.bat,sha256=Y4NoGZlksAIg4cBMb7KdJrpKC6Nx97onaTl6yMjaimk,1449
         | 
| 90 90 | 
             
            copyparty/web/dd/2.png,sha256=gJ14XFPzaw95L6z92fSq9eMPikSQyu-03P1lgiGe0_I,258
         | 
| 91 91 | 
             
            copyparty/web/dd/3.png,sha256=4lho8Koz5tV7jJ4ODo6GMTScZfkqsT05yp48EDFIlyg,252
         | 
| @@ -97,7 +97,7 @@ copyparty/web/deps/busy.mp3.gz,sha256=EVphk1_HYyRKJmtpeK99vbAstF7ub1f9ndu020H8PQ | |
| 97 97 | 
             
            copyparty/web/deps/easymde.css.gz,sha256=vWxfueI64rPikuqFj69wJBtGisqf93AheQtOZqgUI_c,3041
         | 
| 98 98 | 
             
            copyparty/web/deps/easymde.js.gz,sha256=rHBs4XWQe2bmv7ZzDIk43oxnTwrwpq5laYHhV5sKQQo,77014
         | 
| 99 99 | 
             
            copyparty/web/deps/fuse.py,sha256=6j4Zy3VpQg629pwwIW77v2LJ1hy-qlyrxwhXfKl9B7I,33426
         | 
| 100 | 
            -
            copyparty/web/deps/marked.js.gz,sha256= | 
| 100 | 
            +
            copyparty/web/deps/marked.js.gz,sha256=nay9sv1hlF9Y6ngXuXvE_O-MaTa7vE5OyK05-jjWx7M,22617
         | 
| 101 101 | 
             
            copyparty/web/deps/mini-fa.css.gz,sha256=CTPrNaH8OTVmxajrGP88E2MkjadY9_81TBVnd9sw9Y8,572
         | 
| 102 102 | 
             
            copyparty/web/deps/mini-fa.woff,sha256=L9DNncV2TIyvsrspMbJouvnnt7F068Hbn7YZYvN76AU,2784
         | 
| 103 103 | 
             
            copyparty/web/deps/prism.css.gz,sha256=Z_A6rJ3MN5KWnjvXaV787aTW_5DT-xjFd0YZ7_W-Krk,1468
         | 
| @@ -106,9 +106,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV | |
| 106 106 | 
             
            copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
         | 
| 107 107 | 
             
            copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
         | 
| 108 108 | 
             
            copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRTud2lU,7939
         | 
| 109 | 
            -
            copyparty-1.16. | 
| 110 | 
            -
            copyparty-1.16. | 
| 111 | 
            -
            copyparty-1.16. | 
| 112 | 
            -
            copyparty-1.16. | 
| 113 | 
            -
            copyparty-1.16. | 
| 114 | 
            -
            copyparty-1.16. | 
| 109 | 
            +
            copyparty-1.16.5.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
         | 
| 110 | 
            +
            copyparty-1.16.5.dist-info/METADATA,sha256=GZhzGQ_TCgJ9upH18-bjepyQPkFI5pK7EL64w7SWSD0,140992
         | 
| 111 | 
            +
            copyparty-1.16.5.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
         | 
| 112 | 
            +
            copyparty-1.16.5.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
         | 
| 113 | 
            +
            copyparty-1.16.5.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
         | 
| 114 | 
            +
            copyparty-1.16.5.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |