<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="security.authentication.retry_entry_point.class">Symfony\Component\Security\Http\EntryPoint\RetryAuthenticationEntryPoint</parameter>

        <parameter key="security.channel_listener.class">Symfony\Component\Security\Http\Firewall\ChannelListener</parameter>

        <parameter key="security.authentication.form_entry_point.class">Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint</parameter>
        <parameter key="security.authentication.listener.form.class">Symfony\Component\Security\Http\Firewall\UsernamePasswordFormAuthenticationListener</parameter>

        <parameter key="security.authentication.listener.basic.class">Symfony\Component\Security\Http\Firewall\BasicAuthenticationListener</parameter>
        <parameter key="security.authentication.basic_entry_point.class">Symfony\Component\Security\Http\EntryPoint\BasicAuthenticationEntryPoint</parameter>

        <parameter key="security.authentication.listener.digest.class">Symfony\Component\Security\Http\Firewall\DigestAuthenticationListener</parameter>
        <parameter key="security.authentication.digest_entry_point.class">Symfony\Component\Security\Http\EntryPoint\DigestAuthenticationEntryPoint</parameter>

        <parameter key="security.authentication.listener.x509.class">Symfony\Component\Security\Http\Firewall\X509AuthenticationListener</parameter>

        <parameter key="security.authentication.listener.anonymous.class">Symfony\Component\Security\Http\Firewall\AnonymousAuthenticationListener</parameter>

        <parameter key="security.authentication.switchuser_listener.class">Symfony\Component\Security\Http\Firewall\SwitchUserListener</parameter>

        <parameter key="security.logout_listener.class">Symfony\Component\Security\Http\Firewall\LogoutListener</parameter>
        <parameter key="security.logout.handler.session.class">Symfony\Component\Security\Http\Logout\SessionLogoutHandler</parameter>
        <parameter key="security.logout.handler.cookie_clearing.class">Symfony\Component\Security\Http\Logout\CookieClearingLogoutHandler</parameter>

        <parameter key="security.access_listener.class">Symfony\Component\Security\Http\Firewall\AccessListener</parameter>
        <parameter key="security.access_map.class">Symfony\Component\Security\Http\AccessMap</parameter>
        <parameter key="security.exception_listener.class">Symfony\Component\Security\Http\Firewall\ExceptionListener</parameter>
        <parameter key="security.context_listener.class">Symfony\Component\Security\Http\Firewall\ContextListener</parameter>

        <parameter key="security.authentication.provider.dao.class">Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider</parameter>
        <parameter key="security.authentication.provider.pre_authenticated.class">Symfony\Component\Security\Core\Authentication\Provider\PreAuthenticatedAuthenticationProvider</parameter>

        <parameter key="security.authentication.provider.anonymous.class">Symfony\Component\Security\Core\Authentication\Provider\AnonymousAuthenticationProvider</parameter>
    </parameters>

    <services>
        <service id="security.authentication.listener.anonymous" class="%security.authentication.listener.anonymous.class%" public="false">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument /> <!-- Key -->
            <argument type="service" id="logger" on-invalid="null" />
        </service>

        <service id="security.authentication.provider.anonymous" class="%security.authentication.provider.anonymous.class%" public="false">
            <argument /> <!-- Key -->
        </service>

        <service id="security.authentication.retry_entry_point" class="%security.authentication.retry_entry_point.class%" public="false">
            <argument>%request_listener.http_port%</argument>
            <argument>%request_listener.https_port%</argument>
        </service>

        <service id="security.authentication.basic_entry_point" class="%security.authentication.basic_entry_point.class%" public="false" />

        <service id="security.authentication.digest_entry_point" class="%security.authentication.digest_entry_point.class%" public="false" />

        <service id="security.channel_listener" class="%security.channel_listener.class%" public="false">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.access_map" />
            <argument type="service" id="security.authentication.retry_entry_point" />
            <argument type="service" id="logger" on-invalid="null" />
        </service>

        <service id="security.access_map" class="%security.access_map.class%" public="false" />

        <service id="security.context_listener" class="%security.context_listener.class%" public="false">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument type="collection"></argument>
            <argument /> <!-- Provider Key -->
            <argument type="service" id="logger" on-invalid="null" />
            <argument type="service" id="event_dispatcher" on-invalid="null"/>
        </service>

        <service id="security.logout_listener" class="%security.logout_listener.class%" public="false" abstract="true">
            <argument type="service" id="security.context" />
            <argument type="service" id="security.http_utils" />
            <argument /> <!-- Logout Path -->
            <argument /> <!-- Target-URL Path -->
            <argument type="service" id="security.logout.success_handler" on-invalid="null" />
        </service>
        <service id="security.logout.handler.session" class="%security.logout.handler.session.class%" public="false" />
        <service id="security.logout.handler.cookie_clearing" class="%security.logout.handler.cookie_clearing.class%" public="false" abstract="true" />

        <service id="security.authentication.form_entry_point" class="%security.authentication.form_entry_point.class%" public="false" abstract="true">
            <argument type="service" id="http_kernel" />
        </service>

        <service id="security.authentication.listener.abstract" abstract="true" public="false">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument type="service" id="security.authentication.manager" />
            <argument type="service" id="security.authentication.session_strategy" />
            <argument type="service" id="security.http_utils" />
            <argument />
            <argument type="collection"></argument>
            <argument type="service" id="security.authentication.success_handler" on-invalid="null" />
            <argument type="service" id="security.authentication.failure_handler" on-invalid="null" />
            <argument type="service" id="logger" on-invalid="null" />
            <argument type="service" id="event_dispatcher" on-invalid="null" />
        </service>

        <service id="security.authentication.listener.form"
                 class="%security.authentication.listener.form.class%"
                 parent="security.authentication.listener.abstract"
                 abstract="true">
        </service>

        <service id="security.authentication.listener.x509" class="%security.authentication.listener.x509.class%" public="false" abstract="true">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument type="service" id="security.authentication.manager" />
            <argument /> <!-- Provider-shared Key -->
            <argument /> <!-- x509 user -->
            <argument /> <!-- x509 credentials -->
            <argument type="service" id="logger" on-invalid="null" />
            <argument type="service" id="event_dispatcher" on-invalid="null"/>
        </service>

        <service id="security.authentication.listener.basic" class="%security.authentication.listener.basic.class%" public="false" abstract="true">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument type="service" id="security.authentication.manager" />
            <argument /> <!-- Provider-shared Key -->
            <argument /> <!-- Entry Point -->
            <argument type="service" id="logger" on-invalid="null" />
        </service>

        <service id="security.authentication.listener.digest" class="%security.authentication.listener.digest.class%" public="false" abstract="true">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument /> <!-- User Provider -->
            <argument /> <!-- Provider-shared Key -->
            <argument /> <!-- Entry Point -->
            <argument type="service" id="logger" on-invalid="null" />
        </service>

        <service id="security.authentication.provider.dao" class="%security.authentication.provider.dao.class%" abstract="true" public="false">
            <argument /> <!-- User Provider -->
            <argument type="service" id="security.user_checker" />
            <argument /> <!-- Provider-shared Key -->
            <argument type="service" id="security.encoder_factory" />
            <argument>%security.authentication.hide_user_not_found%</argument>
        </service>

        <service id="security.authentication.provider.pre_authenticated" class="%security.authentication.provider.pre_authenticated.class%" abstract="true" public="false">
            <argument /> <!-- User Provider -->
            <argument type="service" id="security.user_checker" />
        </service>

        <service id="security.exception_listener" class="%security.exception_listener.class%" public="false" abstract="true">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument type="service" id="security.authentication.trust_resolver" />
            <argument type="service" id="security.http_utils" />
            <argument type="service" id="security.authentication.entry_point" on-invalid="null" />
            <argument>%security.access.denied_url%</argument>
            <argument type="service" id="security.access.denied_handler" on-invalid="null" />
            <argument type="service" id="logger" on-invalid="null" />
        </service>

        <service id="security.authentication.switchuser_listener" class="%security.authentication.switchuser_listener.class%" public="false" abstract="true">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument /> <!-- User Provider -->
            <argument type="service" id="security.user_checker" />
            <argument /> <!--  Provider Key -->
            <argument type="service" id="security.access.decision_manager" />
            <argument type="service" id="logger" on-invalid="null" />
            <argument>_switch_user</argument>
            <argument>ROLE_ALLOWED_TO_SWITCH</argument>
            <argument type="service" id="event_dispatcher" on-invalid="null"/>
        </service>

        <service id="security.access_listener" class="%security.access_listener.class%" public="false">
            <tag name="monolog.logger" channel="security" />
            <argument type="service" id="security.context" />
            <argument type="service" id="security.access.decision_manager" />
            <argument type="service" id="security.access_map" />
            <argument type="service" id="security.authentication.manager" />
            <argument type="service" id="logger" on-invalid="null" />
        </service>
    </services>
</container>
