Showing preview only (1,333K chars total). Download the full file or copy to clipboard to get everything.
Repository: txthinking/brook
Branch: master
Commit: 5cd13ef3b1fb
Files: 136
Total size: 1.3 MB
Directory structure:
gitextract_3rf8zt24/
├── .github/
│ ├── CONTRIBUTING.md
│ ├── PULL_REQUEST_TEMPLATE
│ └── workflows/
│ └── static.yml
├── .gitignore
├── .travis.yml
├── LICENSE
├── OPENSOURCELICENSES
├── README.md
├── SECURITY.md
├── brooklink.go
├── cac.go
├── client.go
├── dhcpserver.go
├── dhcpserver_linux.go
├── dhcpserver_notlinux.go
├── dial.go
├── dnsclient.go
├── dnsserver.go
├── docs/
│ ├── CNAME
│ ├── index.html
│ └── static/
│ ├── fonts.js
│ ├── theme.css
│ └── vue-composition-api.prod.js
├── dohclient.go
├── dohserver.go
├── echoclient.go
├── echoserver.go
├── error.go
├── exchanger.go
├── go.mod
├── go.sum
├── init.go
├── limits/
│ ├── limits.go
│ └── limits_not.go
├── link.go
├── list.go
├── log.go
├── nat.go
├── nonce.go
├── pac.go
├── packetclient.go
├── packetconn.go
├── packetserver.go
├── packetserverconn.go
├── ping/
│ └── ping.json
├── plugins/
│ ├── block/
│ │ ├── block.go
│ │ └── readme.md
│ ├── dialwithdns/
│ │ ├── dialwithdns.go
│ │ └── readme.md
│ ├── dialwithip/
│ │ ├── dialwithip.go
│ │ └── readme.md
│ ├── dialwithnic/
│ │ ├── dialwithnic.go
│ │ └── readme.md
│ ├── logger/
│ │ ├── logger.go
│ │ ├── logger_unix.go
│ │ ├── logger_windows.go
│ │ └── readme.md
│ ├── pprof/
│ │ ├── pprof.go
│ │ └── readme.md
│ ├── prometheus/
│ │ ├── prometheus.go
│ │ └── readme.md
│ ├── readme.md
│ ├── socks5dial/
│ │ ├── dial.go
│ │ └── readme.md
│ └── thedns/
│ ├── readme.md
│ └── thedns.go
├── programmable/
│ ├── client/
│ │ ├── check_syntax.js
│ │ ├── example.tengo
│ │ └── readme.md
│ ├── dnsserver/
│ │ ├── check_syntax.js
│ │ ├── example.tengo
│ │ └── readme.md
│ ├── gallery.json
│ ├── modules/
│ │ ├── _footer.tengo
│ │ ├── _header.tengo
│ │ ├── allow_app.tengo
│ │ ├── blacklist_mode.tengo
│ │ ├── block_a.tengo
│ │ ├── block_aaaa.tengo
│ │ ├── block_ad_domain.tengo
│ │ ├── block_app.tengo
│ │ ├── block_google_secure_dns.tengo
│ │ ├── block_youtube_ad.tengo
│ │ ├── brooklinks.tengo
│ │ ├── bypass_app.tengo
│ │ ├── bypass_apple.tengo
│ │ ├── bypass_china_domain_a.tengo
│ │ ├── bypass_geo.tengo
│ │ ├── chatgpt_advanced_voice.tengo
│ │ ├── check_syntax.js
│ │ ├── douban.tengo
│ │ ├── hosts.tengo
│ │ ├── instagram_system_dns.tengo
│ │ ├── ios_app_downgrade.tengo
│ │ ├── ios_app_downgrade_history.tengo
│ │ ├── mitmproxy_client.tengo
│ │ ├── packet_capture.tengo
│ │ ├── readme.md
│ │ ├── redirect_google_cn.tengo
│ │ ├── response_sample.tengo
│ │ ├── sanguosha.tengo
│ │ ├── xbox.tengo
│ │ └── xiaohongshu.tengo
│ ├── readme.md
│ └── server/
│ ├── check_syntax.js
│ ├── example.tengo
│ └── readme.md
├── protocol/
│ ├── brook-link-protocol.md
│ ├── brook-quicserver-protocol.md
│ ├── brook-server-protocol.md
│ ├── brook-wsserver-protocol.md
│ ├── brook-wssserver-protocol.md
│ └── user.md
├── quic.go
├── quicclient.go
├── quicserver.go
├── relay.go
├── relayoverbrook.go
├── resolve.go
├── server.go
├── simplepacketclient.go
├── simplepacketserver.go
├── simplepacketserverconn.go
├── simplestreamclient.go
├── simplestreamserver.go
├── socks5.go
├── socks5test.go
├── socks5tohttp.go
├── streamclient.go
├── streamserver.go
├── test_test.go
├── util.go
├── waitreaderr.go
├── websocket.go
├── wsclient.go
└── wsserver.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CONTRIBUTING.md
================================================
### I want to create a PR.
1. Create an issue first
1. Don't use internal package
1. Don't use generics
1. Single function better than multiple functions
1. Single file better than multiple files
1. Single diretory better than multiple directories
1. Prefer struct and function to be exported.
1. Keep it simple, stupid
1. Create PR on `master` branch
================================================
FILE: .github/PULL_REQUEST_TEMPLATE
================================================
Fixes # .
Changes proposed in this pull request:
-
-
-
@mentions
================================================
FILE: .github/workflows/static.yml
================================================
# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages
on:
# Runs on pushes targeting the default branch
push:
branches: ["master"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# Single deploy job since we're just deploying
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
# Upload entire repository
path: './docs'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
================================================
FILE: .gitignore
================================================
.DS_Store
================================================
FILE: .travis.yml
================================================
language: go
sudo: false
os:
- linux
- osx
- windows
go:
- "1.16"
script:
- go test -v .
- cd cli/brook && go get -t -v . && go build .
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
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 3 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, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: OPENSOURCELICENSES
================================================
### cli
https://github.com/urfave/cli
MIT License
Copyright (c) 2016 Jeremy Saenz & Contributors
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.
### crypto
https://github.com/golang/crypto
Copyright (c) 2009 The Go Authors. All rights reserved.
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.
* Neither the name of Google Inc. 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 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.
### dhcp4
https://github.com/krolaw/dhcp4
Copyright (c) 2014 Skagerrak Software Limited. All rights reserved.
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.
* Neither the name of Skagerrak Software Limited 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 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.
### dns
https://github.com/miekg/dns
Copyright (c) 2009 The Go Authors. All rights reserved.
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.
* Neither the name of Google Inc. 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 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.
As this is fork of the official Go code the same license applies.
Extensions of the original work are copyright (c) 2011 Miek Gieben
### encrypt
https://github.com/txthinking/encrypt
The MIT License (MIT)
Copyright (c) 2013 Cloud <cloud@txthinking.com> http://www.txthinking.com
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
### go-cache
https://github.com/patrickmn/go-cache
Copyright (c) 2012-2017 Patrick Mylund Nielsen and the go-cache contributors
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.
### go-flutter
https://github.com/go-flutter-desktop/go-flutter
BSD 3-Clause License
Copyright (c) 2019, Pierre Champion
All rights reserved.
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.
* Neither the name of the copyright holder 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 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 HOLDER 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.
### go-tproxy
https://github.com/LiamHaworth/go-tproxy
MIT License
Copyright (c) 2017 Liam R. Haworth
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.
### gopacket
https://github.com/google/gopacket
Copyright (c) 2012 Google, Inc. All rights reserved.
Copyright (c) 2009-2011 Andreas Krennmair. All rights reserved.
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.
* Neither the name of Andreas Krennmair, Google, 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 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.
### gvisor
https://github.com/google/gvisor
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.
------------------
Some files carry the following license, noted at the top of each file:
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.
### minify
https://github.com/tdewolff/minify
Copyright (c) 2015 Taco de Wolff
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.
### mux
https://github.com/gorilla/mux
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
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.
* Neither the name of Google Inc. 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 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.
### negroni
https://github.com/urfave/negroni
The MIT License (MIT)
Copyright (c) 2014 Jeremy Saenz
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.
### net
https://github.com/golang/net
Copyright (c) 2009 The Go Authors. All rights reserved.
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.
* Neither the name of Google Inc. 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 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.
### socks5
https://github.com/txthinking/socks5
MIT License
Copyright (c) 2015-present Cloud <cloud@txthinking.com> https://www.txthinking.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
### qrterminal
https://github.com/mdp/qrterminal
Copyright 2019 Mark Percival <m@mdp.im>
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.
### water
https://github.com/songgao/water
Copyright (c) 2016, Song Gao <song@gao.io>
All rights reserved.
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.
* Neither the name of water 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 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 HOLDER 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.
### websocket
https://github.com/gorilla/websocket
Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved.
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 HOLDER 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.
### wintun.dll
Prebuilt Binaries License
-------------------------
1. DEFINITIONS. "Software" means the precise contents of the "wintun.dll"
files that are included in the .zip file that contains this document as
downloaded from wintun.net/builds.
2. LICENSE GRANT. WireGuard LLC grants to you a non-exclusive and
non-transferable right to use Software for lawful purposes under certain
obligations and limited rights as set forth in this agreement.
3. RESTRICTIONS. Software is owned and copyrighted by WireGuard LLC. It is
licensed, not sold. Title to Software and all associated intellectual
property rights are retained by WireGuard. You must not:
a. reverse engineer, decompile, disassemble, extract from, or otherwise
modify the Software;
b. modify or create derivative work based upon Software in whole or in
parts, except insofar as only the API interfaces of the "wintun.h" file
distributed alongside the Software (the "Permitted API") are used;
c. remove any proprietary notices, labels, or copyrights from the Software;
d. resell, redistribute, lease, rent, transfer, sublicense, or otherwise
transfer rights of the Software without the prior written consent of
WireGuard LLC, except insofar as the Software is distributed alongside
other software that uses the Software only via the Permitted API;
e. use the name of WireGuard LLC, the WireGuard project, the Wintun
project, or the names of its contributors to endorse or promote products
derived from the Software without specific prior written consent.
4. LIMITED WARRANTY. THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF
ANY KIND. WIREGUARD LLC HEREBY EXCLUDES AND DISCLAIMS ALL IMPLIED OR
STATUTORY WARRANTIES, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE, QUALITY, NON-INFRINGEMENT, TITLE, RESULTS,
EFFORTS, OR QUIET ENJOYMENT. THERE IS NO WARRANTY THAT THE PRODUCT WILL BE
ERROR-FREE OR WILL FUNCTION WITHOUT INTERRUPTION. YOU ASSUME THE ENTIRE
RISK FOR THE RESULTS OBTAINED USING THE PRODUCT. TO THE EXTENT THAT
WIREGUARD LLC MAY NOT DISCLAIM ANY WARRANTY AS A MATTER OF APPLICABLE LAW,
THE SCOPE AND DURATION OF SUCH WARRANTY WILL BE THE MINIMUM PERMITTED UNDER
SUCH LAW. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR
A PARTICULAR PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE
EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
5. LIMITATION OF LIABILITY. To the extent not prohibited by law, in no event
WireGuard LLC or any third-party-developer will be liable for any lost
revenue, profit or data or for special, indirect, consequential, incidental
or punitive damages, however caused regardless of the theory of liability,
arising out of or related to the use of or inability to use Software, even
if WireGuard LLC has been advised of the possibility of such damages.
Solely you are responsible for determining the appropriateness of using
Software and accept full responsibility for all risks associated with its
exercise of rights under this agreement, including but not limited to the
risks and costs of program errors, compliance with applicable laws, damage
to or loss of data, programs or equipment, and unavailability or
interruption of operations. The foregoing limitations will apply even if
the above stated warranty fails of its essential purpose. You acknowledge,
that it is in the nature of software that software is complex and not
completely free of errors. In no event shall WireGuard LLC or any
third-party-developer be liable to you under any theory for any damages
suffered by you or any user of Software or for any special, incidental,
indirect, consequential or similar damages (including without limitation
damages for loss of business profits, business interruption, loss of
business information or any other pecuniary loss) arising out of the use or
inability to use Software, even if WireGuard LLC has been advised of the
possibility of such damages and regardless of the legal or quitable theory
(contract, tort, or otherwise) upon which the claim is based.
6. TERMINATION. This agreement is affected until terminated. You may
terminate this agreement at any time. This agreement will terminate
immediately without notice from WireGuard LLC if you fail to comply with
the terms and conditions of this agreement. Upon termination, you must
delete Software and all copies of Software and cease all forms of
distribution of Software.
7. SEVERABILITY. If any provision of this agreement is held to be
unenforceable, this agreement will remain in effect with the provision
omitted, unless omission would frustrate the intent of the parties, in
which case this agreement will immediately terminate.
8. RESERVATION OF RIGHTS. All rights not expressly granted in this agreement
are reserved by WireGuard LLC. For example, WireGuard LLC reserves the
right at any time to cease development of Software, to alter distribution
details, features, specifications, capabilities, functions, licensing
terms, release dates, APIs, ABIs, general availability, or other
characteristics of the Software.
### wireguard-go
https://github.com/WireGuard/wireguard-go
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
### x
https://github.com/txthinking/x
The MIT License (MIT)
Copyright (c) 2013-present Cloud <cloud@txthinking.com> https://www.txthinking.com
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
### tengo
https://github.com/d5/tengo
MIT License
Copyright (c) 2019 Daniel Kang
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.
### iploc
https://github.com/phuslu/iploc
MIT License
Copyright (c) 2020 Phus Lu
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.
#### quic-go
https://github.com/quic-go/quic-go
MIT License
Copyright (c) 2016 the quic-go authors & Google, Inc.
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.
#### code_field
https://github.com/BertrandBev/code_field
MIT License
Copyright (c) 2021 Bertrand Bevillard
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.
#### xterm
https://github.com/TerminalStudio/xterm.dart
The MIT License (MIT)
Copyright (c) 2020 xuty
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.
================================================
FILE: README.md
================================================
# Brook
A cross-platform programmable network tool.
**Sponsor**: [Shiliew - Focuses on providing stable network services](https://www.txthinking.com/shiliew.html)
## Server
```
bash <(curl https://bash.ooo/nami.sh)
```
```
nami install brook
```
```
brook server -l :9999 -p hello
```
## Client
- [iOS](https://apps.apple.com/us/app/brook-network-tool/id1216002642)
- [Android](https://github.com/txthinking/brook/releases/latest/download/Brook.apk)
- [macOS](https://apps.apple.com/us/app/brook-network-tool/id1216002642)
- [About App Mode on macOS](https://www.txthinking.com/talks/articles/macos-app-mode-en.article)
- [Windows](https://github.com/txthinking/brook/releases/latest/download/Brook.msix)
- [Linux](https://github.com/txthinking/brook/releases/latest/download/Brook.bin)
- [How to install Brook on Linux](https://www.txthinking.com/talks/articles/linux-app-brook-en.article)
- [OpenWrt](https://www.txthinking.com/talks/articles/brook-openwrt-one-en.article)
> You may want to use `brook link` to customize some parameters
## Docs
https://www.txthinking.com/brook.html
## Brook Script Gallery
https://brook.app
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Reporting a Vulnerability
If you discover a security vulnerability, please send an e-mail to cloud@txthinking.com.
It would be much appreciated if the POC is directly included.
All security vulnerabilities will be promptly addressed.
================================================
FILE: brooklink.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"crypto/tls"
"crypto/x509"
"errors"
"io"
"net"
"net/url"
"os/exec"
"runtime"
"strconv"
"strings"
utls "github.com/refraction-networking/utls"
"github.com/txthinking/brook/limits"
"github.com/txthinking/socks5"
)
type BrookLink struct {
Kind string
Address string
Host string
Path string
Password []byte
V url.Values
Tc *tls.Config
TLSFingerprint utls.ClientHelloID
FragmentMinLength int64
FragmentMaxLength int64
FragmentMinDelay int64
FragmentMaxDelay int64
S5 *socks5.Server
Pcf *PacketConnFactory
TCPTimeout int
UDPTimeout int
}
func NewBrookLink(link string) (*BrookLink, error) {
var address, host, path string
kind, server, v, err := ParseLink(link)
if err != nil {
return nil, err
}
p := []byte(v.Get("password"))
if kind == "server" {
address = server
}
var tc *tls.Config
var tlsfingerprint utls.ClientHelloID
var fragmentMinLength int64
var fragmentMaxLength int64
var fragmentMinDelay int64
var fragmentMaxDelay int64
if kind == "socks5" || kind == "wsserver" || kind == "wssserver" || kind == "quicserver" {
u, err := url.Parse(server)
if err != nil {
return nil, err
}
host = u.Host
path = u.Path
if path == "" {
path = "/ws"
}
address = host
if kind == "wsserver" || kind == "wssserver" || kind == "quicserver" {
if v.Get("address") != "" {
address = v.Get("address")
}
}
if kind == "wssserver" || kind == "quicserver" {
h, _, err := net.SplitHostPort(u.Host)
if err != nil {
return nil, err
}
tc = &tls.Config{ServerName: h}
if v.Get("insecure") == "true" {
tc.InsecureSkipVerify = true
}
if v.Get("ca") != "" {
roots := x509.NewCertPool()
ok := roots.AppendCertsFromPEM([]byte(v.Get("ca")))
if !ok {
return nil, errors.New("failed to parse root certificate")
}
tc.RootCAs = roots
}
if kind == "wssserver" {
tc.NextProtos = []string{"http/1.1"}
}
if kind == "quicserver" {
tc.NextProtos = []string{"h3"}
}
}
if kind == "wsserver" || kind == "wssserver" || kind == "quicserver" {
if v.Get("withoutBrookProtocol") == "true" {
p, err = SHA256Bytes([]byte(v.Get("password")))
if err != nil {
return nil, err
}
}
}
if kind == "wssserver" {
if v.Get("tlsfingerprint") == "chrome" {
tlsfingerprint = utls.HelloChrome_Auto
}
if v.Get("fragment") != "" {
l := strings.Split(v.Get("fragment"), ":")
if len(l) == 4 {
fragmentMinLength, _ = strconv.ParseInt(l[0], 10, 64)
fragmentMaxLength, _ = strconv.ParseInt(l[1], 10, 64)
fragmentMinDelay, _ = strconv.ParseInt(l[2], 10, 64)
fragmentMaxDelay, _ = strconv.ParseInt(l[3], 10, 64)
}
}
}
}
return &BrookLink{
Kind: kind,
Address: address,
Host: host,
Path: path,
Password: p,
V: v,
Tc: tc,
TLSFingerprint: tlsfingerprint,
FragmentMinLength: fragmentMinLength,
FragmentMaxLength: fragmentMaxLength,
FragmentMinDelay: fragmentMinDelay,
FragmentMaxDelay: fragmentMaxDelay,
}, nil
}
func (blk *BrookLink) CreateExchanger(network, src string, dstb []byte, tcptimeout, udptimeout int) (Exchanger, net.Conn, error) {
if blk.Kind == "server" {
if network == "tcp" {
rc, err := DialTCP("tcp", "", blk.Address)
if err != nil {
return nil, nil, err
}
sc, err := NewStreamClient("tcp", blk.Password, src, rc, tcptimeout, dstb)
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
if blk.V.Get("udpovertcp") == "true" {
rc, err := NATDial("tcp", src, socks5.ToAddress(dstb[0], dstb[1:len(dstb)-2], dstb[len(dstb)-2:]), blk.Address)
if err != nil {
return nil, nil, err
}
sc, err := NewStreamClient("udp", blk.Password, src, rc, udptimeout, dstb)
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
rc, err := NATDial("udp", src, socks5.ToAddress(dstb[0], dstb[1:len(dstb)-2], dstb[len(dstb)-2:]), blk.Address)
if err != nil {
return nil, nil, err
}
sc, err := NewPacketClient(blk.Password, src, rc, udptimeout, dstb)
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
if blk.Kind == "wsserver" || blk.Kind == "wssserver" {
if network == "tcp" {
rc, err := WebSocketDial("", "", blk.Address, blk.Host, blk.Path, blk.Tc, tcptimeout, blk.TLSFingerprint, blk.FragmentMinLength, blk.FragmentMaxLength, blk.FragmentMinDelay, blk.FragmentMaxDelay)
if err != nil {
return nil, nil, err
}
var sc Exchanger
if blk.V.Get("withoutBrookProtocol") != "true" {
sc, err = NewStreamClient("tcp", blk.Password, src, rc, tcptimeout, dstb)
}
if blk.V.Get("withoutBrookProtocol") == "true" {
sc, err = NewSimpleStreamClient("tcp", blk.Password, src, rc, tcptimeout, dstb)
}
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
rc, err := WebSocketDial(src, socks5.ToAddress(dstb[0], dstb[1:len(dstb)-2], dstb[len(dstb)-2:]), blk.Address, blk.Host, blk.Path, blk.Tc, tcptimeout, blk.TLSFingerprint, blk.FragmentMinLength, blk.FragmentMaxLength, blk.FragmentMinDelay, blk.FragmentMaxDelay)
if err != nil {
return nil, nil, err
}
var sc Exchanger
if blk.V.Get("withoutBrookProtocol") != "true" {
sc, err = NewStreamClient("udp", blk.Password, src, rc, udptimeout, dstb)
}
if blk.V.Get("withoutBrookProtocol") == "true" {
sc, err = NewSimpleStreamClient("udp", blk.Password, src, rc, udptimeout, dstb)
}
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
if blk.Kind == "quicserver" {
if network == "tcp" {
rc, err := QUICDialTCP("", "", blk.Address, blk.Tc, tcptimeout)
if err != nil {
return nil, nil, err
}
var sc Exchanger
if blk.V.Get("withoutBrookProtocol") != "true" {
sc, err = NewStreamClient("tcp", blk.Password, src, rc, tcptimeout, dstb)
}
if blk.V.Get("withoutBrookProtocol") == "true" {
sc, err = NewSimpleStreamClient("tcp", blk.Password, src, rc, tcptimeout, dstb)
}
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
if blk.V.Get("udpoverstream") == "true" {
rc, err := QUICDialTCP(src, socks5.ToAddress(dstb[0], dstb[1:len(dstb)-2], dstb[len(dstb)-2:]), blk.Address, blk.Tc, tcptimeout)
if err != nil {
return nil, nil, err
}
var sc Exchanger
if blk.V.Get("withoutBrookProtocol") != "true" {
sc, err = NewStreamClient("udp", blk.Password, src, rc, tcptimeout, dstb)
}
if blk.V.Get("withoutBrookProtocol") == "true" {
sc, err = NewSimpleStreamClient("udp", blk.Password, src, rc, tcptimeout, dstb)
}
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
rc, err := QUICDialUDP(src, socks5.ToAddress(dstb[0], dstb[1:len(dstb)-2], dstb[len(dstb)-2:]), blk.Address, blk.Tc, udptimeout)
if err != nil {
return nil, nil, err
}
var sc Exchanger
if blk.V.Get("withoutBrookProtocol") != "true" {
sc, err = NewPacketClient(blk.Password, src, rc, udptimeout, dstb)
}
if blk.V.Get("withoutBrookProtocol") == "true" {
sc, err = NewSimplePacketClient(blk.Password, src, rc, udptimeout, dstb)
}
if err != nil {
rc.Close()
return nil, nil, err
}
return sc, rc, nil
}
return nil, nil, errors.New("cannot create exchanger from " + blk.Kind)
}
func (x *BrookLink) PrepareSocks5Server(addr, ip string, tcptimeout, udptimeout int) error {
if err := limits.Raise(); err != nil {
Log(Error{"when": "try to raise system limits", "warning": err.Error()})
}
if x.Kind == "quicserver" {
if runtime.GOOS == "linux" {
c := exec.Command("sysctl", "-w", "net.core.rmem_max=2500000")
b, err := c.CombinedOutput()
if err != nil {
Log(Error{"when": "try to raise UDP Receive Buffer Size", "warning": string(b)})
}
}
if runtime.GOOS == "darwin" {
c := exec.Command("sysctl", "-w", "kern.ipc.maxsockbuf=3014656")
b, err := c.CombinedOutput()
if err != nil {
Log(Error{"when": "try to raise UDP Receive Buffer Size", "warning": string(b)})
}
}
}
var err error
x.S5, err = socks5.NewClassicServer(addr, ip, "", "", tcptimeout, udptimeout)
if err != nil {
return err
}
x.Pcf = NewPacketConnFactory()
x.TCPTimeout = tcptimeout
x.UDPTimeout = udptimeout
return nil
}
func (x *BrookLink) ListenAndServe() error {
return x.S5.ListenAndServe(x)
}
func (x *BrookLink) TCPHandle(s *socks5.Server, c *net.TCPConn, r *socks5.Request) error {
if r.Cmd == socks5.CmdConnect {
dstb := append(append([]byte{r.Atyp}, r.DstAddr...), r.DstPort...)
sc, rc, err := x.CreateExchanger("tcp", c.RemoteAddr().String(), dstb, x.TCPTimeout, x.UDPTimeout)
if err != nil {
return ErrorReply(r, c, err)
}
defer rc.Close()
defer sc.Clean()
a, address, port, err := socks5.ParseAddress(rc.LocalAddr().String())
if err != nil {
return ErrorReply(r, c, err)
}
rp := socks5.NewReply(socks5.RepSuccess, a, address, port)
if _, err := rp.WriteTo(c); err != nil {
return err
}
if err := sc.Exchange(c); err != nil {
return nil
}
return nil
}
if r.Cmd == socks5.CmdUDP {
_, err := r.UDP(c, x.S5.ServerAddr)
if err != nil {
return err
}
io.Copy(io.Discard, c)
return nil
}
return socks5.ErrUnsupportCmd
}
func (x *BrookLink) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram) error {
dstb := append(append([]byte{d.Atyp}, d.DstAddr...), d.DstPort...)
conn, err := x.Pcf.Handle(addr, dstb, d.Data, func(b []byte) (int, error) {
d.Data = b
return s.UDPConn.WriteToUDP(d.Bytes(), addr)
}, x.UDPTimeout)
if err != nil {
return err
}
if conn == nil {
return nil
}
defer conn.Close()
sc, rc, err := x.CreateExchanger("udp", addr.String(), dstb, x.TCPTimeout, x.UDPTimeout)
if err != nil {
return err
}
defer rc.Close()
defer sc.Clean()
if err := sc.Exchange(conn); err != nil {
return nil
}
return nil
}
func (x *BrookLink) Shutdown() error {
return x.S5.Shutdown()
}
================================================
FILE: cac.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"os"
"strings"
)
// TODO: make me more compatible with the shell environment.
// https://github.com/TxThinkingInc/CAC
func CAC(file string) ([]string, error) {
b, err := os.ReadFile(file)
if err != nil {
return nil, err
}
l0 := []string{}
l1 := strings.Split(string(b), "\n")
for _, v := range l1 {
v = strings.TrimSpace(v)
if strings.HasSuffix(v, "\\") {
v = v[0 : len(v)-1]
}
if strings.HasPrefix(v, "#") || v == "" {
continue
}
l0 = append(l0, v)
}
if len(l0) == 0 {
return l0, nil
}
s := strings.Join(l0, " ")
l0 = []string{}
l1 = strings.Fields(s)
for _, v := range l1 {
if len(v) > 1 && strings.HasPrefix(v, "'") && strings.HasSuffix(v, "'") {
l0 = append(l0, v[1:len(v)-1])
continue
}
if len(v) > 1 && strings.HasPrefix(v, "\"") && strings.HasSuffix(v, "\"") {
l0 = append(l0, v[1:len(v)-1])
continue
}
l0 = append(l0, v)
}
return l0, nil
}
================================================
FILE: client.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"net"
"github.com/txthinking/brook/limits"
"github.com/txthinking/socks5"
)
type Client struct {
Server *socks5.Server
ServerAddress string
Password []byte
TCPTimeout int
UDPTimeout int
UDPOverTCP bool
PacketConnFactory *PacketConnFactory
}
func NewClient(addr, ip, server, password string, tcpTimeout, udpTimeout int) (*Client, error) {
if err := limits.Raise(); err != nil {
Log(Error{"when": "try to raise system limits", "warning": err.Error()})
}
s5, err := socks5.NewClassicServer(addr, ip, "", "", tcpTimeout, udpTimeout)
if err != nil {
return nil, err
}
x := &Client{
ServerAddress: server,
Server: s5,
Password: []byte(password),
TCPTimeout: tcpTimeout,
UDPTimeout: udpTimeout,
PacketConnFactory: NewPacketConnFactory(),
}
return x, nil
}
func (x *Client) ListenAndServe() error {
return x.Server.ListenAndServe(x)
}
func (x *Client) TCPHandle(s *socks5.Server, c *net.TCPConn, r *socks5.Request) error {
if r.Cmd == socks5.CmdConnect {
rc, err := DialTCP("tcp", "", x.ServerAddress)
if err != nil {
return ErrorReply(r, c, err)
}
defer rc.Close()
dst := make([]byte, 0, 1+len(r.DstAddr)+2)
dst = append(dst, r.Atyp)
dst = append(dst, r.DstAddr...)
dst = append(dst, r.DstPort...)
sc, err := NewStreamClient("tcp", x.Password, c.RemoteAddr().String(), rc, x.TCPTimeout, dst)
if err != nil {
return ErrorReply(r, c, err)
}
defer sc.Clean()
a, address, port, err := socks5.ParseAddress(rc.LocalAddr().String())
if err != nil {
return ErrorReply(r, c, err)
}
rp := socks5.NewReply(socks5.RepSuccess, a, address, port)
if _, err := rp.WriteTo(c); err != nil {
return err
}
if err := sc.Exchange(c); err != nil {
return nil
}
return nil
}
if r.Cmd == socks5.CmdUDP {
_, err := r.UDP(c, x.Server.ServerAddr)
if err != nil {
return err
}
return nil
}
return socks5.ErrUnsupportCmd
}
func (x *Client) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram) error {
dstb := append(append([]byte{d.Atyp}, d.DstAddr...), d.DstPort...)
conn, err := x.PacketConnFactory.Handle(addr, dstb, d.Data, func(b []byte) (int, error) {
d.Data = b
return s.UDPConn.WriteToUDP(d.Bytes(), addr)
}, x.UDPTimeout)
if err != nil {
return err
}
if conn == nil {
return nil
}
defer conn.Close()
if x.UDPOverTCP {
rc, err := NATDial("tcp", addr.String(), d.Address(), x.ServerAddress)
if err != nil {
return err
}
defer rc.Close()
sc, err := NewStreamClient("udp", x.Password, addr.String(), rc, x.UDPTimeout, dstb)
if err != nil {
return err
}
defer sc.Clean()
if err := sc.Exchange(conn); err != nil {
return nil
}
return nil
}
rc, err := NATDial("udp", addr.String(), d.Address(), x.ServerAddress)
if err != nil {
return err
}
defer rc.Close()
sc, err := NewPacketClient(x.Password, addr.String(), rc, x.UDPTimeout, dstb)
if err != nil {
return err
}
defer sc.Clean()
if err := sc.Exchange(conn); err != nil {
return nil
}
return nil
}
func (x *Client) Shutdown() error {
return x.Server.Shutdown()
}
================================================
FILE: dhcpserver.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"encoding/json"
"errors"
"net"
"os"
"path/filepath"
"time"
"github.com/krolaw/dhcp4"
)
type DHCPServer struct {
Listen net.PacketConn
ServerIP net.IP
Start net.IP
Count int
Leases map[int]string
Options dhcp4.Options
Cache string
}
func NewDHCPServer(iface, serverip, start, mask string, count int, gateway string, dnsserver []string, cache string) (*DHCPServer, error) {
if net.ParseIP(serverip).To4() == nil || net.ParseIP(start).To4() == nil || net.ParseIP(mask).To4() == nil || net.ParseIP(gateway).To4() == nil {
return nil, errors.New("Invalid v4 IP")
}
dnsserverips := make([]net.IP, 0)
for _, v := range dnsserver {
if net.ParseIP(v).To4() == nil {
return nil, errors.New("Invalid v4 IP")
}
dnsserverips = append(dnsserverips, net.ParseIP(v).To4())
}
if cache == "" {
s, err := os.UserHomeDir()
if err != nil {
return nil, err
}
cache = filepath.Join(s, ".brook.dhcpserver")
}
b, err := os.ReadFile(cache)
if err != nil && !os.IsNotExist(err) {
return nil, err
}
m := make(map[int]string)
if err == nil {
if err := json.Unmarshal(b, &m); err != nil {
return nil, err
}
}
l, err := DHCPListen(iface)
if err != nil {
return nil, err
}
return &DHCPServer{
Listen: l,
ServerIP: net.ParseIP(serverip).To4(),
Start: net.ParseIP(start).To4(),
Count: count,
Leases: m,
Options: dhcp4.Options{
dhcp4.OptionSubnetMask: []byte(net.ParseIP(mask).To4()),
dhcp4.OptionRouter: []byte(net.ParseIP(gateway).To4()),
dhcp4.OptionDomainNameServer: dhcp4.JoinIPs(dnsserverips),
},
Cache: cache,
}, nil
}
func (h *DHCPServer) ListenAndServe() error {
return dhcp4.Serve(h.Listen, h)
}
func (h *DHCPServer) Shutdown() error {
b, err := json.Marshal(h.Leases)
if err != nil {
Log(err)
}
if err == nil {
if err := os.WriteFile(h.Cache, b, 0644); err != nil {
Log(err)
}
}
return h.Listen.Close()
}
var DHCPServerGate func(inmt string, in dhcp4.Packet, outmt string, ip net.IP, err error) = func(inmt string, in dhcp4.Packet, outmt string, ip net.IP, err error) {
}
func (h *DHCPServer) ServeDHCP(p dhcp4.Packet, msgType dhcp4.MessageType, options dhcp4.Options) (d dhcp4.Packet) {
switch msgType {
case dhcp4.Discover:
for i, s := range h.Leases {
if s == p.CHAddr().String() {
DHCPServerGate(msgType.String(), p, dhcp4.Offer.String(), dhcp4.IPAdd(h.Start, i), nil)
return dhcp4.ReplyPacket(p, dhcp4.Offer, h.ServerIP, dhcp4.IPAdd(h.Start, i), 7*24*time.Hour, h.Options.SelectOrderOrAll(options[dhcp4.OptionParameterRequestList]))
}
}
for i := 0; i < h.Count; i++ {
_, ok := h.Leases[i]
if !ok {
DHCPServerGate(msgType.String(), p, dhcp4.Offer.String(), dhcp4.IPAdd(h.Start, i), nil)
return dhcp4.ReplyPacket(p, dhcp4.Offer, h.ServerIP, dhcp4.IPAdd(h.Start, i), 7*24*time.Hour, h.Options.SelectOrderOrAll(options[dhcp4.OptionParameterRequestList]))
}
}
Log(errors.New("DHCP server is full"))
DHCPServerGate(msgType.String(), p, "", nil, errors.New("DHCP server is full"))
return nil
case dhcp4.Request:
if server, ok := options[dhcp4.OptionServerIdentifier]; ok && !net.IP(server).Equal(h.ServerIP) {
return nil
}
reqIP := net.IP(options[dhcp4.OptionRequestedIPAddress])
if reqIP == nil {
reqIP = net.IP(p.CIAddr())
}
if len(reqIP) == 4 && !reqIP.Equal(net.IPv4zero) {
i := dhcp4.IPRange(h.Start, reqIP) - 1
if i >= 0 && i < h.Count {
s, ok := h.Leases[i]
if !ok || s == p.CHAddr().String() {
h.Leases[i] = p.CHAddr().String()
DHCPServerGate(msgType.String(), p, dhcp4.ACK.String(), reqIP, nil)
return dhcp4.ReplyPacket(p, dhcp4.ACK, h.ServerIP, reqIP, 7*24*time.Hour, h.Options.SelectOrderOrAll(options[dhcp4.OptionParameterRequestList]))
}
}
}
DHCPServerGate(msgType.String(), p, dhcp4.NAK.String(), reqIP, nil)
return dhcp4.ReplyPacket(p, dhcp4.NAK, h.ServerIP, nil, 0, nil)
case dhcp4.Release, dhcp4.Decline:
for i, s := range h.Leases {
if s == p.CHAddr().String() {
delete(h.Leases, i)
}
}
DHCPServerGate(msgType.String(), p, "", nil, nil)
return nil
}
DHCPServerGate(msgType.String(), p, "", nil, nil)
return nil
}
================================================
FILE: dhcpserver_linux.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"net"
"github.com/krolaw/dhcp4/conn"
)
func DHCPListen(iface string) (net.PacketConn, error) {
if iface == "" {
return net.ListenPacket("udp4", ":67")
}
return conn.NewUDP4BoundListener(iface, ":67")
}
================================================
FILE: dhcpserver_notlinux.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
// +build !linux
package brook
import (
"net"
)
func DHCPListen(iface string) (net.PacketConn, error) {
return net.ListenPacket("udp4", ":67")
}
================================================
FILE: dial.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"net"
)
var Resolve func(network string, addr string) (net.Addr, error) = func(network string, addr string) (net.Addr, error) {
if network == "tcp" {
return net.ResolveTCPAddr("tcp", addr)
}
return net.ResolveUDPAddr("udp", addr)
}
var DialTCP func(network string, laddr, raddr string) (net.Conn, error) = func(network string, laddr, raddr string) (net.Conn, error) {
var la, ra *net.TCPAddr
if laddr != "" {
var err error
la, err = net.ResolveTCPAddr(network, laddr)
if err != nil {
return nil, err
}
}
a, err := Resolve(network, raddr)
if err != nil {
return nil, err
}
ra = a.(*net.TCPAddr)
return net.DialTCP(network, la, ra)
}
var DialUDP func(network string, laddr, raddr string) (net.Conn, error) = func(network string, laddr, raddr string) (net.Conn, error) {
var la, ra *net.UDPAddr
if laddr != "" {
var err error
la, err = net.ResolveUDPAddr(network, laddr)
if err != nil {
return nil, err
}
}
a, err := Resolve(network, raddr)
if err != nil {
return nil, err
}
ra = a.(*net.UDPAddr)
return net.DialUDP(network, la, ra)
}
var ListenUDP func(network string, laddr *net.UDPAddr) (*net.UDPConn, error) = net.ListenUDP
================================================
FILE: dnsclient.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"net"
"time"
"github.com/miekg/dns"
)
type DNSClient struct {
Server string
}
func (c *DNSClient) Exchange(m *dns.Msg) (*dns.Msg, error) {
conn, err := DialUDP("udp", "", c.Server)
if err != nil {
return nil, err
}
defer conn.Close()
if err := conn.SetDeadline(time.Now().Add(time.Duration(60) * time.Second)); err != nil {
return nil, err
}
b, err := m.Pack()
if err != nil {
return nil, err
}
if _, err := conn.Write(b); err != nil {
return nil, err
}
b = make([]byte, 1024)
i, err := conn.Read(b)
if err != nil {
return nil, err
}
r := &dns.Msg{}
if err := r.Unpack(b[:i]); err != nil {
return nil, err
}
return r, nil
}
// if no AAAA, return nil
func (c *DNSClient) AAAA(domain string) (net.IP, error) {
m := &dns.Msg{}
m.SetQuestion(domain+".", dns.TypeAAAA)
m, err := c.Exchange(m)
if err != nil {
return nil, err
}
for _, v := range m.Answer {
if t, ok := v.(*dns.AAAA); ok {
return t.AAAA, nil
}
}
return nil, nil
}
// if no A, return nil
func (c *DNSClient) A(domain string) (net.IP, error) {
m := &dns.Msg{}
m.SetQuestion(domain+".", dns.TypeA)
m, err := c.Exchange(m)
if err != nil {
return nil, err
}
for _, v := range m.Answer {
if t, ok := v.(*dns.A); ok {
return t.A, nil
}
}
return nil, nil
}
================================================
FILE: dnsserver.go
================================================
// Copyright (c) 2016-present Cloud <cloud@txthinking.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// 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, see <https://www.gnu.org/licenses/>.
package brook
import (
"net"
"time"
"github.com/miekg/dns"
)
var DNSGate func(addr *net.UDPAddr, m *dns.Msg, l1 *net.UDPConn) (done bool, err error) = func(addr *net.UDPAddr, m *dns.Msg, l1 *net.UDPConn) (done bool, err error) {
if m.Question[0].Qtype == dns.TypeHTTPS || m.Question[0].Qtype == dns.TypeSVCB {
m1 := &dns.Msg{}
m1.SetReply(m)
m1.Authoritative = true
m1.Answer = append(m1.Answer, &dns.SOA{
Hdr: dns.RR_Header{Name: m.Question[0].Name, Rrtype: dns.TypeSOA, Class: dns.ClassINET, Ttl: 60},
Ns: "txthinking.com.",
Mbox: "cloud.txthinking.com.",
Serial: uint32((time.Now().Year() * 10000) + (int(time.Now().Month()) * 100) + (time.Now().Day())*100),
Refresh: 21600,
Retry: 3600,
Expire: 259200,
Minttl: 300,
})
m1b, err := m1.PackBuffer(nil)
if err != nil {
return false, err
}
if _, err := l1.WriteToUDP(m1b, addr); err != nil {
return false, err
}
return true, nil
}
return false, nil
}
================================================
FILE: docs/CNAME
================================================
brook.app
================================================
FILE: docs/index.html
================================================
<!DOCTYPE html>
<html theme-mode="light">
<head>
<title>Brook Script Gallery</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/png" href="images/brook_circle.png" />
<link rel="stylesheet" href="static/tdesign.min.css" />
<link rel="stylesheet" href="static/theme.css" />
<script src="static/vue.min.js"></script>
<script src="static/vue-composition-api.prod.js"></script>
<script src="static/tdesign.min.js"></script>
<style>
html,
body,
#app {
margin: 0;
padding: 0;
height: 100dvh;
}
</style>
<script type="module">
window.addEventListener("DOMContentLoaded", async (e) => {
Vue.use(TDesign);
new Vue({
el: '#app',
data() {
return {
zh: navigator.language.toLowerCase().startsWith("zh-"),
wx: navigator.userAgent.toLowerCase().indexOf("micromessenger") != -1,
mob: /iPhone|iPod|Android/i.test(navigator.userAgent),
ing: false,
list: [],
err: false,
error: '',
}
},
async mounted() {
this.ing = true;
try {
var res = await fetch('https://raw.githubusercontent.com/txthinking/brook/refs/heads/master/programmable/gallery.json')
if (res.status != 200) throw await res.text()
this.list = JSON.parse(await res.text())
} catch (e) {
this.err = true
this.error = e.toString()
}
this.ing = false;
},
methods: {
async expand(v) {
this.ing = true;
try {
v.expanded = !v.expanded
if (!v.script && v.expanded) {
var res = await fetch(v.url)
if (res.status != 200) throw await res.text()
v.script = await res.text()
}
} catch (e) {
this.err = true
this.error = e.toString()
}
this.ing = false;
},
async copy(s) {
await navigator.clipboard.writeText(s)
},
async confirm(e) {
this.err = false
this.error = ''
},
async close(e) {
this.err = false
this.error = ''
},
},
})
});
</script>
</head>
<body>
<div id="app">
<t-layout :style="'display: flex;flex-direction: column;height: 100%;'">
<t-header style="flex-shrink: 0;">
<t-head-menu value="null">
<template #logo>
<h1>Brook Script Gallery</h1>
</template>
<t-menu-item v-if="!mob" target="_blank" href="https://www.txthinking.com/brook.html">Docs</t-menu-item>
<t-menu-item v-if="!mob" target="_blank" href="https://www.txthinking.com/talks/">Talks</t-menu-item>
<t-menu-item v-if="!mob" target="_blank" href="https://youtube.com/txthinking">YouTube</t-menu-item>
<template #operations>
<t-tooltip placement="bottom" content="Talks" v-if="mob">
<t-button theme="default" shape="square" variant="text" href="https://www.txthinking.com/talks/" target="_blank">
<t-icon name="book-open"></t-icon>
</t-button>
</t-tooltip>
<t-tooltip placement="bottom" content="YouTube" v-if="mob">
<t-button theme="default" shape="square" variant="text" href="https://www.youtube.com/txthinking" target="_blank">
<t-icon name="logo-youtube"></t-icon>
</t-button>
</t-tooltip>
<t-tooltip placement="bottom" content="GitHub" v-if="mob">
<t-button theme="default" shape="square" variant="text" href="https://github.com/txthinking" target="_blank">
<t-icon name="logo-github"></t-icon>
</t-button>
</t-tooltip>
<t-divider layout="vertical" v-if="mob"></t-divider>
<t-tooltip placement="bottom" content="Add">
<t-button theme="default" shape="square" variant="text" href="https://github.com/txthinking/brook/blob/master/programmable" target="_blank">
<t-icon name="add-circle"></t-icon>
</t-button>
</t-tooltip>
</template>
</t-head-menu>
</t-header>
<t-content style="flex-grow:1;overflow-y:scroll;" id="top">
<div style="height:100%;display: flex;flex-direction: column;padding: 15px 15px 0 15px;box-sizing:border-box;">
<div style="flex-grow:1;">
<div style="display: flex;flex-wrap: wrap;gap:15px;">
<t-card :bordered="false" v-for="item in list" :style="item.expanded ? 'width:100%' : 'max-width:100%'">
<div style="display: flex;flex-direction: column;">
<t-collapse :borderless="true" @change="expand(item)">
<t-collapse-panel :header="item.name">
<div style="display: flex;justify-content: space-between;align-items:center">
<div style="flex-grow:1;overflow-x:hidden;text-overflow: ellipsis;white-space:nowrap">{{item.url}}</div>
<t-button style="flex-shrink: 0;" theme="default" shape="square" variant="text" @click="copy(item.url)">
<t-icon name="copy"></t-icon>
</t-button>
</div>
<pre style="width:100%;padding:1rem;overflow-x:scroll;font-size:85%;line-height: 1.45;color:#1f2328;background-color: #f6f8fa;border-radius:6px;"><code style="display: inline;padding:0px;margin:0px;overflow:visible;word-wrap:normal;background-color:transparent;border:0">{{item.script}}</code></pre>
</t-collapse-panel>
</t-collapse>
<div style="display: flex;justify-content:space-around;align-items:center">
<div style="display: flex;gap:15px;" v-if="item.kind=='dnsserver'">
<t-tooltip content="brook dnsserver, dohserver, dnsserveroverbrook">
<t-tag shape="round" variant="outline">DNS Server</t-tag>
</t-tooltip>
</div>
<div style="display: flex;gap:15px;" v-if="item.kind=='server'">
<t-tooltip content="brook server, wsserver, wssserver, quicserver">
<t-tag shape="round" variant="outline">Server</t-tag>
</t-tooltip>
</div>
<div style="display: flex;gap:15px;" v-if="item.kind=='client'">
<t-tooltip content="ipio">
<t-tag shape="round" variant="outline">ipio</t-tag>
</t-tooltip>
<t-tooltip content="brook.openwrt">
<t-tag shape="round" variant="outline">brook.openwrt</t-tag>
</t-tooltip>
<t-tooltip :content="zh ? '需要安装 CA' : 'Need to install CA'">
<t-tag shape="round" theme="warning" variant="outline" v-if="item.ca">CA</t-tag>
</t-tooltip>
</div>
<div style="display: flex;gap:15px;" v-if="item.kind=='module'">
<t-tooltip content="Brook GUI Client">
<t-tag shape="round" variant="outline">Client</t-tag>
</t-tooltip>
<t-tooltip :content="zh ? '需要安装 CA' : 'Need to install CA'">
<t-tag shape="round" theme="warning" variant="outline" v-if="item.ca">CA</t-tag>
</t-tooltip>
</div>
<t-link v-if="item.expanded" :href="item.author_url" target="_blank">
<t-tooltip :content="zh ? '作者' : 'Author'">
<t-tag variant="outline"><template #icon><t-icon name="user-circle"></t-icon></template>{{item.author}}</t-tag>
</t-tooltip>
</t-link>
</div>
</div>
</t-card>
</div>
</div>
<div style="display: flex;justify-content:center;padding:15px;">
<t-link href="https://www.txthinking.com" target="_blank" style="color:grey">TxThinking</t-link>
</div>
<t-back-top shape="circle" container="#top" style="position: fixed" :offset="['24px', '80px']"></t-back-top>
</div>
</t-content>
</t-layout>
<t-loading :loading="ing" :text="zh ? '请求中...' : 'Requesting...'" fullscreen></t-loading>
<t-dialog theme="danger" header="Error" :body="error" :visible.sync="err" @confirm="confirm" @close="close" :cancel-btn="null" :confirm-btn="zh ? '了解' : 'Got'" :close-on-overlay-click="false" :close-on-esc-keydown="false"></t-dialog>
</div>
</body>
</html>
================================================
FILE: docs/static/fonts.js
================================================
// This file is generated automatically by `useSvgSpriteTemplate.ts`. DO NOT EDIT IT.
(function () {
var svgCode = '<?xml version="1.0" encoding="utf-8"?><svg style="position:absolute; width:0; height:0; visibility:hidden" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol fill="none" viewBox="0 0 24 24" id="t-icon-accessibility" xmlns="http://www.w3.org/2000/svg"><path d="M12 2a1.25 1.25 0 110 2.5A1.25 1.25 0 0112 2zM8.75 3.25a3.25 3.25 0 106.5 0 3.25 3.25 0 00-6.5 0zm-6.5 6.375A2.625 2.625 0 014.875 7h14.25a2.625 2.625 0 010 5.25h-2.628l1.823 8.208a2.5 2.5 0 01-2.44 3.042h-2.142L12 17.198 10.261 23.5H8.12a2.5 2.5 0 01-2.44-3.042l1.823-8.208H4.875A2.625 2.625 0 012.25 9.625zM4.875 9a.625.625 0 100 1.25h5.122L7.632 20.892a.5.5 0 00.488.608h.619l2-7.25h2.522l2 7.25h.62a.5.5 0 00.487-.608L14.003 10.25h5.122a.625.625 0 100-1.25H4.875z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-accessibility-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 4.5A2.25 2.25 0 1012 0a2.25 2.25 0 000 4.5zM21.75 7V5.5H2.25V7l6.5 1.75L9 12 4.75 22.75l1.5.75 5.745-9h.01l5.745 9 1.5-.75L15 12l.25-3.25L21.75 7z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-activity" xmlns="http://www.w3.org/2000/svg"><path d="M22 2H2v20h20V2zm-2 2v7h-2.554l-2.021 3.233-5.865-7.82L5.546 11H4V4h16zM4 13h2.454L9.44 9.587l6.135 8.18L18.555 13H20v7H4v-7z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-activity-filled" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v9h-4.554l-2.021 3.233-5.865-7.82L5.546 11H2V2z" fill="currentColor"/><path d="M2 13v9h20v-9h-3.446l-2.979 4.767-6.135-8.18L6.454 13H2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-add" xmlns="http://www.w3.org/2000/svg"><path d="M13 4v7h7v2h-7v7h-2v-7H4v-2h7V4h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-add-and-subtract" xmlns="http://www.w3.org/2000/svg"><path d="M13 1v8h8v2h-8v8h-2v-8H3V9h8V1h2zM3 20h18v2H3v-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-add-circle" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a9 9 0 100 18 9 9 0 000-18zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm12-5.5V11h4.5v2H13v4.5h-2V13H6.5v-2H11V6.5h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-add-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 1C5.925 1 1 5.925 1 12s4.925 11 11 11 11-4.925 11-11S18.075 1 12 1zm1 12v4.5h-2V13H6.5v-2H11V6.5h2V11h4.5v2H13z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-add-rectangle" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v20H2V2zm2 2v16h16V4H4zm9 2.5V11h4.5v2H13v4.5h-2V13H6.5v-2H11V6.5h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-add-rectangle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v20H2V2zm11 4.5h-2V11H6.5v2H11v4.5h2V13h4.5v-2H13V6.5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-address-book" xmlns="http://www.w3.org/2000/svg"><path d="M3 6a4 4 0 014-4h14v20H7a4 4 0 01-4-4V6zm2 8.535A3.982 3.982 0 017 14h12V4h-2v6.766l-3.5-2.1-3.5 2.1V4H7a2 2 0 00-2 2v8.535zM19 16H7a2 2 0 100 4h12v-4zM15 4h-3v3.234l1.5-.9 1.5.9V4z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-address-book-filled" xmlns="http://www.w3.org/2000/svg"><path d="M7 2a4 4 0 00-4 4v12a4 4 0 004 4h14V2H7zm10 7.75l-2.5-2.063L12 9.75V4h5v5.75zM5 18a2 2 0 012-2h12v4H7a2 2 0 01-2-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-adjustment" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a1 1 0 100 2 1 1 0 000-2zM5.17 4a3.001 3.001 0 015.66 0H22v2H10.83a3.001 3.001 0 01-5.66 0H2V4h3.17zm8 7a3.001 3.001 0 015.66 0H22v2h-3.17a3.001 3.001 0 01-5.66 0H2v-2h11.17zM16 11a1 1 0 100 2 1 1 0 000-2zm-8 7a1 1 0 100 2 1 1 0 000-2zm-2.83 0a3.001 3.001 0 015.66 0H22v2H10.83a3.001 3.001 0 01-5.66 0H2v-2h3.17z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-adjustment-filled" xmlns="http://www.w3.org/2000/svg"><path d="M5.17 4a3.001 3.001 0 015.66 0H22v2H10.83a3.001 3.001 0 01-5.66 0H2V4h3.17zm8 7a3.001 3.001 0 015.66 0H22v2h-3.17a3.001 3.001 0 01-5.66 0H2v-2h11.17zm-8 7a3.001 3.001 0 015.66 0H22v2H10.83a3.001 3.001 0 01-5.66 0H2v-2h3.17z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-airplay-wave" xmlns="http://www.w3.org/2000/svg"><path d="M1 3h22v17h-5.5v-2H21V5H3l.001 13h3.5v2H1L1 3zm15.95 10.383a7 7 0 00-9.9 0l-.706.707-1.414-1.414.707-.707a9 9 0 0112.728 0l.707.707-1.415 1.414-.707-.707zm-2.828 2.828a3 3 0 00-4.243 0l-.707.707-1.414-1.414.707-.707a5 5 0 017.07 0l.708.707-1.414 1.414-.707-.707zM12 18.086L15.914 22H8.086L12 18.086z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-airplay-wave-filled" xmlns="http://www.w3.org/2000/svg"><path d="M23 3H1l.001 17h6.964L12 15.964 16.036 20H23V3zm-6.05 8.383a7 7 0 00-9.899 0l-.707.707-1.414-1.414.707-.707a9 9 0 0112.728 0l.707.707-1.414 1.414-.707-.707zm-2.828 2.828a3 3 0 00-4.243 0l-.707.707-1.414-1.414.707-.707a5 5 0 017.071 0l.707.707-1.414 1.414-.707-.707z" fill="currentColor"/><path d="M15.914 22L12 18.086 8.086 22h7.828z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-alarm" xmlns="http://www.w3.org/2000/svg"><path d="M6.914 2.5L1.5 7.914.086 6.5 5.5 1.086 6.914 2.5zM18.5 1.086L23.914 6.5 22.5 7.914 17.086 2.5 18.5 1.086zM12 5a8 8 0 100 16 8 8 0 000-16zM2 13C2 7.477 6.477 3 12 3s10 4.477 10 10-4.477 10-10 10S2 18.523 2 13zm11-5.5v5.086L16.414 16 15 17.414l-4-4V7.5h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-alarm-add" xmlns="http://www.w3.org/2000/svg"><path d="M6.914 2.5L1.5 7.914.086 6.5 5.5 1.086 6.914 2.5zM18.5 1.086L23.914 6.5 22.5 7.914 17.086 2.5 18.5 1.086zM12 5a8 8 0 100 16 8 8 0 000-16zM2 13C2 7.477 6.477 3 12 3s10 4.477 10 10-4.477 10-10 10S2 18.523 2 13zm11-5v4h4v2h-4v4h-2v-4H7v-2h4V8h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-alarm-add-filled" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 7.914L6.914 2.5 5.5 1.086.086 6.5 1.5 7.914zM23.914 6.5L18.5 1.086 17.086 2.5 22.5 7.914 23.914 6.5zM12 3C6.477 3 2 7.477 2 13s4.477 10 10 10 10-4.477 10-10S17.523 3 12 3zm5 11h-4v4h-2v-4H7v-2h4V8h2v4h4v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-alarm-filled" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 7.914L6.914 2.5 5.5 1.086.086 6.5 1.5 7.914zM23.914 6.5L18.5 1.086 17.086 2.5 22.5 7.914 23.914 6.5zM12 3C6.477 3 2 7.477 2 13s4.477 10 10 10 10-4.477 10-10S17.523 3 12 3zm3 14.414l-4-4V7.5h2v5.086L16.414 16 15 17.414z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-alarm-off" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_8726_7187)"><path d="M.086 6.5l2.5-2.5-2-2L2 .586l2 2 1.5-1.5L6.914 2.5 5.414 4l18 18L22 23.414l-3.139-3.139A9.968 9.968 0 0112.001 23C6.476 23 2 18.523 2 13a9.968 9.968 0 012.724-6.861L4 5.414l-2.5 2.5L.086 6.5zM6.14 7.554A8 8 0 0017.446 18.86L6.14 7.554zm2.421-4l.97-.246C10.32 3.107 11.148 3 12 3c5.523 0 10 4.477 10 10 0 .851-.107 1.679-.308 2.47l-.246.969-1.938-.493.246-.969a8 8 0 00-9.731-9.731l-.97.246-.492-1.938zm9.94-2.468L23.913 6.5 22.5 7.914 17.086 2.5 18.5 1.086z" fill="currentColor"/></g></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-alarm-off-filled" xmlns="http://www.w3.org/2000/svg"><path d="M2.004.59L2 .586.586 2l2 2-2.5 2.5L1.5 7.914l2.5-2.5.725.725A9.966 9.966 0 002 13c0 5.523 4.477 10 10 10a9.966 9.966 0 006.861-2.725l3.14 3.14 1.41-1.41L2 .594 2.004.59zM21.188 16.954A9.967 9.967 0 0022 13c0-5.523-4.477-10-10-10-1.404 0-2.741.29-3.954.812l13.142 13.142zM18.5 1.086L23.914 6.5 22.5 7.914 17.086 2.5 18.5 1.086z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-align-top" xmlns="http://www.w3.org/2000/svg"><path d="M3 3h18v2H3V3zm9 2.586l-.707.707-4 4-.707.707L8 12.414l.707-.707L11 9.414V21h2V9.414l2.293 2.293.707.707L17.414 11l-.707-.707-4-4L12 5.586z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-align-vertical" xmlns="http://www.w3.org/2000/svg"><path d="M13 6.586V0h-2V6.586L9.707 5.293 9 4.586 7.586 6l.707.707 3 3 .707.707.707-.707 3-3L16.414 6 15 4.586l-.707.707L13 6.586zM21 13H3v-2h18v2zm-9 .586l.707.707 3 3 .707.707L15 19.414l-.707-.707L13 17.414V24h-2V17.414l-1.293 1.293-.707.707L7.586 18l.707-.707 3-3 .707-.707z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-alpha" xmlns="http://www.w3.org/2000/svg"><path d="M14 2v3.866l5.336-3.24 1.038 1.71L14 8.206v8.588l6.374 3.87-1.038 1.71L14 19.134V22h-2v-4.08L3.073 12.5 12 7.08V2h2zm-2 7.42L6.927 12.5 12 15.58V9.42z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-analytics" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v20H2V2zm2 2v16h16V4H4zm14 4v3h-2V8h2zm-5 2v3h-2v-3h2zm-5 2v6H6v-6h2zm10 1v5h-2v-5h2zm-5 2v3h-2v-3h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-analytics-filled" xmlns="http://www.w3.org/2000/svg"><path d="M22 2v20H2V2h20zm-4 9V8h-2v3h2zm-5 2v-3h-2v3h2zm-5 5v-6H6v6h2zm10 0v-5h-2v5h2zm-5 0v-3h-2v3h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-anchor" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a2 2 0 100 4 2 2 0 000-4zM8 5a4 4 0 115 3.874V10.5h4.5v2H13v8.458c3.133-.267 5.643-1.796 6.802-4.228l-1.23-1.23 4.048-4.048-.135 2.6C22.19 19.74 17.455 23 12 23c-5.455 0-10.19-3.26-10.485-8.948l-.135-2.6L5.427 15.5l-1.23 1.23c1.159 2.432 3.67 3.96 6.802 4.228V12.5H6.5v-2H11V8.874A4.002 4.002 0 018 5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-angry" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a9 9 0 100 18 9 9 0 000-18zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm5.769-3.866l3.464 2-1 1.732-3.464-2 1-1.732zm11.464 1.732l-3.464 2-1-1.732 3.464-2 1 1.732zM7.67 15.499A4.998 4.998 0 0112 13a4.998 4.998 0 014.33 2.5l.501.865-1.731 1.001-.5-.865C14.08 15.6 13.11 15 12 15s-2.079.601-2.6 1.5l-.5.866-1.731-1.001.5-.866z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-angry-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 23C5.925 23 1 18.075 1 12S5.925 1 12 1s11 4.925 11 11-4.925 11-11 11zm-1.767-12.866l-3.464-2-1 1.732 3.464 2 1-1.732zm4.536 1.732l3.464-2-1-1.732-3.464 2 1 1.732zM11.999 13a4.998 4.998 0 00-4.33 2.5l-.5.865 1.73 1.001.502-.866C9.92 15.601 10.89 15 12 15c1.109 0 2.079.601 2.6 1.5l.5.866 1.731-1.001-.5-.866A4.998 4.998 0 0012 13z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-animation" xmlns="http://www.w3.org/2000/svg"><path d="M11.09 7.054l.11-.46c.018-.061.037-.121.057-.181l.371-.841a5 5 0 116.491 6.958l-.532.213a5.258 5.258 0 01-.117.037l-.511.128a5 5 0 01-5.87-5.854zM9.47 5.471a7.022 7.022 0 00-4 4A7.002 7.002 0 008 23a7.002 7.002 0 006.529-4.47c.132-.052.262-.107.39-.166l.338-.135-.01-.026a7.026 7.026 0 003.282-3.674c.132-.051.263-.106.392-.165l.336-.135-.01-.026A7 7 0 109.47 5.471zM16 15a5.021 5.021 0 01-1.882 1.53l-.53.212-.12.04-.507.126a5 5 0 01-5.872-5.853l.111-.461c.018-.061.037-.121.057-.181l.372-.842A5.024 5.024 0 019 7.999V8a7 7 0 007 7zM5 12a7 7 0 007 7 5 5 0 11-7-7z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 25" id="t-icon-animation-1" xmlns="http://www.w3.org/2000/svg"><path d="M11.41.06l3.716 6.174 7.02 1.626-4.724 5.44.623 7.18-6.635-2.812-6.634 2.811.623-7.178L.676 7.86l7.02-1.626L11.41.061zm0 3.88L8.972 7.99 4.365 9.058l3.1 3.572-.41 4.711 4.355-1.845 4.355 1.845-.409-4.711 3.1-3.572-4.607-1.067L11.41 3.94zm9.453 10.071l2.475 2.475-1.414 1.414-2.475-2.474 1.414-1.415zm-8.296 6.116l2.474 2.475-1.414 1.414-2.475-2.475 1.415-1.414zm6.578 0l2.474 2.475-1.414 1.414-2.475-2.475 1.415-1.414z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 25" id="t-icon-animation-1-filled" xmlns="http://www.w3.org/2000/svg"><path d="M11.41.06l3.716 6.174 7.019 1.626-4.723 5.44.623 7.18-6.635-2.812-6.634 2.811.623-7.178L.676 7.86l7.019-1.626L11.41.061zm9.453 13.951l2.475 2.475-1.414 1.414-2.475-2.474 1.414-1.415zm-8.297 6.116l2.475 2.475-1.414 1.414-2.475-2.475 1.414-1.414zm6.578 0l2.475 2.475-1.414 1.414-2.475-2.475 1.414-1.414z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-animation-filled" xmlns="http://www.w3.org/2000/svg"><path d="M16.5 14a6.5 6.5 0 100-13 6.5 6.5 0 000 13z" fill="currentColor"/><path d="M17.143 15.976a8.5 8.5 0 01-9.119-9.118 6.5 6.5 0 109.119 9.118z" fill="currentColor"/><path d="M12.642 20.476a8.5 8.5 0 01-9.118-9.119 6.5 6.5 0 109.118 9.119z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-anticlockwise" xmlns="http://www.w3.org/2000/svg"><path d="M4.333 5a3 3 0 013-3H13v2H7.333a1 1 0 00-1 1v6.5H4.34L.586 7.446l1.467-1.36 2.28 2.462V5zM8 6h15v15H8V6zm2 2v11h11V8H10z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-anticlockwise-filled" xmlns="http://www.w3.org/2000/svg"><path d="M4.333 5a3 3 0 013-3H13v2H7.333a1 1 0 00-1 1v6.5H4.34L.586 7.446l1.467-1.36 2.28 2.462V5zM8 6h15v15H8V6z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-api" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_8726_7197)"><path d="M.586 12L5 7.586 6.414 9l-3 3 3 3L5 16.414.586 12zm7-7L12 .586 16.414 5 15 6.414l-3-3-3 3L7.586 5zM9 17.586l3 3 3-3L16.414 19 12 23.414 7.586 19 9 17.586zm1.998-4.584v-2.004h2.004v2.004h-2.004zM17.586 15l3-3-3-3L19 7.586 23.414 12 19 16.414 17.586 15z" fill="currentColor"/></g></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-app" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 3.5a3 3 0 100 6 3 3 0 000-6zm-5 3a5 5 0 1110 0 5 5 0 01-10 0zM2 2h9v9H2V2zm2 2v5h5V4H4zm-2 9h9v9H2v-9zm2 2v5h5v-5H4zm9-2h9v9h-9v-9zm7 2h-5v5h5v-5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-app-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12.5 6.5a5 5 0 1110 0 5 5 0 01-10 0zM2 2h9v9H2V2zm0 11h9v9H2v-9zm11 0h9v9h-9v-9z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-apple" xmlns="http://www.w3.org/2000/svg"><path d="M13 2v2.404l.152-.025.275-.05c.329-.059.698-.126 1.065-.165 1.025-.111 2.153-.03 3.492.711C20.622 6.335 22 9.1 22 12.5c0 4.28-2.71 8.3-6.189 9.439-1.04.34-1.785.156-2.404-.072l-.272-.102c-.416-.159-.695-.265-1.135-.265-.44 0-.718.106-1.134.265-.084.032-.174.067-.272.103-.62.228-1.366.413-2.407.07C4.72 20.797 2 16.782 2 12.5c0-3.4 1.378-6.16 4.015-7.624 1.34-.744 2.468-.825 3.494-.714.366.04.736.107 1.064.167l.275.05.152.025V2h2zm-2 4.427c-.172-.024-.337-.05-.494-.078l-.34-.061a12.243 12.243 0 00-.873-.137c-.7-.076-1.397-.032-2.308.473C5.12 7.66 4 9.657 4 12.5c0 3.557 2.288 6.708 4.813 7.538.458.151.711.092 1.09-.047l.19-.073c.429-.168 1.068-.418 1.907-.418s1.478.25 1.906.417l.19.073c.38.14.634.198 1.093.048C17.718 19.21 20 16.058 20 12.5c0-2.844-1.12-4.843-2.985-5.875-.91-.505-1.608-.549-2.308-.473-.29.031-.562.08-.874.137-.108.02-.22.04-.34.06-.157.027-.321.054-.493.078v1.402c.174-.061.341-.139.5-.23l.865-.5 1.001 1.73-.866.501A4.982 4.982 0 0112 10c-.91 0-1.764-.244-2.5-.67l-.866-.5 1.001-1.731.866.5c.158.091.325.169.499.23V6.427z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-apple-filled" xmlns="http://www.w3.org/2000/svg"><path d="M13 4.404V2h-2v2.404l-.152-.026-.275-.05c-.328-.059-.698-.126-1.064-.166-1.026-.111-2.155-.03-3.494.714C3.378 6.339 2 9.1 2 12.5c0 4.282 2.719 8.297 6.187 9.438 1.041.343 1.787.158 2.407-.07.098-.036.188-.07.272-.103.416-.159.695-.265 1.134-.265.44 0 .719.106 1.135.265h.001l.27.102c.62.227 1.365.412 2.405.072C19.291 20.799 22 16.78 22 12.5c0-3.4-1.38-6.165-4.015-7.625-1.34-.742-2.468-.822-3.493-.712-.367.04-.737.107-1.065.166a39.198 39.198 0 01-.427.075zM9 6s1.875.636 3 .636S15 6 15 6s-.742 2-3 2-3-2-3-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-application" xmlns="http://www.w3.org/2000/svg"><path d="M12 .845l9.66 5.578v11.154L12 23.155l-9.66-5.578V6.423L12 .845zm0 2.31L4.34 7.577v8.846L12 20.845l7.66-4.422V7.577L12 3.155zM8.723 8.613L12 10.798l3.277-2.185 1.11 1.664L13 12.535V16h-2v-3.465l-3.387-2.258 1.11-1.664z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-application-filled" xmlns="http://www.w3.org/2000/svg"><path d="M21.66 6.423v11.154L12 23.155l-9.66-5.578V6.423L12 .845l9.66 5.578zM12 10.798L8.723 8.613l-1.11 1.664L11 12.535V16h2v-3.465l3.387-2.258-1.11-1.664L12 10.798z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-architecture-hui-style" xmlns="http://www.w3.org/2000/svg"><path d="M12.8 1.4L12 .333 11.2 1.4l-.004.005-.012.016-.049.065-.19.249a77.167 77.167 0 01-2.948 3.607c-.865.988-1.77 1.952-2.568 2.66-.4.356-.75.627-1.035.803-.246.151-.37.185-.396.193v-.002l-.004-1-2 .008.004 1c.001.405.106.908.459 1.327.378.45.928.67 1.543.67v9H2v2h20v-2h-2v-9c.614 0 1.165-.22 1.543-.67.353-.42.457-.924.457-1.33V8h-2v.996c-.03-.008-.154-.044-.394-.192a7.838 7.838 0 01-1.036-.802c-.797-.71-1.703-1.673-2.568-2.661a73.401 73.401 0 01-3.138-3.856l-.049-.065-.012-.016L12.8 1.4zM16.704 9H7.295A37.908 37.908 0 009.502 6.66 75.394 75.394 0 0012 3.637l.184.234a75.42 75.42 0 002.313 2.788A37.9 37.9 0 0016.704 9zM6 11h12v9h-3v-3a3 3 0 00-6 0v3H6v-9zm7 9h-2v-3a1 1 0 112 0v3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-architecture-hui-style-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .333l.803 1.072.012.016.05.065c.042.057.107.141.19.249a78.298 78.298 0 002.947 3.607c.865.988 1.77 1.952 2.568 2.66.4.356.75.627 1.036.803.238.147.362.183.393.192V8h2v1c0 .407-.104.91-.456 1.33-.378.451-.93.67-1.544.67H4c-.614 0-1.165-.22-1.543-.669-.352-.419-.457-.922-.458-1.327l-.004-1 2-.008.004 1v.002H4c.03-.01.154-.046.393-.193a7.836 7.836 0 001.036-.802c.797-.71 1.703-1.673 2.568-2.661a73.466 73.466 0 003.138-3.856l.049-.065.012-.016.803-1.072zM4 13v7H2v2h7v-3a3 3 0 016 0v3h7v-2h-2v-7H4z" fill="currentColor"/><path d="M12 18a1 1 0 00-1 1v3h2v-3a1 1 0 00-1-1z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-archway" xmlns="http://www.w3.org/2000/svg"><path d="M6 2v1h12V2h2v1h1v2h-.78l.6 3H22v2h-1v10h1v2H2v-2h1V10H2V8h1.18l.6-3H3V3h1V2h2zm-.18 3l-.6 3h13.56l-.6-3H5.82zM19 10h-3v10h3V10zm-5 10V10h-4v10h4zm-6 0V10H5v10h3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-archway-1" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v5h-2.915l.385 3H22v2h-2.274l1.393 10.865-1.984.254L17.71 12H6.258l-1.39 11.116-1.984-.248L4.242 12H2v-2h2.492l.375-3H2V2zm4.883 5l-.375 3H11V7H6.883zM13 7v3h4.454l-.385-3H13zM4 4v1h16V4H4z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-archway-1-filled" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v5h-2.915l.385 3H22v2h-2.274l1.393 10.865-1.984.254L17.71 12H6.258l-1.39 11.116-1.984-.248L4.242 12H2v-2h2.492l.375-3H2V2zm4.883 5l-.375 3H11V7H6.883zM13 7v3h4.454l-.385-3H13z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-archway-filled" xmlns="http://www.w3.org/2000/svg"><path d="M6 2v1h12V2h2v1h1v2h-.78l.6 3H22v2h-1v10h1v2H2v-2h1V10H2V8h1.18l.6-3H3V3h1V2h2zm13 8h-3v10h3V10zm-5 10V10h-4v10h4zm-6 0V10H5v10h3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-down" xmlns="http://www.w3.org/2000/svg"><path d="M11 4.5v11.586l-4.5-4.5L5.086 13 12 19.914 18.914 13 17.5 11.586l-4.5 4.5V4.5h-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-down-circle" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a9 9 0 100 18 9 9 0 000-18zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm12-5.5v7.586l3-3 1.414 1.414L12 17.914 6.586 12.5 8 11.086l3 3V6.5h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-down-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M23 12c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11zm-7 0l-4 6.25L8 12h3V6h2v6h3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-down-rectangle" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v20H2V2zm2 2v16h16V4H4zm9 2.5v7.586l3-3 1.414 1.414L12 17.914 6.586 12.5 8 11.086l3 3V6.5h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-down-rectangle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v20H2V2zm10 16.25L16 12h-3V6h-2v6H8l4 6.25z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left" xmlns="http://www.w3.org/2000/svg"><path d="M19.5 13H7.914l4.5 4.5L11 18.914 4.086 12 11 5.086 12.414 6.5l-4.5 4.5H19.5v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-circle" xmlns="http://www.w3.org/2000/svg"><path d="M21 12a9 9 0 10-18 0 9 9 0 0018 0zM12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1zm5.5 12H9.914l3 3-1.414 1.414L6.086 12 11.5 6.586 12.914 8l-3 3H17.5v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1zm0 7l-6.25 4L12 16v-3h6v-2h-6V8z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-down" xmlns="http://www.w3.org/2000/svg"><path d="M18.01 7.404L9.82 15.596h6.364v2H6.404V7.818h2v6.364l8.193-8.192 1.414 1.414z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-down-circle" xmlns="http://www.w3.org/2000/svg"><path d="M3 12a9 9 0 1018 0 9 9 0 00-18 0zm9 11C5.925 23 1 18.075 1 12S5.925 1 12 1s11 4.925 11 11-4.925 11-11 11zm-4.182-6.819V8.524h2v4.243l5.364-5.364 1.414 1.414-5.364 5.364h4.243v2H7.818z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-down-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M4.222 4.222c4.296-4.296 11.26-4.296 15.556 0 4.296 4.296 4.296 11.26 0 15.556-4.296 4.296-11.26 4.296-15.556 0-4.296-4.296-4.296-11.26 0-15.556zm4.95 4.95L7.58 16.419l7.247-1.59-2.12-2.122 4.242-4.243-1.414-1.414-4.243 4.243-2.121-2.121z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-right-1" xmlns="http://www.w3.org/2000/svg"><path d="M3.586 16.5L8.5 11.586 9.914 13l-2.5 2.5H19.5v2H7.414l2.5 2.5L8.5 21.414 3.586 16.5zm.914-10h12.086l-2.5-2.5L15.5 2.586 20.414 7.5 15.5 12.414 14.086 11l2.5-2.5H4.5v-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-right-2" xmlns="http://www.w3.org/2000/svg"><path d="M21.5 17.5h-8.586l3 3-1.414 1.414L9.086 16.5l5.414-5.414 1.414 1.414-3 3H21.5v2zm-6.586-10L9.5 12.914 8.086 11.5l3-3H2.5v-2h8.586l-3-3L9.5 2.086 14.914 7.5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-right-3" xmlns="http://www.w3.org/2000/svg"><path d="M20.914 7.5L15.5 12.914 14.086 11.5l3-3H8.5v-2h8.586l-3-3L15.5 2.086 20.914 7.5zm-5.414 10H6.914l3 3L8.5 21.914 3.086 16.5 8.5 11.086 9.914 12.5l-3 3H15.5v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-right-circle" xmlns="http://www.w3.org/2000/svg"><path d="M3 12a9 9 0 1018 0 9 9 0 00-18 0zm9 11C5.925 23 1 18.075 1 12S5.925 1 12 1s11 4.925 11 11-4.925 11-11 11zm-6.914-8L9 11.086l1.414 1.414-1.5 1.5H14v2H8.914l1.5 1.5L9 18.914 5.086 15zM10 8h5.086l-1.5-1.5L15 5.086 18.914 9 15 12.914 13.586 11.5l1.5-1.5H10V8z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-right-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M23 12c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11zm-13.5-.5V14H14v2H9.5v2.5L5 15l4.5-3.5zM19 9l-4.5 3.5V10H10V8h4.5V5.5L19 9z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-up" xmlns="http://www.w3.org/2000/svg"><path d="M16.596 18.01L8.403 9.818v6.364h-2V6.404h9.778v2H9.819l8.192 8.192-1.414 1.414z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-up-circle" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a9 9 0 100 18 9 9 0 000-18zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm6.818-4.182h7.657v2h-4.243l5.364 5.364-1.414 1.414-5.364-5.364v4.243h-2V7.818z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-left-up-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M19.778 4.222c4.296 4.296 4.296 11.26 0 15.556-4.296 4.296-11.26 4.296-15.556 0-4.296-4.296-4.296-11.26 0-15.556 4.296-4.296 11.26-4.296 15.556 0zm-4.95 4.95L7.581 7.58l1.59 7.247 2.122-2.12 4.243 4.242 1.414-1.414-4.243-4.243 2.121-2.121z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right" xmlns="http://www.w3.org/2000/svg"><path d="M4.5 11h11.586l-4.5-4.5L13 5.086 19.914 12 13 18.914 11.586 17.5l4.5-4.5H4.5v-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-circle" xmlns="http://www.w3.org/2000/svg"><path d="M3 12a9 9 0 1118 0 9 9 0 01-18 0zm9-11C5.925 1 1 5.925 1 12s4.925 11 11 11 11-4.925 11-11S18.075 1 12 1zM6.5 13h7.586l-3 3 1.414 1.414L17.914 12 12.5 6.586 11.086 8l3 3H6.5v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 23C5.925 23 1 18.075 1 12S5.925 1 12 1s11 4.925 11 11-4.925 11-11 11zm0-7l6.25-4L12 8v3H6v2h6v3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-down" xmlns="http://www.w3.org/2000/svg"><path d="M7.403 5.99l8.193 8.192V7.818h2v9.778H7.818v-2h6.364L5.989 7.404 7.403 5.99z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-down-circle" xmlns="http://www.w3.org/2000/svg"><path d="M12 21a9 9 0 100-18 9 9 0 000 18zm11-9c0 6.075-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1s11 4.925 11 11zm-8.818.768V8.525h2v7.657H8.525v-2h4.243L7.404 8.818l1.414-1.414 5.364 5.364z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-down-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M4.222 19.778c-4.296-4.296-4.296-11.26 0-15.556 4.296-4.296 11.26-4.296 15.556 0 4.296 4.296 4.296 11.26 0 15.556-4.296 4.296-11.26 4.296-15.556 0zm4.95-4.95l7.247 1.591-1.59-7.247-2.122 2.12L8.464 7.05 7.05 8.464l4.243 4.243-2.121 2.121z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-up" xmlns="http://www.w3.org/2000/svg"><path d="M5.99 16.596l8.192-8.192H7.818v-2h9.778v9.778h-2V9.818L7.403 18.01 5.99 16.596z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-up-circle" xmlns="http://www.w3.org/2000/svg"><path d="M21 12a9 9 0 10-18 0 9 9 0 0018 0zM12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1zm.768 8.819H8.525v-2h7.657v7.657h-2v-4.243l-5.364 5.364-1.414-1.414 5.364-5.364z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-right-up-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M19.778 19.778c-4.296 4.296-11.26 4.296-15.556 0-4.296-4.296-4.296-11.26 0-15.556 4.296-4.296 11.26-4.296 15.556 0 4.296 4.296 4.296 11.26 0 15.556zm-4.95-4.95l1.591-7.247-7.247 1.59 2.12 2.122-4.242 4.243 1.414 1.414 4.243-4.243 2.121 2.121z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-triangle-down" xmlns="http://www.w3.org/2000/svg"><path d="M9 12V2h6v10h4.5L12 22 4.5 12H9zm-.5 2l3.5 4.667L15.5 14H13V4h-2v10H8.5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-triangle-down-filled" xmlns="http://www.w3.org/2000/svg"><path d="M15 12h4.5L12 22 4.5 12H9V2h6v10z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-triangle-up" xmlns="http://www.w3.org/2000/svg"><path d="M9 12v10h6V12h4.5L12 2 4.5 12H9zm-.5-2L12 5.333 15.5 10H13v10h-2V10H8.5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-triangle-up-filled" xmlns="http://www.w3.org/2000/svg"><path d="M15 12h4.5L12 2 4.5 12H9v10h6V12z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up" xmlns="http://www.w3.org/2000/svg"><path d="M11 19.5V7.914l-4.5 4.5L5.086 11 12 4.086 18.914 11 17.5 12.414l-4.5-4.5V19.5h-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up-circle" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a9 9 0 100 18 9 9 0 000-18zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm11-5.914l5.414 5.414L16 12.914l-3-3V17.5h-2V9.914l-3 3L6.586 11.5 12 6.086z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M23 12c0 6.075-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1s11 4.925 11 11zm-7 0l-4-6.25L8 12h3v6h2v-6h3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up-down-1" xmlns="http://www.w3.org/2000/svg"><path d="M16.5 20.414L11.586 15.5 13 14.086l2.5 2.5V4.5h2v12.086l2.5-2.5 1.414 1.414-4.914 4.914zm-10-.914V7.414L4 9.914 2.586 8.5 7.5 3.586 12.414 8.5 11 9.914l-2.5-2.5V19.5h-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up-down-2" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 2.5v8.585l3-3L21.914 9.5 16.5 14.914 11.086 9.5 12.5 8.086l3 3V2.5h2zm-10 6.586l5.414 5.414-1.414 1.414-3-3V21.5h-2v-8.586l-3 3L2.086 14.5 7.5 9.086z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up-down-3" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 3.086L12.914 8.5 11.5 9.914l-3-3V15.5h-2V6.914l-3 3L2.086 8.5 7.5 3.086zm10 5.414v8.586l3-3 1.414 1.414-5.414 5.414-5.414-5.414 1.414-1.414 3 3V8.5h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up-down-circle" xmlns="http://www.w3.org/2000/svg"><path d="M12 21a9 9 0 100-18 9 9 0 000 18zm11-9c0 6.075-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1s11 4.925 11 11zm-8 6.914L11.086 15l1.414-1.414 1.5 1.5V10h2v5.086l1.5-1.5L18.914 15 15 18.914zM8 14V8.914l-1.5 1.5L5.086 9 9 5.086 12.914 9 11.5 10.414l-1.5-1.5V14H8z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-arrow-up-down-circle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 23c6.075 0 11-4.925 11-11S18.075 1 12 1 1 5.925 1 12s4.925 11 11 11zm.5-13.5H10V14H8V9.5H5.5L9 5l3.5 4.5zM15 19l-3.5-4.5H14V10h2v4.5h2.5L15 19z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-artboard" xmlns="http://www.w3.org/2000/svg"><path d="M8 2v4h8V2h2v4h4v2h-4v8h4v2h-4v4h-2v-4H8v4H6v-4H2v-2h4V8H2V6h4V2h2zm0 6v8h8V8H8z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-article" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 2h19v20h-19V2zm2 2v16h15V4h-15zM7 7h10v2H7V7zm0 4h10v2H7v-2zm0 4h7v2H7v-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-article-filled" xmlns="http://www.w3.org/2000/svg"><path d="M21.5 2h-19v20h19V2zM17 7v2H7V7h10zm0 4v2H7v-2h10zm-3 6H7v-2h7v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment" xmlns="http://www.w3.org/2000/svg"><path d="M12 2.5a1.5 1.5 0 00-1.376.9l-.262.6H4.5v16h15V4h-5.862l-.262-.6A1.5 1.5 0 0012 2.5zM9.128 2A3.496 3.496 0 0112 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2h6.628zM7 7h10v2H7V7zm0 4h10v2H7v-2zm0 4h7v2H7v-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-checked" xmlns="http://www.w3.org/2000/svg"><path d="M12 2.5a1.5 1.5 0 00-1.376.9l-.262.6H4.5v16h15V4h-5.862l-.262-.6A1.5 1.5 0 0012 2.5zM9.128 2A3.496 3.496 0 0112 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2h6.628zm8.53 7.586l-7.072 7.07-4.242-4.242L7.758 11l2.828 2.829 5.657-5.657 1.414 1.414z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-checked-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2h6.628A3.496 3.496 0 0112 .5zm-1.414 16.157l7.071-7.071-1.414-1.414-5.657 5.656L7.758 11l-1.414 1.414 4.242 4.243z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-code" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 2h6.628A3.496 3.496 0 0112 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2zm2 18h15V4h-5.862l-.262-.6a1.5 1.5 0 00-2.752 0l-.262.6H4.5v16zm1.086-8L9.5 8.086 10.914 9.5l-2.5 2.5 2.5 2.5L9.5 15.914 5.586 12zM14.5 8.086L18.414 12 14.5 15.914 13.086 14.5l2.5-2.5-2.5-2.5L14.5 8.086z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-code-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2h6.628A3.496 3.496 0 0112 .5zM9.5 8.086L5.586 12 9.5 15.914l1.414-1.414-2.5-2.5 2.5-2.5L9.5 8.086zM18.414 12L14.5 8.086 13.086 9.5l2.5 2.5-2.5 2.5 1.414 1.414L18.414 12z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-error" xmlns="http://www.w3.org/2000/svg"><path d="M12 2.5a1.5 1.5 0 00-1.376.9l-.262.6H4.5v16h15V4h-5.862l-.262-.6A1.5 1.5 0 0012 2.5zM9.128 2A3.496 3.496 0 0112 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2h6.628zM13 7.5v6h-2v-6h2zm-2 7.496h2.004V17H11v-2.004z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-error-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2h6.628A3.496 3.496 0 0112 .5zm1 13v-6h-2v6h2zm.004 1.496H11V17h2.004v-2.004z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .5c-1.19 0-2.24.594-2.872 1.5H2.5v20h19V2h-6.628A3.496 3.496 0 0012 .5zM17 7v2H7V7h10zm0 4v2H7v-2h10zm-3 6H7v-2h7v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-user" xmlns="http://www.w3.org/2000/svg"><path d="M12 2.5a1.5 1.5 0 00-1.376.9l-.262.6H4.5v16h15V4h-5.862l-.262-.6A1.5 1.5 0 0012 2.5zM9.128 2A3.496 3.496 0 0112 .5c1.19 0 2.24.594 2.872 1.5H21.5v20h-19V2h6.628zM12 8a1.5 1.5 0 100 3 1.5 1.5 0 000-3zM8.5 9.5a3.5 3.5 0 117 0 3.5 3.5 0 01-7 0zM6 18a4 4 0 014-4h4a4 4 0 014 4v1h-2v-1a2 2 0 00-2-2h-4a2 2 0 00-2 2v1H6v-1z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-assignment-user-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .5c-1.19 0-2.24.594-2.872 1.5H2.5v20h19V2h-6.628A3.496 3.496 0 0012 .5zm-3 9a3 3 0 116 0 3 3 0 01-6 0zM6 18a4 4 0 014-4h4a4 4 0 014 4v1H6v-1z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-attach" xmlns="http://www.w3.org/2000/svg"><path d="M11.314 3.121a5 5 0 117.07 7.071l-7.777 7.778a3 3 0 11-4.243-4.242l7.778-7.778 1.414 1.414-7.778 7.778a1 1 0 101.414 1.414l7.779-7.778a3 3 0 10-4.243-4.243L4.95 12.314a5 5 0 007.07 7.07l8.486-8.485 1.414 1.415-8.485 8.485a7 7 0 01-9.9-9.9l7.779-7.778z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-attic" xmlns="http://www.w3.org/2000/svg"><path d="M12.81 1.414L12 .294l-.81 1.12-.002.003-.009.011-.033.046-.133.18a54.475 54.475 0 01-2.214 2.774c-.687.803-1.45 1.64-2.206 2.364-.767.735-1.48 1.306-2.067 1.622a7.46 7.46 0 01-1.002.459C3.231 8.977 3.062 9 3 9H2v2h1c.328 0 .671-.074 1-.178V20H2v2h20v-2h-2v-9.178c.328.104.672.178 1 .178h1V9h-1c-.062 0-.23-.023-.524-.127a7.46 7.46 0 01-1.002-.46c-.587-.315-1.3-.886-2.067-1.62a33.286 33.286 0 01-2.206-2.365 54.472 54.472 0 01-2.347-2.954l-.033-.046-.008-.011-.003-.003zM16.867 9H7.133c.285-.242.568-.5.843-.763a35.263 35.263 0 002.343-2.509A56.246 56.246 0 0012 3.66c.435.561 1.019 1.293 1.681 2.068a35.242 35.242 0 002.343 2.509c.275.264.558.52.843.763zM6 11h12v9h-3v-3a3 3 0 00-6 0v3H6v-9zm5 9v-3a1 1 0 112 0v3h-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-attic-1" xmlns="http://www.w3.org/2000/svg"><path d="M11.169 1.444L11.999.2l.832 1.243.005.008.02.03.087.125a27.539 27.539 0 001.6 2.04c1.071 1.239 2.484 2.638 3.954 3.486.466.269.956.367 1.501.367h1v2h-1c-.326 0-.66-.025-1-.087V17h2v2h-1v3h-2v-3h-5v3h-2v-3h-5v3h-2v-3h-1v-2H5l-.002-7.586c-.339.061-.674.086-1 .086h-1v-2h1c.545 0 1.035-.098 1.501-.367 1.471-.847 2.885-2.247 3.956-3.486a27.587 27.587 0 001.601-2.04l.087-.125.02-.03.005-.007v-.001zM6.999 9L7 17h2v-2.2a3 3 0 016 0V17h1.998V9h-10zm8.007-2a24.293 24.293 0 01-1.976-2.045c-.4-.462-.747-.895-1.03-1.261-.284.366-.632.799-1.032 1.262A24.295 24.295 0 018.99 7h6.015zM13 17v-2.2a1 1 0 10-2 0V17h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-attic-1-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .201l-.831 1.243h-.001l-.005.007-.02.03-.087.126a27.587 27.587 0 01-1.6 2.04C8.383 4.887 6.97 6.286 5.498 7.133c-.466.269-.956.367-1.5.367H2.997v2h2L5 17H2.998v2h1v3h2v-3h5v3h2v-3h5v3h2v-3h1v-2h-2V9.5h2v-2h-1c-.545 0-1.035-.098-1.5-.367-1.471-.848-2.884-2.247-3.955-3.486a27.539 27.539 0 01-1.6-2.04 12.89 12.89 0 01-.086-.125l-.021-.03-.005-.008L12 .2zM9 14a3 3 0 116 0v3h-2v-3a1 1 0 10-2 0v3H9v-3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-attic-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 .293l.81 1.121.002.003.009.011.033.046.133.18a54.479 54.479 0 002.214 2.774c.687.803 1.45 1.64 2.206 2.364.767.735 1.48 1.306 2.067 1.622.384.206.723.36 1.002.459.293.104.462.127.524.127h1v2h-1.01a3.402 3.402 0 01-.99-.178V11H4v-.178a3.403 3.403 0 01-.99.178H2V9h1c.062 0 .23-.023.524-.127.28-.1.618-.253 1.002-.46.587-.315 1.3-.886 2.067-1.62a33.297 33.297 0 002.205-2.365 54.482 54.482 0 002.348-2.954l.033-.046.008-.011.003-.003.81-1.12zM4 13v7H2v2h7v-3a3 3 0 116 0v3h7v-2h-2v-7H4z" fill="currentColor"/><path d="M12 18a1 1 0 00-1 1v3h2v-3a1 1 0 00-1-1z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-audio" xmlns="http://www.w3.org/2000/svg"><path d="M3 1h18v22H3V1zm2 2v18h14V3H5zm5.996 1.996H13V7h-2.004V4.996zM12 11a3 3 0 100 6 3 3 0 000-6zm-5 3a5 5 0 1110 0 5 5 0 01-10 0z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-audio-filled" xmlns="http://www.w3.org/2000/svg"><path d="M8.75 15a3.25 3.25 0 116.5 0 3.25 3.25 0 01-6.5 0z" fill="currentColor"/><path d="M21 1H3v22h18V1zm-9 8.75a5.25 5.25 0 110 10.5 5.25 5.25 0 010-10.5zm-1.004-4.754H13V7h-2.004V4.996z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-awkward" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a9 9 0 100 18 9 9 0 000-18zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm5-3h4v2H6V9zm8 0h4v2h-4V9zm2 3v2.667h-2V12h2zm3 0v3h-2v-3h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-awkward-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 23C5.925 23 1 18.075 1 12S5.925 1 12 1s11 4.925 11 11-4.925 11-11 11zM10 9H6v2h4V9zm8 0h-4v2h4V9zm-2 5.667V12h-2v2.667h2zM19 15v-3h-2v3h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-backtop" xmlns="http://www.w3.org/2000/svg"><path d="M4 4h16v2H4V4zm8 3.586l6.914 6.914-1.414 1.414-4.5-4.5V21h-2v-9.586l-4.5 4.5L5.086 14.5 12 7.586z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-backtop-rectangle" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v20H2V2zm2 2v16h16V4H4zm13.5 4h-11V6h11v2zm-5.5.808l4.596 4.596-1.414 1.414L13 12.636V18.5h-2v-5.864l-2.182 2.182-1.414-1.414L12 8.808z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-backtop-rectangle-filled" xmlns="http://www.w3.org/2000/svg"><path d="M22 2H2v20h20V2zM6.5 8V6h11v2h-11zM12 9l4 5h-3v4.5h-2V14H8l4-5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-backup" xmlns="http://www.w3.org/2000/svg"><path d="M12 4a5.5 5.5 0 00-5.49 5.15l-.048.783-.77.14A4.502 4.502 0 006.5 19h11a4.5 4.5 0 00.809-8.928l-.771-.14-.049-.781A5.5 5.5 0 0012 4zM4.598 8.283a7.502 7.502 0 0114.804 0A6.502 6.502 0 0117.5 21h-11A6.5 6.5 0 014.598 8.283zM12 7.086l4.414 4.414L15 12.914l-2-2V17h-2v-6.086l-2 2L7.586 11.5 12 7.086z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-backup-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 2c3.728 0 6.82 2.72 7.402 6.283A6.502 6.502 0 0117.5 21h-11A6.5 6.5 0 014.598 8.283 7.502 7.502 0 0112 2zm3 10.914l1.414-1.414L12 7.086 7.586 11.5 9 12.914l2-2V17h2v-6.086l2 2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-backward" xmlns="http://www.w3.org/2000/svg"><path d="M11.25 4.336v7l7-7v15.328l-7-7v7L3.586 12l7.664-7.664zM6.414 12l2.836 2.836V9.164L6.414 12zm7 0l2.836 2.836V9.164L13.414 12z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-backward-filled" xmlns="http://www.w3.org/2000/svg"><path d="M11.25 4.336v7l7-7v15.328l-7-7v7L3.586 12l7.664-7.664z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bad-laugh" xmlns="http://www.w3.org/2000/svg"><path d="M12 3a9 9 0 100 18 9 9 0 000-18zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm5.769-3.866l3.464 2-1 1.732-3.464-2 1-1.732zm11.464 1.732l-3.464 2-1-1.732 3.464-2 1 1.732zM7 13h10v1a5 5 0 01-10 0v-1zm2.17 2a3.001 3.001 0 005.66 0H9.17z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bad-laugh-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 23C5.925 23 1 18.075 1 12S5.925 1 12 1s11 4.925 11 11-4.925 11-11 11zm-1.767-12.866l-3.464-2-1 1.732 3.464 2 1-1.732zm4.536 1.732l3.464-2-1-1.732-3.464 2 1 1.732zM11.999 19a5 5 0 005-5H7a5 5 0 005 5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bamboo-shoot" xmlns="http://www.w3.org/2000/svg"><path d="M19.843 4.228a20.86 20.86 0 00-3.39.904l.53 2.62.239 1.173 1.167.117c.74-1.766 1.136-3.216 1.347-4.244.043-.208.078-.398.107-.57zM17.5 10.963l-1.24-.124-7.036-1.13 1.796 10.362c3.124-3.37 5.157-6.49 6.48-9.108zM9.028 20.29L7.291 10.265a47.329 47.329 0 00-4.19 3.64 18.107 18.107 0 003.028 4.037 18.371 18.371 0 002.9 2.348zm1.666-12.37l4.427.71-.097-.48-.46-2.268a32.474 32.474 0 00-3.87 2.037zm11.3-5.844l-.018 1.087a9.326 9.326 0 01-.04.531c-.038.354-.108.863-.24 1.507-.266 1.287-.778 3.111-1.768 5.318-1.532 3.412-4.202 7.726-8.85 12.373l-.478.479-.623-.267c-.933-.4-3.187-1.672-5.263-3.748-2.075-2.075-3.347-4.329-3.747-5.263L.7 13.472l.479-.479C3.352 10.82 5.452 9.08 7.422 7.684c2.839-2.01 5.403-3.298 7.52-4.124 1.81-.706 3.29-1.072 4.33-1.263.52-.095.93-.145 1.216-.173a8.422 8.422 0 01.43-.03l1.077-.018z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bamboo-shoot-filled" xmlns="http://www.w3.org/2000/svg"><path d="M21.99 2.442l.005-.366-.363.004c-.27.002-.54.004-.81.019-.079.004-.19.012-.334.025-.286.028-.696.078-1.216.173-.848.155-1.988.428-3.362.906l1.31 5.801 3.07.673c.758-1.83 1.175-3.357 1.405-4.476.133-.644.203-1.153.24-1.508.02-.177.03-.316.036-.414.016-.278.018-.558.02-.837zM19.448 11.54l-3.273-.717-7.67-1.618 2.975 13.281c3.96-4.042 6.43-7.817 7.968-10.947zM9.52 22.89L6.299 8.506a49.67 49.67 0 00-5.12 4.486L.7 13.47l.267.623c.4.933 1.672 3.187 3.747 5.262 1.79 1.79 3.712 2.982 4.807 3.533zM8.256 7.109l6.81 1.436-1.04-4.61c-1.704.731-3.653 1.751-5.77 3.174z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-banana" xmlns="http://www.w3.org/2000/svg"><path d="M17.487.613v7.15c-.304.593-.731 1.264-1.504 1.847-.862.648-2.243 1.253-4.556 1.392-2.553.154-4.66-1.15-5.241-1.717-.591-.577-1.42-.503-1.96-.064-.51.415-.739 1.082-.739 1.78 0 .727.071 1.403.264 2.023a1.622 1.622 0 00-.818-.102 1.518 1.518 0 00-.916.492c-.41.452-.53 1.072-.53 1.586 0 4.238 5.048 9.767 13.323 6.947l.024-.008.023-.01c4.425-1.759 6.655-4.465 7.588-7.23.889-2.633.563-5.2.042-6.856V2.279l-5-1.666zM8.755 14.625c-1.475-.467-2.242-.918-2.666-1.409-.359-.417-.564-.975-.597-1.931 1.236.861 3.458 1.87 6.055 1.713 1.607-.096 2.898-.397 3.94-.83-.619.884-1.27 1.498-1.928 1.913-1.41.89-3.023.97-4.804.544zM20.487 3.721v4.442l.052.153c.45 1.353.754 3.542.011 5.743-.725 2.15-2.489 4.438-6.409 6.003-6.968 2.361-10.556-2.177-10.652-4.948 1.404.644 2.984 1.021 4.31 1.339l.453.108c2.11.512 4.343.494 6.375-.79 2.009-1.268 3.636-3.657 4.816-7.476l.044-.144V3.388l1 .333z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-banana-filled" xmlns="http://www.w3.org/2000/svg"><path d="M18.6 1.501l3.3 1.5v5.5c3.04 3.828-.448 11.441-7.691 13.122C6.965 23.304 1 19.5 1 15.501 1 14 1.738 13.195 3 14c1.262.805 3.098 1.683 4.86 2.072C13.223 17.253 17.919 14.5 18.6 8.5v-7z" fill="currentColor"/><path d="M8.237 15.072C13.11 16.253 17.379 13.5 18 7.5c-.678 1.385-2.064 3.703-7 4-2.883.173-5.449-.803-6.183-1.152-.734-.35-1.137.152-.921 1.026.216.873 1.26 2.727 4.34 3.697z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-barbecue" xmlns="http://www.w3.org/2000/svg"><path d="M13.316 2.796a2.717 2.717 0 013.842 0l1.316 1.316 1.619-1.619 1.414 1.414-1.619 1.619 1.316 1.316a2.717 2.717 0 010 3.842l-1.214 1.214c-.46.46-1.045.72-1.645.782-.061.6-.322 1.185-.782 1.646l-1.214 1.213c-.46.46-1.045.722-1.646.782a2.706 2.706 0 01-.782 1.646l-1.214 1.214a2.717 2.717 0 01-3.842 0L7.55 17.865l-1.618 1.619-.708-.708a.717.717 0 10-.267 1.183l.943-.332.665 1.887-.944.332a2.717 2.717 0 11.176-5.056l.339-.34-1.316-1.315a2.717 2.717 0 010-3.842l1.214-1.214a2.705 2.705 0 011.646-.782c.06-.6.321-1.185.781-1.646l1.214-1.214a2.706 2.706 0 011.646-.781c.061-.601.322-1.186.782-1.646l1.214-1.214zm.2 3.641l4.047 4.047c.28.28.733.28 1.013 0L19.79 9.27a.717.717 0 000-1.014L18.474 6.94l-.974.974L16.086 6.5l.974-.974-1.316-1.316a.717.717 0 00-1.014 0l-1.214 1.214a.717.717 0 000 1.013zm2.632 5.46l-4.046-4.045a.717.717 0 00-1.013 0L9.875 9.065a.717.717 0 000 1.014l4.046 4.046c.28.28.734.28 1.014 0l1.213-1.214a.717.717 0 000-1.013zm-3.641 3.643L8.46 11.492a.717.717 0 00-1.014 0l-1.214 1.214a.717.717 0 000 1.014l4.046 4.046c.28.28.734.28 1.014 0l1.214-1.214a.717.717 0 000-1.014z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-barbecue-filled" xmlns="http://www.w3.org/2000/svg"><path d="M13.316 2.796a2.717 2.717 0 013.842 0l1.316 1.316 1.619-1.619 1.414 1.414-1.619 1.619 1.316 1.316a2.717 2.717 0 010 3.842l-1.214 1.214c-.46.46-1.045.72-1.645.782-.061.6-.322 1.185-.782 1.646l-1.214 1.213c-.46.46-1.045.722-1.646.782a2.706 2.706 0 01-.782 1.646l-1.214 1.214a2.717 2.717 0 01-3.842 0L7.55 17.865l-1.618 1.619-.708-.708a.717.717 0 10-.267 1.183l.943-.332.665 1.887-.944.332a2.717 2.717 0 11.176-5.056l.339-.34-1.316-1.315a2.717 2.717 0 010-3.842l1.214-1.214a2.705 2.705 0 011.646-.782c.06-.6.321-1.185.781-1.646l1.214-1.214a2.706 2.706 0 011.646-.781c.061-.601.322-1.186.782-1.646l1.214-1.214zm.2 3.641l4.047 4.047c.28.28.733.28 1.013 0L19.79 9.27a.717.717 0 000-1.014L18.474 6.94l-.974.974L16.086 6.5l.974-.974-1.316-1.316a.717.717 0 00-1.014 0l-1.214 1.214a.717.717 0 000 1.013zm-1.01 9.102L8.46 11.494a.717.717 0 00-1.013 0l-1.214 1.214a.717.717 0 000 1.014l4.046 4.046c.28.28.734.28 1.014 0l1.214-1.214a.717.717 0 000-1.014z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-barcode" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h3v19H2V2zm6.75 0v19h-2V2h2zm1.75 0h3v19h-3V2zm6.75 0v19h-2V2h2zM19 2h3v19h-3V2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-barcode-1" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h7v2H4v5H2V2zm13 0h7v7h-2V4h-5V2zM9 8v8H7V8h2zm4 0v8h-2V8h2zm4 0v8h-2V8h2zM4 15v5h5v2H2v-7h2zm18 0v7h-7v-2h5v-5h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-base-station" xmlns="http://www.w3.org/2000/svg"><path d="M6.344 3.93l-.707.707a9 9 0 000 12.728l.707.707-1.414 1.414-.707-.707c-4.296-4.296-4.296-11.26 0-15.557l.707-.707L6.344 3.93zM19.07 2.515l.708.707c4.295 4.296 4.295 11.261 0 15.557l-.707.707-1.415-1.414.707-.707a9 9 0 000-12.728l-.707-.707 1.415-1.415zM9.526 7.111l-.707.707a4.5 4.5 0 000 6.364l.707.707-1.414 1.415-.708-.707a6.5 6.5 0 010-9.193l.708-.707 1.414 1.414zm6.363-1.414l.707.707a6.5 6.5 0 010 9.193l-.707.707-1.414-1.415.707-.707a4.5 4.5 0 000-6.364l-.707-.707 1.414-1.414zM10 11a2 2 0 113 1.732V23h-2V12.732A2 2 0 0110 11z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery" xmlns="http://www.w3.org/2000/svg"><path d="M0 5h21v14H0V5zm2 2v10h17V7H2zm22 2v6h-2V9h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery-add" xmlns="http://www.w3.org/2000/svg"><path d="M8 .5h8V3h5v20.5H3V3h5V.5zm2 2V5H5v16.5h14V5h-5V2.5h-4zm3 7v3h3v2h-3v3h-2v-3H8v-2h3v-3h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery-add-filled" xmlns="http://www.w3.org/2000/svg"><path d="M16 .5H8V3H3v20.5h18V3h-5V.5zm0 14h-3v3h-2v-3H8v-2h3v-3h2v3h3v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery-charging" xmlns="http://www.w3.org/2000/svg"><path d="M12.376 5.172L8.79 11h6l-5.462 8.876-1.704-1.048L11.21 13h-6l5.462-8.876 1.704 1.048zM0 5h7.5v2H2v10h4v2H0V5zm14 0h7v14h-8v-2h6V7h-5V5zm10 4v6h-2V9h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery-charging-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12.375 5.172l-1.703-1.048L5.21 13h6l-3.586 5.828 1.703 1.048L14.79 11h-6l3.586-5.828z" fill="currentColor"/><path d="M0 5h8.372l-5.846 9.5h6L5.756 19H0V5zM21 19h-9.373l5.846-9.5h-6l2.77-4.5H21v14zM24 9v6h-2V9h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery-filled" xmlns="http://www.w3.org/2000/svg"><path d="M0 5h21v14H0V5zm24 4v6h-2V9h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery-low" xmlns="http://www.w3.org/2000/svg"><path d="M0 5h21v14H0V5zm2 2v10h17V7H2zm4 2v6H4V9h2zm18 0v6h-2V9h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-battery-low-filled" xmlns="http://www.w3.org/2000/svg"><path d="M21 5H0v14h21V5zM6 15H4V9h2v6zM24 15V9h-2v6h2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bean" xmlns="http://www.w3.org/2000/svg"><path d="M12.164 2.636C13.166 2.118 14.28 2 15.56 2c1.908 0 3.603.782 4.777 2.173 1.169 1.385 1.77 3.306 1.646 5.514-.218 3.917-1.81 7.018-4.259 9.132C15.288 20.923 12.063 22 8.645 22a8.406 8.406 0 01-5.165-1.82C2.042 19.029 1 17.34 1 15.317c0-1.39.34-2.598 1.07-3.615.722-1.005 1.767-1.742 3.041-2.304.344-.152.707-.291 1.087-.42 1.353-.46 1.88-.817 2.137-1.34.457-.935.878-1.727 1.289-2.392.755-1.22 1.526-2.085 2.54-2.61zm-.433 3.05c1.702 2.194 1.298 4.748-.243 6.224a4.097 4.097 0 01-3.228 1.142c-1.045-.098-2.074-.596-2.986-1.508-.714.392-1.227.832-1.58 1.324C3.25 13.486 3 14.265 3 15.316c0 1.29.658 2.444 1.731 3.304A6.407 6.407 0 008.645 20c3.006 0 5.748-.945 7.773-2.694 2.014-1.74 3.38-4.323 3.57-7.73.099-1.785-.39-3.18-1.178-4.113C18.028 4.537 16.899 4 15.56 4c-1.193 0-1.912.12-2.479.412-.438.227-.864.599-1.35 1.274zM7.373 10.68c.386.238.752.35 1.075.38a2.097 2.097 0 001.657-.595c.646-.619 1.006-1.695.479-2.85-.145.28-.295.578-.453.9-.563 1.15-1.603 1.73-2.758 2.165z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bean-filled" xmlns="http://www.w3.org/2000/svg"><path d="M17.55 2.174c-1.628-.657-3.088-.668-4.348-.203-1.238.456-2.18 1.332-2.873 2.271-.485.658-.786 1.397-1.035 2.007l-.11.27c-.29.695-.561 1.246-1.024 1.708-.456.456-1.003.727-1.7 1.018-.086.037-.177.074-.271.113-.611.25-1.35.553-2.01 1.035-.961.703-1.852 1.648-2.309 2.89-.465 1.266-.437 2.724.24 4.346 1.178 2.817 3.988 4.446 7.085 4.69 3.113.246 6.61-.884 9.392-3.665 2.946-2.947 4.105-6.457 3.815-9.558-.29-3.09-2.035-5.786-4.852-6.922zm-10.782 8.86a3.043 3.043 0 01-.193-.212l.164-.068.301-.124c.723-.303 1.505-.666 2.181-1.342.683-.683 1.046-1.468 1.347-2.192l.123-.299.089-.214a3 3 0 11-4.012 4.451z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-beer" xmlns="http://www.w3.org/2000/svg"><path d="M5.152 4c.52-1.695 2.316-3 4.348-3 .988 0 1.915.316 2.664.77A4.96 4.96 0 0113.55 3h.95A3.5 3.5 0 0118 6.5v.014c0 .237 0 .863-.117 1.486H19c.497 0 1.054.126 1.474.56.415.428.526.98.526 1.457V18c0 .476-.111 1.031-.535 1.457-.424.428-.981.543-1.465.543h-2v1c0 .476-.111 1.031-.535 1.457-.424.428-.981.543-1.465.543H6c-.484 0-1.04-.115-1.466-.543C4.111 22.032 4 21.476 4 21v-5.17A3.001 3.001 0 012 13V7a3 3 0 013-3h.152zM6 15.83V21h9V10H8v3a3.001 3.001 0 01-2 2.83zM17 10v8h2v-7.983V10h-2zm-1.185-2c.026-.062.056-.153.084-.28.098-.441.101-.963.101-1.22A1.5 1.5 0 0014.5 5h-2.118l-.276-.553c-.147-.294-.483-.666-.98-.967C10.64 3.184 10.067 3 9.5 3 7.973 3 7 4.154 7 5v1H5a1 1 0 00-1 1v6a1 1 0 102 0V8h9.815z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-beer-filled" xmlns="http://www.w3.org/2000/svg"><path d="M5.652 4C6.172 2.305 7.968 1 10 1c.988 0 1.915.316 2.664.77A4.96 4.96 0 0114.05 3H15a3.5 3.5 0 013.5 3.5v.014c0 .237 0 .863-.117 1.486H19.5c.497 0 1.054.126 1.474.56.415.428.526.98.526 1.457V18c0 .476-.111 1.031-.535 1.457-.424.428-.981.543-1.465.543h-2v1c0 .476-.111 1.031-.535 1.457-.424.428-.981.543-1.465.543h-9c-.484 0-1.04-.115-1.466-.543-.423-.426-.534-.981-.534-1.457v-5.17a3.001 3.001 0 01-2-2.83V7a3 3 0 013-3h.152zM17.5 10v8h2v-7.983V10h-2zm-1.185-2c.026-.062.056-.153.084-.28.098-.441.101-.963.101-1.22A1.5 1.5 0 0015 5h-2.118l-.276-.553c-.147-.294-.483-.666-.98-.967C11.14 3.184 10.567 3 10 3 8.473 3 7.5 4.154 7.5 5v1h-2a1 1 0 00-1 1v6a1 1 0 102 0V8h9.815z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-beta" xmlns="http://www.w3.org/2000/svg"><path d="M20 2.491v18.51H4v-2h14v-3.058L3.49 9.476 20 2.491zm-2 11.263V5.509L8.51 9.524l9.49 4.23z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bifurcate" xmlns="http://www.w3.org/2000/svg"><path d="M6 4a1 1 0 100 2 1 1 0 000-2zM3 5a3 3 0 114.086 2.797c.128.667.412 1.506.934 2.256C8.752 11.103 9.958 12 12 12s3.248-.897 3.98-1.947a6.01 6.01 0 00.934-2.256 3.001 3.001 0 112.019.055 8.014 8.014 0 01-1.313 3.345c-.933 1.34-2.42 2.478-4.62 2.744v2.23a3.001 3.001 0 11-2 0v-2.23c-2.2-.266-3.687-1.405-4.62-2.744a8.014 8.014 0 01-1.313-3.345A3.001 3.001 0 013 5zm15-1a1 1 0 100 2 1 1 0 000-2zm-6 14a1 1 0 100 2 1 1 0 000-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bifurcate-filled" xmlns="http://www.w3.org/2000/svg"><path d="M3 5a3 3 0 114.086 2.797c.128.667.412 1.506.934 2.256C8.752 11.103 9.958 12 12 12s3.248-.897 3.98-1.947a6.01 6.01 0 00.934-2.256 3.001 3.001 0 112.019.055 8.014 8.014 0 01-1.313 3.345c-.933 1.34-2.42 2.478-4.62 2.744v2.23a3.001 3.001 0 11-2 0v-2.23c-2.2-.266-3.687-1.405-4.62-2.744a8.014 8.014 0 01-1.313-3.345A3.001 3.001 0 013 5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bill" xmlns="http://www.w3.org/2000/svg"><path d="M2 2h20v2h-2v18.08l-1.625-1.3-1.841-1.472-1.62 1.44-.664.59-.664-.59L12 19.337l-1.586 1.41-.664.59-.664-.59-1.62-1.44-1.841 1.473L4 22.08V4H2V2zm4 2v13.92l.875-.7.659-.528.63.56 1.586 1.41 1.586-1.41.664-.59.664.59 1.586 1.41 1.586-1.41.63-.56.659.527.875.7V4H6zm2 3h8v2H8V7zm2 4H9v2h6v-2h-5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bill-filled" xmlns="http://www.w3.org/2000/svg"><path d="M2 2v2h2v18.08l3.466-2.772 2.284 2.03 2.25-2 2.25 2 2.284-2.03L20 22.08V4h2V2H2zm14 7H8V7h8v2zm-7 4v-2h6v2H9z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bluetooth" xmlns="http://www.w3.org/2000/svg"><path d="M11 .255l7.453 6.707L13.414 12l5.039 5.038L11 23.745v-9.33l-4 4L5.586 17l5-5-5-5L7 5.586l4 4V.255zm2 14.16v4.84l2.548-2.293L13 14.414zm0-4.83l2.548-2.547L13 4.745v4.84z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bone" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 3a1.5 1.5 0 00-1.318 2.217l.358.657L5.874 16.54l-.657-.358a1.5 1.5 0 10-.993 2.793l.676.125.125.676a1.5 1.5 0 102.793-.993l-.358-.657L18.126 7.46l.657.358a1.5 1.5 0 10.993-2.793L19.1 4.9l-.125-.676A1.5 1.5 0 0017.5 3zM14 4.5a3.5 3.5 0 016.764-1.264 3.5 3.5 0 01-2.218 6.632l-8.678 8.678a3.5 3.5 0 01-6.633 2.218 3.5 3.5 0 012.219-6.632l8.678-8.678A3.502 3.502 0 0114 4.5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bone-filled" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 1a3.5 3.5 0 00-3.177 4.97L5.97 14.323a3.5 3.5 0 10-2.735 6.441 3.5 3.5 0 106.442-2.734l8.353-8.353a3.5 3.5 0 102.734-6.441A3.5 3.5 0 0017.5 1z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-book" xmlns="http://www.w3.org/2000/svg"><path d="M3 6a4 4 0 014-4h14v20H7a4 4 0 01-4-4V6zm2 8.535A3.982 3.982 0 017 14h12V4H7a2 2 0 00-2 2v8.535zM19 16H7a2 2 0 100 4h12v-4zM10 6h7v2h-7V6z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-book-filled" xmlns="http://www.w3.org/2000/svg"><path d="M7 2a4 4 0 00-4 4v12a4 4 0 004 4h14V2H7zm4 3h7v2h-7V5zM5 18a2 2 0 012-2h12v4H7a2 2 0 01-2-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-book-open" xmlns="http://www.w3.org/2000/svg"><path d="M1 2h8a3.99 3.99 0 013 1.354A3.99 3.99 0 0115 2h8v19h-1c-2.944 0-5.14.245-6.586.486-.723.12-1.26.24-1.609.328a10.53 10.53 0 00-.472.13l-.017.005h-.002l-.152.051h-2.324l-.152-.05-.001-.001h-.001l-.017-.006a10.53 10.53 0 00-.472-.13 20.76 20.76 0 00-1.61-.327C7.14 21.246 4.946 21 2 21H1V2zm2 2v15.01c2.563.047 4.535.274 5.914.504.777.13 1.366.26 1.766.36.125.03.232.06.32.084V6a2 2 0 00-2-2H3zm10 2v13.957a22.771 22.771 0 012.086-.444c1.379-.23 3.35-.456 5.914-.504V4h-6a2 2 0 00-2 2zm2 2h4v2h-4V8zm0 3h4v2h-4v-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-book-open-filled" xmlns="http://www.w3.org/2000/svg"><path d="M9 2H1v19h1c2.944 0 5.14.245 6.586.486.723.12 1.26.24 1.609.328a10.53 10.53 0 01.472.13l.017.005h.002l.152.051h2.324l.152-.05.002-.001.017-.006.088-.026c.081-.024.21-.06.384-.103.35-.087.886-.207 1.61-.328C16.86 21.246 19.054 21 22 21h1V2h-8a3.99 3.99 0 00-3 1.354A3.99 3.99 0 009 2zM3 19.01V4h6a2 2 0 012 2v13.957a14.28 14.28 0 00-.32-.083c-.4-.1-.989-.23-1.766-.36-1.379-.23-3.35-.457-5.914-.505zM19 10h-4V8h4v2zm0 3h-4v-2h4v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-book-unknown" xmlns="http://www.w3.org/2000/svg"><path d="M1 2h8a3.99 3.99 0 013 1.354A3.99 3.99 0 0115 2h8v19h-1c-2.944 0-5.14.245-6.586.486-.723.12-1.26.24-1.609.328a10.53 10.53 0 00-.472.13l-.017.005h-.002l-.152.051h-2.324l-.152-.05-.001-.001h-.001l-.017-.006a10.53 10.53 0 00-.472-.13 20.76 20.76 0 00-1.61-.327C7.14 21.246 4.946 21 2 21H1V2zm2 2v15.01c2.563.047 4.535.274 5.914.504.777.13 1.366.26 1.766.36.125.03.232.06.32.084V6a2 2 0 00-2-2H3zm10 2v13.957a22.771 22.771 0 012.086-.444c1.379-.23 3.35-.456 5.914-.504V4h-6a2 2 0 00-2 2z" fill="currentColor"/><path d="M17 9.5a1 1 0 00-1 1v1h-2v-1a3 3 0 116 0c0 .676-.172 1.246-.474 1.71a2.957 2.957 0 01-1.029.95 4.136 4.136 0 01-.494.238v.352h-2v-1c0-.424.245-.687.361-.79.12-.105.24-.165.296-.192.107-.05.233-.094.309-.12l.018-.007c.19-.066.36-.127.52-.218a.963.963 0 00.343-.305c.072-.11.15-.294.15-.618a1 1 0 00-1-1zm-1 5h2.004v2.004H16V14.5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-book-unknown-filled" xmlns="http://www.w3.org/2000/svg"><path d="M9 2H1v19h1c2.944 0 5.14.245 6.586.486.723.12 1.26.24 1.609.328a10.53 10.53 0 01.472.13l.017.005h.002l.152.051h2.324l.152-.05.002-.001.017-.006.088-.026c.081-.024.21-.06.384-.103.35-.087.886-.207 1.61-.328C16.86 21.246 19.054 21 22 21h1V2h-8a3.99 3.99 0 00-3 1.354A3.99 3.99 0 009 2zM3 19.01V4h6a2 2 0 012 2v13.957a14.28 14.28 0 00-.32-.083c-.4-.1-.989-.23-1.766-.36-1.379-.23-3.35-.457-5.914-.505zm13-8.51v1h-2v-1a3 3 0 116 0c0 .676-.172 1.246-.474 1.71a2.957 2.957 0 01-1.029.95 4.136 4.136 0 01-.494.238v.352h-2v-1c0-.424.245-.687.361-.79.12-.105.24-.165.296-.192.107-.05.233-.094.309-.12l.018-.007c.19-.066.36-.127.52-.218a.963.963 0 00.343-.305c.072-.11.15-.294.15-.618a1 1 0 10-2 0zm2.004 4v2.004H16V14.5h2.004z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark" xmlns="http://www.w3.org/2000/svg"><path d="M4 3h16v19.943l-8-5.714-8 5.714V3zm2 2v14.057l6-4.286 6 4.286V5H6z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-add" xmlns="http://www.w3.org/2000/svg"><path d="M20 0v3h3v2h-3v3h-2V5h-3V3h3V0h2zM4 3h9v2H6v14.057l6-4.286 6 4.286V10h2v12.943l-8-5.714-8 5.714V3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-add-filled" xmlns="http://www.w3.org/2000/svg"><path d="M20 3V0h-2v3h-3v2h3v3h2V5h3V3h-3z" fill="currentColor"/><path d="M13.5 4c0-.341.031-.676.09-1H4v19.943l8-5.714 8 5.714V9.41A5.5 5.5 0 0113.5 4z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-checked" xmlns="http://www.w3.org/2000/svg"><path d="M22.596 2.94L16.94 8.595l-3.535-3.535 1.414-1.415 2.121 2.122 4.243-4.243 1.414 1.414zM4 3h8v2H6v14.057l6-4.286 6 4.286V10h2v12.943l-8-5.714-8 5.714V3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-checked-filled" xmlns="http://www.w3.org/2000/svg"><path d="M13.403 5.06l3.536 3.536 5.657-5.657-1.415-1.414-4.242 4.243-2.121-2.122-1.415 1.415z" fill="currentColor"/><path d="M12.5 5c0-.706.133-1.38.375-2H4v19.943l8-5.714 8 5.714V10.125A5.5 5.5 0 0112.5 5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-double" xmlns="http://www.w3.org/2000/svg"><path d="M23 0l.003 18.419L21 16.415V2.001l-10.999.001v-2L23 .001zM3 4h16v19.943l-8-5.714-8 5.714V4zm2 2v14.057l6-4.286 6 4.286V6H5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-double-filled" xmlns="http://www.w3.org/2000/svg"><path d="M23.003 18.419L23 0 10.001.002v2H21v14.413l2.003 2.004z" fill="currentColor"/><path d="M19 4H3v19.943l8-5.714 8 5.714V4z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-filled" xmlns="http://www.w3.org/2000/svg"><path d="M4 3h16v19.943l-8-5.714-8 5.714V3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-minus" xmlns="http://www.w3.org/2000/svg"><path d="M4 3h9v2H6v14.057l6-4.286 6 4.286V7h2v15.943l-8-5.714-8 5.714V3zm11 0h8v2h-8V3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bookmark-minus-filled" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 4c0-.341.031-.676.09-1H4v19.943l8-5.714 8 5.714V9.41A5.5 5.5 0 0113.5 4z" fill="currentColor"/><path d="M23 3h-8v2h8V3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-braces" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 17.6A3.4 3.4 0 005.9 21H7v-2H5.9a1.4 1.4 0 01-1.4-1.4V14c0-.768-.288-1.47-.764-2 .476-.53.764-1.232.764-2V6.4A1.4 1.4 0 015.9 5H7V3H5.9a3.4 3.4 0 00-3.4 3.4V10a1 1 0 01-1 1H.4v2h1.1a1 1 0 011 1v3.6zM17 21h1.1a3.4 3.4 0 003.4-3.4V14a1 1 0 011-1h1.1v-2h-1.1a1 1 0 01-1-1V6.4A3.4 3.4 0 0018.1 3H17v2h1.1a1.4 1.4 0 011.4 1.4V10c0 .768.288 1.47.764 2a2.989 2.989 0 00-.764 2v3.6a1.4 1.4 0 01-1.4 1.4H17v2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-brackets" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.5h5v2H4v13h3v2H2v-17zm15 0h5v17h-5v-2h3v-13h-3v-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bread" xmlns="http://www.w3.org/2000/svg"><path d="M5.023 11.278c-.051.463.064.86.387 1.183l3.776 3.776-1.414 1.414-3.627-3.627-.03.082c-.558 1.52-.036 3.24 1.175 4.527 1.213 1.289 2.943 1.955 4.538 1.55 2.124-.538 4.425-2.026 6.429-3.946 1.92-2.004 3.407-4.305 3.946-6.429.405-1.595-.261-3.325-1.55-4.538-1.287-1.211-3.006-1.733-4.527-1.176l-.082.03 3.627 3.628-1.414 1.414L12.48 5.39c-.323-.323-.72-.438-1.183-.387-.489.054-1.03.297-1.49.677-.463.383-.757.832-.853 1.209-.085.328-.031.6.23.863l4.243 4.242-1.414 1.414-4.242-4.242c-.262-.262-.535-.316-.863-.231-.377.096-.826.39-1.21.854-.379.46-.622 1-.676 1.489zm1.906-4.369a3.14 3.14 0 01.088-.518c.229-.888.82-1.676 1.518-2.253.702-.58 1.599-1.02 2.543-1.123.311-.035.628-.032.942.014.146-.167.312-.285.445-.368.267-.167.604-.31.973-.445 2.413-.883 4.904.015 6.586 1.598 1.681 1.582 2.743 4.022 2.118 6.486-.656 2.587-2.395 5.19-4.457 7.337l-.014.014-.014.014c-2.147 2.062-4.75 3.8-7.337 4.457-2.464.625-4.904-.437-6.486-2.118-1.583-1.682-2.481-4.173-1.598-6.586.136-.37.278-.706.445-.973.083-.133.201-.299.368-.445a3.697 3.697 0 01-.014-.941c.104-.945.543-1.842 1.123-2.544.577-.698 1.365-1.29 2.253-1.518a3.14 3.14 0 01.518-.088z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bread-filled" xmlns="http://www.w3.org/2000/svg"><path d="M2.436 13.003c-.273.22-.386.508-.432.72-.512 2.362.233 4.645 1.884 6.353 1.582 1.637 3.987 2.66 6.415 2.043 2.587-.656 5.19-2.395 7.337-4.456l.014-.015.014-.014c2.062-2.147 3.8-4.75 4.457-7.336.616-2.428-.406-4.833-2.043-6.415-1.444-1.396-3.29-2.18-5.314-2.038-.752.053-1.17.58-1.363.913l3.9 3.9-1.415 1.414-4.519-4.519a3.343 3.343 0 00-2.126.172c-.509.216-.95.547-1.24.919-.142.18-.293.428-.356.725-.066.308-.044.76.3 1.125l4.76 4.76-1.415 1.414L6.536 7.91a1.244 1.244 0 00-1.129-.3 1.805 1.805 0 00-.722.356c-.371.291-.701.73-.918 1.239a3.34 3.34 0 00-.172 2.128l4.517 4.517-1.414 1.414-4.262-4.261z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge" xmlns="http://www.w3.org/2000/svg"><path d="M4 2v3.413c.114.057.25.122.406.192.61.27 1.547.62 2.81.9C8.482 6.786 10.076 7 12 7c1.925 0 3.52-.214 4.783-.495 1.264-.28 2.2-.63 2.81-.9.158-.07.293-.135.407-.192V2h2v13h1v2h-1v5h-2v-5H4v5H2v-5H1v-2h1V2h2zm0 13h2V8.267a16.767 16.767 0 01-2-.662V15zm4-6.31V15h3V8.982a24.356 24.356 0 01-3-.291zm5 .292V15h3V8.69c-.893.145-1.893.251-3 .292zm5-.715V15h2V7.605c-.531.215-1.198.449-2 .662zm2.446-3.1a.121.121 0 01.003-.002l-.002.002h-.001z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-1" xmlns="http://www.w3.org/2000/svg"><path d="M1 1.999h6V5.53c.208.154.524.363.947.575.878.438 2.226.894 4.053.894s3.175-.456 4.053-.894c.423-.212.739-.42.947-.575V2h6v20h-6V17H7v5H1V2zm6 13h4v-6.04c-1.686-.134-3.004-.594-3.947-1.066A8.93 8.93 0 017 7.867v7.132zm6-6.04V15h4V7.867a11.78 11.78 0 01-.053.026c-.943.472-2.26.932-3.947 1.067zM3 4v16h2V4H3zm16 0V20h2V4h-2z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-1-filled" xmlns="http://www.w3.org/2000/svg"><path d="M1 1.999h6V5.53c.208.154.524.363.947.575.878.438 2.226.894 4.053.894s3.175-.456 4.053-.894c.423-.212.739-.42.947-.575V2h6v20h-6V17H7v5H1V2zm6 13h4v-6.04c-1.686-.134-3.004-.594-3.947-1.066A8.93 8.93 0 017 7.867v7.132zm6-6.04V15h4V7.867a11.78 11.78 0 01-.053.026c-.943.472-2.26.932-3.947 1.067z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-2" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_8726_9882)"><path d="M8.298 6.49c-1.208 1.098-2.383 2.927-3.35 5.826-.082.248-.168.524-.26.817-.244.783-.525 1.684-.87 2.47-.39.882-.944 1.836-1.818 2.433V19h6v-5a4 4 0 018 0v5h6v-.964c-.874-.597-1.429-1.55-1.817-2.433-.346-.786-.627-1.687-.872-2.47-.09-.293-.177-.57-.26-.817-.966-2.9-2.141-4.728-3.349-5.826C14.515 5.41 13.256 5 12 5c-1.256 0-2.515.41-3.702 1.49zM6.952 5.01C8.515 3.59 10.256 3 12 3c1.744 0 3.485.59 5.048 2.01 1.542 1.402 2.867 3.573 3.9 6.674.109.325.21.648.31.969.232.743.458 1.468.756 2.144.428.974.877 1.523 1.368 1.726l.618.255V21H14v-7a2 2 0 10-4 0v7H0v-4.222l.618-.255c.491-.203.94-.752 1.368-1.726.298-.676.524-1.401.756-2.144.1-.32.201-.645.31-.97 1.033-3.1 2.358-5.27 3.9-6.673z" fill="currentColor"/></g></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-2-filled" xmlns="http://www.w3.org/2000/svg"><path d="M12 3c-1.744 0-3.485.59-5.048 2.01-1.542 1.402-2.867 3.573-3.9 6.674-.109.325-.21.648-.31.969-.232.743-.458 1.468-.756 2.144-.428.974-.877 1.523-1.368 1.726L0 16.777V21h9v-7a3 3 0 116 0v7h9v-4.222l-.618-.255c-.491-.203-.94-.752-1.369-1.726-.297-.676-.523-1.401-.755-2.144-.1-.32-.201-.645-.31-.97-1.033-3.1-2.358-5.27-3.9-6.673C15.485 3.59 13.744 3 12 3z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-3" xmlns="http://www.w3.org/2000/svg"><path d="M4 2v3.465l7 4.667V2h2v8.132l7-4.667V2h2v13h1v2h-1v5h-2v-5H4v5H2v-5H1v-2h1V2h2zm0 13h7v-2.465L4 7.87V15zm9 0h7V7.87l-7 4.666V15z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-4" xmlns="http://www.w3.org/2000/svg"><path d="M23 2.001v2h-1.18L21 8.098V22h-2V7.901l.78-3.9h-3.56L17 7.9v14.1h-2V8.099L14.18 4H9.82L9 8.1V22H7V7.902l.78-3.9H4.22L5 7.9v14.1H3V8.099L2.18 4 1 4.001v-2h22z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-5" xmlns="http://www.w3.org/2000/svg"><path d="M0 3h24v18.001h-6v-7.603a8.417 8.417 0 00-1.346-1.053A8.644 8.644 0 0012 11c-2.02 0-3.586.671-4.654 1.345A8.42 8.42 0 006 13.398V21H0V3zm6 7.836A10.644 10.644 0 0112 9a10.644 10.644 0 016 1.836V5.001h-.625L12 5H6v5.836zm14-5.835v14h2v-14h-2zM4 5H2v14h2V5z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-5-filled" xmlns="http://www.w3.org/2000/svg"><path d="M0 3h24v18.001h-6v-7.603a8.417 8.417 0 00-1.346-1.053A8.644 8.644 0 0012 11c-2.02 0-3.586.671-4.654 1.345A8.42 8.42 0 006 13.398V21H0V3zm6 7.836A10.644 10.644 0 0112 9a10.644 10.644 0 016 1.836V5.001L6 5v5.836z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id="t-icon-bridge-6" xmlns="http://www.w3.org/2000/svg"><path d="M1 1.754l11 9.9 11-9.9V21h-2v-7h-2v7h-2v-7H7v7H5v-7H3v7H1V1.754zM3 12h6.394L3 6.245V12zm11.606 0h6.393L21 6.245 14.606 12z" fill="currentColor"/></symbol><symbol fill="none" viewBox="0 0 24 24" id=
gitextract_3rf8zt24/ ├── .github/ │ ├── CONTRIBUTING.md │ ├── PULL_REQUEST_TEMPLATE │ └── workflows/ │ └── static.yml ├── .gitignore ├── .travis.yml ├── LICENSE ├── OPENSOURCELICENSES ├── README.md ├── SECURITY.md ├── brooklink.go ├── cac.go ├── client.go ├── dhcpserver.go ├── dhcpserver_linux.go ├── dhcpserver_notlinux.go ├── dial.go ├── dnsclient.go ├── dnsserver.go ├── docs/ │ ├── CNAME │ ├── index.html │ └── static/ │ ├── fonts.js │ ├── theme.css │ └── vue-composition-api.prod.js ├── dohclient.go ├── dohserver.go ├── echoclient.go ├── echoserver.go ├── error.go ├── exchanger.go ├── go.mod ├── go.sum ├── init.go ├── limits/ │ ├── limits.go │ └── limits_not.go ├── link.go ├── list.go ├── log.go ├── nat.go ├── nonce.go ├── pac.go ├── packetclient.go ├── packetconn.go ├── packetserver.go ├── packetserverconn.go ├── ping/ │ └── ping.json ├── plugins/ │ ├── block/ │ │ ├── block.go │ │ └── readme.md │ ├── dialwithdns/ │ │ ├── dialwithdns.go │ │ └── readme.md │ ├── dialwithip/ │ │ ├── dialwithip.go │ │ └── readme.md │ ├── dialwithnic/ │ │ ├── dialwithnic.go │ │ └── readme.md │ ├── logger/ │ │ ├── logger.go │ │ ├── logger_unix.go │ │ ├── logger_windows.go │ │ └── readme.md │ ├── pprof/ │ │ ├── pprof.go │ │ └── readme.md │ ├── prometheus/ │ │ ├── prometheus.go │ │ └── readme.md │ ├── readme.md │ ├── socks5dial/ │ │ ├── dial.go │ │ └── readme.md │ └── thedns/ │ ├── readme.md │ └── thedns.go ├── programmable/ │ ├── client/ │ │ ├── check_syntax.js │ │ ├── example.tengo │ │ └── readme.md │ ├── dnsserver/ │ │ ├── check_syntax.js │ │ ├── example.tengo │ │ └── readme.md │ ├── gallery.json │ ├── modules/ │ │ ├── _footer.tengo │ │ ├── _header.tengo │ │ ├── allow_app.tengo │ │ ├── blacklist_mode.tengo │ │ ├── block_a.tengo │ │ ├── block_aaaa.tengo │ │ ├── block_ad_domain.tengo │ │ ├── block_app.tengo │ │ ├── block_google_secure_dns.tengo │ │ ├── block_youtube_ad.tengo │ │ ├── brooklinks.tengo │ │ ├── bypass_app.tengo │ │ ├── bypass_apple.tengo │ │ ├── bypass_china_domain_a.tengo │ │ ├── bypass_geo.tengo │ │ ├── chatgpt_advanced_voice.tengo │ │ ├── check_syntax.js │ │ ├── douban.tengo │ │ ├── hosts.tengo │ │ ├── instagram_system_dns.tengo │ │ ├── ios_app_downgrade.tengo │ │ ├── ios_app_downgrade_history.tengo │ │ ├── mitmproxy_client.tengo │ │ ├── packet_capture.tengo │ │ ├── readme.md │ │ ├── redirect_google_cn.tengo │ │ ├── response_sample.tengo │ │ ├── sanguosha.tengo │ │ ├── xbox.tengo │ │ └── xiaohongshu.tengo │ ├── readme.md │ └── server/ │ ├── check_syntax.js │ ├── example.tengo │ └── readme.md ├── protocol/ │ ├── brook-link-protocol.md │ ├── brook-quicserver-protocol.md │ ├── brook-server-protocol.md │ ├── brook-wsserver-protocol.md │ ├── brook-wssserver-protocol.md │ └── user.md ├── quic.go ├── quicclient.go ├── quicserver.go ├── relay.go ├── relayoverbrook.go ├── resolve.go ├── server.go ├── simplepacketclient.go ├── simplepacketserver.go ├── simplepacketserverconn.go ├── simplestreamclient.go ├── simplestreamserver.go ├── socks5.go ├── socks5test.go ├── socks5tohttp.go ├── streamclient.go ├── streamserver.go ├── test_test.go ├── util.go ├── waitreaderr.go ├── websocket.go ├── wsclient.go └── wsserver.go
SYMBOL INDEX (336 symbols across 60 files)
FILE: brooklink.go
type BrookLink (line 34) | type BrookLink struct
method CreateExchanger (line 149) | func (blk *BrookLink) CreateExchanger(network, src string, dstb []byte...
method PrepareSocks5Server (line 279) | func (x *BrookLink) PrepareSocks5Server(addr, ip string, tcptimeout, u...
method ListenAndServe (line 310) | func (x *BrookLink) ListenAndServe() error {
method TCPHandle (line 314) | func (x *BrookLink) TCPHandle(s *socks5.Server, c *net.TCPConn, r *soc...
method UDPHandle (line 347) | func (x *BrookLink) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *...
method Shutdown (line 372) | func (x *BrookLink) Shutdown() error {
function NewBrookLink (line 54) | func NewBrookLink(link string) (*BrookLink, error) {
FILE: cac.go
function CAC (line 24) | func CAC(file string) ([]string, error) {
FILE: client.go
type Client (line 24) | type Client struct
method ListenAndServe (line 53) | func (x *Client) ListenAndServe() error {
method TCPHandle (line 57) | func (x *Client) TCPHandle(s *socks5.Server, c *net.TCPConn, r *socks5...
method UDPHandle (line 96) | func (x *Client) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *soc...
method Shutdown (line 141) | func (x *Client) Shutdown() error {
function NewClient (line 34) | func NewClient(addr, ip, server, password string, tcpTimeout, udpTimeout...
FILE: dhcpserver.go
type DHCPServer (line 28) | type DHCPServer struct
method ListenAndServe (line 85) | func (h *DHCPServer) ListenAndServe() error {
method Shutdown (line 89) | func (h *DHCPServer) Shutdown() error {
method ServeDHCP (line 105) | func (h *DHCPServer) ServeDHCP(p dhcp4.Packet, msgType dhcp4.MessageTy...
function NewDHCPServer (line 38) | func NewDHCPServer(iface, serverip, start, mask string, count int, gatew...
FILE: dhcpserver_linux.go
function DHCPListen (line 23) | func DHCPListen(iface string) (net.PacketConn, error) {
FILE: dhcpserver_notlinux.go
function DHCPListen (line 23) | func DHCPListen(iface string) (net.PacketConn, error) {
FILE: dnsclient.go
type DNSClient (line 24) | type DNSClient struct
method Exchange (line 28) | func (c *DNSClient) Exchange(m *dns.Msg) (*dns.Msg, error) {
method AAAA (line 57) | func (c *DNSClient) AAAA(domain string) (net.IP, error) {
method A (line 73) | func (c *DNSClient) A(domain string) (net.IP, error) {
FILE: docs/static/vue-composition-api.prod.js
function o (line 1) | function o(n){var t="function"==typeof Symbol&&Symbol.iterator,e=t&&n[t]...
function i (line 1) | function i(n,t){var e="function"==typeof Symbol&&n[Symbol.iterator];if(!...
function u (line 1) | function u(n,t,e){if(e||2===arguments.length)for(var r,o=0,i=t.length;o<...
function n (line 1) | function n(n){this.active=!0,this.effects=[],this.cleanups=[],this.vm=n}
function r (line 1) | function r(t){void 0===t&&(t=!1);var r,o=void 0;return function(n){var t...
function r (line 1) | function r(){this.constructor=n}
function l (line 1) | function l(){return e}
function s (line 1) | function s(){var n,t;return(null===(n=l())||void 0===n?void 0:n.vm)||(nu...
function b (line 1) | function b(n){return n&&V(n)&&"Vue"===n.name}
function g (line 1) | function g(){return p}
function m (line 1) | function m(){return p||v}
function w (line 1) | function w(n){if(_){var t=y;null==t||t.scope.off(),null==(y=n)||y.scope....
function $ (line 1) | function $(){return y}
function x (line 1) | function x(n){if(j.has(n))return j.get(n);var t={proxy:n,update:n.$force...
function O (line 1) | function O(n){return"function"==typeof n&&/native code/.test(n.toString())}
function E (line 1) | function E(n,t,e){var r=e.get,o=e.set;Object.defineProperty(n,t,{enumera...
function R (line 1) | function R(n,t,e,r){Object.defineProperty(n,t,{value:e,enumerable:!!r,wr...
function C (line 1) | function C(n,t){return Object.hasOwnProperty.call(n,t)}
function M (line 1) | function M(n){return Array.isArray(n)}
function U (line 1) | function U(n){var t=parseFloat(String(n));return t>=0&&Math.floor(t)===t...
function B (line 1) | function B(n){return null!==n&&"object"==typeof n}
function T (line 1) | function T(n){return"[object Object]"===function(n){return Object.protot...
function V (line 1) | function V(n){return"function"==typeof n}
function W (line 1) | function W(n,t){return t=t||$()}
function z (line 1) | function z(n,t){void 0===t&&(t={});var e=n.config.silent;n.config.silent...
function F (line 1) | function F(n,t){return function(){for(var e=[],r=0;r<arguments.length;r+...
function I (line 1) | function I(n){return S?Symbol.for(n):n}
function L (line 1) | function L(n,t,e){var r=g().util;r.warn;var o=r.defineReactive,i=n.__ob_...
function X (line 1) | function X(n){N=n}
function Z (line 1) | function Z(n,t,e){void 0===t&&(t=!1),void 0===e&&(e=!1);var r=new Y(n);e...
function nn (line 1) | function nn(n){var t;if(tn(n))return n;var e=pn(((t={})[q]=n,t));return ...
function tn (line 1) | function tn(n){return n instanceof Y}
function en (line 1) | function en(n){return tn(n)?n.value:n}
function rn (line 1) | function rn(n){if(!T(n))return n;var t={};for(var e in n)t[e]=on(n,e);re...
function on (line 1) | function on(n,t){t in n||L(n,t,void 0);var e=n[t];return tn(e)?e:Z({get:...
function un (line 1) | function un(n){var t;return Boolean(n&&C(n,"__ob__")&&"object"==typeof n...
function fn (line 1) | function fn(n){var t;return Boolean(n&&C(n,"__ob__")&&"object"==typeof n...
function an (line 1) | function an(n){if(!(!T(n)||un(n)||M(n)||tn(n)||(t=n,e=g(),e&&t instanceo...
function cn (line 1) | function cn(n,t,e){if("__ob__"!==t&&!un(n[t])){var r,o,i=Object.getOwnPr...
function ln (line 1) | function ln(n){var t,e=m();e.observable?t=e.observable(n):t=z(e,{data:{$...
function sn (line 1) | function sn(n,t){var e,r;if(void 0===t&&(t=new Set),!t.has(n)&&!C(n,"__o...
function vn (line 1) | function vn(){return ln({}).__ob__}
function dn (line 1) | function dn(n){var t,e;if(!B(n))return n;if(!T(n)&&!M(n)||un(n)||!Object...
function pn (line 1) | function pn(n){if(!B(n))return n;if(!T(n)&&!M(n)||un(n)||!Object.isExten...
function yn (line 1) | function yn(n){return function(t,e){var r,o=W("on".concat((r=n)[0].toUpp...
function kn (line 1) | function kn(){Cn(this,K)}
function En (line 1) | function En(){Cn(this,Q)}
function Rn (line 1) | function Rn(){var n=s();return n?function(n){return void 0!==n[K]}(n)||f...
function Cn (line 1) | function Cn(n,t){for(var e=n[t],r=0;r<e.length;r++)e[r]();e.length=0}
function Mn (line 1) | function Mn(n,t,e){var r=function(){n.$nextTick((function(){n[K].length&...
function Pn (line 1) | function Pn(n,t){var e=n.teardown;n.teardown=function(){for(var r=[],o=0...
function Dn (line 1) | function Dn(n,t,e,r){var o,f,a=r.flush,c="sync"===a,l=function(n){f=func...
function An (line 1) | function An(n,t){var e=function(n){return r({flush:"pre"},n)}(t);return ...
function Un (line 1) | function Un(n,t){if(void 0===t&&(t=new Set),!B(n)||t.has(n)||H.has(n))re...
function Tn (line 1) | function Tn(n,t){for(var e=t;e;){if(e._provided&&C(e._provided,n))return...
function In (line 1) | function In(){return $().setupContext}
function Qn (line 1) | function Qn(n){var t=Kn.get(n,"rawBindings")||{};if(t&&Object.keys(t).le...
function qn (line 1) | function qn(n){for(var t=[n._vnode];t.length;){var e=t.pop();if(e&&(e.co...
function Gn (line 1) | function Gn(n,t){var e,r;if(n){var i=Kn.get(n,"attrBindings");if(i||t){i...
function Hn (line 1) | function Hn(n,t){var e=n.$options._parentVnode;if(e){for(var r=Kn.get(n,...
function Jn (line 1) | function Jn(n,t,e){var r=$();w(n);try{return t(n)}catch(n){if(!e)throw n...
function Ln (line 1) | function Ln(n){function t(n,e){if(void 0===e&&(e=new Set),!e.has(n)&&T(n...
function Nn (line 1) | function Nn(n,t){if(!n)return t;if(!t)return n;for(var e,r,o,i=S?Reflect...
function Xn (line 1) | function Xn(n){(function(n){return p&&C(n,h)})(n)||(n.config.optionMerge...
FILE: dohclient.go
type DOHClient (line 28) | type DOHClient struct
method Exchange (line 58) | func (c *DOHClient) Exchange(m *dns.Msg) (*dns.Msg, error) {
method AAAA (line 86) | func (c *DOHClient) AAAA(domain string) (net.IP, error) {
method A (line 102) | func (c *DOHClient) A(domain string) (net.IP, error) {
function NewDOHClient (line 33) | func NewDOHClient(doh string) (*DOHClient, error) {
FILE: dohserver.go
type DOHServer (line 32) | type DOHServer struct
method ListenAndServe (line 65) | func (s *DOHServer) ListenAndServe() error {
method ServeHTTP (line 161) | func (s *DOHServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
method Shutdown (line 200) | func (s *DOHServer) Shutdown() error {
function NewDOHServer (line 43) | func NewDOHServer(addr, domain, path, to string, tcpTimeout, udpTimeout ...
FILE: echoclient.go
function EchoClient (line 21) | func EchoClient(server string, times int) error {
FILE: echoserver.go
type EchoServer (line 26) | type EchoServer struct
method ListenAndServe (line 42) | func (s *EchoServer) ListenAndServe() error {
method TCPHandle (line 105) | func (s *EchoServer) TCPHandle(c *net.TCPConn) error {
method UDPHandle (line 130) | func (s *EchoServer) UDPHandle(addr *net.UDPAddr, b []byte, l1 *net.UD...
method Shutdown (line 145) | func (s *EchoServer) Shutdown() error {
function NewEchoServer (line 31) | func NewEchoServer(addr string) (*EchoServer, error) {
FILE: error.go
type Error (line 19) | type Error
method Error (line 21) | func (e Error) Error() string {
FILE: exchanger.go
type Exchanger (line 21) | type Exchanger interface
type UDPServerConnFactory (line 29) | type UDPServerConnFactory interface
FILE: init.go
function init (line 20) | func init() {
FILE: limits/limits.go
function Raise (line 24) | func Raise() error {
FILE: limits/limits_not.go
function Raise (line 19) | func Raise() error {
FILE: link.go
function Link (line 22) | func Link(kind, server string, v url.Values) string {
function ParseLink (line 27) | func ParseLink(link string) (kind, server string, v url.Values, err erro...
FILE: list.go
function ListHasDomain (line 32) | func ListHasDomain(ds map[string]byte, domain string, c *cache.Cache) bo...
function ListHasIP (line 63) | func ListHasIP(c4, c6 []*net.IPNet, i net.IP, c *cache.Cache, geo []stri...
function ReadDomainList (line 120) | func ReadDomainList(url string) (map[string]byte, error) {
function ReadCIDRList (line 132) | func ReadCIDRList(url string) ([]*net.IPNet, error) {
function ReadList (line 149) | func ReadList(url string) ([]string, error) {
function ReadData (line 202) | func ReadData(url string) ([]byte, error) {
FILE: nat.go
type NATTable (line 23) | type NATTable struct
method Set (line 33) | func (n *NATTable) Set(src, dst, addr string) {
method Get (line 39) | func (n *NATTable) Get(src, dst string) string {
method Reset (line 46) | func (n *NATTable) Reset() {
FILE: nonce.go
function NextNonce (line 19) | func NextNonce(b []byte) {
FILE: pac.go
type PAC (line 31) | type PAC struct
method MakeBody (line 61) | func (p *PAC) MakeBody() (io.Reader, error) {
method ServeHTTP (line 97) | func (p *PAC) ServeHTTP(w http.ResponseWriter, r *http.Request) {
method ListenAndServe (line 102) | func (p *PAC) ListenAndServe() error {
method Shutdown (line 114) | func (p *PAC) Shutdown() error {
method WriteToFile (line 118) | func (p *PAC) WriteToFile() error {
method WriteToStdout (line 133) | func (p *PAC) WriteToStdout() error {
function NewPAC (line 41) | func NewPAC(addr, file, proxy, domainURL string) *PAC {
FILE: packetclient.go
type PacketClient (line 33) | type PacketClient struct
method Exchange (line 51) | func (c *PacketClient) Exchange(local net.Conn) error {
method Clean (line 139) | func (s *PacketClient) Clean() {
method Network (line 144) | func (s *PacketClient) Network() string {
method Src (line 148) | func (s *PacketClient) Src() string {
method Dst (line 152) | func (s *PacketClient) Dst() string {
function NewPacketClient (line 43) | func NewPacketClient(password []byte, src string, server net.Conn, timeo...
FILE: packetconn.go
type PacketConnFactory (line 26) | type PacketConnFactory struct
method Handle (line 38) | func (f *PacketConnFactory) Handle(addr *net.UDPAddr, dstb, data []byt...
function NewPacketConnFactory (line 31) | func NewPacketConnFactory() *PacketConnFactory {
type PacketConn (line 58) | type PacketConn struct
method In (line 79) | func (c *PacketConn) In(b []byte) error {
method Read (line 89) | func (c *PacketConn) Read(b []byte) (int, error) {
method Write (line 109) | func (c *PacketConn) Write(b []byte) (int, error) {
method Close (line 119) | func (c *PacketConn) Close() error {
method LocalAddr (line 129) | func (c *PacketConn) LocalAddr() net.Addr {
method RemoteAddr (line 134) | func (c *PacketConn) RemoteAddr() net.Addr {
method SetDeadline (line 139) | func (c *PacketConn) SetDeadline(t time.Time) error {
method SetReadDeadline (line 143) | func (c *PacketConn) SetReadDeadline(t time.Time) error {
method SetWriteDeadline (line 147) | func (c *PacketConn) SetWriteDeadline(t time.Time) error {
function NewPacketConn (line 67) | func NewPacketConn(fb []byte, w func([]byte) (int, error), timeout int, ...
type ConnFirst (line 151) | type ConnFirst struct
method Read (line 156) | func (c *ConnFirst) Read(b []byte) (int, error) {
FILE: packetserver.go
type PacketServer (line 31) | type PacketServer struct
method Exchange (line 49) | func (s *PacketServer) Exchange(remote net.Conn) error {
method Clean (line 108) | func (s *PacketServer) Clean() {
method Network (line 113) | func (s *PacketServer) Network() string {
method Src (line 117) | func (s *PacketServer) Src() string {
method Dst (line 121) | func (s *PacketServer) Dst() string {
function NewPacketServer (line 41) | func NewPacketServer(password []byte, src string, client net.Conn, timeo...
FILE: packetserverconn.go
type PacketServerConnFactory (line 34) | type PacketServerConnFactory struct
method Handle (line 46) | func (f *PacketServerConnFactory) Handle(addr *net.UDPAddr, b, p []byt...
function NewPacketServerConnFactory (line 39) | func NewPacketServerConnFactory() *PacketServerConnFactory {
FILE: plugins/block/block.go
type Block (line 29) | type Block struct
method Update (line 84) | func (bk *Block) Update() {
method Stop (line 129) | func (bk *Block) Stop() {
method TouchBrook (line 137) | func (bk *Block) TouchBrook() {
function NewBlock (line 43) | func NewBlock(domainList, cidr4List, cidr6List string, geoIP []string, u...
FILE: plugins/dialwithdns/dialwithdns.go
type DialWithDNS (line 27) | type DialWithDNS struct
method IP (line 47) | func (p *DialWithDNS) IP(domain string) (net.IP, error) {
method TouchBrook (line 121) | func (p *DialWithDNS) TouchBrook() {
function NewDialWithDNS (line 33) | func NewDialWithDNS(dns, prefer string) (*DialWithDNS, error) {
FILE: plugins/dialwithip/dialwithip.go
type DialWithIP (line 25) | type DialWithIP struct
method TouchBrook (line 47) | func (p *DialWithIP) TouchBrook() {
function NewDialWithIP (line 30) | func NewDialWithIP(ip4, ip6 string) (*DialWithIP, error) {
FILE: plugins/dialwithnic/dialwithnic.go
type DialWithNIC (line 25) | type DialWithNIC struct
method IP (line 34) | func (p *DialWithNIC) IP(v46 string) (net.IP, error) {
method TouchBrook (line 67) | func (p *DialWithNIC) TouchBrook() {
function NewDialWithNIC (line 29) | func NewDialWithNIC(nic string) *DialWithNIC {
FILE: plugins/logger/logger.go
type Logger (line 32) | type Logger struct
method Close (line 50) | func (p *Logger) Close() error {
method Reset (line 59) | func (p *Logger) Reset() error {
method TouchBrook (line 76) | func (p *Logger) TouchBrook() {
function NewLogger (line 39) | func NewLogger(tags map[string]string, file string) (*Logger, error) {
FILE: plugins/logger/logger_unix.go
method WatchReset (line 12) | func (p *Logger) WatchReset() {
FILE: plugins/logger/logger_windows.go
method WatchReset (line 3) | func (p *Logger) WatchReset() {
FILE: plugins/pprof/pprof.go
type Pprof (line 23) | type Pprof struct
method ListenAndServe (line 36) | func (p *Pprof) ListenAndServe() error {
method Shutdown (line 40) | func (p *Pprof) Shutdown() error {
function NewPprof (line 27) | func NewPprof(addr string) (*Pprof, error) {
FILE: plugins/prometheus/prometheus.go
type Prometheus (line 27) | type Prometheus struct
method ListenAndServe (line 42) | func (p *Prometheus) ListenAndServe() error {
method Shutdown (line 46) | func (p *Prometheus) Shutdown() error {
method TouchBrook (line 50) | func (p *Prometheus) TouchBrook() {
function NewPrometheus (line 32) | func NewPrometheus(addr, path string, tags map[string]string) *Prometheus {
FILE: plugins/socks5dial/dial.go
type Socks5Dial (line 24) | type Socks5Dial struct
method TouchBrook (line 38) | func (p *Socks5Dial) TouchBrook() {
function NewSocks5Dial (line 28) | func NewSocks5Dial(server, username, password string, tcptimeout, udptim...
FILE: plugins/thedns/thedns.go
type TheDNS (line 28) | type TheDNS struct
method TouchBrook (line 134) | func (p *TheDNS) TouchBrook() {
function NewTheDNS (line 40) | func NewTheDNS(blockDomainList, bypassDomainList, bypassDNS string, disa...
function soa (line 87) | func soa(addr *net.UDPAddr, m *dns.Msg, l1 *net.UDPConn) error {
function soah (line 111) | func soah(m *dns.Msg, w http.ResponseWriter) error {
FILE: quic.go
function QUICDialUDP (line 26) | func QUICDialUDP(src, dst, addr string, tc *tls.Config, idleTime int) (n...
function QUICDialTCP (line 56) | func QUICDialTCP(src, dst, addr string, tc *tls.Config, idleTime int) (n...
type QUICConn (line 101) | type QUICConn struct
method Read (line 109) | func (c *QUICConn) Read(b []byte) (int, error) {
method Write (line 121) | func (c *QUICConn) Write(b []byte) (int, error) {
method Close (line 131) | func (c *QUICConn) Close() error {
method LocalAddr (line 145) | func (c *QUICConn) LocalAddr() net.Addr {
method RemoteAddr (line 149) | func (c *QUICConn) RemoteAddr() net.Addr {
method SetDeadline (line 153) | func (c *QUICConn) SetDeadline(t time.Time) error {
method SetReadDeadline (line 161) | func (c *QUICConn) SetReadDeadline(t time.Time) error {
method SetWriteDeadline (line 168) | func (c *QUICConn) SetWriteDeadline(t time.Time) error {
FILE: quicclient.go
type QUICClient (line 29) | type QUICClient struct
method ListenAndServe (line 91) | func (x *QUICClient) ListenAndServe() error {
method TCPHandle (line 95) | func (x *QUICClient) TCPHandle(s *socks5.Server, c *net.TCPConn, r *so...
method UDPHandle (line 144) | func (x *QUICClient) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d ...
method Shutdown (line 186) | func (x *QUICClient) Shutdown() error {
function NewQUICClient (line 41) | func NewQUICClient(addr, ip, server, password string, tcpTimeout, udpTim...
FILE: quicserver.go
type QUICServer (line 34) | type QUICServer struct
method ListenAndServe (line 92) | func (s *QUICServer) ListenAndServe() error {
method TCPHandle (line 238) | func (s *QUICServer) TCPHandle(ss Exchanger) error {
method UDPOverTCPHandle (line 250) | func (s *QUICServer) UDPOverTCPHandle(ss Exchanger) error {
method UDPHandle (line 262) | func (s *QUICServer) UDPHandle(ss Exchanger) error {
method Shutdown (line 274) | func (s *QUICServer) Shutdown() error {
function NewQUICServer (line 47) | func NewQUICServer(addr, password, domain string, tcpTimeout, udpTimeout...
FILE: relay.go
type Relay (line 28) | type Relay struct
method ListenAndServe (line 59) | func (s *Relay) ListenAndServe() error {
method TCPHandle (line 122) | func (s *Relay) TCPHandle(c *net.TCPConn) error {
method UDPHandle (line 163) | func (s *Relay) UDPHandle(addr *net.UDPAddr, b []byte, l1 *net.UDPConn...
method Shutdown (line 230) | func (s *Relay) Shutdown() error {
function NewRelay (line 39) | func NewRelay(from, to string, tcpTimeout, udpTimeout int) (*Relay, erro...
FILE: relayoverbrook.go
type RelayOverBrook (line 29) | type RelayOverBrook struct
method ListenAndServe (line 82) | func (s *RelayOverBrook) ListenAndServe() error {
method TCPHandle (line 145) | func (s *RelayOverBrook) TCPHandle(c *net.TCPConn) error {
method UDPHandle (line 158) | func (s *RelayOverBrook) UDPHandle(addr *net.UDPAddr, b []byte, l1 *ne...
method Shutdown (line 197) | func (s *RelayOverBrook) Shutdown() error {
function NewRelayOverBrook (line 41) | func NewRelayOverBrook(from, link, to string, tcpTimeout, udpTimeout int...
FILE: resolve.go
function Resolve6 (line 10) | func Resolve6(host string) (string, error) {
function Resolve4 (line 31) | func Resolve4(host string) (string, error) {
FILE: server.go
type Server (line 25) | type Server struct
method ListenAndServe (line 47) | func (s *Server) ListenAndServe() error {
method TCPHandle (line 140) | func (s *Server) TCPHandle(ss Exchanger) error {
method UDPOverTCPHandle (line 152) | func (s *Server) UDPOverTCPHandle(ss Exchanger) error {
method UDPHandle (line 164) | func (s *Server) UDPHandle(ss Exchanger) error {
method Shutdown (line 176) | func (s *Server) Shutdown() error {
function NewServer (line 33) | func NewServer(addr, password string, tcpTimeout, udpTimeout int) (*Serv...
FILE: simplepacketclient.go
type SimplePacketClient (line 26) | type SimplePacketClient struct
method Exchange (line 46) | func (c *SimplePacketClient) Exchange(local net.Conn) error {
method Clean (line 89) | func (s *SimplePacketClient) Clean() {
method Network (line 94) | func (s *SimplePacketClient) Network() string {
method Src (line 98) | func (s *SimplePacketClient) Src() string {
method Dst (line 102) | func (s *SimplePacketClient) Dst() string {
function NewSimplePacketClient (line 37) | func NewSimplePacketClient(password []byte, src string, server net.Conn,...
FILE: simplepacketserver.go
type SimplePacketServer (line 25) | type SimplePacketServer struct
method Exchange (line 45) | func (s *SimplePacketServer) Exchange(remote net.Conn) error {
method Clean (line 80) | func (s *SimplePacketServer) Clean() {
method Network (line 85) | func (s *SimplePacketServer) Network() string {
method Src (line 89) | func (s *SimplePacketServer) Src() string {
method Dst (line 93) | func (s *SimplePacketServer) Dst() string {
function NewSimplePacketServer (line 36) | func NewSimplePacketServer(password []byte, src string, client net.Conn,...
FILE: simplepacketserverconn.go
type SimplePacketServerConnFactory (line 28) | type SimplePacketServerConnFactory struct
method Handle (line 40) | func (f *SimplePacketServerConnFactory) Handle(addr *net.UDPAddr, b, p...
function NewSimplePacketServerConnFactory (line 33) | func NewSimplePacketServerConnFactory() *SimplePacketServerConnFactory {
FILE: simplestreamclient.go
type SimpleStreamClient (line 28) | type SimpleStreamClient struct
method Exchange (line 71) | func (c *SimpleStreamClient) Exchange(local net.Conn) error {
method Clean (line 143) | func (s *SimpleStreamClient) Clean() {
method Network (line 154) | func (s *SimpleStreamClient) Network() string {
method Src (line 158) | func (s *SimpleStreamClient) Src() string {
method Dst (line 162) | func (s *SimpleStreamClient) Dst() string {
function NewSimpleStreamClient (line 38) | func NewSimpleStreamClient(network string, password []byte, src string, ...
FILE: simplestreamserver.go
type SimpleStreamServer (line 29) | type SimpleStreamServer struct
method Exchange (line 88) | func (s *SimpleStreamServer) Exchange(remote net.Conn) error {
method Network (line 159) | func (s *SimpleStreamServer) Network() string {
method Src (line 163) | func (s *SimpleStreamServer) Src() string {
method Dst (line 167) | func (s *SimpleStreamServer) Dst() string {
method Clean (line 171) | func (s *SimpleStreamServer) Clean() {
function NewSimpleStreamServer (line 39) | func NewSimpleStreamServer(password []byte, src string, client net.Conn,...
FILE: socks5.go
type Socks5Server (line 22) | type Socks5Server struct
method ListenAndServe (line 40) | func (x *Socks5Server) ListenAndServe() error {
method Shutdown (line 44) | func (x *Socks5Server) Shutdown() error {
function NewSocks5Server (line 26) | func NewSocks5Server(addr, ip, userName, password string, tcpTimeout, ud...
FILE: socks5test.go
function Socks5Test (line 26) | func Socks5Test(s, u, p, domain, a, ds string) error {
FILE: socks5tohttp.go
type Socks5ToHTTP (line 27) | type Socks5ToHTTP struct
method ListenAndServe (line 63) | func (s *Socks5ToHTTP) ListenAndServe() error {
method Handle (line 95) | func (s *Socks5ToHTTP) Handle(c *net.TCPConn) error {
method Shutdown (line 186) | func (s *Socks5ToHTTP) Shutdown() error {
type _pd (line 34) | type _pd struct
method Dial (line 37) | func (p *_pd) Dial(network, addr string) (c net.Conn, err error) {
function NewSocks5ToHTTP (line 41) | func NewSocks5ToHTTP(addr, socks5addr, socks5username, socks5password st...
FILE: streamclient.go
type StreamClient (line 33) | type StreamClient struct
method Exchange (line 145) | func (c *StreamClient) Exchange(local net.Conn) error {
method Write (line 179) | func (c *StreamClient) Write(l int) error {
method Read (line 191) | func (c *StreamClient) Read() (int, error) {
method Clean (line 210) | func (c *StreamClient) Clean() {
method Network (line 223) | func (s *StreamClient) Network() string {
method Src (line 227) | func (s *StreamClient) Src() string {
method Dst (line 231) | func (s *StreamClient) Dst() string {
function NewStreamClient (line 47) | func NewStreamClient(network string, password []byte, src string, server...
FILE: streamserver.go
type StreamServer (line 33) | type StreamServer struct
method Exchange (line 153) | func (s *StreamServer) Exchange(remote net.Conn) error {
method Write (line 187) | func (s *StreamServer) Write(l int) error {
method Read (line 199) | func (s *StreamServer) Read() (int, error) {
method Clean (line 219) | func (s *StreamServer) Clean() {
method Network (line 232) | func (s *StreamServer) Network() string {
method Src (line 236) | func (s *StreamServer) Src() string {
method Dst (line 240) | func (s *StreamServer) Dst() string {
function NewStreamServer (line 47) | func NewStreamServer(password []byte, src string, client net.Conn, timeo...
FILE: test_test.go
function TestTest (line 25) | func TestTest(t *testing.T) {
FILE: util.go
function ErrorReply (line 28) | func ErrorReply(r *socks5.Request, c *net.TCPConn, e error) error {
function GetAddressFromURL (line 41) | func GetAddressFromURL(s string) (string, error) {
function Conn2Conn (line 52) | func Conn2Conn(c, rc net.Conn, bufsize, timeout int) {
function SHA256Bytes (line 88) | func SHA256Bytes(s []byte) ([]byte, error) {
FILE: waitreaderr.go
function WaitReadErr (line 19) | func WaitReadErr(conn net.Conn) {
FILE: websocket.go
function WebSocketDial (line 37) | func WebSocketDial(src, dst, addr, host, path string, tc *tls.Config, ti...
type TLSFragmentConn (line 173) | type TLSFragmentConn struct
method Write (line 184) | func (c *TLSFragmentConn) Write(b []byte) (int, error) {
FILE: wsclient.go
type WSClient (line 27) | type WSClient struct
method ListenAndServe (line 84) | func (x *WSClient) ListenAndServe() error {
method TCPHandle (line 88) | func (x *WSClient) TCPHandle(s *socks5.Server, c *net.TCPConn, r *sock...
method UDPHandle (line 137) | func (x *WSClient) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *s...
method Shutdown (line 176) | func (x *WSClient) Shutdown() error {
function NewWSClient (line 41) | func NewWSClient(addr, ip, server, password string, tcpTimeout, udpTimeo...
FILE: wsserver.go
type WSServer (line 32) | type WSServer struct
method ListenAndServe (line 70) | func (s *WSServer) ListenAndServe() error {
method ServeHTTP (line 148) | func (s *WSServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
method TCPHandle (line 193) | func (s *WSServer) TCPHandle(ss Exchanger) error {
method UDPHandle (line 205) | func (s *WSServer) UDPHandle(ss Exchanger) error {
method Shutdown (line 217) | func (s *WSServer) Shutdown() error {
function NewWSServer (line 46) | func NewWSServer(addr, password, domain, path string, tcpTimeout, udpTim...
Condensed preview — 136 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,376K chars).
[
{
"path": ".github/CONTRIBUTING.md",
"chars": 353,
"preview": "### I want to create a PR.\n\n1. Create an issue first\n1. Don't use internal package\n1. Don't use generics\n1. Single funct"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE",
"chars": 67,
"preview": "Fixes # .\n\nChanges proposed in this pull request:\n-\n-\n-\n\n@mentions\n"
},
{
"path": ".github/workflows/static.yml",
"chars": 1257,
"preview": "# Simple workflow for deploying static content to GitHub Pages\nname: Deploy static content to Pages\n\non:\n # Runs on pus"
},
{
"path": ".gitignore",
"chars": 10,
"preview": ".DS_Store\n"
},
{
"path": ".travis.yml",
"chars": 152,
"preview": "language: go\nsudo: false\nos:\n - linux\n - osx\n - windows\ngo:\n - \"1.16\"\nscript:\n - go test -v .\n - cd cli/brook "
},
{
"path": "LICENSE",
"chars": 35141,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "OPENSOURCELICENSES",
"chars": 48783,
"preview": "### cli\n\nhttps://github.com/urfave/cli\n\nMIT License\n\nCopyright (c) 2016 Jeremy Saenz & Contributors\n\nPermission is hereb"
},
{
"path": "README.md",
"chars": 1143,
"preview": "# Brook\n\nA cross-platform programmable network tool.\n\n**Sponsor**: [Shiliew - Focuses on providing stable network servic"
},
{
"path": "SECURITY.md",
"chars": 257,
"preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nIf you discover a security vulnerability, please send an e-mail to clou"
},
{
"path": "brooklink.go",
"chars": 10815,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "cac.go",
"chars": 1580,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "client.go",
"chars": 3829,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "dhcpserver.go",
"chars": 4858,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "dhcpserver_linux.go",
"chars": 881,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "dhcpserver_notlinux.go",
"chars": 796,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "dial.go",
"chars": 1847,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "dnsclient.go",
"chars": 1953,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "dnsserver.go",
"chars": 1625,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "docs/CNAME",
"chars": 9,
"preview": "brook.app"
},
{
"path": "docs/index.html",
"chars": 11299,
"preview": "<!DOCTYPE html>\n<html theme-mode=\"light\">\n\n<head>\n <title>Brook Script Gallery</title>\n <meta charset=\"UTF-8\" />\n "
},
{
"path": "docs/static/fonts.js",
"chars": 874991,
"preview": "// This file is generated automatically by `useSvgSpriteTemplate.ts`. DO NOT EDIT IT.\n(function () {\n var svgCode = '<?"
},
{
"path": "docs/static/theme.css",
"chars": 15392,
"preview": ":root, :root[theme-mode=\"light\"] {\n --td-brand-color-1: #f3f3f3;\n --td-brand-color-2: #e3e3e3;\n --td-brand-colo"
},
{
"path": "docs/static/vue-composition-api.prod.js",
"chars": 21554,
"preview": "!function(n,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?def"
},
{
"path": "dohclient.go",
"chars": 2500,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "dohserver.go",
"chars": 5160,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "echoclient.go",
"chars": 2372,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "echoserver.go",
"chars": 3995,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "error.go",
"chars": 835,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "exchanger.go",
"chars": 1174,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "go.mod",
"chars": 2037,
"preview": "module github.com/txthinking/brook\n\ngo 1.24.0\n\nrequire (\n\tgithub.com/gorilla/mux v1.8.1\n\tgithub.com/gorilla/websocket v1"
},
{
"path": "go.sum",
"chars": 13144,
"preview": "github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=\ngithub.com/andybalholm/brotli v1.0."
},
{
"path": "init.go",
"chars": 794,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "limits/limits.go",
"chars": 1157,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "limits/limits_not.go",
"chars": 716,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "link.go",
"chars": 1042,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "list.go",
"chars": 5348,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "log.go",
"chars": 739,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "nat.go",
"chars": 2605,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "nonce.go",
"chars": 805,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "pac.go",
"chars": 3994,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "packetclient.go",
"chars": 3662,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "packetconn.go",
"chars": 3299,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "packetserver.go",
"chars": 2930,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "packetserverconn.go",
"chars": 2593,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "ping/ping.json",
"chars": 100,
"preview": "{\n \"version\": \"20260101\",\n \"text\": \"\",\n \"link\": \"\",\n \"text_zh\": \"\",\n \"link_zh\": \"\"\n}\n"
},
{
"path": "plugins/block/block.go",
"chars": 3872,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/block/readme.md",
"chars": 167,
"preview": "`block` plugin can block the dst address on the server side, such as domain or ip. If it is the domain dst, and the IP w"
},
{
"path": "plugins/dialwithdns/dialwithdns.go",
"chars": 3259,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/dialwithdns/readme.md",
"chars": 81,
"preview": "`dialwithdns` plugin resolve domain with custom dns or doh, instead of local dns\n"
},
{
"path": "plugins/dialwithip/dialwithip.go",
"chars": 2511,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/dialwithip/readme.md",
"chars": 47,
"preview": "`dialwithip` plugin can dial with specified ip\n"
},
{
"path": "plugins/dialwithnic/dialwithnic.go",
"chars": 3002,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/dialwithnic/readme.md",
"chars": 49,
"preview": "`dialwithnic` plugin can dial with specified nic\n"
},
{
"path": "plugins/logger/logger.go",
"chars": 3621,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/logger/logger_unix.go",
"chars": 272,
"preview": "//go:build !windows\n\npackage logger\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n)\n\nfunc (p *Logger) WatchReset() {\n\tf"
},
{
"path": "plugins/logger/logger_windows.go",
"chars": 50,
"preview": "package logger\n\nfunc (p *Logger) WatchReset() {\n}\n"
},
{
"path": "plugins/logger/readme.md",
"chars": 48,
"preview": "`log` plugin can log to console or log to file.\n"
},
{
"path": "plugins/pprof/pprof.go",
"chars": 1025,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/pprof/readme.md",
"chars": 36,
"preview": "`pprof` plugin enable go http pprof\n"
},
{
"path": "plugins/prometheus/prometheus.go",
"chars": 2345,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/prometheus/readme.md",
"chars": 49,
"preview": "`prometheus` plugin can send log into prometheus\n"
},
{
"path": "plugins/readme.md",
"chars": 86,
"preview": "It is very simple to write brook plugin, just overwrite the public function variable.\n"
},
{
"path": "plugins/socks5dial/dial.go",
"chars": 1704,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "plugins/socks5dial/readme.md",
"chars": 82,
"preview": "`socks5dial` plugin can overwrite default dial, both server-side and client-side.\n"
},
{
"path": "plugins/thedns/readme.md",
"chars": 103,
"preview": "`thedns` plugin can block/bypass/disable ipv4/disable ipv6 dns query for brook dnsoverbrook/dnsserver.\n"
},
{
"path": "plugins/thedns/thedns.go",
"chars": 5665,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "programmable/client/check_syntax.js",
"chars": 536,
"preview": "#!/usr/bin/env bun\n\nimport { $ } from 'bun'\nimport * as fs from 'node:fs/promises'\n\nvar s = await $`ls`.text()\nvar l = s"
},
{
"path": "programmable/client/example.tengo",
"chars": 2162,
"preview": "// Note: 这个例子没有收集域名,会使用 system DNS (默认为 Google DNS) 通过 Server 来解析出域名的 IP,然后判断如果是大陆 IP 则直连\n// 缺点是有些大陆域名会有海外 IP,可以根据"
},
{
"path": "programmable/client/readme.md",
"chars": 21,
"preview": "ipio, brook.openwrt\n\n"
},
{
"path": "programmable/dnsserver/check_syntax.js",
"chars": 448,
"preview": "#!/usr/bin/env bun\n\nimport { $ } from 'bun'\nimport * as fs from 'node:fs/promises'\n\nvar s = await $`ls`.text()\nvar l = s"
},
{
"path": "programmable/dnsserver/example.tengo",
"chars": 935,
"preview": "// Note: This is just an example, you can modify it according to your needs\n\nf := func() {\n if in_dnsservers {\n "
},
{
"path": "programmable/dnsserver/readme.md",
"chars": 48,
"preview": "brook dnsserver, dohserver, dnsserveroverbrook\n\n"
},
{
"path": "programmable/gallery.json",
"chars": 8704,
"preview": "[\n {\n \"name\": \"Example\",\n \"url\": \"https://raw.githubusercontent.com/txthinking/brook/refs/heads/master/"
},
{
"path": "programmable/modules/_footer.tengo",
"chars": 1620,
"preview": "f := func() {\n if in_brooklinks {\n for i:=0; i<len(modules); i++{\n if modules[i][\"brooklinks\"] {\n "
},
{
"path": "programmable/modules/_header.tengo",
"chars": 14,
"preview": "modules := []\n"
},
{
"path": "programmable/modules/allow_app.tengo",
"chars": 654,
"preview": "// Note: This is just an example, you can modify it according to your needs\n// Brook macOS need enable App Mode\n\n/"
},
{
"path": "programmable/modules/blacklist_mode.tengo",
"chars": 580,
"preview": "// Note: This is just an example, you can modify it according to your needs\n\n// Blacklist mode, only proxy some domains."
},
{
"path": "programmable/modules/block_a.tengo",
"chars": 319,
"preview": "// Block A if your local or server does not support IPv4. Note that all servers of Shiliew support both IPv4 and IPv6\n//"
},
{
"path": "programmable/modules/block_aaaa.tengo",
"chars": 459,
"preview": "// Block AAAA if your local or server does not support IPv6. Note that all servers of Shiliew support both IPv4 and IPv6"
},
{
"path": "programmable/modules/block_ad_domain.tengo",
"chars": 11236,
"preview": "// Note: The script limits the stack size 2048. If your array or map exceeds max stack size, try splitting it into multi"
},
{
"path": "programmable/modules/block_app.tengo",
"chars": 561,
"preview": "// Note: This is just an example, you can modify it according to your needs\n// Brook macOS need enable App Mode\n\n/"
},
{
"path": "programmable/modules/block_google_secure_dns.tengo",
"chars": 832,
"preview": "// Block google secure DNS to avoid Fake DNS does not work\n// 防止 Fake DNS 不生效\nmodules = append(modules, {\n dnsquery: "
},
{
"path": "programmable/modules/block_youtube_ad.tengo",
"chars": 2662,
"preview": "// iOS YouTube APP AD Block\n// YouTube App v17.15.1\n// https://www.txthinking.com/talks/articles/block-youtube-app-ad.ar"
},
{
"path": "programmable/modules/brooklinks.tengo",
"chars": 384,
"preview": "// Note: This is just an example, you can modify it according to your needs\n\n// Define more Servers before runtime, and "
},
{
"path": "programmable/modules/bypass_app.tengo",
"chars": 1852,
"preview": "// Note: Brook macOS 需要开启 App Mode\n\n// Bypass 微信\nmodules = append(modules, {\n dnsquery: func(m) {\n if m.appid "
},
{
"path": "programmable/modules/bypass_apple.tengo",
"chars": 1787,
"preview": "// Bypass Apple, because Apple's push service does not allow proxying.\n// Bypass Apple, 因为苹果推送服务不允许使用代理.\nmodules = appen"
},
{
"path": "programmable/modules/bypass_china_domain_a.tengo",
"chars": 11979,
"preview": "// Note: The script limits the stack size 2048. If your array or map exceeds max stack size, try splitting it into multi"
},
{
"path": "programmable/modules/bypass_geo.tengo",
"chars": 493,
"preview": "// Note: 因为大部分应用请求都是 domain address,只有少量会直接请求 IP address,此模块仅处理后者\n\n// Bypass Geo IP\nmodules = append(modules, {\n addr"
},
{
"path": "programmable/modules/chatgpt_advanced_voice.tengo",
"chars": 343,
"preview": "// Ignore fake DNS for ChatGPT Advanced Voice\nmodules = append(modules, {\n dnsquery: func(m) {\n text := import"
},
{
"path": "programmable/modules/check_syntax.js",
"chars": 630,
"preview": "#!/usr/bin/env bun\n\nimport { $ } from 'bun'\nimport * as fs from 'node:fs/promises'\n\nvar s = await $`ls`.text()\nvar l = s"
},
{
"path": "programmable/modules/douban.tengo",
"chars": 843,
"preview": "// 移除豆瓣 v7.66.0 开屏广告\n// [CA]\nmodules = append(modules, {\n address: func(m) {\n brook := import(\"brook\")\n "
},
{
"path": "programmable/modules/hosts.tengo",
"chars": 289,
"preview": "// hosts\nmodules = append(modules, {\n dnsquery: func(m) {\n if m.domain == \"localdev.com\" {\n if m.ty"
},
{
"path": "programmable/modules/instagram_system_dns.tengo",
"chars": 18361,
"preview": "// Ignore fake DNS for instagram\nmodules = append(modules, {\n dnsquery: func(m) {\n text := import(\"text\")\n "
},
{
"path": "programmable/modules/ios_app_downgrade.tengo",
"chars": 1551,
"preview": "// Download older version iOS app\n// https://www.txthinking.com/talks/articles/ios-old-version-app-en.article\n// 使用 Broo"
},
{
"path": "programmable/modules/ios_app_downgrade_history.tengo",
"chars": 990,
"preview": "// Download older version iOS app\n// https://www.txthinking.com/talks/articles/ios-old-version-app-en.article\n// 使用 Broo"
},
{
"path": "programmable/modules/mitmproxy_client.tengo",
"chars": 627,
"preview": "// Brook and mitmproxy for mobile phone deep Packet Capture\n// https://www.txthinking.com/talks/articles/brook-mitmproxy"
},
{
"path": "programmable/modules/packet_capture.tengo",
"chars": 1703,
"preview": "// Note: You may need to add more conditions to narrow the scope to avoid consuming too many resources and causing lag\n\n"
},
{
"path": "programmable/modules/readme.md",
"chars": 1759,
"preview": "## Brook GUI\n\nIn Brook GUI, scripts are abstracted into modules, and it will automatically combine `_header.tengo` and `"
},
{
"path": "programmable/modules/redirect_google_cn.tengo",
"chars": 1373,
"preview": "// www.google.cn 重定向到 www.google.com\n// [CA]\nmodules = append(modules, {\n dnsquery: func(m) {\n if m.domain == "
},
{
"path": "programmable/modules/response_sample.tengo",
"chars": 1332,
"preview": "// A sample for modifing response, try https://httpbin.org/get\n// [CA]\nmodules = append(modules, {\n address: func(m) "
},
{
"path": "programmable/modules/sanguosha.tengo",
"chars": 920,
"preview": "// Note: 本模块基于 macOS 编写\n// Brook macOS 客户端需要开启 App Mode\n// 需要通过 `brooklinks` 预先定一个 key 为 `sanguosha` 的 brook"
},
{
"path": "programmable/modules/xbox.tengo",
"chars": 836,
"preview": "// Unlock Xbox country limit\n// [CA]\n\nmodules = append(modules, {\n address: func(m) {\n if m.domainaddress {\n "
},
{
"path": "programmable/modules/xiaohongshu.tengo",
"chars": 724,
"preview": "// 小红书定制 IP 归属地\n// Note: 需要通过 `brooklinks` 预先定一个 key 为 `beijing` 的 brook link\nmodules = append(modules, {\n address: f"
},
{
"path": "programmable/readme.md",
"chars": 823,
"preview": "# How to submit your own scripts to the Brook Script Gallery\n\nJust add an object to [gallery.json](https://github.com/tx"
},
{
"path": "programmable/server/check_syntax.js",
"chars": 474,
"preview": "#!/usr/bin/env bun\n\nimport { $ } from 'bun'\nimport * as fs from 'node:fs/promises'\n\nvar s = await $`ls`.text()\nvar l = s"
},
{
"path": "programmable/server/example.tengo",
"chars": 2506,
"preview": "// Note: This is just an example, you can modify it according to your needs\n\nf := func() {\n if in_dnsservers {\n "
},
{
"path": "programmable/server/readme.md",
"chars": 47,
"preview": "brook server, wsserver, wssserver, quicserver\n\n"
},
{
"path": "protocol/brook-link-protocol.md",
"chars": 322,
"preview": "# brook link protocol\n\n```\nbrook://KIND?QUERY\n```\n\n- **KIND**: `server`, `wsserver`, `wssserver`, `socks5`, `quicserve"
},
{
"path": "protocol/brook-quicserver-protocol.md",
"chars": 1185,
"preview": "# brook quicserver protocol\n\n<!--THEME:github-->\n<!--G-R3M673HK5V-->\n\n## Client --TCP over QUIC Stream--> Server\n\nThis i"
},
{
"path": "protocol/brook-server-protocol.md",
"chars": 4501,
"preview": "# brook server protocol\n\n<!--THEME:github-->\n<!--G-R3M673HK5V-->\n\n## Terminology\n\n- **`DST Address`**: The address that "
},
{
"path": "protocol/brook-wsserver-protocol.md",
"chars": 3950,
"preview": "# brook wsserver protocol\n\n<!--THEME:github-->\n<!--G-R3M673HK5V-->\n\n## Terminology\n\n- **`DST Address`**: The address tha"
},
{
"path": "protocol/brook-wssserver-protocol.md",
"chars": 289,
"preview": "# brook wssserver protocol\n\n<!--THEME:github-->\n<!--G-R3M673HK5V-->\n\n```\nTLS(brook wsserver protocol)\n```\n\nThe simple ex"
},
{
"path": "protocol/user.md",
"chars": 3827,
"preview": "# User System\n\nThis content introduces how to develop a user system with Brook. Your system only needs to focus on two c"
},
{
"path": "quic.go",
"chars": 3901,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "quicclient.go",
"chars": 5049,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "quicserver.go",
"chars": 8081,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "relay.go",
"chars": 4985,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "relayoverbrook.go",
"chars": 4711,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "resolve.go",
"chars": 1006,
"preview": "package brook\n\nimport (\n\t\"errors\"\n\t\"net\"\n\n\t\"github.com/miekg/dns\"\n)\n\nfunc Resolve6(host string) (string, error) {\n\tif ne"
},
{
"path": "server.go",
"chars": 4446,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "simplepacketclient.go",
"chars": 2549,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "simplepacketserver.go",
"chars": 2299,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "simplepacketserverconn.go",
"chars": 1998,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "simplestreamclient.go",
"chars": 3915,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "simplestreamserver.go",
"chars": 4198,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "socks5.go",
"chars": 1369,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "socks5test.go",
"chars": 2304,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "socks5tohttp.go",
"chars": 4135,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "streamclient.go",
"chars": 5356,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "streamserver.go",
"chars": 5456,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "test_test.go",
"chars": 818,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "util.go",
"chars": 2368,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "waitreaderr.go",
"chars": 798,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "websocket.go",
"chars": 5510,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "wsclient.go",
"chars": 4767,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
},
{
"path": "wsserver.go",
"chars": 5495,
"preview": "// Copyright (c) 2016-present Cloud <cloud@txthinking.com>\n//\n// This program is free software; you can redistribute it "
}
]
About this extraction
This page contains the full source code of the txthinking/brook GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 136 files (1.3 MB), approximately 627.4k tokens, and a symbol index with 336 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.