Libwebsockets and included programs are provided under the terms of the
MIT license shown below, with the exception that some sources are under
a similar permissive license like BSD, or are explicitly CC0 / public
domain to remove any obstacles from basing differently-licensed code on
them.

Original liberal license retained:

  - lib/misc/sha-1.c                     - 3-clause BSD license retained, link to original [BSD3]
  - win32port/zlib                       - ZLIB license (see zlib.h) [ZLIB]
  - lib/tls/mbedtls/wrapper              - Apache 2.0 (only built if linked against mbedtls) [APACHE2]
    lib/tls/mbedtls/mbedtls-extensions.c
  - lib/misc/base64-decode.c             - already MIT
  - lib/misc/ieeehalfprecision.c         - 2-clause BSD license retained [BSD2]

Relicensed to MIT:

  - lib/misc/daemonize.c               - relicensed from Public Domain to MIT,
                                         link to original Public Domain version
  - lib/plat/windows/windows-resolv.c  - relicensed from "Beerware v42" to MIT

Public Domain (CC-zero) to simplify reuse:

  - test-apps/*.c
  - test-apps/*.h
  - minimal-examples/*
  - lwsws/*

Although libwebsockets is available under a permissive license, it does not
change the reality of dealing with large lumps of external code... if your
copy diverges it is guaranteed to contain security problems after a while
and can be very painful to pick backports (especially since historically,
we are very hot on cleaning and refactoring the codebase).  The least
painful and lowest risk way remains sending your changes and fixes upstream
to us so you can easily use later releases and fixes.

## MIT License applied to libwebsockets

https://opensource.org/licenses/MIT 

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to
 deal in the Software without restriction, including without limitation the
 rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 IN THE SOFTWARE.

3D Slicer Contribution and Software License Agreement Version 1.0
applied to cmake/FindGit.cmake:

 3D Slicer Contribution and Software License Agreement ("Agreement")
 Version 1.0 (December 20, 2005)

 This Agreement covers contributions to and downloads from the 3D
 Slicer project ("Slicer") maintained by The Brigham and Women's
 Hospital, Inc. ("Brigham"). Part A of this Agreement applies to
 contributions of software and/or data to Slicer (including making
 revisions of or additions to code and/or data already in Slicer). Part
 B of this Agreement applies to downloads of software and/or data from
 Slicer. Part C of this Agreement applies to all transactions with
 Slicer. If you distribute Software (as defined below) downloaded from
 Slicer, all of the paragraphs of Part B of this Agreement must be
 included with and apply to such Software.

 Your contribution of software and/or data to Slicer (including prior
 to the date of the first publication of this Agreement, each a
 "Contribution") and/or downloading, copying, modifying, displaying,
 distributing or use of any software and/or data from Slicer
 (collectively, the "Software") constitutes acceptance of all of the
 terms and conditions of this Agreement. If you do not agree to such
 terms and conditions, you have no right to contribute your
 Contribution, or to download, copy, modify, display, distribute or use
 the Software.

 PART A. CONTRIBUTION AGREEMENT - License to Brigham with Right to
 Sublicense ("Contribution Agreement").

 1. As used in this Contribution Agreement, "you" means the individual
    contributing the Contribution to Slicer and the institution or
    entity which employs or is otherwise affiliated with such
    individual in connection with such Contribution.

 2. This Contribution Agreement applies to all Contributions made to
    Slicer, including without limitation Contributions made prior to
    the date of first publication of this Agreement. If at any time you
    make a Contribution to Slicer, you represent that (i) you are
    legally authorized and entitled to make such Contribution and to
    grant all licenses granted in this Contribution Agreement with
    respect to such Contribution; (ii) if your Contribution includes
    any patient data, all such data is de-identified in accordance with
    U.S. confidentiality and security laws and requirements, including
    but not limited to the Health Insurance Portability and
    Accountability Act (HIPAA) and its regulations, and your disclosure
    of such data for the purposes contemplated by this Agreement is
    properly authorized and in compliance with all applicable laws and
    regulations; and (iii) you have preserved in the Contribution all
    applicable attributions, copyright notices and licenses for any
    third party software or data included in the Contribution.

 3. Except for the licenses granted in this Agreement, you reserve all
    right, title and interest in your Contribution.

 4. You hereby grant to Brigham, with the right to sublicense, a
    perpetual, worldwide, non-exclusive, no charge, royalty-free,
    irrevocable license to use, reproduce, make derivative works of,
    display and distribute the Contribution. If your Contribution is
    protected by patent, you hereby grant to Brigham, with the right to
    sublicense, a perpetual, worldwide, non-exclusive, no-charge,
    royalty-free, irrevocable license under your interest in patent
    rights covering the Contribution, to make, have made, use, sell and
    otherwise transfer your Contribution, alone or in combination with
    any other code.

 5. You acknowledge and agree that Brigham may incorporate your
    Contribution into Slicer and may make Slicer available to members
    of the public on an open source basis under terms substantially in
    accordance with the Software License set forth in Part B of this
    Agreement. You further acknowledge and agree that Brigham shall
    have no liability arising in connection with claims resulting from
    your breach of any of the terms of this Agreement.

 6. YOU WARRANT THAT TO THE BEST OF YOUR KNOWLEDGE YOUR CONTRIBUTION
    DOES NOT CONTAIN ANY CODE THAT REQURES OR PRESCRIBES AN "OPEN
    SOURCE LICENSE" FOR DERIVATIVE WORKS (by way of non-limiting
    example, the GNU General Public License or other so-called
    "reciprocal" license that requires any derived work to be licensed
    under the GNU General Public License or other "open source
    license").

 PART B. DOWNLOADING AGREEMENT - License from Brigham with Right to
 Sublicense ("Software License").

 1. As used in this Software License, "you" means the individual
    downloading and/or using, reproducing, modifying, displaying and/or
    distributing the Software and the institution or entity which
    employs or is otherwise affiliated with such individual in
    connection therewith. The Brigham and Women?s Hospital,
    Inc. ("Brigham") hereby grants you, with right to sublicense, with
    respect to Brigham's rights in the software, and data, if any,
    which is the subject of this Software License (collectively, the
    "Software"), a royalty-free, non-exclusive license to use,
    reproduce, make derivative works of, display and distribute the
    Software, provided that:

 (a) you accept and adhere to all of the terms and conditions of this
 Software License;

 (b) in connection with any copy of or sublicense of all or any portion
 of the Software, all of the terms and conditions in this Software
 License shall appear in and shall apply to such copy and such
 sublicense, including without limitation all source and executable
 forms and on any user documentation, prefaced with the following
 words: "All or portions of this licensed product (such portions are
 the "Software") have been obtained under license from The Brigham and
 Women's Hospital, Inc. and are subject to the following terms and
 conditions:"

 (c) you preserve and maintain all applicable attributions, copyright
 notices and licenses included in or applicable to the Software;

 (d) modified versions of the Software must be clearly identified and
 marked as such, and must not be misrepresented as being the original
 Software; and

 (e) you consider making, but are under no obligation to make, the
 source code of any of your modifications to the Software freely
 available to others on an open source basis.

 2. The license granted in this Software License includes without
    limitation the right to (i) incorporate the Software into
    proprietary programs (subject to any restrictions applicable to
    such programs), (ii) add your own copyright statement to your
    modifications of the Software, and (iii) provide additional or
    different license terms and conditions in your sublicenses of
    modifications of the Software; provided that in each case your use,
    reproduction or distribution of such modifications otherwise
    complies with the conditions stated in this Software License.

 3. This Software License does not grant any rights with respect to
    third party software, except those rights that Brigham has been
    authorized by a third party to grant to you, and accordingly you
    are solely responsible for (i) obtaining any permissions from third
    parties that you need to use, reproduce, make derivative works of,
    display and distribute the Software, and (ii) informing your
    sublicensees, including without limitation your end-users, of their
    obligations to secure any such required permissions.

 4. The Software has been designed for research purposes only and has
    not been reviewed or approved by the Food and Drug Administration
    or by any other agency. YOU ACKNOWLEDGE AND AGREE THAT CLINICAL
    APPLICATIONS ARE NEITHER RECOMMENDED NOR ADVISED. Any
    commercialization of the Software is at the sole risk of the party
    or parties engaged in such commercialization. You further agree to
    use, reproduce, make derivative works of, display and distribute
    the Software in compliance with all applicable governmental laws,
    regulations and orders, including without limitation those relating
    to export and import control.

 5. The Software is provided "AS IS" and neither Brigham nor any
    contributor to the software (each a "Contributor") shall have any
    obligation to provide maintenance, support, updates, enhancements
    or modifications thereto. BRIGHAM AND ALL CONTRIBUTORS SPECIFICALLY
    DISCLAIM ALL EXPRESS AND IMPLIED WARRANTIES OF ANY KIND INCLUDING,
    BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR
    A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
    BRIGHAM OR ANY CONTRIBUTOR BE LIABLE TO ANY PARTY FOR DIRECT,
    INDIRECT, SPECIAL, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY ARISING IN ANY WAY
    RELATED TO THE SOFTWARE, EVEN IF BRIGHAM OR ANY CONTRIBUTOR HAS
    BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. TO THE MAXIMUM
    EXTENT NOT PROHIBITED BY LAW OR REGULATION, YOU FURTHER ASSUME ALL
    LIABILITY FOR YOUR USE, REPRODUCTION, MAKING OF DERIVATIVE WORKS,
    DISPLAY, LICENSE OR DISTRIBUTION OF THE SOFTWARE AND AGREE TO
    INDEMNIFY AND HOLD HARMLESS BRIGHAM AND ALL CONTRIBUTORS FROM AND
    AGAINST ANY AND ALL CLAIMS, SUITS, ACTIONS, DEMANDS AND JUDGMENTS
    ARISING THEREFROM.

 6. None of the names, logos or trademarks of Brigham or any of
    Brigham's affiliates or any of the Contributors, or any funding
    agency, may be used to endorse or promote products produced in
    whole or in part by operation of the Software or derived from or
    based on the Software without specific prior written permission
    from the applicable party.

 7. Any use, reproduction or distribution of the Software which is not
    in accordance with this Software License shall automatically revoke
    all rights granted to you under this Software License and render
    Paragraphs 1 and 2 of this Software License null and void.

 8. This Software License does not grant any rights in or to any
    intellectual property owned by Brigham or any Contributor except
    those rights expressly granted hereunder.

 PART C. MISCELLANEOUS

 This Agreement shall be governed by and construed in accordance with
 the laws of The Commonwealth of Massachusetts without regard to
 principles of conflicts of law. This Agreement shall supercede and
 replace any license terms that you may have agreed to previously with
 respect to Slicer.

## BSD2

```
 *  Redistribution and use in source and binary forms, with or without 
 *  modification, are permitted provided that the following conditions are 
 *  met:
 *
 *     * Redistributions of source code must retain the above copyright 
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright 
 *       notice, this list of conditions and the following disclaimer in 
 *       the documentation and/or other materials provided with the distribution
 *      
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 *  POSSIBILITY OF SUCH DAMAGE.
```

## BSD3

For convenience, a copy of the license on `./lib/misc/sha-1.c`.  In binary
distribution, this applies to builds with ws support enabled, and without
`LWS_WITHOUT_BUILTIN_SHA1` at cmake.

```
/*
 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the project nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH
```

## ZLIB

For convenience, a copy of the license on zlib.  In binary distribution,
this applies for win32 builds with internal zlib only.  You can avoid
building any zlib usage or copy at all with `-DLWS_WITH_ZLIB=0` (the
default), and so avoid needing to observe the license for binary
distribution that doesn't include the related code.

```
  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

  Jean-loup Gailly        Mark Adler
  jloup@gzip.org          madler@alumni.caltech.edu
```


## APACHE2

For convenience, a copy of the license on the mbedtls wrapper part.  In binary
distribution, this applies only when building lws against mbedtls.

The canonical license application to source files uses the URL reference, so the
whole is not reproduced here.

```
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at

//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
```

## CC0

For convenience,the full text of CC0 dedication found on the lws examples.
The intention of this is to dedicate the examples to the public domain, so
users can build off and modify them without any constraint.

```
Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.

For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:

    the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
    moral rights retained by the original author(s) and/or performer(s);
    publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
    rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
    rights protecting the extraction, dissemination, use and reuse of data in a Work;
    database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
    other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.

4. Limitations and Disclaimers.

    No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
    Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
    Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
    Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
```

