diff --git a/Gemfile b/Gemfile index 61271270..1d60fff1 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,7 @@ gem 'wdm', '~> 0.1.1', :install_if => Gem.win_platform? group :jekyll_plugins do gem 'asciidoctor-diagram' - gem 'asciidoctor-diagram-plantuml' + gem 'asciidoctor-diagram-plantuml', '1.2024.8' # pinned: newer PlantUML draws a deprecation banner for skinparam handwritten (sketchy) gem 'jekyll-asciidoc' gem 'jekyll-paginate-v2' gem 'jekyll-auto-authors' diff --git a/_posts/2026-06-25-lhistoire-de-vidocq.adoc b/_posts/2026-06-25-lhistoire-de-vidocq.adoc new file mode 100644 index 00000000..95a66901 --- /dev/null +++ b/_posts/2026-06-25-lhistoire-de-vidocq.adoc @@ -0,0 +1,312 @@ += Vidocq : quand le dev augmenté implémente tout MicroProfile +:page-navtitle: Vidocq : le dev augmenté face aux TCK MicroProfile +:page-excerpt: Et si on demandait à Claude Code d'implémenter l'intégralité du Core Profile Jakarta EE et de MicroProfile, sans aucune dépendance externe ni manipulation de bytecode ? Récit d'une expérience de spec-driven development poussée à l'extrême, où le TCK joue les arbitres impitoyables : 15 modules, 180 000 lignes de Java et 5 650 tests d'acceptance au vert. +:layout: post +:page-tags: [Java, Jakarta EE, MicroProfile, CDI, IA] +:page-auteurs: [yannblazart,antoinesabotdurand] +:page-vignette: 2026/vidocq.png +:page-liquid: +:page-categories: software news + +[NOTE] +.Mais qui était Vidocq ? +==== +Eugène-François Vidocq (1775–1857) fut d'abord un bagnard et un hors-la-loi avant de devenir le premier directeur de la Sûreté nationale, l'ancêtre de la police judiciaire française. Maître du déguisement et de l'infiltration, il connaissait le crime de l'intérieur, ce qui en faisait le mieux placé pour le combattre. Il est aussi considéré comme le père de la criminalistique moderne et l'inspirateur de nombreux personnages de fiction, de Vautrin chez Balzac à Sherlock Holmes. + +Le nom s'imposait pour ce projet : comme son homonyme, ce runtime connaît les spécifications de l'intérieur, déjoue leurs pièges et applique une méthode d'enquête rigoureuse, le TCK jouant le rôle de l'enquêteur impitoyable qui ne laisse passer aucune approximation. +==== + + +== Tout a commencé par une discussion sur le Spec Driven Development + +C'est durant l'excellente unconférence https://www.jchateau.org[JChateau^], le 7 mars 2026, qu'a débuté l'aventure Vidocq. +Les discussions allaient bon train sur l'IA (entre les débats sur la souveraineté et les nouveautés de Java 26) et sur l'arrivée d'un "nouveau" concept : le spec-driven development. +Après avoir plaisanté sur la réinvention du cycle en V par la communauté dev, nous avons réalisé que des projets avec des spécifications en béton, il y en avait un gisement conséquent dans l'écosystème Java avec Jakarta EE et MicroProfile. + +Contrairement à la plupart des frameworks qui posent leurs propres règles (comme Spring), ces specs définissent des contrats précis, vérifiables, et sont chacune assorties d'un harnais de tests d'acceptance redoutable : le TCK (Technology Compatibility Kit). +Les documents de spécification plus les API plus les TCK constituent quelque chose d'assez unique dans le monde du développement. +Ce mix constituait la spec ultime pour valider le spec-driven development avec un cas très concret : l'implémentation d'une des spécifications les plus ambitieuses de Jakarta EE : Contexts and Dependency Injection (CDI). + +C'est de cette idée d'expérimentation qu'est né Vidocq. + + +== L'expérience fondatrice : CDI 4.1 + +=== Pourquoi partir de CDI ? + +Pour les moins attentifs des lecteurs, rappelons que nous sommes tombés dans la marmite [.line-through]#J2EE#, [.line-through]#Java EE#, Jakarta EE quand nous étions petits. + +Par ailleurs, Antoine a été spec lead de CDI pour les versions 1.2 et 2.0 pendant sa période Red Hat. + +Ajoutons à ça que CDI est la colonne vertébrale de Jakarta EE et de MicroProfile. Que c'est l'une des spécifications les plus complexes (intercepteurs, décorateurs, stéréotypes, portées contextuelles, injection de producteurs…). Et on aura compris pourquoi cette spécification a été choisie comme terrain d'expérimentation du spec-driven development. + +C'était le pari le plus ambitieux et, en même temps, le plus révélateur. Si l'expérience fonctionnait ici, elle pouvait fonctionner partout. + +Dans les faits, Antoine s'est mis à la tâche le soir même, le 7 mars 2026, sur place à JChateau. Cette toute première expérimentation, baptisée _Capsule_, vit encore sur GitHub dans le dépôt https://github.com/Modilius/capsule/tree/copilot/create-cdi-lite-implementation[Modilius/capsule^] : 33 commits entre le 7 et le 12 mars 2026, une implémentation de CDI 4.1 Lite (package `org.modilius`) générée avec l'agent, qui atteint rapidement un début de résultat (60 % du TCK passé). + +C'est ensuite Yann qui a industrialisé la tâche et l'a menée au bout. Le 29 mars 2026, le projet repart sur des bases propres avec _Vauban_, le futur conteneur CDI : cette étape a transformé une expérimentation en bootstrap de vrai projet. + +=== Des contraintes inédites + +Là où d'autres implémentations comme Weld (Red Hat) ou ArC (Quarkus) reposent sur des bibliothèques de manipulation de bytecode, ASM, Byte Buddy, la règle du jeu imposée à l'implémentation de Vidocq a été radicalement différente : + +* *Zéro dépendance externe* : pas de framework tiers, uniquement les APIs Jakarta/MicroProfile concernées +* *Pas de manipulation de bytecode à l'exécution* : aucun proxy dynamique, aucun agent, aucun `setAccessible(true)` en production +* *Génération statique au moment de la compilation* : toute la « magie » CDI (factories, proxies, intercepteurs) produite par la https://openjdk.org/jeps/484[Class-File API^] de JDK 25 et APT +* *JPMS strict* : chaque module a son propre `module-info.java`, les exports sont au minimum +* *Virtual Threads* partout pour les I/O +* *AOT-compatible* : le résultat doit pouvoir tourner sous GraalVM et Leyden CDS + +Ces contraintes ne sont pas des caprices d'architecte. Elles définissent ce que sera Vidocq en production : un runtime sans friction, sans couche cachée, sans surprise au moment du déploiement natif. + +== La méthode en trois temps + +L'implémentation de chaque spec a suivi le même rituel. Cette méthode n'a pas été inventée d'un coup, elle s'est construite au fur et à mesure de l'avancement de l'expérience CDI et a ensuite été propagée aux autres modules de Vidocq + +=== Phase 1, Contraintes et plan + +Avant d'écrire une ligne de code, on soumet à Claude Code la spécification et les contraintes. On lui demande de proposer un plan d'implémentation : architecture des modules, découpage des responsabilités, stratégies de génération de code. + +Ce plan est le vrai travail intellectuel du début. On le relit, on le questionne, on le pousse dans ses retranchements. Peut-on vraiment ne pas utiliser de réflexion ici ? Comment va-t-on gérer les scopes CDI sans proxy dynamique ? La réponse de l'IA est rarement la bonne du premier coup, c'est la confrontation entre sa proposition et notre connaissance des specs qui produit le plan final. + +=== Phase 2, L'exécution guidée + +Une fois le plan validé, on le déroule. Claude Code implémente la spec section par section, test par test. Le rôle humain est celui du guide : orienter, corriger le cap quand l'IA dérive, signaler une incohérence avec une section de spec lue en parallèle. + +C'est une collaboration, pas une délégation. L'IA n'est pas autonome, elle est précise et rapide là où une lecture exhaustive de la spec prendrait des semaines. + +=== Phase 3, Le TCK comme arbitre absolu + +C'est la phase la plus longue, et de loin. Une fois l'implémentation « théoriquement correcte », on la confronte au TCK de la spécification. + +_Le TCK est l'arbitre absolu : pas de triche possible, chaque test est un contrat que l'IA doit honorer._ + +Les premiers passages sont rarement brillants. Un test rouge révèle une subtilité de la spec mal interprétée. L'IA corrige, parfois réécrit une portion entière de son implémentation. On relance. On progresse. La courbe typique ressemble à ça : 40 % verts au premier run, 70 % après une journée, les 30 % restants peuvent prendre autant de temps que tout le reste. + +Il lui est arrivé de tricher un peu sur les règles en utilisant de la manipulation de bytecode plutôt que l'écriture de fichiers Java. +C'était probablement dû aux données d'entraînement du modèle qui devait comporter beaucoup plus d'exemples de manipulation de bytecode que de génération de fichiers Java. +Certains exemples de ce contournement ont été aperçus durant l'écriture de l'implémentation, d'autres plus tard dans une analyse plus poussée ou lors de l'implémentation de nouvelles spécifications dépendantes de CDI. + + +== Vauban : la première victoire + +Sébastien Le Prestre de Vauban était l'ingénieur militaire de Louis XIV, le bâtisseur de fortifications inexpugnables. Le nom s'imposait pour le container CDI : solide, sans faille, conçu pour tenir. + +Le besoin pour MicroProfile était de n'implémenter que la partie Lite de la spec qui exclut les features liées aux EJB et au système d'extension legacy au profit des nouvelles Build Time Compatible Extensions apparues dans CDI 3.0. + +*Vauban, CDI 4.1 Lite : 774/774 tests TCK. 100 %.* + +La "forteresse" Vauban a mis une dizaine de jours à céder. + +Lorsque le 774ème test est passé au vert, l'équipe a compris que le "jeu" de départ allait devenir plus sérieux. +En effet, ce résultat validait tout le pari. Une IA pouvait implémenter une spécification Java Enterprise complexe, avec des contraintes inédites, et passer la suite officielle de tests sans une seule défaillance. Ce n'était plus une hypothèse. + +== L'expansion : de CDI à une stack complète + +La question naturelle après Vauban était : si ça marche pour CDI, jusqu'où peut-on aller ? + +La réponse, construite module par module au fil des semaines, c'est Vidocq dans son état actuel : *dix-neuf repos dont quinze modules indépendants* couvrant l'intégralité du Core Profile et de MicroProfile. + +La frise ci-dessous retrace cette construction, du prototype _Capsule_ né à JChateau jusqu'à la sortie open source. Les dates correspondent au premier et au dernier commit de chaque dépôt. + +.Frise historique de Vidocq : du prototype Capsule (JChateau) à la sortie open source +[plantuml, "frise-vidocq", "svg", width="100%"] +---- +@startgantt +skinparam handwritten true + +title Frise historique de Vidocq (mars - juin 2026) +printscale weekly zoom 2 +Project starts 2026-03-02 +saturday are open +sunday are open + +-- Genèse -- +[JChateau] happens 2026-03-07 +[JChateau] is colored in #ffec3f +[Capsule : prototype CDI Lite] as [CAPS] starts 2026-03-07 and ends 2026-03-12 +[CAPS] is colored in #9abcc3 + +-- Core Profile -- +[Vauban : CDI 4.1] as [VAUBAN] starts 2026-03-29 and ends 2026-06-17 +[VAUBAN] is colored in #9abcc3 +[Vidocq : orchestrateur runtime] as [VIDOCQ] starts 2026-04-10 and ends 2026-06-21 +[VIDOCQ] is colored in #9abcc3 +[Chappe : serveur HTTP] as [CHAPPE] starts 2026-04-16 and ends 2026-06-14 +[CHAPPE] is colored in #9abcc3 +[Cassini : Jakarta REST 4.0] as [CASSINI] starts 2026-04-27 and ends 2026-06-15 +[CASSINI] is colored in #9abcc3 +[Foy : Jakarta Servlet 6.1] as [FOY] starts 2026-04-30 and ends 2026-06-14 +[FOY] is colored in #d1d5db +[Champollion : JSON-P / JSON-B] as [CHAMP] starts 2026-05-01 and ends 2026-06-16 +[CHAMP] is colored in #9abcc3 +[Mansart : Jakarta Data + Tx] as [MANSART] starts 2026-05-04 and ends 2026-06-14 +[MANSART] is colored in #9abcc3 +[Ravel : MP Config] as [RAVEL] starts 2026-05-07 and ends 2026-06-14 +[RAVEL] is colored in #9abcc3 + +-- MicroProfile -- +[Knock : MP Health] as [KNOCK] starts 2026-05-10 and ends 2026-06-15 +[KNOCK] is colored in #cdd8ea +[Cyrano : MP Rest Client] as [CYR] starts 2026-05-12 and ends 2026-06-14 +[CYR] is colored in #cdd8ea +[Heisenberg : MP Fault Tolerance] as [HEIS] starts 2026-05-16 and ends 2026-06-14 +[HEIS] is colored in #cdd8ea +[Humboldt : MP Telemetry] as [HUMB] starts 2026-05-20 and ends 2026-06-14 +[HUMB] is colored in #cdd8ea +[Dirac : MP Metrics] as [DIRAC] starts 2026-05-22 and ends 2026-06-15 +[DIRAC] is colored in #cdd8ea +[Cervantes : MP JWT] as [CERV] starts 2026-05-26 and ends 2026-06-14 +[CERV] is colored in #cdd8ea +[Grimm : MP OpenAPI] as [GRIMM] starts 2026-05-26 and ends 2026-06-14 +[GRIMM] is colored in #cdd8ea + +-- Publication -- +[Open source] happens 2026-06-25 +[Open source] is colored in #ffec3f +@endgantt +---- + +=== Les briques fondamentales + +*Chappe* est né de la nécessité : pour implémenter Servlet et REST, il fallait un serveur HTTP. Plutôt que de dépendre de Netty ou Jetty, ce qui aurait brisé la règle zéro-dépendance, Chappe a été écrit from scratch. Le nom rend hommage à Claude Chappe (1763–1805), inventeur du télégraphe sémaphore, ce réseau de tours optiques qui couvrit toute la France. Le projet Chappe est son héritier numérique : un réseau de communication en Java pur. + +*Champollion* gère JSON-P, JSON-B et une nouvelle implémentation protobuf. Jean-François Champollion a déchiffré les hiéroglyphes, le projet est la pierre de Rosette des échanges interservices. *Ravel* (MicroProfile Config) porte le nom du compositeur Maurice Ravel, qui savait orchestrer la configuration d'une partition complexe. + +=== Jakarta EE + +Avec Chappe, Vauban et Champollion en place, *Cassini* (Jakarta REST 4.0) et *Foy* (Jakarta Servlet 6.1) pouvaient s'appuyer sur des fondations solides. Cassini, du nom de la célèbre famille d'astronomes français et cartographes, totalise aujourd'hui *2 535 tests TCK* tous au vert. +À ce jour, *Foy* est toujours en cours de développement. En effet, cette spécification ne faisant pas partie du Core Profile, elle n'était pas prioritaire. Mais elle est en bonne voie : 1 261 tests TCK sont déjà passés au vert. + +=== MicroProfile : huit spécifications + +Une fois le Core Profile établi, l'expansion vers MicroProfile était logique. Les huit specs ont été abordées dans un ordre dicté par les dépendances : + +[cols="1,2,2,1", options="header"] +|=== +| Module +| Spécification +| Inspiration +| TCK + +| *Heisenberg* +| MicroProfile Fault Tolerance 4.1 +| Werner Heisenberg, l'incertitude est inhérente aux appels réseau +| 463/463 + +| *Cervantes* +| MicroProfile JWT 2.1 +| Cervantes / Don Quichotte : _proclamer_ une identité, et la _vérifier_ vraiment +| 206/206 + +| *Cyrano* +| MicroProfile Rest Client 4.0 +| Cyrano de Bergerac, l'éloquence au service d'un autre +| 168/168 + +| *Dirac* +| MicroProfile Metrics 5.1.1 +| Paul Dirac, physique quantique et mesure +| 127/127 + +| *Grimm* +| MicroProfile OpenAPI 4.1 +| Jacob Grimm, célèbre pour ses travaux en linguistique et classification des langues (documenter une API) +| 349/349 + +| *Humboldt* +| MicroProfile Telemetry 2.1 +| Alexander von Humboldt, observer, mesurer, corréler à toutes les couches +| 85/85 + +| *Knock* +| MicroProfile Health 4.0 +| Le Docteur Knock, qui trouve tout le monde malade, ou en bonne santé +| 28/28 + +| *Ravel* +| MicroProfile Config 3.1 +| Maurice Ravel, orchestrer la configuration +| 349/349 +|=== + + +=== La couche persistence + +*Mansart* (Jakarta Data 1.0 + Transactions 2.0) complète l'ensemble côté persistence. Jules Hardouin-Mansart, l'architecte de Versailles, pose les fondations de données. Jakarta Persistence 3.2 reste en suspens, une décision consciente d'aller jusqu'au bout du possible sans sacrifier les principes. + + +== Les chiffres finaux + +Quinze modules. Une seule règle : passer la TCK. + +[cols="2,3,1", options="header"] +|=== +| Périmètre +| Spécifications +| Tests TCK + +| *Core Profile* +| CDI 4.1, REST 4.0, JSON-P 2.1, JSON-B 3.0, Config 3.1, Servlet 6.1 +| *3 796* + +| *MicroProfile* +| Fault Tolerance, JWT, Rest Client, Metrics, OpenAPI, Telemetry, Health, Config +| *1 775* + +| *Additionnels & Runtime* +| Jakarta Data 1.0, Transactions 2.0, Vidocq orchestrateur +| *79* + +| *Total* +| +| *5 650 tests TCK* +|=== + +*180 000+ lignes de Java* générées avec Claude Code sous contraintes. + +Aucun test TCK désactivé. Aucune dépendance externe non justifiée. Aucune manipulation de bytecode à l'exécution. + + +== Sur les épaules de géants + +Ces chiffres impressionnent, mais ils en cachent un autre, bien plus grand et bien plus ancien : celui des femmes et des hommes qui ont écrit, débattu et affiné ces spécifications pendant près de vingt ans. Vidocq n'invente rien de ce qu'il implémente ; il exécute, fidèlement et à toute vitesse, des contrats mûris par une communauté entière. + +Les briques du Core Profile ne datent pas d'hier. CDI naît au milieu des années 2000 (JSR 299, finalisée fin 2009 avec Java EE 6), Jakarta REST (ex-JAX-RS) démarre en 2007, et JSON-P, JSON-B ou les annotations communes suivent dans les années 2010. Tout ce travail, d'abord mené au sein du Java Community Process, passe ensuite sous la gouvernance ouverte de la Fondation Eclipse à partir de 2017-2018. MicroProfile, lui, est fondé en 2016 pour porter cet héritage vers les microservices, et n'a cessé de s'enrichir depuis. Le Core Profile tel que l'implémente Vidocq est formalisé en 2022 avec Jakarta EE 10. + +Rien que sur les dépôts publics de ces quinze spécifications, on dénombre près de 200 contributeurs identifiables, et ce décompte ignore les groupes d'experts JCP des années 2000, antérieurs à GitHub. Derrière ces noms : Red Hat, IBM, Oracle, Payara, Tomitribe, Microsoft et une communauté open source mondiale qui, release après release, a transformé des intentions en contrats vérifiables. + +C'est tout le paradoxe heureux de Vidocq : une stack assemblée en quelques semaines par des développeurs augmentés ne tient debout que parce qu'elle s'appuie sur près de vingt ans de spécifications collectives. Le TCK qui sert d'arbitre, les API que l'on implémente, les contrats que l'on respecte : tout cela est l'héritage d'un travail colossal. Sans ces géants, Vidocq n'existerait tout simplement pas. S'il voit si loin, c'est qu'il se tient sur leurs épaules. + +== Ce que Vidocq démontre + +Même si la stack a démarré sous forme de défi, Vidocq est allé au-delà de la simple démonstration. C'est une implémentation production-grade de l'ensemble du Core Profile Jakarta EE et de MicroProfile, avec des contraintes architecturales que les frameworks mainstream n'ont pas encore posées. + +La méthode, contraintes fortes + plan + guidage + TCK comme arbitre, est reproductible. Elle impose à l'IA une rigueur que les tests unitaires classiques ne garantissent pas. La TCK ne ment pas, ne tolère pas les approximations, ne s'adapte pas à ce que l'implémentation a envie de faire. + +C'est peut-être la leçon la plus importante de Vidocq : l'IA est d'autant plus performante qu'elle a un juge objectif, externe, et inflexible. La spécification est ce juge. + + +== Et maintenant ? + +Vidocq est à présent mis à disposition de la communauté avec une triple licence EUPL 1.2, EPL 2 et GPL 2.0. Il est possible de l'utiliser pour des projets personnels ou professionnels, de l'étudier, de le modifier et de le redistribuer. + +Nous allons continuer à faire évoluer la stack en ajoutant au module d'intégration des outils facilitant la vie des développeurs. +Une roadmap est en cours de construction pour les prochaines spécifications Jakarta EE, MicroProfile et le tooling. +Vos idées et contributions sont bienvenues pour alimenter ces réflexions et leurs futures réalisations. +Une opportunité pour vous mettre le pied à l'étrier sur le développement augmenté ? + +Le code est disponible sur https://codeberg.org/Vidocq[Codeberg^]. La méthode est documentée et réutilisable pour développer d'autres briques. + +Bienvenue chez Vidocq ! diff --git a/_posts/2026-07-06-vidocq-runtime-jakarta-microprofile-souverain.adoc b/_posts/2026-07-06-vidocq-runtime-jakarta-microprofile-souverain.adoc new file mode 100644 index 00000000..21f43cb3 --- /dev/null +++ b/_posts/2026-07-06-vidocq-runtime-jakarta-microprofile-souverain.adoc @@ -0,0 +1,81 @@ += Vidocq : un runtime Jakarta EE et MicroProfile souverain, sans aucune dépendance +:page-navtitle: Vidocq : le runtime Jakarta EE & MicroProfile souverain +:page-excerpt: Nous publions Vidocq en open source : une implémentation complète du Core Profile Jakarta EE et de MicroProfile, écrite en Java pur, sans aucune dépendance externe, validée par 5 650 tests TCK officiels. Un runtime conçu pour la souveraineté, le standard et la sécurité. +:layout: post +:page-tags: [Java, Jakarta EE, MicroProfile, Souveraineté, Open source] +:page-auteurs: [yannblazart,antoinesabotdurand] +:page-vignette: 2026/vidocq.png +:page-liquid: +:page-categories: software news + +Aujourd'hui, nous livrons *Vidocq* à la communauté : une implémentation complète et autonome du *Core Profile Jakarta EE* et de *MicroProfile*, écrite intégralement en Java, *sans une seule dépendance externe*, et validée par *5 650 tests des TCK officiels*. + +Vidocq est disponible dès maintenant en open source sur https://codeberg.org/Vidocq[Codeberg^], sous triple licence EUPL 1.2, EPL 2 et GPL 2.0. Le projet est encore en *version alpha* : tout est documenté et exploré sur https://vidocq.dev[vidocq.dev^]. + +//more + +== Pourquoi Vidocq compte + +Trois convictions ont guidé ce projet, et elles se lisent jusque dans son code. + +=== Souveraineté : une stack européenne, jusque dans les noms + +Vidocq n'est pas qu'un runtime : c'est un manifeste pour une informatique européenne, ouverte et maîtrisée. Le projet est hébergé sur https://codeberg.org/Vidocq[Codeberg^], une forge associative européenne, et publié sous des licences ouvertes dont l'EUPL, la licence publique de l'Union européenne. + +Cette filiation s'affiche jusque dans les noms de code des modules, qui rendent hommage à des figures du patrimoine scientifique et culturel européen. *Vauban*, l'ingénieur des fortifications de Louis XIV, donne son nom au conteneur CDI, solide et sans faille. *Chappe*, inventeur du télégraphe optique, nomme le serveur HTTP écrit from scratch. *Cassini* (REST), *Champollion* (JSON), *Ravel* (Config), *Cervantes* (JWT), *Cyrano* (Rest Client) ou *Humboldt* (Telemetry) prolongent cette galerie. Et au sommet, *Vidocq*, premier directeur de la Sûreté nationale, qui connaît les spécifications de l'intérieur pour mieux les honorer. + +=== Standard : zéro propriétaire, 100 % spécifications + +Vidocq n'invente aucun framework et n'impose aucune règle maison. Il implémente fidèlement des *standards ouverts* : CDI, Jakarta REST, JSON-P/B, Config, Servlet, et huit spécifications MicroProfile. + +La preuve n'est pas déclarative, elle est mesurée. Chaque module est confronté au *TCK (Technology Compatibility Kit)*, la suite de tests d'acceptance officielle de chaque spécification, l'arbitre impitoyable de la conformité. + +[cols="2,3,1", options="header"] +|=== +| Périmètre | Spécifications | Tests TCK + +| *Core Profile* +| CDI 4.1, REST 4.0, JSON-P 2.1, JSON-B 3.0, Config 3.1, Servlet 6.1 +| *3 796* + +| *MicroProfile* +| Fault Tolerance, JWT, Rest Client, Metrics, OpenAPI, Telemetry, Health, Config +| *1 775* + +| *Additionnels & Runtime* +| Jakarta Data 1.0, Transactions 2.0, Vidocq orchestrateur +| *79* + +| *Total* +| +| *5 650 tests TCK au vert* +|=== + +Aucun test TCK désactivé. Choisir Vidocq, c'est choisir un standard, pas un fournisseur : vos applications restent portables, sans verrou propriétaire. + +=== Sécurité : ce qui n'existe pas ne peut pas être attaqué + +La plus grande surface d'attaque d'une application moderne, c'est sa chaîne de dépendances. https://en.wikipedia.org/wiki/Log4Shell[Log4Shell^] l'a rappelé brutalement : une faille dans une bibliothèque transitive, et c'est tout l'écosystème qui tremble. + +Vidocq prend le problème à la racine avec une règle radicale : *zéro dépendance externe*. Uniquement les API Jakarta et MicroProfile, et du Java pur. + +* *Aucune bibliothèque tierce* : pas de Netty, pas de Jetty, pas d'ASM, pas de Byte Buddy. Pas de CVE héritée. +* *Aucune manipulation de bytecode à l'exécution* : pas de proxy dynamique, pas d'agent, pas de `setAccessible(true)` en production. Toute la « magie » est générée à la compilation via la https://openjdk.org/jeps/484[Class-File API^] de JDK 25. +* *JPMS strict et AOT-compatible* : modules cloisonnés, exports minimaux, compatible GraalVM et Leyden CDS. + +Le résultat : une chaîne d'approvisionnement logicielle réduite à sa plus simple expression, auditable de bout en bout, et un démarrage natif sans surprise. + +== En chiffres + +* *15 modules* indépendants couvrant l'intégralité du Core Profile et de MicroProfile +* *5 650 tests TCK* officiels au vert +* *180 000+ lignes de Java* sous contraintes strictes +* *0 dépendance externe*, *0 manipulation de bytecode* à l'exécution + +== Découvrir Vidocq + +Le code, la documentation et la méthode sont disponibles dès maintenant sur https://codeberg.org/Vidocq[Codeberg^], et le site https://vidocq.dev[vidocq.dev^] rassemble tout ce qu'il faut pour démarrer. Rappelons que Vidocq est en *version alpha* : l'API et les modules vont encore évoluer, et vos retours sont précieux pour faire mûrir le projet. Vous pouvez dès aujourd'hui l'utiliser, l'étudier, le modifier et le redistribuer pour vos projets personnels et professionnels. + +*SCIAM est fière d'être sponsor de Vidocq.* Soutenir un runtime Java ouvert, conforme aux standards et pensé pour la souveraineté européenne, c'est investir dans une informatique que l'on peut comprendre, auditer et maîtriser. + +Et si vous voulez savoir comment une stack aussi exigeante a vu le jour, du prototype griffonné lors d'une unconférence jusqu'aux 5 650 tests au vert, ne manquez pas le récit complet de l'aventure : link:{% post_url 2026-06-25-lhistoire-de-vidocq %}[l'histoire de Vidocq^]. diff --git a/css/styles.css b/css/styles.css index cbd72275..4d38d972 100644 --- a/css/styles.css +++ b/css/styles.css @@ -1 +1 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:Noyh Geometric,open-sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}#toc{border-bottom:none;padding-bottom:.25rem}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:820px){.container{max-width:820px}}@media (min-width:1128px){.container{max-width:1128px}}@media (min-width:1150px){.container{max-width:1150px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:2000px}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25rem!important;margin-bottom:.25rem!important;margin-top:.25rem!important}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#2563eb;font-weight:500;text-decoration:underline}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#eab308}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25rem!important;font-weight:800;line-height:2.25rem!important;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.875rem!important;font-weight:700;line-height:2.25rem!important;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5rem!important;font-weight:600;line-height:2rem!important;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25rem!important;font-weight:600;line-height:1.75rem!important;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin:2em auto}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem;font-weight:400!important}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;vertical-align:middle;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start;vertical-align:middle}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose :where(h1,h2,h3,h4,h5,h6):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric;margin-bottom:24px!important;margin-top:24px!important}.prose :where(#preamble>.sectionbody>.paragraph:first-of-type>p):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-size:1.25rem!important;font-weight:600!important;line-height:1.7rem!important;margin-bottom:1.2rem!important}.prose :where(h2 a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:2.25rem!important;font-weight:700!important;line-height:2.5rem!important;text-decoration:none!important}.prose :where(h2 a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h3 a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:1.875rem!important;font-weight:600!important;line-height:2.25rem!important;text-decoration:none!important}.prose :where(h3 a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h4 a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:1.5rem!important;font-weight:600!important;line-height:2rem!important;text-decoration:none!important}.prose :where(h4 a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(.sect1):not(:where([class~=not-prose],[class~=not-prose] *)){border-top:0!important;padding-bottom:0!important}.prose :where(sect2 sect3 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sect2 sect3 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sect2 sect3 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sect2 sect3 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sect2 sect3 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(sect2 sect3 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sectionbody sect2 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sectionbody sect2 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sectionbody sect2 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sectionbody sect2 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sectionbody sect2 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(sectionbody sect2 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(.paragraph>p code):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important;font-size:.9rem!important;font-weight:400!important}.prose :where(p code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.prose :where(p code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(p code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(h2 code,h3 code,h4 code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(h2 code,h3 code,h4 code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table td.content code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(table td.content code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(.title code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(.title code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(.ulist p code):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important;font-size:.9rem!important;font-weight:400!important;line-height:1.75rem!important}.prose :where(.ulist li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.5rem!important}.prose :where(.listingblock):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:400!important;line-height:1.75rem!important;margin-bottom:1.5rem!important;margin-top:1.5rem!important}.prose :where(.listingblock>.content>pre:not(.highlight)):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-size:.9rem!important}.prose :where(.literalblock pre,.listingblock>.content>pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono!important;font-size:1rem!important}.prose :where(.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:1.125rem!important}.prose :where(admonitionblock note td.content>.title code):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important;font-size:.9rem!important}.prose :where(.listingblock>.title code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.prose :where(table>tbody>tr>td code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.prose :where(table>thead>tr>th):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:center!important}.prose :where(table>tbody>tr>td p):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:center}.prose :where(.content>pre):not(:where([class~=not-prose],[class~=not-prose] *)){border:1px solid #e5e7eb;display:block;margin-bottom:1rem!important;margin-top:1rem!important;overflow-x:auto;white-space:pre;width:100%}.prose :where(.content>pre span):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important}.prose :where(.highlight>pre):not(:where([class~=not-prose],[class~=not-prose] *)){backgroun-color:#f5f5f7!important}.prose :where(td code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(td code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(td.content):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.125rem!important}.prose :where(td.content code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border-width:0;white-space:nowrap}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{bottom:0;top:0}.bottom-5{bottom:1.25rem}.left-1\/2{left:50%}.right-0{right:0}.right-5{right:1.25rem}.top-0{top:0}.top-1\/2{top:50%}.top-10{top:2.5rem}.z-50{z-index:50}.order-1{order:1}.order-2{order:2}.col-span-1{grid-column:span 1/span 1}.col-span-12{grid-column:span 12/span 12}.float-left{float:left}.m-1{margin:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-\[-1rem\]{margin-left:-1rem;margin-right:-1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-12{margin-bottom:50px;margin-top:50px}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-20{margin-bottom:5rem;margin-top:5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-4{margin-bottom:1rem;margin-top:1rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-auto{margin-bottom:auto}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.ms-auto{margin-inline-start:auto}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-3{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-3{-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-2{height:.5rem}.h-20{height:5rem}.h-23{height:23rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-72{height:18rem}.h-auto{height:auto}.h-full{height:100%}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.min-h-\[30vh\]{min-height:30vh}.min-h-\[500px\]{min-height:500px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-2{width:.5rem}.w-20{width:5rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-\[50\%\]{width:50%}.w-full{width:100%}.min-w-\[100px\]{min-width:100px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-full{border-radius:50px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.rounded-r-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0\.5{border-width:.5px}.border-lightbluesciam{--tw-border-opacity:1;border-color:rgb(154 188 195/var(--tw-border-opacity,1))}.border-navysciam{--tw-border-opacity:1;border-color:rgb(56 74 114/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-grayBg{--tw-bg-opacity:1;background-color:rgb(242 241 237/var(--tw-bg-opacity,1))}.bg-grayBgSciam{--tw-bg-opacity:1;background-color:rgb(249 250 254/var(--tw-bg-opacity,1))}.bg-navysciam{--tw-bg-opacity:1;background-color:rgb(56 74 114/var(--tw-bg-opacity,1))}.bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellowsciam{--tw-bg-opacity:1;background-color:rgb(255 236 63/var(--tw-bg-opacity,1))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity,1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-navysciamdark{--tw-gradient-from:#2e3a56 var(--tw-gradient-from-position);--tw-gradient-to:rgba(46,58,86,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-navysciam{--tw-gradient-to:rgba(56,74,114,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#384a72 var(--tw-gradient-via-position),var(--tw-gradient-to)}.to-navysciamlight{--tw-gradient-to:#505f8c var(--tw-gradient-to-position)}.bg-contain{background-size:contain}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.object-cover{-o-object-fit:cover;object-fit:cover}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-12{padding-left:50px;padding-right:50px}.px-14{padding-left:3.5rem;padding-right:3.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-20{padding-left:5rem;padding-right:5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-bottom:0;padding-top:0}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-10{padding-bottom:2.5rem;padding-top:2.5rem}.py-12{padding-bottom:50px;padding-top:50px}.py-14{padding-bottom:3.5rem;padding-top:3.5rem}.py-16{padding-bottom:4rem;padding-top:4rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-0{padding-bottom:0}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-\[33\.33\%\]{padding-bottom:33.33%}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.pr-10{padding-right:2.5rem}.pt-0{padding-top:0}.pt-10{padding-top:2.5rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-sans{font-family:Noyh Geometric,open-sans,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-extralight{font-weight:200}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.text-\[\#384a72\]{--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-greysciam{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-lightbluesciam{--tw-text-opacity:1;color:rgb(154 188 195/var(--tw-text-opacity,1))}.text-navysciam{--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.text-navysciamlight{--tw-text-opacity:1;color:rgb(80 95 140/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.no-underline{text-decoration-line:none}.decoration-greysciam{text-decoration-color:#9ca3af}.opacity-50{opacity:.5}.shadow-custom-bottom-shadow{--tw-shadow:0 10px 6px -9px #d3d3d3;--tw-shadow-colored:0 10px 6px -9px var(--tw-shadow-color)}.shadow-custom-bottom-shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@font-face{font-family:Noyh Geometric;font-style:normal;font-weight:400;src:url(/font/noyhgeometric-regular.otf) format("opentype"),url(/font/noyhgeometric-regular.woff) format("woff")}@font-face{font-family:Noyh Geometric;font-style:normal;font-weight:700;src:url(/font/noyhgeometric-bold.otf) format("opentype"),url(/font/noyhgeometric-bold.woff) format("woff")}@font-face{font-family:Noyh Geometric;font-style:italic;font-weight:400;src:url(/font/noyhgeometric-italic.otf) format("opentype"),url(/font/noyhgeometric-italic.woff) format("woff")}html{font-size:90%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;scroll-behavior:smooth}body:not(.font-asciidoc){font-family:Noyh Geometric,open-sans,sans-serif}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.animation-fade-in{animation:fadeIn 3s ease-in-out infinite alternate}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.fadeInUp1{animation:fadeInUp 1s ease-out forwards}.fadeInUp2{animation:fadeInUp 1.5s ease-out .5s forwards}@keyframes pulse{0%{height:50px;width:50px}to{height:60px;width:60px}}.cursor{animation:pulse .5s cubic-bezier(.51,0,.4,.5) infinite alternate}.cursor.active{animation:bounce .5s ease}@keyframes bounce{to{opacity:0;transform:translate(-50%,-50%) scale(2)}0%{opacity:1;transform:translate(-50%,-50%) scale(1)}}.centered{text-align:center}.content-box{border:2px inset gray;border-radius:2px;box-shadow:0 0 6px #b3b3b3;padding:.5em}#servers{padding-top:20px}.thumbnail{height:200px}.maintitle{margin:15px}.scrollTop{bottom:50px;display:none;font-size:40px;height:40px;opacity:.3;position:fixed;right:100px;width:40px}.first-in-row{margin-left:0!important}.alert-danger{background-color:#d47500;border-color:#c54c00;color:#fff}.alert-success{background-color:#819e37;border-color:#818b30;color:#fff}.ribbon{border:0;position:absolute;right:0;top:0;z-index:1031}img.left{float:left;margin:0 15px 10px 0}img.right{float:right;margin:0 0 10px 15px}ul.twitter-list li{border-bottom:1px solid #e5e5e5;margin-bottom:6px;padding-bottom:6px}ul.twitter-list li:last-child{border-bottom:0;margin-bottom:0;padding-bottom:0}ul.twitter-list li.nav-header{border-bottom:0;margin-top:0}.sponsors [class*=span]{margin-top:50px;text-align:center}.imageblock{margin-bottom:.25em}.doc .listingblock>.content{position:relative}.doc .listingblock code[data-lang]:before{content:none}.doc .source-toolbox{color:grey;display:flex;font-size:.85em;position:absolute;right:.5rem;top:.25rem;visibility:hidden;white-space:nowrap}.doc .listingblock:hover .source-toolbox{visibility:visible}.doc .source-toolbox .source-lang{font-family:Droid Sans Mono,DejaVu Sans Mono,monospace;letter-spacing:.075em;text-transform:uppercase}.doc .source-toolbox>:not(:last-child):after{content:"|";letter-spacing:0;padding:0 1ch}.doc .source-toolbox .copy-button{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:flex;flex-direction:column;font-family:inherit;font-size:inherit;height:1em;line-height:inherit;outline:none;padding:0;width:1em}.doc .source-toolbox .copy-icon{filter:invert(50.2%);flex:none;height:inherit;margin-top:.05em;width:inherit}.doc .source-toolbox .copy-toast{background:rgba(0,0,0,.8);border-radius:.25em;color:#fff;cursor:auto;display:inline-flex;flex:none;justify-content:center;margin-top:1em;opacity:0;padding:.5em;position:relative;transition:opacity .5s ease .75s}.doc .source-toolbox .copy-toast:after{border:.55em solid transparent;border-left-color:rgba(0,0,0,.8);content:"";height:1em;position:absolute;top:0;transform:rotate(-90deg) translateX(50%) translateY(50%);transform-origin:left;width:1em}.doc .source-toolbox .copy-button.clicked .copy-toast{opacity:1;transition:none}.blur-effect{filter:blur(20px)}@media (min-width:768px){.swiper-slide{width:33.333333%}}.pagination-btn{border-radius:.5rem;font-family:Noyh Geometric,open-sans,sans-serif;font-size:.75rem;font-weight:500;height:2.5rem;line-height:1rem;max-height:40px;max-width:40px;position:relative;text-align:center;text-transform:uppercase;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:2.5rem}@media (min-width:1128px){.lg\:prose-lg{font-size:1.125rem;line-height:1.7777778}.lg\:prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.lg\:prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.lg\:prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}.lg\:prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.lg\:prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.lg\:prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.lg\:prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.lg\:prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}.lg\:prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.lg\:prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.lg\:prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.lg\:prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}.lg\:prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.lg\:prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.lg\:prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.lg\:prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.lg\:prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.lg\:prose-lg :where(.lg\:prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.lg\:prose-lg :where(.lg\:prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.lg\:prose-lg :where(.lg\:prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.lg\:prose-lg :where(.lg\:prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.lg\:prose-lg :where(.lg\:prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.lg\:prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.lg\:prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.lg\:prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.lg\:prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.lg\:prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.lg\:prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.lg\:prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.lg\:prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}.lg\:prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.lg\:prose-lg :where(.lg\:prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(.lg\:prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}.hover\:scale-104:hover{--tw-scale-x:1.04;--tw-scale-y:1.04}.hover\:scale-104:hover,.hover\:scale-104\.5:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-104\.5:hover{--tw-scale-x:1.045;--tw-scale-y:1.045}.hover\:border-transparent:hover{border-color:transparent}.hover\:border-yellowsciam:hover{--tw-border-opacity:1;border-color:rgb(255 236 63/var(--tw-border-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:bg-gray-900\/10:hover{background-color:rgba(17,24,39,.1)}.hover\:bg-greysciam:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.hover\:bg-navysciam:hover{--tw-bg-opacity:1;background-color:rgb(56 74 114/var(--tw-bg-opacity,1))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity,1))}.hover\:font-black:hover{font-weight:900}.hover\:font-extrabold:hover{font-weight:800}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-greysciam:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.hover\:text-navysciam:hover{--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:text-yellowsciam:hover{--tw-text-opacity:1;color:rgb(255 236 63/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-white:hover{text-decoration-color:#fff}.hover\:decoration-yellowsciam:hover{text-decoration-color:#ffec3f}.hover\:underline-offset-2:hover{text-underline-offset:2px}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}.active\:bg-gray-900\/20:active{background-color:rgba(17,24,39,.2)}.active\:bg-navysciam:active{--tw-bg-opacity:1;background-color:rgb(56 74 114/var(--tw-bg-opacity,1))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:shadow-none:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.prose-pre\:font-sans :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-li\:font-sans :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-li\:text-lg :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}.prose-li\:text-navysciam :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.prose-table\:font-sans :is(:where(table):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-table\:text-lg :is(:where(table):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}.prose-thead\:font-sans :is(:where(thead):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-tr\:text-lg :is(:where(tr):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}.prose-td\:p-2 :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){padding:.5rem}.prose-td\:pl-2 :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){padding-left:.5rem}.prose-td\:pr-2 :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){padding-right:.5rem}.prose-td\:font-sans :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-td\:text-lg :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}@media (min-width:640px){.sm\:col-span-3{grid-column:span 3/span 3}.sm\:mx-28{margin-left:7rem;margin-right:7rem}.sm\:mt-1{margin-top:.25rem}.sm\:w-\[200px\]{width:200px}.sm\:w-auto{width:auto}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:gap-6{gap:1.5rem}.sm\:gap-8{gap:2rem}.sm\:px-28{padding-left:7rem;padding-right:7rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3{padding-bottom:.75rem;padding-top:.75rem}.sm\:pb-5{padding-bottom:1.25rem}}@media (min-width:1150px){.nav\:flex{display:flex}.nav\:hidden{display:none}}@media (min-width:820px) and (max-width:1024px){.tablet\:col-span-2{grid-column:span 2/span 2}.tablet\:col-span-4{grid-column:span 4/span 4}.tablet\:block{display:block}.tablet\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:820px){.md\:order-1{order:1}.md\:order-2{order:2}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-9{grid-column:span 9/span 9}.md\:mb-0{margin-bottom:0}.md\:mb-20{margin-bottom:5rem}.md\:mb-28{margin-bottom:7rem}.md\:ml-4{margin-left:1rem}.md\:mr-4{margin-right:1rem}.md\:mr-5{margin-right:1.25rem}.md\:mt-0{margin-top:0}.md\:block{display:block}.md\:inline{display:inline}.md\:hidden{display:none}.md\:min-h-\[620px\]{min-height:620px}.md\:w-56{width:14rem}.md\:w-auto{width:auto}.md\:flex-grow-0{flex-grow:0}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-col{flex-direction:column}.md\:justify-start{justify-content:flex-start}.md\:justify-end{justify-content:flex-end}.md\:gap-4{gap:1rem}.md\:px-28{padding-left:7rem;padding-right:7rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-10{padding-bottom:2.5rem;padding-top:2.5rem}.md\:py-14{padding-bottom:3.5rem;padding-top:3.5rem}}@media (min-width:1128px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:mx-\[-2rem\]{margin-left:-2rem;margin-right:-2rem}.lg\:ml-2{margin-left:.5rem}.lg\:ml-6{margin-left:1.5rem}.lg\:mr-6{margin-right:1.5rem}.lg\:min-h-\[400px\]{min-height:400px}.lg\:flex-grow{flex-grow:1}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:justify-start{justify-content:flex-start}.lg\:px-28{padding-left:7rem;padding-right:7rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}} \ No newline at end of file +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:Noyh Geometric,open-sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}#toc{border-bottom:none;padding-bottom:.25rem}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:820px){.container{max-width:820px}}@media (min-width:1128px){.container{max-width:1128px}}@media (min-width:1150px){.container{max-width:1150px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:2000px}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25rem!important;margin-bottom:.25rem!important;margin-top:.25rem!important}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#2563eb;font-weight:500;text-decoration:underline}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#eab308}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25rem!important;font-weight:800;line-height:2.25rem!important;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.875rem!important;font-weight:700;line-height:2.25rem!important;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5rem!important;font-weight:600;line-height:2rem!important;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25rem!important;font-weight:600;line-height:1.75rem!important;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin:2em auto}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem;font-weight:400!important}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;vertical-align:middle;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start;vertical-align:middle}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose :where(h1,h2,h3,h4,h5,h6):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric;margin-bottom:24px!important;margin-top:24px!important}.prose :where(#preamble>.sectionbody>.paragraph:first-of-type>p):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-size:1.25rem!important;font-weight:600!important;line-height:1.7rem!important;margin-bottom:1.2rem!important}.prose :where(h2 a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:2.25rem!important;font-weight:700!important;line-height:2.5rem!important;text-decoration:none!important}.prose :where(h2 a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h3 a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:1.875rem!important;font-weight:600!important;line-height:2.25rem!important;text-decoration:none!important}.prose :where(h3 a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h4 a):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:1.5rem!important;font-weight:600!important;line-height:2rem!important;text-decoration:none!important}.prose :where(h4 a):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(.sect1):not(:where([class~=not-prose],[class~=not-prose] *)){border-top:0!important;padding-bottom:0!important}.prose :where(sect2 sect3 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sect2 sect3 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sect2 sect3 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sect2 sect3 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sect2 sect3 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(sect2 sect3 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sectionbody sect2 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.25rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sectionbody sect2 h2 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sectionbody sect2 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1.125rem!important;font-weight:400!important;line-height:1.75rem!important;text-decoration:none!important}.prose :where(sectionbody sect2 h3 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(sectionbody sect2 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Droid Sans Mono,monospace!important;font-size:1rem!important;font-weight:400!important;line-height:1.5rem!important;text-decoration:none!important}.prose :where(sectionbody sect2 h4 a code):not(:where([class~=not-prose],[class~=not-prose] *)):hover{color:#9abcc3!important}.prose :where(.paragraph>p code):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important;font-size:.9rem!important;font-weight:400!important}.prose :where(p code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.prose :where(p code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(p code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(h2 code,h3 code,h4 code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(h2 code,h3 code,h4 code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table td.content code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(table td.content code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(.title code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(.title code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(.ulist p code):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important;font-size:.9rem!important;font-weight:400!important;line-height:1.75rem!important}.prose :where(.ulist li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.5rem!important}.prose :where(.listingblock):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:400!important;line-height:1.75rem!important;margin-bottom:1.5rem!important;margin-top:1.5rem!important}.prose :where(.listingblock>.content>pre:not(.highlight)):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-size:.9rem!important}.prose :where(.literalblock pre,.listingblock>.content>pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono!important;font-size:1rem!important}.prose :where(.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title):not(:where([class~=not-prose],[class~=not-prose] *)){color:#384a72!important;font-family:Noyh Geometric!important;font-size:1.125rem!important}.prose :where(admonitionblock note td.content>.title code):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important;font-size:.9rem!important}.prose :where(.listingblock>.title code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.prose :where(table>tbody>tr>td code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.prose :where(table>thead>tr>th):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:center!important}.prose :where(table>tbody>tr>td p):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:center}.prose :where(.admonitionblock td.content p):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(.content>pre):not(:where([class~=not-prose],[class~=not-prose] *)){border:1px solid #e5e7eb;display:block;margin-bottom:1rem!important;margin-top:1rem!important;overflow-x:auto;white-space:pre;width:100%}.prose :where(.content>pre span):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:Droid Sans Mono,monospace!important}.prose :where(.highlight>pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:#f5f5f7!important}.prose :where(td code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(td code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(td.content):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.125rem!important}.prose :where(td.content code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9rem!important}.sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border-width:0;white-space:nowrap}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{bottom:0;top:0}.bottom-5{bottom:1.25rem}.left-1\/2{left:50%}.right-0{right:0}.right-5{right:1.25rem}.top-0{top:0}.top-1\/2{top:50%}.top-10{top:2.5rem}.z-50{z-index:50}.order-1{order:1}.order-2{order:2}.col-span-1{grid-column:span 1/span 1}.col-span-12{grid-column:span 12/span 12}.float-left{float:left}.m-1{margin:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-\[-1rem\]{margin-left:-1rem;margin-right:-1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-12{margin-bottom:50px;margin-top:50px}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-20{margin-bottom:5rem;margin-top:5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-4{margin-bottom:1rem;margin-top:1rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-auto{margin-bottom:auto}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.ms-auto{margin-inline-start:auto}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-3{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-3{-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-2{height:.5rem}.h-20{height:5rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-72{height:18rem}.h-auto{height:auto}.h-full{height:100%}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.min-h-\[30vh\]{min-height:30vh}.min-h-\[500px\]{min-height:500px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-2{width:.5rem}.w-20{width:5rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-\[50\%\]{width:50%}.w-full{width:100%}.min-w-\[100px\]{min-width:100px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-full{border-radius:50px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.rounded-r-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0\.5{border-width:.5px}.border-lightbluesciam{--tw-border-opacity:1;border-color:rgb(154 188 195/var(--tw-border-opacity,1))}.border-navysciam{--tw-border-opacity:1;border-color:rgb(56 74 114/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-grayBg{--tw-bg-opacity:1;background-color:rgb(242 241 237/var(--tw-bg-opacity,1))}.bg-grayBgSciam{--tw-bg-opacity:1;background-color:rgb(249 250 254/var(--tw-bg-opacity,1))}.bg-navysciam{--tw-bg-opacity:1;background-color:rgb(56 74 114/var(--tw-bg-opacity,1))}.bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellowsciam{--tw-bg-opacity:1;background-color:rgb(255 236 63/var(--tw-bg-opacity,1))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity,1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-navysciamdark{--tw-gradient-from:#2e3a56 var(--tw-gradient-from-position);--tw-gradient-to:rgba(46,58,86,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-navysciam{--tw-gradient-to:rgba(56,74,114,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#384a72 var(--tw-gradient-via-position),var(--tw-gradient-to)}.to-navysciamlight{--tw-gradient-to:#505f8c var(--tw-gradient-to-position)}.bg-contain{background-size:contain}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.object-cover{-o-object-fit:cover;object-fit:cover}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-12{padding-left:50px;padding-right:50px}.px-14{padding-left:3.5rem;padding-right:3.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-20{padding-left:5rem;padding-right:5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-bottom:0;padding-top:0}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-10{padding-bottom:2.5rem;padding-top:2.5rem}.py-12{padding-bottom:50px;padding-top:50px}.py-14{padding-bottom:3.5rem;padding-top:3.5rem}.py-16{padding-bottom:4rem;padding-top:4rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-0{padding-bottom:0}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-\[33\.33\%\]{padding-bottom:33.33%}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.pr-10{padding-right:2.5rem}.pt-0{padding-top:0}.pt-10{padding-top:2.5rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-sans{font-family:Noyh Geometric,open-sans,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-extralight{font-weight:200}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.text-\[\#384a72\]{--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-greysciam{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-lightbluesciam{--tw-text-opacity:1;color:rgb(154 188 195/var(--tw-text-opacity,1))}.text-navysciam{--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.text-navysciamlight{--tw-text-opacity:1;color:rgb(80 95 140/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.no-underline{text-decoration-line:none}.decoration-greysciam{text-decoration-color:#9ca3af}.opacity-50{opacity:.5}.shadow-custom-bottom-shadow{--tw-shadow:0 10px 6px -9px lightgrey;--tw-shadow-colored:0 10px 6px -9px var(--tw-shadow-color)}.shadow-custom-bottom-shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@font-face{font-family:Noyh Geometric;font-style:normal;font-weight:400;src:url(/font/noyhgeometric-regular.otf) format("opentype"),url(/font/noyhgeometric-regular.woff) format("woff")}@font-face{font-family:Noyh Geometric;font-style:normal;font-weight:700;src:url(/font/noyhgeometric-bold.otf) format("opentype"),url(/font/noyhgeometric-bold.woff) format("woff")}@font-face{font-family:Noyh Geometric;font-style:italic;font-weight:400;src:url(/font/noyhgeometric-italic.otf) format("opentype"),url(/font/noyhgeometric-italic.woff) format("woff")}html{font-size:90%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;scroll-behavior:smooth}body:not(.font-asciidoc){font-family:Noyh Geometric,open-sans,sans-serif}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.animation-fade-in{animation:fadeIn 3s ease-in-out infinite alternate}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.fadeInUp1{animation:fadeInUp 1s ease-out forwards}.fadeInUp2{animation:fadeInUp 1.5s ease-out .5s forwards}@keyframes pulse{0%{height:50px;width:50px}to{height:60px;width:60px}}.cursor{animation:pulse .5s cubic-bezier(.51,0,.4,.5) infinite alternate}.cursor.active{animation:bounce .5s ease}@keyframes bounce{to{opacity:0;transform:translate(-50%,-50%) scale(2)}0%{opacity:1;transform:translate(-50%,-50%) scale(1)}}.centered{text-align:center}.content-box{border:2px inset gray;border-radius:2px;box-shadow:0 0 6px #b3b3b3;padding:.5em}#servers{padding-top:20px}.thumbnail{height:200px}.maintitle{margin:15px}.scrollTop{bottom:50px;display:none;font-size:40px;height:40px;opacity:.3;position:fixed;right:100px;width:40px}.first-in-row{margin-left:0!important}.alert-danger{background-color:#d47500;border-color:#c54c00;color:#fff}.alert-success{background-color:#819e37;border-color:#818b30;color:#fff}.ribbon{border:0;position:absolute;right:0;top:0;z-index:1031}img.left{float:left;margin:0 15px 10px 0}img.right{float:right;margin:0 0 10px 15px}ul.twitter-list li{border-bottom:1px solid #e5e5e5;margin-bottom:6px;padding-bottom:6px}ul.twitter-list li:last-child{border-bottom:0;margin-bottom:0;padding-bottom:0}ul.twitter-list li.nav-header{border-bottom:0;margin-top:0}.sponsors [class*=span]{margin-top:50px;text-align:center}.imageblock{margin-bottom:.25em}.doc .listingblock>.content{position:relative}.doc .listingblock code[data-lang]:before{content:none}.doc .source-toolbox{color:gray;display:flex;font-size:.85em;position:absolute;right:.5rem;top:.25rem;visibility:hidden;white-space:nowrap}.doc .listingblock:hover .source-toolbox{visibility:visible}.doc .source-toolbox .source-lang{font-family:Droid Sans Mono,DejaVu Sans Mono,monospace;letter-spacing:.075em;text-transform:uppercase}.doc .source-toolbox>:not(:last-child):after{content:"|";letter-spacing:0;padding:0 1ch}.doc .source-toolbox .copy-button{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:flex;flex-direction:column;font-family:inherit;font-size:inherit;height:1em;line-height:inherit;outline:none;padding:0;width:1em}.doc .source-toolbox .copy-icon{filter:invert(50.2%);flex:none;height:inherit;margin-top:.05em;width:inherit}.doc .source-toolbox .copy-toast{background:rgba(0,0,0,.8);border-radius:.25em;color:#fff;cursor:auto;display:inline-flex;flex:none;justify-content:center;margin-top:1em;opacity:0;padding:.5em;position:relative;transition:opacity .5s ease .75s}.doc .source-toolbox .copy-toast:after{border:.55em solid transparent;border-left-color:rgba(0,0,0,.8);content:"";height:1em;position:absolute;top:0;transform:rotate(-90deg) translateX(50%) translateY(50%);transform-origin:left;width:1em}.doc .source-toolbox .copy-button.clicked .copy-toast{opacity:1;transition:none}.blur-effect{filter:blur(20px)}@media (min-width:768px){.swiper-slide{width:33.333333%}}.pagination-btn{border-radius:.5rem;font-family:Noyh Geometric,open-sans,sans-serif;font-size:.75rem;font-weight:500;height:2.5rem;line-height:1rem;max-height:40px;max-width:40px;position:relative;text-align:center;text-transform:uppercase;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:2.5rem}@media (min-width:1128px){.lg\:prose-lg{font-size:1.125rem;line-height:1.7777778}.lg\:prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.lg\:prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.lg\:prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}.lg\:prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.lg\:prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.lg\:prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.lg\:prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.lg\:prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}.lg\:prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.lg\:prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.lg\:prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.lg\:prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}.lg\:prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.lg\:prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.lg\:prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.lg\:prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.lg\:prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.lg\:prose-lg :where(.lg\:prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.lg\:prose-lg :where(.lg\:prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.lg\:prose-lg :where(.lg\:prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.lg\:prose-lg :where(.lg\:prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.lg\:prose-lg :where(.lg\:prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.lg\:prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.lg\:prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.lg\:prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.lg\:prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.lg\:prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.lg\:prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.lg\:prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.lg\:prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}.lg\:prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.lg\:prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.lg\:prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.lg\:prose-lg :where(.lg\:prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-lg :where(.lg\:prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}.hover\:scale-104:hover{--tw-scale-x:1.04;--tw-scale-y:1.04}.hover\:scale-104:hover,.hover\:scale-104\.5:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-104\.5:hover{--tw-scale-x:1.045;--tw-scale-y:1.045}.hover\:border-transparent:hover{border-color:transparent}.hover\:border-yellowsciam:hover{--tw-border-opacity:1;border-color:rgb(255 236 63/var(--tw-border-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:bg-gray-900\/10:hover{background-color:rgba(17,24,39,.1)}.hover\:bg-greysciam:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.hover\:bg-navysciam:hover{--tw-bg-opacity:1;background-color:rgb(56 74 114/var(--tw-bg-opacity,1))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity,1))}.hover\:font-black:hover{font-weight:900}.hover\:font-extrabold:hover{font-weight:800}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-greysciam:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.hover\:text-navysciam:hover{--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:text-yellowsciam:hover{--tw-text-opacity:1;color:rgb(255 236 63/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-white:hover{text-decoration-color:#fff}.hover\:decoration-yellowsciam:hover{text-decoration-color:#ffec3f}.hover\:underline-offset-2:hover{text-underline-offset:2px}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}.active\:bg-gray-900\/20:active{background-color:rgba(17,24,39,.2)}.active\:bg-navysciam:active{--tw-bg-opacity:1;background-color:rgb(56 74 114/var(--tw-bg-opacity,1))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:shadow-none:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.prose-pre\:font-sans :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-li\:font-sans :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-li\:text-lg :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}.prose-li\:text-navysciam :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(56 74 114/var(--tw-text-opacity,1))}.prose-table\:font-sans :is(:where(table):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-table\:text-lg :is(:where(table):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}.prose-thead\:font-sans :is(:where(thead):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-tr\:text-lg :is(:where(tr):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}.prose-td\:p-2 :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){padding:.5rem}.prose-td\:pl-2 :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){padding-left:.5rem}.prose-td\:pr-2 :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){padding-right:.5rem}.prose-td\:font-sans :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Noyh Geometric,open-sans,sans-serif}.prose-td\:text-lg :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.125rem;line-height:1.75rem}@media (min-width:640px){.sm\:col-span-3{grid-column:span 3/span 3}.sm\:mx-28{margin-left:7rem;margin-right:7rem}.sm\:mt-1{margin-top:.25rem}.sm\:w-\[200px\]{width:200px}.sm\:w-auto{width:auto}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:gap-6{gap:1.5rem}.sm\:gap-8{gap:2rem}.sm\:px-28{padding-left:7rem;padding-right:7rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3{padding-bottom:.75rem;padding-top:.75rem}.sm\:pb-5{padding-bottom:1.25rem}}@media (min-width:1150px){.nav\:flex{display:flex}.nav\:hidden{display:none}}@media (min-width:820px) and (max-width:1024px){.tablet\:col-span-2{grid-column:span 2/span 2}.tablet\:col-span-4{grid-column:span 4/span 4}.tablet\:block{display:block}.tablet\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:820px){.md\:order-1{order:1}.md\:order-2{order:2}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-9{grid-column:span 9/span 9}.md\:mb-0{margin-bottom:0}.md\:mb-20{margin-bottom:5rem}.md\:mb-28{margin-bottom:7rem}.md\:ml-4{margin-left:1rem}.md\:mr-4{margin-right:1rem}.md\:mr-5{margin-right:1.25rem}.md\:mt-0{margin-top:0}.md\:block{display:block}.md\:inline{display:inline}.md\:hidden{display:none}.md\:min-h-\[620px\]{min-height:620px}.md\:w-56{width:14rem}.md\:w-auto{width:auto}.md\:flex-grow-0{flex-grow:0}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-col{flex-direction:column}.md\:justify-start{justify-content:flex-start}.md\:justify-end{justify-content:flex-end}.md\:gap-4{gap:1rem}.md\:px-28{padding-left:7rem;padding-right:7rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-10{padding-bottom:2.5rem;padding-top:2.5rem}.md\:py-14{padding-bottom:3.5rem;padding-top:3.5rem}}@media (min-width:1128px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:mx-\[-2rem\]{margin-left:-2rem;margin-right:-2rem}.lg\:ml-2{margin-left:.5rem}.lg\:ml-6{margin-left:1.5rem}.lg\:mr-6{margin-right:1.5rem}.lg\:min-h-\[400px\]{min-height:400px}.lg\:flex-grow{flex-grow:1}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:justify-start{justify-content:flex-start}.lg\:px-28{padding-left:7rem;padding-right:7rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}} \ No newline at end of file diff --git a/images/vignettes/2026/vidocq.png b/images/vignettes/2026/vidocq.png new file mode 100644 index 00000000..d5726709 Binary files /dev/null and b/images/vignettes/2026/vidocq.png differ diff --git a/typography-preset.js b/typography-preset.js index c7fe5ba0..8909f992 100644 --- a/typography-preset.js +++ b/typography-preset.js @@ -338,6 +338,9 @@ module.exports = { 'table > tbody > tr > td p': { textAlign: 'center', }, + '.admonitionblock td.content p': { + textAlign: 'start', + }, '.content> pre': { width: '100%', @@ -354,7 +357,7 @@ module.exports = { }, '.highlight> pre': { - backgrounColor: `${theme('colors.lightgrey')} !important`, + backgroundColor: `${theme('colors.lightgrey')} !important`, }, 'td code::before': {