<!DOCTYPE html>
<html lang="en" class="scroll-pt-[110px] xl:scroll-pt-[130px] antialiased scroll-smooth">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="csrf-token" content="3T960toWQLXZ8rmc0Lx6Ns46PGCCaxyJco3Y8pEJ">

    <meta property="og:title" content="Onramp to Laravel">
    <meta property="og:type" content="website">
    <meta property="og:url" content="https://onramp.dev/en">
    <meta property="og:image" content="https://onramp.dev/images/opengraph-logo-dark.png">

    <meta property="twitter:card" content="summary_large_image">
    <meta property="twitter:url" content="https://onramp.dev/en">
    <meta property="twitter:title" content="Onramp to Laravel">
    <meta property="twitter:description"
          content="Learn everything you need to get hired writing Laravel, quickly and easily.">
    <meta property="twitter:image" content="https://onramp.dev/images/opengraph-logo-dark.png">

    <link href="https://fonts.googleapis.com/css?family=Work+Sans:400,600,700&display=swap" rel="stylesheet">

    <link rel="preload" as="style" href="https://onramp.dev/build/assets/app-_TPaOjvP.css" /><link rel="stylesheet" href="https://onramp.dev/build/assets/app-_TPaOjvP.css" />
    <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">

    
    <script>
        window.locale = "en";
        window.fallback_locale = "en";
        window.locales = {"en":"English","es":"Espa\u00f1ol","pt_pt":"Portugu\u00eas","sv":"Svenska","de":"Deutsch","da":"Dansk","cs":"\u010ce\u0161tina","id":"Bahasa","fr":"French","pl":"Polski"};
        window.language = 'English';

        function chooseLanguage(value) {
            try {
                if (window.localStorage) {
                    localStorage.setItem('onramp_locale', value);
                }
            } catch (e) {
            }
            let segments = window.location.pathname.split("/");
            if (segments.length > 1) {
                segments[1] = value;
            }
            window.location = `${window.location.origin}${segments.join("/")}`;
        }

        const isInViewport = (element) => {
            const rect = element.getBoundingClientRect();
            const offset = (rect.bottom - rect.top) / 2;

            return (
                (rect.top === 0 || Math.abs(rect.top + offset) <= rect.bottom) &&
                rect.left >= 0 &&
                rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
                rect.right <= (window.innerWidth || document.documentElement.clientWidth)
            );
        }

        window.addEventListener("scroll", () => {
            const heroBanner = window.document.querySelector('#top');
            const topButton = window.document.querySelector('#top-button');

            if (heroBanner) {
                isInViewport(heroBanner)
                    ? topButton.classList.add("invisible")
                    : topButton.classList.remove("invisible");
            }
        });
    </script>

    <script>
    (function () {
        const EXCLUDED_PATHS = ['nova', 'nova-api', 'nova-vendor', '_debugbar'];

        const isValidLocale = (locale) => {
            return Boolean(window.locales?.[locale]);
        };

        const getStoredLocale = () => {
            try {
                return localStorage.getItem('onramp_locale');
            } catch {
                return null;
            }
        };

        const enforcePersistedLocale = () => {
            const storedLocale = getStoredLocale();
            if (!storedLocale || !isValidLocale(storedLocale)) return;

            const segments = window.location.pathname.split('/').filter(Boolean);
            const currentLocale = segments[0];

            if (EXCLUDED_PATHS.includes(currentLocale) || currentLocale === storedLocale) return;

            if (isValidLocale(currentLocale)) {
                segments[0] = storedLocale;
            } else {
                segments.unshift(storedLocale);
            }

            const targetUrl = `${window.location.origin}/${segments.join('/')}${window.location.search}${window.location.hash}`;
            if (targetUrl !== window.location.href) {
                window.location.replace(targetUrl);
            }
        };

        enforcePersistedLocale();
        window.addEventListener('popstate', enforcePersistedLocale);
    })();
</script>

            <script src="https://cdn.usefathom.com/script.js" data-site="HTCOORML" defer></script>
    
    <title>Onramp to Laravel</title>
</head>

<body class="bg-blue-black font-normal font-work-sans text-gray-black mt-16 min-w-xs">
<div class="mx-auto px-2 lg:container">
    <header class="fixed top-0 left-0 w-full z-[9999]">
        <section class="w-full pt-5 pb-10 border-t-4 bg-gradient-to-b from-blue-black via-blue-black to-transparent border-violet lg:border-t-8">
    <div class="container items-center hidden xl:flex">
    <a href="https://onramp.dev/en" class="ml-4">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 172 35" class="h-5 md:h-8">
    <g fill="#ffffff" fill-rule="evenodd">
        <path d="M35.021 18H32.09c0-5.105 3.912-9.339 8.98-10.033v-5.1C33.15 3.586 26.93 10.1 26.93 18H24c0-9.926 8.314-18 18.536-18H44v10.668h-1.464c-4.143 0-7.515 3.289-7.515 7.332"/>
        <path d="M17.5 10.888a6.618 6.618 0 00-6.612 6.611 6.62 6.62 0 006.612 6.613 6.621 6.621 0 006.613-6.613 6.62 6.62 0 00-6.613-6.611m0 16.122c-5.245 0-9.51-4.266-9.51-9.51 0-5.245 4.265-9.511 9.51-9.511 5.246 0 9.512 4.266 9.512 9.51 0 5.245-4.266 9.51-9.512 9.51m0 7.991C7.85 35 0 27.15 0 17.5S7.85 0 17.5 0c5.113 0 9.959 2.235 13.296 6.131l-2.203 1.886A14.589 14.589 0 0017.5 2.899C9.448 2.9 2.898 9.45 2.898 17.5c0 8.052 6.55 14.602 14.602 14.602s14.6-6.55 14.6-14.602H35C35 27.15 27.15 35 17.5 35"/>
        <path fill-rule="nonzero" d="M65.568 28.32c1.685 0 3.163-.33 4.432-.992a7.223 7.223 0 002.976-2.848c.715-1.237 1.072-2.73 1.072-4.48 0-1.75-.357-3.243-1.072-4.48A7.223 7.223 0 0070 12.672c-1.27-.661-2.747-.992-4.432-.992-1.664 0-3.13.33-4.4.992a7.223 7.223 0 00-2.976 2.848c-.715 1.237-1.072 2.73-1.072 4.48 0 1.75.357 3.243 1.072 4.48a7.223 7.223 0 002.976 2.848c1.27.661 2.736.992 4.4.992zm0-3.872c-.939 0-1.67-.352-2.192-1.056-.523-.704-.784-1.835-.784-3.392 0-1.579.261-2.715.784-3.408.523-.693 1.253-1.04 2.192-1.04.96 0 1.701.347 2.224 1.04.523.693.784 1.83.784 3.408 0 1.557-.261 2.688-.784 3.392-.523.704-1.264 1.056-2.224 1.056zM81.72 28v-8.48c0-1.344.283-2.293.848-2.848a2.799 2.799 0 012.032-.832c.661 0 1.205.213 1.632.64.427.427.64 1.195.64 2.304V28h5.44V17.344c0-1.856-.512-3.264-1.536-4.224-1.024-.96-2.357-1.44-4-1.44-1.28 0-2.39.299-3.328.896-.939.597-1.653 1.483-2.144 2.656L81.144 12H76.28v16h5.44zm19 0v-8.064c0-1.237.357-2.165 1.072-2.784.715-.619 1.563-.928 2.544-.928.47 0 .87.032 1.2.096.33.064.603.128.816.192l.544-4.48c-.17-.085-.4-.165-.688-.24a4.193 4.193 0 00-1.04-.112c-1.259 0-2.288.336-3.088 1.008-.8.672-1.392 1.595-1.776 2.768L100.08 12h-4.8v16h5.44zm11.736.32a8.12 8.12 0 003.088-.592c.97-.395 1.68-1.008 2.128-1.84.256.81.747 1.413 1.472 1.808s1.59.592 2.592.592c.917 0 1.696-.15 2.336-.448l.32-3.104c-.235.085-.544.128-.928.128-.747 0-1.12-.416-1.12-1.248V17.76c0-1.984-.645-3.493-1.936-4.528-1.29-1.035-3.11-1.552-5.456-1.552-2.325 0-4.128.459-5.408 1.376-1.28.917-2.07 2.144-2.368 3.68l4.608 1.088c.192-.896.539-1.52 1.04-1.872.501-.352 1.104-.528 1.808-.528s1.264.219 1.68.656c.416.437.624 1.03.624 1.776v.448l-5.536 1.152c-1.493.299-2.587.827-3.28 1.584-.693.757-1.04 1.712-1.04 2.864 0 1.43.485 2.523 1.456 3.28.97.757 2.277 1.136 3.92 1.136zm1.728-3.52c-.47 0-.875-.117-1.216-.352-.341-.235-.512-.587-.512-1.056 0-.49.155-.859.464-1.104.31-.245.784-.432 1.424-.56l2.592-.544v.896c0 .939-.277 1.627-.832 2.064a3.014 3.014 0 01-1.92.656zm16.952 3.2v-8.448c0-1.323.283-2.272.848-2.848.565-.576 1.221-.864 1.968-.864.64 0 1.163.203 1.568.608.405.405.608 1.12.608 2.144V28h5.44v-8.544c0-1.195.267-2.096.8-2.704a2.567 2.567 0 012.016-.912c.64 0 1.163.203 1.568.608.405.405.608 1.12.608 2.144V28H152V17.344c0-1.877-.517-3.29-1.552-4.24-1.035-.95-2.341-1.424-3.92-1.424a6.503 6.503 0 00-3.184.8c-.97.533-1.701 1.323-2.192 2.368-.427-1.045-1.083-1.835-1.968-2.368-.885-.533-1.915-.8-3.088-.8-1.216 0-2.288.288-3.216.864-.928.576-1.648 1.43-2.16 2.56L130.56 12h-4.864v16h5.44zm29.272 6.72v-9.472a5.472 5.472 0 001.856 2.224c.81.565 1.792.848 2.944.848 1.963 0 3.557-.736 4.784-2.208 1.227-1.472 1.84-3.53 1.84-6.176 0-2.603-.603-4.63-1.808-6.08-1.205-1.45-2.79-2.176-4.752-2.176-1.237 0-2.31.325-3.216.976-.907.65-1.584 1.51-2.032 2.576l-.16-3.232h-4.896v22.72h5.44zm2.944-10.4c-.939 0-1.664-.384-2.176-1.152-.512-.768-.768-1.824-.768-3.168 0-1.408.267-2.48.8-3.216.533-.736 1.259-1.104 2.176-1.104.939 0 1.67.347 2.192 1.04.523.693.784 1.787.784 3.28 0 1.493-.267 2.587-.8 3.28-.533.693-1.27 1.04-2.208 1.04z"/>
    </g>
</svg>
    </a>

    <div class="items-center justify-between flex-1 hidden pl-12 xl:flex">
        <div class="flex-1">
            <nav class="flex items-center">
                <a class="block mx-1 border-t border-silver xl:border-none text-body font-bold transition-colors py-4 xl:py-1 duration-300 ease-in-out text-mint hover:text-white hover:no-underline px-3
	"
    href="https://onramp.dev/en/modules">
    <span>Learn</span>
</a>

<a class="block mx-1 border-t border-silver xl:border-none text-body font-bold transition-colors py-4 xl:py-1 duration-300 ease-in-out text-mint hover:text-white hover:no-underline px-3
	"
    href="https://onramp.dev/en/glossary">
    <span>Glossary</span>
</a>

<a class="block mx-1 border-t border-silver xl:border-none text-body font-bold transition-colors py-4 xl:py-1 duration-300 ease-in-out text-mint hover:text-white hover:no-underline px-3
	"
    href="https://onramp.dev/en/tracks">
    <span>Tracks</span>
</a>
            </nav>
        </div>

        <div class="flex items-center justify-end flex-1">
            <div>
    <div x-data="{isOpen: false, language: window.language, languages: window.locales}" @click.away="isOpen = false" class="relative hidden text-left xl:block">
        <div>
            <button type="button" class="inline-flex items-center justify-center w-full h-12 text-base font-semibold text-white transition-colors duration-300 ease-in-out focus:outline-none focus:border-white hover:text-mint" @click="isOpen = !isOpen">
                <span x-text="language"></span>

                <svg class="w-3 h-auto ml-2 duration-300 ease-in-out stroke-current transition-rotate text-mint" :class="{
                'transform -scale-y-100': isOpen
            }" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 11">
                    <path d="M2 2l6 6 6-6" stroke-width="3" fill="none" fill-rule="evenodd" stroke-linecap="round" />
                </svg>
            </button>
        </div>

        <div x-show="isOpen" class="absolute right-0 z-50 w-32 mt-2 origin-top-right rounded-md shadow-lg"
            x-transition:enter="transition-all ease-in duration-200 origin-top"
            x-transition:enter-start="opacity-0 transform scale-y-0"
            x-transition:enter-end="opacity-100 transform scale-y-100"
            x-transition:leave="transition-all ease-out duration-200 origin-top"
            x-transition:leave-start="opacity-100 transform scale-y-100"
            x-transition:leave-end="opacity-0 transform scale-y-0"
        >
            <div class="overflow-hidden bg-white rounded-md shadow-xs">
                <template x-for="(lang, slug) in languages" :key="slug">
                    <a href="#" @click="chooseLanguage(slug)" x-text="lang" class="block px-4 py-3 text-sm font-medium leading-5 transition-colors duration-75 ease-in-out cursor-pointer hover:no-underline hover:bg-silver/50 focus:outline-none focus:bg-silver/50">
                    </a>
                </template>
            </div>
        </div>
    </div>

    <div x-data="{isOpen: false, language: window.language, languages: window.locales}" class="relative z-50 mb-6 xl:hidden">
        <button x-show="isOpen" x-on:click="isOpen = false" tabindex="-1" class="fixed inset-0 hidden w-full h-full cursor-default" aria-label="close language switcher"></button>

        <div class="px-6 py-3 xl:p-0">
            <label for="language-switcher" class="flex items-center -ml-2 text-white focus:outline-none ">
                <button x-text="language" x-on:click="isOpen = !isOpen" id="alpine-language-switcher" tabindex="1" class="mr-3 font-bold text-body focus:outline-none focus:border-white">
                </button>

                <svg class="w-3 h-auto transition duration-300 ease-in-out stroke-current text-mint" :class="{ 'transform -scale-y-100': isOpen }" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 11">
                    <path d="M2 2l6 6 6-6" stroke-width="3" fill="none" fill-rule="evenodd" stroke-linecap="round" />
                </svg>
            </label>
        </div>

        <div x-show="isOpen" x-on:click.away="isOpen = false" class="overflow-hidden bg-steel xl:absolute xl:mt-12 xl:shadow-xl xl:left-0 xl:top-0"
            x-transition:enter="transition-all ease-in duration-200 origin-top"
            x-transition:enter-start="opacity-0 transform scale-y-0"
            x-transition:enter-end="opacity-100 transform scale-y-100"
            x-transition:leave="transition-all ease-out duration-200 origin-top"
            x-transition:leave-start="opacity-100 transform scale-y-100"
            x-transition:leave-end="opacity-0 transform scale-y-0"
        >
            <template x-for="(lang, slug) in languages" :key="slug">
                <button x-text="lang" x-on:click="chooseLanguage(slug)" class="block w-full px-6 py-2 text-base font-normal text-left text-white transition-colors duration-200 ease-in-out focus:outline-none hover:bg-purple">
                </button>
            </template>
        </div>
    </div>
</div>

            <div class="flex items-center ml-12">
                                    <div class="flex w-full">
    <a class="flex-1 inline-block w-auto px-4 py-1 mr-4 text-lg font-semibold text-center transition duration-200 ease-in-out bg-transparent border-2 hover:no-underline rounded-3xl text-mint border-mint hover:bg-mint hover:text-blue-black whitespace-nowrap"
        href="https://onramp.dev/en/login">
        <span>Get Started</span>
    </a>
</div>
                            </div>
        </div>
    </div>
</div>
    <div x-data="{isMenuOpen: false, toggle() { this.isMenuOpen = !this.isMenuOpen}}"
    class="relative px-4 xl:hidden"
    x-cloak
    v-pre>
    <div class="flex items-center justify-between w-full">
        <a href="https://onramp.dev/en">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 172 35" class="h-5 md:h-8">
    <g fill="#ffffff" fill-rule="evenodd">
        <path d="M35.021 18H32.09c0-5.105 3.912-9.339 8.98-10.033v-5.1C33.15 3.586 26.93 10.1 26.93 18H24c0-9.926 8.314-18 18.536-18H44v10.668h-1.464c-4.143 0-7.515 3.289-7.515 7.332"/>
        <path d="M17.5 10.888a6.618 6.618 0 00-6.612 6.611 6.62 6.62 0 006.612 6.613 6.621 6.621 0 006.613-6.613 6.62 6.62 0 00-6.613-6.611m0 16.122c-5.245 0-9.51-4.266-9.51-9.51 0-5.245 4.265-9.511 9.51-9.511 5.246 0 9.512 4.266 9.512 9.51 0 5.245-4.266 9.51-9.512 9.51m0 7.991C7.85 35 0 27.15 0 17.5S7.85 0 17.5 0c5.113 0 9.959 2.235 13.296 6.131l-2.203 1.886A14.589 14.589 0 0017.5 2.899C9.448 2.9 2.898 9.45 2.898 17.5c0 8.052 6.55 14.602 14.602 14.602s14.6-6.55 14.6-14.602H35C35 27.15 27.15 35 17.5 35"/>
        <path fill-rule="nonzero" d="M65.568 28.32c1.685 0 3.163-.33 4.432-.992a7.223 7.223 0 002.976-2.848c.715-1.237 1.072-2.73 1.072-4.48 0-1.75-.357-3.243-1.072-4.48A7.223 7.223 0 0070 12.672c-1.27-.661-2.747-.992-4.432-.992-1.664 0-3.13.33-4.4.992a7.223 7.223 0 00-2.976 2.848c-.715 1.237-1.072 2.73-1.072 4.48 0 1.75.357 3.243 1.072 4.48a7.223 7.223 0 002.976 2.848c1.27.661 2.736.992 4.4.992zm0-3.872c-.939 0-1.67-.352-2.192-1.056-.523-.704-.784-1.835-.784-3.392 0-1.579.261-2.715.784-3.408.523-.693 1.253-1.04 2.192-1.04.96 0 1.701.347 2.224 1.04.523.693.784 1.83.784 3.408 0 1.557-.261 2.688-.784 3.392-.523.704-1.264 1.056-2.224 1.056zM81.72 28v-8.48c0-1.344.283-2.293.848-2.848a2.799 2.799 0 012.032-.832c.661 0 1.205.213 1.632.64.427.427.64 1.195.64 2.304V28h5.44V17.344c0-1.856-.512-3.264-1.536-4.224-1.024-.96-2.357-1.44-4-1.44-1.28 0-2.39.299-3.328.896-.939.597-1.653 1.483-2.144 2.656L81.144 12H76.28v16h5.44zm19 0v-8.064c0-1.237.357-2.165 1.072-2.784.715-.619 1.563-.928 2.544-.928.47 0 .87.032 1.2.096.33.064.603.128.816.192l.544-4.48c-.17-.085-.4-.165-.688-.24a4.193 4.193 0 00-1.04-.112c-1.259 0-2.288.336-3.088 1.008-.8.672-1.392 1.595-1.776 2.768L100.08 12h-4.8v16h5.44zm11.736.32a8.12 8.12 0 003.088-.592c.97-.395 1.68-1.008 2.128-1.84.256.81.747 1.413 1.472 1.808s1.59.592 2.592.592c.917 0 1.696-.15 2.336-.448l.32-3.104c-.235.085-.544.128-.928.128-.747 0-1.12-.416-1.12-1.248V17.76c0-1.984-.645-3.493-1.936-4.528-1.29-1.035-3.11-1.552-5.456-1.552-2.325 0-4.128.459-5.408 1.376-1.28.917-2.07 2.144-2.368 3.68l4.608 1.088c.192-.896.539-1.52 1.04-1.872.501-.352 1.104-.528 1.808-.528s1.264.219 1.68.656c.416.437.624 1.03.624 1.776v.448l-5.536 1.152c-1.493.299-2.587.827-3.28 1.584-.693.757-1.04 1.712-1.04 2.864 0 1.43.485 2.523 1.456 3.28.97.757 2.277 1.136 3.92 1.136zm1.728-3.52c-.47 0-.875-.117-1.216-.352-.341-.235-.512-.587-.512-1.056 0-.49.155-.859.464-1.104.31-.245.784-.432 1.424-.56l2.592-.544v.896c0 .939-.277 1.627-.832 2.064a3.014 3.014 0 01-1.92.656zm16.952 3.2v-8.448c0-1.323.283-2.272.848-2.848.565-.576 1.221-.864 1.968-.864.64 0 1.163.203 1.568.608.405.405.608 1.12.608 2.144V28h5.44v-8.544c0-1.195.267-2.096.8-2.704a2.567 2.567 0 012.016-.912c.64 0 1.163.203 1.568.608.405.405.608 1.12.608 2.144V28H152V17.344c0-1.877-.517-3.29-1.552-4.24-1.035-.95-2.341-1.424-3.92-1.424a6.503 6.503 0 00-3.184.8c-.97.533-1.701 1.323-2.192 2.368-.427-1.045-1.083-1.835-1.968-2.368-.885-.533-1.915-.8-3.088-.8-1.216 0-2.288.288-3.216.864-.928.576-1.648 1.43-2.16 2.56L130.56 12h-4.864v16h5.44zm29.272 6.72v-9.472a5.472 5.472 0 001.856 2.224c.81.565 1.792.848 2.944.848 1.963 0 3.557-.736 4.784-2.208 1.227-1.472 1.84-3.53 1.84-6.176 0-2.603-.603-4.63-1.808-6.08-1.205-1.45-2.79-2.176-4.752-2.176-1.237 0-2.31.325-3.216.976-.907.65-1.584 1.51-2.032 2.576l-.16-3.232h-4.896v22.72h5.44zm2.944-10.4c-.939 0-1.664-.384-2.176-1.152-.512-.768-.768-1.824-.768-3.168 0-1.408.267-2.48.8-3.216.533-.736 1.259-1.104 2.176-1.104.939 0 1.67.347 2.192 1.04.523.693.784 1.787.784 3.28 0 1.493-.267 2.587-.8 3.28-.533.693-1.27 1.04-2.208 1.04z"/>
    </g>
</svg>
        </a>

        <button x-on:click="toggle()"
            aria-label="Main Menu"
            type="button"
            class="relative transition duration-300 ease-in-out mobileMenuBtn"
            x-bind:class="isMenuOpen ? 'isActive' : ''">
            <div class="h-[2px] my-3 rounded w-8 bg-mint"
                x-bind:class="isMenuOpen ? 'invisible' : 'visible'">
            </div>
        </button>
    </div>

    <div x-show="isMenuOpen"
        x-cloak
        x-on:click.away="isMenuOpen = false"
        class="absolute left-0 top-[45px] w-full min-h-[75vh] overflow-y-auto  bg-blue-black pb-4 z-[-1]"
        x-transition:enter="transition-all ease-in duration-200 origin-top"
        x-transition:enter-start="opacity-0 transform scale-y-0"
        x-transition:enter-end="opacity-100 transform scale-y-100"
        x-transition:leave="transition-all ease-out duration-200 origin-top"
        x-transition:leave-start="opacity-100 transform scale-y-100"
        x-transition:leave-end="opacity-0 transform scale-y-0">
        <div>
            <a class="block mx-1 border-t border-silver xl:border-none text-body font-bold transition-colors py-4 xl:py-1 duration-300 ease-in-out text-mint hover:text-white hover:no-underline px-3
	"
    href="https://onramp.dev/en/modules">
    <span>Learn</span>
</a>

<a class="block mx-1 border-t border-silver xl:border-none text-body font-bold transition-colors py-4 xl:py-1 duration-300 ease-in-out text-mint hover:text-white hover:no-underline px-3
	"
    href="https://onramp.dev/en/glossary">
    <span>Glossary</span>
</a>

<a class="block mx-1 border-t border-silver xl:border-none text-body font-bold transition-colors py-4 xl:py-1 duration-300 ease-in-out text-mint hover:text-white hover:no-underline px-3
	"
    href="https://onramp.dev/en/tracks">
    <span>Tracks</span>
</a>
        </div>

        <div>
            
            <div>
    <div x-data="{isOpen: false, language: window.language, languages: window.locales}" @click.away="isOpen = false" class="relative hidden text-left xl:block">
        <div>
            <button type="button" class="inline-flex items-center justify-center w-full h-12 text-base font-semibold text-white transition-colors duration-300 ease-in-out focus:outline-none focus:border-white hover:text-mint" @click="isOpen = !isOpen">
                <span x-text="language"></span>

                <svg class="w-3 h-auto ml-2 duration-300 ease-in-out stroke-current transition-rotate text-mint" :class="{
                'transform -scale-y-100': isOpen
            }" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 11">
                    <path d="M2 2l6 6 6-6" stroke-width="3" fill="none" fill-rule="evenodd" stroke-linecap="round" />
                </svg>
            </button>
        </div>

        <div x-show="isOpen" class="absolute right-0 z-50 w-32 mt-2 origin-top-right rounded-md shadow-lg"
            x-transition:enter="transition-all ease-in duration-200 origin-top"
            x-transition:enter-start="opacity-0 transform scale-y-0"
            x-transition:enter-end="opacity-100 transform scale-y-100"
            x-transition:leave="transition-all ease-out duration-200 origin-top"
            x-transition:leave-start="opacity-100 transform scale-y-100"
            x-transition:leave-end="opacity-0 transform scale-y-0"
        >
            <div class="overflow-hidden bg-white rounded-md shadow-xs">
                <template x-for="(lang, slug) in languages" :key="slug">
                    <a href="#" @click="chooseLanguage(slug)" x-text="lang" class="block px-4 py-3 text-sm font-medium leading-5 transition-colors duration-75 ease-in-out cursor-pointer hover:no-underline hover:bg-silver/50 focus:outline-none focus:bg-silver/50">
                    </a>
                </template>
            </div>
        </div>
    </div>

    <div x-data="{isOpen: false, language: window.language, languages: window.locales}" class="relative z-50 mb-6 xl:hidden">
        <button x-show="isOpen" x-on:click="isOpen = false" tabindex="-1" class="fixed inset-0 hidden w-full h-full cursor-default" aria-label="close language switcher"></button>

        <div class="px-6 py-3 xl:p-0">
            <label for="language-switcher" class="flex items-center -ml-2 text-white focus:outline-none ">
                <button x-text="language" x-on:click="isOpen = !isOpen" id="alpine-language-switcher" tabindex="1" class="mr-3 font-bold text-body focus:outline-none focus:border-white">
                </button>

                <svg class="w-3 h-auto transition duration-300 ease-in-out stroke-current text-mint" :class="{ 'transform -scale-y-100': isOpen }" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 11">
                    <path d="M2 2l6 6 6-6" stroke-width="3" fill="none" fill-rule="evenodd" stroke-linecap="round" />
                </svg>
            </label>
        </div>

        <div x-show="isOpen" x-on:click.away="isOpen = false" class="overflow-hidden bg-steel xl:absolute xl:mt-12 xl:shadow-xl xl:left-0 xl:top-0"
            x-transition:enter="transition-all ease-in duration-200 origin-top"
            x-transition:enter-start="opacity-0 transform scale-y-0"
            x-transition:enter-end="opacity-100 transform scale-y-100"
            x-transition:leave="transition-all ease-out duration-200 origin-top"
            x-transition:leave-start="opacity-100 transform scale-y-100"
            x-transition:leave-end="opacity-0 transform scale-y-0"
        >
            <template x-for="(lang, slug) in languages" :key="slug">
                <button x-text="lang" x-on:click="chooseLanguage(slug)" class="block w-full px-6 py-2 text-base font-normal text-left text-white transition-colors duration-200 ease-in-out focus:outline-none hover:bg-purple">
                </button>
            </template>
        </div>
    </div>
</div>
        </div>

        <div class="absolute w-full px-4 bottom-6 absolute-x-center">
                            <div class="flex w-full">
    <a class="flex-1 inline-block w-auto px-4 py-1 mr-4 text-lg font-semibold text-center transition duration-200 ease-in-out bg-transparent border-2 hover:no-underline rounded-3xl text-mint border-mint hover:bg-mint hover:text-blue-black whitespace-nowrap"
        href="https://onramp.dev/en/login">
        <span>Get Started</span>
    </a>
</div>
            
                    </div>
        <div class="fixed z-[-2] top-0 left-0 opacity-70 flex items-center justify-center w-full inset-0  bg-black"
            x-show="isMenuOpen"></div>
    </div>

</div>
</section>
    </header>
    <div id="app-body">
                    <div class="text-white">
        <!--suppress ALL -->
<div class="grid grid-cols-1 py-8 ml-4 overflow-hidden lg:mt-20 md:grid-cols-2 bg-blue-black">
    <div class="flex items-center w-full">
        <div class="max-w-2xl">
            <h1 class="font-bold leading-none text-white h4 sm:h3 lg:h2">
                Providing an easy entrance into Laravel for new developers.
            </h1>

            <a class="relative inline-block w-auto px-4 py-2 mt-8 mb-12 text-lg font-semibold text-center transition duration-200 ease-in-out border-2 text-blue-black under rounded-3xl border-mint bg-mint hover:no-underline hover:bg-transparent hover:text-mint"
               href="#overview" style="scroll-margin-top: 50px">
                <span>Learn more</span>
            </a>
        </div>

    </div>
    <div class="relative -ml-12">
        <svg width="739" height="468" viewBox="0 0 739 468" fill="none" xmlns="http://www.w3.org/2000/svg"
     class="w-[96%] h-[96%] xl:w-full xl:h-full">
    <path
        d="M365 0C494.028 0 599 104.972 599 234C599 363.028 494.028 468 365 468C235.972 468 131 363.028 131 234C131 104.972 235.972 0 365 0ZM365 365.262C437.382 365.262 496.262 306.382 496.262 234C496.262 161.618 437.382 102.738 365 102.738C292.618 102.738 233.732 161.618 233.732 234C233.732 306.382 292.618 365.262 365 365.262Z"
        fill="url(#paint0_linear_3_2)"/>
    <path
        d="M233.828 234C233.828 161.618 292.671 102.738 365 102.738V0C236.067 0 131.172 104.972 131.172 234C131.172 306.382 72.3289 365.262 0 365.262V468C128.939 468 233.828 363.028 233.828 234Z"
        fill="url(#paint1_linear_3_2)"/>
    <path
        d="M598.476 234C598.476 161.618 657.231 102.738 729.451 102.738L739 102.96V0H729.451C600.706 0 495.974 104.972 495.974 234C495.974 306.382 437.22 365.262 365 365.262V468C493.739 468 598.476 363.028 598.476 234Z"
        fill="url(#paint2_linear_3_2)"/>
    <defs>

        <linearGradient id="paint0_linear_3_2" x1="374.676" y1="234" x2="169.85" y2="234"
                        gradientUnits="userSpaceOnUse">
            <stop offset="0.29" stop-color="#5B55CC"/>
            <stop offset="0.35" stop-color="#5550C1"/>
            <stop offset="0.46" stop-color="#4741A4"/>
            <stop offset="0.6" stop-color="#2F2A74"/>
            <stop offset="0.76" stop-color="#0E0B32"/>
            <stop offset="0.81" stop-color="#050220"/>
        </linearGradient>

        <linearGradient id="paint1_linear_3_2" x1="365" y1="234" x2="-79.5" y2="240.5" gradientUnits="userSpaceOnUse">
            <stop stop-color="#5955CC"/>
            <stop offset="0.0001" stop-color="#5955CC"/>
            <stop offset="0.275281" stop-color="#5346AD"/>
            <stop offset="0.740875" stop-color="#050220"/>
            <stop offset="0.86588" stop-color="#050220"/>
            <stop offset="1" stop-color="#050220"/>
        </linearGradient>

        <linearGradient id="paint2_linear_3_2" x1="739" y1="234" x2="365" y2="234" gradientUnits="userSpaceOnUse">
            <stop offset="0.03125" stop-color="#050220"/>
            <stop offset="0.395833" stop-color="#27D9CB"/>
            <stop offset="0.453125" stop-color="#27D9CB"/>
            <stop offset="0.567708" stop-color="#27D9CB"/>
            <stop offset="0.640625" stop-color="#27D9CB"/>
            <stop offset="0.91" stop-color="#5B55CC"/>
        </linearGradient>
    </defs>
</svg>
    </div>
</div>

        <div class="grid grid-cols-1 py-8 overflow-hidden lg:mt-16 md:grid-cols-2" id="overview">
    <div class="flex items-center w-full mb-8 md:mb-0">
        <div class="max-w-lg px-4 xl:px-0">
            <h2 class="font-bold leading-none h4 sm:h3 lg:h2">What is this?</h2>

            <p class="mt-8 text-xl leading-normal md:text-2xl lg:text-3xl lg:mt-10">
                Onramp gathers educational resources, organized for you to become a Laravel programmer as easily and effectively as possible.
            </p>
        </div>
    </div>
    <div class="relative md:order-first">
        <svg class="w-[508px] h-" viewBox="0 0 508 465" fill="none" xmlns="http://www.w3.org/2000/svg"
     class="w-[96%] h-[96%] xl:w-full xl:h-full">
    <path d=" M214.573 232.517C214.53 197.938 200.043 164.787 174.289 140.335C148.535 115.882 113.617 102.125 77.1929
     102.081V0C212.226 0 322.101 104.309 322.101 232.517C322.143 267.094 336.631 300.243 362.385 324.693C388.14 349.143
     423.058 362.896 459.481 362.936V464.983C324.43 464.983 214.573 360.708 214.573
     232.517Z" fill="url(#paint0_linear_2_3)"/>
    <path d="M-1.0177 103.718H507.982V7.62939e-05H-1.0177V103.718Z" fill="url(#paint1_linear_2_3)"/>

    <defs>
        <linearGradient id="paint0_linear_2_3" x1="77.1751" y1="232.517" x2="459.481" y2="232.517"
                        gradientUnits="userSpaceOnUse">
            <stop offset="0.29" stop-color="#5B55CC"/>
            <stop offset="0.35" stop-color="#5550C1"/>
            <stop offset="0.46" stop-color="#4741A4"/>
            <stop offset="0.6" stop-color="#2F2A74"/>
            <stop offset="0.76" stop-color="#0E0B32"/>
            <stop offset="0.81" stop-color="#050220"/>
        </linearGradient>

        <linearGradient id="paint1_linear_2_3" x1="-0.999922" y1="51.8505" x2="507.982" y2="51.8505"
                        gradientUnits="userSpaceOnUse">
            <stop offset="0.00982338" stop-color="#050220"/>
            <stop offset="0.137529" stop-color="#2F797F"/>
            <stop offset="0.337929" stop-color="#4BC6BC"/>
            <stop offset="0.618882" stop-color="#4FD1C5"/>
            <stop offset="0.673894" stop-color="#4BC6BC"/>
            <stop offset="0.752482" stop-color="#41A9A5"/>
            <stop offset="0.811424" stop-color="#2F797F"/>
            <stop offset="0.911624" stop-color="#18374A"/>
            <stop offset="1" stop-color="#050220"/>
        </linearGradient>
    </defs>
</svg>
    </div>
</div>

        <div class="py-8 lg:mt-16">
	<p class="max-w-xl px-4 mx-auto mt-5 text-xl leading-normal text-center lg:max-w-4xl md:px-0 md:text-2xl lg:text-3xl">
		Anyone can use Onramp, but we&#039;re focusing mainly on making it easy for these three groups to become professional Laravel programmers:
	</p>

	<div class="px-4 mlg:px-0 max-w-[1100px] mx-auto relative gap-4 grid grid-cols-1 pt-6 mt-8 sm:grid-cols-3">
		<div class="p-1 rounded-md bg-gradient-to-r from-mint via-mint to-violet">
			<div class="py-16 text-2xl rounded-md bg-blue-black lg:h4 h-full">
				<div
					class="flex items-center justify-center w-16 h-16 mx-auto rounded-full bg-mint md:w-20 md:h-20">
					<svg class="w-6 text-white stroke-current md:w-10"
	xmlns="http://www.w3.org/2000/svg"
	viewBox="0 0 41 39">
	<path fill="none"
		fill-rule="evenodd"
		stroke-width="3"
		d="M21.644 2.705l4.728 9.495c.187.374.546.632.962.692l10.572 1.523c1.047.151 1.464 1.425.707 2.157l-7.65 7.392c-.301.29-.438.708-.367 1.118l1.806 10.437c.178 1.033-.915 1.82-1.852 1.333l-9.456-4.928a1.287 1.287 0 00-1.188 0l-9.456 4.928c-.936.488-2.03-.3-1.852-1.333l1.806-10.437a1.255 1.255 0 00-.367-1.118l-7.65-7.392c-.758-.732-.34-2.006.707-2.157l10.573-1.523c.416-.06.775-.318.96-.692l4.728-9.495c.469-.94 1.82-.94 2.29 0z" />
</svg>
				</div>
				<h3 class="sm:max-w-[145px] mx-auto mt-4 font-semibold text-center lg:max-w-xs">Brand-new developers</h3>
			</div>
		</div>

		<div class="p-1 rounded-md bg-gradient-to-r from-mint via-mint to-violet">
			<div class="py-16 text-2xl rounded-md bg-blue-black lg:h4 h-full">
				<div
					class="flex items-center justify-center w-16 h-16 mx-auto rounded-full bg-mint md:w-20 md:h-20">
					<svg class="w-6 text-white stroke-current md:w-10"
	xmlns="http://www.w3.org/2000/svg"
	viewBox="0 0 49 27">
	<path fill="none"
		fill-rule="evenodd"
		stroke-width="3"
		d="M20.714 26.372L27.931 1M16.389 21.867l-13.36-6.04c-1.322-.599-1.384-2.453-.105-3.139l12.92-6.929M32.256 21.867l13.359-6.04c1.323-.599 1.386-2.453.107-3.139L32.801 5.76" />
</svg>
				</div>
				<h3 class="sm:max-w-[145px] mx-auto mt-4 font-semibold text-center lg:max-w-xs">Frontend developers</h3>
			</div>
		</div>

		<div class="p-1 rounded-md bg-gradient-to-r from-mint via-mint to-violet">
			<div class="py-16 text-2xl rounded-md lg:h4 bg-blue-black h-full">
				<div
					class="flex items-center justify-center w-16 h-16 mx-auto rounded-full bg-mint md:w-20 md:h-20">
					<svg class="w-6 text-white stroke-current md:w-10"
	xmlns="http://www.w3.org/2000/svg"
	viewBox="0 0 37 26">
	<path fill="none"
		fill-rule="evenodd"
		stroke-width="3"
		d="M4 1.5l6.22 21.354c.616 1.322 2.527 1.385 3.234.106L18 9M16 1.5l6.268 21.354c.62 1.322 2.546 1.385 3.258.106L33 1.537M13 1.5h7.5M28.5 1.5h8M0 1.5h8" />
</svg>
				</div>
				<h3 class="sm:max-w-[145px] mx-auto mt-4 font-semibold text-center lg:max-w-xs">WordPress developers</h3>
		</div>
		</div>
	</div>
</div>

        <div class="relative w-full overflow-hidden bg-mint lg:mt-16 xl:to-blue-black text-blue-black md:flex md:justify-between">
	<div class="relative p-16 md:p-0 md:left-20 md:top-20">
		<h4 class="font-bold leading-none h4 sm:h3 lg:h2">
			Join Onramp for free.
		</h4>

		<p class="my-6 text-xl leading-normal md:text-2xl lg:text-3xl lg:mt-10">
			Join Onramp for free today to see the technologies and processes the team at Tighten thinks are best for you to learn and our favorite resources for learning them.
		</p>

		<a class="inline-block px-4 py-1 text-lg font-semibold text-center transition duration-200 ease-in-out border-2 rounded-full text-mint under border-blue-black bg-blue-black hover:no-underline hover:bg-mint hover:text-blue-black"
			href="https://onramp.dev/en/modules">
			Ok, let&#039;s learn
		</a>
	</div>

	<div class="hidden md:block"><svg width="486" height="625" viewBox="0 0 486 625" fill="none" xmlns="http://www.w3.org/2000/svg">
	<path d="M485 136.822C388.282 136.822 309.602 215.632 309.602 312.501H312.602C312.602 217.285 389.943 139.822 485 139.822V136.822ZM309.602 312.501C309.602 409.369 388.282 488.178 485 488.178V485.178C389.943 485.178 312.602 407.717 312.602 312.501H309.602ZM485 621.5C314.896 621.5 176.5 482.884 176.5 312.501H173.5C173.5 484.536 313.235 624.5 485 624.5V621.5ZM176.5 312.501C176.5 142.116 314.896 3.5 485 3.5V0.5C313.235 0.5 173.5 140.464 173.5 312.501H176.5Z" fill="#050220"/>
	<path d="M0 623C171.324 623 310.706 483.619 310.706 312.295C310.706 216.188 388.894 138 485 138" stroke="url(#paint0_linear_0_61)" stroke-width="3"/>

	<mask id="mask0_0_61" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="1" width="486" height="486">
		<path fill-rule="evenodd" clip-rule="evenodd" d="M0 1.39783H485.348V486.486H0V1.39783Z" fill="white"/>
	</mask>

	<g mask="url(#mask0_0_61)">
		<path d="M485.348 1.39783C313.901 1.39783 174.419 140.806 174.419 312.161C174.419 408.285 96.1749 486.486 0 486.486" stroke="url(#paint1_linear_0_61)" stroke-width="3"/>
	</g>

	<defs>
		<linearGradient id="paint0_linear_0_61" x1="28.5484" y1="187.461" x2="127.47" y2="187.461" gradientUnits="userSpaceOnUse">
			<stop stop-color="#4FD1C5"/>
			<stop offset="0.834629" stop-color="#050220"/>
			<stop offset="0.993808" stop-color="#050220"/>
		</linearGradient>

		<linearGradient id="paint1_linear_0_61" x1="28.5689" y1="50.8678" x2="127.562" y2="50.8678" gradientUnits="userSpaceOnUse">
		<stop stop-color="#4FD1C5"/>
		<stop offset="0.82942" stop-color="#050220"/>
		<stop offset="0.993808" stop-color="#050220"/>
		</linearGradient>
	</defs>
</svg>
</div>
</div>
    </div>

        <div class="sticky bottom-6">
    <a
        class="absolute inline-flex items-center justify-center invisible w-12 h-12 px-4 py-2 text-sm font-medium text-white no-underline uppercase transition duration-200 ease-in-out border border-transparent rounded-full right-3 bottom-3 bg-purple focus:bg-white focus:text-purple hover:bg-white hover:text-purple hover:no-underline focus:outline-none border-purple active:bg-white active:text-purple"
        href="#top"
        id="top-button"
    >
        <span class="text-lg fa fa-chevron-up"></span>
    </a>
</div>
        
        <Notifications
            position="bottom right"
            classes="toast"
            :speed="500"
            width="450"
        />
    </div>
    <footer class="w-full px-4 py-10 text-white bg-blue-black">
    <div class="flex flex-col items-center">
        <p class="w-full mb-4 text-lg text-center sm:w-auto sm:mb-0 md:text-body">
            From the lovely folks at

            <a class="font-semibold" href="https://tighten.com/">
                <span class="underline">Tighten</span>
            </a>
        </p>

        <div class="text-base text-mint">
            <a class="mr-3 underline" href="https://onramp.dev/en/use-of-data">Use of Data</a>

            <a href="https://github.com/tighten/onramp" class="underline" target="_blank">
                Source &amp; Roadmap
            </a>
        </div>
    </div>
</footer>
</div>
<script type="text/javascript">const Ziggy={"url":"https:\/\/onramp.dev","port":null,"defaults":{},"routes":{"nova.asset.":{"uri":"nova-api\/scripts\/{script}","methods":["GET","HEAD"],"parameters":["script"]},"nova.api.":{"uri":"nova-api\/search","methods":["GET","HEAD"]},"nova.api.start-nova-impersonation":{"uri":"nova-api\/impersonate","methods":["POST"]},"nova.api.stop-nova-impersonation":{"uri":"nova-api\/impersonate","methods":["DELETE"]},"ignition.healthCheck":{"uri":"_ignition\/health-check","methods":["GET","HEAD"]},"ignition.executeSolution":{"uri":"_ignition\/execute-solution","methods":["POST"]},"ignition.updateConfig":{"uri":"_ignition\/update-config","methods":["POST"]},"nova.pages.login":{"uri":"nova\/login","methods":["GET","HEAD"]},"nova.login":{"uri":"nova\/login","methods":["POST"]},"nova.logout":{"uri":"nova\/logout","methods":["POST"]},"nova.pages.password.email":{"uri":"nova\/password\/reset","methods":["GET","HEAD"]},"nova.password.email":{"uri":"nova\/password\/email","methods":["POST"]},"nova.pages.password.reset":{"uri":"nova\/password\/reset\/{token}","methods":["GET","HEAD"],"parameters":["token"]},"nova.password.reset":{"uri":"nova\/password\/reset","methods":["POST"]},"nova.pages.user-security":{"uri":"nova\/user-security","methods":["GET","HEAD"]},"nova.pages.password.verify":{"uri":"nova\/user-security\/confirm-password","methods":["GET","HEAD"]},"nova.password.confirmation":{"uri":"nova\/user-security\/confirmed-password-status","methods":["GET","HEAD"]},"nova.password.confirm":{"uri":"nova\/user-security\/confirm-password","methods":["POST"]},"nova.pages.403":{"uri":"nova\/403","methods":["GET","HEAD"]},"nova.pages.404":{"uri":"nova\/404","methods":["GET","HEAD"]},"nova.pages.home":{"uri":"nova","methods":["GET","HEAD"]},"nova.pages.dashboard":{"uri":"nova\/dashboard","methods":["GET","HEAD","POST","PUT","PATCH","DELETE","OPTIONS"]},"nova.pages.dashboard.custom":{"uri":"nova\/dashboards\/{name}","methods":["GET","HEAD"],"parameters":["name"]},"nova.pages.index":{"uri":"nova\/resources\/{resource}","methods":["GET","HEAD"],"parameters":["resource"]},"nova.pages.create":{"uri":"nova\/resources\/{resource}\/new","methods":["GET","HEAD"],"parameters":["resource"]},"nova.pages.detail":{"uri":"nova\/resources\/{resource}\/{resourceId}","methods":["GET","HEAD"],"parameters":["resource","resourceId"]},"nova.pages.edit":{"uri":"nova\/resources\/{resource}\/{resourceId}\/edit","methods":["GET","HEAD"],"parameters":["resource","resourceId"]},"nova.pages.replicate":{"uri":"nova\/resources\/{resource}\/{resourceId}\/replicate","methods":["GET","HEAD"],"parameters":["resource","resourceId"]},"nova.pages.lens":{"uri":"nova\/resources\/{resource}\/lens\/{lens}","methods":["GET","HEAD"],"parameters":["resource","lens"]},"nova.pages.attach":{"uri":"nova\/resources\/{resource}\/{resourceId}\/attach\/{relatedResource}","methods":["GET","HEAD"],"parameters":["resource","resourceId","relatedResource"]},"nova.pages.edit-attached":{"uri":"nova\/resources\/{resource}\/{resourceId}\/edit-attached\/{relatedResource}\/{relatedResourceId}","methods":["GET","HEAD"],"parameters":["resource","resourceId","relatedResource","relatedResourceId"]},"welcome":{"uri":"{locale}","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"use-of-data":{"uri":"{locale}\/use-of-data","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"glossary":{"uri":"{locale}\/glossary","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"tracks":{"uri":"{locale}\/tracks","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"modules.index":{"uri":"{locale}\/modules","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"modules.show":{"uri":"{locale}\/modules\/{module}\/{resourceType}","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$","resourceType":"free-resources|paid-resources|quizzes|exercises"},"parameters":["locale","module","resourceType"],"bindings":{"module":"slug"}},"wizard.index":{"uri":"{locale}\/wizard","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"wizard.store":{"uri":"{locale}\/wizard","methods":["POST"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"user.profile.show":{"uri":"{locale}\/profile","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"user.profile.update":{"uri":"{locale}\/profile","methods":["PUT"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"user.preferences.index":{"uri":"{locale}\/preferences","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"user.completions.store":{"uri":"{locale}\/completions","methods":["POST"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"user.completions.destroy":{"uri":"{locale}\/completions","methods":["DELETE"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"user.preferences.update":{"uri":"{locale}\/preferences","methods":["PATCH"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"user.new-resources":{"uri":"{locale}\/new-resources","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"unsubscribe":{"uri":"{locale}\/unsubscribe\/{token}","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale","token"]},"login":{"uri":"{locale}\/login","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"logout":{"uri":"{locale}\/logout","methods":["POST"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"password.request":{"uri":"{locale}\/password\/reset","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"password.email":{"uri":"{locale}\/password\/email","methods":["POST"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"password.reset":{"uri":"{locale}\/password\/reset\/{token}","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale","token"]},"password.update":{"uri":"{locale}\/password\/reset","methods":["POST"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"login.github":{"uri":"{locale}\/login\/github","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$"},"parameters":["locale"]},"storage.local":{"uri":"storage\/{path}","methods":["GET","HEAD"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$","path":".*"},"parameters":["path"]},"storage.local.upload":{"uri":"storage\/{path}","methods":["PUT"],"wheres":{"locale":"^[a-z]{2}(?:_[a-z]{2})?$","path":".*"},"parameters":["path"]}}};!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t||self).route=e()}(this,function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,u(r.key),r)}}function e(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function n(){return n=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)({}).hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},n.apply(null,arguments)}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function o(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(o=function(){return!!t})()}function i(t,e){return i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},i(t,e)}function u(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}function f(t){var e="function"==typeof Map?new Map:void 0;return f=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(o())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var u=new(t.bind.apply(t,r));return n&&i(u,n.prototype),u}(t,arguments,r(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),i(n,t)},f(t)}const c=String.prototype.replace,l=/%20/g,a={RFC1738:function(t){return c.call(t,l,"+")},RFC3986:function(t){return String(t)}};var s="RFC3986";const p=Object.prototype.hasOwnProperty,y=Array.isArray,d=new WeakMap;var b=function(t,e){return d.set(t,e),t};function v(t){return d.has(t)}var h=function(t){return d.get(t)},m=function(t,e){d.set(t,e)};const g=function(){const t=[];for(let e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),w=function(t,e){const n=e&&e.plainObjects?Object.create(null):{};for(let e=0;e<t.length;++e)void 0!==t[e]&&(n[e]=t[e]);return n},j=function t(e,n,r){if(!n)return e;if("object"!=typeof n){if(y(e))e.push(n);else{if(!e||"object"!=typeof e)return[e,n];if(v(e)){var o=h(e)+1;e[o]=n,m(e,o)}else(r&&(r.plainObjects||r.allowPrototypes)||!p.call(Object.prototype,n))&&(e[n]=!0)}return e}if(!e||"object"!=typeof e){if(v(n)){for(var i=Object.keys(n),u=r&&r.plainObjects?{__proto__:null,0:e}:{0:e},f=0;f<i.length;f++)u[parseInt(i[f],10)+1]=n[i[f]];return b(u,h(n)+1)}return[e].concat(n)}let c=e;return y(e)&&!y(n)&&(c=w(e,r)),y(e)&&y(n)?(n.forEach(function(n,o){if(p.call(e,o)){const i=e[o];i&&"object"==typeof i&&n&&"object"==typeof n?e[o]=t(i,n,r):e.push(n)}else e[o]=n}),e):Object.keys(n).reduce(function(e,o){const i=n[o];return e[o]=p.call(e,o)?t(e[o],i,r):i,e},c)},O=1024,E=function(t,e,n,r){if(v(t)){var o=h(t)+1;return t[o]=e,m(t,o),t}var i=[].concat(t,e);return i.length>n?b(w(i,{plainObjects:r}),i.length-1):i},T=function(t,e){if(y(t)){const n=[];for(let r=0;r<t.length;r+=1)n.push(e(t[r]));return n}return e(t)},R=Object.prototype.hasOwnProperty,k={brackets:function(t){return t+"[]"},comma:"comma",indices:function(t,e){return t+"["+e+"]"},repeat:function(t){return t}},S=Array.isArray,I=Array.prototype.push,A=function(t,e){I.apply(t,S(e)?e:[e])},D=Date.prototype.toISOString,$={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:function(t,e,n,r,o){if(0===t.length)return t;let i=t;if("symbol"==typeof t?i=Symbol.prototype.toString.call(t):"string"!=typeof t&&(i=String(t)),"iso-8859-1"===n)return escape(i).replace(/%u[0-9a-f]{4}/gi,function(t){return"%26%23"+parseInt(t.slice(2),16)+"%3B"});let u="";for(let t=0;t<i.length;t+=O){const e=i.length>=O?i.slice(t,t+O):i,n=[];for(let t=0;t<e.length;++t){let r=e.charCodeAt(t);45===r||46===r||95===r||126===r||r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||"RFC1738"===o&&(40===r||41===r)?n[n.length]=e.charAt(t):r<128?n[n.length]=g[r]:r<2048?n[n.length]=g[192|r>>6]+g[128|63&r]:r<55296||r>=57344?n[n.length]=g[224|r>>12]+g[128|r>>6&63]+g[128|63&r]:(t+=1,r=65536+((1023&r)<<10|1023&e.charCodeAt(t)),n[n.length]=g[240|r>>18]+g[128|r>>12&63]+g[128|r>>6&63]+g[128|63&r])}u+=n.join("")}return u},encodeValuesOnly:!1,format:s,formatter:a[s],indices:!1,serializeDate:function(t){return D.call(t)},skipNulls:!1,strictNullHandling:!1},N={},_=function(t,e,n,r,o,i,u,f,c,l,a,s,p,y,d,b,v,h){let m=t,g=h,w=0,j=!1;for(;void 0!==(g=g.get(N))&&!j;){const e=g.get(t);if(w+=1,void 0!==e){if(e===w)throw new RangeError("Cyclic object value");j=!0}void 0===g.get(N)&&(w=0)}if("function"==typeof l?m=l(e,m):m instanceof Date?m=p(m):"comma"===n&&S(m)&&(m=T(m,function(t){return t instanceof Date?p(t):t})),null===m){if(i)return c&&!b?c(e,$.encoder,v,"key",y):e;m=""}if("string"==typeof(O=m)||"number"==typeof O||"boolean"==typeof O||"symbol"==typeof O||"bigint"==typeof O||function(t){return!(!t||"object"!=typeof t||!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t)))}(m))return c?[d(b?e:c(e,$.encoder,v,"key",y))+"="+d(c(m,$.encoder,v,"value",y))]:[d(e)+"="+d(String(m))];var O;const E=[];if(void 0===m)return E;let R;if("comma"===n&&S(m))b&&c&&(m=T(m,c)),R=[{value:m.length>0?m.join(",")||null:void 0}];else if(S(l))R=l;else{const t=Object.keys(m);R=a?t.sort(a):t}const k=f?e.replace(/\./g,"%2E"):e,I=r&&S(m)&&1===m.length?k+"[]":k;if(o&&S(m)&&0===m.length)return I+"[]";for(let e=0;e<R.length;++e){const g=R[e],j="object"==typeof g&&void 0!==g.value?g.value:m[g];if(u&&null===j)continue;const O=s&&f?g.replace(/\./g,"%2E"):g,T=S(m)?"function"==typeof n?n(I,O):I:I+(s?"."+O:"["+O+"]");h.set(t,w);const k=new WeakMap;k.set(N,h),A(E,_(j,T,n,r,o,i,u,f,"comma"===n&&b&&S(m)?null:c,l,a,s,p,y,d,b,v,k))}return E},x=Object.prototype.hasOwnProperty,C=Array.isArray,P={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:function(t,e,n){const r=t.replace(/\+/g," ");if("iso-8859-1"===n)return r.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(r)}catch(t){return r}},delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},F=function(t){return t.replace(/&#(\d+);/g,function(t,e){return String.fromCharCode(parseInt(e,10))})},U=function(t,e){return t&&"string"==typeof t&&e.comma&&t.indexOf(",")>-1?t.split(","):t},q=function(t,e,n,r){if(!t)return;const o=n.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,i=/(\[[^[\]]*])/g;let u=n.depth>0&&/(\[[^[\]]*])/.exec(o);const f=u?o.slice(0,u.index):o,c=[];if(f){if(!n.plainObjects&&x.call(Object.prototype,f)&&!n.allowPrototypes)return;c.push(f)}let l=0;for(;n.depth>0&&null!==(u=i.exec(o))&&l<n.depth;){if(l+=1,!n.plainObjects&&x.call(Object.prototype,u[1].slice(1,-1))&&!n.allowPrototypes)return;c.push(u[1])}return u&&c.push("["+o.slice(u.index)+"]"),function(t,e,n,r){let o=r?e:U(e,n);for(let e=t.length-1;e>=0;--e){let r;const i=t[e];if("[]"===i&&n.parseArrays)r=v(o)?o:n.allowEmptyArrays&&(""===o||n.strictNullHandling&&null===o)?[]:E([],o,n.arrayLimit,n.plainObjects);else{r=n.plainObjects?Object.create(null):{};const t="["===i.charAt(0)&&"]"===i.charAt(i.length-1)?i.slice(1,-1):i,e=n.decodeDotInKeys?t.replace(/%2E/g,"."):t,u=parseInt(e,10);n.parseArrays||""!==e?!isNaN(u)&&i!==e&&String(u)===e&&u>=0&&n.parseArrays&&u<=n.arrayLimit?(r=[],r[u]=o):"__proto__"!==e&&(r[e]=o):r={0:o}}o=r}return o}(c,e,n,r)};function K(t,e){const n=function(t){if(!t)return P;if(void 0!==t.allowEmptyArrays&&"boolean"!=typeof t.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==t.decodeDotInKeys&&"boolean"!=typeof t.decodeDotInKeys)throw new TypeError("`decodeDotInKeys` option can only be `true` or `false`, when provided");if(null!=t.decoder&&"function"!=typeof t.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");const e=void 0===t.charset?P.charset:t.charset,n=void 0===t.duplicates?P.duplicates:t.duplicates;if("combine"!==n&&"first"!==n&&"last"!==n)throw new TypeError("The duplicates option must be either combine, first, or last");return{allowDots:void 0===t.allowDots?!0===t.decodeDotInKeys||P.allowDots:!!t.allowDots,allowEmptyArrays:"boolean"==typeof t.allowEmptyArrays?!!t.allowEmptyArrays:P.allowEmptyArrays,allowPrototypes:"boolean"==typeof t.allowPrototypes?t.allowPrototypes:P.allowPrototypes,allowSparse:"boolean"==typeof t.allowSparse?t.allowSparse:P.allowSparse,arrayLimit:"number"==typeof t.arrayLimit?t.arrayLimit:P.arrayLimit,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:P.charsetSentinel,comma:"boolean"==typeof t.comma?t.comma:P.comma,decodeDotInKeys:"boolean"==typeof t.decodeDotInKeys?t.decodeDotInKeys:P.decodeDotInKeys,decoder:"function"==typeof t.decoder?t.decoder:P.decoder,delimiter:"string"==typeof t.delimiter||(r=t.delimiter,"[object RegExp]"===Object.prototype.toString.call(r))?t.delimiter:P.delimiter,depth:"number"==typeof t.depth||!1===t.depth?+t.depth:P.depth,duplicates:n,ignoreQueryPrefix:!0===t.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof t.interpretNumericEntities?t.interpretNumericEntities:P.interpretNumericEntities,parameterLimit:"number"==typeof t.parameterLimit?t.parameterLimit:P.parameterLimit,parseArrays:!1!==t.parseArrays,plainObjects:"boolean"==typeof t.plainObjects?t.plainObjects:P.plainObjects,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:P.strictNullHandling};var r}(e);if(""===t||null==t)return n.plainObjects?Object.create(null):{};const r="string"==typeof t?function(t,e){const n={__proto__:null},r=(e.ignoreQueryPrefix?t.replace(/^\?/,""):t).split(e.delimiter,Infinity===e.parameterLimit?void 0:e.parameterLimit);let o,i=-1,u=e.charset;if(e.charsetSentinel)for(o=0;o<r.length;++o)0===r[o].indexOf("utf8=")&&("utf8=%E2%9C%93"===r[o]?u="utf-8":"utf8=%26%2310003%3B"===r[o]&&(u="iso-8859-1"),i=o,o=r.length);for(o=0;o<r.length;++o){if(o===i)continue;const t=r[o],f=t.indexOf("]="),c=-1===f?t.indexOf("="):f+1;let l,a;-1===c?(l=e.decoder(t,P.decoder,u,"key"),a=e.strictNullHandling?null:""):(l=e.decoder(t.slice(0,c),P.decoder,u,"key"),a=T(U(t.slice(c+1),e),function(t){return e.decoder(t,P.decoder,u,"value")})),a&&e.interpretNumericEntities&&"iso-8859-1"===u&&(a=F(a)),t.indexOf("[]=")>-1&&(a=C(a)?[a]:a);const s=x.call(n,l);s&&"combine"===e.duplicates?n[l]=E(n[l],a,e.arrayLimit,e.plainObjects):s&&"last"!==e.duplicates||(n[l]=a)}return n}(t,n):t;let o=n.plainObjects?Object.create(null):{};const i=Object.keys(r);for(let e=0;e<i.length;++e){const u=i[e],f=q(u,r[u],n,"string"==typeof t);o=j(o,f,n)}return!0===n.allowSparse?o:function(t){const e=[{obj:{o:t},prop:"o"}],n=[];for(let t=0;t<e.length;++t){const r=e[t],o=r.obj[r.prop],i=Object.keys(o);for(let t=0;t<i.length;++t){const r=i[t],u=o[r];"object"==typeof u&&null!==u&&-1===n.indexOf(u)&&(e.push({obj:o,prop:r}),n.push(u))}}return function(t){for(;t.length>1;){const e=t.pop(),n=e.obj[e.prop];if(y(n)){const t=[];for(let e=0;e<n.length;++e)void 0!==n[e]&&t.push(n[e]);e.obj[e.prop]=t}}}(e),t}(o)}var Z=/*#__PURE__*/function(){function t(t,e,n){var r,o;this.name=t,this.definition=e,this.bindings=null!=(r=e.bindings)?r:{},this.wheres=null!=(o=e.wheres)?o:{},this.config=n}var n=t.prototype;return n.matchesUrl=function(t){var e,n=this;if(!this.definition.methods.includes("GET"))return!1;var r=this.template.replace(/[.*+$()[\]]/g,"\\$&").replace(/(\/?){([^}?]*)(\??)}/g,function(t,e,r,o){var i,u="(?<"+r+">"+((null==(i=n.wheres[r])?void 0:i.replace(/(^\^)|(\$$)/g,""))||"[^/?]+")+")";return o?"("+e+u+")?":""+e+u}).replace(/^\w+:\/\//,""),o=t.replace(/^\w+:\/\//,"").split("?"),i=o[0],u=o[1],f=null!=(e=new RegExp("^"+r+"/?$").exec(i))?e:new RegExp("^"+r+"/?$").exec(decodeURI(i));if(f){for(var c in f.groups)f.groups[c]="string"==typeof f.groups[c]?decodeURIComponent(f.groups[c]):f.groups[c];return{params:f.groups,query:K(u)}}return!1},n.compile=function(t){var e=this;return this.parameterSegments.length?this.template.replace(/{([^}?]+)(\??)}/g,function(n,r,o){var i,u;if(!o&&[null,void 0].includes(t[r]))throw new Error("Ziggy error: '"+r+"' parameter is required for route '"+e.name+"'.");if(e.wheres[r]&&!new RegExp("^"+(o?"("+e.wheres[r]+")?":e.wheres[r])+"$").test(null!=(u=t[r])?u:""))throw new Error("Ziggy error: '"+r+"' parameter '"+t[r]+"' does not match required format '"+e.wheres[r]+"' for route '"+e.name+"'.");return encodeURI(null!=(i=t[r])?i:"").replace(/%7C/g,"|").replace(/%25/g,"%").replace(/\$/g,"%24")}).replace(this.config.absolute?/(\.[^/]+?)(\/\/)/:/(^)(\/\/)/,"$1/").replace(/\/+$/,""):this.template},e(t,[{key:"template",get:function(){var t=(this.origin+"/"+this.definition.uri).replace(/\/+$/,"");return""===t?"/":t}},{key:"origin",get:function(){return this.config.absolute?this.definition.domain?""+this.config.url.match(/^\w+:\/\//)[0]+this.definition.domain+(this.config.port?":"+this.config.port:""):this.config.url:""}},{key:"parameterSegments",get:function(){var t,e;return null!=(t=null==(e=this.template.match(/{[^}?]+\??}/g))?void 0:e.map(function(t){return{name:t.replace(/{|\??}/g,""),required:!/\?}$/.test(t)}}))?t:[]}}])}(),B=/*#__PURE__*/function(t){function r(e,r,o,i){var u;if(void 0===o&&(o=!0),(u=t.call(this)||this).t=null!=i?i:"undefined"!=typeof Ziggy?Ziggy:null==globalThis?void 0:globalThis.Ziggy,!u.t&&"undefined"!=typeof document&&document.getElementById("ziggy-routes-json")&&(globalThis.Ziggy=JSON.parse(document.getElementById("ziggy-routes-json").textContent),u.t=globalThis.Ziggy),u.t=n({},u.t,{absolute:o}),e){if(!u.t.routes[e])throw new Error("Ziggy error: route '"+e+"' is not in the route list.");u.i=new Z(e,u.t.routes[e],u.t),u.u=u.l(r)}return u}var o,u;u=t,(o=r).prototype=Object.create(u.prototype),o.prototype.constructor=o,i(o,u);var f=r.prototype;return f.toString=function(){var t=this,e=Object.keys(this.u).filter(function(e){return!t.i.parameterSegments.some(function(t){return t.name===e})}).filter(function(t){return"_query"!==t}).reduce(function(e,r){var o;return n({},e,((o={})[r]=t.u[r],o))},{});return this.i.compile(this.u)+function(t,e){let n=t;const r=function(t){if(!t)return $;if(void 0!==t.allowEmptyArrays&&"boolean"!=typeof t.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==t.encodeDotInKeys&&"boolean"!=typeof t.encodeDotInKeys)throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(null!=t.encoder&&"function"!=typeof t.encoder)throw new TypeError("Encoder has to be a function.");const e=t.charset||$.charset;if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");let n=s;if(void 0!==t.format){if(!R.call(a,t.format))throw new TypeError("Unknown format option provided.");n=t.format}const r=a[n];let o,i=$.filter;if(("function"==typeof t.filter||S(t.filter))&&(i=t.filter),o=t.arrayFormat in k?t.arrayFormat:"indices"in t?t.indices?"indices":"repeat":$.arrayFormat,"commaRoundTrip"in t&&"boolean"!=typeof t.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");return{addQueryPrefix:"boolean"==typeof t.addQueryPrefix?t.addQueryPrefix:$.addQueryPrefix,allowDots:void 0===t.allowDots?!0===t.encodeDotInKeys||$.allowDots:!!t.allowDots,allowEmptyArrays:"boolean"==typeof t.allowEmptyArrays?!!t.allowEmptyArrays:$.allowEmptyArrays,arrayFormat:o,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:$.charsetSentinel,commaRoundTrip:t.commaRoundTrip,delimiter:void 0===t.delimiter?$.delimiter:t.delimiter,encode:"boolean"==typeof t.encode?t.encode:$.encode,encodeDotInKeys:"boolean"==typeof t.encodeDotInKeys?t.encodeDotInKeys:$.encodeDotInKeys,encoder:"function"==typeof t.encoder?t.encoder:$.encoder,encodeValuesOnly:"boolean"==typeof t.encodeValuesOnly?t.encodeValuesOnly:$.encodeValuesOnly,filter:i,format:n,formatter:r,serializeDate:"function"==typeof t.serializeDate?t.serializeDate:$.serializeDate,skipNulls:"boolean"==typeof t.skipNulls?t.skipNulls:$.skipNulls,sort:"function"==typeof t.sort?t.sort:null,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:$.strictNullHandling}}(e);let o,i;"function"==typeof r.filter?(i=r.filter,n=i("",n)):S(r.filter)&&(i=r.filter,o=i);const u=[];if("object"!=typeof n||null===n)return"";const f=k[r.arrayFormat],c="comma"===f&&r.commaRoundTrip;o||(o=Object.keys(n)),r.sort&&o.sort(r.sort);const l=new WeakMap;for(let t=0;t<o.length;++t){const e=o[t];r.skipNulls&&null===n[e]||A(u,_(n[e],e,f,c,r.allowEmptyArrays,r.strictNullHandling,r.skipNulls,r.encodeDotInKeys,r.encode?r.encoder:null,r.filter,r.sort,r.allowDots,r.serializeDate,r.format,r.formatter,r.encodeValuesOnly,r.charset,l))}const p=u.join(r.delimiter);let y=!0===r.addQueryPrefix?"?":"";return r.charsetSentinel&&(y+="iso-8859-1"===r.charset?"utf8=%26%2310003%3B&":"utf8=%E2%9C%93&"),p.length>0?y+p:""}(n({},e,this.u._query),{addQueryPrefix:!0,arrayFormat:"indices",encodeValuesOnly:!0,skipNulls:!0,encoder:function(t,e){return"boolean"==typeof t?Number(t):e(t)}})},f.p=function(t){var e=this;t?this.t.absolute&&t.startsWith("/")&&(t=this.v().host+t):t=this.h();var r={},o=Object.entries(this.t.routes).find(function(n){return r=new Z(n[0],n[1],e.t).matchesUrl(t)})||[void 0,void 0];return n({name:o[0]},r,{route:o[1]})},f.h=function(){var t=this.v(),e=t.pathname,n=t.search;return(this.t.absolute?t.host+e:e.replace(this.t.url.replace(/^\w*:\/\/[^/]+/,""),"").replace(/^\/+/,"/"))+n},f.current=function(t,e){var r=this.p(),o=r.name,i=r.params,u=r.query,f=r.route;if(!t)return o;var c=new RegExp("^"+t.replace(/\./g,"\\.").replace(/\*/g,".*")+"$").test(o);if([null,void 0].includes(e)||!c)return c;var l=new Z(o,f,this.t);e=this.l(e,l);var a=n({},i,u);if(Object.values(e).every(function(t){return!t})&&!Object.values(a).some(function(t){return void 0!==t}))return!0;var s=function(t,e){return Object.entries(t).every(function(t){var n=t[0],r=t[1];return Array.isArray(r)&&Array.isArray(e[n])?r.every(function(t){return e[n].includes(t)||e[n].includes(decodeURIComponent(t))}):"object"==typeof r&&"object"==typeof e[n]&&null!==r&&null!==e[n]?s(r,e[n]):e[n]==r||e[n]==decodeURIComponent(r)})};return s(e,a)},f.v=function(){var t,e,n,r,o,i,u="undefined"!=typeof window?window.location:{},f=u.host,c=u.pathname,l=u.search;return{host:null!=(t=null==(e=this.t.location)?void 0:e.host)?t:void 0===f?"":f,pathname:null!=(n=null==(r=this.t.location)?void 0:r.pathname)?n:void 0===c?"":c,search:null!=(o=null==(i=this.t.location)?void 0:i.search)?o:void 0===l?"":l}},f.has=function(t){return this.t.routes.hasOwnProperty(t)},f.l=function(t,e){var r=this;void 0===t&&(t={}),void 0===e&&(e=this.i),null!=t||(t={}),t=["string","number"].includes(typeof t)?[t]:t;var o=e.parameterSegments.filter(function(t){return!r.t.defaults[t.name]});if(Array.isArray(t))t=t.reduce(function(t,e,r){var i,u;return n({},t,o[r]?((i={})[o[r].name]=e,i):"object"==typeof e?e:((u={})[e]="",u))},{});else if(1===o.length&&!t.hasOwnProperty(o[0].name)&&(t.hasOwnProperty(Object.values(e.bindings)[0])||t.hasOwnProperty("id"))){var i;(i={})[o[0].name]=t,t=i}return n({},this.m(e),this.j(t,e))},f.m=function(t){var e=this;return t.parameterSegments.filter(function(t){return e.t.defaults[t.name]}).reduce(function(t,r,o){var i,u=r.name;return n({},t,((i={})[u]=e.t.defaults[u],i))},{})},f.j=function(t,e){var r=e.bindings,o=e.parameterSegments;return Object.entries(t).reduce(function(t,e){var i,u,f=e[0],c=e[1];if(!c||"object"!=typeof c||Array.isArray(c)||!o.some(function(t){return t.name===f}))return n({},t,((u={})[f]=c,u));var l=c.hasOwnProperty(r[f])?r[f]:c.hasOwnProperty("id")?"id":void 0;if(void 0===l)throw new Error("Ziggy error: object passed as '"+f+"' parameter is missing route model binding key '"+r[f]+"'.");return n({},t,((i={})[f]=c[l],i))},{})},f.valueOf=function(){return this.toString()},e(r,[{key:"params",get:function(){var t=this.p();return n({},t.params,t.query)}},{key:"routeParams",get:function(){return this.p().params}},{key:"queryParams",get:function(){return this.p().query}}])}(/*#__PURE__*/f(String));return function(t,e,n,r){var o=new B(t,e,n,r);return t?o.toString():o}});
</script><link rel="preload" as="style" href="https://onramp.dev/build/assets/app-IcPq3rEs.css" /><link rel="modulepreload" as="script" href="https://onramp.dev/build/assets/app-C8l_WPc9.js" /><link rel="modulepreload" as="script" href="https://onramp.dev/build/assets/scripts-7AXplg1B.js" /><link rel="stylesheet" href="https://onramp.dev/build/assets/app-IcPq3rEs.css" /><script type="module" src="https://onramp.dev/build/assets/app-C8l_WPc9.js"></script><script type="module" src="https://onramp.dev/build/assets/scripts-7AXplg1B.js"></script></body>
</html>
