[
  {
    "path": ".gitignore",
    "content": "node_modules\n"
  },
  {
    "path": "App.js",
    "content": "import React, { useState, useEffect, useRef } from \"react\";\nimport {\n  Dimensions,\n  StyleSheet,\n  Text,\n  View,\n  TouchableOpacity,\n  Alert,\n  Platform,\n} from \"react-native\";\nimport * as Notifications from \"expo-notifications\";\nimport * as Permissions from \"expo-permissions\";\nimport Constants from \"expo-constants\";\n\nimport { FontAwesome5, Octicons, Entypo } from \"@expo/vector-icons\";\nimport colors from \"./assets/colors/colors\";\nimport * as Haptics from \"expo-haptics\";\nimport * as Device from \"expo-device\";\n\nimport Onboarding from \"react-native-onboarding-swiper\";\n\nimport Home from \"./src/screens/Home\";\n\nimport { NavigationContainer } from \"@react-navigation/native\";\nimport { createStackNavigator } from \"@react-navigation/stack\";\nimport { createBottomTabNavigator } from \"@react-navigation/bottom-tabs\";\nimport { enableScreens } from \"react-native-screens\";\n\nimport Article from \"./src/screens/Article\";\nimport Propositions from \"./src/screens/Propositions\";\nimport ListPropositions from \"./src/screens/ListPropositions\";\nimport CandidateProfile from \"./src/screens/CandidateProfile\";\nimport Results from \"./src/screens/Results\";\nimport PropositionDetails from \"./src/screens/PropositionDetails\";\nimport Settings from \"./src/screens/Settings\";\nimport AllThemesList from \"./src/screens/AllThemesList\";\nimport { SafeAreaProvider } from \"react-native-safe-area-context\";\nimport ThemeByCandidate from \"./src/screens/ThemeByCandidate\";\nimport CandidatesResults from \"./src/screens/CandidatesResults\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\n\nimport Team from \"./src/screens/Team\";\nimport FirstScreen from \"./src/screens/Set-upScreens/First\";\nimport SecondScreen from \"./src/screens/Set-upScreens/Second\";\nimport FavoritesPropositions from \"./src/screens/FavoritesPropositions\";\nimport ShareToSocial from \"./src/screens/Share\";\nimport Eligible from \"./src/screens/Eligible\";\nimport ThirdScreen from \"./src/screens/Set-upScreens/Third\";\n\nenableScreens();\nconst Stack = createStackNavigator();\nconst Tab = createBottomTabNavigator();\n\nconst TabNavigator = () => (\n  <Tab.Navigator\n    screenOptions={{\n      tabBarStyle: styles.tabBar,\n      tabBarActiveTintColor: colors.newPrimary,\n      tabBarShowLabel: false,\n      headerShown: false,\n    }}\n  >\n    <Tab.Screen\n      name={\"Home\"}\n      component={Home}\n      listeners={() => ({\n        tabPress: () => {\n          Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n        },\n      })}\n      options={{\n        tabBarIcon: ({ color, size }) => (\n          <FontAwesome5 name={\"vote-yea\"} color={color} size={35} />\n        ),\n      }}\n    />\n    <Tab.Screen\n      name={\"Resultats\"}\n      component={Results}\n      listeners={() => ({\n        tabPress: () => {\n          Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n        },\n      })}\n      options={{\n        tabBarIcon: ({ color, size }) => (\n          <FontAwesome5 name={\"award\"} color={color} size={35} />\n        ),\n      }}\n    />\n    <Tab.Screen\n      name={\"Propositions\"}\n      component={Propositions}\n      listeners={() => ({\n        tabPress: () => {\n          Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n        },\n      })}\n      options={{\n        tabBarIcon: ({ color, size }) => (\n          <Octicons name={\"tasklist\"} color={color} size={35} />\n        ),\n      }}\n    />\n    {/* <Tab.Screen\n      name={\"Election\"}\n      component={Election}\n      listeners={() => ({\n        tabPress: () => {\n          Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n        },\n      })}\n      options={{\n        tabBarIcon: ({ color, size }) => (\n          <MaterialIcons name={\"how-to-vote\"} color={color} size={35} />\n        ),\n      }}\n    /> */}\n  </Tab.Navigator>\n);\n\nexport default function App() {\n  const [isSetUp, setIsSetUp] = useState(true);\n  const [hasAccepted, setHasAccepted] = useState(false);\n\n  useEffect(async () => {\n    try {\n      await AsyncStorage.getItem(\"@isSetUp2\").then((response) => {\n        if (response == null) {\n          setIsSetUp(false);\n        }\n      });\n    } catch (e) {\n      console.log(e);\n    }\n  }, []);\n\n  const [expoPushToken, setExpoPushToken] = useState(\"\");\n  const [notification, setNotification] = useState(false);\n  const notificationListener = useRef();\n  const responseListener = useRef();\n\n  useEffect(() => {\n    registerForPushNotificationsAsync().then((token) =>\n      setExpoPushToken(token)\n    );\n\n    notificationListener.current =\n      Notifications.addNotificationReceivedListener((notification) => {\n        setNotification(notification);\n      });\n\n    responseListener.current =\n      Notifications.addNotificationResponseReceivedListener((response) => {\n        console.log(response);\n      });\n\n    return () => {\n      Notifications.removeNotificationSubscription(\n        notificationListener.current\n      );\n      Notifications.removeNotificationSubscription(responseListener.current);\n    };\n  }, []);\n\n  async function registerForPushNotificationsAsync() {\n    let token;\n    if (Constants.isDevice) {\n      const { status: existingStatus } =\n        await Notifications.getPermissionsAsync();\n      let finalStatus = existingStatus;\n      if (existingStatus !== \"granted\") {\n        const { status } = await Notifications.requestPermissionsAsync();\n        finalStatus = status;\n      }\n      if (finalStatus !== \"granted\") {\n        return;\n      }\n      token = (await Notifications.getExpoPushTokenAsync()).data;\n      console.log(token);\n    } else {\n      alert(\n        \"L'appareil ne doit pas être un simulateur pour recevoir les notifications\"\n      );\n    }\n\n    if (Platform.OS === \"android\") {\n      Notifications.setNotificationChannelAsync(\"default\", {\n        name: \"default\",\n        importance: Notifications.AndroidImportance.MAX,\n        vibrationPattern: [0, 250, 250, 250],\n        lightColor: \"#FF231F7C\",\n      });\n    }\n\n    return token;\n  }\n\n  if (isSetUp) {\n    return (\n      <SafeAreaProvider>\n        <NavigationContainer>\n          <Stack.Navigator>\n            <Stack.Screen\n              name={\"TabNavigator\"}\n              component={TabNavigator}\n              options={{ headerShown: false }}\n            />\n            <Stack.Screen\n              name={\"Article\"}\n              component={Article}\n              options={{ headerShown: false }}\n            />\n            <Stack.Screen\n              name={\"ListPropositions\"}\n              component={ListPropositions}\n              options={{ headerShown: false }}\n            />\n            <Stack.Screen\n              name={\"CandidateProfile\"}\n              component={CandidateProfile}\n              options={{ headerShown: false }}\n            />\n            <Stack.Screen\n              name={\"AllThemesList\"}\n              component={AllThemesList}\n              options={{ headerShown: false }}\n            />\n            <Stack.Screen\n              name={\"ThemeByCandidate\"}\n              component={ThemeByCandidate}\n              options={{ headerShown: false }}\n            />\n            <Stack.Screen\n              name={\"FavoritesPropositions\"}\n              component={FavoritesPropositions}\n              options={{ headerShown: false }}\n            />\n            <Stack.Group screenOptions={{ presentation: \"modal\" }}>\n              <Stack.Screen\n                name={\"PropositionDetails\"}\n                component={PropositionDetails}\n                options={{ headerShown: false }}\n              />\n            </Stack.Group>\n            <Stack.Group screenOptions={{ presentation: \"modal\" }}>\n              <Stack.Screen\n                name={\"Settings\"}\n                component={Settings}\n                options={{ headerShown: false }}\n              />\n            </Stack.Group>\n            <Stack.Group screenOptions={{ presentation: \"modal\" }}>\n              <Stack.Screen\n                name={\"CandidateResults\"}\n                component={CandidatesResults}\n                options={{ headerShown: false }}\n              />\n            </Stack.Group>\n            <Stack.Group screenOptions={{ presentation: \"modal\" }}>\n              <Stack.Screen\n                name={\"Team\"}\n                component={Team}\n                options={{ headerShown: false }}\n              />\n            </Stack.Group>\n            <Stack.Group screenOptions={{ presentation: \"modal\" }}>\n              <Stack.Screen\n                name={\"Share\"}\n                component={ShareToSocial}\n                options={{ headerShown: false }}\n              />\n            </Stack.Group>\n            <Stack.Group screenOptions={{ presentation: \"modal\" }}>\n              <Stack.Screen\n                name={\"Eligible\"}\n                component={Eligible}\n                options={{ headerShown: false }}\n              />\n            </Stack.Group>\n          </Stack.Navigator>\n        </NavigationContainer>\n      </SafeAreaProvider>\n    );\n  } else {\n    const toggleDoneSetUp = async () => {\n      try {\n        await AsyncStorage.setItem(\"@isSetUp2\", \"true\").then(async () => {\n          setIsSetUp(true);\n          // Utilisateur inscrit\n        });\n      } catch (e) {\n        Alert.alert(\n          \"Oups 😖\",\n          \"Une erreur est survenue, réessaye dans quelques instants\"\n        );\n      }\n    };\n\n    return (\n      <Onboarding\n        onDone={() => toggleDoneSetUp()}\n        pages={[\n          {\n            backgroundColor: \"#DE3D59\",\n            image: <FirstScreen />,\n            title: null,\n            subtitle: null,\n          },\n          {\n            backgroundColor: \"#63A5C1\",\n            image: <SecondScreen />,\n            title: null,\n            subtitle: null,\n          },\n          {\n            backgroundColor: \"#4F3AA8\",\n            image: <ThirdScreen />,\n            title: null,\n            subtitle: null,\n          },\n          {\n            backgroundColor: \"#DE3D59\",\n            image: (\n              <View\n                style={{\n                  justifyContent: \"center\",\n                  alignItems: \"center\",\n                  marginTop: -25,\n                }}\n              >\n                <Text\n                  style={{\n                    marginHorizontal: 40,\n                    textAlign: \"center\",\n                    color: \"white\",\n                    fontSize: Dimensions.get(\"window\").width * 0.09,\n                    marginBottom: Dimensions.get(\"window\").width * 0.2,\n                    fontWeight: \"bold\",\n                    marginTop: -60,\n                  }}\n                >\n                  🤝\n                </Text>\n                <Text\n                  style={{\n                    marginHorizontal: 40,\n                    textAlign: \"center\",\n                    color: \"white\",\n                    fontSize: Dimensions.get(\"window\").width * 0.07,\n                    marginBottom: Dimensions.get(\"window\").width * 0.08,\n                    fontWeight: \"bold\",\n                    marginTop: -60,\n                  }}\n                >\n                  Avant de commencer\n                </Text>\n\n                <Text\n                  style={{\n                    paddingHorizontal: 30,\n                    textAlign: \"center\",\n                    color: \"white\",\n                    fontWeight: \"500\",\n                    marginTop: -10,\n                    fontSize: 20,\n                  }}\n                >\n                  Aucune donnée n'est collectée par ELYZE lors de l'utilisation\n                  de l'app 🕵️\n                </Text>\n\n                <TouchableOpacity\n                  onPress={() => toggleDoneSetUp()}\n                  style={styles.endSetUpButton}\n                >\n                  <Text\n                    style={{\n                      fontSize: 20,\n                      fontWeight: \"bold\",\n                      color: colors.primary,\n                    }}\n                  >\n                    CONTINUER\n                  </Text>\n                </TouchableOpacity>\n              </View>\n            ),\n            title: null,\n            subtitle: null,\n          },\n        ]}\n        showDone={false}\n        showSkip={false}\n        nextLabel={\n          <View\n            style={{\n              width: 35,\n              height: 35,\n              backgroundColor: \"white\",\n              borderRadius: 30,\n              justifyContent: \"center\",\n              alignItems: \"center\",\n            }}\n          >\n            <Entypo name={\"chevron-right\"} size={24} color={colors.primary} />\n          </View>\n        }\n        bottomBarHeight={80}\n      />\n    );\n  }\n}\n\nconst styles = StyleSheet.create({\n  tabBar: {\n    height: Dimensions.get(\"window\").height * 0.13,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 5,\n    },\n    shadowOpacity: 0.36,\n    shadowRadius: 6.68,\n\n    elevation: 11,\n    paddingHorizontal: Dimensions.get(\"window\").width * 0.19,\n  },\n  textInputContainer: {\n    paddingVertical: 10,\n    paddingHorizontal: 10,\n    width: Dimensions.get(\"window\").width * 0.8,\n    height: Dimensions.get(\"window\").height * 0.07,\n    borderRadius: Dimensions.get(\"window\").height * 0.015,\n    backgroundColor: \"white\",\n    fontSize: Dimensions.get(\"window\").width * 0.05,\n  },\n  genreButtonContainer: {\n    width: Dimensions.get(\"window\").width * 0.23,\n    height: Dimensions.get(\"window\").height * 0.06,\n    borderRadius: Dimensions.get(\"window\").height * 0.015,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  textInputContainerForBirth: {\n    paddingVertical: 10,\n    paddingHorizontal: 10,\n    width: Dimensions.get(\"window\").width * 0.8,\n    height: Dimensions.get(\"window\").height * 0.07,\n    borderRadius: Dimensions.get(\"window\").height * 0.015,\n    backgroundColor: \"white\",\n    fontSize: Dimensions.get(\"window\").width * 0.05,\n    borderWidth: 1,\n    borderColor: \"#D85F71\",\n  },\n  endSetUpButton: {\n    position: \"absolute\",\n    bottom: -Dimensions.get(\"window\").height * 0.09,\n    height: Dimensions.get(\"window\").width * 0.12,\n    width: \"75%\",\n    backgroundColor: \"white\",\n    borderRadius: Dimensions.get(\"window\").height * 0.02,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  },\n});\n"
  },
  {
    "path": "README.md",
    "content": "# Application ELYZE\nNote :\n- Le fichier 'google-services.json' mentionné dans 'app.json' ne sert que pour la configuration des notifications push avec Firebase (voir https://docs.expo.dev/push-notifications/using-fcm/ pour plus de détails).\n- ELYZE ne nécessite pas de connexion internet pour fonctionner, toutes les propositions sont enregistrées en local.\n<br>\nVersion actuelle : 1.3\n<br>\n© François Mari, 2022\n"
  },
  {
    "path": "app.json",
    "content": "{\n  \"expo\": {\n    \"name\": \"Elyze\",\n    \"slug\": \"ELYZE\",\n    \"version\": \"1.3\",\n    \"orientation\": \"portrait\",\n    \"icon\": \"./assets/icon.png\",\n    \"splash\": {\n      \"image\": \"./assets/splash.png\",\n      \"resizeMode\": \"contain\",\n      \"backgroundColor\": \"#ffffff\"\n    },\n    \"plugins\": [\n      [\n        \"expo-notifications\",\n        {\n          \"icon\": \"./local/assets/notification-icon.png\",\n          \"color\": \"#ffffff\"\n        }\n      ]\n    ],\n    \"updates\": {\n      \"fallbackToCacheTimeout\": 0\n    },\n    \"assetBundlePatterns\": [\n      \"**/*\"\n    ],\n    \"ios\": {\n      \"supportsTablet\": false,\n      \"bundleIdentifier\": \"com.lesengages.elyze\",\n      \"buildNumber\": \"1.3\"\n    },\n    \"android\": {\n      \"package\": \"com.lesengages.elyze\",\n      \"versionCode\": 22,\n      \"permissions\": [],\n      \"googleServicesFile\": \"./google-services.json\",\n      \"adaptiveIcon\": {\n        \"foregroundImage\": \"./assets/icon.png\",\n        \"backgroundColor\": \"#FFFFFF\"\n      }\n    },\n    \"web\": {\n      \"favicon\": \"./assets/favicon.png\"\n    }\n  }\n}\n"
  },
  {
    "path": "assets/colors/colors.js",
    "content": "const colors = {\n    primary: '#E9556F',\n    moreMenu: '#F58989',\n    newPrimary: '#FE3956',\n    bottomCardColor: \"#7BB5F7\",\n    dislikeButton: \"#FC3B58\",\n    likeButton: \"#61CF54\"\n}\n\nexport default colors;"
  },
  {
    "path": "assets/data/candidates/candidatesList.js",
    "content": "const candidatesList = [\n    {\n        id: 1,\n        firstname: 'Emmanuel',\n        lastname: 'Macron',\n        bgColor: '#4C9FB9',\n        age: 43,\n        image: require('../../images/candidates/macron/macron-fixe.png'),\n        imageProfile: require('../../images/candidates/macron/macron-profile.png'),\n        pictureCredits: \"© Europe 1\",\n        groupe: 'La République en marche',\n        firstLinearColor: \"#2c3e50\",\n        secondLinearColor: \"#4ca1af\",\n        work: 'Président de la République',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '🍔',\n                anecdoteText: 'Son péché mignon culinaire : le cordon bleu',\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '🎶',\n                anecdoteText: 'Sa musique préférée : “L’envie”, Johnny Hallyday',\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '💭',\n                anecdoteText: 'Son rêve de jeunesse : écrire des romans',\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '👨🏻‍🎨',\n                anecdoteText: 'Son tableau préféré : Les Demoiselles d’Avignon de Picasso',\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '🍿',\n                anecdoteText: 'L’un de ses films préférés : Les Tontons flingueurs',\n            },\n        ],\n        studies: \"Sciences Po Paris, Université de Nanterre, ENA\",\n    },\n    {\n        id: 2,\n        firstname: 'Anne',\n        lastname: 'Hidalgo',\n        bgColor: '#DE5B70',\n        age: 62,\n        image: require('../../images/candidates/hidalgo/hidalgo-fixe.png'),\n        imageProfile: require('../../images/candidates/hidalgo/hidalgo-profile.png'),\n        pictureCredits: \"© Eric Dessons/JDD/SIPA\",\n        groupe: 'Parti Socialiste',\n        firstLinearColor: \"#904e95\",\n        secondLinearColor: \"#e96443\",\n        work: 'Maire de Paris',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '🍿',\n                anecdoteText: 'Son film préféré : L’étoffe des héros de  Philip Kaufman',\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '🇪🇸',\n                anecdoteText: 'Son autre nationalité : espagnole',\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '📺',\n                anecdoteText: 'Sa série préféré : House of Cards',\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '😯',\n                anecdoteText: 'Son véritable prénom : Ana',\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '🕵🏻‍♀️',\n                anecdoteText: 'Son ancien métier : inspectrice du travail'\n            },\n        ],\n        studies: \"Université Jean-Moulin- Lyon- III\",\n    },\n    {\n        id: 3,\n        firstname: 'Yannick',\n        lastname: 'Jadot',\n        bgColor: '#39AC40',\n        age: 54,\n        image: require('../../images/candidates/jadot/jadot-fixe.png'),\n        imageProfile: require('../../images/candidates/jadot/jadot-profile.png'),\n        pictureCredits: \"© Sebastien SALOM-GOMIS/AFP\",\n        groupe: 'EELV',\n        firstLinearColor: \"#56ab2f\",\n        secondLinearColor: \"#a8e063\",\n        work: 'Député européen',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '👩‍❤️‍👨',\n                anecdoteText: 'Sa compagne : la journaliste d’investigation Isabelle Saporta',\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '🔫',\n                anecdoteText: 'Ses films préférés : les westerns',\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '✊',\n                anecdoteText: 'Il a participé à la création du mouvement “La Déferlante” en 1986',\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '🍃',\n                anecdoteText: 'Son ancienne vie : militant pour l’ONG Greenpeace',\n            },\n        ],\n        studies: \"Université Paris Dauphine\",\n    },\n    {\n        id: 4,\n        firstname: 'Jean-Luc',\n        lastname: 'Mélenchon',\n        bgColor: '#CC5753',\n        age: 70,\n        image: require('../../images/candidates/melenchon/melenchon-fixe.png'),\n        imageProfile: require('../../images/candidates/melenchon/melenchon-profile.png'),\n        pictureCredits: \"© MAXPPP / REMY GABALDA\",\n        groupe: 'La France Insoumise',\n        firstLinearColor: \"#932525\",\n        secondLinearColor: \"#e74c3c\",\n        work: 'Député français',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '🍿',\n                anecdoteText: 'Un de ses films préférés : Little Big Man'\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '📺',\n                anecdoteText: 'Sa série préférée : Un gars, Une fille',\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '👨🏻‍🎨',\n                anecdoteText: 'Son peintre préféré : Picasso',\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '🎼',\n                anecdoteText: 'Son compositeur préféré : Mozart',\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '🕺🏻',\n                anecdoteText: 'Il écoute \"Alors on danse\" de Stromae avant ses meetings',\n            },\n        ],\n        studies: \"Licences de philo et de lettres modernes, Université de Besançon\",\n    },\n    {\n        id: 5,\n        firstname: 'Nathalie',\n        lastname: 'Arthaud',\n        bgColor: '#DA3730',\n        age: 51,\n        image: require('../../images/candidates/arthaud/arthaud-fixe.png'),\n        imageProfile: require('../../images/candidates/arthaud/arthaud-profile.png'),\n        pictureCredits: \"© Le Point, 2021\",\n        groupe: 'Lutte ouvrière',\n        firstLinearColor: \"#cb2d3e\",\n        secondLinearColor: \"#ef473a\",\n        work: 'Professeure',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '💇‍♀️',\n                anecdoteText: 'Son rêve de jeunesse : devenir coiffeuse',\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '📚',\n                anecdoteText: 'Son auteure préférée : Tracy Chevalier',\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '📺',\n                anecdoteText: 'Sa série préférée : Un village français',\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '🎶',\n                anecdoteText: 'Sa chanteuse préférée : Amy Winehouse',\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '🍿',\n                anecdoteText: 'Son film préféré : Thelma et Louise de Ridley Scott',\n            },\n        ],\n        studies: \"Études d’économie-gestion, obtention du CAPES et de l’agrégation d’économie et de gestion\",\n    },\n    {\n        id: 8,\n        firstname: 'Valérie',\n        lastname: 'Pécresse',\n        bgColor: '#1F3B73',\n        age: 54,\n        image: require('../../images/candidates/pecresse/pecresse-fixe.png'),\n        imageProfile: require('../../images/candidates/pecresse/pecresse-profile.png'),\n        pictureCredits: \"© CARINE SCHMITT / HANS LUCAS / AFP\",\n        groupe: 'Les Républicains',\n        firstLinearColor: \"#3a6073\",\n        secondLinearColor: \"#3a7bd5\",\n        work: 'Présidente du Conseil régional d’Île-de-France',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '🤷🏼‍♀️',\n                anecdoteText: 'Son premier lien avec la politique : afin d’apprendre le russe, elle intègre un camp d’été des jeunesses communistes à l’âge de 15 ans',\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '🇯🇵',\n                anecdoteText: 'Son talent caché : elle parle japonais grâce à son travail en tant que vendeuse à Tokyo durant sa jeunesse',\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '📚',\n                anecdoteText: 'Son livre préféré : Le Silence de la mer de Vercors',\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '😎',\n                anecdoteText: 'Son pedigree : elle est arrivée seconde du classement de sortie à l’ENA',\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '🗺',\n                anecdoteText: 'À 13 ans, elle lisait La Comédie Humaine, soulignait au crayon à papier les adresses nommées, et les visitait ensuite une par une',\n            },\n        ],\n        studies: \"HEC Paris, ENA\",\n    },\n    {\n        id: 9,\n        firstname: 'Philippe',\n        lastname: 'Poutou',\n        bgColor: '#CD2C2A',\n        age: 54,\n        image: require('../../images/candidates/poutou/poutou-fixe.png'),\n        imageProfile: require('../../images/candidates/poutou/poutou-profile.png'),\n        pictureCredits: \"© UGO AMEZ/SIPA\",\n        groupe: 'Nouveau Parti anticapitaliste',\n        firstLinearColor: \"#7a2828\",\n        secondLinearColor: \"#a73737\",\n        work: 'Conseiller métropolitain et municipale',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '🍿',\n                anecdoteText: 'Son film préféré : Les Temps modernes de Chaplin',\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '📚',\n                anecdoteText: 'Son livre préféré : Mon traitre de Sorj Chalandon',\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '📺',\n                anecdoteText: 'Sa série préférée : Baron Noir'\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '🎶',\n                anecdoteText: 'Sa musique préférée : Salut à toi de Bérurier Noir'\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '👨🏻‍🎨',\n                anecdoteText: 'Son artiste préféré : Banksy',\n            },\n        ],\n        studies: null,\n    },\n    {\n        id: 10,\n        firstname: 'Jean',\n        lastname: 'Lassalle',\n        bgColor: '#547BBC',\n        age: 66,\n        image: require('../../images/candidates/lassalle/lassalle-fixe.png'),\n        imageProfile: require('../../images/candidates/lassalle/lassalle-profile.png'),\n        pictureCredits: \"© POL EMILE / SIPA/SIPA\",\n        groupe: 'Résistons !',\n        firstLinearColor: \"#2c3e50\",\n        secondLinearColor: \"#3498db\",\n        work: 'Député français',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: '🍔',\n                anecdoteText: 'En 2006, il a effectué une grève de la faim de 39 jours pour empêcher la délocalisation d’une usine'\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '🦺',\n                anecdoteText: 'En 2018, il a été condamné à 1600€ d’amende pour avoir porté un gilet jaune à l’Assemblée Nationale'\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '🗣',\n                anecdoteText: 'Sa langue maternelle : le béarnais (langue régionale occitano-romans du Béarn)'\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '🚗',\n                anecdoteText: 'Il a repassé deux fois son permis de conduire'\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '📺',\n                anecdoteText: 'Sa série préférée : Desperate Housewives',\n            },\n        ],\n        studies: \"Études de latin et de grec\",\n    },\n    {\n        id: 11,\n        firstname: 'Nicolas',\n        lastname: 'Dupont-Aignan',\n        bgColor: '#377EBE',\n        age: 60,\n        image: require('../../images/candidates/dupont-aignan/dupont-aignan-fixe.png'),\n        imageProfile: require('../../images/candidates/dupont-aignan/dupont-aignan-profile.png'),\n        pictureCredits: \"© AFP\",\n        groupe: 'Debout la France !',\n        firstLinearColor: \"#457fca\",\n        secondLinearColor: \"#5691c8\",\n        work: 'Député français',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: \"🏫\",\n                anecdoteText: \"À 13 ans, il milite pour la candidature à la présidentielle de Jacques Chaban-Delmas, et obtient de très mauvaises notes en 4ème\",\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: \"📚\",\n                anecdoteText: \"Son livre préféré : Les chênes qu'on abat d'André Malraux\",\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: \"📺\",\n                anecdoteText: \"Sa série préférée : Columbo\",\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: \"🍿\",\n                anecdoteText: \"Son film préféré : La vie et rien d'autre de Tavernier\",\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: \"👨🏻‍💼\",\n                anecdoteText: \"Son parcours : il a travaillé dans les années 90 pour l’ex-candidat Michel Barnier et François Bayrou\",\n            },\n        ],\n        studies: \"Sciences Po Paris, Université Paris Dauphine, ENA\",\n    },\n    {\n        id: 12,\n        firstname: 'Marine',\n        lastname: 'Le Pen',\n        bgColor: '#1C4470',\n        age: 53,\n        image: require('../../images/candidates/le-pen/le-pen-fixe.png'),\n        imageProfile: require('../../images/candidates/le-pen/le-pen-profile.png'),\n        pictureCredits: \"© Jonathan Grelier / AFP\",\n        groupe: 'Rassemblement National',\n        firstLinearColor: \"#525252\",\n        secondLinearColor: \"#3d72b4\",\n        work: 'Députée française',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: \"👨‍👩‍👦‍👦\",\n                anecdoteText: \"Son vrai prénom : Marion (comme sa célèbre nièce)\",\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: '🐈',\n                anecdoteText: \"Sa passion : les chats (elle en a 11 !)\",\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: '🍿',\n                anecdoteText: \"Son film préféré : Le Père Noël est une ordure\",\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: '👨🏻‍🎨',\n                anecdoteText: \"Son peintre préféré : Botticelli\",\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: '📚',\n                anecdoteText: \"Son livre préféré : La légende des siècles, Victor Hugo\",\n            },\n        ],\n        studies: \"Université Paris II Panthéon-Assas\",\n    },\n    {\n        id: 13,\n        firstname: 'Eric',\n        lastname: 'Zemmour',\n        bgColor: '#08025B',\n        age: 63,\n        image: require('../../images/candidates/zemmour/zemmour-fixe.png'),\n        imageProfile: require('../../images/candidates/zemmour/zemmour-profile.png'),\n        pictureCredits: \"© RTS\",\n        groupe: 'Reconquête',\n        firstLinearColor: \"#000428\",\n        secondLinearColor: \"#004e92\",\n        work: 'Ancien journaliste',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: \"🗞\",\n                anecdoteText: \"Son plus grand succès médiatique : une augmentation de plus de 170% de téléspectateurs pour la chaîne CNews à son arrivée\",\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: \"😖\",\n                anecdoteText: \"Son plus grand échec : Il a échoué deux fois au concours de l’ENA (École Nationale d'Administration)\",\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: \"🤷🏻‍♂️\",\n                anecdoteText: \"En 1981 et en 1988, Éric Zemmour a voté à gauche en choisissant François Mitterrand\",\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: \"📖\",\n                anecdoteText: \"Son premier véritable roman, Le Dandy Rouge, est une biographie romancée du socialiste allemand Ferdinand Lassalle (1825-1864)\",\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: \"📚\",\n                anecdoteText: \"Un de ses livres préférés : Guerre et paix, de Léon Tolstoï\",\n            }\n        ],\n        studies: \"Sciences Po Paris\",\n    },\n    {\n        id: 15,\n        firstname: 'Fabien',\n        lastname: 'Roussel',\n        bgColor: '#D02C35',\n        age: 52,\n        image: require('../../images/candidates/roussel/roussel-fixe.png'),\n        imageProfile: require('../../images/candidates/roussel/roussel-profile.png'),\n        groupe: 'Parti communiste français',\n        pictureCredits: \"© Alain Jocard / AFP\",\n        firstLinearColor: \"#e73827\",\n        secondLinearColor: \"#f85032\",\n        work: 'Secrétaire national du Parti communiste français',\n        favorites: [\n            {\n                id: 1,\n                anecdote: true,\n                anecdoteEmoji: \"📺\",\n                anecdoteText: \"Son début de carrière : journaliste reporter d’image pour France 3 Ardennes\",\n            },\n            {\n                id: 2,\n                anecdote: true,\n                anecdoteEmoji: \"🥪\",\n                anecdoteText: \"Son plat favori : la salade de pommes de terre aux harengs\",\n            },\n            {\n                id: 3,\n                anecdote: true,\n                anecdoteEmoji: \"👨🏻‍✈️\",\n                anecdoteText: \"Son prénom a été donné en hommage au Colonel Fabien\",\n            },\n            {\n                id: 4,\n                anecdote: true,\n                anecdoteEmoji: \"⛺️\",\n                anecdoteText: \"Ses vacances : il pratique le camping en tente en Corse\",\n            },\n            {\n                id: 5,\n                anecdote: true,\n                anecdoteEmoji: \"✊\",\n                anecdoteText: \"Son premier combat politique : lutter contre l’apartheid et pour la libération de Nelson Mandela\",\n            },\n        ],\n        studies: \"CFPJ (études de journalisme)\",\n    },\n\n];\n\nexport default candidatesList;"
  },
  {
    "path": "assets/data/more/engagementList.js",
    "content": "const engagementList = [\n    {\n        id: 1,\n        name: 'Les Engagés',\n        description: '......',\n        image: require('../../images/allerPlusLoin/engagement/les-engages.png'),\n        websiteLink: 'https://www.youtube.com/channel/UCbXWhsd805LfcbAy7xL9d-A',\n    },\n    {\n        id: 2,\n        name: 'A voté',\n        description: '......',\n        image: require('../../images/allerPlusLoin/engagement/a-vote.png'),\n        websiteLink: 'https://www.youtube.com/channel/UCbXWhsd805LfcbAy7xL9d-A',\n    },\n    {\n        id: 3,\n        name: 'Le parlement des étudiants',\n        description: '......',\n        image: require('../../images/allerPlusLoin/engagement/parlement-etudiants.png'),\n        websiteLink: 'https://www.youtube.com/channel/UCbXWhsd805LfcbAy7xL9d-A',\n    },\n];\n\nexport default engagementList;"
  },
  {
    "path": "assets/data/more/learnCategories.js",
    "content": "const learnCategories = [\n    {\n        id: 1,\n        title: 'Le Président',\n        description: 'Directement élu par les citoyens, le Président de la République Française est le chef de l’Etat.',\n        image: require('../../images/allerPlusLoin/comprendre/macron.png'),\n        articleContent: \"<p>Le Président de la République est le chef de l’Etat. C’est l’arbitre suprême de la vie politique et le chef du pouvoir exécutif. Toute la vie politique nationale est ordonnée autours de lui.<br><br><img src='https://www.passpolitique.fr/wp-content/uploads/2019/08/7797687973_emmanuel-macron-le-20-mai-2019.jpg' /><br><br>En France, l’institution du président de la République apparaît avec la IIe République en 1848. Il a un rôle politique relativement effacé jusqu’à la fin de la IVe République. La constitution de la Ve République (1958) renforce les pouvoirs du président de la République, qui partage dorénavant le pouvoir exécutif avec le Premier ministre : on parle de régime semi-présidentiel<br>L’élection présidentielle est un temps fort de notre vie politique. Depuis la réforme constitutionnelle de 1962, le président de la République française est élu au suffrage universel direct. Cela signifie qu’il est directement élu par les citoyens français. Avant cette réforme, le président était élu au suffrage universel indirect par un « collège » constitué des parlementaires (députés et sénateurs) et d’élus locaux.<br>Son mandat dure 5 ans. Le quinquennat a été instauré à la suite du référendum du 24 septembre 2000. Avant, le Président de la République restait 7 ans au pouvoir, le temps d’un septennat. Nicolas Sarkozy a décidé de limiter à deux mandats consécutifs de 5 ans l’exercice du pouvoir présidentiel.<br></p>\",\n    },\n    {\n        id: 2,\n        title: 'Le Premier ministre',\n        description: 'Nommé par le Président de la République, le Premier ministre est le chef du Gouvernement.',\n        image: require('../../images/allerPlusLoin/comprendre/jean-castex.png'),\n        articleContent: 'test 2<br>autre <b>test 2</b>',\n    },\n    {\n        id: 3,\n        title: 'La Constitution',\n        description: 'Nommé par le Président de la République, le Premier ministre est le chef du Gouvernement.',\n        image: require('../../images/allerPlusLoin/comprendre/constitution.png'),\n        articleContent: 'test 2<br>autre <b>test 2</b>',\n    },\n    {\n        id: 4,\n        title: 'Le gouvernement',\n        description: 'Nommé par le Président de la République, le Premier ministre est le chef du Gouvernement.',\n        image: require('../../images/allerPlusLoin/comprendre/constitution.png'),\n        articleContent: 'test 2<br>autre <b>test 2</b>',\n    }\n]\n\nexport default learnCategories;"
  },
  {
    "path": "assets/data/more/partners.js",
    "content": "const partners = [\n    {\n        id: 1,\n        name: 'Le Crayon',\n        description: 'Des débats d\\'idées sur des questions d\\'actualité',\n        image: require('../../images/allerPlusLoin/informer/le-crayon.png'),\n        websiteLink: 'https://www.youtube.com/channel/UCbXWhsd805LfcbAy7xL9d-A',\n    },\n    {\n        id: 2,\n        name: 'Fastinfos',\n        description: 'L\\'info rapide et accessible dans votre feed Instagram',\n        image: require('../../images/allerPlusLoin/informer/fastinfos.png'),\n    }\n];\n\nexport default partners;"
  },
  {
    "path": "assets/data/propositions/firstPropositions.js",
    "content": "const firstPropositions = [\n  {\n    id: 230,\n    articleContent:\n      \"Ce “Pass culture” à pour objectif d’offrir à tous les jeunes de 15 à 18 ans une valeur de 500€ (actuellement 300) pour des biens culturels. Il s’agit de rendre accessible la culture à tous, et de stimuler l’économie française. Exemples : Cours de musique, livres, séances de cinéma, places de concert...\",\n    firstPropositions: 1,\n    idCandidat: 1,\n    idTheme: 7,\n    source: \"Proposition du programme de 2017\",\n    title: \"Mettre en place un “Pass culture” pour les jeunes\",\n  },\n  {\n    id: 219,\n    articleContent:\n      \"Il s’agirait d’un service obligatoire de 3 à 6 mois, plus civique que militaire, qui remplacerait la journée défense et citoyenneté. Son objectif est la création d’une cohésion nationale de toutes les classe sociales au moyen d’une camaraderie formée autour des valeurs républicaines.\",\n    firstPropositions: 1,\n    idCandidat: 1,\n    idTheme: 3,\n    source: \"L’Express, proposition du programme de 2017\",\n    title: \"Instaurer un service national universel\",\n  },\n  {\n    id: 195,\n    articleContent:\n      \"Cette proposition vise à valoriser davantage le métier d’enseignant et le rendre plus attractif. Le salaire moyen d’un enseignant en France est actuellement de 2490 € par mois. Le projet est qu’il atteigne 4 980 € nets mensuels d’ici la fin du quinquennat. Cela s’accompagnera d’une formation initiale complète ainsi que d’une formation continue.\",\n    firstPropositions: 1,\n    idCandidat: 2,\n    idTheme: 3,\n    source: \"Programme officiel\",\n    title: \"Doubler le salaire des enseignants\",\n  },\n  {\n    id: 216,\n    articleContent:\n      \"Depuis 1974, le droit de vote est attribué à tous les citoyens à partir de 18 ans. Cette proposition vise à abaisser l’âge légal du droit de vote à 16 ans.\",\n    firstPropositions: 1,\n    idCandidat: 2,\n    idTheme: 10,\n    source: \"Ouest-France\",\n    title: \"Instaurer le droit de vote à 16 ans\",\n  },\n  {\n    id: 167,\n    articleContent:\n      \"Cette mesure interdit toute nouvelle “méga-installation” en élevage et, progressivement, les pratiques d’élevage industriels en cage, en box ou sur caillebotis. En accord avec les objectifs fixés par l’ADEME, elle s’inscrit dans l’objectif de réduction de -15% du cheptel bovin total en 2035.\",\n    firstPropositions: 1,\n    idCandidat: 3,\n    idTheme: 1,\n    source: \"Programme du ou de la candidate\",\n    title:\n      \"En finir avec l’élevage industriel intensif d’ici à 2025, en commençant par l'interdiction de l’élevage en cage\",\n  },\n  {\n    id: 189,\n    articleContent:\n      \"Ce dernier regrouperait les sujets de l’alimentation, de la santé, et de l’environnement, très liés. Il permettrait de sortir de l’influence des multinationales et d’agir plus efficacement.\",\n    firstPropositions: 1,\n    idCandidat: 3,\n    idTheme: 10,\n    source: \"LCI\",\n    title: \"Créer un Vice-Premier ministre à l’écologie\",\n  },\n  {\n    id: 162,\n    articleContent:\n      \"Cette proposition instaurerait un impôt sur la fortune qui serait indexé sur les émissions de gaz à effet de serre issues des placements financiers des ménages les plus aisés.\",\n    firstPropositions: 1,\n    idCandidat: 3,\n    idTheme: 2,\n    source: \"Programme du ou de la candidate\",\n    title: \"Établir un impôt sur la fortune (ISF) climatique\",\n  },\n  {\n    id: 130,\n    articleContent:\n      \"Le candidat souhaite convoquer un référendum (article 11 de la Constitution) pour engager un processus constituant et permettre aux citoyens de décider des modalités de formation d’une Assemblée constituante. Celle-ci serait chargée de proposer un nouveau projet de Constitution, soumise au peuple par voie référendaire après deux ans de travaux. Le candidat souhaite ainsi remplacer la Constitution de la Ve République, adoptée le 4 octobre 1958 et dont il critique la trop forte présidentialisation, pour mettre en place une VIe République plus parlementaire.\",\n    firstPropositions: 1,\n    idCandidat: 4,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title: \"Passer à une VIème République\",\n  },\n  {\n    id: 132,\n    articleContent:\n      \"Cette série de proposition entend lutter contre le problème de l’abstention en France. Actuellement, les votes blancs sont décomptés mais ne sont pas comptabilisés dans le calcul des suffrages exprimés. Le candidat souhaite donc que ceux-ci soient pris en compte. Cette mesure s’accompagnerait de l’instauration du vote obligatoire, et de la possibilité d’invalider une élection si elle n’atteint un seuil minimum de participation. Le niveau de ce seuil n’a cependant pas encore été précisé par le candidat.\",\n    firstPropositions: 1,\n    idCandidat: 4,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title:\n      \"Reconnaître le vote blanc, mettre en place le vote obligatoire et instaurer un seuil de votes exprimés pour valider une élection\",\n  },\n  {\n    id: 11,\n    articleContent:\n      \"La chasse à courre - ou “vénerie - consiste à chasser un animal sauvage à l’aide d’une meute de chiens le poursuivant jusqu’à son épuisement. En France, cette méthode est réglementée par plusieurs lois, qui se sont succédées depuis le début des années 2000. Le candidat se prononce en faveur de son interdiction totale.\",\n    firstPropositions: 1,\n    idCandidat: 5,\n    idTheme: 1,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Interdire la chasse à courre\",\n  },\n  {\n    id: 17,\n    articleContent:\n      \"Les Jeux olympiques d'été de 2024 seront organisés à Paris, du 26 juillet au 11 août 2024. Leur budget est de 6,6 milliards d’euros. Pour le candidat, les JO sont un gaspillage financier, économique et écologique. Il estime que l’argent qui sera généré par le tourisme, le rayonnement culturel de la France et les festivités qui en découleront n’en valent pas la peine.\",\n    firstPropositions: 1,\n    idCandidat: 5,\n    idTheme: 7,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Ne pas participer aux Jeux olympiques 2024\",\n  },\n  {\n    id: 446,\n    articleContent:\n      \"En 2021, l’âge minimum de la retraite est fixé à 62 ans par le code de la sécurité sociale. Pour une personne née après 1973, il faut avoir cotisé 172 semestres, soit un peu plus de 42 années. Il est possible de partir plus tôt pour diverses raisons : carrière longue, handicap, incapacité permanente d'origine professionnelle (...). Dans l’objectif de faire face aux déficits des caisses de retraite, cette proposition rehausserait l’âge minimal en l’augmentant de 3 ans, ainsi que le nombre d’années de cotisation par la même occasion.\",\n    firstPropositions: 1,\n    idCandidat: 8,\n    idTheme: 8,\n    source: \"Capital.fr\",\n    title: \"Reculer l’âge de départ à la retraite à 65 ans\",\n  },\n  {\n    id: 460,\n    articleContent:\n      \"La fonction publique est actuellement composée de 5,56 millions d’agents répartis en 3 catégories – la fonction publique d’Etat, la fonction publique territoriale et la fonction publique hospitalière – pour l’exercice de missions de service public. Cette proposition vise à supprimer 200000 postes de fonctionnaires dans l’administration de l’État et des collectivités territoriales. En parallèle, le candidat propose de créer 50000 postes supplémentaires pour protéger, éduquer et soigner.\",\n    firstPropositions: 1,\n    idCandidat: 8,\n    idTheme: 10,\n    source: \"Programme officiel\",\n    title: \"Réduire le nombre de fonctionnaires\",\n  },\n  {\n    id: 63,\n    articleContent:\n      \"Pour voter en France, il est nécessaire de disposer de la nationalité française, d’être majeur, de jouir de ses droits civils et politiques et d’être inscrit sur les listes électorales. Toutefois, les ressortissants d’un État membre de l’Union européenne résidant en France ont le droit de voter pour les élections municipales et européennes. Par cette mesure, le candidat souhaite donner la possibilité à toute personne résidant en France de participer aux élections présidentielle, législatives, européennes, régionales, départementales et municipales, ainsi qu’aux referendums.\",\n    firstPropositions: 1,\n    idCandidat: 9,\n    idTheme: 10,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title:\n      \"Octroyer le droit de vote à toutes les élections aux étrangers résidant en France\",\n  },\n  {\n    id: 51,\n    articleContent:\n      \"Actuellement, la loi du 15 mars 2004 interdit pour les élèves le port de tout signe religieux dit “ostensible”, à l’image du voile islamique, dans les écoles, collèges et lycées publics. Néanmoins, cette loi ne s'applique pas aux établissements publics d'enseignement supérieur. En ce sens, le port du voile est uniquement autorisé à partir de l’université.\",\n    firstPropositions: 1,\n    idCandidat: 9,\n    idTheme: 8,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Autoriser le port du voile au lycée\",\n  },\n  {\n    id: 65,\n    articleContent:\n      \"Le candidat estime que la fonction parlementaire doit avoir un salaire moyen pour que les parlementaires représentent réellement la population : ainsi, selon le candidat, légiférer est un travail qui n’a pas besoin d’être davantage rémunéré qu’un autre.\",\n    firstPropositions: 1,\n    idCandidat: 9,\n    idTheme: 10,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title:\n      \"Limiter l’indemnité des députés au salaire moyen d’un ouvrier ou d’un employé\",\n  },\n  {\n    id: 256,\n    articleContent:\n      \"Les traités de libre-échange instaurent des échanges commerciaux avec très peu de restrictions normatives entre États pour favoriser le développement du commerce international. Actuellement, la Commission Européenne a pour mission de représenter la France dans les traités de protection des investissements internationaux (à l’image du TAFTA et du CETA). Cette proposition vise à supprimer cette représentation afin qu’une délégation française exerce souverainement cette mission.\",\n    firstPropositions: 1,\n    idCandidat: 10,\n    idTheme: 6,\n    source: \"Programme du ou de la candidate\",\n    title:\n      \"Interrompre la négociation des traités de libre-échange et retirer à la Commission européenne la mission de représenter la France dans la négociation de traités commerciaux internationaux\",\n  },\n  {\n    id: 262,\n    articleContent:\n      \"La Charte européenne des langues régionales ou minoritaires est destinée à protéger et favoriser les langues historiques régionales et les langues des minorités en Europe. Elle a été signée par la France en 1999 mais n’a toujours pas été ratifiée. Sa ratification permettrait son application effective en France. Le candidat précise qu’il souhaite conserver le français comme seule langue de l'administration.\",\n    firstPropositions: 1,\n    idCandidat: 10,\n    idTheme: 7,\n    source: \"Le Monde, proposition du programme de 2017\",\n    title: \"Ratifier la Charte européenne des langues régionales\",\n  },\n  {\n    id: 270,\n    articleContent:\n      \"Le candidat propose d'ouvrir 20 000 lits (y compris de réserve) avec le personnel soignant afférant et de recruter 100 000 infirmiers et aides-soignants pendant la durée de son mandat.\",\n    firstPropositions: 1,\n    idCandidat: 10,\n    idTheme: 4,\n    source: \"Programme du ou de la candidate\",\n    title: \"Ouvrir 20 000 lits et recruter 100 000 soignants\",\n  },\n  {\n    id: 304,\n    articleContent:\n      \"Actuellement en France, avoir un casier judiciaire sans peine complémentaire d’inéligibilité ne prive pas le citoyen concerné du droit de pouvoir se présenter à des élections. S’inspirant de l’exemple de certaines professions uniquement accessibles avec un casier judiciaire vierge, l’objectif de cette proposition est d’obliger les candidats électoraux à avoir un casier judiciaire vierge dans une logique de moralisation de la vie publique.\",\n    firstPropositions: 1,\n    idCandidat: 11,\n    idTheme: 10,\n    source: \"Site du ou de la candidate\",\n    title:\n      \"Exiger pour tout candidat à un mandat électif un casier judiciaire vierge\",\n  },\n  {\n    id: 302,\n    articleContent:\n      \"Selon les données statistiques de la Chancellerie (ministère de la Justice), la France disposerait au 1er juin 2021 d’un total de 60.794 places de prisons opérationnelles pour un ensemble de 66.591 détenus. Face à ce phénomène de surpopulation carcérale, cette proposition vise à construire de nouvelles places de prison afin d’incarcérer la totalité des individus condamnés à de la prison ferme.\",\n    firstPropositions: 1,\n    idCandidat: 11,\n    idTheme: 9,\n    source: \"Site du ou de la candidate\",\n    title: \"Créer 40 000 places de prison supplémentaires\",\n  },\n  {\n    id: 294,\n    articleContent:\n      \"L’objectif de cette proposition vise à consacrer un budget spécifique à la rénovation et à la conservation des établissements culturels (musées, cinémas) et du patrimoine cultuel (les églises) dans les zones rurales.\",\n    firstPropositions: 1,\n    idCandidat: 11,\n    idTheme: 7,\n    source: \"Site du ou de la candidate\",\n    title:\n      \"Lancer un plan de sauvegarde des églises et des établissements culturels ruraux\",\n  },\n  {\n    id: 380,\n    articleContent:\n      \"Les étrangers qui commettent une infraction en France s'exposent non seulement aux peines prévues par la loi pour cette infraction, mais peuvent également être renvoyés dans leur pays d'origine, à la suite d'un arrêté d'expulsion ou d'une peine d'interdiction d’entrée sur le territoire. Avec cette proposition, les parents de mineurs étrangers qui commettent des actes graves seront désormais également expulsés.\",\n    firstPropositions: 1,\n    idCandidat: 12,\n    idTheme: 6,\n    source: \"Ifrap\",\n    title:\n      \"Expulser les parents de mineurs étrangers ayant commis des actes d’une particulière gravité\",\n  },\n  {\n    id: 397,\n    articleContent:\n      \"Actuellement, sur tous les bâtiments publics, sont supposés se trouver deux drapeaux : celui de la France et celui de l’Union européenne, afin de montrer l’appartenance à une double citoyenneté. Cette proposition vise à supprimer la possibilité d’installer le drapeau européen sur les bâtiments publics.\",\n    firstPropositions: 1,\n    idCandidat: 12,\n    idTheme: 10,\n    source: \"Le Monde\",\n    title: \"Retirer le drapeau européen des bâtiments publics\",\n  },\n  {\n    id: 324,\n    articleContent:\n      \"L'AMP (assistance médicale à la procréation), plus communément appelée PMA (procréation médicalement assistée) permet à un couple qui ne le peut pas d'avoir un enfant, au moyen de différentes techniques médicales (insémination artificielle, fécondation in vitro, accueil d'embryon). Depuis le 29 septembre 2021, la PMA est accessible à toutes les femmes, qu’elles soient hétérosexuelles, homosexuelles ou célibataires. Le candidat souhaite empêcher le recours à cette technique médicale dans les situations où il n’y aurait pas de père (i.e pour les couples de femmes et les femmes seules), et la restreindre aux seuls couples hétérosexuels.\",\n    firstPropositions: 1,\n    idCandidat: 13,\n    idTheme: 8,\n    source: \"Le Figaro\",\n    title:\n      \"Interdire le recours à la procréation médicalement assistée (PMA) sans père\",\n  },\n  {\n    id: 322,\n    articleContent:\n      \"La contribution à l’audiovisuel public est une taxe payée par chaque foyer fiscal, d’un montant de 138€ en métropole et de 88€ en Outre-Mer, qui sert à financer, entre autres, France Télévisions, Radio France et l’institut national de l’audiovisuel. Selon le candidat, cette taxe ne se justifie plus car le service public de l’audiovisuel est ‘’pris en otage par une camarilla gauchiste et idéologique qui crache sur la France, les Français, et qui a décidé de les rééduquer’’. Le candidat envisage par suite une privatisation du service public de la télévision et de la radio.\",\n    firstPropositions: 1,\n    idCandidat: 13,\n    idTheme: 7,\n    source: \"Discours du ou de la candidate\",\n    title: \"Supprimer la contribution à l’audiovisuel public\",\n  },\n  {\n    id: 317,\n    articleContent:\n      \"En 2021, on estime le nombre d'éoliennes terrestres à 8000 en France. Le candidat proteste avec véhémence contre leur installation, considérant qu’elles nuisent à la santé des habitants, en référence au syndrome éolien, ainsi qu’à la beauté des paysages. Il souligne également que leurs socles en béton ne sont pas renouvelables, et juge l’énergie produite trop faible par rapport au coût investi qui selon lui serait mieux dépensé dans d’autres énergies. Le candidat propose donc d’interdire tout nouveau projet de construction d’éoliennes sur terre et en mer, ainsi que de geler les projets éoliens en mer en cours.\",\n    firstPropositions: 1,\n    idCandidat: 13,\n    idTheme: 1,\n    source: \"Programme officiel du ou de la candidate\",\n    title:\n      \"Interdire tout nouveau projet d’éoliennes et geler les projets en cours\",\n  },\n  {\n    id: 99,\n    articleContent:\n      \"Ce revenu serait financé à 50% par l’Etat, et à 50% par une nouvelle cotisation sociale. Le candidat estime que cette mesure pourra ainsi “inciter les entreprises à embaucher ces jeunes, puisqu’elles auront contribué à financer leur formation”.\",\n    firstPropositions: 1,\n    idCandidat: 15,\n    idTheme: 10,\n    source: \"l’Humanité\",\n    title: \"Instaurer un revenu étudiant de 850 euros\",\n  },\n];\n\nexport default firstPropositions;\n"
  },
  {
    "path": "assets/data/propositions/propositionsList.js",
    "content": "const propositionsList = [\n  {\n    id: \"228\",\n    articleContent: \"Cette proposition entend inciter les universités à élargir les horaires d'ouverture de leurs bibliothèques, à aménager des plages horaires en soirée durant la semaine, et à étendre progressivement l'ouverture le dimanche.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 7,\n    source: \"Proposition du programme de 2017\",\n    title: \"Ouvrir les bibliothèques en soirée et le week-end\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"231\",\n    articleContent: \"Il s’agit des indemnités que reçoit un salarié en cas de licenciement abusif. Ces indemnités seraient plafonnées à 3 mois de salaire jusqu’à 2 ans d’ancienneté, et augmenteront à un maximum de 20 mois de salaire à partir de 30 ans d’ancienneté.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 8,\n    source: \"Proposition du programme de 2017\",\n    title: \"Plafonner les indemnités prud’homales\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"242\",\n    articleContent: \"La taxe d’habitation est un impôt foncier payé aux collectivités territoriales par toute personne propriétaire ou locataire du logement qu’il occupe. Elle est établie selon la valeur locative du logement et de ses dépendances. Cette proposition vise à exonérer les classes moyennes et populaire de cette taxe, soit pour 80% de la population.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 10,\n    source: \"Proposition du programme de 2017\",\n    title: \"Exonérer 80% des ménages de la taxe d'habitation\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"237\",\n    articleContent: \"Cette proposition promeut un système universel de retraite avec des règles communes de calcul des pensions, mises en place progressivement. Elle entend remplacer les 42 systèmes de retraites actuels. Avec cette réforme, le fait de changer d’activité ou de secteur sera sans effet sur les droits à la retraite.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 2,\n    source: \"Proposition du programme de 2017\",\n    title: \"Instaurer un système de retraite standardisé\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"222\",\n    articleContent: \"Dans le cadre du « multilatéralisme participatif » qui associe les territoires, le secteur privé, la société civile et les États, l’objectif de cette organisation devrait être la négociation d'un Pacte universel sur l'environnement. La négociation de ce pacte universel, qui comporterait des principes utilisables et invocables en droit, impliquera une longue concertation avec les États et les ONG.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 1,\n    source: \"Proposition du programme de 2017\",\n    title: \"Créer une Organisation Mondiale de l’Environnement\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"241\",\n    articleContent: \"En France, 6,5 millions de foyers n'ont pas accès à un bon débit internet. Le haut débit dont il est question s’avère être le réseau 5G, qui a concentré de vives polémiques entre les écologistes favorables à une sobriété énergétique généralisée, et les défenseurs des avancées technologiques nécessaires au maintien d’une concurrence forte.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 10,\n    source: \"Proposition du programme de 2017\",\n    title: \"Couvrir l’ensemble du territoire avec un réseau de haut débit\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"9535603\",\n    articleContent: \"Selon l’Observatoire International des Prisons, en 2016 le taux d’occupation des établissements pénitenciers français atteint les 116%. Cette surpopulation se concentre dans les maisons d’arrêts. Le candidat propose donc de créer 15 000 places supplémentaire,  ce qui revient à augmenter de 25% les capacités des prisons en 2021.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 9,\n    source: \"Franceinfo\",\n    title: \"Construire 15 000 nouvelles places de prison\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"217\",\n    articleContent: \"Investissement de plus de 30 milliards d’euros dans les champions industriels français des “objets du quotidien” hors des domaines d’excellence français (comme le luxe ou l’aéronautique). Il s’agit d’investir dans des secteurs comme les petits réacteurs nucléaires, l'hydrogène vert, les véhicules électriques, les avions bas-carbone et plusieurs autres branches du secteur énergétique. Le candidat entend ainsi “bâtir la france de 2030 et faire émerger dans notre pays et en Europe les champions de demain”.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 2,\n    source: \"Le Monde, proposition du programme de 2017\",\n    title: \"Investir 30 millards d’euros dans les champions industriels français\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"232\",\n    articleContent: \"Ces contrats également appelés CDI de projet (contrat à durée indéterminée de projet) rendrait les entreprises moins timides à l’embauche, puisque les salariés recrutés avec ces contrats partiraient sitôt que la tâche pour laquelle ils sont venus aura été accomplie.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 8,\n    source: \"Proposition du programme de 2017\",\n    title: \"Mettre en place des contrats de projet dans le code du travail\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"182348\",\n    articleContent: \"Cette proposition vise à diminuer les cotisations, les taxes et les impôts payés par les entreprises. A long terme, le but escompté est une réindustrialisation de la France via un accroissement de la compétitivité des entreprises.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 2,\n    source: \" Le Point \",\n    title: \"Baisser les impôts sur la production\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"CHIFFRE ALÉATOIRE\",\n    articleContent: \"Cette mesure se traduirait par la création de 1 500 « cyberpatrouilleurs » ainsi qu’une école au sein du ministère de l’intérieur formant les agents de l’ordre public sur cette thématique. La dépense pour contribuer à cette formation serait d’un milliard d’euros. Enfin, un équivalent de l’appel du numéro 17 de la police secours serait mis en place permettant à chaque citoyen de signaler une cyberattaque.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 9,\n    source: \"Le Monde, 10 janvier 2022\",\n    title: \"Créer une formation cyber pour lutter contre les attaques numériques\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"234\",\n    articleContent: \"Cette proposition vise à rendre égaux dans la mesure du possible tous les citoyens français. Les handicapes auditifs, dentaires et optiques sont considérés les plus lourds parmi les plus facile à traiter dans cette logique. Un sourire troué, une mauvaise audition, et une faible vision, ce sont autant de facteurs qui réduisent l’intégration sociale.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 4,\n    source: \"Proposition du programme de 2017\",\n    title: \"Prendre en charge à 100% les lunettes, prothèses auditives, et prothèses dentaires\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"224\",\n    articleContent: \"Il est souvent dit que l’énergie la plus verte est celle que l’on ne consomme pas. En suivant cette logique l’un des moyens d’action les plus efficaces pour limiter nos dépenses énergétiques, et par extension nos émissions de CO2, consiste à mieux isoler thermiquement la vaste majorité des bâtiments dont la faible isolation force mécaniquement à dépenser plus d’énergie pour les maintenir au chaud, ce qui émet de CO2 plus que nécessaire.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 1,\n    source: \"Proposition du programme de 2017\",\n    title: \"Rénover 1 million de logements mal isolés\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"244\",\n    articleContent: \"Aujourd’hui, l’article 56 alinéa 2 de la Constitution prévoit que lorsqu’un Président de la République quitte ses fonctions, il devient membre de droit du Conseil Constitutionnel, et peut y siéger à vie. Le candidat souhaite supprimer cet alinéa pour mettre fin à cette possibilité.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 10,\n    source: \"Proposition du programme de 2017\",\n    title: \"Supprimer la présence de droit des anciens Présidents de la République au Conseil constitutionnel\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"227\",\n    articleContent: \"Cette amélioration de l’accueil des réfugiés passerait par un contrôle maîtrisé et plus strict des frontières, une lutte contre les filières et les réseaux criminels, une répartition équilibrée de l’accueil entre les pays européens et une refonte du droit d’asile, ainsi qu’une accélération des procédures et une meilleure orientation des familles.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 6,\n    source: \"Proposition du programme de 2017\",\n    title: \"Accueillir plus justement et efficacement les réfugiés de la guerre de Syrie\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"219\",\n    articleContent: \"Il s’agirait d’un service obligatoire de 3 à 6 mois, plus civique que militaire, qui remplacerait la journée défense et citoyenneté. Son objectif est la création d’une cohésion nationale de toutes les classe sociales au moyen d’une camaraderie formée autour des valeurs républicaines.\",\n    firstPropositions: 1,\n    idCandidat: 1,\n    idTheme: 3,\n    source: \"L’Express, proposition du programme de 2017\",\n    title: \"Instaurer un service national universel\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"223\",\n    articleContent: \"Le glyphosate est l’herbicide le plus courant en France, connu pour ses liens probables avec le cancer et les dommages qu’il cause à l’environnement.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 1,\n    source: \"Proposition du programme de 2017\",\n    title: \"Interdire le glyphosate\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"221\",\n    articleContent: \"Dans le cadre de cette proposition les enseignants mutés dans ces zones devront avoir 3 ans d’ancienneté et recevront une prime annuelle de 3000 euros nets. Il existe aujourd’hui 12 000 classes de CP et de CE1 en zone prioritaire.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 3,\n    source: \"Proposition du programme de 2017\",\n    title: \"Limiter à 12 élèves par enseignant les classes de CP et de CE1 en zone prioritaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"229\",\n    articleContent: \"En France, il existe un principe d’obligation de neutralité du service public, construit par la jurisprudence. Celui-ci implique que les décisions prises par l’agent public soient dictées uniquement par l’intérêt du service public et non par ses convictions politiques, philosophiques ou religieuses. Le candidat souhaite proposer des formations à la laïcité aux agents de l’administration, et sanctionner les atteintes à la laïcité des services publics par les agents comme pour les usagers.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 7,\n    source: \"Proposition du programme de 2017\",\n    title: \"Proposer des actions de formation à la laïcité aux agents de l’administration\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"236\",\n    articleContent: \"En 2021, l’obésité touchait 17% des adultes en France, 45 000 décès ont été attribués à l’alcool, et 102 femmes ont été tuées par leur partenaire ou ex-partenaire en 2020. Pour y remédier, le candidat prévoit de créer un service sanitaire de trois mois pour 40 000 jeunes en études de santé, afin d’aider à la prévention contre la malnutrition, le manque d’exercice physique, les addictions et les violences sexuelles.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 4,\n    source: \"Proposition du programme de 2017\",\n    title: \"Créer un service sanitaire de prévention composé d'étudiants\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"235\",\n    articleContent: \"La vie des séniors s’accompagne de nombreux désagréments liés à la vieillesse, certains particulièrement handicapants. Cependant ils ne sont pas les seuls, les actifs plus jeunes peuvent également être victime de maux graves. À un taux de 80% d’incapacité l’on peut bénéficier de l’AAH. En France près d’1,22 millions d’individus bénéficient de l’AAH.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 4,\n    source: \"Proposition du programme de 2017\",\n    title: \"Augmenter de 100 euros par mois l’Allocation Adulte Handicapé (AAH)\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"226\",\n    articleContent: \"L’Organisation du traité de l'Atlantique nord (OTAN) est une organisation politico-militaire mise en place par les 12 pays signataires du traité de l'Atlantique nord en 1949, afin de pouvoir remplir leurs obligations de sécurité et de défenses collectives. Elle compte aujourd’hui 30 États-membres. En dehors des Balkans, et le cas échéant de la Finlande et de la Suède, le candidat ne souhaite pas soutenir de nouveaux élargissements de l’Alliance. Il souhaite également que la France veille à limiter les interventions de l’OTAN en dehors de sa zone géographique aux seuls cas où les intérêts de la France sont directement concernés.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 6,\n    source: \"Proposition du programme de 2017\",\n    title: \"Refuser tout élargissement de l’OTAN et limiter les interventions de la France en dehors de sa zone géographique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"225\",\n    articleContent: \"Actuellement, l’Union européenne ne dispose pas d’une armée commune. En 1954, la France avait par ailleurs rejeté le projet de Communauté européenne de défense (CED). La défense de l’Europe relève donc des États, puis de l’OTAN. Le candidat propose de progresser vers une capacité d’intervention commune en complément de l’OTAN, tout en laissant chaque pays conserver son armée et sa capacité à lancer des opérations militaires.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 6,\n    source: \"Proposition du programme de 2017\",\n    title: \"Avancer vers une armée européenne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"4537097\",\n    articleContent: \"L’amende forfaitaire délictuelle est une sanction prise par une agent des forces de l’ordre. Si l’amende est réglée, l’affaire ne sera pas amenée devant le juge. Le/ la candidat.e souhaite étendre les amendes forfaitaires délictuelles aux délits sanctionnés d’une peine inférieure à un an d’emprisonnement. L’objectif est une meilleure administration de la justice, permettant aux magistrats de se concentrer sur les affaires les plus importantes.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 9,\n    source: \"Le Monde, 10 janvier 2022\",\n    title: \"Généraliser les amendes forfaitaires délictuelles\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"233\",\n    articleContent: \"Le candidat souhaite que tous les  documents officiels (carte d'identité, passeport, carte grise...), et 100% des démarches administratives puissent être effectuées depuis Internet – sauf première délivrance des documents d'identité officiels. Par exemple, il souhaite que tout citoyen puisse faire une demande de procuration électorale sans se rendre au commissariat. En termes d’emploi, les agents publics dédiés aux tâches administratives répétitives seront redéployés vers des fonctions d'accompagnement et de contact avec le public, en particulier vers tous ceux qui ne sont pas en mesure d'accomplir leurs démarches sur Internet.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 8,\n    source: \"Proposition du programme de 2017\",\n    title: \"Accélérer la numérisation de l’administration\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"220\",\n    articleContent: \"Cette proposition vise à moderniser le baccalauréat pour le rendre “moins complexe, moins cher, moins lourd”. Elle devrait surtout rendre le Bac plus exigent afin de lui redonner de sa valeur dans le processus d’orientation Parcoursup.\",\n    firstPropositions: 0,\n    idCandidat: 1,\n    idTheme: 3,\n    source: \"Proposition du programme de 2017\",\n    title: \"Instaurer le contrôle continu dans un baccalauréat général comprenant 4 matières obligatoires pour tous\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"207\",\n    articleContent: \"Cette mesure envisage principalement de rehausser le montant des allocations chômage pour les intermittents du spectacle, actuellement de 38 euros bruts par jour minimum pour les ouvriers et techniciens du spectacle, et 44 euros bruts par jour minimum pour les artistes du spectacle.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 7,\n    source: \"L’Express\",\n    title: \"Empêcher la précarisation des artistes et des intermittents du spectacle\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"204\",\n    articleContent: \"Cela fait référence à la coopération écologique établie par le C40 et le R20, des organismes qui rassemblent les maires et représentants des villes et régions les plus influentes de la Terre. Ces organismes engagent leur lutte contre le dérèglement climatique en parallèle des Etats, alors jugés peu efficaces et trop lents pour gérer seul la crise écologique.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 6,\n    source: \"Le Point\",\n    title: \"Renforcer la coopération écologique entre les villes et régions les plus riches du monde\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"3671466\",\n    articleContent: \"Le candidat souhaite œuvrer pour « l’accessibilité universelle ». Celle-ci commencera dès l’école à travers la formation du personnel de l’Éducation nationale ainsi que la lutte contre la précarité des accompagnants des élèves en situation de handicap (AESH). Aussi, les infrastructures publiques seront aménagées de façon inclusive.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 4,\n    source: \"Programme officiel \",\n    title: \"Garantir l’accessibilité universelle pour les personnes en situation de handicap\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"191\",\n    articleContent: \"Le montant du salaire minimum interprofessionnel de croissance (SMIC) s’élève aujourd’hui à 1 603,12 € brut mensuel pour un temps plein. Le candidat souhaite l’augmenter de 15% (soit 200€ net de plus par mois) dans le but d’améliorer le pouvoir d’achat des Français. La mise en place de cette augmentation sera permise à travers un dialogue entre les partenaires sociaux (c’est-à-dire, une discussion entre organisations patronales et syndicales).\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 2,\n    source: \"Programme officiel \",\n    title: \"Augmenter le montant du SMIC de 15%\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"145332\",\n    articleContent: \"Le but de cette conférence européenne sur la sécurité de l’Europe serait de parvenir à définir « une doctrine stratégique commune » entre les 27 pays membres de l’Union européenne. .\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 9,\n    source: \" SOURCE \",\n    title: \"Instaurer une conférence européenne pour harmoniser une stratégie commune sur la sécurité de l’Europe entre tous les États membres\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"194\",\n    articleContent: \"En France, près de 700 000 élèves seraient victimes de harcèlement scolaire. Afin de pallier cette situation, le candidat prévoit la formation des enseignants, la désignation de référents dans chaque académie et chaque établissement ainsi que le renforcement des interventions associatives en milieu scolaire. Les valeurs de la Républiques seront transmises aux élèves afin de garantir la laïcité et la lutte contre toutes les discriminations.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 3,\n    source: \"Programme officiel \",\n    title: \"Lutter activement contre le harcèlement scolaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"202\",\n    articleContent: \"L’agroécologie est fondée sur le maintien des cycles de fertilité et de l’équilibre entre élevage et culture. Ce modèle de production doit permettre un meilleur revenu pour les producteurs, la valorisation de la qualité des produits et du bien-être animal ainsi que l’arrêt de l’usage d’engrais de synthèse et de pesticides. Ces objectifs seront atteints notamment grâce à la formation des agriculteurs.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 1,\n    source: \"Programme officiel \",\n    title: \"Promouvoir l’agroécologie\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"206\",\n    articleContent: \"Cette proposition rentre dans le cadre de la lutte contre les violences faites aux femmes. Les défenseurs de la proposition préconisent de s’inspirer du modèle espagnol, qui depuis 20 ans dispense dans tous les corps de métier des formations pour améliorer la prise en charge des victimes de violences conjugales, ce qui a diminué le taux de féminicide de 15%.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 8,\n    source: \"Le Monde\",\n    title: \"Eduquer les populations aux notions de consentement et d’égalité des genres\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"192\",\n    articleContent: \"Afin de mettre à contribution les plus fortunés pour financer la transition énergétique, un Impôt de Solidarité sur la Fortune Climat et Biodiversité leur sera imposé. La somme collectée sera ensuite redistribuée : 50 % pour des dépenses accélérant la transition écologique et 50 % pour des mesures sociales en faveur des ménages particulièrement impactés par la crise environnementale ou en difficulté sociale.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 2,\n    source: \"Programme officiel \",\n    title: \"Mettre en place un impôt sur la fortune climatique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"4125363\",\n    articleContent: \"En 2021, plus de 100 femmes sont mortes sous les coups de leur conjoint ou ex-conjoint. Cette mesure vise à former des policiers spécialisés sur cette question. Le candidat propose de créer des 'unités de police et de magistrats spécialisés', puis 'faire de la suspension de l'autorité parentale le principe pour les personnes reconnues coupables de violences intrafamiliales'.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 9,\n    source: \"Le Monde\",\n    title: \"Créer des unités de police spécialisées dans les violences conjugales\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"212\",\n    articleContent: \"Le candidat estime que  la santé mentale est la grande oubliée des questions de santé publique en France et entend en faire la grande cause  de son quinquennat. Le burn out sera notamment reconnu comme une maladie professionnelle.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 4,\n    source: \"Programme officiel \",\n    title: \"Améliorer la prise en compte de problèmes liés à la santé mentale\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"10002\",\n    articleContent: \"Afin de limiter la concentration des médias dans les mains de quelques acteurs puissants, le candidat souhaite réformer la loi de 1986 sur la liberté de communication en donnant un statut juridique aux rédactions. Ce projet vise à assurer, selon le candidat, la liberté, l’indépendance et le pluralisme des médias, et notamment l’honnêteté de l’information.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 7,\n    source: \"Programme officiel \",\n    title: \"Protéger le pluralisme et l’indépendance des médias\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"201\",\n    articleContent: \"Afin de mieux sanctionner les atteintes à l’environnement, le candidat souhaite inscrire la protection des biens communs et de la biodiversité, le principe de non-régression dans la protection de l’environnement ainsi que l’obligation de lutter contre le réchauffement climatique dans la Constitution. Un Défenseur de l'environnement sera nommé afin de garantir le respect de ces objectifs. En cas d’atteintes graves et intentionnelles à l’environnement, la loi et la création d’un Tribunal Pénal International de l’Environnement permettront la reconnaissance et la punition des  crimes d’écocide .\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 1,\n    source: \"Les Echos\",\n    title: \"Inscrire la protection de l’environnement dans la Constitution\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"8658757\",\n    articleContent: \"Le candidat souhaite qu’une plus grande partie du budget français soit allouée à la culture qu’il estime primordial avec, notamment, la restauration de nombreux musées nationaux, gratuits pour les moins de 25 ans ainsi que la construction de nombreux sites culturels accessibles sur tous les territoires.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 7,\n    source: \"Discours et interview\",\n    title: \"Augmenter considérablement le budget de la culture\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"838842\",\n    articleContent: \"Aujourd’hui, quatre conditions sont nécessaires pour pouvoir voter : avoir 18 ans, être inscrit sur liste électorale, jouir de ses droits civiques et politiques, et être de nationalité française. Depuis 1992, un citoyen européen qui réside en France a cependant le droit de voter aux élections municipales et aux élections européennes à condition d'être inscrit sur les listes électorales françaises. Le candidat voudrait étendre le droit de vote à l’ensemble des personnes résidant sur le territoire français, toutefois uniquement pour les élections locales. (municipales, départementales et régionales...). .\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 9,\n    source: \" SOURCE \",\n    title: \"Attribuer le droit de vote pour les élections locales aux étrangers vivant en France\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"200\",\n    articleContent: \"Cette proposition vise à décarboner progressivement l’économie française à travers l’utilisation d’énergies renouvelables. Afin de faciliter cette implantation, le nucléaire sera utilisé comme énergie de transition.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 1,\n    source: \"Ifrap\",\n    title: \"Mettre fin à l’exploitation des énergies fossiles\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"205\",\n    articleContent: \"Le nouveau régime Taliban va sans aucun doute entraîner des milliers de familles afghanes à migrer vers l’Europe. Les défenseurs de cette proposition souhaitent éviter ces drames humains, et jugent que “l’échec des 20 ans d’intervention occidentale ne justifie en rien l’abandon des populations afghanes”.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 6,\n    source: \"Le Monde\",\n    title: \"Soutenir la résistance en Afghanistan\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"214\",\n    articleContent: \"Le pouvoir de nomination correspond à la capacité de choisir les hommes et les femmes aux postes à responsabilité au sein de l’Etat. Actuellement, il est principalement attribué au Président de la République, l’article 13 de la Constitution disposant que ce dernier “nomme aux emplois civils et militaires de l'État”.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 10,\n    source: \"Ifrap\",\n    title: \"Donner davantage de poids à l’Assemblée nationale et au Sénat dans le pouvoir de nomination\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"209\",\n    articleContent: \"Cette proposition vise à mettre à jour le droit français de façon à ce qu’il prenne mieux en considération les nouvelles formes de travail à distance.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 8,\n    source: \"Ifrap\",\n    title: \"Développer des protections adéquates aux nouvelles formes d’activités professionnelles (télétravail, plateformes numériques, multi-activité)\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"323762\",\n    articleContent: \"Le candidat souhaite que toute personne majeure, confrontée à la phase avancée d'une maladie dont elle ne peut guérir puisse avoir recours à une fin de vie médicalisée. À ce jour, la loi dite “Leonetti” adoptée en 2005, n’autorise pas l’euthanasie mais consacre le droit au “laisser mourir” (i.e. la cessation consentie des traitements en cas « d’obstination déraisonnable »).\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 8,\n    source: \"Le Monde \",\n    title: \"Légaliser l’euthanasie\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"211\",\n    articleContent: \"Afin de lutter contre le manque de personnel médical, jusque 15 000 nouveaux médecins seront formés chaque année, contre moins de 10 000 aujourd’hui. Les formations de soignants seront portées à 1 250 sages-femmes par an, 25 000 infirmiers et aides-soignants, 5 000 logisticiens, techniciens et agents hospitaliers. Une revalorisation des rémunérations et des carrières médicales sera effectuée afin de rentre ces professions plus attractives.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 4,\n    source: \"Programme officiel \",\n    title: \"Accroître les capacités d’accueil des facultés de médecine\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"203\",\n    articleContent: \"Afin de respecter son engagement de réduction de 55 % des émissions en 2030 et de neutralité carbone en 2050, l’UE s’engagera activement dans la décarbonisation des économies. La politique commerciale de l’UE sera ainsi révisée.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 6,\n    source: \"Programme officiel \",\n    title: \"Faire de l’Union Européenne un leader de la transition écologique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"190\",\n    articleContent: \"Afin de pallier les difficultés économiques des territoires ultramarins, le candidat prévoit d’améliorer le pouvoir d’achat, l’accès à l’emploi ainsi que les infrastructures publiques.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 2,\n    source: \"Ifrap\",\n    title: \"Améliorer la situation économique des territoires d’outre-mer\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"197\",\n    articleContent: \"Cette mesure vise à supprimer la plateforme d’admission dans l’enseignement supérieur Parcoursup,pour la remplacer par un accompagnement personnalisé des élèves dans leur orientation. Le candidat estime en effet qu’il “n’est pas possible que ce soit un algorithme qui décide de la vie des jeunes”.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 3,\n    source: \"France info\",\n    title: \"Remplacer la plateforme Parcoursup\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"215\",\n    articleContent: \"Depuis 1982, les trois “Actes de la décentralisation” ont transféré à des collectivités territoriales autonomes (régions, départements, communes...) un certain nombre de compétences dans des domaines définis. La mesure envisagée propose renforcer ce processus, en conférant davantage de compétences aux collectivités territoriales.\",\n    firstPropositions: 0,\n    idCandidat: 2,\n    idTheme: 10,\n    source: \"BFMTV\",\n    title: \"Accentuer la décentralisation des pouvoirs\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"186\",\n    articleContent: \"Le mode de scrutin proportionnel est un système d’élection où le nombre de sièges à pourvoir est partagé en fonction du nombre de voix recueillies par les candidats.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 10,\n    source: \"France Info\",\n    title: \"Mettre en place un scrutin proportionnel paritaire pour les élections législatives\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"172\",\n    articleContent: \"Les accords commerciaux permettent aux pays qui le signent, de se mettre d'accord sur les règles à respecter dans le cadre de leurs échanges. Cette proposition vise à prendre en compte, systématiquement, les enjeux sociaux, environnementaux et de droits humains dans ces accords.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 6,\n    source: \"Le Monde\",\n    title: \"Inclure dans tous les accords commerciaux de strictes conditions en matière sociale, environnementale et de droits humains\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"174\",\n    articleContent: \"Le budget de l'État correspond à l'ensemble de ses ressources et de ses dépenses. Il s’élève à plusieurs dizaines de milliards d’euros.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 7,\n    source: \"Les Inrocks\",\n    title: \"Consacrer 1% du budget de l’Etat à la culture\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"169\",\n    articleContent: \"Dès 2022, seront interdits les néonicotinoïdes, le glyphosate, les fongicides SDHI et tous les pesticides cancérogènes, mutagènes, reprotoxiques et perturbateurs endocriniens notoirement dangereux pour la santé et la biodiversité. Sur le quinquennat, l’usage des pesticides et des engrais de synthèse en France seront divisés par deux par la conversion massive à l’agriculture biologique.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 1,\n    source: \"Programme du candidat ou de la candidate\",\n    title: \"Interdire le glyphosate et diviser par deux l’usage des pesticides et des engrais de synthèse sur cinq ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"180\",\n    articleContent: \"La suspension des brevets sur les vaccins contre le Covid 19 permettraient de faciliter leur accès pour beaucoup de pays.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 4,\n    source: \"LCI\",\n    title: \"Lever les brevets des vaccins contre le Covid 19\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"187\",\n    articleContent: \"Le droit de vote en France est accordé aux citoyens à partir de 18 ans. Cette proposition vise l’abaissement de l’âge légal du droit de vote à 16 ans.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 10,\n    source: \"Ouest-France\",\n    title: \"Instaurer le vote à 16 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"179\",\n    articleContent: \"La consommation de cannabis est illégale en France. Depuis le 1er septembre 2020, elle est sanctionnée par 200€ d’amende. Cette proposition vise donc à légaliser et encadrer par un monopole d’État la consommation, la production et la vente de cannabis. Le candidat considère que cela permettrait de mieux lutter contre l’addiction et réorienter le travail de la police.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 8,\n    source: \"Ouest-France\",\n    title: \"Légaliser le cannabis\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"171\",\n    articleContent: \"Les GAFAM et les entreprises chinoises sont très puissantes, cette mesure vise à replacer l’Europe à leur niveau dans les secteurs et les infrastructures stratégiques en renforçant la souveraineté européenne.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 6,\n    source: \"Magazine Décideurs\",\n    title: \"Renforcer la souveraineté européenne face aux GAFAM américains et à la Chine\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"173\",\n    articleContent: \"Cette mesure souhaite la mise en place d’une stratégie de défense commune de la part des pays de l’Union européenne.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 6,\n    source: \"Le Monde\",\n    title: \"Construire une politique extérieure et de défense européenne commune\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"163\",\n    articleContent: \"Selon les données du ministère de l'Éducation nationale, 1 162 850 personnes travaillaient en 2020 dans les établissements scolaires. Parmi eux, on comptait environ 866 000 enseignants. Dans beaucoup d’établissements, on observe des postes vacants.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 3,\n    source: \"France 24\",\n    title: \"Instaurer 35 000 nouveaux postes d’enseignants et de personnels éducatifs\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"165\",\n    articleContent: \"Cette proposition vise à distribuer dans les établissements de restauration collective, de la nourriture locale et bio, fournie par nos producteurs français exclusivement.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 3,\n    source: \"France Info\",\n    title: \"Rendre les cantines 100% bio et locales\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"175\",\n    articleContent: \"Cette mesure vise à mettre en place un fonds pour allouer des moyens aux artistes plasticiens (souvent mal rémunérés) qui en auraient besoin.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate\",\n    title: \"Créer un fonds de protection pour les artistes plasticiens\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"176\",\n    articleContent: \"Le statut d'intermittent a été conçu pour les personnes travaillant dans les secteurs du cinéma, de l'audiovisuel et du spectacle vivant. Il leur assure un revenu minimum.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 7,\n    source: \"Proposition du programme de 2017\",\n    title: \"Pérenniser le système de protection des intermittents\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"182\",\n    articleContent: \"La crise sanitaire a mis en exergue le manque de moyens alloués à l’hôpital public. Cette mesure vise à combler ces manques.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 4,\n    source: \"LCI\",\n    title: \"Embaucher 100.000 nouvelles infirmières et infirmiers\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"178\",\n    articleContent: \"La mesure précise que les modalités selon les professions seront à décliner par la négociation collective. Pour ceux qui ne pourraient pas en bénéficier, un droit à la modulation des horaires serait introduit pour faciliter la vie quotidienne, notamment par rapport aux transports.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 8,\n    source: \"Public Senat\",\n    title: \"Instaurer un droit au télétravail au niveau national\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"184\",\n    articleContent: \"Selon l’article 71-1 de la Constitution « Le Défenseur des droits veille au respect des droits et libertés ». Cette proposition veut placer l’IGPN, qui dépend aujourd’hui du ministère de l’intérieur et qu’on appelle souvent “la police des polices”, sous la compétence du Défenseur des droits.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 9,\n    source: \"BFM TV\",\n    title: \"Placer l’inspection générale de la police nationale (IGPN) sous la compétence du Défenseur des droits\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"164\",\n    articleContent: \"Cette mesure vise à la mise en place d’un système éducatif intégrant la sensibilisation à tout âge, aux enjeux climatiques. Cela passe par une formation sur les conséquences pratiques liées à nos actes individuels et collectifs, tout en permettant l’acquisition des compétences pour y répondre.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 3,\n    source: \"Ifrap\",\n    title: \"Former et recruter 1 000 intervenants pour sensibiliser les élèves de la primaire à l'université aux enjeux socio-écologiques\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"161\",\n    articleContent: \"Depuis les lois Sapin (2013), Rebsamen (2015) et Pacte (2019), une présence minimale des salariés dans les conseils est exigée (entre 10% et 15%). La mesure prévoit d’obliger que la moitié des membres des Conseils d’administration ou de surveillance et le Comité de rémunération des grandes entreprises soient des représentants des salariés (1⁄3 pour les entreprises de 500 à 2 000 employés). L’objectif de cette mesure est de démocratiser l’entreprise, avec des effets bénéfiques sur sa performance.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 2,\n    source: \"Programme du ou de la candidate\",\n    title: \"Donner plus de pouvoir aux salariés en obligeant à ce qu’ils soient représentés à hauteur de 50 % dans les Conseils d’administration, de surveillance et de rémunération des grandes entreprises\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"181\",\n    articleContent: \"Cette mesure vise la création de 300 000 emplois, pour les jeunes de 18 à 25 ans ayant terminés leur scolarité, dans le secteur non marchand et les collectivités locales afin d’assurer des missions en matière associative, environnementale, culturelle et sportive. Ces contrats de 3 ans seraient pris en charge à 80% par l’Etat.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 4,\n    source: \"Programme du ou de la candidate\",\n    title: \"Protéger les plus vulnérables et sécuriser les transitions et insertions professionnelles\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"160\",\n    articleContent: \"Cette proposition souhaite que les entreprises qui bénéficieraient d’aides publiques se soumettent à des normes de respect de l’environnement, du progrès social et de l’égalité entre les femmes et les hommes.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 2,\n    source: \"Ifrap\",\n    title: \"Soumettre les aides publiques aux entreprises au respect de certaines normes\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"177\",\n    articleContent: \"Aujourd’hui, la direction générale des étrangers en France (DGEF) est chargée au sein du ministère de l'intérieur de la politique d'immigration, d'asile, d'intégration et d'accès à la nationalité française. Cette mesure veut transférer ces compétences à un ministère des solidarités et de l'intégration.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 8,\n    source: \"Programme du ou de la candidate\",\n    title: \"Transférer la politique de l'asile et des migrations à un ministère des solidarités et de l'intégration\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"185\",\n    articleContent: \"La chasse fait l’objet de nombreux débats liés aux accidents qu’elle engendre. Cette proposition cherche à sécuriser les personnes qui souhaitent profiter de la campagne le week-end et lors des vacances scolaires.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 9,\n    source: \"Ouest-France\",\n    title: \"Interdire la chasse le week-end et lors des vacances scolaires\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"166\",\n    articleContent: \"Cette proposition consiste à prêter un vélo à tous les jeunes de 16 à 25 ans qui le souhaitent. Le parc de vélos sera composé soit de vélos d’occasion et réparés par des personnes en insertion partout sur le territoire, soit fabriqués par une filière française. Cette proposition sera déclinée territoire par territoire, avec les collectivités concernées.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 1,\n    source: \"Programme du candidat ou de la candidate\",\n    title: \"Mettre à disposition un vélo pour chaque jeune de 16 à 25 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"183\",\n    articleContent: \"Ce ministère, en lieu et place du ministère de l’Intérieur, aurait pour objectif de garantir la protection républicaine et les libertés publiques.\",\n    firstPropositions: 0,\n    idCandidat: 3,\n    idTheme: 9,\n    source: \"France Info\",\n    title: \"Remplacer le ministère de l’Intérieur par un ministère de la protection républicaine\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"120\",\n    articleContent: \"La loi Aubry en 2002 a permis réduire la durée de travail hebdomadaire légale à 35h. Cette proposition revient à augmenter les taxes sur les heures supplémentaires pour assurer l’application des 35 heures et à réduire le temps de travail hebdomadaire à 32 heures pour les travailleurs exerçant un métier considéré comme pénible ou de nuit.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 8,\n    source: \"Programme du ou de la candidate\",\n    title: \"Faire respecter les 35 heures de travail hebdomadaire et passer à 32 heures pour les métiers pénibles\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"103\",\n    articleContent: \"Cette proposition modifierait le montant du SMIC, de 1258,25€ actuellement à 1400€ par mois, de façon à augmenter le pouvoir d’achat des français.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 2,\n    source: \"Ifrap\",\n    title: \"Fixer le SMIC mensuel à 1400 euros nets\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"109\",\n    articleContent: \"Cette série de propositions vise à réduire la pollution des sols et des nappes phréatiques, afin de répondre aux exigences des accords écologiques signés par la France. Le candidat propose de bannir intégralement l’utilisation de pesticides, d’instaurer des zones tampons (i.e des surfaces non cultivées ayant la capacité d’intercepter les flux d’eau et de substances, utilisées pour protéger les cours d'eau des engrais et pesticides des cultures adjacentes), et de lutter contre l’artificialisation des sols en mettant en place un plan de protection généralisée du foncier agricole, forestier et naturel.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 1,\n    source: \"Ifrap\",\n    title: \"Bannir les pesticides, instaurer des zones-tampons, lutter contre l’artificialisation des sols\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"104\",\n    articleContent: \"Depuis le 1er février 2019, les clients fragiles des banques bénéficient du plafonnement des frais bancaires à 25 euros par mois. Le candidat propose un plafonnement général des frais bancaires, liés aux découverts et aux incidents de fonctionnement du compte, à 20 euros par mois, valable pour tous les Français.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 2,\n    source: \"Programme du ou de la candidate\",\n    title: \"Diminuer le plafond des frais bancaires\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"121\",\n    articleContent: \"L'AMP (assistance médicale à la procréation), plus communément appelée PMA (procréation médicalement assistée), permet à un couple qui ne le peut pas d'avoir un enfant, au moyen de différentes techniques médicales (insémination artificielle, fécondation in vitro, accueil d'embryon). Actuellement, le recours à la PMA est remboursé si la mère a moins de 43 ans, et dans la limite de 6 inséminations artificielles et 4 fécondations in vitro. Le candidat souhaite que le remboursement soit autorisé sans condition. Il s’oppose cependant à la légalisation de la GPA (gestation pour autrui), interdite depuis la loi bioéthique de 1994.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 8,\n    source: \"Ifrap\",\n    title: \"Rembourser la procréation médicalement assistée (PMA) pour toutes les femmes et refuser la gestation pour autrui (GPA)\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"108\",\n    articleContent: \"Cette allocation concernerait uniquement les jeunes étudiants qui ne sont plus pris en charge par leurs parents, ainsi que les élèves de lycées professionnels. Dans ce dernier cas, le but de l’allocation serait notamment, en plus réduire la précarité étudiante, de participer à la réindustrialisation de l’économie française en facilitant le suivi de formations professionnelles de qualité.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 3,\n    source: \"Programme du ou de la candidate\",\n    title: \"Mettre en place une allocation d’autonomie, pour les jeunes étudiants à l’Université ou en lycée professionnel, de 1063€\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"115\",\n    articleContent: \"L’Organisation du traité de l'Atlantique nord (OTAN) est une organisation politico-militaire mise en place par les pays signataires du traité de l'Atlantique nord en 1949, afin de pouvoir remplir leurs obligations de sécurité et de défense collectives. La France faisait partie des pays fondateurs de l’organisation en 1949, et ne l’a jamais quittée depuis lors. En 1966, Charles de Gaulle avait décidé de retirer la France de son commandement intégré, décision sur laquelle Nicolas Sarkozy est revenu en 2009. Cette proposition entend quitter l’OTAN intégralement et définitivement.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 6,\n    source: \"Programme du ou de la candidate\",\n    title: \"Se retirer de l’OTAN\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"131\",\n    articleContent: \"Depuis 1974, le droit de vote est attribué à tous les citoyens à partir de 18 ans. Cette proposition vise à abaisser l’âge légal du droit de vote à 16 ans.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 10,\n    source: \"Ouest-France\",\n    title: \"Instaurer le droit de vote à 16 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"118\",\n    articleContent: \"Le code de l’Éducation oblige actuellement tous les établissements scolaires du second degré (collèges et lycées) à créer une association sportive. Cette proposition vise à élargir cette obligation aux écoles primaires, maternelles et élémentaires.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate\",\n    title: \"Créer une association sportive dans tous les établissements du premier degré\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"106\",\n    articleContent: \"Les prix de la cantine dans les établissements scolaires sont déterminés par les collectivités territoriales. Le candidat souhaite que les repas soient 100% gratuits, et préparés avec des ingrédients issus de l’agriculture biologique. Il propose également la gratuité des transports et des activités périscolaires, qui seraient organisées par des professeurs titulaires d’un nouveau concours, le Capes “d’animation socioculturelle”. Enfin, il propose de fournir gratuitement des manuels scolaires et des fournitures “sans marque” à tous les élèves, de façon à lutter contre le consumérisme.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 3,\n    source: \"Programme du ou de la candidate\",\n    title: \"Instaurer la gratuité de la cantine, des transports et des activités périscolaires\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"116\",\n    articleContent: \"En 2021, le budget du ministère de la culture était de 3,8 milliards d’euros, et il dépassera les 4 milliards d’euros en 2022. Le candidat propose de l’augmenter de plus d’1 milliards d’euros, pour que l’ensemble des dépenses liées à la culture (venant d’autres ministères et des collectivités notamment) atteignent 1% du PIB français pour 2022.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate\",\n    title: \"Augmenter le budget consacré à la culture à 1% du PIB\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"105\",\n    articleContent: \"Le candidat souhaite réinstaurer l’impôt sur la fortune (ISF), remplacé en janvier 2018 par un impôt sur la fortune immobilière, et y ajouter un volet climatique afin de taxer aussi les plus gros pollueurs. L’impôt sur la fortune immobilière a rapporté 1,56 milliard d’euros de rentrées fiscales à l’État, en 2020, d’après les chiffres de la Direction générale des finances publiques. L’ISF a rapporté, lui, 4,2 milliards d’euros, en 2017.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 2,\n    source: \"Programme du ou de la candidate\",\n    title: \"Rétablir l’impôt sur la fortune (ISF) et y inclure un volet climatique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"117\",\n    articleContent: \"L’allocation chômage est versée aux intermittents du spectacle jusqu’à une date anniversaire, fixée au terme d’un délai de 12 mois à compter de la fin de contrat prise en compte pour l’ouverture des droits. En 2021, dans le contexte de la crise sanitaire, de nombreux intermittents du spectacle ont protesté contre la suppression de l’allocation chômage qui leur était accordée. Pour le candidat, prolonger cette allocation leur permettrait d’acquérir une certaine stabilité financière.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate\",\n    title: \"Prolonger les allocations chômages pour les travailleurs de la culture\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"114\",\n    articleContent: \"En droit européen, l’opting-out est une dérogation accordée à un pays ne souhaitant pas se rallier aux autres États-membres dans un domaine particulier de la coopération, afin d'empêcher un blocage général. Actuellement, trois États bénéficient de cette option de retrait négociée : le Danemark (quatre options de retrait), l'Irlande (deux options de retrait) et la Pologne (une option de retrait). Le candidat entend utiliser ce mécanisme sur les traités européens qui entrent en contradiction avec son programme.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 6,\n    source: \"Le Progrès\",\n    title: \"Désobéir aux traités de l’UE sur des points stratégique : technique de l’”opting-out”\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"113\",\n    articleContent: \"Plusieurs programmes ont déjà été mis en place par la Banque centrale européenne ces dernières années, comme le « Securities Markets Programme » (SMP) lancé en mai 2010, qui consistait à racheter sur le marché secondaire les obligations souveraines des États de la zone euro faisant face à la défiance des investisseurs, qui exigeaient des primes de risques élevés pour acquérir ces titres. La Banque centrale européenne a ainsi procédé au rachat d'obligations du Portugal, de l'Irlande, de l'Italie, de la Grèce et de l'Espagne pour un montant total d'environ 220 milliards d'euros. Ce programme est aujourd'hui arrêté, et a été remplacé en septembre 2012 par le programme « Outright Monetary Transactions ». Cette proposition exigerait la rachat des dettes publiques sur les marchés financiers et les transformerait en dette perpétuelles à taux nul.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 6,\n    source: \"Ifrap\",\n    title: \"Exiger de l’Union européenne que la Banque centrale européenne rachète les dettes publiques et les transforme en dettes perpétuelles à taux nul\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"107\",\n    articleContent: \"Le candidat souhaite planifier la création de crèches (publiques et d’entreprises publiques) et de jardins d’enfants à effectifs réduits, augmenter les moyens humains et matériels pour améliorer les conditions de travail dans les structures existantes, et garantir la gratuité des crèches publiques. Cette série de mesure entend également lutter contre l’inégalité entre les femmes et les hommes, le candidat estimant que la charge de travail domestique des femmes reste encore trop supérieure à celle des hommes.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 3,\n    source: \"Programme du ou de la candidate\",\n    title: \"Créer un service public de la petite enfance et ouvrir 500 000 places en crèche\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"126\",\n    articleContent: \"Le droit du sol offre la possibilité à un enfant né en France de parents étrangers d'acquérir la nationalité française à ses 18 ans, sous certaines conditions : résider en France à cette date, et y avoir vécu pendant une période continue ou discontinue d'au moins cinq ans depuis l'âge de 11 ans. Les parents peuvent cependant faire une demande d’acquisition du droit du sol pour leur enfant dès ses 13 ans, si celui-ci est consentant. Le candidat propose de mettre en place un droit du sol intégral pour les enfants nés en France, qui obtiendraient ainsi la nationalité française à la naissance.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 9,\n    source: \"Ifrap\",\n    title: \"Instaurer un droit du sol intégral, y compris dans les Outre-Mer\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"128\",\n    articleContent: \"En 1996, le Président de la République française Jacques Chirac a annoncé la fin du service national, entérinée par la loi du 28 octobre 1997. En remplacement, il a instauré une Journée Défense et Citoyenneté (JDC), qui vise à informer les jeunes de 16 ans sur les enjeux nationaux et militaires. Depuis 2017, le gouvernement français expérimente, dans certains département, le Service National Universel (SNU), facultatif et ouvert aux jeunes âgés de 15 à 17 ans. Cette mesure propose de réinstaurer un service citoyen obligatoire de 9 mois, rémunéré au SMIC. Il inclut une formation militaire, le passage du permis de conduire, un bilan de santé, et les participants pourront choisir des activités civiles ou bien militaires.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 9,\n    source: \"Ifrap\",\n    title: \"Instaurer un service citoyen obligatoire de 9 mois pour les femmes et les hommes de moins de 25 ans, rémunéré au SMIC\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"119\",\n    articleContent: \"La consommation de cannabis est illégale en France. Depuis le 1er septembre 2020, elle est sanctionnée par 200€ d’amende. Cette proposition vise donc à autoriser sa consommation.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 8,\n    source: \"Le Parisien\",\n    title: \"Légaliser le cannabis\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"111\",\n    articleContent: \"Pour cela, le candidat souhaite abandonner les projets d’EPR - les réacteurs nucléaires de nouvelle génération - ainsi que l’enfouissement de leurs déchets. Le candidat envisage également de planifier le démantèlement de la centrale de Fessenheim (Haut-Rhin), première centrale nucléaire française, dont la construction avait été décidée par les anciens présidents, Charles de Gaulle et George Pompidou, dans les années 1960. L’exploitation de cette dernière s’est arrêtée, le 29 juin 2020, après 43 années d’activité.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 1,\n    source: \"Ifrap\",\n    title: \"Sortir du nucléaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"112\",\n    articleContent: \"Après l’adoption de la loi pour la transition énergétique et la croissance verte en 2015, puis de l’Accord de Paris sur le climat signé en 2016, la France est engagée dans la transition énergétique. L’association négaWatt, composée d’une vingtaine d’experts sur la question énergétique, a déjà dévoilé un scénario dans lequel la France pourrait produire 100% d’énergies renouvelables d’ici 2050. Cette proposition a pour ambition de planifier cet objectif, en poursuivant une double logique de sobriété et d’efficacité énergétique.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 1,\n    source: \"Ifrap\",\n    title: \"Planifier le 100% d’énergies renouvelables avec un double axe sobriété/efficacité énergétique pour 2050\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"123\",\n    articleContent: \"Actuellement, les allocations familiales ne sont versées qu’à partir du deuxième enfant à charge. Cette mesure propose de les autoriser dès la naissance du premier enfant.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 4,\n    source: \"Ifrap\",\n    title: \"Verser une allocation familiale dès le premier enfant\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"124\",\n    articleContent: \"La facture d’eau des français s’élève en moyenne à 40 euros par mois. Le prix de l’eau est cependant fixé par les communes, et peut donc varier en fonction des territoires. Le candidat souhaite investir dans la gestion de l’eau et sa distribution et rendre ses premiers mètres cubes gratuits, mesure dont il estime qu’elle permettrait d’augmenter le pouvoir d’achat des français.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 4,\n    source: \"Programme du ou de la candidate\",\n    title: \"Rendre gratuits les premiers mètres cubes d’eau\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"125\",\n    articleContent: \"Un contractuel de la fonction publique est un agent recruté sous contrat par un employeur public, mais qui ne dispose pas du statut de fonctionnaire. En 2021, les contractuels représentaient un employé de la fonction publique sur cinq. Le candidat propose de titulariser tous les contractuels, afin d’homogénéiser les statuts des employés du service public.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 4,\n    source: \"Les Echos\",\n    title: \"Titulariser les contractuels de la fonction publique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"127\",\n    articleContent: \"Les Brigades Anti-criminalité sont un service de la police nationale. Créés en 1994, ces unités sont présentes à Paris, dans sa proche banlieue, en grande couronne parisienne ainsi que dans les grandes et moyennes villes de province, au sein de la plupart des commissariats. Il existe des BAC jour et des BAC nuit. L’objectif de cette proposition est de démanteler ces unités au profit d’une police de proximité, considérée par le candidat comme plus adaptée.\",\n    firstPropositions: 0,\n    idCandidat: 4,\n    idTheme: 9,\n    source: \"Ifrap\",\n    title: \"Démanteler les BAC (Brigades Anti-criminalité) et réhabiliter la police de proximité\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"22\",\n    articleContent: \"Cette proposition vise à permettre l’accès gratuit à tous les soins prescrits par un médecin en prenant notamment sur les profits des trusts pharmaceutiques pour financer ces nouvelles dépenses.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 4,\n    source: \"Les Echos\",\n    title: \"Rendre gratuits tous les soins de santé prescrits et embaucher dans les hôpitaux\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"18\",\n    articleContent: \"Avec cette proposition, le candidat entend “renverser le système capitaliste au sein des entreprises (...) afin que toutes soient régies par des logiques de direction participative qui revaloriseraient leurs salariés”. Ce modèle se rapprocherait de celui qui existe déjà dans les sociétés coopératives ouvrières participatives, dont la corporation basque Mondragon est l’un des exemples les plus emblématiques.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 7,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Développer une culture d’entreprise participative\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"16\",\n    articleContent: \"En vertu de l’article 2 de la loi du 9 décembre 1905, dite de séparation des Églises et de l’État, les associations cultuelles ne peuvent recevoir aucune subvention publique, directe ou indirecte. Les associations cultuelles profitent néanmoins d’aides indirectes, qui ont été progressivement mises en place. Par exemple, le code général des impôts autorise les entreprises et les particuliers à déduire de leurs bénéfices ou de leurs revenus les dons aux associations cultuelles. Le candidat souhaite interdire ces pratiques de financement indirect pour tous les cultes.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 7,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Cesser tout financement des lieux de culte par les dépenses publiques\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"2\",\n    articleContent: \"Le salaire minimum (SMIC) s’élève actuellement à 1269 euros net mensuels. Cette proposition vise à l’augmenter à hauteur de 2000€ afin de ne plus condamner “plusieurs millions de salariés à la pauvreté”.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 2,\n    source: \"Le Monde\",\n    title: \"Instaurer un SMIC à 2000€ net\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"13\",\n    articleContent: \"Le candidat souhaite la disparition totale des frontières et cette proposition vise ainsi à créer une Europe “véritablement unie et fraternelle” afin d’unir ses différents peuples.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 6,\n    source: \"Le Monde\",\n    title: \"Instaurer la création “d’États-Unis socialistes d’Europe”\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"8\",\n    articleContent: \"En réponse à la précarité étudiante mise en lumière depuis le début de la crise sanitaire, cette proposition vise à abaisser le coût des études supérieures en augmentant les bourses et en réduisant les frais d’inscriptions à l’université. Le candidat n’a pour le moment pas précisé le montant de ces augmentations ou réductions.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 3,\n    source: \"L’Etudiant. Proposition du programme de 2017\",\n    title: \"Augmenter les bourses étudiantes et baisser les frais d’inscription à l’université\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"9\",\n    articleContent: \"Selon le canddiat, les animaux subissent “des souffrances inutiles” qui résultent du système économique capitaliste, sans se soucier de la nature, des animaux et des hommes. Le candidat s’oppose également à la corrida et au combat de coq.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 1,\n    source: \"Le Monde\",\n    title: \"Lutter contre l’abattage et l’élevage intensif des animaux\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"1\",\n    articleContent: \"Selon le candidat, il est nécessaire d’augmenter les salaires de “300, de 400, de 500 euros”. Pour faire face à l’inflation, le candidat souhaite également indexer les salaires sur les prix.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 2,\n    source: \"Le Monde\",\n    title: \"Augmenter les salaires de 300 euros minimum\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"615637\",\n    articleContent: \"Les brevets confèrent aux vaccins une protection en raison de leurs innovations. Le transfert du savoir-faire du vaccin exige une somme importante d’argent en contrepartie ce qui provoque selon le candidat “l’enrichissement de quelques millionnaires”. Déplorant l’inaccessibilité du vaccin dans les pays pauvres, le candidat souhaite donc lever ces brevets.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 4,\n    source: \"Le Monde \",\n    title: \"Lever les brevets des vaccins contre le Covid-19\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"6\",\n    articleContent: \"En 2021, la part du budget de l’État attribuée à l’Enseignement supérieur, la recherche et l’innovation s’élevait à 3,8% du budget total, soit 24 milliards d’euros. Le candidat estime cependant que les crédits publics pour la recherche ont été détourné au profit des entreprises et de leurs actionnaires ces dernières années. Il propose donc que l’État supprime toutes les subventions et exonérations de cotisations sociales accordées aux entreprises privées pour investir dans la recherche publique, en embauchant des chercheurs, des techniciens, et des ouvriers dans les laboratoires.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 3,\n    source: \"l’Etudiant. Proposition du programme de 2017\",\n    title: \"Rétablir les crédits pour la recherche publique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"28\",\n    articleContent: \"Le candidat estime que les élus devraient être rémunérés à hauteur du salaire moyen des français, afin d’être réellement représentatifs de la population.Selon le candidat, légiférer est un travail qui n’a pas besoin d’être davantage rémunéré qu’un autre.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 10,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Limiter l’indemnité des élus au montant du salaire moyen net\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"24\",\n    articleContent: \"Actuellement, les forces armées françaises sont déployées pour les opérations Barkhane (Mauritanie, Mali, Burkina Faso, Niger et Tchad) et Chammal (Syrie et Irak). Des militaires français sont également déployés dans le cadre d’opérations menées par l’ONU (Liban, Sahara, Mali, République centrafricaine, République démocratique du Congo), l’Union européenne (République centrafricaine, EULPC, Atalante, Althea, Mali, Irini), ou l’OTAN (Pays baltes). Pour le candidat, ces opérations sont “des guerres qui sont toujours menées pour le profit, jamais dans l’intérêt des peuples”.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 9,\n    source: \"Les Echos\",\n    title: \"Arrêter les opérations militaires françaises\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"27\",\n    articleContent: \"Selon l’article L2122-16 du Code général des collectivités territoriales, la révocation des maires et de leurs adjoints doit découler d’un décret motivé. Concernant les élus départementaux, régionaux et les parlementaires, aucune loi ne permet leur révocation. Pour ne plus qu’ils exercent leur fonction, ils doivent démissionner. Cette proposition vise à instaurer un référendum révocatoire à l’initiative du peuple, qui permettrait aux citoyens de pouvoir destituer n’importe quel élu, à n’importe quel moment.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 10,\n    source: \"L’Express, Le Monde. Proposition du programme de 2017\",\n    title: \"Permettre la destitution des élus à tout moment\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"4\",\n    articleContent: \"La taxe sur le carburant est un impôt indirect prélevé sur le prix total de l’essence. Le candidat estime que les profits des entreprises pétrolières doivent financer cet impôt et non pas les travailleurs.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 2,\n    source: \"Le Monde\",\n    title: \"Exonérer les travailleurs des taxes sur le carburant\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"23\",\n    articleContent: \"On qualifie de “dépendantes” les personnes qui nécessitent une aide pour réaliser des actes de la vie quotidienne. Si l’on se réfère aux critères d’attribution de l’allocation personnalisée d’autonomie (APA), 1,2 million de personnes âgées sont aujourd’hui “dépendantes”. Le candidat souhaiterait créer un service public dédié à la dépendance doté de fonds propres. Il serait notamment chargé du recrutement des aides-soignants.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 4,\n    source: \"Le Monde, L’Express\",\n    title: \"Créer un service public spécialisé pour les personnes dépendantes\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"19\",\n    articleContent: \"D’après des chiffres du ministère de l’Intérieur, le code et le permis de conduire coûtent en moyenne 1.800 euros par individu. Certaines aides peuvent cependant être accordées par l’État, sous certaines conditions. Le candidat propose que le permis soit financé en partie ou intégralement par l’autorité publique.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 8,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Faire financer le permis de conduire des jeunes les plus défavorisés par l’État\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"20\",\n    articleContent: \"Le candidat souhaite créer des postes dans le domaine de l’éducation ainsi que dans les hôpitaux publics. \",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 8,\n    source: \"Le Monde\",\n    title: \"Créer davantage d’emploi dans les services publics de l’éducation et de la santé\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"29\",\n    articleContent: \"Lors d'une élection, le vote blanc consiste à ne voter pour aucun des candidats en déposant dans l’urne une enveloppe vide ou contenant un bulletin sans nom de candidat. Il est à différencier de l’abstention (absence de vote) et du vote nul (vote non valable). Cela peut être un moyen d’expression politique et indiquer une volonté de se démarquer du choix proposé par l’élection. Actuellement, le vote blanc est comptabilisé, mais n’est pas pris en compte dans le calcul des suffrages exprimés et ne peut donc pas influencer le résultat de l’élection.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 10,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Prendre en compte le vote blanc\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"21\",\n    articleContent: \"La durée du congé paternité a été prolongée à 28 jours, le 1er juillet 2021. 3 jours sont financés par l’employeur et 25 par la sécurité sociale. Le congé maternité varie, quant à lui, entre 16 et 26 semaines. Le modèle allemand propose aux deux parents de se partager 14 mois de congés, indemnisés à hauteur des deux tiers du salaire et plafonnés à 1 800 euros par mois. Le candidat souhaiterait mettre en place un modèle similaire en France, afin d’aider les pères à jouer un rôle tout aussi important que les mères dans l’éducation de leurs enfants.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 8,\n    source: \"Le Monde\",\n    title: \"Allonger le congé paternité en s’inspirant du modèle allemand\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"25\",\n    articleContent: \"L’objet de cette proposition est de permettre une égalité totale des droits pour tout individu entrant sur le territoire français. Cela revient donc à accueillir sans condition tous les réfugiés ou migrants entrant sur le territoire. Le candidat estime que les sans-papiers ont leur place dans le combat qui est le sien : “combattre la minorité capitaliste qui domine le monde et nous pousse dans la barbarie”.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 9,\n    source: \"L’Express, Le Monde. Proposition du programme de 2017\",\n    title: \"Autoriser la liberté de circulation et d'installation à tous les migrants\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"12\",\n    articleContent: \"Cette proposition fait référence au système de la “Françafrique” qui désigne les relations de la France avec les pays de l’Afrique francophone. Les défenseurs de cette proposition évoquent une nouvelle forme de colonialisme, essentiellement porté par de grands groupes tels que Total, Bouygues, ou Orano, qui exploiteraient les travailleurs africains.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 6,\n    source: \"L'Obs\",\n    title: \"Exproprier les grands groupes capitalistes français présents en Afrique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"10\",\n    articleContent: \"Le candidat dénonce le fait que, selon lui, les producteurs d’organismes génétiquement modifiés (OGM) fabriquent des produits conçus uniquement pour maximiser leur profit. Il propose de mettre en place des débats publics et une discussion collective sur la production des OGM, pour que la population puisse avoir son mot à dire.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 1,\n    source: \"Proposition du programme de 2017\",\n    title: \"Placer la recherche sur les OGM sous contrôle de la population\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"14\",\n    articleContent: \"Le candidat est contre le fait d’infliger des sanctions économiques à la Russie car “ce sera la population qui les payera”. De plus, le candidat ne souhaite pas envoyer d’armes à l’Ukraine. En effet, le candidat estime que, dans ce conflit, les responsabilités sont partagées en condamnant notamment les décisions des “puissances impérialistes occidentales et les Etats-Unis” et l’OTAN qui aurait “ceinturé” la Russie.\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 6,\n    source: \"Le Monde\",\n    title: \"N’infliger aucune sanction économique à la Russie et ne fournir aucune arme à l’Ukraine\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"36405\",\n    articleContent: \"De nombreuses écoles françaises nouent des partenariats avec des entreprises afin d’obtenir des financements. Cette proposition, qui vise à supprimer la possibilité de conclure de tels partenariats, mettrait par exemple fin à l'accord qui existe entre l’école Polytechnique et l’entreprise Total. Le candidat estime qu’il s’agirait d’un moyen d’éviter que l’enseignement supérieur  ne formate les étudiants “à suivre des logiques capitalistes”. .\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 3,\n    source: \" SOURCE \",\n    title: \"Interdire le financement privé des établissements de l’enseignement supérieur\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"6300650\",\n    articleContent: \"L’objet de cette proposition est la régularisation de l’ensemble des sans-papiers : selon le candidat, tout individu qui vit et travaille en France est français de fait, et mérite donc la totalité des droits accordés aux français. Pour le candidat, régulariser tous les sans-papiers est 'une mesure d'humanité élémentaire” qui est “dans l'intérêt de tous les travailleurs de ce pays.'\",\n    firstPropositions: 0,\n    idCandidat: 5,\n    idTheme: 9,\n    source: \"Le Monde, proposition du programme de 2017\",\n    title: \"Transformer automatiquement tous les sans-papiers en citoyens\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"440\",\n    articleContent: \"Lors de sa création en 1952, la Communauté Européenne du Charbon et de l’Acier était composée de 6 pays. Aujourd’hui, l’Union européenne en compte 27, et 7 pays sont candidats pour l’intégrer. Afin d’aider ces pays à faire les réformes nécessaires pour respecter les valeurs de l’Union et se conformer progressivement à ses règles, le Parlement Européen vote un instrument d’aide de pré-adhésion (IAP) tous les 7 ans. Pour la période 2021-2027, l’IAP est doté d’un budget global de 14,2 milliards d’euros. Cette proposition vise à empêcher toute nouvelle adhésion d’Etats à l’Union européenne, et notamment la Turquie. Le candidat propose également que la France arrête de payer sa part à l’IAP.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 6,\n    source: \"Programme du ou de la candidate\",\n    title: \"Refuser tout nouvel élargissement de l’Union Européenne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"451\",\n    articleContent: \"Selon la Drees (Direction de la recherche, des études, de l’évaluation et des statistiques), 700 988 infirmiers et infirmières exercent actuellement en France, pour une population d’environ 67 millions d’habitants. Cela représente 10,46 infirmiers pour 1000 habitants. Faisant écho au manque de personnel durant la crise de la Covid-19, cette proposition vise à augmenter les effectifs de soignants, jugés trop faibles en France par le candidat.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 4,\n    source: \"France Info\",\n    title: \"Recruter 25 000 soignants\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"435\",\n    articleContent: \"Cette proposition vise à instaurer un examen obligatoire, avant l’entrée au collège, pour vérifier les acquis de l’école primaire. Si les élèves ne réussissent pas cet examen, ils pourront suivre des cours dans des classes de consolidation afin de commencer l’école secondaire avec toutes les connaissances nécessaires pour réussir l’année scolaire.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 3,\n    source: \"Le Monde\",\n    title: \"Instaurer un examen à l’entrée en 6ème pour créer des classes de consolidation\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"430\",\n    articleContent: \"À l’heure actuelle, chaque parent peut donner jusqu’à 100 000 € par enfant sans qu'il y ait de droits de donation à payer. Un couple peut donc transmettre à chacun de ses enfants 200 000 € en exonération de droits. Cet abattement de 100 000 € peut s’appliquer en une seule ou en plusieurs fois tous les 15 ans. Sous les mêmes conditions, les donations consenties aux petits-enfants bénéficient d’un abattement de 31 865 €, et celles consenties aux arrière-petits-enfants de 5 310 €. L’objectif de cette proposition est d’assouplir le régime des donations aux enfants et aux petits enfants.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 2,\n    source: \"BFM + France Info\",\n    title: \"Créer un régime de donations défiscalisées tous les six ans, jusqu'à 100 000 euros, de la part des grands-parents et parents\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"437\",\n    articleContent: \"Cette proposition s’inscrit dans la lignée du Pacte Vert pour l’Europe présenté par la Commission Européenne en 2020. Selon l’Ademe, les ventes de véhicules fonctionnant uniquement aux énergies fossiles représentent actuellement 77% des ventes de véhicules neufs. Cette proposition vise à interdire la vente de ces véhicules à l’horizon 2035. En complément, le candidat précise que les véhicules neufs devront se passer totalement d’énergies fossiles en 2040, et que ces interdictions devront être accompagnées d’installations systématiques de bornes de recharges.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 1,\n    source: \"Programme officiel\",\n    title: \"Interdire la vente de véhicules neufs ne fonctionnant qu’aux énergies fossiles en 2035\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"659225\",\n    articleContent: \"Cette proposition vise à permettre une simplification administrative via la création d’une autorité spécifique à cette mission : le “Comité de la hache”. Cette autorité aurait pour objectif de diviser par deux les codes juridiques (en divisant donc par deux le nombre de normes codifiées) et de supprimer 500 des 1500 structures para-étatiques.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 10,\n    source: \"Programme officiel\",\n    title: \"Mettre en place un ‘’Comité de la hache’’\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"450\",\n    articleContent: \"Les médecins s’installent fréquemment dans les villes, là où se concentre une forte densité de population, souvent afin de garantir un chiffre d’affaire suffisant. Cette proposition vise à inverser la tendance en incitant les médecins à s’installer dans des zones dites de “désert médical”, dans lesquelles il est difficile de trouver un médecin à proximité. Il s’agirait d’offrir une bourse d’étude aux médecins en échange de leur pratique, durant dix ans, dans ces zones.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 4,\n    source: \"BFM + France Info\",\n    title: \"Créer une bourse d'études pour les médecins exerçant dix ans dans un désert médical\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"442\",\n    articleContent: \"Aujourd’hui, seule la société américaine Space X possède un lanceur spatial réutilisable. Néanmoins, en 2020, l’Agence Spatiale Européenne a lancé le programme Thémis par la signature d’un contrat avec Ariane Group. Ce programme a pour objectif de produire un prototype de lanceur spatial réutilisable dont le vol d’essai devrait avoir lieu en 2023. Cette proposition vise à confirmer dès 2022 la production du lanceur spatial réutilisable européen.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 6,\n    source: \"Programme du ou de la candidate\",\n    title: \"Investir dans un lanceur spatial réutilisable avec l’Union Européenne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"455\",\n    articleContent: \"Les peines plancher ont été introduites par une loi de 2007 puis supprimées en 2014. Elles étaient des peines minimums fixées par la loi pour certaines infractions. Ainsi, les juges ne pouvaient que donner une peine comprise entre la peine plancher et la peine maximale. Le ou la candidate souhaite instaurer des peines planchers lors d’agressions contre les forces de l’ordre, les élus et toutes personnes dépositaires de l’autorité publique. Le ou la candidate prévoit également que toutes les agressions contre les élus fassent l’objet de poursuites et d’une comparution immédiate en cas de flagrant délit.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 9,\n    source: \"Programme officiel\",\n    title: \"Instaurer des peines plancher\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"445\",\n    articleContent: \"Le candidat souhaite que les grandes figures de la Nation soient célébrées chaque année dans les écoles. Des personnalités comme Jeanne d’Arc, Charles de Gaulle, Molière, ou Pasteur (...) sont prises comme exemples dans son programme pour la présidentielle.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 7,\n    source: \"Programme officiel\",\n    title: \"Célébrer une journée nationale des héros français\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"449\",\n    articleContent: \"Actuellement, le congé parental, d’une durée d’un an, ne peut être pris au plus tard que jusqu’au jour du 3e anniversaire de l'enfant. Le candidat souhaite allonger la possibilité de prendre ce congé jusqu’à ses 18 ans en cas de difficultés scolaires ou de problèmes de santé.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 4,\n    source: \"BFM\",\n    title: \"Mettre en place un congé parental aménageable en cas de difficultés scolaires ou problèmes de santé\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"432\",\n    articleContent: \"L’État français possède des parts de capital dans de nombreuses entreprises. Ces participations de l’État sont gérées par l’Agence des Participations de l’État, qui a pour mission d’investir en fonds propres dans des entreprises jugées stratégiques. En règle générale, une participation est considérée comme minoritaire lorsque la personne possède moins de 50% du capital d’une entreprise. Cette proposition vise à vendre toutes les participations minoritaires de l’État dans différentes entreprises. Le candidat estime que ces ventes permettraient de récupérer 15 milliards d’euros de recettes d’ici 2027, et d’améliorer l’agilité des entreprises concernées.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 2,\n    source: \"Programme officiel\",\n    title: \"Céder toutes les participations minoritaires de l’État\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"4475510\",\n    articleContent: \"L’objet de cette proposition est la création d’une réserve composée de professeurs retraités ayant notamment pour mission de remplacer les enseignants absents et d’assurer l’aide aux devoirs de la primaire au lycée et de manière bénévole. Ainsi, cette réserve permettrait de favoriser la fluidité de remplacement des professeurs et d’offrir à des élèves issus de milieux défavorisés des cours gratuits hors de l’école.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 3,\n    source: \"Le Monde\",\n    title: \"Créer une 'réserve éducative nationale'\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"461\",\n    articleContent: \"L’objectif de cette proposition est de réduire la longueur de la procédure pénale en la simplifiant grâce à différents procédés. Il s’agirait notamment de réduire les délais de jugement et de systématiser les comparutions immédiates ou à délai rapproché pour les flagrants délits.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 10,\n    source: \"France Info\",\n    title: \"Simplifier la procédure pénale\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"438\",\n    articleContent: \"Cette réserve écologique citoyenne serait composée de membres d’associations de protection de l’environnement, de volontaires et de personnes devant réaliser des travaux d’intérêt général. Elle aurait pour mission de faire un nettoyage systématique des espaces naturels protégés et de mener des actions de prévention.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 1,\n    source: \"Programme officiel\",\n    title: \"Créer une réserve écologique citoyenne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"457\",\n    articleContent: \"Le candidat propose d’insérer dans la Constitution 12 principes visant à réduire l’immigration en France. Il propose notamment l'instauration de plafonds maximum annuels d'immigration votés par le Parlement et répartis selon les zones géographiques et les Etats d'origine, ou le conditionnement de la délivrance des titres de séjour à la possession de ressources suffisantes, la maîtrise de la langue française, et au respect de la laïcité et des valeurs de la République.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 9,\n    source: \"BFM, France Info\",\n    title: \"Réviser la Constitution pour réduire l’immigration\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"441\",\n    articleContent: \"L’aide publique au développement est une aide financière et technique versée par de nombreux États de l’OCDE aux pays en développement. En France, cette aide au développement est régie par une loi du 4 août 2021, qui prévoit que cette aide passe de 0,55 % du revenu national brut français en 2022 à 0,7% de ce revenu en 2025. Actuellement, la part française de cette aide sert à plusieurs pays en développement sur différents continents. Cette proposition vise à restreindre le versement français de cette aide aux seuls pays Africains.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 6,\n    source: \"Programme du ou de la candidate\",\n    title: \"Concentrer l’aide au développement française sur l’Afrique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"32083\",\n    articleContent: \"Actuellement, tout enfant né en France de parents étrangers et né à l’étranger acquiert la nationalité française automatiquement et de plein droit à sa majorité. Le candidat souhaite instaurer un système de droit du sol volontaire, dans lequel chaque jeune né en France devra faire une demande d’acquisition de nationalité, et être soumis à une vérification d’adhésion aux principes de la République.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 8,\n    source: \"France Info\",\n    title: \"Suppression du 'droit du sol automatique' à 18 ans, mais 'une garantie d'assimilation'\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"443\",\n    articleContent: \"Les lois sur le mécénat ont pour objectif de promouvoir et d’inciter le mécénat, une pratique qui consiste à faire un don à un organisme pour soutenir une œuvre d'intérêt général. Ces dons sont déduits de l’impôt à hauteur de 66% pour les particuliers et de 40 ou 60% pour les entreprises, sous certaines conditions. Cette proposition vise à renforcer les dispositifs existants en étendant l’objet des lois sur le mécénat, dans le but de permettre aux entreprises locales et aux français de s’impliquer davantage dans la préservation du patrimoine.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate\",\n    title: \"Renforcer les lois sur le mécénat pour sauvegarder le patrimoine\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"444\",\n    articleContent: \"Cette proposition vise à doter chaque enfant d’un instrument de musique dans le but de leur donner un accès à la culture en faisant la promotion de la pratique d’un instrument. Le candidat souhaite engager cette politique en partenariat avec les collèges et les conservatoires, en s’appuyant sur des initiatives existantes.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate\",\n    title: \"Mettre en place une politique ‘’un enfant, un instrument’’\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"436\",\n    articleContent: \"La taxe carbone aux frontières de l'UE est une idée formulée par Jacques Chirac puis reprise par tous les présidents français, qui a récemment refait surface lorsque la Commission Européenne l’a incorporée dans son Pacte Vert Européen en 2020. Cette taxe a vocation à imposer les normes environnementales européennes, souvent plus contraignantes, aux entreprises étrangères exportant au sein de l'UE. L’idée est d’éviter les délocalisations de productions polluantes, et d’inciter les producteurs des pays tiers à réduire leurs émissions.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 1,\n    source: \"Programme officiel\",\n    title: \"Instaurer une taxe carbone aux frontières de l’Union européenne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"447\",\n    articleContent: \"Actuellement, plusieurs primes et allocations sont versées aux parents à la naissance de leurs enfants. On retrouve notamment une prime de 948 €, versée en une fois, à la naissance, sur condition de ressources, ainsi que diverses autres aides pour la garde de l’enfant ou lorsque les parents cessent leurs activités pour assurer son éducation. Cette proposition vise à verser une prime de 900€ par an à tous les parents, de la naissance du 1er enfant jusqu’à ses 18 ans, dans le but de relancer la natalité en France.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 8,\n    source: \"Programme du ou de la candidate\",\n    title: \"Créer une prime à la natalité pour les parents, à hauteur de 900€ par an jusqu’aux 18 ans du 1er enfant\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"456\",\n    articleContent: \"Selon l’article 6 de la Déclaration des Droits de l’Homme et du Citoyen la loi doit être la même pour tous. Toutefois certaines circonstances permettent aux juges de rendre plus sévère la peine rattachée à une infraction (caractère raciste ou homophobe d’une infraction par exemple). Les quartiers de reconquête républicaine sont des quartiers où les moyens policiers et judiciaires sont renforcés afin de lutter contre la délinquance et les trafics. Cette proposition vise à faire de la seule présence dans un quartier de reconquête républicaine une circonstance aggravante lors de la commission d’une infraction.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 9,\n    source: \"Programme officiel\",\n    title: \"Eriger en circonstance aggravante certaines infractions dans 72 zones de reconquête républicaine\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"433\",\n    articleContent: \"Cette proposition vise à augmenter nombre d’heures de classe à l’école primaire (qui s’élève aujourd’hui à 24 heures par semaine). L’objectif serait que 50% du temps scolaire soit consacré aux cours de français, et 25% aux cours de mathématiques. Cela se traduirait par une augmentation de deux heures par semaine de l’enseignement du français, et d’une heure pour celui des mathématiques.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 3,\n    source: \"BFM TV\",\n    title: \"Augmenter l'enseignement du français et des mathématiques en primaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"428\",\n    articleContent: \"Cette proposition a vocation à toucher 12 millions de français et s’ajouterait à la prime d’activité. Le candidat prévoit de transférer progressivement les cotisations vieillesse payées par les salariés aux entreprises pour augmenter mécaniquement les salaires de 10%. Il prévoit de négocier cette augmentation dans le cadre d’une conférence salariale tripartite. L’État reprendrait deux tiers du coût de cette augmentation à son compte en faisant peser le dernier tiers sur les entreprises suite à une négociation sur l’organisation du temps de travail, l’assurance-chômage, les retraites et les différentes contributions des entreprises.\",\n    firstPropositions: 0,\n    idCandidat: 8,\n    idTheme: 2,\n    source: \"Programme officiel\",\n    title: \"Augmenter de 10% les salaires nets jusqu’à 2,2 SMIC\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"64\",\n    articleContent: \"En France, les élections législatives reposent sur le scrutin uninominal par circonscription. Le mode de scrutin proportionnel est un système électoral dans lequel le nombre de sièges à pourvoir est partagé en proportion du nombre de voix recueillies : les partis présentent une liste de candidats et se répartissent les sièges à l’issu du vote en fonction nombre de voix que chacune des listes a recueillies. Cette méthode d’élection est jugée comme étant plus représentative de la diversité d’opinion mais peut conduire à davantage d'instabilité parlementaire (pouvant freiner le gouvernement).\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 10,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Instaurer le scrutin proportionnel intégral lors des élections législatives\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"49\",\n    articleContent: \"L’objet de cette proposition est de défendre le service public audiovisuel en luttant activement contre la concurrence des médias privés (parfois constitués en monopoles) qui constituent la majorité des médias.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 7,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Augmenter les financements des médias publics\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"50\",\n    articleContent: \"En France, aucune loi ne traite spécifiquement de l'euthanasie ou du suicide assisté. L’euthanasie consiste à provoquer le décès d'un individu atteint d'une maladie incurable lui infligeant des souffrances et qui souhaite mourir. Le suicide assisté désigne l'acte de fournir à une personne un environnement et les moyens nécessaires pour qu'elle se suicide. Actuellement, la mort donnée à un patient, quels que soient son état et sa volonté, est considérée comme un homicide.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 8,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Autoriser l'euthanasie et le suicide assisté\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"40\",\n    articleContent: \"Établi en 2010, le Service civique est un dispositif offrant la possibilité aux jeunes de 16 à 25 ans de s'engager pour une durée de 6 à 12 mois dans une mission d'intérêt général en France ou à l'étranger. Par ailleurs, depuis 2019, le Service national universel (SNU) a été instauré pour les jeunes. Ce programme a pour ambition de succéder indirectement au service militaire en France qui est suspendu depuis 1997. Pour le moment, le SNU est volontaire puisqu’une réforme constitutionnelle ainsi qu'un projet de loi sont nécessaires pour le rendre obligatoire.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 3,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Rejeter tout projet de service militaire ou civique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"54\",\n    articleContent: \"Le candidat souhaite que tous ceux dont l’état de santé ne leur permet pas de travailler et que tout travailleur en dehors d’une situation d’emploi perçoivent un revenu au moins égal au SMIC. Il s’agit donc d’instaurer une forme de revenu universel.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 4,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Rémunérer tous les chômeurs à hauteur d’un SMIC minimum\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"6822725\",\n    articleContent: \"Cette proposition vise à revaloriser le travail des élèves en apprentissage ou en stage en leur accordant une rémunération plus juste, qu’importe leur âge, leur expérience et leur efficacité.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 3,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Interdire les rémunérations inférieures au SMIC et les contrats non rémunérés aux apprentis et aux stagiaires\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"48\",\n    articleContent: \"Cette proposition vise à conférer aux rédactions un droit de regard par rapport aux décisions éditoriales et économiques des dirigeants de leur entreprise médiatique.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 7,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Accorder plus de pouvoir aux rédactions dans les médias\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"59\",\n    articleContent: \"Pour le candidat, il n’est pas admissible que la France fournisse à des pays jugés comme étant peu ou non-démocratiques (à l’image des Emirats Arabes Unis) de l’armement de pointe ensuite utilisé dans des conflits au Moyen-Orient, notamment à l’encontre de populations civiles.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 9,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Stopper les exportations françaises d’armes et arrêter la production d’armes\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"31\",\n    articleContent: \"En France, l’article L3121-27 du Code du travail dispose : “la durée légale de travail effectif des salariés à temps complet est fixée à trente-cinq heures par semaine”. Le candidat estime que réduire ce temps à 32 heures permettrait de réduire le chômage puisque les entreprises devront davantage recruter pour compenser la diminution de ce temps de travail. De plus, cela offrirait aux salariés une augmentation du temps extraprofessionnel, pour les loisirs et la vie familiale.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 2,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Réduire à 32 heures le temps de travail hebdomadaire, sans diminution de salaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"60\",\n    articleContent: \"L’objet de cette proposition est la régularisation de l’ensemble des sans-papiers : selon le candidat, tout individu qui vit et travaille en France est français de fait, et mérite donc la totalité des droits accordés aux français.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 9,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Régulariser tous les sans-papiers\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"38\",\n    articleContent: \"Afin de gommer les inégalités entre les étudiants et rendre l’enseignement accessible à tous, le candidat souhaite assurer la conservation de l’université gratuite et non sélective.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 3,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Conserver une université gratuite et non sélective\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"53\",\n    articleContent: \"La proposition vise à instaurer la gratuité intégrale des soins, en ville ou à l’hôpital. Le candidat souhaite l’assortir de la suppression des assurances complémentaires santé, de l’instauration du tiers payant intégral (absence de toute avance de frais), de la suppression des franchises médicales, du forfait hospitalier et de l’interdiction de tout dépassement d’honoraires.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 4,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Rembourser à 100% les frais de santé par la Sécurité sociale\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"30\",\n    articleContent: \"Actuellement, en principe, l’âge légal à partir duquel il est possible de prendre sa retraite est fixé à 62 ans. Par exception, dans le cas de carrière longue, d’handicap ou de retraite anticipée pour pénibilité, il est possible de partir à la retraite avant cet âge. De tradition anticapitaliste, ce candidat considère qu’aller à la retraite au-delà de 60 ans est une exploitation de l’homme par le système capitaliste qui privilégie les profits aux vies humaines.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 2,\n    source: \"Les Echos\",\n    title: \"Permettre le départ à la retraite dès 60 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"35\",\n    articleContent: \"Actuellement, le droit du travail permet le licenciement des salariés pour divers motifs économiques (difficultés économiques, mutations technologiques, réorganisation de l’entreprise nécessaire à la sauvegarde de l’activité, cessation d’activité) ou personnels (existence d’une cause réelle et sérieuse inhérente à la personne du salarié). Le candidat juge que les licenciements et suppressions de postes - parfois en masse - résultant de crises économiques bénéficient à des actionnaires et des particuliers avant de réellement servir l’intérêt général.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 2,\n    source: \"Les Echos, Le Monde. Proposition du programme de 2017\",\n    title: \"Interdire les licenciements et les suppressions de postes\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"52\",\n    articleContent: \"En France, la consommation de stupéfiants est un délit : l’article L3421-1 du Code de la santé publique dispose que “l'usage illicite de l'une des substances ou plantes classées comme stupéfiants est puni d'un an d'emprisonnement et de 3750 euros d'amende”. Néanmoins, la législation ajoute que “l'action publique peut être éteinte (...) par le versement d'une amende forfaitaire d'un montant de 200 €”.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 8,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Légaliser le cannabis\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"44\",\n    articleContent: \"Les traités de libre-échange instaurent des échanges commerciaux avec très peu de restrictions normatives entre États pour favoriser le développement du commerce international. Selon le candidat, arrêter le libre-échange permet d’établir une politique commerciale protectionniste, de favoriser l’industrie française et donc de défendre les intérêts des travailleurs.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 6,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Rejeter tous les traités de libre-échange\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"41\",\n    articleContent: \"Le candidat estime qu’il est nécessaire d’exproprier les groupes privés de l’énergie pour lutter contre des hausses arbitraires des prix de l’électricité et du gaz.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 1,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Exproprier les groupes privés de l’énergie\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"46\",\n    articleContent: \"L’expression « Françafrique » est utilisée - en général - pour dénoncer la politique étrangère de la France en Afrique, que le pays concerné soit une colonie ou non. Elle se caractérise notamment par l'ingérence directe des autorités françaises dans leurs affaires intérieures, qu’elles soient politiques, économiques, diplomatiques ou militaires. Le candidat propose ainsi de revoir intégralement les relations franco-africaines.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 6,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Démanteler le système de la Françafrique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"55\",\n    articleContent: \"L’objectif de cette proposition est d'intégrer progressivement les cliniques privées aux services publics de santé, cela se faisant par l’expropriation des actionnaires des cliniques privées.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 4,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Exproprier les actionnaires des cliniques privées\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"56\",\n    articleContent: \"L’objet de cette proposition est de permettre une égalité totale des droits pour tout individu entrant sur le territoire français. Cela revient donc à accueillir sans condition tous les réfugiés ou migrants entrant sur le territoire.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 9,\n    source: \"Les Echos\",\n    title: \"Instaurer une liberté totale de circulation aux frontières\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"45\",\n    articleContent: \"Cette proposition a pour objet la mise à l’arrêt d’une politique extérieure interventionniste (notamment sur le plan militaire) de la France. Pour le candidat, les politiques militaires interventionnistes ne permettent pas de réduire les conflits dans le monde et accentuent les conflits locaux concernés.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 6,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Exiger la fin des interventions militaires au Moyen-Orient\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"47\",\n    articleContent: \"Le Conseil supérieur de l'audiovisuel (CSA) est l’autorité publique française de régulation de l’audiovisuel (radio et télévision). Cette régulation a pour but de garantir la liberté de communication audiovisuelle. Le candidat souhaite transformer le CSA en un organisme de supervision de tous les médias, dont la presse. Ce nouvel organisme devra s’assurer du pluralisme politique au sein des médias, et que la distribution des aides publiques ne soit plus attribuée prioritairement aux grands groupes médiatiques.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 7,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Interdire grâce au CSA la concentration de l’information\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"42\",\n    articleContent: \"En France, les centrales nucléaires ont une durée de vie de dix ans. En effet, tous les dix ans, un contrôle de sécurité a lieu dans chaque centrale, à la suite duquel peut être prononcée la prolongation de dix ans de la durée de vie des réacteurs. Le candidat juge que la durée de vie des centrales est prolongée au nom de considérations économiques passant avant la sécurité des populations.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 1,\n    source: \"Le Monde. Proposition du programme de 2017\",\n    title: \"Fermer immédiatement tous les réacteurs nucléaires de plus de 30 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"43\",\n    articleContent: \"Le candidat estime que les mesures de sécurité des centrales nucléaires françaises ne peuvent pas garantir un risque zéro de catastrophe nucléaire et qu’ainsi, ces centrales ne sont pas compatibles avec la sécurité des populations.\",\n    firstPropositions: 0,\n    idCandidat: 9,\n    idTheme: 1,\n    source: \"France Inter\",\n    title: \"Sortir du nucléaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"257\",\n    articleContent: \"L’OTAN est l’Organisation du traité de l'Atlantique nord, une organisation politico-militaire instaurée en 1949 par les pays signataires - dont la France. Cette organisation internationale compte trente membres dont les États-Unis, le Canada et vingt-huit pays européens. L'objectif de l'OTAN est de « garantir la liberté et la sécurité de ses membres par des moyens politiques et militaires ». Le candidat estime nécessaire que la France sorte de l’OTAN afin de retrouver unesouveraineté politique et militaire.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 6,\n    source: \"Les Echos\",\n    title: \"Sortir de l'Organisation du Traité Atlantique Nord (OTAN)\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"275\",\n    articleContent: \"Le référendum est un instrument de \\\"démocratie directe\\\" qui permet au président de la République, sur proposition du Gouvernement ou du Parlement, de soumettre au peuple un projet de loi qui peut porter sur différents sujets. Le candidat propose d’instaurer le référendum d’initiative citoyenne (RIC) afin de permettre à des citoyens qui réunissent au minimum 700 000 signatures de saisir la population par référendum.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title: \"Instaurer le Référendum d’initiative citoyenne (RIC), déclenché avec un soutien minimum de 700 000 citoyens\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"251\",\n    articleContent: \"Le candidat souhaite préparer la transition énergétique du nucléaire vers des centrales de quatrième génération, qu’il estime être plus sûres et moins chères. Par ailleurs, il veut rénover et prolonger de 25 \\u202fans les centrales nucléaires en fin de vie.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 1,\n    source: \"Programme du ou de la candidate\",\n    title: \"Développer les centrales nucléaires de 4ème génération, rénover et prolonger de 25 \\u202fans les centrales nucléaires en fin de vie\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"269\",\n    articleContent: \"Un prêt à taux zéro garanti par l’État est une aide d’État consistant en un prêt d’argent dont les intérêts sont nuls car assumés par l’État. Cette proposition vise à le généraliser pour les étudiants, à hauteur de 20 000 euros.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 4,\n    source: \"Programme du ou de la candidate\",\n    title: \"Accorder aux étudiants un prêt de 20\\u202f000 \\u202feuros à taux zéro, garanti par l’État\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"249\",\n    articleContent: \"Actuellement, une première langue est enseignée dès le primaire. Au collège, les élèves ont des cours de deux langues vivantes dont l’anglais. Pour le candidat, il est nécessaire d’enseigner une seconde langue dès le primaire, qu’elle soit étrangère ou régionale. \",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 3,\n    source: \"Programme du ou de la candidate\",\n    title: \"Enseigner une seconde langue (étrangère ou régionale) dès le primaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"273\",\n    articleContent: \"Jugeant leur déploiement insuffisant, le candidat souhaite soutenir les modes alternatifs de règlements des différends en développant la négociation, la conciliation et la médiation. De plus, le candidat estime que ces solutions, qui apportent une réponse non violente à un conflit, permettraient de désengorger les tribunaux. \",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 9,\n    source: \"Programme du ou de la candidate\",\n    title: \"Renforcer la médiation, la conciliation et la négociation dans le domaine de la justice\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"268\",\n    articleContent: \"Actuellement, la Sécurité Sociale couvre toutes les dépenses de santé uniquement en Alsace-Moselle qui a un régime juridique particulier. En effet, ils bénéficient d’un régime d’Assurance maladie spécifique selon lequel les adhérents bénéficient de versements complémentaires, en plus du régime général. Le candidat souhaite instaurer un tel système au niveau national afin que chaque dépense de santé soit couverte par la Sécurité Sociale.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 4,\n    source: \"Programme du ou de la candidate\",\n    title: \"Couvrir par la Sécurité Sociale toutes les dépenses de santé\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"261\",\n    articleContent: \"Le candidat propose d’orienter le financement public de la culture et des médias vers la création indépendante, plutôt que vers les activités de grands groupes, financements que le candidat juge trop importants à leur égard. \",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate \",\n    title: \"Orienter le financement public de la culture et des médias vers la création indépendante\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"264\",\n    articleContent: \"La consommation de cannabis est illégale en France. Depuis le 1er septembre 2020, elle est sanctionnée par 200€ d’amende. Le candidat propose de légaliser le cannabis mais il souhaite encadrer strictement sa vente et dédier une part des recettes à la lutte contre l’addiction.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 8,\n    source: \"Programme du ou de la candidate \",\n    title: \"Légaliser le cannabis, en encadrant sa vente et en dédiant une part des recettes à la lutte contre l’addiction\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"266\",\n    articleContent: \"Actuellement, en principe, l’âge légal à partir duquel il est possible de prendre sa retraite est fixé à 62 ans. Par exception, dans le cas de carrière longue, d’handicap ou de retraite anticipée pour pénibilité, il est possible de partir à la retraite plus tôt. Par ailleurs, le système actuel est la retraite par répartition. Cela signifie que les cotisations, versées par les actifs au titre de l'assurance vieillesse, sont immédiatement utilisées pour payer les pensions des retraités. Le candidat propose de ne pas faire une réforme des retraites, en maintenant un fonctionnement par répartition et un âge de départ à 62 ans.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 8,\n    source: \"Programme du ou de la candidate \",\n    title: \"Maintenir l'âge actuel de départ à la retraite et maintenir la retraite par répartition\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"274\",\n    articleContent: \"Initialement, le mandat du président de la République était de 7 ans. Depuis les réformes constitutionnelles de 2000 et 2008, son mandat a été réduit à 5 ans, renouvelable une fois. Le candidat propose un référendum pour choisir la durée de ce mandat : le maintien du dispositif actuel ou le retour au septennat.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title: \"Choisir entre le septennat ou le maintien du quinquennat par référendum \",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"271\",\n    articleContent: \"Afin de garantir l’application des peines courtes et le respect des conditions d’hygiène et de sécurité, le candidat propose de lancer un plan de construction de prison. \",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 9,\n    source: \"Programme du ou de la candidate\",\n    title: \"Lancer un plan de construction de prisons \",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"254\",\n    articleContent: \"Actuellement, la décision d'engagement ou de retrait des armées est prise par le président de la République en Conseil de défense. Le candidat souhaite changer à cela en ouvrant le Conseil de défense à la représentation nationale (par référendum ou vote au Parlement) afin de contrôler l’engagement ou le retrait des forces françaises impliquées dans un conflit.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 6,\n    source: \"Programme du ou de la candidate\",\n    title: \"Soumettre l'engagement ou le retrait des forces françaises à un vote du Parlement ou à un référendum\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"272\",\n    articleContent: \"Début 2022, plus de 250 000 agents travaillent au sein de la police nationale et de la gendarmerie. Le candidat souhaite recruter 6 000 gendarmes et policiers supplémentaires sur l’ensemble de son mandat. De plus, il veut ouvrir 2 000 bureaux de police et gendarmerie dans les quartiers et les bourgs, sur de larges horaires.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 9,\n    source: \"Programme du ou de la candidate\",\n    title: \"Recruter 6 000 gendarmes et policiers et ouvrir 2 000 bureaux de police et de gendarmerie\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"247\",\n    articleContent: \"Afin de revitaliser le tissu entrepreneurial des petites villes, le candidat souhaite créer des zones franches dans lesquelles les sociétés seraient exonérées de taxe foncière et d’impôts sur les sociétés. \",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 2,\n    source: \"Programme du ou de la candidate\",\n    title: \"Exonérer de taxe foncière et d’impôts sur les sociétés toute activité professionnelle dont le siège est installé dans les communes de moins de 15 000 habitants\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"246\",\n    articleContent: \"Actuellement, le montant du SMIC est de 1258,25€ net par mois. Le candidat souhaite augmenter le SMIC mensuel de 8%, autrement dit, le fixer à 1400 euros net. Selon lui, cela permettrait de doper le pouvoir d’achat des français et de revitaliser la consommation tournée vers des secteurs à bas revenus (hôtellerie, restauration).\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 2,\n    source: \"Programme du ou de la candidate\",\n    title: \"Revaloriser le SMIC mensuel à 1400 euros net\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"189674\",\n    articleContent: \"Les éoliennes sont des structures d’énergie renouvelable permettant de produire de l’électricité sans utiliser d’énergie fossile. En France, selon l’Agence internationale de l'énergie, les éoliennes fournissent environ 8% de l’électricité globale. Le candidat souhaite mettre fin à la construction d’éolienne. Notamment, il veut interdire, après consultation des habitants, les projets éoliens non validés par les maires.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 1,\n    source: \"Programme du ou de la candidate \",\n    title: \"Stopper l'éolien et interdire les projets éoliens non validés par les maires, après consultation des habitants \",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"265\",\n    articleContent: \"Le candidat souhaite proposer un Service National Universel, du 15 septembre au 15 juin, dès 18 ans. Les jeunes auront le choix entre deux versions : militaire ou civile. \\nDans sa version militaire, le service permettrait de délivrer les notions élémentaires du métier de soldat.\\nDans sa version civile, le service consisterait en une expérience de mixité sociale et de citoyenneté au sein d’associations, de collectivités territoriales ou encore d’écoles. \\nPour le candidat, ce service serait également l’opportunité d’acquérir une formation (permis de conduire, brevet de secourisme, etc.). De plus, il ouvrirait notamment à une première annuité de retraite, à la gratuité des transports et au passage des grades d’hommes et femmes de rang.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 8,\n    source: \"Programme du ou de la candidate \",\n    title: \"Créer un Service National Universel militaire ou civil de 9 mois\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"250\",\n    articleContent: \"Le candidat souhaite alléger les programmes scolaires et renforcer les savoirs fondamentaux : lire, écrire et compter. De plus, il estime nécessaire de limiter le nombre d'élèves par classes dans toutes les écoles primaires ainsi que dans les collèges et lycées des REP (réseau d'éducation prioritaire) et REP+, sans pour autant donner un chiffre.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 3,\n    source: \"Programme du ou de la candidate\",\n    title: \"Limiter le nombre d'élèves par classe et insister sur les savoirs fondamentaux (lire, écrire, compter)\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"252\",\n    articleContent: \"En investissant des les énergies renouvelables, le candidat souhaite développer l’énergie solaire (production et stockage) avec pour objectif de créer des centrales solaires. De plus, il veut développer l’énergie de la mer (houle, écart thermique entre la surface et les grands fonds, etc.). \",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 1,\n    source: \"Programme du ou de la candidate\",\n    title: \"Investir dans les énergies renouvelables \",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"248\",\n    articleContent: \"En 2021, le classement de l’OCDE des rémunérations des enseignants indique que la France est en 9ème position. Avec 29 400 € brut annuel, les salaires des enseignants français en début de carrière sont inférieurs de 7 % à la moyenne des pays de l’OCDE, bien que ces différences ne prennent pas en compte les impôts imputés ni le coût de la vie de chaque pays. En faisant ce constat, le candidat estime qu’il est nécessaire de revaloriser le salaire des enseignants en début de carrière de 900 euros net, en le passant de 1 500 à 2 400 euros net.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 3,\n    source: \"Programme du ou de la candidate\",\n    title: \"Revaloriser le salaire des enseignants de 900 euros net\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"245\",\n    articleContent: \"Pour le candidat, il est nécessaire de redonner le pouvoir à l'Etat dans les secteurs clefs de l’économie (agriculture, industrie, énergies nouvelles, automobile, aéronautique, routes, recherche spatiale…). Cela passerait notamment par un achat des entreprises sensibles et stratégiques par la Banque Publique d’Investissement (BPI) avec, entre autre, la nationalisation d’EDF, des autoroutes et des entreprises liées à la Défense nationale. \",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 2,\n    source: \"Programme du ou de la candidate\",\n    title: \"Nationnaliser les entreprises stratégiques des secteurs clefs de l’économie (entre autres EDF, les autoroutes et les entreprises liées à la Défense nationale) \",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"263\",\n    articleContent: \"L’objectif de cette mesure est de rendre davantage accessible aux provinciaux les grandes oeuvres d’art des musées de Paris.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 7,\n    source: \"Le Monde, proposition du programme de 2017\",\n    title: \"Créer un circuit de salles provinciales pour faire tourner les œuvres des musées parisiens\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"276\",\n    articleContent: \"Depuis la loi organique n° 2014-125 du 14 février 2014, le cumul de fonctions exécutives locales (comme le mandat de maire) avec le mandat de député ou de sénateur est interdit. Le candidat propose de rétablir les mandats de député-maire et sénateur-maire pour, selon lui, renouer le lien entre les territoires et la représentation nationale.\",\n    firstPropositions: 0,\n    idCandidat: 10,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title: \"Rétablir le cumul des mandats de maire et de parlementaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"290\",\n    articleContent: \"Le conflit israélo-palestinien oppose depuis 1948 Israël à la Palestine pour des raisons politiques, territoriales, et religieuses. Ces deux États ont la spécificité de ne pas être reconnus officiellement par certains États. Cette proposition - visant à faciliter la résolution du conflit - préconise une solution à deux États : à la fois veiller à la reconnaissance d’Israël par tous les Etats du Proche-Orient et du Moyen-Orient, et permettre la création d’un Etat palestinien viable.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 6,\n    source: \"Site du ou de la candidate\",\n    title: \"Soutenir diplomatiquement Israël et permettre la création d’un Etat palestinien\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"279\",\n    articleContent: \"Afin de faciliter le recrutement de chômeurs de longue durée par les entreprises, cette proposition vise à exonérer de charges (des cotisations sociales) les salaires des anciens chômeurs recrutés en CDI, et cela pendant une durée de 5 ans. Le coût de cette mesure est estimé par le candidat à 3 milliards d’euros.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 2,\n    source: \"Site du ou de la candidate\",\n    title: \"Exonérer de charges pendant 5 ans le recrutement CDI de chômeurs de longue durée\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"280\",\n    articleContent: \"Cette proposition vise à augmenter le temps consacré aux matières dites “fondamentales” - le calcul et le français principalement - dans les écoles primaires afin qu’aucun enfant n’entre au collège sans maîtriser la lecture, l’écriture et le calcul.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 3,\n    source: \"Site du ou de la candidate\",\n    title: \"Passer de 9 à 15 heures hebdomadaires l’enseignement du français à l’école primaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"298\",\n    articleContent: \"Selon la direction de la Recherche, des Études, de l'Évaluation et des Statistiques (une administration publique centrale dépendante des ministères), la France a perdu 93.017 lits d’hôpital en 20 ans. Cependant, le nombre de lits de réanimation stagne entre 5000 et 6000. Cette proposition vise à doubler le nombre de lits de réanimation pour atteindre un total de 10 000 lits en cinq ans, notamment pour faire face à des crises sanitaires. La France atteindrait alors un niveau égal à celui de l’Allemagne. Le coût de cette mesure est estimé à 2,5 milliards d’euros par an.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 4,\n    source: \"Site du ou de la candidate\",\n    title: \"Doubler le nombre de lits de réanimation (pour atteindre 10 000) en cinq ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"300\",\n    articleContent: \"Depuis la dernière réforme de 2010 sur les retraites, l'âge légal à partir duquel les français ont le droit de prendre leur retraite est fixé à 62 ans. Il est possible de partir plus tôt pour diverses raisons : carrière longue effectuée, handicap, incapacité permanente d'origine professionnelle). Face aux déficits des caisses de retraite, d’autres partis politiques proposent de repousser l’âge minimum de départ à la retraite. Ce candidat compte financer le système de retraite avec une politique destinée à créer 2 millions d’emplois permettant d’avoir de nouveaux cotisants.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 4,\n    source: \"Site du ou de la candidate\",\n    title: \"Maintenir l'âge actuel minimum de départ à la retraite et la durée de cotisation\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"293\",\n    articleContent: \"L’objectif de cette proposition est de permettre aux français d’accéder gratuitement à des services culturels au moins une fois par an. Le ticket, ouvert à tous les français de plus de 16 ans, donnerait droit à deux options à choisir parmi un billet de cinéma Art et essai (cinéma indépendant), une place de théâtre, une exposition, un concert ou encore une visite d’un monument historique partout en France.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 7,\n    source: \"Site du ou de la candidate\",\n    title: \"Offrir un « ticket découverte culturelle » par an à tous les Français\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"297\",\n    articleContent: \"La gestation pour autrui (GPA) est une méthode de procréation médicalement assistée : c’est lorsque qu’une femme porte l’enfant d’un autre couple. Elle se pratique généralement lorsqu’une femme ne peut porter l’enfant du fait d’une malformation ou de l’absence d’utérus. Aujourd’hui, la GPA peut aussi être employée dans un contexte d’homoparentalité, pour un couple d’hommes. Interdite dans le code civil français depuis 1994, la pratique de la GPA est un délit passible d'un an d'emprisonnement et de 15.000 euros d'amende : l’objet de cette proposition est de renforcer cette sanction pénale.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 8,\n    source: \"Site du ou de la candidate\",\n    title: \"Renforcer l’interdiction pénale de la gestation pour autrui (GPA)\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"303\",\n    articleContent: \"Le porte-avions est un navire de guerre dont le pont supérieur constitue une plateforme d'envol et d'atterrissage pour les avions. La France dispose actuellement d’un porte-avions nucléaire : le Charles de Gaulle, mis en service depuis 2001. Le candidat estime le coût total d’un nouveau porte-avions à 6 milliards d’euros, pour une durée de vie de 40 ans.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 9,\n    source: \"Site du ou de la candidate\",\n    title: \"Construire un second porte-avions\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"301\",\n    articleContent: \"Afin que l’État puisse agir davantage efficacement sur ses prérogatives de sécurité publique, cette proposition vise à recruter 30 000 représentants des forces de l’ordre et 10 000 personnels administratifs, pour un investissement de 2 milliards d’euros par an. Sur l’effectif des 30 000 recrutements, ce candidat souhaite 10 000 douaniers et policiers de l’air et des frontières, 10 000 effectifs mobiles pour relayer les effectifs militaires mobilisés sur l’Opération Sentinelle, et 10 000 policiers et gendarmes pour compenser les baisses d’effectifs des précédents quinquennats.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 9,\n    source: \"Site du ou de la candidate\",\n    title: \"Recruter un total de 40 000 agents pour appuyer les forces de l’ordre\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"286\",\n    articleContent: \"Cette proposition vise à remplacer l’Union européenne par un nouvel organisme interétatique appelé “Communauté des États Européens” et articulé autour de trois objectifs principaux :<ul><li>La “liberté”, par l’indépendance de la Communauté vis-à-vis de tout Etat ou organisme tiers, notamment en matière de défense et de politique étrangère.</li><li>La “paix” par un pacte de non-agression entre pays membres.</li><li>La “prospérité” par la participation à un marché commun fondé sur une loyauté des échanges à l’intérieur, sur une coordination des politiques commerciales et, sur la préférence communautaire vis-à-vis de l’extérieur.</li></ul>\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 6,\n    source: \"Site du ou de la candidate\",\n    title: \"Remplacer l’Union européenne par une Communauté des États Européens\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"281\",\n    articleContent: \"Suspendu en 1997 par Jacques Chirac, le service national français - aussi appelé service militaire - est une mobilisation temporaire de citoyens dans un moment de cohésion visant à les impliquer dans la vie de la Nation et à développer des connaissances sur la Défense à l’image de la JDC (Journée Défense et Citoyenneté) et, plus récemment, du SNU (Service National Universel). L’objet de cette proposition est de rétablir un service national obligatoire de 3 mois, au cours duquel les jeunes pourront notamment passer leur permis de conduire. Ce service national serait aménageable en service militaire d’un an pour les jeunes qui le souhaitent.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 3,\n    source: \"Site du ou de la candidate\",\n    title: \"Rétablir un service national obligatoire de 3 mois\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"299\",\n    articleContent: \"Dans l’objectif de faire face aux déserts médicaux (manque d’infrastructures et de médecins dans certains territoires), cette proposition vise à rouvrir au minimum un établissement de santé (comme un hôpital ou une maternité) par département. À cela s’ajoute la volonté de cesser les concentrations d’établissements de santé (notamment dans les métropoles).\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 4,\n    source: \"Site du ou de la candidate\",\n    title: \"Rouvrir au minimum un établissement de santé dans chaque département\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"289\",\n    articleContent: \"Les relations diplomatiques entre l’Union européenne et la Russie se sont refroidies suite à l’annexion de la Crimée par la Russie et en raison de l’intervention indirecte de cette dernière dans la Guerre du Donbass (contre l’Ukraine) depuis 2014. Depuis le début de cette crise ukrainienne, l’UE conduit une politique de sanctions économiques et politiques à l’égard de la Russie. Cette proposition vise à rompre avec cette stratégie pour développer un accord de paix et de coopération russo-européen, dans l’espoir de mettre fin à ce conflit ukrainien.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 6,\n    source: \"Site du ou de la candidate\",\n    title: \"Développer une coopération euro-russe pour mettre fin à la crise ukrainienne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"306\",\n    articleContent: \"En réduisant le nombre de députés (de 577 aujourd’hui à 500) et de sénateurs (de 348 à 300), l’objectif de cette proposition est de faciliter la prise de décision et de faire des économies. Pour information, l'Institut Montaigne (un think thank français libéral) estime le coût annuel d'un député à 336 000 € et celui d'un sénateur à 445 000 €.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 10,\n    source: \"Site du ou de la candidate\",\n    title: \"Diminuer le nombre de parlementaires d’au moins un tiers\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"283\",\n    articleContent: \"Face à l’usage toujours important des énergies fossiles, telles que le pétrole et le gaz, cette proposition vise à valoriser l’usage d’énergies renouvelables et décarbonées à l’image du “bois énergie”, du biogaz (pour une production locale d’électricité), du bio-éthane, du chauffage géothermique... Le candidat s’oppose aux éoliennes et panneaux photovoltaïques, qu’il juge comme n’étant pas assez rentables et ayant trop de défauts.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 1,\n    source: \"Site du ou de la candidate\",\n    title: \"Remplacer le pétrole et le gaz par des énergies décarbonées\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"277\",\n    articleContent: \"Cette proposition vise à développer un fonds d’investissement et de relocalisation pour les produits « Label Tricolore » (label souhaité par le candidat : il serait accordé aux produits 100% fabriqués en France et respectant des normes de qualité sociale et environnementale). Ce fonds serait doté de 10 milliards d’euros par an pour favoriser l’investissement productif, l’emploi et la recherche dans les zones périphériques et rurales notamment.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 2,\n    source: \"Site du ou de la candidate\",\n    title: \"Créer un fonds d’investissement et de relocalisation pour des produits locaux\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"295\",\n    articleContent: \"L’objet de cette proposition est d’étendre l’application de la loi du 15 mars 2004 (interdisant le port de signes ou de tenues par lesquels les élèves manifestent ostensiblement une appartenance religieuse dans les écoles, collèges et lycées publics) aux hôpitaux et aux entreprises.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 8,\n    source: \"Site du ou de la candidate\",\n    title: \"Interdire les signes religieux ostentatoires à l'hôpital, dans l’entreprise et à l'université\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"296\",\n    articleContent: \"L’objet de cette proposition est de rétablir le contrôle aux frontières en mettant fin au système Schengen (espace de libre circulation entre certains pays européens). Ce retour au contrôle serait accompagné par le recrutement de 10 000 policiers de l’air et des frontières, et par l’usage de nouvelles technologies (comme les portiques de sécurité, les contrôles aléatoires, les capteurs de reconnaissance de plaques minéralogiques).\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 8,\n    source: \"Site du ou de la candidate\",\n    title: \"Rétablir le contrôle aux frontières\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"305\",\n    articleContent: \"Alors que la reconnaissance du vote blanc est un débat institutionnel fréquent, l’objectif de cette mesure est d’accorder un nouveau rôle au vote blanc dans les élections : s’il est majoritaire, le scrutin est reporté et les candidats battus ne pourront pas se représenter.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 10,\n    source: \"Site du ou de la candidate\",\n    title: \"Prendre en compte le vote blanc dans les résultats des élections\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"278\",\n    articleContent: \"L’objet de cette proposition est de réserver une proportion d’achats publics (effectués par des structures publiques comme l’État ou les collectivités territoriales) à hauteur de 75% minimum aux entreprises produisant en France lors de l’octroi des marchés publics. L’objectif est ainsi d'encourager les organisations publiques à acheter des produits français afin de privilégier l'industrie nationale. Cette mesure s’inspire du “Buy American Act” de 1933 qui impose l'achat de biens produits sur le territoire américain pour les achats directs effectués par le gouvernement américain.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 2,\n    source: \"Site du ou de la candidate\",\n    title: \"Réserver une large proportion d’achats publics aux entreprises produisant en France\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"285\",\n    articleContent: \"Pour faire face à la production importante de CO₂ issue des véhicules polluants (notamment les moteurs Diesel), cette proposition vise à accompagner des français à remplacer leurs voitures : l’objectif est de remplacer 10 millions de véhicules les plus énergivores en 10 ans. Pour réaliser cette transition, le candidat estime que l’Etat devrait investir 1 milliard d’euros par an. La prime d’accompagnement ne serait pas renouvelée pour une nouvelle acquisition de véhicule.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 1,\n    source: \"Site du ou de la candidate\",\n    title: \"Remplacer les 10 millions de véhicules les plus énergivores en 10 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"282\",\n    articleContent: \"L’objet de cette proposition est de limiter le nombre de redoublements autorisés par filière et par année universitaire afin que des étudiants évitent de persévérer dans l’échec. Pour information, le ministère français de lʼEnseignement supérieur, de la Recherche et de lʼInnovation estime à 11530 € par étudiant le coût pour l’Etat d’une année d’étude à l’université.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 3,\n    source: \"Site du ou de la candidate\",\n    title: \"Limiter le nombre de redoublements autorisés par filière et année universitaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"284\",\n    articleContent: \"Pour les avocats de l’énergie nucléaire, produite dans les centrales nucléaires (qui ont une durée de vie d’environ 40 ans), celle-ci a plusieurs atouts : elle ne rejette pas de CO2 (mais de la vapeur d'eau), est disponible en permanence, pas chère à produire et permet d’avoir de grandes quantités d’électricité. En novembre 2018, le Président de la République Emmanuel Macron avait fixé un objectif de réduction du nucléaire de 50% dans le mix énergétique d'ici 2050. Cette proposition du candidat s’oppose à cet objectif en visant au contraire un maintien du nucléaire à hauteur de 70% minimum de la production d’électricité en France.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 1,\n    source: \"Site du ou de la candidate\",\n    title: \"Maintenir le nucléaire à 70% de la production d’électricité minimum\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"292\",\n    articleContent: \"L’objectif de cette proposition est de permettre aux français et résidents en France d’accéder gratuitement aux musées le dimanche afin de les encourager à davantage fréquenter les lieux culturels.\",\n    firstPropositions: 0,\n    idCandidat: 11,\n    idTheme: 7,\n    source: \"Site du ou de la candidate\",\n    title: \"Instaurer la gratuité des musées le dimanche pour tous les Français\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"4956820\",\n    articleContent: \"Afin de répondre à la demande en énergie électrique, le candidat propose de construire six nouveaux réacteurs nucléaires de 3ème génération (EPR) et de rouvrir la centrale nucléaire de Fessenheim dont l'arrêt définitif des réacteurs s’est achevé en juin 2020. En parallèle, le candidat souhaite la relance du projet ASTRID, un projet de prototype de réacteur nucléaire français de 4ème génération dont le développement a été provisoirement arrêté en 2019.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 1,\n    source: \"France Info\",\n    title: \"Construire six EPR et rouvrir la centrale nucléaire de Fessenheim et relancer le programme ASTRID\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"387\",\n    articleContent: \"Afin de réduire les dépenses des étudiants et jeunes travailleurs, cette proposition vise à favoriser le retour d’un pouvoir d’achat plus élevé pour les jeunes travailleurs, et à réduire la précarité étudiante.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 4,\n    source: \"Ifrap\",\n    title: \"Instaurer la gratuité des trains pour les étudiants et jeunes travailleurs, en dehors des heures de pointe\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"378\",\n    articleContent: \"Le candidat à la présidentielle envisage de restreindre la libre circulation entre Etats membres de l’Union européenne aux citoyens européens seulement. Actuellement, les étrangers ont également le droit de circuler librement dans l’espace Schengen, qu’ils disposent ou non d’un titre de séjour. Il s’agirait donc de revenir sur normes communautaires organisant l’espace Schengen.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 6,\n    source: \"L’Opinion\",\n    title: \"Refuser la libre-circulation des étrangers entre les 26 États membres\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"377\",\n    articleContent: \"L’hydrogène est un élément chimique qui compose l’eau, utilisable en tant que source d’énergie propre. Cette proposition vise à ce que l’Etat développe son utilisation, en apportant des aides en matière de recherche et développement, afin de réduire notre dépendance aux énergies fossiles.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 1,\n    source: \"Programme de la candidate\",\n    title: \"Soutenir une filière française de l’hydrogène\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"393\",\n    articleContent: \"Cette mesure propose de ne plus accorder de logements dédiés aux familles dont les revenus leur permettent difficilement de se loger sur le marché privé, si ces dernières comportent un délinquant.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 9,\n    source: \"Ouest-France\",\n    title: \"Expulser des logements sociaux les familles de délinquants\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"386\",\n    articleContent: \"Les allocations familiales sont aujourd’hui versées aux familles française à partir de la naissance de leur deuxième enfant, et proportionnellement au nombre total d’enfants de moins de vingt ans à charge pour le foyer. Cette proposition vise à relancer la natalité en France, en octroyant un prêt à taux zéro pour les jeunes couples à la naissance de leur premier enfant. Son remboursement serait différé à chaque naissance, et le capital restant serait effacé à la naissance du troisième enfant.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 4,\n    source: \"Les Echos\",\n    title: \"Accorder un prêt aux jeunes parents, qu’ils n’auraient plus besoin de rembourser après la naissance de leur troisième enfant\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"385\",\n    articleContent: \"En 1955, l’Etat a confié la construction et l’exploitation des autoroutes françaises à des sociétés d’économie mixte. Cette proposition vise la reprise d’un contrôle étatique total des autoroutes.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 8,\n    source: \"Le Figaro\",\n    title: \"Nationaliser les autoroutes\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"371\",\n    articleContent: \"Les cotisations sociales sont des prélèvements sur les salaires. Une partie est payée par les salariés (charges salariales), l’autre est payée par leurs employeurs (charges patronales). Cette proposition vise à exonérer de cotisations patronales les hausses de salaires de 10% accordées à l’ensemble des salariés gagnant jusqu'à trois fois le SMIC. Le but, selon le candidat, est à la fois d’augmenter les salaires et de préserver la capacité des entreprises françaises à rester profitables et compétitives.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 2,\n    source: \"L’Opinion\",\n    title: \"Exonérer de cotisations patronales toute hausse de salaire de 10%\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"395\",\n    articleContent: \"En France, le référendum d'initiative populaire, c'est-à-dire le référendum organisé à l'initiative d'une fraction du corps électoral, n'est pas prévu par la Constitution. Cette proposition souhaite offrir l’opportunité aux citoyens, sous certaines conditions, d’être à l’initiative d’un référendum, sans que le concours des autorités publiques ne soit requis.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 10,\n    source: \"Le télégramme\",\n    title: \"Instaurer le référendum d’initiative populaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"2987574\",\n    articleContent: \"Ouvert à tous les jeunes de 18 à 24 ans sur la base du volontariat, le Service National du Patrimoine permettra d’œuvrer à la restauration, à la protection et à la valorisation du patrimoine culturel et naturel de la France métropolitaine et ultramarine. En échange, les volontaires seront indemnisés et bénéficieront d’un accès privilégié à certains emplois liés au patrimoine.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 7,\n    source: \"Programme du ou de la candidate\",\n    title: \"Créer un Service National du Patrimoine de 6 mois\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"372\",\n    articleContent: \"La taxe sur la valeur ajoutée (TVA) est un impôt indirect sur la consommation collecté par le vendeur, qui le reverse ensuite à l'État. En 2021, les français ont payé 8% de TVA sur le prix total de leur carburant, et 14% pour l’électricité. Cette proposition fixerait un plafond maximal du taux de cette TVA à 5% pour les carburants et l’énergie.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 2,\n    source: \"20 minutes\",\n    title: \"Abaisser la TVA à 5,5 % sur les carburants et l’énergie\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"394\",\n    articleContent: \"Cette proposition entend supprimer les aides accordées aux parents qui font preuve d’un manque de sérieux dans l’éducation de leurs enfants, si ces derniers ont commis des délits à répétition.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 9,\n    source: \"Ouest-France\",\n    title: \"Supprimer le versement des aides sociales aux parents de mineurs récidivistes en cas de carence éducative manifeste\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"390\",\n    articleContent: \"Le fichier judiciaire automatisé des auteurs d'infractions sexuelles et violentes (FIJAIS) recense les personnes majeures ou mineures condamnées pour certaines infractions sexuelles ou violentes. Le candidat propose d’y inscrire également les personnes condamnées pour outrage sexiste, défini à l’article 621-1 du code pénal comme “le fait d'imposer à une personne tout propos ou comportement à connotation sexuelle ou sexiste qui soit porte atteinte à sa dignité en raison de son caractère dégradant ou humiliant, soit crée à son encontre une situation intimidante, hostile ou offensante”.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 9,\n    source: \"Ifrap, service public, Code Pénal\",\n    title: \"Inscrire au fichier des criminels et délinquants sexuels les personnes condamnées pour outrage sexiste\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"383\",\n    articleContent: \"Les logements sociaux sont actuellement réservés aux personnes dont les revenus leur rendent difficile l’accès à des logements issus du marché privée. Cette proposition vise à accorder une part du parc de logements sociaux aux policiers. \",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 8,\n    source: \"Ifrap\",\n    title: \"Accorder des places de logements sociaux aux policiers\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"396\",\n    articleContent: \"Dans la fonction publique, les “troisièmes concours” sont destinés à des professionnels issus du secteur privé ou associatif et à des élus. Le candidat souhaite élargir et généraliser le troisième concours de la fonction publique, et le réserver aux plus de 45 ans ayant au moins huit ans d’expérience dans le privé.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 10,\n    source: \"Le Monde\",\n    title: \"Réserver le 3ème concours de la fonction publique aux plus de 45 ans avec au moins 8 ans dans le privé\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"381\",\n    articleContent: \"Le candidat souhaite privatiser l’audiovisuel public dans l’objectif de supprimer la redevance audiovisuelle. Cette taxe, prélevée auprès des téléspectateurs, permet de financer partiellement les antennes publiques de télévision ou les radios. Actuellement, elle est fixée à 138 euros en métropole et à 88 euros en Outre-mer. Le candidat que la France n’a pas besoin d’un service public de l’audiovisuel avec de grands pouvoirs, et souhaite donc le privatiser. Toutefois, cette mesure ne concernera pas les chaînes d’Outre-mer, Arte, TV5 Monde et l’Ina.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 7,\n    source: \"Le Figaro\",\n    title: \"Privatiser l’audiovisuel public\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"375\",\n    articleContent: \"L’objectif de cette mesure est de ne plus imposer une filière unique au collège et d’établir des filières professionnelles d'excellence afin de revaloriser le travail manuel. Le qualificatif ”unique” renvoie à la réforme de 1975 de démocratisation de l’enseignement qui a créé le “collègue unique”, qui n’est autre que le collège que l’on connait aujourd’hui. Auparavant les élèves étaient répartis à la sortie de l’école primaire dans des classes selon leur niveau scolaire.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 3,\n    source: \"Le Parisien\",\n    title: \"Supprimer le collège unique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"388\",\n    articleContent: \"Cette mesure vise à abaisser le nombre de postes administratifs dans les hôpitaux pour pouvoir allouer plus de ressources à la qualité des soins.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 4,\n    source: \"L’Express\",\n    title: \"Réduire le nombre de postes administratifs à l'hôpital\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"382\",\n    articleContent: \"Cette proposition vise à faire voter par référendum une modification de la Constitution pour y inscrire “la défense et la promotion du patrimoine historique et culturel”. Le candidat souhaite adresser cette question au peuple directement, sans respecter la procédure prévue par l’article 89 de la Constitution, à l’image de la méthode employée par Charles de Gaulle en 1962.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 7,\n    source: \"Oui FM\",\n    title: \"Inscrire dans la Constitution “la défense et la promotion du patrimoine historique et culturel”\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"374\",\n    articleContent: \"Le candidat estime qu’il est important de renforcer l’apprentissage du français, de l’histoire, des mathématiques, et de l’ensemble des enseignements qu’il juge fondamentaux.  Il souhaite donc consacrer la moitié du temps d’enseignement à l’école primaire à l’enseignement du français, et supprimer l’Enseignement Langue et Culture d'origine (ELCO).\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 3,\n    source: \"Le Parisien\",\n    title: \"Consacrer la moitié du temps scolaire à l’apprentissage du français\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"384\",\n    articleContent: \"En 2021, l’âge minimum de la retraite est fixé à 62 ans par le code de la sécurité sociale. Pour une personne née après 1973, il faut avoir cotisé 172 semestres, soit un peu plus de 42 années. Cette proposition réduirait l’âge minimal en le réduisant de 2 ans, ainsi que le nombre d’années de cotisation par la même occasion.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 8,\n    source: \"Ifrap\",\n    title: \"Abaisser l’âge de départ à la retraite à 60 ans avec 40 annuités de cotisation\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"8646299\",\n    articleContent: \"Cette proposition vise à faire voter, par référendum, une modification de la Constitution pour y inscrire “la maîtrise de l'immigration”, “la priorité nationale et le principe d'une supériorité du droit français sur le droit international\\\" pour refondre l'ensemble du droit applicable aux étrangers. Le candidat souhaite adresser cette question au peuple directement, sans respecter la procédure prévue par l’article 89 de la Constitution, à l’image de la méthode employée par Charles de Gaulle en 1962.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 6,\n    source: \"20 minutes\",\n    title: \"Inscrire la préférence nationale dans la Constitution\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"370\",\n    articleContent: \"L’impôt sur le revenu (IR) est un impôt direct qui porte sur les revenus des individus. C’est un impôt dit “progressif”, qui croît en fonction du revenu de l’individu. La proposition du candidat, chiffrée à 2 milliards d’euros, vise à supprimer cet impôt pour les jeunes de moins de 30 ans, y compris pour les plus hauts revenus.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 2,\n    source: \"BFM TV\",\n    title: \"Exonérer du paiement de l'impôt sur le revenu (IR) tous les jeunes de moins de 30 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"376\",\n    articleContent: \"En considérant que l’énergie la plus propre est celle que l’on ne consomme pas, cette mesure vise à accorder une grande part du budget de l’Etat à l’isolation des bâtiments. Actuellement, en France, le Plan de Rénovation Energétique de l’Habitat (piloté par l’État) assure une prime de 1.350 € pour aider les ménages aux revenus moyens à financer des travaux de rénovation énergétique de leur logement, pour une durée de 2 ans. Pour les foyers les plus démunis, la prime de financement des travaux de rénovation énergétique monte à 3000€.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 1,\n    source: \"Programme de la candidate\",\n    title: \"Faire de l’isolation de l’habitat une priorité budgétaire du quinquennat\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"373\",\n    articleContent: \"L’uniforme scolaire est une tenue réglementaire, que tous les élèves doivent porter selon des règles précises. Dans un souci d’égalité des enfants quant à leur habillement, cette proposition vise à faire porter un uniforme à chaque écolier, comme c’est le cas en Angleterre par exemple.\",\n    firstPropositions: 0,\n    idCandidat: 12,\n    idTheme: 3,\n    source: \"Brut média\",\n    title: \"Imposer le port de l’uniforme obligatoire à l’école\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"328\",\n    articleContent: \"Avec ces mesures, le candidat souhaite lutter contre les déserts médicaux afin d’établir les mêmes infrastructures de services publics sur l’ensemble du territoire. Actuellement, le système de garde des médecins généralistes est fondé sur le volontariat de ces derniers. Il est ici proposé de mettre fin à ce volontariat et d’obliger les médecins à assurer des gardes. De plus, il est proposé de recruter 1000 médecins salariés par l’Etat pour les déployer dans les centres de santé communaux et départementaux et ainsi combler le manque de médecins dans certains territoires.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 4,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Rétablir un système de garde médicale obligatoire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"307\",\n    articleContent: \"Pour faire face à l’augmentation des prix du carburant et pour redonner du pouvoir d’achat aux salariés, le candidat souhaite que, sur le même modèle que pour les transports en commun, les entreprises remboursent à leurs salariés 50% de leurs frais de carburant pour leurs trajets domicile-travail.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 2,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Faire rembourser, par les entreprises, 50% des frais de carburant de leurs salariés pour le trajet domicile-travail\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"325\",\n    articleContent: \"L’âge légal de départ à la retraite est actuellement fixé à 62 ans. Cette proposition vise à augmenter ce seuil de deux ans. Le candidat estime que les français travaillent moins que leurs voisins européens, ce qui explique, selon lui, une partie de la désindustrialisation. Pour remédier à cela, il souhaite faire rentrer les jeunes français plus tôt dans l’activité professionnelle et augmenter l’âge de la retraite à 64 ans. Selon lui, cette mesure pourrait permettre à l’État de gagner 20 milliards d’euros chaque année.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 8,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Réhausser l’âge légal de départ à la retraite à 64 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"314\",\n    articleContent: \"Avant la réforme de 2018, le cursus général du bac se composait de trois filières : scientifique, économique et sociale et littéraire. Le candidat propose de mettre fin au système actuel et de revenir aux trois filières. La notation du bac se fonde aujourd’hui sur une partie de notes issues du contrôle continu, d’épreuves écrites en 1ère et Terminale, et des épreuves en fin de Terminale. Le candidat propose ainsi d’arrêter le contrôle continu qui, selon lui, nuirait au niveau du baccalauréat, empêcherait l’anonymat des candidats et conduirait à des différences de niveau entre les notes selon les lycées et professeurs. Cela permettrait de faire du bac un examen composé uniquement des épreuves nationales et terminales.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 3,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Revenir au baccalauréat général d’avant la réforme de 2018\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"5138954\",\n    articleContent: \"Le parc nucléaire français est composé de 56 réacteurs nucléaires qui devraient prochainement être rejoints par un nouveau réacteur à Flamanville. Afin d’assurer les actuels et futurs besoins énergétiques de la France, le candidat propose d’investir dans 14 nouveaux réacteurs nucléaires d’ici 2050 et de prolonger la durée de vie des actuels jusqu’à au moins 60 ans. Aujourd’hui, le nucléaire constitue 77% de la production énergétique française, et 40% de la consommation énergétique des français.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 1,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Investir dans 14 nouveaux réacteurs nucléaires d’ici 2050 et prolonger les actuels jusqu’à 60 ans\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"332\",\n    articleContent: \"Aujourd’hui, la majorité pénale est fixée à 18 ans. Le passage de cette majorité à 16 ans implique que les mineurs auteurs d’une infraction seront considérés comme adultes et ne pourront plus bénéficier de l’excuse de la minorité pour obtenir un adoucissement de peine. De plus, l’auteur de l’infraction ne sera plus jugé au tribunal pour enfants mais par un tribunal ordinaire. Enfin, pour mettre fin à l’impunité des mineurs le candidat souhaite suspendre le versement des aides sociales aux parents de mineurs délinquants et criminels.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 9,\n    source: \"Programme du ou de la candidate\",\n    title: \"Abaisser la majorité pénale à 16 ans et suspendre les aides sociales aux parents de mineurs délinquants et criminels\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"327\",\n    articleContent: \"L’aide médicale d’Etat est un dispositif instauré en 2000 qui permet aux étrangers en situation irrégulière de bénéficier d'un accès aux soins. Par cette mesure, le candidat souhaite réserver les soins médicaux aux français en priorité. Les Aides Sociales pour les étrangers extra-européens que le candidat veut supprimer sont des allocations telles que le RSA, les allocations familiales et logement, ou le minimum vieillesse. Le candidat souhaite réserver ces allocations aux français, pour que “la France cesse d’être un centre d’attraction sociale”. Il estime ainsi pouvoir faire 20 milliards d’euros d’économie pour pouvoir abaisser la CSG à 2,5% pour les salariés gagnant entre le SMIC et 2000€ par mois.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 4,\n    source: \"Programme du ou de la candidate\",\n    title: \"Supprimer l’Aide Médicale d’Etat, et les Aides Sociales pour les étrangers extra-européens\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"330\",\n    articleContent: \"Dans le but de donner plus de fermeté à la justice, en plus de recruter 3000 magistrats et 3000 greffiers, le candidat souhaite instaurer des peines planchers pour chaque crimes et délits, c'est-à-dire des peines minimums fixées par la loi en-deçà desquelles les juges ne peuvent fixer de peine pour les crimes et délits. De plus, il propose de rétablir la peine de perpétuité réelle pour les criminels les plus dangereux ainsi que de réduire drastiquement les remises de peine pour que la peine prononcée soit réellement exécutée. Enfin, il prévoit de déchoir de la nationalité française les criminels et les délinquants multirécidivistes\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 9,\n    source: \"Programme du ou de la candidate\",\n    title: \"Restaurer une justice ferme par des peines planchers, de la perpétuité, des déchéances de nationalité\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"323\",\n    articleContent: \"Actuellement plusieurs chaînes de télévision (France Télévisions, Arte, etc…), stations de radio (Radio France) et l’Institut National de l’Audiovisuel (INA) constituent l’audiovisuel public. Le candidat propose de réunir les radios France Inter, Mouv’ et Fip, ainsi que les chaînes de télévision France Info et France 2 au sein d’un groupe intégré destiné à être vendu. France 3 serait quant à elle « transférée aux collectivités locales ». En somme, France 5, France Info, RFI, TV5 Monde, France Culture, Arte et l’INA resteraient dans le giron public.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 7,\n    source: \"Programme officiel du candidat ou de la candidate\",\n    title: \"Privatiser les principales chaînes de l’audiovisuel public\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"311\",\n    articleContent: \"Afin de favoriser la compétitivité des entreprises, le candidat souhaite diminuer certains impôts. Ainsi, il propose une réduction de 30 milliards d’euros des impôts de production. Ces impôts s’entendent comme un prélèvement obligatoire à l’occasion de la production, de l’importation, de la vente de marchandises et de services (par exemple TVA, droits de mutation, taxe foncière, etc…). Depuis le 1er janvier 2022, le taux de l’impôt sur les sociétés est de 15% pour les entreprises dont le chiffre d’affaires est inférieur à 38 120€, et de 25% pour les autres. Le candidat propose de le baisser à 15% pour les entreprises réalisant moins de 300 000€ de chiffre d’affaires.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 2,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Réduire les impôts de production de 30 milliards d’euros et baisser le taux d’impôt sur les sociétés à 15%\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"326\",\n    articleContent: \"Depuis 1999, l’article premier de la Constitution de la Ve République dispose, en son alinéa second, que “la loi favorise l'égal accès des femmes et des hommes aux mandats électoraux et fonctions électives, ainsi qu'aux responsabilités professionnelles et sociales’’. La loi du 6 juin 2000 a ensuite contraint les partis politiques à présenter un nombre égal d’hommes et de femmes pour les élections régionales, municipales, sénatoriales et européennes. Le candidat souhaite supprimer les lois sur la parité, considérant qu’elles constituent une insulte faite aux femmes, dont le mérite et la compétence devraient primer.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 8,\n    source: \"Le Parisien\",\n    title: \"Supprimer les lois sur la parité\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"315\",\n    articleContent: \"Le collège unique est issu d’une réforme de 1975 visant à démocratiser l’enseignement en mettant notamment fin à la répartition des élèves dans des classes en fonction de leur niveau à l’issue de l’école primaire. La réforme du candidat consiste à rétablir le Certificat d’études, supprimé en 1989. Ce rétablissement permettrait, selon lui, de mesurer l’acquisition des savoirs fondamentaux (lecture, écriture, calcul) par les élèves. Les résultats de cet examen permettraient de faire redoubler les élèves ‘’trop faibles’’ et de mettre en œuvre la deuxième partie de cette réforme qui consisterait à répartir les élèves dans des classes de 6ème différentes selon le niveau de chaque élève. De plus, le candidat propose de mettre fin à l’enseignement des langues étrangères avant la 6ème.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 3,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Mettre fin au collège unique en rétablissant le Certificat d’études\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"320\",\n    articleContent: \"Depuis mars 2014, l’Union européenne impose à la Russie des mesures restrictives dans divers domaines en réponse à l’annexion de la Crimée et à l’action de la Russie en Ukraine (notamment dans la région du Donbass). Avec cette mesure, le candidat entend - a minima - mettre fin aux restrictions économiques contre la Russie afin d’en faire un allié géostratégique important pour la France.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 6,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Mettre fin aux mesures restrictives imposées à la Russie par l’Union européenne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"331\",\n    articleContent: \"Pour stopper ces flux, le candidat veut arrêter le regroupement familial, limiter le droit d’asile, rendre obligatoire le dépôt des demandes d’asile à l’étranger et mieux sélectionner les étudiants étrangers. De plus, il propose de mettre fin à ce qu’il appelle les pompes aspirantes en durcissant le droit du sol et les conditions de naturalisation, en supprimant les aides sociales aux non-européens et l’AME, et en interdisant la régularisation des étrangers entrés illégalement en France. Aussi, il veut expulser tous les étrangers dit indésirables : clandestins, criminels et délinquants, et étrangers sans emploi depuis 6 mois. Enfin, il veut déchoir de la nationalité française puis expulser criminels et délinquants multirécidivistes binationaux.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 9,\n    source: \"Programme du ou de la candidate\",\n    title: \"Stopper les flux d’immigration, mettre fin aux “pompes aspirantes” et renvoyer les étrangers indésirables\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"329\",\n    articleContent: \"Actuellement, le montant des allocations familiales versées est lié au montant des revenus. Le candidat propose de mettre fin à cela, que les allocations familiales soient universelles et que leur montant ne soit plus conditionné aux ressources des ménages. Par ailleurs, il propose de doubler le plafond du quotient familial qui est aujourd’hui de 1570€. Avec ces mesures, le candidat souhaite soutenir les familles et encourager la natalité.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 4,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Revenir à l’universalité des allocations familiales et doubler le plafond du quotient familial\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"2194032\",\n    articleContent: \"Le candidat dénonce ce que l’on dénomme la “cancel culture” que l’on traduit par la culture de l’effacement ou de l’annulation. Cette idéologie se démarque notamment par le rejet des figures religieuses ou historiques de la France notamment par le déboulonnage de statues. Le candidat souhaite au contraire réaffirmer les racines chrétiennes de la France en combattant une idéologie qu’il considère “destructrice”.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 7,\n    source: \"Communiqué de presse du candidat\",\n    title: \"Réaffirmer les racines chrétiennes de la France pour combattre la “cancel culture”\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"334\",\n    articleContent: \"La loi de Solidarité et de Renouvellement Urbain (SRU) oblige certaines communes de plus de 3500 habitants et toutes les communes de plus de 15000 habitants à disposer de 20 ou 25% de logements sociaux sur leur territoire. La loi DALO, de son côté, a créé le droit à un logement opposable et permet aux personnes mal logées d’être reconnues prioritaires afin de faire valoir leur droit à un logement ou un hébergement digne. Le candidat souhaite supprimer ces lois car il considère qu’il y a trop de logements sociaux en France.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title: \"Supprimer la loi de Solidarité et de Renouvellement Urbain et la loi DALO\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"1602335\",\n    articleContent: \"Pour augmenter de 100 € net par mois le SMIC, le candidat souhaite baisser les impôts sociaux qui constituent la différence entre salaire brut et salaire net. Il propose également d’exonérer d’impôts et de charges sociales les heures supplémentaires, ce qui augmenterait le salaire des travailleurs en leur faisant payer moins d’impôts. Enfin, le candidat souhaite ne plus soumettre à l’impôt la prime de participation (environ 1500€ par an) pour les salariés et employeurs, et la rendre obligatoire dans les entreprises de plus de 11 salariés. La prime de participation est un processus de redistribution aux salariés des bénéfices de leur entreprise.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 2,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Augmenter de 100€ net le SMIC en défiscalisant les charges salariales\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"319\",\n    articleContent: \"L’OTAN est une organisation politico-militaire rassemblant les États-Unis, le Canada et des États européens afin de contribuer à la sécurité et à la défense collective. Cette proposition vise donc à quitter le commandement intégré tout en demeurant au sein de l’alliance politique, comme l’avait fait le Général de Gaulle en 1966 avant que Nicolas Sarkozy décide de le réintégrer en 2007. Pour le candidat, l’OTAN n’a plus lieu d’être depuis la fin de l’URSS et du Pacte de Varsovie. Il estime qu’il est un outil d’asservissement des pays de l’Ouest par les USA pour repousser la Russie. En faisant cela, le candidat estime que cela lui permettra de réinvestir financièrement et industriellement dans l’armée pour porter son budget à 60 milliards d’euros.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 6,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Sortir du commandement militaire intégré de l’OTAN et hausser le budget de la défense à 60 milliards\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"336\",\n    articleContent: \"En 2022, le budget ‘’Politique de la Ville’’ est doté de 558 millions d’euros pour 1 514 quartiers prioritaires correspondant à des concentrations urbaines de pauvreté. Dans ces quartiers, il finance le renouvellement urbain, le développement économique, mais aussi des actions en faveur de l’accès à la santé, à l’éducation, à la culture. Le candidat souhaite réorienter ce budget vers les villages et les territoires ruraux afin de redynamiser et rénover les centres-villes pour leur assurer une nouvelle attractivité. En effet, il considère que les banlieues bénéficient du dynamisme économique des métropoles et de l’économie parallèle tandis que les villages se dévitalisent.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title: \"Réorienter les budgets de la politique de la ville vers les villages et territoires ruraux\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"2765301\",\n    articleContent: \"L’aide publique au développement est une aide financière et technique versée par de nombreux États de l’OCDE aux pays en développement. En France, cette aide au développement est régie par une loi du 4 août 2021, qui prévoit que cette aide passe de 0,55 % du revenu national brut français en 2022 à 0,7% de ce revenu en 2025. Actuellement, la part française de cette aide sert à plusieurs pays en développement sur différents continents. Cette proposition vise à mettre un terme au versement français de cette aide pour les pays Africains. Le candidat estime qu’elle \\\"suscite une rancœur” envers les pays aidant, notamment les anciens pays colonisateurs.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 6,\n    source: \"Discours du ou de la candidate\",\n    title: \"Mettre fin à l’aide au développement en Afrique\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"333\",\n    articleContent: \"La Constitution de la Ve République adoptée en 1958 prévoyait un mandat d’une durée de 7 ans renouvelable pour le Président de la République. Le passage au quinquennat par voie référendaire en 2000 (sous le Président Jacques Chirac) visait à renouveler plus fréquemment le mandat présidentiel et à diminuer les risques de cohabitation en alignant sa durée sur celle du mandat des députés (5 ans). Cet alignement - qui aboutit au “fait majoritaire” - permet au gouvernement de s’assurer une large majorité à l’Assemblée nationale, ce qui est critiqué par des candidats souhaitant retourner au septennat.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 10,\n    source: \"Programme du ou de la candidate\",\n    title: \"Rétablir un septennat renouvelable\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"313\",\n    articleContent: \"Pour le candidat, ce rétablissement de la discipline et du respect de l’autorité passe d’abord par une responsabilisation des parents en leur suspendant les allocations familiales si leur enfant est perturbateur ou absentéiste. Ainsi, il veut obliger les familles à rétablir l’ordre dans leur foyer pour que leurs enfants n’empêchent plus les autres d’apprendre. Pour les élèves les plus violents, il souhaite créer des internats de réinsertion afin que les établissements scolaires n’aient plus à subir de troubles de leur part. Le candidat propose également de transformer les CPE en Surveillants généraux ayant pour but exclusif le maintien de l’ordre scolaire, et de rétablir l’uniforme de la blouse à l’école primaire.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 3,\n    source: \"Programme officiel du ou de la candidate\",\n    title: \"Rétablir la discipline et le respect de l’autorité au sein des écoles, collèges et lycées\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"318\",\n    articleContent: \"Les zones à faible émission (ZFE) ont été créées par la loi d’Orientation des mobilités en 2019. Ces ZFE ont pour objectif de protéger les habitants des villes et métropoles où la pollution de l’air est importante. Dans le périmètre d’une ZFE, seuls les véhicules les moins polluants (selon leur certificat Crit’Air) ont le droit de circuler. Le candidat considère que cette réglementation expulse les catégories populaires des centres au profit des périphéries, comme s’il s’agissait “d’un péage qui ne dit pas son nom”, et qu’elle discrimine ceux qui ne peuvent pas changer de voiture.\",\n    firstPropositions: 0,\n    idCandidat: 13,\n    idTheme: 1,\n    source: \"Discours du ou de la candidate\",\n    title: \"Supprimer les zones à faible émission et les vignettes Crit’air\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"92\",\n    articleContent: \"Cette proposition vise à encadrer les inégalités salariales au sein d’une même entreprise. Actuellement, il n’existe pas de salaire plafond dans les entreprises françaises. En limitant le salaire maximum à 20 fois le salaire le plus bas, le candidat entend répondre aux “injustices” qui, selon lui, “créent beaucoup de colère dans notre pays”.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 8,\n    source: \"France Inter\",\n    title: \"Encadrer les écarts de salaires dans une même entreprise\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"102\",\n    articleContent: \"Ces nouveaux emplois seraient ouverts en priorité aux jeunes et seraient répartis de la façon suivante :<br><ul><li>100 000 emplois pour les hôpitaux</li><li>100 000 dans les EHPAD publics</li><li>90 000 enseignants</li><li>15 000 dans la recherche</li><li>90 000 AESH pour accompagner nos enfants handicapés à l’école</li><li>30 000 agents au Fisc à Bercy pour lutter contre la fraude et l’optimisation fiscales</li><li>25 000 magistrats et éducateurs pour la justice et l’accompagnement des mineurs</li><li>50 000 ouvriers, techniciens, ingénieurs dans le domaine de l’énergie</li><li>30 000 fonctionnaires de police de proximité</li></ul>\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 10,\n    source: \"Discours du ou de la candidate\",\n    title: \"Créer, former et prérecruter 500 000 emplois dans les services publics\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"478793\",\n    articleContent: \"Bien qu’étant l’un des rares pays au monde encore capable d’organiser rapidement de puissantes frappes d’interventions à l’étranger, la France dépend partiellement des Etats-Unis pour se lancer en guerre. La logistique, les mesures pour contrer les défenses aériennes, et la vente des armes, de nombreux matériels français comprennent des composants américains, sont les principaux points noirs de l’armée française. Le candidat entend miser sur un partenariat européen d’armement qu’il juge plus sûr pour défendre les intérêts de la France. Les Etats-Unis ont en effet plusieurs fois prouvé leur manque de fiabilité vis-à-vis de la France, notamment lors de la vente des fameux sous-marins nucléaires.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 9,\n    source: \"France Inter\",\n    title: \"S’émanciper des technologies militaires américaines en développant leurs équivalents européens\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"4293107\",\n    articleContent: \"Actuellement la conception des nouveaux programmes est dirigé par le Conseil national des programmes (CNP), composé de chercheurs et d’universitaires. Le programme de chaque discipline est rédigé par un groupe d’experts qui travaillent avec pédagogie sur son contenu. Le candidat de la proposition souhaite que “tous les acteurs de l’éducation” participent à l’élaboration des programmes scolaires, et ce avec la logique des 3 tiers : 1 tiers d'enseignements littéraires et sciences humaines et sociales, 1 tiers scientifique et technique, 1 tiers culturels, artistiques et sportifs.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 3,\n    source: \"Discours du ou de la candidate\",\n    title: \"Elaborer démocratiquement les programmes scolaires avec la logique des 3 tiers\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"90\",\n    articleContent: \"En octobre 2021, la Ligue pour la protection des oiseaux a saisi le Conseil d'État après la parution de plusieurs arrêtés réautorisant un certain nombre de chasses traditionnelles d'oiseaux dans plusieurs départements. Interrogé sur ce sujet, le candidat a déclaré ne pas souhaiter s’opposer aux pratiques de la chasse, considérant qu’il s’agissait d’une culture historique à respecter, et de traditions peu pratiquées, qui “ne se transmettent pas”, et vont de toute façon “disparaître naturellement”.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 7,\n    source: \"France Info\",\n    title: \"Maintenir l’autorisation des techniques de chasse traditionnelles\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"3814876\",\n    articleContent: \"Le quotient familial est l’ensemble des revenus d’un foyer qui peuvent être soumis à l’impôt selon le nombre de personnes à charge. En d’autres termes, plus une famille est nombreuse et gagne peu, moins son quotient familial est élevé, moins elle paye d’impôt. Le candidat souhaite que la culture et le sport soient plus accessibles aux foyers très modestes, en réduisant pour eux le coût de ces activités. S’inscrire à des clubs de foot ou acheter un billet pour une pièce de théâtre serait alors plus facile pour les personnes vivant au SMIC.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 7,\n    source: \"Discours du ou de la candidate\",\n    title: \"Adapter les tarifs des pratiques culturelles et sportives au quotient familial\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"66\",\n    articleContent: \"Cette proposition s’accompagnerait d’une augmentation du SMIC à 1800€ brut. Actuellement, la valeur du SMIC brut mensuel s’élève à 1589 euros. En augmentant le SMIC de 200€ par mois, le candidat entend rehausser le pouvoir d’achat des français. Il considère cependant que la seule augmentation du SMIC n’est pas suffisante, et qu’il est nécessaire d’inscrire dans la loi l’augmentation de tous les salaires en fonction de l’inflation, mesure qui avait été supprimée en 1982. Le candidat propose également de dégeler le point d’indice dans la fonction publique, celui-ci étant resté le même depuis 2010, à l’exception d’une revalorisation de 1,2% pour l’année 2016.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 2,\n    source: \"France Inter\",\n    title: \"Inscrire dans la loi l’augmentation des salaires en fonction de l’inflation\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"80\",\n    articleContent: \"Cette proposition rentre dans le cadre d’un futur mix énergétique français dans lequel les énergies renouvelables représenteraient 50% de la consommation totale d’énergie. Le candidat estime que la production énergétique des panneaux solaires et des éoliennes dépendant de la météo, qui n’est pas contrôlable, ces technologies ne doivent pas être favorisées.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 1,\n    source: \"France Inter\",\n    title: \"Investir dans les technologies hydroélectriques, et non pas le solaire ou l’éolien\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"75\",\n    articleContent: \"En 2021, le budget du ministère de l’Éducation nationale s’élevait à 55,1 milliards d’euros. C’est le budget le plus important de l’État français, hors crédits du plan de relance. Une augmentation de 50% servirait surtout, pour le candidat, à recruter des professeurs et à augmenter leurs salaire.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 3,\n    source: \"France Inter\",\n    title: \"Augmenter de 50% le budget de l’Education nationale\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"76\",\n    articleContent: \"Le nombre maximum d’heures d’enseignement dans les classes de primaires (écoles maternelles et élémentaires) est actuellement de 24 heures. Le candidat souhaiterait augmenter le temps de présence des élèves pour leur permettre de faire leurs devoirs directement en classe et non à la maison, de façon à réduire les inégalités. Pour ce faire, le candidat ne souhaite pas augmenter le temps de travail des enseignants, mais propose le recrutement de 90 000 professeurs supplémentaires durant le prochain quinquennat.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 3,\n    source: \"France Inter\",\n    title: \"Augmenter le travail à l’école à 32h par semaine pour les élèves de primaire\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"97\",\n    articleContent: \"En France, la police de proximité est une doctrine d’emploi de la police nationale instaurée à partir de 1998, et globalement supprimée à partir de 2003. Elle repose sur trois piliers (PPP), que sont la “prévention” (préalable à la démarche dissuasive et répressive), la “proximité” (mode d’intervention au cœur de la population, dans laquelle les forces de police doivent se fondre), et le “partenariat” (coopération entre les différentes autorités et les secteurs publics, privés et associatifs). La proposition du candidat entend recréer une police de proximité dans chaque commune, en dotant les policiers de plus de ressources pour lutter contre l’insécurité.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 9,\n    source: \"France Inter\",\n    title: \"Créer une police de proximité de 30 000 hommes\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"98\",\n    articleContent: \"Le candidat souhaite que l’État recrute 15 000 contrôleurs fiscaux, spécifiquement chargés de la lutte contre la fraude et l’évasion fiscale. Cette mesure s’accompagnerait d’une répression plus sévère des délits fiscaux, passant notamment par la mise en place de peines de prison fermes et de la déchéance des droits civiques pour les fraudeurs.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 9,\n    source: \"Discours du ou de la candidate\",\n    title: \"Embaucher 15 000 contrôleurs fiscaux et punir plus sévèrement la fraude fiscale\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"82\",\n    articleContent: \"Cette proposition s’inscrit dans le cadre d’une politique de grands travaux souhaitée par le candidat. En 2016, le nombre de “logements commencés” s’élevait à 376 500.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 1,\n    source: \"Discours du ou de la candidate\",\n    title: \"Rénover et construire 500 000 logements et bâtiments publics chaque année\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"91\",\n    articleContent: \"Promulguée le 13 juillet 1990, la loi Gayssot énonce en son article premier que « toute discrimination fondée sur l’appartenance ou la non-appartenance à une ethnie, une nation, une race ou une religion est interdite. » Le candidat propose de renforcer cette loi en sanctionnant de 5 ans d’inéligibilité toute personne condamnée pour incitation à la haine.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 8,\n    source: \"Les Echos\",\n    title: \"Instaurer une peine d’inéligibilité de 5 ans à l’incitation à la haine\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"9339508\",\n    articleContent: \"Cette proposition implique une impossibilité pour les médecins à s’installer dans les zones déjà denses en médecins, sauf s’il s’agit d’un remplacement. Un désert médical est un espace géographique dans lequel les populations éprouvent des difficultés à accéder aux soins de santé de tout type, tout particulièrement en cas de besoin urgent faisant appel à des spécialistes rares (opération chirurgicale, traitement de maladies graves...). Aujourd’hui 8millions de français ne peuvent pas consulter plus de deux fois par an un médecin faute d’en avoir un à proximité. L’Île-de-France est la plus célèbre des régions avec de nombreux déserts médicaux.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 4,\n    source: \"Discours du ou de la candidate\",\n    title: \"Inciter les médecins à s’installer dans les déserts médicaux\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"96\",\n    articleContent: \"Pour le candidat, ce fond doit permettre à toutes les cantines scolaires du pays de fournir des repas équilibrés à partir de produits locaux, au prix maximum d’un euro par enfant et par repas.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 4,\n    source: \"Discours du ou de la candidate\",\n    title: \"Mettre en place un fond alimentaire national de 10 milliards d’euros\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"95\",\n    articleContent: \"Adoptée en 2009, la loi Bachelot ambitionnait de réformer les hôpitaux publics, notamment dans le but de les ramener à l'équilibre budgétaire. Les opposants à cette loi dénoncent la création “d’hôpitaux-entreprises”, dans lesquels les directeurs prennent des décisions destinées uniquement à rééquilibrer les comptes des hôpitaux. Le candidat propose donc d’abroger cette loi.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 4,\n    source: \"Discours du ou de la candidate\",\n    title: \"Abroger la loi Bachelot pour améliorer le service public hospitalier\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"78\",\n    articleContent: \"Actuellement, le bouquet énergétique français se compose à 40 % de nucléaire, 29 % de pétrole, 15 % de gaz naturel, 12 % d’énergies renouvelables et déchets et de 3 % de charbon. Le candidat estime que le nucléaire est l’énergie verte avec le plus haut rendement au monde. Augmenter sa part reviendrait donc, selon lui, à réduire le poids des énergies fossiles en France.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 1,\n    source: \"Le Point\",\n    title: \"Maintenir au moins 50% de nucléaire dans le mix énergétique français\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"83\",\n    articleContent: \"La pratique du “dumping” consiste à vendre une marchandise à l'étranger à un prix inférieur que celui appliqué sur le marché national. Au sein de l’Union Européenne, c’est le dumping fiscal qui est régulièrement dénoncé, c’est-à-dire le fait, pour les États, de mettre en place une fiscalité plus faible que celle des pays voisins afin d'attirer les capitaux étrangers. Des pays comme le Luxembourg, l’Irlande ou les Pays-Bas sont particulièrement visés. Le candidat souhaite donc lutter contre ces pratiques.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 6,\n    source: \"BFM TV\",\n    title: \"Lutter activement contre le dumping au sein de l’Union européenne\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"101\",\n    articleContent: \"Le candidat qualifie la plateforme d’admission des lycéens dans l’enseignement supérieur de “machine à sélection sociale”. Il n’a cependant pas proposé d’alternative à ce jour.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 10,\n    source: \"l’Humanité\",\n    title: \"Supprimer Parcoursup\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"85\",\n    articleContent: \"L’Organisation du traité de l'Atlantique nord (OTAN) est une organisation politico-militaire mise en place par les 12 pays signataires du traité de l'Atlantique nord en 1949, afin de pouvoir remplir leurs obligations de sécurité et de défense collectives. La France faisait partie des pays fondateurs de l’organisation en 1949, et ne l’a jamais quittée depuis lors. En 1966, Charles de Gaulle avait décidé de retirer la France de son commandement intégré, décision sur laquelle Nicolas Sarkozy est revenu en 2009. Cette proposition entend quitter l’OTAN intégralement et définitivement.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 6,\n    source: \"France Inter\",\n    title: \"Sortir du commandement armé de l’OTAN pour à terme quitter l’organisation\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"86\",\n    articleContent: \"Cette proposition sous-tend une nouvelle logique d’ingérence de la France dans les affaires étrangères, au nom des droits de l’homme. L’intervention proposée par le candidat ne prendrait pas une forme militaire, mais consisterait davantage en une série de pressions diplomatiques et économiques sur le régime des Talibans, couplées à l’envoi d’aides humanitaires.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 6,\n    source: \"Discours du ou de la candidate\",\n    title: \"Permettre à la démocratie de subsister en Afghanistan\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"67\",\n    articleContent: \"Une entreprise est dite « nationalisée » quant l’État est propriétaire de plus de 50% de son capital. En France, la majorité des grandes opérations de nationalisation ont eu lieu dans l’immédiat après-guerre. La loi de nationalisation de 1982 avait entrepris une nouvelle vague de nationalisation dans des secteurs tels que l’industrie et la finance. Depuis 1986, le nombre d’entreprises publiques a diminué de moitié.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 8,\n    source: \"France Inter\",\n    title: \"Nationaliser Axa, la BNP et la Société Générale\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"8712466\",\n    articleContent: \"Par gastronomie française, le candidat veut parler “du bon vin, de la bonne viande, et du bon fromage”. Selon lui pour la défendre, il faut la rendre accessible à tous les français, c’est à dire baisser ses prix. Cela passerait probablement par un investissement de l’Etat auprès des agriculteurs. Défendre la gastronomie française prend tout son sens lorsque l’on se rappelle du changement d’appellation en Russie du prestigieux champagne français, renommé localement “vin mousseux” pour baisser ses ventes.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 7,\n    source: \"La Dépêche\",\n    title: \"Rendre la gastronomie française accessible à tous\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"72\",\n    articleContent: \"Le prélèvement à la source est un mode de recouvrement de l’impôt qui consiste à faire prélever son montant par un tiers payeur au moment du versement des revenus. En France, environ la moitié des prélèvements obligatoires sont prélevés à la source pour les contribuables. Le candidat souhaite également prélever à la source l’impôt sur les bénéfices des multinationales, pour mettre fin à la fraude fiscale, qu’il estime atteindre entre 60 et 80 milliards d’euros par an.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 2,\n    source: \"Discours du ou de la candidate\",\n    title: \"Prélever à la source les bénéfices des multinationales\",\n    toShowOnSwipe: 1\n  },\n  {\n    id: \"73\",\n    articleContent: \"La facture d’eau des français s’élève en moyenne à 40 euros par mois. Le prix de l’eau est cependant fixé par les communes, et peut donc varier en fonction des territoires. Le candidat souhaite investir dans la gestion de l’eau et sa distribution, rendre ses premiers mètres cubes gratuits et créer un service public de l’eau à l’échelle nationale afin de garantir un prix égal pour tous.\",\n    firstPropositions: 0,\n    idCandidat: 15,\n    idTheme: 2,\n    source: \"Discours du ou de la candidate\",\n    title: \"Rendre gratuits les premiers mètres cubes d’eau\",\n    toShowOnSwipe: 1\n  }\n]\n\nexport default propositionsList;"
  },
  {
    "path": "assets/data/team/index.js",
    "content": "export default team = [\n    {\n        id: 1,\n        role: 'founder',\n        firstName: 'Grégoire',\n        lastName: 'Cazcarra',\n        social: 'gregoirecazcarra',\n        imageURI: require(\"../../../assets/data/team/gregoire.png\"),\n    },\n    {\n        id: 2,\n        role: 'founder',\n        firstName: 'François',\n        lastName: 'Mari',\n        social: 'francoismari_',\n        imageURI: require(\"../../../assets/data/team/francois.png\"),\n    },\n    {\n        id: 3,\n        role: 'com',\n        firstName: 'Gaspard',\n        lastName: 'Guermonprez',\n        social: 'gaspard_g',\n        imageURI: require(\"../../../assets/data/team/francois.png\"),\n    },\n    {\n        id: 4,\n        role: 'com',\n        firstName: 'Lousion',\n        lastName: 'Poilvet',\n        social: 'louison.plvt',\n        imageURI: require(\"../../../assets/data/team/francois.png\"),\n    },\n    {\n        id: 5,\n        role: 'com',\n        firstName: 'Marie',\n        lastName: 'Lafarge',\n        social: 'marie.lafarge02',\n        imageURI: require(\"../../../assets/data/team/francois.png\"),\n    },\n    {\n        id: 6,\n        role: 'com',\n        firstName: 'Maxime',\n        lastName: 'Mazuel',\n        social: 'maxime.mzl',\n        imageURI: require(\"../../../assets/data/team/francois.png\"),\n    },\n    {\n        id: 7,\n        role: 'com',\n        firstName: 'Victor',\n        lastName: 'Jacquet',\n        social: 'victor_jacquet',\n        imageURI: require(\"../../../assets/data/team/francois.png\"),\n    },\n    {\n        id: 8,\n        role: 'com',\n        firstName: 'Wallerand',\n        lastName: 'Moullé-Berteaux',\n        social: 'wallerandmb',\n        imageURI: require(\"../../../assets/data/team/francois.png\"),\n    },\n]"
  },
  {
    "path": "assets/data/themes/themesCategories.js",
    "content": "const themesCategories = [\n    {\n        id: 1,\n        title: 'Environnement',\n        lightColor: '#25AD5B',\n        darkColor: '#147139',\n        iconTitle: 'leaf',\n        iconType: 'FontAwesome5',\n        cardBackground: '#25AD5B',\n        emoji: '🌱',\n    },\n    {\n        id: 2,\n        title: 'Économie',\n        lightColor: '#EBBF4D',\n        darkColor: '#B79025',\n        iconTitle: 'euro',\n        iconType: 'FontAwesome',\n        cardBackground: '#EFC656',\n        emoji: '💶',\n    },\n    {\n        id: 3,\n        title: 'Éducation',\n        lightColor: '#C04F7E',\n        darkColor: '#8E2953',\n        iconTitle: 'school',\n        iconType: 'MaterialCommunityIcons',\n        cardBackground: '#CB3D79',\n        emoji: '🏫',\n    },\n    {\n        id: 4,\n        title: 'Solidarités & santé',\n        lightColor: '#E092CF',\n        darkColor: '#A84793',\n        iconTitle: 'healing',\n        iconType: 'MaterialIcons',\n        cardBackground: '#E784D9',\n        emoji: '🏥',\n    },\n    {\n        id: 6,\n        title: 'International',\n        lightColor: '#5054AF',\n        darkColor: '#2E3395',\n        iconTitle: 'globe',\n        iconType: 'Entypo',\n        cardBackground: '#383DC2',\n        emoji: '🌍',\n    },\n    {\n        id: 7,\n        title: 'Culture',\n        lightColor: '#B2567D',\n        darkColor: '#833152',\n        iconTitle: 'book',\n        iconType: 'Entypo',\n        cardBackground: '#734D9D',\n        emoji: '📚',\n    },\n    {\n        id: 8,\n        title: 'Société',\n        lightColor: '#A165B6',\n        darkColor: '#6A2283',\n        iconTitle: 'family-restroom',\n        iconType: 'MaterialIcons',\n        cardBackground: '#AC56C3',\n        emoji: '🏛',\n    },\n    {\n        id: 9,\n        title: 'Sécurité, défense & justice',\n        lightColor: '#475BC6',\n        darkColor: '#1E2C75',\n        iconTitle: 'police-badge',\n        iconType: 'MaterialCommunityIcons',\n        cardBackground: '#3B4ECF',\n        emoji: '🚔',\n    },\n    {\n        id: 10,\n        title: 'Institutions et territoires',\n        lightColor: '#B2567D',\n        darkColor: '#833152',\n        iconTitle: 'how-to-vote',\n        iconType: 'MaterialIcons',\n        cardBackground: '#C53C78',\n        emoji: '🗳',\n    },\n];\n\nexport default themesCategories;"
  },
  {
    "path": "assets/queries/findCandidateDetails.js",
    "content": "import candidatesList from \"../data/candidates/candidatesList\";\n\nconst findCandidateDetails = (idCandidat) => {\n  /* Trouver les infos du candidat (filtre le tableau avec tous les candidats et ne retient que celui qui doit être affiché) */\n  let candidateProfileDetails = candidatesList.filter(\n    (d) => d.id == idCandidat\n  );\n\n  return candidateProfileDetails;\n};\n\nexport default findCandidateDetails;\n"
  },
  {
    "path": "assets/queries/findThemeTitle.js",
    "content": "import themesCategories from \"../data/themes/themesCategories\";\n\nconst findThemeTitle = (themeID) => {\n  /* Trouver les infos du thème (filtre le tableau avec tous les thèmes et ne retient que celui qui doit être affiché) */\n  let themeDetails = themesCategories.filter(\n    (d) => d.id == themeID\n  );\n\n  return themeDetails;\n};\n\nexport default findThemeTitle;\n"
  },
  {
    "path": "assets/queries/getPropositionDetails.js",
    "content": "import propositionsList from \"../data/propositions/propositionsList\";\n\nconst firsThirteeProps = [\n  {\n    id: 3,\n    theme: 2,\n    title: \"Instaurer un SMIC à 2000€\",\n    articleContent:\n      \"Le salaire minimum (SMIC) s’élève actuellement à 1589,47€ bruts mensuels. Cette proposition vise à l’augmenter à hauteur de 2000€.\",\n    source: \"Les Echos, Le Monde\",\n    idCandidat: 5,\n  },\n  {\n    id: 51,\n    theme: 8,\n    title: \"Autoriser le port du voile au lycée\",\n    articleContent:\n      \"Actuellement, la loi du 15 mars 2004 interdit pour les élèves le port de tout signe religieux dit “ostensible”, à l’image du voile islamique, dans les écoles, collèges et lycées publics. Néanmoins, cette loi ne s'applique pas aux établissements publics d'enseignement supérieur. En ce sens, le port du voile est uniquement autorisé à partir de l’université.\",\n    source: \"Le Monde. Proposition du programme de 2017\",\n    idCandidat: 9,\n  },\n  {\n    id: 71,\n    theme: 2,\n    title: \"Tripler l’ISF et créer un impôt COVID pour les multinationales\",\n    articleContent:\n      \"L’impôt de solidarité sur la fortune est un ancien impôt payé par les personnes et les couples détenant un patrimoine net supérieur à un certain seuil d’entrée fixé chaque année. Créé en 1989, il avait été remplacé par un impôt sur la fortune immobilière en 2018. Selon le candidat, rétablir cet impôt et tripler son montant permettrait de récupérer 15 milliards d’euros chaque année. Il souhaite également instaurer un impôt COVID sur les bénéfices dépassant 500 000 euros, doublé pendant deux ans (2022 et 2023), pour les multinationales dont les chiffres d’affaires représentent plus de 250 millions d‘euros par an. Il estime un gain potentiel de 6 milliards d’euros pour l’État.\",\n    source: \"Discours du ou de la candidate\",\n    idCandidat: 15,\n  },\n  {\n    id: 33,\n    theme: 2,\n    title: \"Instaurer la gratuité des transports en commun\",\n    articleContent:\n      \"L’objet de cette proposition est de permettre l’usage de transports gratuitement. Ainsi, les impôts versés pour les financer ne bénéficieront pas à des investisseurs privés qui - selon le candidat - risquent d’augmenter les tarifs afin d’avoir de meilleurs profits.\",\n    source: \"Les Echos\",\n    idCandidat: 9,\n  },\n  {\n    id: 143,\n    theme: 6,\n    title:\n      \"Affirmer la supériorité du droit national sur celui de l’UE dans la Constitution\",\n    articleContent:\n      \"L’Union européenne affirme la supériorité de son droit (qui passe par la ratification de traités, l’application de directives) sur les droits internes des pays membres. L’article 55 de la Constitution française dispose d’ailleurs clairement qu’une fois ratifiés ou approuvés, les traités et accords européens ont une autorité supérieure à celle des lois. La mesure ici évoquée vise justement à modifier cet article, en y inscrivant la supériorité du droit national lorsque des intérêts vitaux de la nation, comme l’indépendance de la France, sont en jeu.\",\n    source: \"Libération\",\n    idCandidat: 7,\n  },\n  {\n    id: 162,\n    theme: 2,\n    title: \"Établir un impôt sur la fortune (ISF) climatique\",\n    articleContent:\n      \"Cette proposition instaurerait un impôt sur la fortune qui serait indexé sur les émissions de gaz à effet de serre issues des placements financiers des ménages les plus aisés.\",\n    source: \"Programme du ou de la candidate\",\n    idCandidat: 3,\n  },\n  {\n    id: 195,\n    theme: 3,\n    title: \"Doubler le salaire des enseignants\",\n    articleContent:\n      \"Cette proposition a pour but de rendre le métier d’enseignant plus attractif. Le salaire moyen d’un enseignant en France est actuellement de 2490 € par mois. Le projet est qu’il atteigne 4 980 € nets mensuels d’ici la fin du quinquennat. .\",\n    source: \"Le Monde\",\n    idCandidat: 2,\n  },\n  {\n    id: 219,\n    theme: 3,\n    title: \"Instaurer un service national universel\",\n    articleContent:\n      \"Il s’agirait d’un service obligatoire de 3 à 6 mois, plus civique que militaire, qui remplacerait la journée défense et citoyenneté. Son objectif est la création d’une cohésion nationale de toutes les classe sociales au moyen d’une camaraderie formée autour des valeurs républicaines.\",\n    source: \"L’Express, proposition du programme de 2017\",\n    idCandidat: 1,\n  },\n  {\n    id: 429,\n    theme: 2,\n    title: \"Passer à la semaine de 39 heures\",\n    articleContent:\n      \"Le temps minimum de travail hebdomadaire est actuellement fixé à 35 heures en France. Cette proposition vise à l’augmenter de quatre heures afin de passer à une semaine de 39 heures de travail. Cependant, il serait possible de conserver la semaine de 35 heures par un accord entre l’employeur et l’employé. L’objectif de cette proposition est de permettre une plus grande souplesse sur le temps de travail, qui pourra être directement négocié au sein des entreprises.\",\n    source: \"BFM\",\n    idCandidat: 8,\n  },\n  {\n    id: 256,\n    theme: 6,\n    title:\n      \"Interrompre la négociation des traités de libre-échange et retirer à la Commission européenne la mission de représenter la France dans la négociation de traités commerciaux internationaux\",\n    articleContent:\n      \"Les traités de libre-échange instaurent des échanges commerciaux avec très peu de restrictions normatives entre États pour favoriser le développement du commerce international. Actuellement, la Commission Européenne a pour mission de représenter la France dans les traités de protection des investissements internationaux (à l’image du TAFTA et du CETA). Cette proposition vise à supprimer cette représentation afin qu’une délégation française exerce souverainement cette mission.\",\n    source: \"Le Monde, proposition du programme de 2017\",\n    idCandidat: 10,\n  },\n  {\n    id: 304,\n    theme: 10,\n    title:\n      \"Exiger pour tout candidat à un mandat électif un casier judiciaire vierge\",\n    articleContent:\n      \"Actuellement en France, avoir un casier judiciaire sans peine complémentaire d’inéligibilité ne prive pas le citoyen concerné du droit de pouvoir se présenter à des élections. S’inspirant de l’exemple de certaines professions uniquement accessibles avec un casier judiciaire vierge, l’objectif de cette proposition est d’obliger les candidats électoraux à avoir un casier judiciaire vierge dans une logique de moralisation de la vie publique.\",\n    source: \"Site du ou de la candidate\",\n    idCandidat: 11,\n  },\n  {\n    id: 324,\n    theme: 8,\n    title:\n      \"Interdire le recours à la procréation médicalement assistée (PMA) sans père\",\n    articleContent:\n      \"L'AMP (assistance médicale à la procréation), plus communément appelée PMA (procréation médicalement assistée) permet à un couple qui ne le peut pas d'avoir un enfant, au moyen de différentes techniques médicales (insémination artificielle, fécondation in vitro, accueil d'embryon). Depuis le 29 septembre 2021, la PMA est accessible à toutes les femmes, qu’elles soient hétérosexuelles, homosexuelles ou célibataires. Le candidat souhaite empêcher le recours à cette technique médicale dans les situations où il n’y aurait pas de père (i.e pour les couples de femmes et les femmes seules), et la restreindre aux seuls couples hétérosexuels.\",\n    source: \"Le Figaro\",\n    idCandidat: 13,\n  },\n  {\n    id: 352,\n    theme: 6,\n    title:\n      \"Suspendre la participation de la France à l’Organisation mondiale de la santé\",\n    articleContent:\n      \"L’Organisation mondiale de la santé (OMS) est une agence spécialisée de l’ONU pour la santé publique créée en 1948, organisation internationale dont la France fait partie. Elle a pour objectif d’améliorer le niveau de santé des populations de ses États Membres via des recommandations sanitaires. S’inscrivant dans une logique souverainiste, le candidat s’oppose à l’OMS qu’il juge colonisée par les lobbies des laboratoires pharmaceutiques (défendant donc des intérêts privés). Cette proposition vise donc à suspendre la participation de la France à l’OMS.\",\n    source: \"Le Monde\",\n    idCandidat: 6,\n  },\n  {\n    id: 397,\n    theme: 10,\n    title: \"Retirer le drapeau européen des bâtiments publics\",\n    articleContent:\n      \"Actuellement, sur tous les bâtiments publics, sont supposés se trouver deux drapeaux : celui de la France et celui de l’Union européenne, afin de montrer l’appartenance à une double citoyenneté. Cette proposition vise à supprimer la possibilité d’installer le drapeau européen sur les bâtiments publics.\",\n    source: \"Le Monde\",\n    idCandidat: 12,\n  },\n  {\n    id: 399,\n    theme: 2,\n    title: \"Faire du franc la nouvelle monnaie nationale\",\n    articleContent:\n      \"Après avoir quitté la zone euro cette proposition a pour but de revenir au franc. Pour cela, le franc serait inscrit dans notre Constitution comme la monnaie nationale de la République française. Au départ, le taux de conversion serait de 1 franc pour 1 euro puis, le franc serait déprécié de 10%.\",\n    source: \"Le Monde\",\n    idCandidat: 14,\n  },\n  {\n    id: 11,\n    theme: 1,\n    title: \"Interdire la chasse à courre\",\n    articleContent:\n      \"La chasse à courre - ou “vénerie - consiste à chasser un animal sauvage à l’aide d’une meute de chiens le poursuivant jusqu’à son épuisement. En France, cette méthode est réglementée par plusieurs lois, qui se sont succédées depuis le début des années 2000. Le candidat se prononce en faveur de son interdiction totale.\",\n    source: \"Le Monde. Proposition du programme de 2017\",\n    idCandidat: 5,\n  },\n  {\n    id: 63,\n    theme: 10,\n    title:\n      \"Octroyer le droit de vote à toutes les élections aux étrangers résidant en France\",\n    articleContent:\n      \"Pour voter en France, il est nécessaire de disposer de la nationalité française, d’être majeur, de jouir de ses droits civils et politiques et d’être inscrit sur les listes électorales. Toutefois, les ressortissants d’un État membre de l’Union européenne résidant en France ont le droit de voter pour les élections municipales et européennes. Par cette mesure, le candidat souhaite donner la possibilité à toute personne résidant en France de participer aux élections présidentielle, législatives, européennes, régionales, départementales et municipales, ainsi qu’aux referendums.\",\n    source: \"Le Monde. Proposition du programme de 2017\",\n    idCandidat: 9,\n  },\n  {\n    id: 93,\n    theme: 8,\n    title:\n      \"Avancer l’âge de la retraite à 60 ans et réduire le temps de travail à 32h/semaine\",\n    articleContent:\n      \"Actuellement, l’âge légal de départ à la retraite est fixé à 62 ans, et le temps de travail hebdomadaire à 35 heures. Pour le candidat, la réduction de ces deux valeurs serait “un nouveau progrès social”, par ailleurs permis par les révolutions technologique et informationnelle, qui devraient être employées pour alléger la charge de travail des employés.\",\n    source: \"Discours du ou de la candidate\",\n    idCandidat: 15,\n  },\n  {\n    id: 130,\n    theme: 10,\n    title: \"Passer à une VIème République\",\n    articleContent:\n      \"Le candidat souhaite convoquer un référendum (article 11 de la Constitution) pour engager un processus constituant et permettre aux citoyens de décider des modalités de formation d’une Assemblée constituante. Celle-ci serait chargée de proposer un nouveau projet de Constitution, soumise au peuple par voie référendaire après deux ans de travaux. Le candidat souhaite ainsi remplacer la Constitution de la Ve République, adoptée le 4 octobre 1958 et dont il critique la trop forte présidentialisation, pour mettre en place une VIe République plus parlementaire.\",\n    source: \"Programme du ou de la candidate\",\n    idCandidat: 4,\n  },\n  {\n    id: 144,\n    theme: 6,\n    title: \"Quitter l’OTAN\",\n    articleContent:\n      \"L’OTAN (Organisation du traité de l'Atlantique nord) est une alliance politique et militaire qui vise à assurer la défense, la sécurité et la protection de la démocratie des pays qui en sont membres. La France, un de ses membres fondateurs, est aussi un des pays qui contribuent le plus à son budget. Quitter l’OTAN aurait pour but d’économiser de l’argent sur ce plan, tout en essayant d’affirmer notre indépendance et la souveraineté française.\",\n    source: \"Ouest-France Proposition du programme de 2017\",\n    idCandidat: 7,\n  },\n  {\n    id: 167,\n    theme: 1,\n    title:\n      \"Sortir de l'élevage intensif et en cage, avec notamment les animaux à fourrure\",\n    articleContent:\n      \"L'élevage intensif est une des conséquence de l’industrialisation moderne, problématique sous-jacente de la mondialisation. Il pousse les éleveurs à augmenter la densité d'animaux sur une même exploitation, par soucis de rentabilité et de productivité. Ce mode d’élevage a suscité l’indignation des citoyens, grandement sensibles au bien-être animal.\",\n    source: \"France Inter\",\n    idCandidat: 3,\n  },\n  {\n    id: 198,\n    theme: 1,\n    title: \"Diminuer la vitesse sur les autoroutes de 130 à 110km/h\",\n    articleContent:\n      \"En 2018, le gouvernement avait abaissé la vitesse maximale autorisée sur les routes secondaires de 90 à 80km/h. Cette proposition vise à réduire également la vitesse de circulation sur les autoroutes, pour limiter le risque d’accidents. Cette proposition avait également été formulée par la Convention citoyenne pour le climat en 2020.\",\n    source: \"Ouest-France\",\n    idCandidat: 2,\n  },\n  {\n    id: 230,\n    theme: 7,\n    title: \"Mettre en place un “Pass culture” pour les jeunes\",\n    articleContent:\n      \"Ce “Pass culture” à pour objectif d’offrir à tous les jeunes de 15 à 18 ans une valeur de 500€ (actuellement 300) pour des biens culturels. Il s’agit de rendre accessible la culture à tous, et de stimuler l’économie française. Exemples : Cours de musique, livres, séances de cinéma, places de concert...\",\n    source: \"Proposition du programme de 2017\",\n    idCandidat: 1,\n  },\n  {\n    id: 446,\n    theme: 8,\n    title: \"Fixer l’âge de départ à la retraite à 65 ans\",\n    articleContent:\n      \"En 2021, l’âge minimum de la retraite est fixé à 62 ans par le code de la sécurité sociale. Pour une personne née après 1973, il faut avoir cotisé 172 semestres, soit un peu plus de 42 années. Il est possible de partir plus tôt pour diverses raisons : carrière longue, handicap, incapacité permanente d'origine professionnelle (...). Dans l’objectif de faire face aux déficits des caisses de retraite, cette proposition rehausserait l’âge minimal en l’augmentant de 3 ans, ainsi que le nombre d’années de cotisation par la même occasion.\",\n    source: \"Capital.fr\",\n    idCandidat: 8,\n  },\n  {\n    id: 262,\n    theme: 7,\n    title: \"Ratifier la Charte européenne des langues régionales\",\n    articleContent:\n      \"La Charte européenne des langues régionales ou minoritaires est destinée à protéger et favoriser les langues historiques régionales et les langues des minorités en Europe. Elle a été signée par la France en 1999 mais n’a toujours pas été ratifiée. Sa ratification permettrait son application effective en France. Le candidat précise qu’il souhaite conserver le français comme seule langue de l'administration.\",\n    source: \"Le Monde, proposition du programme de 2017\",\n    idCandidat: 10,\n  },\n  {\n    id: 302,\n    theme: 9,\n    title: \"Créer 40 000 places de prison supplémentaires\",\n    articleContent:\n      \"Selon les données statistiques de la Chancellerie (ministère de la Justice), la France disposerait au 1er juin 2021 d’un total de 60.794 places de prisons opérationnelles pour un ensemble de 66.591 détenus. Face à ce phénomène de surpopulation carcérale, cette proposition vise à construire de nouvelles places de prison afin d’incarcérer la totalité des individus condamnés à de la prison ferme.\",\n    source: \"Site du ou de la candidate\",\n    idCandidat: 11,\n  },\n  {\n    id: 322,\n    theme: 7,\n    title: \"Supprimer la contribution à l’audiovisuel public\",\n    articleContent:\n      \"La contribution à l’audiovisuel public est une taxe payée par chaque foyer fiscal, d’un montant de 138€ en métropole et de 88€ en Outre-Mer, qui sert à financer, entre autres, France Télévisions, Radio France et l’institut national de l’audiovisuel. Selon le candidat, cette taxe ne se justifie plus car le service public de l’audiovisuel est ‘’pris en otage par une camarilla gauchiste et idéologique qui crache sur la France, les Français, et qui a décidé de les rééduquer’’. Le candidat envisage par suite une privatisation du service public de la télévision et de la radio.\",\n    source: \"Discours du ou de la candidate\",\n    idCandidat: 13,\n  },\n  {\n    id: 344,\n    theme: 3,\n    title: \"Rendre obligatoire le port de l’uniforme dans les écoles\",\n    articleContent:\n      \"Dans un souci d’égalité des enfants sur la question de leur habillement, cette proposition vise à faire porter un uniforme à chaque écolier, comme c’est déjà le cas en Angleterre par exemple.\",\n    source: \"Programme du ou de la candidate\",\n    idCandidat: 6,\n  },\n  {\n    id: 380,\n    theme: 6,\n    title:\n      \"Expulser les parents de mineurs étrangers ayant commis des actes d’une particulière gravité\",\n    articleContent:\n      \"Les étrangers qui commettent une infraction en France s'exposent non seulement aux peines prévues par la loi pour cette infraction, mais peuvent également être renvoyés dans leur pays d'origine, à la suite d'un arrêté d'expulsion ou d'une peine d'interdiction d’entrée sur le territoire. Avec cette proposition, les parents de mineurs étrangers qui commettent des actes graves seront désormais également expulsés.\",\n    source: \"Ifrap\",\n    idCandidat: 12,\n  },\n  {\n    id: 407,\n    theme: 6,\n    title: \"Sortir la France de l'Union Européenne\",\n    articleContent:\n      \"Cette proposition vise à retrouver l’indépendance politique française par la sortie unilatérale et juridique de l’Union européenne. Cela passerait par la mise en œuvre de l’article 50 du traité sur l’Union européenne (TUE).\",\n    source: \"Le Monde\",\n    idCandidat: 14,\n  },\n  {\n    id: 17,\n    theme: 7,\n    title: \"Ne pas participer aux Jeux olympiques 2024\",\n    articleContent:\n      \"Les Jeux olympiques d'été de 2024 seront organisés à Paris, du 26 juillet au 11 août 2024. Leur budget est de 6,6 milliards d’euros. Pour le candidat, les JO sont un gaspillage financier, économique et écologique. Il estime que l’argent qui sera généré par le tourisme, le rayonnement culturel de la France et les festivités qui en découleront n’en valent pas la peine.\",\n    source: \"Le Monde. Proposition du programme de 2017\",\n    idCandidat: 5,\n  },\n  {\n    id: 65,\n    theme: 10,\n    title:\n      \"Limiter l’indemnité des députés au salaire moyen d’un ouvrier ou d’un employé\",\n    articleContent:\n      \"Le candidat estime que la fonction parlementaire doit avoir un salaire moyen pour que les parlementaires représentent réellement la population : ainsi, selon le candidat, légiférer est un travail qui n’a pas besoin d’être davantage rémunéré qu’un autre.\",\n    source: \"Le Monde. Proposition du programme de 2017\",\n    idCandidat: 9,\n  },\n  {\n    id: 99,\n    theme: 10,\n    title: \"Instaurer un revenu étudiant de 850 euros\",\n    articleContent:\n      \"Ce revenu serait financé à 50% par l’Etat, et à 50% par une nouvelle cotisation sociale. Le candidat estime que cette mesure pourra ainsi “inciter les entreprises à embaucher ces jeunes, puisqu’elles auront contribué à financer leur formation”.\",\n    source: \"l’Humanité\",\n    idCandidat: 15,\n  },\n  {\n    id: 132,\n    theme: 10,\n    title:\n      \"Reconnaître le vote blanc, mettre en place le vote obligatoire et instaurer un seuil de votes exprimés pour valider une élection\",\n    articleContent:\n      \"Cette série de proposition entend lutter contre le problème de l’abstention en France. Actuellement, les votes blancs sont décomptés mais ne sont pas comptabilisés dans le calcul des suffrages exprimés. Le candidat souhaite donc que ceux-ci soient pris en compte. Cette mesure s’accompagnerait de l’instauration du vote obligatoire, et de la possibilité d’invalider une élection si elle n’atteint un seuil minimum de participation. Le niveau de ce seuil n’a cependant pas encore été précisé par le candidat.\",\n    source: \"Programme du ou de la candidate\",\n    idCandidat: 4,\n  },\n  {\n    id: 155,\n    theme: 9,\n    title:\n      \"Interdire les transferts d’argent vers les pays qui refusent d’accueillir leurs ressortissants\",\n    articleContent:\n      \"Cette mesure vise à bloquer tous les transferts d'argent privé vers les pays qui refusent de rapatrier leurs ressortissants visés par une obligation de quitter le territoire français (OQTF). Cette interdiction pour les individus d’envoyer, par exemple, de l’argent à leur famille dans leur pays d’origine, doit permettre de faire pression sur les États concernés afin qu’ils accueillent les ressortissants expulsés.\",\n    source: \"Le Figaro\",\n    idCandidat: 7,\n  },\n  {\n    id: 189,\n    theme: 10,\n    title: \"Créer un Vice-Premier ministre à l’écologie\",\n    articleContent:\n      \"Ce dernier regrouperait les sujets de l’alimentation, de la santé, et de l’environnement, très liés. Il permettrait de sortir de l’influence des multinationales et d’agir plus efficacement.\",\n    source: \"LCI\",\n    idCandidat: 3,\n  },\n  {\n    id: 216,\n    theme: 10,\n    title: \"Instaurer le droit de vote à 16 ans\",\n    articleContent:\n      \"Depuis 1974, le droit de vote est attribué à tous les citoyens à partir de 18 ans. Cette proposition vise à abaisser l’âge légal du droit de vote à 16 ans.\",\n    source: \"Ouest-France\",\n    idCandidat: 2,\n  },\n  {\n    id: 243,\n    theme: 10,\n    title: \"Supprimer l’ENA\",\n    articleContent:\n      'L’Ecole Nationale d’Administration (ENA) forme les hauts fonctionnaires de l’Etat depuis 1945. En raison des critiques récurrentes qui lui sont faites, le candidat souhaite la remplacer par l’Institut National du Service Public (INSP), dans le but de \"favoriser des parcours plus ouverts et moins cloisonnés, mieux suivis et régulièrement évalués tout au long de la carrière\", ainsi que d’\"améliorer la gestion des cadres supérieurs de l\\'Etat, selon une logique fondée sur les parcours et les compétences, plus que sur l\\'appartenance à des corps ou à des statuts\".',\n    source: \"Les Echos\",\n    idCandidat: 1,\n  },\n  {\n    id: 460,\n    theme: 10,\n    title: \"Réduire le nombre de fonctionnaires\",\n    articleContent:\n      \"La fonction publique est actuellement composée de 5,56 millions d’agents répartis en 3 catégories – la fonction publique d’Etat, la fonction publique territoriale et la fonction publique hospitalière – pour l’exercice de missions de service public. Cette proposition vise à supprimer 200000 postes de fonctionnaires dans l’administration de l’État et des collectivités territoriales. En parallèle, le candidat propose de créer 50000 postes supplémentaires pour protéger, éduquer et soigner.\",\n    source: \"Programme officiel\",\n    idCandidat: 8,\n  },\n  {\n    id: 270,\n    theme: 4,\n    title: \"Créer un Ticket Paysan\",\n    articleContent:\n      \"L’objet de cette proposition vise à créer un “Ticket Paysan” permettant de davantage développer les marchés de proximité en achetant des produits frais. Son coût serait en partie assumé par l’État et les professionnels.\",\n    source: \"Discours du ou de la candidate\",\n    idCandidat: 10,\n  },\n  {\n    id: 294,\n    theme: 7,\n    title:\n      \"Lancer un plan de sauvegarde des églises et des établissements culturels ruraux\",\n    articleContent:\n      \"L’objectif de cette proposition vise à consacrer un budget spécifique à la rénovation et à la conservation des établissements culturels (musées, cinémas) et du patrimoine cultuel (les églises) dans les zones rurales.\",\n    source: \"Site du ou de la candidate\",\n    idCandidat: 11,\n  },\n  {\n    id: 317,\n    theme: 1,\n    title: \"Arrêter les installations d’éoliennes\",\n    articleContent:\n      \"En 2021, on estime le nombre d'éoliennes terrestres en France à 8000, réparties sur 1380 parcs. Le candidat proteste avec véhémence contre leur installation, considérant notamment qu’elles nuisent à la santé des habitants ainsi qu’à la beauté des paysages. Il a également souligné que leurs socles en béton n’étaient pas renouvelables, et que l’énergie produite par les éoliennes était selon lui trop faible.\",\n    source: \"BFM\",\n    idCandidat: 13,\n  },\n  {\n    id: 342,\n    theme: 3,\n    title: \"Instaurer un enseignement spécifique de morale à l’école\",\n    articleContent:\n      \"Les cours de morale en France ont été introduits dans la foulée des lois Jules Ferry de 1881 et 1882. Ces cours avaient pour objectif d'inculquer uniformément certaines valeurs aux élèves. Après les événements de Mai 1968, les enseignements de morale ont été abolis du système scolaire français. L’objet de cette proposition est de réinstaurer un enseignement de morale au sein de l’école.\",\n    source: \"Discours du ou de la candidate\",\n    idCandidat: 6,\n  },\n  {\n    id: 379,\n    theme: 6,\n    title: \"Inscrire la préférence nationale dans la Constitution\",\n    articleContent:\n      \"Cette proposition vise à faire voter, par référendum, une modification de la Constitution pour y inscrire “la maîtrise de l'immigration”, “la priorité nationale et le principe d'une supériorité du droit français sur le droit international pour refondre \\\"l'ensemble du droit applicable aux étrangers\\\". Le candidat souhaite adresser cette question au peuple directement, sans respecter la procédure prévue par l’article 89 de la Constitution, à l’image de la méthode employée par Charles de Gaulle en 1962.\",\n    source: \"20 minutes\",\n    idCandidat: 12,\n  },\n  {\n    id: 412,\n    theme: 6,\n    title: \"Rétablir de bonnes relations politiques avec la Russie\",\n    articleContent:\n      \"Depuis la guerre froide les relations entre la France et la Russie ne sont pas très bonnes. En effet, de nombreux désaccords quant à l’attitude à adopter vis-à-vis de certains pays du Moyen-Orient (par exemple en Syrie) divisent ces deux pays. Cette proposition vise à rétablir une véritable “politique d'amitié” entre la Russie et la France mais également avec des pays comme la Chine et les pays arabes.\",\n    source: \"Le Monde\",\n    idCandidat: 14,\n  },  \n];\n\nvar newPropositionsList = JSON.parse(JSON.stringify(propositionsList));\n\nnewPropositionsList.push.apply(newPropositionsList, firsThirteeProps);\n\nexport default getPropositionDetails = (idProposition) => {\n  if (idProposition) {\n    const newFilteredPropositionsList = newPropositionsList.filter(\n      (prop) => prop.id === idProposition\n    );\n\n    return newFilteredPropositionsList;\n  }\n};\n"
  },
  {
    "path": "assets/queries/getPropositionsList.js",
    "content": "import propositionsList from \"../data/propositions/propositionsList\"; // Prendre le bon fichier, et pas celui pour le swipe\n\nvar newPropositionsList = JSON.parse(JSON.stringify(propositionsList));\n\nexport default getPropositionsListForCandidat = (\n  idTheme,\n  idCandidat,\n  limit\n) => {\n  if (limit) {\n    var filteredPropositions = newPropositionsList.filter(\n      (d) => d.theme === idTheme,\n      (c) => c.idCandidat === idCandidat\n    );\n\n    filteredPropositions.slice(0,limit);\n\n    return filteredPropositions;\n\n  } else {\n  }\n};\n"
  },
  {
    "path": "assets/queries/resetData.js",
    "content": "import react from \"react\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\n\nexport default resetData = async () => {\n\n  await AsyncStorage.removeItem(\"@passed_propositions\");\n\n  for (let i = 1 ; i < 17 ; i++){\n    await AsyncStorage.removeItem(\"@likeListCandidate_\" + i);\n    await AsyncStorage.removeItem(\"@dislikeListCandidate_\" + i);\n    await AsyncStorage.removeItem(\"@superLikeListCandidate_\" + i);\n    await AsyncStorage.removeItem(\"@score_candidat_\" + i);\n    await AsyncStorage.removeItem(\"@scoreDislike_candidat_\" + i);\n  }\n};"
  },
  {
    "path": "assets/storage/index.js",
    "content": "// PROPOSITIONS QUI ONT DÉJÀ ÉTÉ NOTÉES\nconst PASSED_KEY = '@save_propositions_by_user'\n\nexport default PASSED_KEY;"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = function(api) {\n  api.cache(true);\n  return {\n    presets: ['babel-preset-expo'],\n    plugins: ['react-native-reanimated/plugin'],\n  };\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"main\": \"node_modules/expo/AppEntry.js\",\n  \"scripts\": {\n    \"start\": \"expo start\",\n    \"android\": \"expo start --android\",\n    \"ios\": \"expo start --ios\",\n    \"web\": \"expo start --web\",\n    \"eject\": \"expo eject\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"^1.15.14\",\n    \"@react-native-community/masked-view\": \"^0.1.11\",\n    \"@react-native-community/netinfo\": \"6.0.2\",\n    \"@react-native-picker/picker\": \"^2.2.1\",\n    \"@react-navigation/bottom-tabs\": \"^6.0.9\",\n    \"@react-navigation/native\": \"^6.0.6\",\n    \"@react-navigation/native-stack\": \"^6.2.5\",\n    \"@react-navigation/stack\": \"^6.0.11\",\n    \"aws-amplify\": \"^4.3.10\",\n    \"aws-amplify-react-native\": \"^6.0.1\",\n    \"expo\": \"~43.0.0\",\n    \"expo-constants\": \"~12.1.3\",\n    \"expo-device\": \"~4.0.3\",\n    \"expo-font\": \"~10.0.3\",\n    \"expo-haptics\": \"~11.0.3\",\n    \"expo-linear-gradient\": \"~10.0.3\",\n    \"expo-linking\": \"~2.4.2\",\n    \"expo-notifications\": \"~0.13.3\",\n    \"expo-permissions\": \"~13.0.3\",\n    \"expo-sensors\": \"~11.0.3\",\n    \"expo-sharing\": \"~10.0.3\",\n    \"expo-status-bar\": \"~1.1.0\",\n    \"expo-updates\": \"~0.10.15\",\n    \"lodash\": \"^4.17.21\",\n    \"react\": \"17.0.1\",\n    \"react-dom\": \"17.0.1\",\n    \"react-native\": \"0.64.2\",\n    \"react-native-app-intro-slider\": \"^4.0.4\",\n    \"react-native-confetti-cannon\": \"^1.5.2\",\n    \"react-native-deck-swiper\": \"^2.0.5\",\n    \"react-native-gesture-handler\": \"~1.10.2\",\n    \"react-native-htmlview\": \"^0.16.0\",\n    \"react-native-image-header-scroll-view\": \"^1.0.0\",\n    \"react-native-onboarding-swiper\": \"^1.1.4\",\n    \"react-native-popup-confirm-toast\": \"^2.0.5\",\n    \"react-native-progress\": \"^5.0.0\",\n    \"react-native-reanimated\": \"~2.2.0\",\n    \"react-native-safe-area-context\": \"3.3.2\",\n    \"react-native-screens\": \"~3.8.0\",\n    \"react-native-shake\": \"^5.1.1\",\n    \"react-native-share\": \"^7.3.2\",\n    \"react-native-social-share\": \"^1.6.5\",\n    \"react-native-status-bar-height\": \"^2.6.0\",\n    \"react-native-view-overflow\": \"0.0.5\",\n    \"react-native-view-shot\": \"3.1.2\",\n    \"react-native-web\": \"0.17.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.12.9\"\n  },\n  \"private\": true\n}\n"
  },
  {
    "path": "src/components/ByCandidateCard/index.js",
    "content": "import React from \"react\";\nimport { View, Text, Image, TouchableOpacity } from \"react-native\";\nimport styles from \"./styles\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport { LinearGradient } from \"expo-linear-gradient\";\n\nexport default function ByCandidateCard(props) {\n  const navigation = useNavigation();\n\n  const item = props;\n\n  console.log(item);\n\n  return (\n    <TouchableOpacity\n    style={[styles.container, { backgroundColor: item.bgColor }]}\n      onPress={() =>\n        navigation.navigate(\"CandidateProfile\", { id: item.idCandidate })\n      }\n    >\n      {/* <LinearGradient\n        \n        colors={[item.firstLinearColor, item.secondLinearColor]}\n        start={{ x: 0.1, y: 0.1 }}\n      > */}\n        <View style={styles.textContainer}>\n          <Text style={styles.firstnameText}>{item.firstname}</Text>\n          <Text style={styles.lastnameText}>{item.lastname}</Text>\n        </View>\n        <View>\n          <Image style={styles.cardImage} source={item.image} />\n        </View>\n      {/* </LinearGradient> */}\n    </TouchableOpacity>\n  );\n}\n"
  },
  {
    "path": "src/components/ByCandidateCard/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst height = Dimensions.get(\"window\").height;\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    width: width * 0.9,\n    backgroundColor: \"white\",\n    height: 92,\n    alignSelf: \"center\",\n    marginBottom: 15,\n    flexDirection: \"row\",\n    borderRadius: 15,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 1,\n    },\n    shadowOpacity: 0.2,\n    shadowRadius: 1.41,\n\n    elevation: 2,\n    justifyContent: \"space-between\",\n  },\n  textContainer: {\n    marginHorizontal: 20,\n    justifyContent: \"center\",\n  },\n  firstnameText: {\n    fontWeight: \"300\",\n    fontSize: 27,\n    letterSpacing: 0.5,\n    color: 'white'\n  },\n  lastnameText: {\n    fontWeight: \"bold\",\n    fontSize: 27,\n    letterSpacing: 0.5,\n    color: 'white'\n  },\n  cardImage: {\n    height: 80,\n    width: 100,\n    resizeMode: \"contain\",\n    position: \"absolute\",\n    bottom: 0,\n    right: Dimensions.get('window').width*0.05,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.23,\n    shadowRadius: 2.62,\n\n    elevation: 4,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/CandidatCardRanking/index.js",
    "content": "import React from \"react\";\nimport { View, Text, Image } from \"react-native\";\nimport styles from \"./styles\";\n\nexport default function CandidatCardRanking(props) {\n\n    const {indexRanking, name, pourcentage, image} = props;\n\n  return (\n    <View style={styles.container}>\n      <View style={styles.candidatNameContainer}>\n        <View style={styles.candidatRankingContainer}>\n          <Text style={styles.hashtagText}>#</Text>\n          <Text style={styles.rankingText}>{indexRanking}</Text>\n        </View>\n        <Text style={styles.candidateNameText}>{name}</Text>\n      </View>\n      <View style={styles.bottomCardContainer}>\n          <Text style={styles.proportionText}>D'accord avec {pourcentage}% des propositions</Text>\n            <Image source={image} style={styles.candidateImage} />\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/components/CandidatCardRanking/styles.js",
    "content": "import React from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\n\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    width: width * 0.9,\n    height: 110,\n    backgroundColor: \"blue\",\n    marginBottom: 10,\n    alignSelf: \"center\",\n    borderRadius: 15,\n  },\n  candidatNameContainer: {\n    flexDirection: \"row\",\n    marginTop: 10,\n    marginLeft: 13,\n  },\n  candidatRankingContainer: {\n    flexDirection: \"row\",\n  },\n  hashtagText: {\n    fontSize: 17,\n    fontWeight: \"bold\",\n    color: \"white\",\n  },\n  rankingText: {\n    fontSize: 24,\n    fontWeight: \"bold\",\n    color: \"white\",\n  },\n  candidateNameText: {\n    fontSize: 25,\n    fontWeight: \"bold\",\n    color: \"white\",\n    marginLeft: 9,\n  },\n  bottomCardContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n    marginLeft: 13,\n  },\n  proportionText: {\n    width: width * 0.6,\n    fontSize: 18,\n    fontWeight: \"400\",\n    color: \"white\",\n    marginTop: 7\n  },\n  candidateImage: {\n    width: 90,\n    height: 70,\n    marginRight: 20,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/CurrentLevelCard/index.js",
    "content": "import React from 'react'\nimport { View, Text } from 'react-native'\nimport styles from './styles';\n\nexport default function CurrentLevelCard(props) {\n\n    const levelInfo = props;\n\n    console.log(props)\n    return (\n        <View style={styles.container}>\n            <Text></Text>\n        </View>\n    )\n}\n"
  },
  {
    "path": "src/components/CurrentLevelCard/styles.js",
    "content": "import React from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  container: {},\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/FavoriteCardForCandidates/index.js",
    "content": "import React from \"react\";\nimport { View, Text, Image } from \"react-native\";\nimport styles from \"./styles\";\n\nexport default function FavoriteCardForCandidates(props) {\n  const cardDetails = props.item;\n\n  return (\n    <View style={styles.container}>\n      <Text style={styles.anecdoteText}>\n        {cardDetails.anecdoteEmoji} {cardDetails.anecdoteText}\n      </Text>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/components/FavoriteCardForCandidates/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\n\nconst width = Dimensions.get(\"window\").width;\nconst height = Dimensions.get(\"window\").height;\n\nconst styles = StyleSheet.create({\n  container: {\n    width: width * 0.8,\n    // height: height * 0.12,\n    marginRight: 13,\n    borderRadius: 15,\n\n    flexDirection: \"row\",\n    backgroundColor: \"white\",\n\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.23,\n    shadowRadius: 2.62,\n\n    elevation: 4,\n\n    marginTop: 2,\n    marginBottom: 10,\n  },\n  textContainer: {\n    marginTop: 11,\n    paddingHorizontal: 12\n  },\n  favoriteText: {\n    fontWeight: \"bold\",\n    fontSize: 20,\n  },\n  favoriteDetails: {\n    fontSize: 17,\n    marginTop: 4,\n    paddingBottom: 10,\n    width: width*0.75\n  },\n  anecdoteText: {\n    width: width * 0.8,\n    paddingHorizontal: 15,\n    paddingVertical: 15,\n    // fontSize: height*0.02,\n    fontSize: 17,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/PartnerCard/index.js",
    "content": "import { useNavigation } from \"@react-navigation/core\";\nimport React from \"react\";\nimport { View, Text, FlatList, TouchableOpacity, Image, Linking } from \"react-native\";\n\nimport styles from \"./styles\";\n\nexport default function PartnerCard(props) {\n  const navigation = useNavigation();\n\n  const partnerInfo = props;\n\n  return (\n    <TouchableOpacity style={styles.container} onPress={() => Linking.openURL(partnerInfo.websiteLink)}>\n      <View style={styles.imageContainer}>\n        <Image style={styles.cardImage} source={partnerInfo.image} />\n      </View>\n      <View style={styles.textContainer}>\n        <Text style={styles.titleText}>{partnerInfo.name}</Text>\n        <Text style={styles.descriptionText}>{partnerInfo.description}</Text>\n      </View>\n    </TouchableOpacity>\n  );\n}\n"
  },
  {
    "path": "src/components/PartnerCard/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst height = Dimensions.get(\"window\").height;\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    width: width * 0.9,\n    backgroundColor: \"white\",\n    height: 100,\n    alignSelf: \"center\",\n    marginBottom: 15,\n    flexDirection: \"row\",\n    borderRadius: 15,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 1,\n    },\n    shadowOpacity: 0.2,\n    shadowRadius: 1.41,\n\n    elevation: 2,\n  },\n  textContainer: {\n    marginHorizontal: 10,\n    justifyContent: \"center\",\n  },\n  titleText: {\n    fontWeight: \"bold\",\n    fontSize: 22,\n    width: 200\n  },\n  descriptionText: {\n    marginTop: 3,\n    width: width * 0.5,\n    fontSize: 15,\n  },\n  imageContainer: {\n    justifyContent: 'center',\n    alignItems: 'center',\n    marginHorizontal: 20,\n  },\n  cardImage: {\n    height: 50,\n    width: 50,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/PropositionListCard/index.js",
    "content": "import React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n} from \"react-native\";\nimport styles from \"./styles\";\nimport { FontAwesome5 } from \"@expo/vector-icons\";\nimport findCandidateDetails from \"../../../assets/queries/findCandidateDetails\";\nimport { useNavigation } from \"@react-navigation/core\";\n\nexport default function PropositionListCard(props) {\n  const propID = props.proposition;\n  console.log('ID de la proposition : ', propID);\n\n  const navigation = useNavigation();\n\n  const [propositionDetails, setPropositionDetails] = useState([]);\n  const [candidateDetails, setCandidateDetails] = useState([]);\n  const [loaded, setLoaded] = useState(false);\n\n  useEffect(async () => {\n      console.log(\"ID du candidat : \", propID.idCandidat);\n      const candidateForPropDetails = findCandidateDetails(\n        propID.idCandidat\n      );\n      // console.log(candidateForPropDetails);\n      setCandidateDetails(candidateForPropDetails);\n      setLoaded(true);\n  }, [props]);\n\n  if (loaded) {\n    return (\n      <View\n        style={[\n          styles.container,\n          { height: propID.showCandidateName !== false ? 100 : 80 },\n        ]}\n      >\n        <View style={styles.propositionTextContainer}>\n          <Text ellipsizeMode=\"tail\" numberOfLines={3} style={styles.titleText}>\n            {propID.title}\n          </Text>\n          {propID.showCandidateName !== false ? (\n            <View style={styles.candidatDetailsContainer}>\n              <Text style={styles.candidatDetailsText}>\n                Par {candidateDetails[0].firstname}{\" \"}\n                {candidateDetails[0].lastname}\n              </Text>\n            </View>\n          ) : null}\n        </View>\n        <View style={styles.plusButtonContainer}>\n          <FontAwesome5 name={\"plus\"} color={\"white\"} />\n        </View>\n      </View>\n    );\n  } else {\n    return <View>{/* <ActivityIndicator size={'large'} /> */}</View>;\n  }\n}\n"
  },
  {
    "path": "src/components/PropositionListCard/styles.js",
    "content": "import { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    borderBottomWidth: 0.25,\n    borderColor: \"lightgray\",\n  },\n  propositionTextContainer: {\n    marginLeft: 25,\n    width: width * 0.75,\n    height: 100,\n    justifyContent: \"center\",\n  },\n  titleText: {\n    fontSize: 18,\n    fontWeight: \"500\",\n    marginBottom: 5\n  },\n  candidatDetailsContainer: {\n    flexDirection: \"row\",\n    alignItems: 'center'\n  },\n  candidateImage: {\n    height: 24,\n    width: 24,\n    borderRadius: 24\n  },\n  plusButtonContainer: {\n    height: 30,\n    width: 30,\n    backgroundColor: colors.primary,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    borderRadius: 29,\n    marginRight: 18,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/PropositionThemeCard/index.js",
    "content": "import React from \"react\";\nimport { View, Text, TouchableOpacity } from \"react-native\";\nimport styles from \"./styles\";\nimport {\n  FontAwesome5,\n  FontAwesome,\n  MaterialCommunityIcons,\n  MaterialIcons,\n  Entypo,\n} from \"@expo/vector-icons\";\nimport { useNavigation } from \"@react-navigation/core\";\n\nexport default function PropositionThemeCard(props) {\n  const navigation = useNavigation();\n\n  const cardThemeInfo = props;\n\n  return (\n    <View style={styles.container}>\n      <TouchableOpacity\n        style={[\n          styles.cardThemeContainer,\n          { backgroundColor: cardThemeInfo.bgColor },\n        ]}\n        onPress={() =>\n          navigation.navigate(\"ListPropositions\", {\n            title: cardThemeInfo.title,\n            themeID: cardThemeInfo.themeID,\n          })\n        }\n      >\n        <Text style={styles.themeTitleText}>{cardThemeInfo.title}</Text>\n        {/* Overflow: hidden */}\n        {cardThemeInfo.iconType === \"MaterialCommunityIcons\" ? (\n          <MaterialCommunityIcons\n            style={styles.cardIcon}\n            name={cardThemeInfo.icon}\n            size={110}\n            color={cardThemeInfo.iconColor}\n          />\n        ) : cardThemeInfo.iconType === \"FontAwesome5\" ? (\n          <FontAwesome5\n            style={styles.cardIcon}\n            name={cardThemeInfo.icon}\n            size={110}\n            color={cardThemeInfo.iconColor}\n          />\n        ) : cardThemeInfo.iconType === \"FontAwesome\" ? (\n          <FontAwesome\n            style={styles.cardIcon}\n            name={cardThemeInfo.icon}\n            size={110}\n            color={cardThemeInfo.iconColor}\n          />\n        ) : cardThemeInfo.iconType === \"MaterialIcons\" ? (\n          <MaterialIcons\n            style={styles.cardIcon}\n            name={cardThemeInfo.icon}\n            size={110}\n            color={cardThemeInfo.iconColor}\n          />\n        ) : cardThemeInfo.iconType === \"Entypo\" ? (\n          <Entypo\n            style={styles.cardIcon}\n            name={cardThemeInfo.icon}\n            size={110}\n            color={cardThemeInfo.iconColor}\n          />\n        ) : null}\n      </TouchableOpacity>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/components/PropositionThemeCard/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  container: {\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 1,\n    },\n    shadowOpacity: 0.2,\n    shadowRadius: 1.41,\n\n    elevation: 4,\n  },\n  cardThemeContainer: {\n    width: Dimensions.get('window').width*0.41,\n    height: Dimensions.get('window').width*0.41,\n    borderRadius: 15,\n    overflow: \"hidden\",\n  },\n  themeTitleText: {\n    color: \"white\",\n    fontSize: 20,\n    fontWeight: \"bold\",\n    marginTop: 22,\n    marginHorizontal: 12,\n    zIndex: 1,\n  },\n  cardIcon: {\n    position: \"absolute\",\n    bottom: -12,\n    right: -9,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/ResponsiveTitle/index.js",
    "content": "import React from \"react\";\nimport { View, Text, Dimensions } from \"react-native\";\nimport styles from \"./styles\";\n\nexport default function ResponsiveTitle(props) {\n  const title = props.title;\n\n  return (\n    <View style={styles.container}>\n      <Text style={styles.titleText}>{props.title}</Text>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/components/ResponsiveTitle/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  container: {\n    marginTop: 20,\n  },\n  titleText: {\n    fontSize: Dimensions.get(\"window\").width * 0.085,\n    marginLeft: 25,\n    marginBottom: 15,\n    width: 250,\n    fontWeight: \"bold\",\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/ResultCandidateCard/index.js",
    "content": "import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { useIsFocused, useNavigation } from \"@react-navigation/core\";\nimport { round } from \"lodash\";\nimport React, { useState, useEffect } from \"react\";\nimport {\n  View,\n  Text,\n  Image,\n  TouchableOpacity,\n  ActivityIndicator,\n} from \"react-native\";\nimport findCandidateDetails from \"../../../assets/queries/findCandidateDetails\";\nimport styles from \"./styles\";\n\nexport default function ResultCandidateCard(props) {\n  // console.log(props.item.position);\n  const navigation = useNavigation();\n\n  const [candidateDetails, setCandidateDetails] = useState([]);\n  const [loaded, setLoaded] = useState(false);\n  const [positionsPassed, setPositionsPassed] = useState(0);\n  const [candidateScore, setCandidateScore] = useState(0);\n  const [swipedPropositions, setSwipedPropositions] = useState(0);\n\n  const [candidateTotalSwipes, setCandidateTotalSwipes] = useState(0);\n\n  const [candidatePourcentage, setCandidatePourcentage] = useState(0);\n\n  const getPositionsPassedNumber = async () => {\n    var numberOfPositionsPassed = await AsyncStorage.getItem(\n      \"@passed_propositions\"\n    );\n\n    if (numberOfPositionsPassed !== null) {\n      numberOfPositionsPassed = numberOfPositionsPassed.length;\n      return numberOfPositionsPassed;\n    } else {\n      return 0;\n    }\n  };\n\n  const isFocused = useIsFocused();\n\n  useEffect(async () => {\n    // Récupérer le nombre total de propositions passées\n    // Récupérer les infos sur le candidat\n    try {\n      const candidateInfos = findCandidateDetails(props.idCandidat);\n\n      const totalPassedProps = await getPositionsPassedNumber().then((res) => {\n        const realPassedProps = Math.round(res / 3);\n\n        setCandidateDetails(candidateInfos);\n\n        if (props.item.score == -1) {\n          setCandidateScore(-1);\n        } else {\n          const finalCandidateScore = Math.round(props.item.score);\n          setCandidateScore(finalCandidateScore);\n        }\n\n        // console.log(\"Score: \", candidateScore);\n\n        setLoaded(true);\n      });\n    } catch (e) {\n      console.log(e);\n    }\n\n    const getTotalPropsByCandidate = async (idCandidat) => {\n      const candidateVariable = \"@likeListCandidate_\" + idCandidat;\n      const dislikeCandidateVariable = \"@dislikeListCandidate_\" + idCandidat;\n\n      var likesForCandidate = await AsyncStorage.getItem(candidateVariable);\n      var dislikesForCandidate = await AsyncStorage.getItem(\n        dislikeCandidateVariable\n      );\n\n      likesForCandidate = JSON.parse(likesForCandidate);\n      dislikesForCandidate = JSON.parse(dislikesForCandidate);\n\n      if (likesForCandidate == null && dislikesForCandidate == null) {\n        return 0;\n      } else if (likesForCandidate == null && dislikesForCandidate !== null) {\n        return console.log(dislikesForCandidate.length);\n      } else if (dislikesForCandidate == null && likesForCandidate !== null) {\n        return console.log(likesForCandidate.length);\n      } else if (likesForCandidate !== null && dislikesForCandidate !== null) {\n        return likesForCandidate.length + dislikesForCandidate.length;\n      }\n    };\n\n    const totalSwipeNumber = await getTotalPropsByCandidate(props.idCandidat);\n\n    if (totalSwipeNumber == undefined) {\n      setCandidateTotalSwipes(0);\n    } else {\n      setCandidateTotalSwipes(totalSwipeNumber);\n    }\n\n    const getPourcentageForCandidate = async (idCandidat) => {\n      const candidateVariable = \"@score_candidat_\" + idCandidat;\n      const dislikeCandidateVariable = \"@scoreDislike_candidat_\" + idCandidat;\n\n      const likeCandidateVariablePassed = \"@likeListCandidate_\" + idCandidat;\n      const superLikeCandidateVariablePassed =\n        \"@superLikeListCandidate_\" + idCandidat;\n      const dislikeCandidateVariablePassed =\n        \"@dislikeListCandidate_\" + idCandidat;\n\n      try {\n        var likesForCandidatePassed = await AsyncStorage.getItem(\n          likeCandidateVariablePassed\n        );\n        likesForCandidatePassed = JSON.parse(likesForCandidatePassed);\n        likesForCandidatePassed = likesForCandidatePassed.length;\n      } catch (e) {\n        var likesForCandidatePassed = null;\n      }\n\n      try {\n        var superlikesForCandidatePassed = await AsyncStorage.getItem(\n          superLikeCandidateVariablePassed\n        );\n        superlikesForCandidatePassed = JSON.parse(superlikesForCandidatePassed);\n        superlikesForCandidatePassed = superlikesForCandidatePassed.length;\n      } catch (e) {\n        var superlikesForCandidatePassed = null;\n      }\n\n      try {\n        var dislikesForCandidatePassed = await AsyncStorage.getItem(\n          dislikeCandidateVariablePassed\n        );\n        dislikesForCandidatePassed = JSON.parse(dislikesForCandidatePassed);\n        dislikesForCandidatePassed = dislikesForCandidatePassed.length;\n      } catch (e) {\n        var dislikesForCandidatePassed = null;\n      }\n\n      setSwipedPropositions(\n        likesForCandidatePassed +\n          superlikesForCandidatePassed +\n          dislikesForCandidatePassed\n      );\n\n      var likesForCandidate = await AsyncStorage.getItem(candidateVariable);\n      var dislikesForCandidate = await AsyncStorage.getItem(\n        dislikeCandidateVariable\n      );\n\n      likesForCandidate = JSON.parse(likesForCandidate);\n\n      dislikesForCandidate = JSON.parse(dislikesForCandidate);\n\n      const likesAndDislikesNumber =\n        parseInt(likesForCandidate) + parseInt(dislikesForCandidate);\n\n      var likesPercentageForCandidate = likesForCandidate - dislikesForCandidate;\n      // (likesForCandidate / (likesForCandidatePassed +\n      //   superlikesForCandidatePassed +\n      //   dislikesForCandidatePassed)) * 50;\n\n      var scoreForCandidate = likesPercentageForCandidate;\n\n      if (isNaN(scoreForCandidate) || scoreForCandidate == \"Infinity\") {\n        return -1000000000000;\n      } else {\n        return parseInt(scoreForCandidate);\n      }\n\n      // const candidateVariable = \"@likeListCandidate_\" + idCandidat;\n      // const dislikeCandidateVariable = \"@dislikeListCandidate_\" + idCandidat;\n\n      // var likesForCandidate = await AsyncStorage.getItem(candidateVariable);\n      // var dislikesForCandidate = await AsyncStorage.getItem(\n      //   dislikeCandidateVariable\n      // );\n\n      // likesForCandidate = JSON.parse(likesForCandidate);\n      // if (likesForCandidate == null) {\n      //   likesForCandidate = 0;\n      // } else {\n      //   likesForCandidate = likesForCandidate.length;\n      // }\n\n      // dislikesForCandidate = JSON.parse(dislikesForCandidate);\n      // if (dislikesForCandidate == null) {\n      //   dislikesForCandidate = 0;\n      // } else {\n      //   dislikesForCandidate = dislikesForCandidate.length;\n      // }\n\n      // const likesAndDislikesNumber =\n      //   parseInt(likesForCandidate) + parseInt(dislikesForCandidate);\n\n      // var likesPercentageForCandidate =\n      //   (likesForCandidate / likesAndDislikesNumber) * 100;\n\n      // var scoreForCandidate = likesPercentageForCandidate;\n      // return round(scoreForCandidate);\n    };\n    const currentPourcentage = await getPourcentageForCandidate(\n      props.idCandidat\n    );\n    setCandidatePourcentage(currentPourcentage);\n  }, [props.item.isFocused, isFocused, props.item.score]);\n\n  // console.log(\"score pour : \" + candidateDetails[0].id + \" : \", candidateScore);\n\n  if (loaded) {\n    return (\n      <TouchableOpacity\n        onPress={() =>\n          navigation.navigate(\"CandidateResults\", {\n            id: candidateDetails[0].id,\n            firstname: candidateDetails[0].firstname,\n            lastname: candidateDetails[0].lastname,\n            bgColor: candidateDetails[0].bgColor,\n          })\n        }\n        style={[\n          styles.container,\n          {\n            backgroundColor: candidateDetails[0].bgColor,\n            overflow: \"hidden\",\n            height: 104,\n          },\n        ]}\n      >\n        <View style={[styles.candidateDetailsContainer, { marginTop: 10 }]}>\n          <Text></Text>\n          <Text style={styles.hashtagPositionText}>#</Text>\n          <Text style={styles.positionText}>{props.item.position}</Text>\n\n          <Text style={styles.candidateFirtnameText}>\n            {candidateDetails[0].firstname}\n          </Text>\n\n          <Text style={styles.candidateLastnameText}>\n            {candidateDetails[0].lastname}\n          </Text>\n        </View>\n        <View style={styles.bottomCardContainer}>\n          {candidateScore == -1000000000000 ? (\n            <Text style={styles.agreePourcentageText} numberOfLines={2}>\n              Continue à swiper pour découvrir le score 🗳\n            </Text>\n          ) : (\n            <Text style={styles.agreePourcentageText} numberOfLines={2}>\n              <Text style={{fontWeight: '600'}}>Score : {candidatePourcentage}</Text> | {swipedPropositions} propositions passées\n              {/* {\n              candidateScore == 0\n                ? \" 0\"\n                : candidateScore > 100\n                ? \" 100\"\n                : \" \" + \n                candidatePourcentage} */}\n              {/* % de ses propositions */}\n            </Text>\n          )}\n          <Image\n            source={candidateDetails[0].image}\n            style={styles.imageCandidate}\n          />\n        </View>\n      </TouchableOpacity>\n    );\n  } else {\n    return (\n      <View>\n        <ActivityIndicator size={\"large\"} />\n      </View>\n    );\n  }\n}\n"
  },
  {
    "path": "src/components/ResultCandidateCard/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\n\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    height: 104,\n    width: 0.87 * width,\n    marginBottom: 10,\n    borderRadius: 15,\n    justifyContent: \"space-between\",\n  },\n  candidateDetailsContainer: {\n    flexDirection: \"row\",\n    marginTop: 11,\n    marginLeft: 12,\n    marginBottom: 5,\n  },\n  hashtagPositionText: {\n    fontSize: 17,\n    color: \"white\",\n    fontWeight: \"bold\",\n  },\n  positionText: {\n    fontSize: 24,\n    color: \"white\",\n    fontWeight: \"bold\",\n  },\n  candidateFirtnameText: {\n    fontSize: 24,\n    color: \"white\",\n    marginLeft: 9,\n  },\n  candidateLastnameText: {\n    fontSize: 24,\n    color: \"white\",\n    fontWeight: \"bold\",\n    marginLeft: 7,\n  },\n  bottomCardContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n    paddingHorizontal: 20,\n  },\n  agreePourcentageText: {\n    width: \"75%\",\n    fontSize: 18,\n    color: \"white\",\n  },\n  imageCandidate: {\n    height: 90,\n    width: 86,\n    marginTop: -19,\n    resizeMode: \"contain\",\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/SwipeCard/index.js",
    "content": "import React, { useState, useEffect } from \"react\";\nimport { View, Text, TouchableOpacity, Dimensions } from \"react-native\";\nimport styles from \"./styles\";\nimport {\n  FontAwesome5,\n  FontAwesome,\n  AntDesign,\n  Entypo,\n  MaterialCommunityIcons,\n  MaterialIcons,\n} from \"@expo/vector-icons\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport findThemeTitle from \"../../../assets/queries/findThemeTitle\";\n\nexport default function SwipeCard(props) {\n  if (props.proposition.id !== undefined) {\n    const { articleContent, id, idCandidat, idTheme, title, source } =\n      props.proposition;\n\n    const themeRequest = findThemeTitle(idTheme);\n    const themeTitle = themeRequest[0].title;\n    const themeBackground = themeRequest[0].cardBackground;\n    const iconType = themeRequest[0].iconType;\n    const iconTitle = themeRequest[0].iconTitle;\n\n    const navigation = useNavigation();\n\n    return (\n      <View\n        style={{\n          shadowColor: \"#000\",\n          shadowOffset: {\n            width: 0,\n            height: 2,\n          },\n          shadowOpacity: 0.23,\n          shadowRadius: 2.62,\n\n          elevation: 4,\n          alignSelf: \"center\",\n          marginTop: -40,\n        }}\n      >\n        <View\n          style={[\n            styles.cardContainer,\n            {\n              backgroundColor: themeBackground,\n            },\n          ]}\n        >\n          <View\n            style={[\n              styles.topCardInfos,\n              {\n                backgroundColor: themeBackground,\n              },\n            ]}\n          >\n            {iconType == \"FontAwesome5\" ? (\n              <FontAwesome5\n                name={iconTitle}\n                size={Dimensions.get(\"window\").width * 0.07}\n                color={\n                  idTheme == 1\n                    ? \"white\"\n                    : idTheme == 2\n                    ? \"white\"\n                    : idTheme == 3\n                    ? \"white\"\n                    : idTheme == 4\n                    ? \"white\"\n                    : idTheme == 5\n                    ? \"#FAFC91\"\n                    : idTheme == 6\n                    ? \"white\"\n                    : idTheme == 7\n                    ? \"white\"\n                    : idTheme == 8\n                    ? \"white\"\n                    : idTheme == 9\n                    ? \"white\"\n                    : idTheme == 10\n                    ? \"white\"\n                    : null\n                }\n              />\n            ) : iconType == \"FontAwesome\" ? (\n              <FontAwesome\n                name={iconTitle}\n                size={Dimensions.get(\"window\").width * 0.07}\n                color={\n                  idTheme == 1\n                    ? \"white\"\n                    : idTheme == 2\n                    ? \"white\"\n                    : idTheme == 3\n                    ? \"white\"\n                    : idTheme == 4\n                    ? \"white\"\n                    : idTheme == 5\n                    ? \"#FAFC91\"\n                    : idTheme == 6\n                    ? \"white\"\n                    : idTheme == 7\n                    ? \"white\"\n                    : idTheme == 8\n                    ? \"white\"\n                    : idTheme == 9\n                    ? \"white\"\n                    : idTheme == 10\n                    ? \"white\"\n                    : null\n                }\n              />\n            ) : iconType == \"AntDesign\" ? (\n              <AntDesign\n                name={iconTitle}\n                size={Dimensions.get(\"window\").width * 0.07}\n                color={\n                  idTheme == 1\n                    ? \"white\"\n                    : idTheme == 2\n                    ? \"white\"\n                    : idTheme == 3\n                    ? \"white\"\n                    : idTheme == 4\n                    ? \"white\"\n                    : idTheme == 5\n                    ? \"#FAFC91\"\n                    : idTheme == 6\n                    ? \"white\"\n                    : idTheme == 7\n                    ? \"white\"\n                    : idTheme == 8\n                    ? \"white\"\n                    : idTheme == 9\n                    ? \"white\"\n                    : idTheme == 10\n                    ? \"white\"\n                    : null\n                }\n              />\n            ) : iconType == \"Entypo\" ? (\n              <Entypo\n                name={iconTitle}\n                size={Dimensions.get(\"window\").width * 0.07}\n                color={\n                  idTheme == 1\n                    ? \"white\"\n                    : idTheme == 2\n                    ? \"white\"\n                    : idTheme == 3\n                    ? \"white\"\n                    : idTheme == 4\n                    ? \"white\"\n                    : idTheme == 5\n                    ? \"#FAFC91\"\n                    : idTheme == 6\n                    ? \"white\"\n                    : idTheme == 7\n                    ? \"white\"\n                    : idTheme == 8\n                    ? \"white\"\n                    : idTheme == 9\n                    ? \"white\"\n                    : idTheme == 10\n                    ? \"white\"\n                    : null\n                }\n              />\n            ) : iconType == \"MaterialCommunityIcons\" ? (\n              <MaterialCommunityIcons\n                name={iconTitle}\n                size={Dimensions.get(\"window\").width * 0.07}\n                color={\n                  idTheme == 1\n                    ? \"white\"\n                    : idTheme == 2\n                    ? \"white\"\n                    : idTheme == 3\n                    ? \"white\"\n                    : idTheme == 4\n                    ? \"white\"\n                    : idTheme == 5\n                    ? \"#FAFC91\"\n                    : idTheme == 6\n                    ? \"white\"\n                    : idTheme == 7\n                    ? \"white\"\n                    : idTheme == 8\n                    ? \"white\"\n                    : idTheme == 9\n                    ? \"white\"\n                    : idTheme == 10\n                    ? \"white\"\n                    : null\n                }\n              />\n            ) : iconType == \"MaterialIcons\" ? (\n              <MaterialIcons\n                name={iconTitle}\n                size={Dimensions.get(\"window\").width * 0.07}\n                color={\n                  idTheme == 1\n                    ? \"white\"\n                    : idTheme == 2\n                    ? \"white\"\n                    : idTheme == 3\n                    ? \"white\"\n                    : idTheme == 4\n                    ? \"white\"\n                    : idTheme == 5\n                    ? \"#FAFC91\"\n                    : idTheme == 6\n                    ? \"white\"\n                    : idTheme == 7\n                    ? \"white\"\n                    : idTheme == 8\n                    ? \"white\"\n                    : idTheme == 9\n                    ? \"white\"\n                    : idTheme == 10\n                    ? \"white\"\n                    : null\n                }\n              />\n            ) : null}\n            <View\n              style={[\n                styles.themeInfoContainer,\n                {\n                  backgroundColor:\n                    idTheme == 1\n                      ? \"white\"\n                      : idTheme == 2\n                      ? \"white\"\n                      : idTheme == 3\n                      ? \"white\"\n                      : idTheme == 4\n                      ? \"white\"\n                      : idTheme == 5\n                      ? \"#FAFC91\"\n                      : idTheme == 6\n                      ? \"white\"\n                      : idTheme == 7\n                      ? \"white\"\n                      : idTheme == 8\n                      ? \"white\"\n                      : idTheme == 9\n                      ? \"white\"\n                      : idTheme == 10\n                      ? \"white\"\n                      : null,\n                },\n              ]}\n            >\n              <Text\n                style={[\n                  styles.themeText,\n                  {\n                    color: themeBackground,\n                    textTransform: \"uppercase\",\n                  },\n                ]}\n              >\n                {themeTitle}\n              </Text>\n            </View>\n          </View>\n          <View\n            style={[\n              styles.questionContainer,\n              {\n                backgroundColor: themeBackground,\n              },\n            ]}\n          >\n            <Text\n              style={[\n                styles.questionText,\n                {\n                  color:\n                    idTheme == 1\n                      ? \"white\"\n                      : idTheme == 2\n                      ? \"white\"\n                      : idTheme == 3\n                      ? \"white\"\n                      : idTheme == 4\n                      ? \"white\"\n                      : idTheme == 5\n                      ? \"#FAFC91\"\n                      : idTheme == 6\n                      ? \"white\"\n                      : idTheme == 7\n                      ? \"white\"\n                      : idTheme == 8\n                      ? \"white\"\n                      : idTheme == 9\n                      ? \"white\"\n                      : idTheme == 10\n                      ? \"white\"\n                      : null,\n                },\n              ]}\n            >\n              {title}\n            </Text>\n          </View>\n          <View style={styles.bottomCardInfos}>\n            {/* Bouton \"en savoir plus\" */}\n            <TouchableOpacity\n              style={styles.learnMoreButton}\n              onPress={() =>\n                navigation.navigate(\"PropositionDetails\", {\n                  title: title,\n                  theme: idTheme,\n                  articleContent: articleContent,\n                  idCandidat: idCandidat,\n                  source: source,\n                  id: id,\n                })\n              }\n            >\n              <FontAwesome5 name={\"plus\"} size={18} color={\"#707AD7\"} />\n              <Text style={styles.learnMoreText}>EN SAVOIR PLUS</Text>\n            </TouchableOpacity>\n          </View>\n        </View>\n      </View>\n    );\n  } else {\n    return null;\n  }\n}\n"
  },
  {
    "path": "src/components/SwipeCard/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get(\"window\").width;\nconst height = Dimensions.get(\"window\").height;\n\nconst styles = StyleSheet.create({\n  cardContainer: {\n    width: width * 0.9,\n    height: height * 0.50,\n    backgroundColor: \"#E9556F\",\n    borderRadius: 20,\n    overflow: \"hidden\",\n    justifyContent: 'flex-end'\n  },\n  topCardInfos: {\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    position: 'absolute',\n    top: 10,\n    alignSelf: 'center',\n    zIndex: 10\n  },\n  themeInfoContainer: {\n    paddingHorizontal: 10,\n    height: width*0.06,\n    backgroundColor: \"#FAFC91\",\n    borderRadius: 25,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    marginTop: 11,\n  },\n  themeText: {\n    color: colors.primary,\n    fontSize: width*0.038\n  },\n  questionContainer: {\n    height: height * 0.3,\n    backgroundColor: \"#E9556F\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    paddingHorizontal: 27,\n  },\n  questionText: {\n    fontWeight: \"bold\",\n    fontSize: width*0.055,\n    textAlign: \"center\",\n    color: \"#FAFC91\",\n    paddingBottom: height*0.02\n  },\n  bottomCardInfos: {\n    backgroundColor: colors.bottomCardColor,\n    alignItems: \"center\",\n    paddingBottom: 15\n  },\n  learnMoreButton: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    height: width*0.11,\n    width: width * 0.82,\n    backgroundColor: \"white\",\n    justifyContent: \"center\",\n    borderRadius: 10,\n    marginTop: 15,\n  },\n  learnMoreText: {\n    fontWeight: \"bold\",\n    fontSize: 18,\n    marginLeft: 6,\n    color: \"#707AD7\",\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/ThemeCard/index.js",
    "content": "import { useNavigation } from \"@react-navigation/core\";\nimport React from \"react\";\nimport { View, Text, TouchableOpacity } from \"react-native\";\nimport {\n  FontAwesome5,\n  FontAwesome,\n  Entypo,\n  MaterialCommunityIcons,\n  MaterialIcons,\n} from \"@expo/vector-icons\";\nimport styles from \"./styles\";\n\nexport default function ThemeCard(props) {\n  const navigation = useNavigation();\n  const item = props.theme;\n\n  return (\n    <TouchableOpacity\n      style={[styles.container, { backgroundColor: item.lightColor }]}\n      onPress={() =>\n        navigation.navigate(\"ListPropositions\", {\n          title: item.title,\n          themeID: item.id,\n        })\n      }\n    >\n      <Text style={styles.textTitle} numberOfLines={2}>\n        {item.title}\n      </Text>\n      <View style={{ marginTop: 30, marginRight: 25 }}>\n        {/* Mettre un émoji en rapport avec le thème ? */}\n        {item.iconType == \"MaterialCommunityIcons\" ? (\n          <MaterialCommunityIcons\n            color={item.darkColor}\n            name={item.iconTitle}\n            size={80}\n          />\n        ) : item.iconType == \"FontAwesome\" ? (\n          <FontAwesome\n            color={item.darkColor}\n            name={item.iconTitle}\n            size={80}\n          />\n        ) : item.iconType == \"FontAwesome5\" ? (\n          <FontAwesome5\n            color={item.darkColor}\n            name={item.iconTitle}\n            size={80}\n          />\n        ) : item.iconType == \"MaterialIcons\" ? (\n          <MaterialIcons\n            color={item.darkColor}\n            name={item.iconTitle}\n            size={80}\n          />\n        ) : item.iconType == \"Entypo\" ? (\n          <Entypo color={item.darkColor} name={item.iconTitle} size={100} />\n        ) : null}\n      </View>\n    </TouchableOpacity>\n  );\n}\n"
  },
  {
    "path": "src/components/ThemeCard/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  container: {\n    width: '90%',\n    height: 92,\n    alignSelf: \"center\",\n    marginBottom: 15,\n    flexDirection: \"row\",\n    borderRadius: 15,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 1,\n    },\n    shadowOpacity: 0.2,\n    shadowRadius: 1.41,\n\n    elevation: 2,\n    justifyContent: \"space-between\",\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    overflow: 'hidden'\n  },\n  textTitle: {\n      marginTop: 20,\n      marginLeft: 20,\n      color: 'white',\n      fontSize: 22,\n      fontWeight: 'bold',\n      width: '65%'\n  }\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/ThemeHeader/index.js",
    "content": "import React from \"react\";\nimport { View, Text, Dimensions } from \"react-native\";\nimport BackButton from \"../backButton\";\nimport styles from \"./styles\";\nimport {\n  FontAwesome5,\n  MaterialCommunityIcons,\n  FontAwesome,\n  MaterialIcons,\n  Entypo,\n} from \"@expo/vector-icons\";\n\nexport default function ThemeHeader(props) {\n  const themeDetails = props;\n\n  return (\n    <View style={[styles.header, { backgroundColor: themeDetails.lightColor }]}>\n      <BackButton />\n      <View style={styles.headerTextAndIconContainer}>\n        <View style={{ marginTop: Dimensions.get(\"window\").height * 0.13 }}>\n          <Text\n            style={{\n              marginLeft: 20,\n              marginBottom: 10,\n              fontSize: Dimensions.get(\"window\").height * 0.045,\n              fontWeight: \"bold\",\n              color: \"white\",\n              width: Dimensions.get(\"window\").width * 0.6,\n            }}\n            numberOfLines={1}\n          >\n            {themeDetails.title}\n          </Text>\n        </View>\n        <View style={{ marginTop: 40 }}>\n          {/* Mettre un émoji en rapport avec le thème ? */}\n          {themeDetails.iconType == \"MaterialCommunityIcons\" ? (\n            <MaterialCommunityIcons\n              color={themeDetails.darkColor}\n              name={themeDetails.iconTitle}\n              size={170}\n            />\n          ) : themeDetails.iconType == \"FontAwesome\" ? (\n            <FontAwesome\n              color={themeDetails.darkColor}\n              name={themeDetails.iconTitle}\n              size={170}\n            />\n          ) : themeDetails.iconType == \"FontAwesome5\" ? (\n            <FontAwesome5\n              color={themeDetails.darkColor}\n              name={themeDetails.iconTitle}\n              size={170}\n            />\n          ) : themeDetails.iconType == \"MaterialIcons\" ? (\n            <MaterialIcons\n              color={themeDetails.darkColor}\n              name={themeDetails.iconTitle}\n              size={170}\n            />\n          ) : themeDetails.iconType == \"Entypo\" ? (\n            <Entypo\n              color={themeDetails.darkColor}\n              name={themeDetails.iconTitle}\n              size={170}\n            />\n          ) : null}\n        </View>\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/components/ThemeHeader/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  header: {\n    justifyContent: \"flex-end\",\n    overflow: \"hidden\",\n    height: Dimensions.get(\"window\").height * 0.2,\n  },\n  headerTextAndIconContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/TitleHeader/index.js",
    "content": "import React from 'react'\nimport { View, Text } from 'react-native'\nimport styles from './styles'\n\nexport default function TitleHeader(props) {\n\n    return (\n        <View style={styles.container}>\n            <Text style={styles.titleText}>{props.title}</Text>\n        </View>\n    )\n}\n"
  },
  {
    "path": "src/components/TitleHeader/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n    container: {\n        marginBottom: 16,\n        marginHorizontal: 31,\n    },\n    titleText: {\n        fontWeight: 'bold',\n        fontSize: 35\n    }\n});\n\nexport default styles;"
  },
  {
    "path": "src/components/backButton/index.js",
    "content": "import React from \"react\";\nimport { View, Text, TouchableOpacity } from \"react-native\";\nimport { Entypo } from \"@expo/vector-icons\";\nimport colors from \"../../../assets/colors/colors\";\nimport styles from \"./styles\";\nimport { useNavigation } from \"@react-navigation/core\";\n\nexport default function BackButton() {\n  const navigation = useNavigation();\n\n  return (\n    <TouchableOpacity\n      style={styles.backButtonContainer}\n      onPress={() => navigation.goBack()}\n    >\n      <Entypo name={\"chevron-left\"} size={27} color={\"white\"} />\n    </TouchableOpacity>\n  );\n}\n"
  },
  {
    "path": "src/components/backButton/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst styles = StyleSheet.create({\n  backButtonContainer: {\n    position: \"absolute\",\n    top: Dimensions.get('window').height*0.06,\n    left: 20,\n    height: 37,\n    width: 37,\n    backgroundColor: colors.primary,\n    borderRadius: 38,\n    zIndex: 1,\n    alignItems: 'center',\n    justifyContent: 'center'\n  },\n});\n\nexport default styles;"
  },
  {
    "path": "src/components/learnCard/index.js",
    "content": "import React from \"react\";\nimport { View, Text, Image, TouchableOpacity } from \"react-native\";\nimport styles from \"./styles\";\nimport { useNavigation } from \"@react-navigation/core\";\n\nexport default function LearnCard(props) {\n  const navigation = useNavigation();\n\n  const item = props;\n\n  return (\n    <TouchableOpacity\n      style={styles.container}\n      onPress={() => navigation.navigate(\"Article\", {\n          title: item.title,\n          content: item.articleContent\n      })}\n    >\n      <View style={styles.textContainer}>\n        <Text style={styles.titleText}>{item.title}</Text>\n        <Text style={styles.descriptionText}>{item.description}</Text>\n      </View>\n      <View>\n        <Image style={styles.cardImage} source={item.image} />\n      </View>\n    </TouchableOpacity>\n  );\n}\n"
  },
  {
    "path": "src/components/learnCard/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst height = Dimensions.get(\"window\").height;\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    width: width * 0.9,\n    backgroundColor: \"white\",\n    height: 127,\n    alignSelf: \"center\",\n    marginBottom: 15,\n    flexDirection: \"row\",\n    borderRadius: 15,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 1,\n    },\n    shadowOpacity: 0.2,\n    shadowRadius: 1.41,\n\n    elevation: 2,\n    justifyContent: \"space-between\",\n  },\n  textContainer: {\n    marginHorizontal: 20,\n    justifyContent: \"center\",\n  },\n  titleText: {\n    fontWeight: \"bold\",\n    fontSize: 22,\n  },\n  descriptionText: {\n    marginTop: 3,\n    width: width * 0.5,\n    fontSize: 15,\n  },\n  cardImage: {\n    height: 100,\n    width: 100,\n    position: \"absolute\",\n    bottom: 0,\n    right: 20,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.23,\n    shadowRadius: 2.62,\n\n    elevation: 4,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/components/teamCard/index.js",
    "content": "import { View, Text, Image, TouchableOpacity } from \"react-native\";\nimport React from \"react\";\nimport styles from \"./styles\";\nimport * as Linking from \"expo-linking\";\n\nexport default function TeamCard(props) {\n  const teamProfile = props.profile;\n\n  const handleSocialLink = (username) => {\n    const socialURL = \"https://instagram.com/\" + username;\n\n    Linking.openURL(socialURL);\n  };\n\n  return (\n    <TouchableOpacity\n      style={styles.container}\n      onPress={() => handleSocialLink(teamProfile.social)}\n    >\n      <View style={styles.infoContainer}>\n        <View style={styles.nameContainer}>\n          <Text style={styles.firstName}>{teamProfile.firstName}</Text>\n          <Text style={styles.lastName}>{teamProfile.lastName}</Text>\n        </View>\n        <Text style={styles.roleText}>{teamProfile.role}</Text>\n      </View>\n      <View style={styles.pictureContainer}>\n        <Image style={styles.profileImage} source={teamProfile.imageURI} />\n      </View>\n    </TouchableOpacity>\n  );\n}\n"
  },
  {
    "path": "src/components/teamCard/styles.js",
    "content": "import React from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst width = Dimensions.get('window').width;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n    width: \"100%\",\n    backgroundColor: \"#5B98EC\",\n    borderRadius: 8,\n    paddingHorizontal: 15,\n    paddingTop: 10,\n    marginBottom: 10,\n  },\n  nameContainer: {\n    flexDirection: \"row\",\n  },\n  firstName: {\n    fontSize: width*0.065,\n    color: \"white\",\n    fontWeight: \"bold\",\n  },\n  lastName: {\n    marginLeft: 5,\n    fontSize: width*0.065,\n    color: \"white\",\n    fontWeight: \"400\",\n  },\n  roleText: {\n    fontSize: 17,\n    color: \"white\",\n    marginTop: 4,\n  },\n  profileImage: {\n    height: 70,\n    width: 70,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/AllThemesList/index.js",
    "content": "import React from \"react\";\nimport { View, Text, FlatList, SafeAreaView } from \"react-native\";\nimport themesCategories from \"../../../assets/data/themes/themesCategories\";\nimport BackButton from \"../../components/backButton\";\nimport ThemeCard from \"../../components/ThemeCard\";\n\nimport styles from \"./styles\";\n\nexport default function AllThemesList() {\n  return (\n    <View style={styles.container}>\n      <SafeAreaView style={styles.header}>\n        <BackButton />\n        <View style={{ marginTop: 65 }}>\n          <Text\n            style={styles.titleText}\n          >\n            Tous les thèmes\n          </Text>\n        </View>\n      </SafeAreaView>\n\n      <FlatList\n      contentContainerStyle={{ paddingTop: 20, paddingBottom: 20 }}\n      data={themesCategories}\n      keyExtractor={(item) => item.id}\n      renderItem={({item}) => <ThemeCard theme={item} />}\n      />\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/AllThemesList/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  header: {\n    backgroundColor: \"white\",\n  },\n  titleText: {\n    marginLeft: 20,\n    marginBottom: 10,\n    fontSize: 30,\n    fontWeight: \"bold\",\n    color: \"black\",\n  },\n});\nexport default styles;\n"
  },
  {
    "path": "src/screens/Article/index.js",
    "content": "import { useNavigation } from \"@react-navigation/core\";\nimport React from \"react\";\nimport { View, Text, ScrollView, SafeAreaView } from \"react-native\";\n\nimport HTMLView from \"react-native-htmlview\";\nimport BackButton from \"../../components/backButton\";\nimport styles from \"./styles\";\n\nexport default function Article({ route }) {\n  const articleInfo = route.params;\n\n  const navigation = useNavigation();\n\n  return (\n    <View style={styles.container}>\n      <BackButton />\n      <SafeAreaView>\n      <ScrollView>\n        <Text style={styles.titleText}>{articleInfo.title}</Text>\n        <ScrollView style={styles.contentContainer}>\n          <HTMLView value={articleInfo.content} stylesheet={styles} />\n        </ScrollView>\n      </ScrollView>\n      </SafeAreaView>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Article/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  /* HTML styles */\n  p: {\n    fontSize: 20,\n    paddingHorizontal: 20\n  },\n\n  /* React styles */\n  container: {\n    flex: 1\n  },\n  contentContainer: {\n    marginTop: 15,\n  },\n  titleText: {\n    fontSize: 35,\n    marginTop: 60,\n    marginLeft: 20,\n    fontWeight: 'bold'\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/CandidateProfile/index.js",
    "content": "import React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n  ScrollView,\n  FlatList,\n  Dimensions,\n  ActivityIndicator,\n  TouchableOpacity,\n} from \"react-native\";\nimport styles from \"./styles\";\nimport candidatesList from \"../../../assets/data/candidates/candidatesList\";\nimport BackButton from \"../../components/backButton\";\nimport { Entypo, Feather, Ionicons } from \"@expo/vector-icons\";\nimport FavoriteCardForCandidates from \"../../components/FavoriteCardForCandidates\";\nimport {\n  ImageHeaderScrollView,\n  TriggeringView,\n} from \"react-native-image-header-scroll-view\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport themesCategory from \"../../../assets/data/themes/themesCategories\";\n\nexport default function CandidateProfile({ route }) {\n  const navigation = useNavigation();\n\n  const candidateRouteDetails = route.params;\n\n  const [candidateDetails, setCandidateDetails] = useState([]);\n  const [IDCandidat, setIDCandidat] = useState(0);\n  const [firstname, setFirstname] = useState(\"\");\n  const [lastname, setLastname] = useState(\"\");\n  const [age, setAge] = useState();\n  const [groupe, setGroupe] = useState(\"\");\n  const [image, setImage] = useState();\n  const [imageProfile, setImageProfile] = useState();\n  const [favorites, setFavorites] = useState([]);\n  const [creditsForPicture, setCreditsForPicture] = useState(\"\");\n  const [studies, setStudies] = useState(\"\");\n  const [work, setWork] = useState(\"\");\n\n  const [isLoaded, setIsLoaded] = useState(false);\n\n  useEffect(() => {\n    /* Trouver les infos du candidat (filtre le tableau avec tous les candidats et ne retient que celui qui doit être affiché) */\n    let candidateProfileDetails = candidatesList.filter(\n      (d) => d.id == candidateRouteDetails.id\n    );\n    setCandidateDetails(\n      candidateDetails.splice(\n        0,\n        candidateDetails.length,\n        ...candidateProfileDetails\n      )\n    );\n    setIDCandidat(candidateDetails[0].id);\n    setFirstname(candidateDetails[0].firstname);\n    setLastname(candidateDetails[0].lastname);\n    setAge(candidateDetails[0].age);\n    setGroupe(candidateDetails[0].groupe);\n    setImage(candidateDetails[0].image);\n    setImageProfile(candidateDetails[0].imageProfile);\n    setFavorites(candidateDetails[0].favorites);\n    setCreditsForPicture(candidateDetails[0].pictureCredits);\n    setStudies(candidateDetails[0].studies);\n    setWork(candidateDetails[0].work);\n\n    /* On peut afficher les infos quand elles sont chargées */\n    setIsLoaded(true);\n\n    /* Pour chaque thème, filtrer uniquement ses propositions */\n  }, []);\n\n  return (\n    <View style={styles.container}>\n      <BackButton />\n      {isLoaded ? (\n        <ImageHeaderScrollView\n          maxHeight={Dimensions.get(\"window\").height * 0.3}\n          minHeight={Dimensions.get(\"window\").height * 0.14}\n          headerImage={imageProfile}\n          showsVerticalScrollIndicator={false}\n        >\n          <TriggeringView>\n            <ScrollView style={{ zIndex: 10 }}>\n              <View style={[styles.upTextContainer, { marginLeft: 25 }]}>\n                <Text style={styles.nameText}>\n                  {firstname} {lastname}\n                </Text>\n                <Text style={styles.ageText}>{age}</Text>\n              </View>\n              <View style={[styles.groupDetailsContainer, { marginLeft: 25 }]}>\n                <Feather name={\"map-pin\"} size={24} color={\"gray\"} />\n                <Text style={styles.groupText}>{groupe}</Text>\n              </View>\n\n              <View style={[styles.groupDetailsContainer, { marginLeft: 25 }]}>\n                <Ionicons name=\"briefcase-outline\" size={24} color=\"gray\" />\n                <Text style={styles.groupText}>{work}</Text>\n              </View>\n\n              {studies ? (\n                <View\n                  style={[\n                    styles.groupDetailsContainer,\n                    { marginLeft: 25, alignItems: \"flex-start\" },\n                  ]}\n                >\n                  <Ionicons name={\"school-outline\"} size={24} color={\"gray\"} />\n                  <Text style={styles.groupText}>{studies}</Text>\n                </View>\n              ) : null}\n\n              <FlatList\n                contentContainerStyle={{ paddingLeft: 26 }}\n                showsHorizontalScrollIndicator={false}\n                snapToInterval={Dimensions.get(\"window\").width * 0.8}\n                snapToAlignment={\"start\"}\n                decelerationRate={\"fast\"}\n                style={{ marginTop: 12 }}\n                data={favorites}\n                keyExtractor={(item) => item.id}\n                horizontal\n                showsHorizontalScrollIndicator={false}\n                renderItem={({ item }) => (\n                  <FavoriteCardForCandidates item={item} />\n                )}\n              />\n\n              <View style={styles.separationBar} />\n\n              <FlatList\n                data={themesCategory}\n                keyExtractor={(item) => item.id}\n                renderItem={({ item }) => (\n                  <View>\n                    <TouchableOpacity\n                      style={{\n                        flexDirection: \"row\",\n                        justifyContent: \"space-between\",\n                        alignItems: \"center\",\n                      }}\n                      onPress={() =>\n                        navigation.navigate(\"ThemeByCandidate\", {\n                          idCandidat: IDCandidat,\n                          idTheme: item.id,\n                          candidateLastName: lastname,\n                          candidateFirstName: firstname,\n                        })\n                      }\n                    >\n                      <Text numberOfLines={1} style={styles.themeText}>\n                        {item.emoji} {item.title}\n                      </Text>\n                      <View style={styles.themeContainer}>\n                        <Entypo\n                          name={\"chevron-right\"}\n                          color={\"white\"}\n                          size={15}\n                        />\n                      </View>\n                    </TouchableOpacity>\n\n                    <View style={styles.themeBottomBar} />\n                  </View>\n                )}\n              />\n\n              <Text\n                style={{\n                  marginTop: 15,\n                  marginLeft: 25,\n                  marginBottom: 30,\n                  color: \"gray\",\n                  fontSize: 12,\n                  width: \"80%\",\n                }}\n              >\n                Crédit photo du candidat : {creditsForPicture}\n              </Text>\n            </ScrollView>\n          </TriggeringView>\n        </ImageHeaderScrollView>\n      ) : (\n        <View style={{ alignItems: \"center\", justifyContent: \"center\" }}>\n          <ActivityIndicator style={{ alignSelf: \"center\" }} size={\"large\"} />\n        </View>\n      )}\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/CandidateProfile/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: \"white\",\n  },\n  headerImage: {\n    width: \"100%\",\n    height: 247,\n  },\n  upTextContainer: {\n    flexDirection: \"row\",\n    alignItems: 'baseline',\n  },\n  nameText: {\n    marginTop: 15,\n    fontSize: 30,\n    fontWeight: \"bold\",\n  },\n  ageText: {\n    fontSize: 25,\n    marginLeft: 6,\n  },\n  groupDetailsContainer: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    marginTop: 7,\n    width: Dimensions.get('window').width*0.8\n  },\n  groupText: {\n    fontSize: 18,\n    marginLeft: 5,\n    color: \"gray\",\n  },\n  themeText: {\n    marginLeft: 25,\n    marginTop: 15,\n    fontSize: 24,\n    fontWeight: \"500\",\n    width: \"80%\",\n  },\n  showAllButton: {\n    marginTop: 10,\n    height: 35,\n    width: \"90%\",\n    backgroundColor: colors.primary,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    alignSelf: \"center\",\n    borderRadius: 8,\n  },\n  showAllText: {\n    textTransform: \"uppercase\",\n    color: \"white\",\n    fontWeight: \"700\",\n  },\n  separationBar: {\n    width: \"88%\",\n    height: 0.9,\n    backgroundColor: \"lightgray\",\n    paddingHorizontal: 30,\n    alignSelf: \"center\",\n    marginTop: 7,\n  },\n  themeContainer: {\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    marginRight: 20,\n    marginTop: 15,\n    height: 25,\n    width: 25,\n    borderRadius: 25,\n    backgroundColor: colors.primary,\n    paddingLeft: 2,\n  },\n  themeBottomBar: {\n      width: \"100%\",\n      height: 0.9,\n      backgroundColor: \"lightgray\",\n      marginLeft: 50,\n      alignSelf: \"center\",\n      marginTop: 7,\n      marginTop: 15,\n  }\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/CandidatesResults/index.js",
    "content": "import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport React, { useState, useEffect } from \"react\";\nimport {\n  View,\n  Text,\n  ActivityIndicator,\n  TouchableOpacity,\n  FlatList,\n  Dimensions,\n} from \"react-native\";\nimport PropositionListCard from \"../../components/PropositionListCard\";\nimport styles from \"./styles\";\nimport getPropositionDetails from \"../../../assets/queries/getPropositionDetails\";\n\nimport firstPropositions from \"../../../assets/data/propositions/firstPropositions\";\nimport propositionsList from \"../../../assets/data/propositions/propositionsList\";\n\nvar allPropositions = firstPropositions.concat(propositionsList);\n\nexport default function CandidatesResults({ route }) {\n  const candidateInfo = route.params;\n\n  // console.log(candidateInfo);\n\n  const navigation = useNavigation();\n\n  const [likedPropositions, setLikedPropositions] = useState([]);\n  const [dislikedPropositions, setDislikedPropositions] = useState([]);\n  const [superLikedPropositions, setSuperLikedPropositions] = useState([]);\n  const [loaded, setLoaded] = useState(false);\n\n  const [viewIndex, setViewIndex] = useState(1);\n\n  useEffect(async () => {\n    const likeListVariable = \"@likeListCandidate_\" + candidateInfo.id;\n    const dislikeListVariable = \"@dislikeListCandidate_\" + candidateInfo.id;\n    const superLikeListVariable = \"@superLikeListCandidate_\" + candidateInfo.id;\n\n    // On récupère les propositions likées du candidat\n    try {\n      await AsyncStorage.getItem(likeListVariable).then(async (response) => {\n        var likeListByCandidate = JSON.parse(response);\n\n        let finalPropositionsLiked = [...new Set(likeListByCandidate)];\n\n        console.log(\"Propositions likées : \", finalPropositionsLiked);\n\n        setLikedPropositions(finalPropositionsLiked);\n\n        // On récupère les propositions dislikées du candidat\n        await AsyncStorage.getItem(dislikeListVariable).then(\n          async (response) => {\n            // console.log(response);\n            var dislikeListByCandidate = JSON.parse(response);\n\n            let finalPropositionsDisliked = [\n              ...new Set(dislikeListByCandidate),\n            ];\n            console.log(\"Propositions dislikées : \", finalPropositionsDisliked);\n\n            setDislikedPropositions(finalPropositionsDisliked);\n\n            await AsyncStorage.getItem(superLikeListVariable).then(\n              (response) => {\n                // console.log(response);\n                var superLikeListByCandidate = JSON.parse(response);\n\n                let finalPropositionsSuperLiked = [\n                  ...new Set(superLikeListByCandidate),\n                ];\n                console.log(\n                  \"Propositions super-likées : \",\n                  finalPropositionsSuperLiked\n                );\n\n                setSuperLikedPropositions(finalPropositionsSuperLiked);\n\n                setLoaded(true);\n              }\n            );\n          }\n        );\n      });\n    } catch (e) {\n      console.log(\n        \"Erreur lors de la récupération des propositions likées : \",\n        e\n      );\n    }\n  }, []);\n\n  // console.log('Propositions likées : ', likedPropositions);\n\n  if (loaded) {\n    return (\n      <View style={styles.container}>\n        <View style={{ backgroundColor: candidateInfo.bgColor }}>\n          <Text\n            style={{\n              paddingHorizontal: 20,\n              paddingTop: Dimensions.get(\"window\").height * 0.06,\n              paddingBottom: 10,\n              color: \"white\",\n              fontWeight: \"bold\",\n              fontSize: Dimensions.get(\"window\").width * 0.085,\n            }}\n          >\n            {candidateInfo.firstname} {candidateInfo.lastname}\n          </Text>\n\n          <View style={styles.menuContainer}>\n            <TouchableOpacity\n              onPress={() => setViewIndex(1)}\n              style={[\n                styles.menuItemContainer,\n                {\n                  marginLeft: 5,\n                  backgroundColor:\n                    viewIndex == 1 ? candidateInfo.bgColor : \"white\",\n                },\n              ]}\n            >\n              <Text\n                style={{\n                  textAlign: \"center\",\n                  color: viewIndex == 1 ? \"white\" : candidateInfo.bgColor,\n                  fontSize: 20,\n                }}\n              >\n                👍 ({likedPropositions.length})\n              </Text>\n            </TouchableOpacity>\n\n            <TouchableOpacity\n              onPress={() => setViewIndex(3)}\n              style={[\n                styles.menuItemContainer,\n                {\n                  marginLeft: 5,\n                  backgroundColor:\n                    viewIndex == 3 ? candidateInfo.bgColor : \"white\",\n                },\n              ]}\n            >\n              <Text\n                style={{\n                  textAlign: \"center\",\n                  color: viewIndex == 3 ? \"white\" : candidateInfo.bgColor,\n                  fontSize: 20,\n                }}\n              >\n                🤩 ({superLikedPropositions.length})\n              </Text>\n            </TouchableOpacity>\n\n            <TouchableOpacity\n              onPress={() => setViewIndex(2)}\n              style={[\n                styles.menuItemContainer,\n                {\n                  marginLeft: 5,\n                  marginRight: 5,\n                  backgroundColor:\n                    viewIndex == 2 ? candidateInfo.bgColor : \"white\",\n                },\n              ]}\n            >\n              <Text\n                style={{\n                  textAlign: \"center\",\n                  color: viewIndex == 2 ? \"white\" : candidateInfo.bgColor,\n                  fontSize: 20,\n                }}\n              >\n                👎 ({dislikedPropositions.length})\n              </Text>\n            </TouchableOpacity>\n          </View>\n        </View>\n\n        {viewIndex == 1 ? (\n          <View style={{ flex: 1 }}>\n            {likedPropositions.length > 0 ? (\n              <FlatList\n                style={{ marginBottom: 90 }}\n                data={likedPropositions}\n                keyExtractor={(item) => item.id}\n                renderItem={({ item }) => {\n                  const propositionDetails = allPropositions.find(\n                    (proposition) => proposition.id == item\n                  );\n\n                  return (\n                    <TouchableOpacity\n                      onPress={() =>\n                        navigation.navigate(\"PropositionDetails\", {\n                          id: propositionDetails.id,\n                          title: propositionDetails.title,\n                          theme: propositionDetails.idTheme,\n                          articleContent: propositionDetails.articleContent,\n                          idCandidat: propositionDetails.idCandidat,\n                          source: propositionDetails.source,\n                          showCandidateInfo: true,\n                        })\n                      }\n                      style={[\n                        styles.container,\n                        { height: item.showCandidateName !== false ? 100 : 80 },\n                      ]}\n                    >\n                      <PropositionListCard proposition={propositionDetails} />\n                    </TouchableOpacity>\n                  );\n                }}\n              />\n            ) : (\n              <View style={{ flex: 1, alignItems: \"center\", marginTop: 50 }}>\n                <Text style={{ fontWeight: \"bold\", fontSize: 20 }}>\n                  Aucune proposition likée\n                </Text>\n              </View>\n            )}\n          </View>\n        ) : viewIndex == 2 ? (\n          <View style={{ flex: 1 }}>\n            {dislikedPropositions.length > 0 ? (\n              <FlatList\n                style={{ marginBottom: 90 }}\n                data={dislikedPropositions}\n                keyExtractor={(item) => item.id}\n                renderItem={({ item }) => {\n                  const propositionDetails = allPropositions.find(\n                    (proposition) => proposition.id == item\n                  );\n\n                  return (\n                    <TouchableOpacity\n                      onPress={() =>\n                        navigation.navigate(\"PropositionDetails\", {\n                          id: propositionDetails.id,\n                          title: propositionDetails.title,\n                          theme: propositionDetails.idTheme,\n                          articleContent: propositionDetails.articleContent,\n                          idCandidat: propositionDetails.idCandidat,\n                          source: propositionDetails.source,\n                          showCandidateInfo: true,\n                        })\n                      }\n                      style={[\n                        styles.container,\n                        { height: item.showCandidateName !== false ? 100 : 80 },\n                      ]}\n                    >\n                      <PropositionListCard proposition={propositionDetails} />\n                    </TouchableOpacity>\n                  );\n                }}\n              />\n            ) : (\n              <View style={{ flex: 1, alignItems: \"center\", marginTop: 50 }}>\n                <Text style={{ fontWeight: \"bold\", fontSize: 20 }}>\n                  Aucune proposition dislikée\n                </Text>\n              </View>\n            )}\n          </View>\n        ) : viewIndex == 3 ? (\n          <View style={{ flex: 1 }}>\n            {superLikedPropositions.length > 0 ? (\n              <FlatList\n                style={{ marginBottom: 90 }}\n                data={superLikedPropositions}\n                keyExtractor={(item) => item.id}\n                renderItem={({ item }) => {\n                  const propositionDetails = allPropositions.find(\n                    (proposition) => proposition.id == item\n                  );\n\n                  return (\n                    <TouchableOpacity\n                      onPress={() =>\n                        navigation.navigate(\"PropositionDetails\", {\n                          id: propositionDetails.id,\n                          title: propositionDetails.title,\n                          theme: propositionDetails.idTheme,\n                          articleContent: propositionDetails.articleContent,\n                          idCandidat: propositionDetails.idCandidat,\n                          source: propositionDetails.source,\n                          showCandidateInfo: true,\n                        })\n                      }\n                      style={[\n                        styles.container,\n                        { height: item.showCandidateName !== false ? 100 : 80 },\n                      ]}\n                    >\n                      <PropositionListCard proposition={propositionDetails} />\n                    </TouchableOpacity>\n                  );\n                }}\n              />\n            ) : (\n              <View style={{ flex: 1, alignItems: \"center\", marginTop: 50 }}>\n                <Text style={{ fontWeight: \"bold\", fontSize: 20 }}>\n                  Aucune proposition super-likée\n                </Text>\n              </View>\n            )}\n          </View>\n        ) : null}\n\n        <TouchableOpacity\n          onPress={() => navigation.goBack()}\n          style={[\n            styles.closeButton,\n            { backgroundColor: candidateInfo.bgColor },\n          ]}\n        >\n          <Text style={styles.closeButtonText}>Fermer</Text>\n        </TouchableOpacity>\n      </View>\n    );\n  } else {\n    return (\n      <View style={{ flex: 1, justifyContent: \"center\" }}>\n        <ActivityIndicator size={\"large\"} />\n      </View>\n    );\n  }\n}\n"
  },
  {
    "path": "src/screens/CandidatesResults/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  menuContainer: {\n    alignSelf: \"center\",\n    width: \"95%\",\n    backgroundColor: \"white\",\n    height: 50,\n    borderRadius: 10,\n    justifyContent: \"space-around\",\n    alignItems: \"center\",\n    flexDirection: \"row\",\n    marginBottom: 10,\n  },\n  menuItemContainer: {\n    width: \"31%\",\n    height: 40,\n    borderRadius: 6,\n    justifyContent: 'center',\n    alignItems: \"center\",\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n  closeButton: {\n    position: \"absolute\",\n    bottom: 35,\n    height: 55,\n    width: \"90%\",\n    alignSelf: \"center\",\n    borderRadius: 20,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  closeButtonText: {\n    fontSize: 20,\n    textTransform: \"uppercase\",\n    color: \"white\",\n    fontWeight: \"bold\",\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/EditUserInfo/index.js",
    "content": "import React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  TextInput,\n  AppRegistry,\n  Alert,\n} from \"react-native\";\nimport styles from \"./styles\";\nimport { AntDesign } from \"@expo/vector-icons\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { API, graphqlOperation } from \"aws-amplify\";\n\nexport default function EditUserInfo({ route }) {\n  const navigation = useNavigation();\n\n  const [dayOfBirth, setDayOfBirth] = useState(\"\");\n  const [monthOfBirth, setMonthOfBirth] = useState(\"\");\n  const [yearOfBirth, setYearOfBirth] = useState(\"\");\n\n  const [postalCode, setPostalCode] = useState(\"\");\n  const [userID, setUserID] = useState(\"\");\n\n  const itemToModifie = route.params.toEdit;\n\n  useEffect(async () => {\n    if (itemToModifie == \"birthDate\") {\n      await AsyncStorage.getItem(\"@userDayOfBirth\").then((response) => {\n        setDayOfBirth(response);\n      });\n\n      await AsyncStorage.getItem(\"@userMonthOfBirth\").then((response) => {\n        setMonthOfBirth(response);\n      });\n\n      await AsyncStorage.getItem(\"@userYearOfBirth\").then((response) => {\n        setYearOfBirth(response);\n      });\n    } else if (itemToModifie == \"postalCode\") {\n      await AsyncStorage.getItem(\"@postalCode\").then((response) => {\n        setPostalCode(response);\n      });\n    }\n\n    await AsyncStorage.getItem(\"@idUser\").then((response) => {\n      setUserID(response);\n    });\n  }, []);\n\n  const updateData = async (item) => {\n    if (item == \"birthDate\") {\n      const newUserAge = 2021 - yearOfBirth;\n      console.log(userID);\n\n      if (\n        dayOfBirth !== \"\" &&\n        monthOfBirth !== \"\" &&\n        yearOfBirth !== \"\" &&\n        monthOfBirth <= 12 &&\n        yearOfBirth > 1900 &&\n        newUserAge > 13 &&\n        dayOfBirth <= 31\n      ) {\n        // Mettre à jour AWS\n\n        const updateUserBirthYear =\n          `mutation editBirthYear {\n        updateUserInfo(input: {id: \"` +\n          userID +\n          `\", yearBirth: ` +\n          parseInt(yearOfBirth) +\n          `, dayBirth: ` +\n          parseInt(dayOfBirth) +\n          `, monthBirth: ` +\n          parseInt(monthOfBirth) +\n          `})\n      }`;\n\n        console.log(updateUserBirthYear);\n\n        try {\n          await API.graphql(graphqlOperation(updateUserBirthYear)).then(\n            async () => {\n              // Mettre à jour AsyncStorage\n              await AsyncStorage.setItem(\"@userDayOfBirth\", dayOfBirth);\n              await AsyncStorage.setItem(\"@userMonthOfBirth\", monthOfBirth);\n              await AsyncStorage.setItem(\"@userYearOfBirth\", yearOfBirth).then(\n                () =>\n                  navigation.navigate(\"UserInfo\", {\n                    newBirthDay: dayOfBirth,\n                    newBirthMonth: monthOfBirth,\n                    newBirthYear: yearOfBirth,\n                  })\n              );\n            }\n          );\n        } catch (e) {\n          Alert.alert(\"Oups 😖\", \"Une erreur s'est produite.\");\n          console.log(e);\n        }\n      } else {\n        Alert.alert(\"Oups 😖\", \"La date de naissance entrée est invalide.\");\n      }\n\n      // console.log(\"Test\");\n    } else if (item == \"postalCode\") {\n      if (postalCode !== null && postalCode !== \"\") {\n        // Mettre à jour AWS\n\n        const updatePostalCode =\n          `mutation updatePostalCode {\n        updateUserInfo(input: {id: \"` +\n          userID +\n          `\", postalCode: \"` +\n          postalCode +\n          `\"}) {\n          id\n        }\n      }`;\n\n        try {\n          await API.graphql(graphqlOperation(updatePostalCode)).then(\n            async () => {\n              // Mettre à jour AsyncStorage\n              await AsyncStorage.setItem(\"@postalCode\", postalCode).then(() =>\n                navigation.navigate(\"UserInfo\", { newPostalCode: postalCode })\n              );\n            }\n          );\n        } catch (e) {\n          Alert.alert(\n            \"Impossible de mettre à jour\",\n            \"Une erreur s'est produite\"\n          );\n        }\n      }\n    }\n  };\n\n  return (\n    <View>\n      <TouchableOpacity\n        onPress={() => navigation.goBack()}\n        style={styles.closeButton}\n      >\n        <AntDesign name={\"close\"} size={22} color={\"white\"} />\n      </TouchableOpacity>\n\n      {itemToModifie == \"birthDate\" ? (\n        <View\n          style={{\n            flexDirection: \"row\",\n            justifyContent: \"space-between\",\n            marginHorizontal: 50,\n          }}\n        >\n          <TextInput\n            onChangeText={(text) => setDayOfBirth(text)}\n            style={styles.editText}\n            placeholder={dayOfBirth !== \"0\" ? dayOfBirth : \"Jour\"}\n            autoCorrect={false}\n            autoComplete={false}\n            autoFocus={true}\n            keyboardType={\"numeric\"}\n            contextMenuHidden={true}\n          />\n          <TextInput\n            onChangeText={(text) => setMonthOfBirth(text)}\n            style={styles.editText}\n            placeholder={monthOfBirth !== \"0\" ? monthOfBirth : \"Mois\"}\n            autoCorrect={false}\n            autoComplete={false}\n            keyboardType={\"numeric\"}\n            contextMenuHidden={true}\n          />\n          <TextInput\n            onChangeText={(text) => setYearOfBirth(text)}\n            style={styles.editText}\n            placeholder={yearOfBirth !== \"0\" ? yearOfBirth : \"Année\"}\n            autoCorrect={false}\n            autoComplete={false}\n            keyboardType={\"numeric\"}\n            contextMenuHidden={true}\n          />\n        </View>\n      ) : itemToModifie == \"postalCode\" ? (\n        <TextInput\n          onChangeText={(text) => setPostalCode(text)}\n          style={styles.editText}\n          placeholder={postalCode}\n          autoCorrect={false}\n          autoComplete={false}\n          autoFocus={true}\n          keyboardType={\"numeric\"}\n          contextMenuHidden={true}\n        />\n      ) : null}\n\n      <TouchableOpacity\n        onPress={() => updateData(itemToModifie)}\n        style={styles.updateButton}\n      >\n        <Text style={styles.updateButtonText}>METTRE À JOUR</Text>\n      </TouchableOpacity>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/EditUserInfo/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst styles = StyleSheet.create({\n  closeButton: {\n    marginTop: 30,\n    height: 40,\n    width: 40,\n    backgroundColor: colors.primary,\n    borderRadius: 40,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    alignSelf: \"flex-end\",\n    marginRight: 20,\n  },\n  editText: {\n    height: 70,\n    backgroundColor: \"#E3E3E3\",\n    width: \"30%\",\n    alignSelf: \"center\",\n    padding: 10,\n    fontSize: 20,\n    borderRadius: 20,\n    paddingHorizontal: 20,\n    marginTop: 30,\n  },\n  updateButton: {\n    height: 70,\n    backgroundColor: \"#E3E3E3\",\n    width: \"52%\",\n    alignSelf: \"center\",\n    padding: 10,\n    fontSize: 30,\n    borderRadius: 20,\n    paddingHorizontal: 20,\n    marginTop: 20,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: colors.primary,\n  },\n  updateButtonText: {\n    fontSize: 17,\n    textAlign: \"center\",\n    fontWeight: \"bold\",\n    color: 'white'\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Election/index.js",
    "content": "import {\n  View,\n  Text,\n  Dimensions,\n  ScrollView,\n  TouchableOpacity,\n} from \"react-native\";\nimport React, { useState } from \"react\";\n\nimport styles from \"./styles\";\nimport { useNavigation } from \"@react-navigation/native\";\n\nexport default function Election() {\n  const navigation = useNavigation();\n\n  const [registerPageIndex, setRegisterPageIndex] = useState(1);\n\n  const currentDate = new Date();\n  const electionDate = new Date(\"04/10/2022\");\n  const diffTime = Math.abs(electionDate - currentDate);\n  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n  console.log(diffDays + \" jours avant le premier tour\");\n\n  return (\n    <View style={styles.container}>\n      <View style={styles.headerContainer}>\n        <Text\n          style={{\n            fontSize: Dimensions.get(\"window\").width * 0.085,\n            marginLeft: 25,\n            marginBottom: 7,\n            width: 250,\n            fontWeight: \"bold\",\n          }}\n        >\n          L'élection\n        </Text>\n      </View>\n      <ScrollView>\n        <View style={styles.electionCountdown}>\n          <Text style={styles.electionIcon}>🗳</Text>\n          <Text style={styles.diffTimeText}>J-{diffDays}</Text>\n          <Text style={styles.electionText}>Avant le premier tour</Text>\n        </View>\n\n        <Text style={styles.subTitleText}>\n          M'inscrire sur les listes éléctorales\n        </Text>\n\n        <TouchableOpacity\n          onPress={() => navigation.navigate(\"Eligible\")}\n          style={styles.isEligibleContainer}\n        >\n          <Text style={styles.isEligibleText}>\n            Suis-je éligible au vote ? 🤔\n          </Text>\n        </TouchableOpacity>\n\n        <View style={styles.timerBeforeRegisterContainer}>\n          <View style={styles.timerContainer}>\n            <Text>J-30</Text>\n          </View>\n          <View style={styles.timerContainer}>\n            <Text>J-30</Text>\n          </View>\n        </View>\n\n        <View style={styles.registerOnListContainer}>\n          <View style={styles.registerOnListMenu}>\n            <TouchableOpacity\n              onPress={() => setRegisterPageIndex(1)}\n              style={[\n                styles.registerOnListMenuButton,\n                {\n                  backgroundColor: registerPageIndex == 1 ? \"#4669C3\" : \"white\",\n                },\n              ]}\n            >\n              <Text\n                style={{ color: registerPageIndex == 1 ? \"white\" : \"#4669C3\" }}\n              >\n                🇫🇷 Je suis en France\n              </Text>\n            </TouchableOpacity>\n            <TouchableOpacity\n              onPress={() => setRegisterPageIndex(2)}\n              style={[\n                styles.registerOnListMenuButton,\n                {\n                  backgroundColor: registerPageIndex == 2 ? \"#4669C3\" : \"white\",\n                },\n              ]}\n            >\n              <Text\n                style={{ color: registerPageIndex == 2 ? \"white\" : \"#4669C3\" }}\n              >\n                🌍 Je suis à l'étranger\n              </Text>\n            </TouchableOpacity>\n          </View>\n\n          {registerPageIndex == 1 ? (\n            <View\n              style={{\n                paddingHorizontal: 10,\n                marginTop: 7,\n                marginBottom: 10,\n                flexDirection: \"row\",\n              }}\n            >\n              <TouchableOpacity style={styles.verifyRegisterOnListButtonContainer}>\n                <Text>Vérifier mon inscription</Text>\n              </TouchableOpacity>\n              <TouchableOpacity style={styles.registerOnListButtonContainer}>\n                <Text>M'inscrire</Text>\n              </TouchableOpacity>\n            </View>\n          ) : registerPageIndex == 2 ? (\n            <View\n              style={{ paddingHorizontal: 10, marginTop: 7, marginBottom: 10 }}\n            >\n              <Text style={{ color: \"white\" }}>\n                Instructions si on est à l'étranger\n              </Text>\n            </View>\n          ) : null}\n        </View>\n      </ScrollView>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Election/styles.js",
    "content": "import React from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst width = Dimensions.get(\"window\").width;\nconst height = Dimensions.get(\"window\").height;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    marginTop: height * 0.08,\n  },\n  headerContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n    alignItems: \"center\",\n    paddingRight: 20,\n  },\n  electionCountdown: {\n    alignSelf: \"center\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  },\n  electionIcon: {\n    fontSize: 40,\n    marginBottom: 10,\n  },\n  diffTimeText: {\n    fontSize: Dimensions.get(\"window\").width * 0.12,\n    fontWeight: \"bold\",\n  },\n  electionText: {\n    fontSize: Dimensions.get(\"window\").width * 0.05,\n    marginTop: 10,\n    textTransform: \"uppercase\",\n  },\n  subTitleText: {\n    marginTop: 20,\n    marginBottom: 10,\n    fontSize: 20,\n    marginHorizontal: 20,\n    fontWeight: \"500\",\n  },\n  isEligibleContainer: {\n    width: \"90%\",\n    backgroundColor: \"#63A5C1\",\n    alignSelf: \"center\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    borderRadius: 12,\n    paddingVertical: 10,\n    marginBottom: 7,\n  },\n  isEligibleText: {\n    color: \"white\",\n    fontWeight: \"bold\",\n    fontSize: 15,\n  },\n  timerBeforeRegisterContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-evenly\",\n    marginBottom: 10,\n    paddingHorizontal: 10,\n  },\n  timerContainer: {\n    width: \"46%\",\n    borderRadius: 12,\n    paddingVertical: 20,\n    borderWidth: 2,\n    borderColor: \"#63A5C1\",\n    marginTop: 2,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  },\n  registerOnListContainer: {\n    width: \"90%\",\n    alignSelf: \"center\",\n    backgroundColor: \"#63A5C1\",\n    borderRadius: 12,\n  },\n  registerOnListMenu: {\n    flexDirection: \"row\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  },\n  registerOnListMenuButton: {\n    width: \"46%\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    paddingVertical: 12,\n    marginHorizontal: 5,\n    marginTop: 10,\n    borderRadius: 10,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Eligible/index.js",
    "content": "import { View, Text } from \"react-native\";\nimport React from \"react\";\nimport styles from \"./styles\";\n\nexport default function Eligible() {\n  return (\n    <View>\n      <Text></Text>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Eligible/styles.js",
    "content": "import React from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/FavoritesPropositions/index.js",
    "content": "import {\n  View,\n  Text,\n  SafeAreaView,\n  FlatList,\n  TouchableOpacity,\n  Alert,\n} from \"react-native\";\nimport BackButton from \"../../components/backButton\";\nimport React, { useEffect, useState } from \"react\";\nimport PropositionListCard from \"../../components/PropositionListCard\";\n\nimport styles from \"./styles\";\nimport { AsyncStorage } from \"@aws-amplify/core\";\nimport { useIsFocused, useNavigation } from \"@react-navigation/native\";\n\nimport firstPropositions from \"../../../assets/data/propositions/firstPropositions\";\nimport propositionsList from \"../../../assets/data/propositions/propositionsList\";\n\nexport default function FavoritesPropositions() {\n  const navigation = useNavigation();\n\n  const [favoritesPropositions, setFavoritePropositions] = useState([]);\n\n  const [reRenderList, setReRenderList] = useState(0);\n\n  const isFocused = useIsFocused();\n\n  useEffect(async () => {\n    // await AsyncStorage.removeItem(\"@favoritesPropositions\");\n\n    try {\n      await AsyncStorage.getItem(\"@favoritesPropositions\").then((res) => {\n        const favoriteProps = JSON.parse(res);\n\n        if (favoriteProps !== null) {\n          setFavoritePropositions(favoriteProps);\n        } else {\n          return null;\n        }\n      });\n    } catch (e) {\n      Alert.alert(\n        \"Oups\",\n        \"Une erreur est survenue lors de la récupération des propositions\"\n      );\n    }\n  }, [isFocused, reRenderList]);\n\n  return (\n    <View style={styles.container}>\n      <SafeAreaView style={styles.header}>\n        <BackButton />\n        <View style={{ marginTop: 65 }}>\n          <Text style={styles.titleText}>Propositions favorites</Text>\n        </View>\n      </SafeAreaView>\n\n      {favoritesPropositions.length == 0 ? (\n        <View>\n          <Text style={styles.noPropositionText}>\n            Aucune proposition favorite\n          </Text>\n        </View>\n      ) : (\n        <View style={{ flex: 1 }}>\n          <FlatList\n            data={favoritesPropositions}\n            keyExtractor={(item) => item.id}\n            showsVerticalScrollIndicator={false}\n            // ListFooterComponent={() => (\n            //   <TouchableOpacity\n            //     onPress={async () => {\n            //       await AsyncStorage.setItem(\"@favoritesPropositions\", \"\").then(\n            //         () => setReRenderList(reRenderList + 1)\n            //       );\n            //     }}\n            //     style={styles.resetFavoritesContainer}\n            //   >\n            //     <Text style={styles.resetFavoritesText}>\n            //       Réinitialiser mes favoris\n            //     </Text>\n            //   </TouchableOpacity>\n            // )}\n            renderItem={({ item }) => {\n              var allPropositions = firstPropositions.concat(propositionsList);\n              const propositionDetails = allPropositions.find(\n                (proposition) => proposition.id == item\n              );\n\n              console.log(\"Proposition favorite : \", propositionDetails);\n\n              return (\n                <TouchableOpacity\n                  onPress={() =>\n                    navigation.navigate(\"PropositionDetails\", {\n                      id: propositionDetails.id,\n                      title: propositionDetails.title,\n                      theme: propositionDetails.idTheme,\n                      articleContent: propositionDetails.articleContent,\n                      idCandidat: propositionDetails.idCandidat,\n                      source: propositionDetails.source,\n                      showCandidateInfo: true,\n                    })\n                  }\n                  style={[\n                    styles.container,\n                    { height: item.showCandidateName !== false ? 100 : 80 },\n                  ]}\n                >\n                  <PropositionListCard proposition={propositionDetails} />\n                </TouchableOpacity>\n              );\n            }}\n          />\n        </View>\n      )}\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/FavoritesPropositions/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  header: {\n    backgroundColor: \"white\",\n  },\n  noPropositionText: {\n    textAlign: \"center\",\n    marginTop: 55,\n    fontSize: 25,\n    paddingHorizontal: 20,\n  },\n  titleText: {\n    marginLeft: 20,\n    marginBottom: 10,\n    fontSize: 30,\n    fontWeight: \"bold\",\n    color: \"black\",\n  },\n  resetFavoritesContainer: {\n    width: \"90%\",\n    backgroundColor: colors.primary,\n    paddingVertical: 15,\n    alignSelf: \"center\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    borderRadius: 10,\n    marginTop: 15,\n  },\n  resetFavoritesText: {\n    color: \"white\",\n    fontSize: 17,\n    fontWeight: \"500\",\n  },\n});\nexport default styles;\n"
  },
  {
    "path": "src/screens/Home/index.js",
    "content": "import React, { createRef, useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  Image,\n  ActivityIndicator,\n  Dimensions,\n} from \"react-native\";\nimport Swiper from \"react-native-deck-swiper\";\n\nimport NetInfo from \"@react-native-community/netinfo\";\n\nimport { Root, Popup } from \"react-native-popup-confirm-toast\";\n\nimport { API, graphqlOperation } from \"aws-amplify\";\n\nimport SwipeCard from \"../../components/SwipeCard\";\n\nimport { FontAwesome, Feather, AntDesign } from \"@expo/vector-icons\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport styles from \"./styles\";\nimport colors from \"../../../assets/colors/colors\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport { StatusBar } from \"expo-status-bar\";\nimport resetData from \"../../../assets/queries/resetData\";\n\nimport propositionsList from \"../../../assets/data/propositions/propositionsList\";\nimport firstPropositions from \"../../../assets/data/propositions/firstPropositions\";\n\nconst allPropositionWhenReset = firstPropositions.concat(propositionsList);\n\nconst swipeRef = createRef();\n\nexport default function Levels() {\n  const navigation = useNavigation();\n\n  const [index, setIndex] = useState(0);\n\n  const [propositions, setPropositions] = useState([]);\n  const [loaded, setLoaded] = useState(false);\n\n  const [firstPropositionsToShow, setFirstPropositionsToShow] = useState([]);\n\n  const [finalPropositionsToShow, setFinalPropositionsToShow] = useState([]);\n\n  const [numberOfPropsSwiped, setNumberOfPropsSwiped] = useState(0);\n\n  const [isEnded, setIsEnded] = useState(false);\n\n  // Fonction pour rendre la position des propositions aléatoire\n  function shuffle(array) {\n    let currentIndexForShuffle = array.length,\n      randomIndex;\n\n    // While there remain elements to shuffle...\n    while (currentIndexForShuffle != 0) {\n      // Pick a remaining element...\n      randomIndex = Math.floor(Math.random() * currentIndexForShuffle);\n      currentIndexForShuffle--;\n\n      // And swap it with the current element.\n      [array[currentIndexForShuffle], array[randomIndex]] = [\n        array[randomIndex],\n        array[currentIndexForShuffle],\n      ];\n    }\n\n    return array;\n  }\n\n  useEffect(() => {\n    setFirstPropositionsToShow(firstPropositions);\n\n    console.log(firstPropositions);\n    setPropositions(propositionsList);\n  }, []);\n\n  useEffect(async () => {\n    try {\n      if (propositions.length > 0) {\n        // Filtrer les propositions qui ont déjà été passées\n\n        try {\n          var passedPropsIDRequest = await AsyncStorage.getItem(\n            \"@passed_propositions\"\n          ); // pour que ce soit égal à \"null\" pour l'instant\n          passedPropsIDRequest = JSON.parse(passedPropsIDRequest);\n\n          if (passedPropsIDRequest == \"null\" || passedPropsIDRequest == null) {\n            // Si il n'y aucune propositions passées\n\n            // console.log(firstPropositionsToShow);\n\n            var newPropsList = shuffle(propositions);\n            newPropsList.push.apply(newPropsList, firstPropositionsToShow);\n            newPropsList.reverse();\n\n            setFinalPropositionsToShow(newPropsList);\n            setLoaded(true);\n          } else {\n            console.log(\n              \"Nb de propositions passées: \",\n              passedPropsIDRequest.length\n            );\n\n            // // Si beaucoup de propositions passées -> Afficher l'écran de fin\n            if (passedPropsIDRequest.length >= 320) {\n              setIsEnded(true);\n              setLoaded(true);\n            } else {\n              // On enlève les propositions qui sont déjà passées\n              const newPropositionsToShow = propositions.filter(\n                ({ id }) => !passedPropsIDRequest.includes(id)\n              );\n\n              var newPropsList = shuffle(newPropositionsToShow);\n\n              // console.log(newPropsList);\n\n              setFinalPropositionsToShow(newPropsList);\n              setLoaded(true);\n            }\n          }\n        } catch (e) {\n          console.log(\"Erreur: \", e);\n        }\n      }\n    } catch (e) {\n      console.log(\n        \"Oups 😖\",\n        \"Il y a eu un problème lors du chargement des propositions... Réessaye dans quelques instants.\"\n      );\n    }\n  }, [propositions]);\n\n  useEffect(async () => {\n    try {\n      await AsyncStorage.getItem(\"@passed_propositions\").then((response) => {\n        const arrayPassedPropositionNumber = JSON.parse(response);\n        if (arrayPassedPropositionNumber !== null) {\n          setNumberOfPropsSwiped(arrayPassedPropositionNumber.length);\n        } else {\n          setNumberOfPropsSwiped(0);\n        }\n      });\n    } catch (e) {\n      console.log(e);\n    }\n  }, [index]);\n\n  const storePassedPropositions = async (idNewPassedProposition) => {\n    try {\n      var currentPassedPropositions = await AsyncStorage.getItem(\n        \"@passed_propositions\"\n      );\n      if (currentPassedPropositions !== null) {\n        // si il y a déjà des propositon passées -> ajouter la nouvelle dans '@passed_propositions'\n        currentPassedPropositions = JSON.parse(currentPassedPropositions);\n\n        // Nouveau tableau avec les propositions déjà passées\n        var newCurrentPassedPropositions = [\n          ...currentPassedPropositions,\n          idNewPassedProposition,\n        ];\n        newCurrentPassedPropositions = JSON.stringify(\n          newCurrentPassedPropositions\n        );\n\n        // On met à jour la variable qui contient toutes les propositions déjà passées\n        try {\n          await AsyncStorage.setItem(\n            \"@passed_propositions\",\n            newCurrentPassedPropositions\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      } else {\n        // Si il n'y a aucune proposition passée -> créer un objet avec la proposition et l'ajouter à '@passed_propositions'\n        var firstPropositionPassed = [];\n        firstPropositionPassed.push(idNewPassedProposition);\n        firstPropositionPassed = JSON.stringify(firstPropositionPassed);\n        try {\n          await AsyncStorage.setItem(\n            \"@passed_propositions\",\n            firstPropositionPassed\n          ).then(() =>\n            console.log(\"Premier élement ajouté : \", firstPropositionPassed)\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      }\n    } catch (e) {\n      console.log(e);\n    }\n  };\n\n  const onSwiped = (index) => {\n    storePassedPropositions(propositions[index].id);\n\n    setIndex((index + 1) % propositions.length);\n  };\n\n  const toggleLike = async (index) => {\n    const candidateId = finalPropositionsToShow[index].idCandidat;\n    const propositionIDForList = finalPropositionsToShow[index].id;\n\n    // 1. On récupère le score du candidat en question\n    try {\n      const candidateVariable = \"@score_candidat_\" + candidateId;\n\n      const dislikeCandidateVariable = \"@scoreDislike_candidat_\" + candidateId;\n\n      const postalCode = await AsyncStorage.getItem(\"@postalCode\");\n      const idUser = await AsyncStorage.getItem(\"@idUser\");\n\n      var currentCandidateScore = await AsyncStorage.getItem(candidateVariable);\n      var currentDislikeCandidateScore = await AsyncStorage.getItem(\n        dislikeCandidateVariable\n      );\n\n      // Set sur 0 le nombre de like si elle n'est pas définit\n      if (\n        currentDislikeCandidateScore == null ||\n        isNaN(currentDislikeCandidateScore)\n      ) {\n        try {\n          await AsyncStorage.setItem(dislikeCandidateVariable, \"0\").then(() =>\n            console.log(\n              \"Nombre de dislike mis à jour pour \",\n              dislikeCandidateVariable\n            )\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      }\n\n      if (currentCandidateScore !== null) {\n        // Si !== null (>0) -> convertir en Int, ajouter 1, reconvertir en String\n        const intScore = parseInt(currentCandidateScore);\n        const newScore = intScore + 1;\n\n        console.log(\"On augmente de 1 point le score du candidat :\", newScore);\n\n        await AsyncStorage.setItem(candidateVariable, newScore.toString());\n      } else {\n        // Si le candidat n'a aucun point (=null) -> setItem sur 1)\n        try {\n          await AsyncStorage.setItem(candidateVariable, \"1\").then(() =>\n            console.log(\"On met sur 1 le nombre de like \", candidateVariable)\n          );\n        } catch (e) {\n          console.log(\"Erreur pour mettre à jour le 1er score : \", e);\n        }\n      }\n    } catch (e) {\n      console.log(\"Impossible de récupérer le score du candidat\", e);\n    }\n\n    // On ajoute l'id de cette proposition au tableau qui recense tous les 'likes' pour ce candidat\n    try {\n      const likeListForCandidateVariable = \"@likeListCandidate_\" + candidateId;\n\n      var currentLikeListForCandidate = await AsyncStorage.getItem(\n        likeListForCandidateVariable\n      );\n\n      console.log(currentLikeListForCandidate);\n\n      if (currentLikeListForCandidate !== null) {\n        // On ajoute cette proposition dans la liste des propositions likées\n        currentLikeListForCandidate = JSON.parse(currentLikeListForCandidate);\n\n        var newLikeListForCandidate = [\n          ...currentLikeListForCandidate,\n          propositionIDForList,\n        ];\n        newLikeListForCandidate = JSON.stringify(newLikeListForCandidate);\n\n        // console.log(\"Liste des likes mise à jour : \", newLikeListForCandidate);\n\n        try {\n          await AsyncStorage.setItem(\n            likeListForCandidateVariable,\n            newLikeListForCandidate\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      } else {\n        // Si il n'y a aucun like passée\n        var firstLikeList = [];\n        firstLikeList.push(propositionIDForList);\n        firstLikeList = JSON.stringify(firstLikeList);\n        try {\n          await AsyncStorage.setItem(\n            likeListForCandidateVariable,\n            firstLikeList\n          ).then(() =>\n            console.log(\"Liste des likes mise à jour : \", firstLikeList)\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      }\n    } catch (e) {\n      console.log(\n        \"Erreur lors de la récupération de la liste des propositions likées : \",\n        e\n      );\n    }\n  };\n\n  const toggleSuperLike = async (index) => {\n    const candidateId = finalPropositionsToShow[index].idCandidat;\n    const propositionIDForList = finalPropositionsToShow[index].id;\n\n    // 1. On récupère le score du candidat en question\n    try {\n      const candidateVariable = \"@score_candidat_\" + candidateId;\n\n      const dislikeCandidateVariable = \"@scoreDislike_candidat_\" + candidateId;\n\n      var currentCandidateScore = await AsyncStorage.getItem(candidateVariable);\n      var currentDislikeCandidateScore = await AsyncStorage.getItem(\n        dislikeCandidateVariable\n      );\n\n      // Set sur 0 le nombre de like si elle n'est pas définit\n      if (\n        currentDislikeCandidateScore == null ||\n        isNaN(currentDislikeCandidateScore)\n      ) {\n        try {\n          await AsyncStorage.setItem(dislikeCandidateVariable, \"0\").then(() =>\n            console.log(\n              \"Nombre de dislike mis à jour pour \",\n              dislikeCandidateVariable\n            )\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      }\n\n      if (currentCandidateScore !== null) {\n        // Si !== null (>0) -> convertir en Int, ajouter 2, reconvertir en String\n        const intScore = parseInt(currentCandidateScore);\n        const newScore = intScore + 2;\n\n        console.log(\"On augmente de 2 point le score du candidat :\", newScore);\n\n        await AsyncStorage.setItem(candidateVariable, newScore.toString());\n      } else {\n        // Si le candidat n'a aucun point (=null) -> setItem sur 2)\n        try {\n          await AsyncStorage.setItem(candidateVariable, \"2\").then(() =>\n            console.log(\"On met sur 2 le nombre de like \", candidateVariable)\n          );\n        } catch (e) {\n          console.log(\"Erreur pour mettre à jour le 1er score : \", e);\n        }\n      }\n    } catch (e) {\n      console.log(\"Impossible de récupérer le score du candidat\", e);\n    }\n\n    // On ajoute l'id de cette proposition au tableau qui recense tous les 'super-likes' pour ce candidat\n    try {\n      const likeListForCandidateVariable =\n        \"@superLikeListCandidate_\" + candidateId;\n\n      var currentLikeListForCandidate = await AsyncStorage.getItem(\n        likeListForCandidateVariable\n      );\n\n      if (currentLikeListForCandidate !== null) {\n        // On ajoute cette proposition dans la liste des propositions likées\n        currentLikeListForCandidate = JSON.parse(currentLikeListForCandidate);\n\n        var newLikeListForCandidate = [\n          ...currentLikeListForCandidate,\n          propositionIDForList,\n        ];\n        newLikeListForCandidate = JSON.stringify(newLikeListForCandidate);\n\n        // console.log(\"Liste des super-likes mise à jour : \", newLikeListForCandidate);\n\n        try {\n          await AsyncStorage.setItem(\n            likeListForCandidateVariable,\n            newLikeListForCandidate\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      } else {\n        // Si il n'y a aucun like passée\n        var firstLikeList = [];\n        firstLikeList.push(propositionIDForList);\n        firstLikeList = JSON.stringify(firstLikeList);\n        try {\n          await AsyncStorage.setItem(\n            likeListForCandidateVariable,\n            firstLikeList\n          ).then(() =>\n            console.log(\"Liste des super-likes mise à jour : \", firstLikeList)\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      }\n    } catch (e) {\n      console.log(\n        \"Erreur lors de la récupération de la liste des propositions likées : \",\n        e\n      );\n    }\n  };\n\n  const toggleDislike = async (index) => {\n    const candidateId = finalPropositionsToShow[index].idCandidat;\n    const propositionIDForList = finalPropositionsToShow[index].id;\n\n    // 1. On récupère le nombre de dislikes du candidat en question\n    try {\n      const dislikeCandidateVariable = \"@scoreDislike_candidat_\" + candidateId;\n\n      const likeCandidateVariable = \"@score_candidat_\" + candidateId;\n\n      var currentCandidateDislike = await AsyncStorage.getItem(\n        dislikeCandidateVariable\n      );\n      var currentCandidateLike = await AsyncStorage.getItem(\n        likeCandidateVariable\n      );\n\n      console.log(\n        \"Nb de likes pour le candidat (action dislike) : \",\n        currentCandidateLike\n      );\n\n      // Set sur 0 le nombre de like si elle n'est pas définit\n      if (currentCandidateLike == null || isNaN(currentCandidateLike)) {\n        try {\n          await AsyncStorage.setItem(likeCandidateVariable, \"0\").then(() =>\n            console.log(\n              \"Nombre de likes mis à jour pour \",\n              likeCandidateVariable\n            )\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      }\n\n      if (currentCandidateDislike !== null) {\n        // Si !== null (>0) -> convertir en Int, ajouter 1, reconvertir en String\n        const intScore = parseInt(currentCandidateDislike);\n        const newScore = intScore + 1;\n\n        console.log(\n          \"On augmente de 1 point le nb de dislike du candidat :\",\n          newScore\n        );\n\n        await AsyncStorage.setItem(\n          dislikeCandidateVariable,\n          newScore.toString()\n        );\n      } else {\n        // Si le candidat n'a aucun point (=null) -> setItem sur 1)\n        try {\n          await AsyncStorage.setItem(dislikeCandidateVariable, \"1\").then(() =>\n            console.log(\n              \"On set sur 1 le nombre de dislike \",\n              dislikeCandidateVariable\n            )\n          );\n        } catch (e) {\n          console.log(\"Erreur pour mettre à jour le 1er score : \", e);\n        }\n      }\n    } catch (e) {\n      console.log(\"Impossible de récupérer le score du candidat\", e);\n    }\n\n    // On ajoute l'id de cette proposition au tableau qui recense tous les 'likes' pour ce candidat\n    try {\n      const dislikeListForCandidateVariable =\n        \"@dislikeListCandidate_\" + candidateId;\n\n      var currentDislikeListForCandidate = await AsyncStorage.getItem(\n        dislikeListForCandidateVariable\n      );\n\n      if (currentDislikeListForCandidate !== null) {\n        // On ajoute cette proposition dans la liste des propositions likées\n        currentDislikeListForCandidate = JSON.parse(\n          currentDislikeListForCandidate\n        );\n\n        var newDislikeListForCandidate = [\n          ...currentDislikeListForCandidate,\n          propositionIDForList,\n        ];\n        newDislikeListForCandidate = JSON.stringify(newDislikeListForCandidate);\n\n        // console.log(\n        //   \"Liste des dislikes mise à jour : \",\n        //   newDislikeListForCandidate\n        // );\n\n        try {\n          await AsyncStorage.setItem(\n            dislikeListForCandidateVariable,\n            newDislikeListForCandidate\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      } else {\n        // Si il n'y a aucun like passée\n        var firstDislikeList = [];\n        firstDislikeList.push(propositionIDForList);\n        firstDislikeList = JSON.stringify(firstDislikeList);\n        try {\n          await AsyncStorage.setItem(\n            dislikeListForCandidateVariable,\n            firstDislikeList\n          ).then(() =>\n            console.log(\"Liste des dislikes mise à jour : \", firstDislikeList)\n          );\n        } catch (e) {\n          console.log(e);\n        }\n      }\n    } catch (e) {\n      console.log(\n        \"Erreur lors de la récupération de la liste des propositions dislikées : \",\n        e\n      );\n    }\n  };\n\n  if (numberOfPropsSwiped == 25) {\n    Popup.show({\n      type: \"success\",\n      title: \"Déjà 25 propositions passées 🗳\",\n      textBody: \"Plus que 25 votes avant d'avoir une tendance qui se dessine !\",\n      iconEnabled: false,\n      okButtonStyle: { backgroundColor: colors.primary },\n      buttonText: \"OK\",\n      callback: () => Popup.hide(),\n    });\n  }\n\n  if (numberOfPropsSwiped == 50) {\n    Popup.show({\n      type: \"success\",\n      title: \"50 propositions passées 🥳\",\n      textBody:\n        \"Ça y est ! Une tendance se dessine. Découvre tes premiers résultats dans le deuxième onglet en bas de ton écran.\",\n      iconEnabled: false,\n      okButtonStyle: { backgroundColor: colors.primary },\n      buttonText: \"OK\",\n      callback: () => Popup.hide(),\n    });\n  }\n\n  if (numberOfPropsSwiped == 100) {\n    Popup.show({\n      type: \"success\",\n      title: \"100 propositions swipées ! 🥇\",\n      textBody:\n        \"Véritable as du vote, tes résultats continuent de s'affiner, observe l'évolution de ton classement dans le deuxième onglet.\",\n      iconEnabled: false,\n      okButtonStyle: { backgroundColor: colors.primary },\n      buttonText: \"OK\",\n      callback: () => Popup.hide(),\n    });\n  }\n\n  if (loaded) {\n    return (\n      <Root>\n        <SafeAreaView style={{ flex: 1 }}>\n          <StatusBar style={\"auto\"} />\n          <View\n            style={{\n              marginTop: 20,\n            }}\n          >\n            <Image\n              source={require(\"../../../assets/images/logo-header.png\")}\n              style={styles.logoImage}\n            />\n            {/* Bouton réglage */}\n            <TouchableOpacity\n              onPress={() => navigation.navigate(\"Settings\")}\n              style={{\n                position: \"absolute\",\n                top: -10,\n                right: 25,\n                height: Dimensions.get(\"window\").width * 0.13,\n                width: Dimensions.get(\"window\").width * 0.13,\n                backgroundColor: colors.primary,\n                borderRadius: 55,\n                justifyContent: \"center\",\n                alignItems: \"center\",\n              }}\n            >\n              <Feather\n                name={\"settings\"}\n                size={Dimensions.get(\"window\").width * 0.06}\n                color={\"white\"}\n              />\n            </TouchableOpacity>\n\n            {/* Cercle rouge affiché derrière */}\n            <View style={styles.circleContainer} />\n\n            {/* <View style={{ marginTop: Dimensions.get(\"window\").height * 0.015 }}> */}\n            <View\n              style={{\n                width: \"100%\",\n                height: \"100%\",\n                marginTop: Dimensions.get(\"window\").height * 0.06,\n              }}\n            >\n              {isEnded == true ? (\n                <View\n                  style={{\n                    justifyContent: \"center\",\n                    alignItems: \"center\",\n                    marginTop: Dimensions.get(\"window\").height * 0.15,\n                    height: Dimensions.get(\"window\").height * 0.4,\n                    backgroundColor: \"white\",\n                    marginHorizontal: 25,\n                    borderRadius: 40,\n                    shadowColor: \"#000\",\n                    shadowOffset: {\n                      width: 0,\n                      height: 2,\n                    },\n                    shadowOpacity: 0.25,\n                    shadowRadius: 3.84,\n\n                    elevation: 5,\n                    justifyContent: \"space-between\",\n                    zIndex: 100,\n                  }}\n                >\n                  <View style={{ marginTop: 20, alignItems: \"center\" }}>\n                    <Text style={{ fontSize: 40 }}>🎉</Text>\n                    <Text\n                      style={{\n                        paddingHorizontal: 30,\n                        fontSize: 25,\n                        textAlign: \"center\",\n                        marginTop: 20,\n                        fontWeight: \"bold\",\n                      }}\n                    >\n                      Tu as passé toutes les propositions !\n                    </Text>\n                    <Text\n                      style={{\n                        paddingHorizontal: 30,\n                        fontSize: 18,\n                        textAlign: \"center\",\n                        marginTop: 10,\n                      }}\n                    >\n                      Découvre tes scores dans l'onglet \"Résultats\"\n                    </Text>\n                  </View>\n                  <View style={{ width: \"85%\" }}>\n                    <TouchableOpacity\n                      onPress={async () => {\n                        await resetData().then(async () => {\n                          setIndex(0);\n                          setLoaded(false);\n\n                          setPropositions(\n                            allPropositionWhenReset\n                          );\n                          setIsEnded(false);\n                        });\n                      }}\n                      style={{\n                        marginBottom: 0,\n                        height: 50,\n                        backgroundColor: colors.primary,\n                        borderRadius: 10,\n                        justifyContent: \"center\",\n                        alignItems: \"center\",\n                      }}\n                    >\n                      <Text\n                        style={{\n                          textTransform: \"uppercase\",\n                          color: \"white\",\n                          fontSize: 18,\n                          fontWeight: \"bold\",\n                        }}\n                      >\n                        Recommencer\n                      </Text>\n                    </TouchableOpacity>\n                    <Text\n                      style={{\n                        textAlign: \"center\",\n                        paddingVertical: 10,\n                        fontSize: 12,\n                      }}\n                    >\n                      Cela réinitialisera également tes résultats\n                    </Text>\n                  </View>\n                </View>\n              ) : null}\n              {isEnded !== true ? (\n                <Swiper\n                  ref={swipeRef}\n                  cards={finalPropositionsToShow}\n                  cardIndex={index}\n                  onSwipedAll={() => {\n                    // Fin du swipe\n                    setIsEnded(true);\n                    // fetchPropositions();\n                    // À RAJOUTER - POUR RESET LES CARTES AU DÉBUT\n                  }}\n                  renderCard={(card) => {\n                    return <SwipeCard cardTo proposition={card} />;\n                  }}\n                  onSwiped={onSwiped}\n                  onSwipedLeft={(index) => toggleDislike(index)}\n                  onSwipedRight={(index) => toggleLike(index)}\n                  onSwipedTop={(index) => toggleSuperLike(index)}\n                  // disableTopSwipe\n                  stackSize={4}\n                  // infinite\n                  animateOverlayLabelsOpacity\n                  animateCardOpacity\n                  backgroundColor={\"transparent\"}\n                  overlayLabels={{\n                    left: {\n                      title: \"CONTRE\",\n                      style: {\n                        label: {\n                          backgroundColor: colors.primary,\n                          color: \"white\",\n                          fontSize: 24,\n                        },\n                        wrapper: {\n                          flexDirection: \"column\",\n                          alignItems: \"flex-end\",\n                          justifyContent: \"flex-start\",\n                          marginTop: 20,\n                          marginLeft: -20,\n                        },\n                      },\n                    },\n                    right: {\n                      title: \"POUR\",\n                      style: {\n                        label: {\n                          backgroundColor: \"#5099AF\",\n                          color: \"white\",\n                          fontSize: 24,\n                        },\n                        wrapper: {\n                          flexDirection: \"column\",\n                          alignItems: \"flex-start\",\n                          justifyContent: \"flex-start\",\n                          marginTop: 20,\n                          marginLeft: 20,\n                        },\n                      },\n                    },\n                    bottom: {\n                      title: \"NE SE PRONONCE PAS\",\n                      style: {\n                        label: {\n                          backgroundColor: \"white\",\n                          color: \"black\",\n                          fontSize: 24,\n                        },\n                        wrapper: {\n                          flexDirection: \"column\",\n                          alignItems: \"center\",\n                          justifyContent: \"flex-start\",\n                          marginTop: 20,\n                        },\n                      },\n                    },\n                  }}\n                />\n              ) : null}\n            </View>\n            {/* </View> */}\n\n            {isEnded == false ? (\n              <View style={styles.buttonContainer}>\n                <TouchableOpacity\n                  style={styles.hesitateButton}\n                  onPress={() => {\n                    swipeRef.current.swipeBottom();\n                  }}\n                >\n                  <Text\n                    style={{\n                      fontSize: Dimensions.get(\"window\").width * 0.07,\n                    }}\n                  >\n                    🤔\n                  </Text>\n                </TouchableOpacity>\n\n                <TouchableOpacity\n                  style={[styles.likeButton, { marginLeft: 0 }]}\n                  onPress={() => {\n                    swipeRef.current.swipeLeft();\n                  }}\n                >\n                  <FontAwesome\n                    name={\"times\"}\n                    size={Dimensions.get(\"window\").width * 0.1}\n                    color={colors.dislikeButton}\n                  />\n                </TouchableOpacity>\n\n                <TouchableOpacity\n                  style={styles.likeButton}\n                  onPress={() => {\n                    swipeRef.current.swipeRight();\n                  }}\n                >\n                  <FontAwesome\n                    name={\"heart\"}\n                    size={Dimensions.get(\"window\").width * 0.08}\n                    color={colors.likeButton}\n                  />\n                </TouchableOpacity>\n\n                <TouchableOpacity\n                  style={[styles.superLikeButton]}\n                  onPress={() => {\n                    swipeRef.current.swipeTop();\n                  }}\n                >\n                  <Text\n                    style={{\n                      fontSize: Dimensions.get(\"window\").width * 0.07,\n                    }}\n                  >\n                    🤩\n                  </Text>\n                </TouchableOpacity>\n                {/* <Text>{numberOfPropsSwiped} swipes</Text> */}\n              </View>\n            ) : null}\n          </View>\n        </SafeAreaView>\n      </Root>\n    );\n  } else {\n    return (\n      <View style={{ flex: 1, justifyContent: \"center\", alignItems: \"center\" }}>\n        <ActivityIndicator size={\"large\"} />\n      </View>\n    );\n  }\n}\n"
  },
  {
    "path": "src/screens/Home/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get(\"window\").width;\nconst height = Dimensions.get(\"window\").height;\n\nconst styles = {\n  logoImage: {\n    position: \"absolute\",\n    top: -10,\n    left: 0,\n    width: width*0.40,\n    height: height*0.07,\n    marginLeft: 26,\n    resizeMode: 'contain'\n  },\n  buttonContainer: {\n    position: \"absolute\",\n    top: 0.67 * height,\n    zIndex: 1,\n    flexDirection: \"row\",\n    alignSelf: 'center'\n  },\n  dislikeButton: {\n    height: width*0.17,\n    width: width*0.17,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"white\",\n    borderRadius: 50,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n  likeButton: {\n    height: width*0.17,\n    width: width*0.17,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"white\",\n    borderRadius: 50,\n    marginLeft: 15,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n  hesitateButton: {\n    height: width*0.15,\n    width: width*0.15,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"white\",\n    borderRadius: 50,\n    marginRight: 15,\n    marginTop: 4,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n  superLikeButton: {\n    height: width*0.15,\n    width: width*0.15,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"white\",\n    borderRadius: 50,\n    marginLeft: 15,\n    marginTop: 4,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n  circleContainer: {\n    width: Dimensions.get(\"window\").width * 2.5,\n    height: Dimensions.get(\"window\").width * 2.5,\n    borderRadius: (Dimensions.get(\"window\").width * 2.5) / 2,\n    position: \"absolute\",\n    backgroundColor: colors.primary,\n    top: Dimensions.get(\"window\").width * 0.85,\n    zIndex: -10,\n    alignSelf: \"center\",\n  }\n};\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Levels/index.js",
    "content": "import React from 'react'\nimport { View, Text } from 'react-native'\n\nexport default function Levels() {\n  return (\n    <View>\n      <Text>Niveaux</Text>\n    </View>\n  )\n}\n"
  },
  {
    "path": "src/screens/Levels/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get(\"window\").width;\nconst height = Dimensions.get(\"window\").height;\n\nconst styles = {\n  logoImage: {\n    position: \"absolute\",\n    top: -10,\n    left: 0,\n    width: width*0.40,\n    height: height*0.07,\n    marginLeft: 26,\n    resizeMode: 'contain'\n  },\n  buttonContainer: {\n    position: \"absolute\",\n    top: 0.67 * height,\n    zIndex: 1,\n    flexDirection: \"row\",\n    alignSelf: 'center'\n  },\n  dislikeButton: {\n    height: width*0.17,\n    width: width*0.17,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"white\",\n    borderRadius: 50,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n  likeButton: {\n    height: width*0.17,\n    width: width*0.17,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"white\",\n    borderRadius: 50,\n    marginLeft: 17,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.25,\n    shadowRadius: 3.84,\n\n    elevation: 5,\n  },\n  circleContainer: {\n    width: Dimensions.get(\"window\").width * 2.5,\n    height: Dimensions.get(\"window\").width * 2.5,\n    borderRadius: (Dimensions.get(\"window\").width * 2.5) / 2,\n    position: \"absolute\",\n    backgroundColor: colors.primary,\n    top: Dimensions.get(\"window\").width * 0.85,\n    zIndex: -10,\n    alignSelf: \"center\",\n  }\n};\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/ListPropositions/index.js",
    "content": "import React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  FlatList,\n  TouchableOpacity,\n  ActivityIndicator,\n} from \"react-native\";\nimport styles from \"./styles\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport PropositionListCard from \"../../components/PropositionListCard\";\nimport findThemeTitle from \"../../../assets/queries/findThemeTitle\";\nimport ThemeHeader from \"../../components/ThemeHeader\";\n\nimport firstPropositions from \"../../../assets/data/propositions/firstPropositions\";\nimport propositionsList from \"../../../assets/data/propositions/propositionsList\";\n\nvar firstPropositionsArray = JSON.parse(JSON.stringify(firstPropositions));\nvar propositionsListArray = JSON.parse(JSON.stringify(propositionsList));\n\nexport default function ListPropositions({ route }) {\n  const navigation = useNavigation();\n\n  const propositionInfo = route.params;\n\n  const [propositions, setPropositions] = useState([]);\n  const [themeDetails, setThemeDetails] = useState([]);\n  const [loaded, setLoaded] = useState(false);\n\n  useEffect(async () => {\n    const themeInfo = findThemeTitle(propositionInfo.themeID);\n    setThemeDetails(themeInfo);\n\n    var propositionsForThemeForFP = firstPropositionsArray.filter(\n      (proposition) => proposition.idTheme == propositionInfo.themeID\n    );\n\n    var propositionsForThemeForAP = propositionsListArray.filter(\n      (proposition) => proposition.idTheme == propositionInfo.themeID\n    );\n\n    const propsForTheme = propositionsForThemeForFP.concat(\n      propositionsForThemeForAP\n    );\n\n    propsForTheme.sort((a, b) => a.title.localeCompare(b.title));\n\n    setPropositions(propsForTheme);\n  }, []);\n\n  useEffect(() => {\n    setLoaded(true);\n  }, [propositions]);\n\n  if (loaded) {\n    return (\n      <View style={styles.container}>\n        <ThemeHeader\n          title={themeDetails[0].title}\n          iconType={themeDetails[0].iconType}\n          lightColor={themeDetails[0].lightColor}\n          darkColor={themeDetails[0].darkColor}\n          iconTitle={themeDetails[0].iconTitle}\n        />\n        <View style={{ flex: 1 }}>\n          {loaded ? (\n            <FlatList\n              data={propositions}\n              keyExtractor={(item) => item.id}\n              showsVerticalScrollIndicator={false}\n              renderItem={({ item }) => (\n                <TouchableOpacity\n                  onPress={() =>\n                    navigation.navigate(\"PropositionDetails\", {\n                      id: item.id,\n                      title: item.title,\n                      theme: item.idTheme,\n                      articleContent: item.articleContent,\n                      idCandidat: item.idCandidat,\n                      source: item.source,\n                      showCandidateInfo: true,\n                    })\n                  }\n                  style={[\n                    styles.container,\n                    { height: item.showCandidateName !== false ? 100 : 80 },\n                  ]}\n                >\n                  <PropositionListCard proposition={item} />\n                </TouchableOpacity>\n              )}\n            />\n          ) : (\n            <View style={{ alignItems: \"center\", justifyContent: \"center\" }}>\n              <ActivityIndicator\n                size={\"large\"}\n                style={{ alignSelf: \"center\" }}\n              />\n            </View>\n          )}\n        </View>\n      </View>\n    );\n  } else {\n    return (\n      <View style={{ flex: 1, justifyContent: \"center\", alignItems: \"center\" }}>\n        <ActivityIndicator size={\"large\"} />\n      </View>\n    );\n  }\n}\n"
  },
  {
    "path": "src/screens/ListPropositions/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/More/index.js",
    "content": "import React, { useState, useEffect } from \"react\";\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  FlatList,\n  ScrollView,\n  Image,\n  SafeAreaView,\n  ActivityIndicator,\n} from \"react-native\";\nimport styles from \"./styles\";\n\nimport LearnCard from \"../../components/learnCard\";\nimport learnCategories from \"../../../assets/data/more/learnCategories\";\nimport PartnerCard from \"../../components/PartnerCard\";\nimport partners from \"../../../assets/data/more/partners\";\nimport engagementList from \"../../../assets/data/more/engagementList\";\nimport ResponsiveTitle from \"../../components/ResponsiveTitle\";\n\nimport { API, graphqlOperation } from \"aws-amplify\";\nimport getPropositionDetails from \"../../../assets/queries/getPropositionDetails\";\n\nexport default function More() {\n  const [totalSwipes, setTotalSwipes] = useState(0);\n  const [mostLikedPropositionDetails, setMostLikedPropositionDetails] =\n    useState([]);\n\n  function getMostReccurentResult(arr) {\n    return arr\n      .sort(\n        (a, b) =>\n          arr.filter((v) => v === a).length - arr.filter((v) => v === b).length\n      )\n      .pop();\n  }\n\n  useEffect(() => {\n    const intervalId = setInterval(async () => {\n      const getTotalSwipeNumber = `query totalNumberSwipes {\n        listSwipeStats(limit:1000000) {\n          items {\n            id\n          }\n        }\n      }`;\n\n      try {\n        await API.graphql(graphqlOperation(getTotalSwipeNumber)).then(\n          (response) =>\n            setTotalSwipes(response.data.listSwipeStats.items.length)\n        );\n      } catch (e) {\n        console.log(e);\n      }\n\n      const getMostReccuringLikes = `query mostReccuringLikes {\n        listSwipeStats(filter: {rating: {eq: \"like\"}}, limit: 10000000) {\n          items {\n            idProposition\n          }\n        }\n      }`;\n\n      try {\n        await API.graphql(graphqlOperation(getMostReccuringLikes)).then(\n          (response) => {\n            const reccuringPropositionID = getMostReccurentResult(\n              response.data.listSwipeStats.items\n            ).idProposition;\n            const propositionDetails = getPropositionDetails(\n              parseInt(reccuringPropositionID)\n            );\n\n            setMostLikedPropositionDetails(propositionDetails[0]);\n          }\n        );\n      } catch (e) {\n        console.log(e);\n      }\n    }, 3000);\n\n    return () => clearInterval(intervalId); //This is important\n  }, []);\n\n  return (\n    <SafeAreaView style={styles.container}>\n      <ResponsiveTitle title={\"Statistiques\"} />\n\n      <ScrollView>\n        <View style={[styles.sectionContainer, { backgroundColor: \"#DCC468\" }]}>\n          <Text style={{ fontSize: 35, marginBottom: 10 }}>🗳</Text>\n          <Text style={styles.sectionTitle}>\n            Nombre total de votes réalisés sur ELYZE\n          </Text>\n          {totalSwipes == 0 ? (\n            <ActivityIndicator size={\"small\"} color={\"white\"} />\n          ) : (\n            <View style={{ justifyContent: \"center\", alignItems: \"center\" }}>\n              <Text style={styles.dataText}>\n                {totalSwipes == 0 ? \"...\" : totalSwipes} swipes\n              </Text>\n              <Text style={{ marginTop: 5, color: \"white\" }}>\n                (depuis le 11/12/2021)\n              </Text>\n            </View>\n          )}\n        </View>\n\n        <View style={[styles.sectionContainer, { backgroundColor: \"#D85F71\" }]}>\n        <Text style={{ fontSize: 35, marginBottom: 10 }}>👀</Text>\n          <Text style={styles.sectionTitle}>Proposition la plus populaire</Text>\n          {mostLikedPropositionDetails.title == \"\" ? (\n            <ActivityIndicator size={\"small\"} color={\"white\"} />\n          ) : (\n            <Text>{mostLikedPropositionDetails.title}</Text>\n          )}\n        </View>\n\n        \n      </ScrollView>\n    </SafeAreaView>\n  );\n}\n"
  },
  {
    "path": "src/screens/More/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst height = Dimensions.get(\"window\").height;\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  sectionContainer: {\n    marginHorizontal: 27,\n    width: width * 0.9,\n    alignItems: \"center\",\n    alignSelf: \"center\",\n    paddingHorizontal: 5,\n    borderRadius: 18,\n    paddingVertical: 25,\n    marginBottom: 15,\n  },\n  sectionTitle: {\n    marginHorizontal: 20,\n    textAlign: \"center\",\n    fontSize: 20,\n    fontWeight: \"500\",\n    color: \"white\",\n  },\n  dataText: {\n    marginTop: 20,\n    fontSize: 30,\n    fontWeight: 'bold',\n    color: 'white'\n  }\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/PropositionDetails/index.js",
    "content": "import { useNavigation } from \"@react-navigation/core\";\nimport React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  Image,\n  ScrollView,\n  ActivityIndicator,\n} from \"react-native\";\nimport HTMLView from \"react-native-htmlview\";\nimport findCandidateDetails from \"../../../assets/queries/findCandidateDetails\";\nimport findThemeTitle from \"../../../assets/queries/findThemeTitle\";\nimport styles from \"./styles\";\nimport { AntDesign } from \"@expo/vector-icons\";\nimport { AsyncStorage } from \"@aws-amplify/core\";\n\nexport default function PropositionDetails({ route }) {\n  const allPropositionDetails = route.params;\n\n  const navigation = useNavigation();\n\n  const [candidatInfo, setCandidatInfo] = useState([]);\n  const [themeInfo, setThemeInfo] = useState([]);\n  const [loaded, setLoaded] = useState(false);\n\n  const [isFavorite, setIsFavorite] = useState(false);\n\n  useEffect(() => {\n    const candidateDetails = findCandidateDetails(\n      allPropositionDetails.idCandidat\n    );\n    setCandidatInfo(candidateDetails);\n\n    const themeDetails = findThemeTitle(allPropositionDetails.theme);\n    setThemeInfo(themeDetails);\n\n    setLoaded(true);\n\n    console.log(themeInfo);\n  }, []);\n\n  useEffect(async () => {\n    // Vérifier si la proposition est déjà ajoutée en favoris\n    await AsyncStorage.getItem(\"@favoritesPropositions\").then((res) => {\n      var currentFavoritesPropositions = JSON.parse(res);\n      if (currentFavoritesPropositions.includes(allPropositionDetails.id)) {\n        setIsFavorite(true);\n      } else {\n        setIsFavorite(false);\n      }\n    });\n  }, []);\n\n  const addPropositionToFavorites = async () => {\n    // Ajouter aux favoris\n    try {\n      await AsyncStorage.getItem(\"@favoritesPropositions\").then(async (res) => {\n        // Retirer des favoris\n        if (isFavorite) {\n          // On retire la proposition des propositions favorites\n          var currentFavorites = JSON.parse(res);\n\n          currentFavorites = currentFavorites.filter(\n            (e) => e !== allPropositionDetails.id\n          );\n          currentFavorites = JSON.stringify(currentFavorites);\n\n          await AsyncStorage.setItem(\n            \"@favoritesPropositions\",\n            currentFavorites\n          ).then(() => {\n            console.log(\"Proposition retirée des favoris\");\n            setIsFavorite(false);\n          });\n        } else {\n          // Si c'est la première proposition ajoutée au favoris\n\n          if (res == null) {\n            var newFavoriteArray = [allPropositionDetails.id];\n            newFavoriteArray = JSON.stringify(newFavoriteArray);\n\n            await AsyncStorage.setItem(\n              \"@favoritesPropositions\",\n              newFavoriteArray\n            ).then(() => {\n              console.log(\"Première proposition ajoutée aux favoris\");\n              setIsFavorite(true);\n            });\n          } else {\n            console.log(allPropositionDetails);\n            var currentFavorites = JSON.parse(res);\n            var newFavoriteArray = [\n              ...currentFavorites,\n              allPropositionDetails.id,\n            ];\n\n            newFavoriteArray = JSON.stringify(newFavoriteArray);\n\n            try {\n              await AsyncStorage.setItem(\n                \"@favoritesPropositions\",\n                newFavoriteArray\n              ).then(() => {\n                console.log(\"Proposition ajoutée aux favoris\");\n                setIsFavorite(true);\n              });\n            } catch (e) {\n              console.log(e);\n            }\n          }\n        }\n      });\n    } catch (e) {\n      console.log(e);\n    }\n  };\n\n  if (loaded) {\n    return (\n      <View style={styles.container}>\n        <View style={styles.headerContainer}>\n          <View\n            style={[\n              styles.themeContainer,\n              {\n                backgroundColor: themeInfo[0].lightColor,\n                // width: themeInfo[0].title.length * 11,\n              },\n            ]}\n          >\n            <Text style={[styles.themeTitleText]}>{themeInfo[0].title}</Text>\n          </View>\n\n          <TouchableOpacity\n            onPress={() => addPropositionToFavorites()}\n            style={[\n              styles.addToFavoriteButton,\n              {\n                backgroundColor: isFavorite ? themeInfo[0].lightColor : null,\n                borderWidth: isFavorite ? 0 : 2,\n                borderColor: themeInfo[0].lightColor,\n              },\n            ]}\n          >\n            <AntDesign\n              name={\"star\"}\n              size={20}\n              color={isFavorite ? \"white\" : themeInfo[0].lightColor}\n            />\n          </TouchableOpacity>\n        </View>\n\n        {allPropositionDetails.showCandidateInfo ? (\n          <TouchableOpacity\n            onPress={() =>\n              navigation.navigate(\"CandidateProfile\", {\n                id: allPropositionDetails.idCandidat,\n              })\n            }\n            style={styles.candidateDetailsContainer}\n          >\n            <View>\n              <Image\n                source={candidatInfo[0].imageProfile}\n                style={{ height: 35, width: 35, borderRadius: 35 }}\n              />\n            </View>\n            <Text style={{ marginLeft: 10, fontSize: 20 }}>\n              {candidatInfo[0].firstname} {candidatInfo[0].lastname}\n            </Text>\n          </TouchableOpacity>\n        ) : null}\n        <Text style={styles.propositionTitle}>\n          {allPropositionDetails.title}\n        </Text>\n        <ScrollView\n          style={{ marginBottom: 45 }}\n          showsVerticalScrollIndicator={false}\n        >\n          <HTMLView\n            value={`<p>${allPropositionDetails.articleContent}</p>`}\n            stylesheet={styles}\n          />\n          {allPropositionDetails.source ? (\n            <Text style={{ marginTop: 20, fontSize: 18, marginBottom: 10 }}>\n              Sources : {allPropositionDetails.source}\n            </Text>\n          ) : null}\n        </ScrollView>\n        <TouchableOpacity\n          style={[\n            styles.closeButton,\n            { backgroundColor: themeInfo[0].lightColor },\n          ]}\n          onPress={() => navigation.goBack()}\n        >\n          <Text style={styles.closeModalText}>FERMER</Text>\n        </TouchableOpacity>\n      </View>\n    );\n  } else {\n    return (\n      <View style={{ marginTop: 300, alignItems: \"center\" }}>\n        <ActivityIndicator size={\"large\"} />\n      </View>\n    );\n  }\n}\n"
  },
  {
    "path": "src/screens/PropositionDetails/styles.js",
    "content": "import React from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\n\nconst width = Dimensions.get(\"window\").width;\nconst height = Dimensions.get(\"window\").height;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    paddingHorizontal: 20,\n    paddingBottom: 40,\n  },\n  headerContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n    alignItems: \"center\",\n  },\n  addToFavoriteButton: {\n    width: \"20%\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    height: width * 0.09,\n    borderRadius: 10,\n    marginTop: 27,\n    marginBottom: 18,\n  },\n  closeButton: {\n    position: \"absolute\",\n    bottom: 35,\n    height: 50,\n    width: width * 0.9,\n    alignSelf: \"center\",\n    borderRadius: 15,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 1,\n    },\n    shadowOpacity: 0.2,\n    shadowRadius: 1.41,\n\n    elevation: 2,\n  },\n  closeModalText: {\n    fontSize: 18,\n    fontWeight: \"bold\",\n    color: \"white\",\n  },\n  themeContainer: {\n    flexDirection: \"row\",\n    height: width * 0.09,\n    width: \"78%\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    marginTop: 27,\n    // shadowColor: \"#000\",\n    // shadowOffset: {\n    //   width: 0,\n    //   height: 1,\n    // },\n    // shadowOpacity: 0.2,\n    // shadowRadius: 1.41,\n\n    // elevation: 2,\n    borderRadius: 10,\n    marginBottom: 18,\n  },\n  themeTitleText: {\n    textTransform: \"uppercase\",\n    color: \"white\",\n  },\n  candidateDetailsContainer: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    marginBottom: 10,\n  },\n  propositionTitle: {\n    fontSize: width * 0.06,\n    fontWeight: \"bold\",\n    marginBottom: 12,\n  },\n\n  /* Style de la description (HTML) */\n  p: {\n    fontSize: 20,\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Propositions/index.js",
    "content": "import { useNavigation } from \"@react-navigation/core\";\nimport React, { useState, useEffect } from \"react\";\nimport {\n  View,\n  Text,\n  ScrollView,\n  TouchableOpacity,\n  FlatList,\n  Dimensions,\n} from \"react-native\";\nimport { AntDesign } from \"@expo/vector-icons\";\nimport candidatesList from \"../../../assets/data/candidates/candidatesList\";\nimport ByCandidateCard from \"../../components/ByCandidateCard\";\nimport PropositionThemeCard from \"../../components/PropositionThemeCard\";\nimport styles from \"./styles\";\nimport ResponsiveTitle from \"../../components/ResponsiveTitle\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport colors from \"../../../assets/colors/colors\";\n\nexport default function Propositions() {\n  const navigation = useNavigation();\n\n  const [candidateShowList, setCandidateShowList] = useState([]);\n\n  useEffect(() => {\n    const sortedCandidateList = candidatesList.sort((a, b) =>\n      a.lastname.localeCompare(b.lastname)\n    );\n    setCandidateShowList(sortedCandidateList);\n  }, []);\n\n  return (\n    <SafeAreaView style={styles.container} edges={[\"top\"]}>\n      <ScrollView>\n        <ResponsiveTitle title={\"Parcourir les propositions\"} />\n\n        <TouchableOpacity\n          onPress={() =>\n            navigation.navigate(\"FavoritesPropositions\")\n          }\n          style={{\n            position: \"absolute\",\n            top: 25,\n            right: 25,\n            height: Dimensions.get(\"window\").width * 0.13,\n            width: Dimensions.get(\"window\").width * 0.13,\n            backgroundColor: colors.primary,\n            borderRadius: 55,\n            justifyContent: \"center\",\n            alignItems: \"center\",\n          }}\n        >\n          <AntDesign\n            name={\"star\"}\n            size={Dimensions.get(\"window\").width * 0.06}\n            color={\"white\"}\n          />\n        </TouchableOpacity>\n\n        <View style={styles.lineContainer}>\n          <PropositionThemeCard\n            title={\"Environnement\"}\n            bgColor={\"#45B959\"}\n            icon={\"leaf\"}\n            iconColor={\"#147139\"}\n            iconType={\"FontAwesome5\"}\n            themeID={1}\n          />\n          <PropositionThemeCard\n            title={\"Économie\"}\n            bgColor={\"#E6D642\"}\n            icon={\"euro\"}\n            iconColor={\"#AE9F16\"}\n            iconType={\"FontAwesome\"}\n            themeID={2}\n          />\n        </View>\n        <View style={styles.lineContainer}>\n          <PropositionThemeCard\n            title={\"Éducation\"}\n            bgColor={\"#C3467A\"}\n            icon={\"school\"}\n            iconColor={\"#8E2953\"}\n            iconType={\"MaterialCommunityIcons\"}\n            themeID={3}\n          />\n          <PropositionThemeCard\n            title={\"Solidarités & santé\"}\n            bgColor={\"#DF8CD2\"}\n            icon={\"healing\"}\n            iconColor={\"#A84793\"}\n            iconType={\"MaterialIcons\"}\n            themeID={4}\n          />\n        </View>\n        <View style={styles.lineContainer}>\n          <PropositionThemeCard\n            title={\"Société\"}\n            bgColor={\"#9E59C0\"}\n            icon={\"family-restroom\"}\n            iconColor={\"#6A2283\"}\n            iconType={\"MaterialIcons\"}\n            themeID={8}\n          />\n          <PropositionThemeCard\n            title={\"International\"}\n            bgColor={\"#464AB4\"}\n            icon={\"globe\"}\n            iconColor={\"#2E3395\"}\n            iconType={\"Entypo\"}\n            themeID={6}\n          />\n        </View>\n\n        <TouchableOpacity\n          style={styles.showAllButton}\n          onPress={() => navigation.navigate(\"AllThemesList\")}\n        >\n          <Text style={styles.showAllText}>TOUT AFFICHER</Text>\n        </TouchableOpacity>\n\n        <View>\n          <Text style={styles.byPresidentText}>Par candidat</Text>\n        </View>\n\n        <View>\n          <FlatList\n            data={candidateShowList}\n            keyExtractor={(item) => item.id}\n            renderItem={({ item }) => (\n              <ByCandidateCard\n                idCandidate={item.id}\n                firstname={item.firstname}\n                lastname={item.lastname}\n                bgColor={item.bgColor}\n                image={item.image}\n                firstLinearColor={item.firstLinearColor}\n                secondLinearColor={item.secondLinearColor}\n              />\n            )}\n          />\n        </View>\n      </ScrollView>\n    </SafeAreaView>\n  );\n}\n"
  },
  {
    "path": "src/screens/Propositions/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get('window').width;\n\nconst styles = StyleSheet.create({\n    container: {\n        flex: 1\n    },\n    favoriteButtonContainer: {\n        height: 55,\n        width: 55,\n        backgroundColor: colors.primary,\n        alignItems: 'center',\n        justifyContent: 'center',\n        borderRadius: 50,\n        marginRight: 30\n    },\n    lineContainer: {\n        marginTop: 3,\n        marginBottom: 14,\n        marginHorizontal: 5,\n        flexDirection: 'row',\n        justifyContent: 'space-evenly'\n    },\n    showAllButton: {\n        alignSelf: 'center',\n        width: width*0.89,\n        height: 40,\n        borderRadius: 10,\n        backgroundColor: colors.primary,\n        justifyContent: 'center',\n        alignItems: 'center'\n    },\n    showAllText: {\n        fontSize: 17,\n        fontWeight: '500',\n        color: 'white'\n    },\n    byPresidentText: {\n        marginLeft: 20,\n        marginTop: 25,\n        marginBottom: 11,\n        fontSize: 30,\n        fontWeight: 'bold',\n    }\n});\n\nexport default styles;"
  },
  {
    "path": "src/screens/Results/index.js",
    "content": "import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { useIsFocused, useNavigation } from \"@react-navigation/core\";\nimport React, { useState, useEffect, useRef } from \"react\";\nimport {\n  View,\n  Text,\n  Image,\n  ScrollView,\n  FlatList,\n  TouchableOpacity,\n  ActivityIndicator,\n  Dimensions,\n  RefreshControl,\n  Alert,\n} from \"react-native\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport colors from \"../../../assets/colors/colors\";\nimport findCandidateDetails from \"../../../assets/queries/findCandidateDetails\";\nimport ResultCandidateCard from \"../../components/ResultCandidateCard\";\nimport styles from \"./styles\";\nimport { AntDesign, Feather, Foundation } from \"@expo/vector-icons\";\nimport ResponsiveTitle from \"../../components/ResponsiveTitle\";\nimport { round } from \"lodash\";\nimport { captureRef } from \"react-native-view-shot\";\nimport * as Sharing from \"expo-sharing\";\n\nconst wait = (timeout) => {\n  return new Promise((resolve) => setTimeout(resolve, timeout));\n};\n\nexport default function Results() {\n  const navigation = useNavigation();\n\n  // Faire un object avec les scores pour chaque candidat, et trier l'objet du plus grand au plus petit\n  // Pour chaque candidat récupérer le score\n  // !!! Pour chaque candidat récupérer le total de propositions passées\n  // !!! Faire le pourcentage de propositions likés pour chaque candidat\n  // !!! Afficher les résultats uniquement si\n  /* var scoreCandidats = {\n        player1: (nb propositions likées pour candidat 1 * 100)/(nb de propositions passées pour chaque candidat)\n        player2: ......,\n        player3: ......\n    };\n    \n    var sorted = Object.keys(scoreCandidats)\n                       .sort(function(keya, keyb) {\n                           return scoreCandidats[keyb] - scoreCandidats[keya];\n                       })\n                       .forEach(function(key) {\n                           console.log(key, scoreCandidats[key]);\n                       }) */\n\n  const [podiumFirstDetails, setPodiumFirstDetails] = useState([]);\n  const [podiumSecondDetails, setPodiumSecondDetails] = useState([]);\n  const [podiumThirdDetails, setPodiumThirdDetails] = useState([]);\n\n  const [scoreCandidats, setScoreCandidats] = useState([]);\n\n  const [positionsPassedNumber, setPositionsPassedNumber] = useState(0);\n\n  const [loaded, setLoaded] = useState(true);\n  const [isSet, setIsSet] = useState(true);\n\n  const [isFetching, setIsFetching] = useState(false);\n  const [hasValidateTips, setHasValidateTips] = useState(true);\n\n  const [firstNumeroPodium, setFirstNumeroPodium] = useState(1);\n  const [secondNumeroPodium, setSecondNumeroPodium] = useState(2);\n  const [thirdNumeroPodium, setThirdNumeroPodium] = useState(3);\n\n  const updatePassedPropositionNumber = async () => {\n    try {\n      await AsyncStorage.getItem(\"@passed_propositions\").then((response) => {\n        const arrayPassedPropositionNumber = JSON.parse(response);\n        if (arrayPassedPropositionNumber !== null) {\n          setPositionsPassedNumber(arrayPassedPropositionNumber.length);\n        } else {\n          setPositionsPassedNumber(0);\n        }\n      });\n    } catch (e) {\n      console.log(e);\n    }\n  };\n\n  const getScoreFor = async (idCandidat) => {\n    const candidateVariable = \"@score_candidat_\" + idCandidat;\n    const dislikeCandidateVariable = \"@scoreDislike_candidat_\" + idCandidat;\n\n    const likeCandidateVariablePassed = \"@likeListCandidate_\" + idCandidat;\n    const superLikeCandidateVariablePassed =\n      \"@superLikeListCandidate_\" + idCandidat;\n    const dislikeCandidateVariablePassed =\n      \"@dislikeListCandidate_\" + idCandidat;\n\n    try {\n      var likesForCandidatePassed = await AsyncStorage.getItem(\n        likeCandidateVariablePassed\n      );\n      likesForCandidatePassed = JSON.parse(likesForCandidatePassed);\n      likesForCandidatePassed = likesForCandidatePassed.length;\n    } catch (e) {\n      var likesForCandidatePassed = null;\n    }\n\n    try {\n      var superlikesForCandidatePassed = await AsyncStorage.getItem(\n        superLikeCandidateVariablePassed\n      );\n      superlikesForCandidatePassed = JSON.parse(superlikesForCandidatePassed);\n      superlikesForCandidatePassed = superlikesForCandidatePassed.length;\n    } catch (e) {\n      var superlikesForCandidatePassed = null;\n    }\n\n    try {\n      var dislikesForCandidatePassed = await AsyncStorage.getItem(\n        dislikeCandidateVariablePassed\n      );\n      dislikesForCandidatePassed = JSON.parse(dislikesForCandidatePassed);\n      dislikesForCandidatePassed = dislikesForCandidatePassed.length;\n    } catch (e) {\n      var dislikesForCandidatePassed = null;\n    }\n\n    var likesForCandidate = await AsyncStorage.getItem(candidateVariable);\n    var dislikesForCandidate = await AsyncStorage.getItem(\n      dislikeCandidateVariable\n    );\n\n    likesForCandidate = JSON.parse(likesForCandidate);\n\n    dislikesForCandidate = JSON.parse(dislikesForCandidate);\n\n    const likesAndDislikesNumber =\n      parseInt(likesForCandidate) + parseInt(dislikesForCandidate);\n\n    var likesPercentageForCandidate = likesForCandidate - dislikesForCandidate\n\n    var scoreForCandidate = likesPercentageForCandidate;\n\n    if (likesForCandidatePassed+dislikesForCandidatePassed+superlikesForCandidatePassed == 0) {\n      return -1000000000000;\n    } else {\n      return parseInt(scoreForCandidate);\n    }\n  };\n\n  const findPairs = (arr) => {\n    for (let i = 0; i < arr.length; i++) {\n      for (let j = 0; j < arr.length; j++) {\n        if (arr[i].score == arr[j].score) {\n          if (\n            i != j &&\n            !arr[j].pair.includes(arr[i].id) &&\n            !arr[i].pair.includes(arr[j].id)\n          ) {\n            arr[i].pair.push(arr[j].id);\n            arr[j].pair.push(arr[i].id);\n          }\n        }\n      }\n    }\n    return arr;\n  };\n\n  const setPositions = (arr) => {\n    // console.log(\"SETTING POSITIONS\");\n    var minimum = null;\n    for (let i = 0; i < arr.length; i++) {\n      if (arr[i].pair.length != 0) {\n        minimum = Math.min.apply(Math, arr[i].pair);\n\n        if (arr[i].id <= minimum) {\n          arr[i].position = i + 1;\n        } else {\n          // console.log(\"minimum\", minimum);\n          // index de l'object avec id = minimum dans arr\n          var index = 0;\n          for (let j = 0; j < arr.length; j++) {\n            if (arr[j].id == minimum) {\n              index = j;\n              break;\n            }\n          }\n\n          // console.log(\"INDEX\", index);\n          arr[i].position = arr[index].position;\n        }\n      } else {\n        if (i == 0) {\n          arr[i].position = 1;\n        } else {\n          arr[i].position = arr[i - 1].pair.length + arr[i - 1].position + 1;\n        }\n      }\n    }\n    // console.log(\"POSITIONS SET\", arr);\n    return arr;\n  };\n\n  const createFinalTable = (\n    scoreFirst,\n    scoreSecond,\n    scoreThird,\n    scoreFourth,\n    scoreFifth,\n    scoreEight,\n    scoreNine,\n    scoreTen,\n    scoreEleven,\n    scoreTwelve,\n    scoreThirteen,\n    scoreFiveteen\n  ) => {\n    var finalScoreForCandidates = [\n      {\n        id: 1,\n        score: scoreFirst,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 2,\n        score: scoreSecond,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 3,\n        score: scoreThird,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 4,\n        score: scoreFourth,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 5,\n        score: scoreFifth,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 8,\n        score: scoreEight,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 9,\n        score: scoreNine,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 10,\n        score: scoreTen,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 11,\n        score: scoreEleven,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 12,\n        score: scoreTwelve,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 13,\n        score: scoreThirteen,\n        pair: [],\n        position: null,\n      },\n      {\n        id: 15,\n        score: scoreFiveteen,\n        pair: [],\n        position: null,\n      },\n    ];\n\n    finalScoreForCandidates.sort(\n      (a, b) => parseFloat(b.score) - parseFloat(a.score)\n    );\n\n    return finalScoreForCandidates;\n  };\n\n  const updateScore = async () => {\n    await Promise.all([\n      getScoreFor(1),\n      getScoreFor(2),\n      getScoreFor(3),\n      getScoreFor(4),\n      getScoreFor(5),\n      getScoreFor(8),\n      getScoreFor(9),\n      getScoreFor(10),\n      getScoreFor(11),\n      getScoreFor(12),\n      getScoreFor(13),\n      getScoreFor(15),\n    ]).then((response) => {\n      // console.log(\"Réponse du tableau : \", response);\n      if (\n        isNaN(response[0]) == false &&\n        isNaN(response[1]) == false &&\n        isNaN(response[2]) == false &&\n        isNaN(response[3]) == false &&\n        isNaN(response[4]) == false &&\n        isNaN(response[5]) == false &&\n        isNaN(response[6]) == false &&\n        isNaN(response[7]) == false &&\n        isNaN(response[8]) == false &&\n        isNaN(response[9]) == false &&\n        isNaN(response[10]) == false &&\n        isNaN(response[11]) == false\n      ) {\n        const finalTableSorted = createFinalTable(\n          response[0],\n          response[1],\n          response[2],\n          response[3],\n          response[4],\n          response[5],\n          response[6],\n          response[7],\n          response[8],\n          response[9],\n          response[10],\n          response[11]\n        );\n\n        const pairsTable = setPositions(findPairs(finalTableSorted));\n\n        setScoreCandidats(pairsTable);\n\n        // console.log(\"Score finaux : \", finalTableSorted);\n\n        // On met à jour le podium\n        const firstPodiumDetails = findCandidateDetails(finalTableSorted[0].id);\n        setPodiumFirstDetails(firstPodiumDetails);\n\n        setFirstNumeroPodium(finalTableSorted[0].position);\n        setSecondNumeroPodium(finalTableSorted[1].position);\n        setThirdNumeroPodium(finalTableSorted[2].position);\n\n        const secondPodiumDetails = findCandidateDetails(\n          finalTableSorted[1].id\n        );\n        setPodiumSecondDetails(secondPodiumDetails);\n\n        const thirdPodiumDetails = findCandidateDetails(finalTableSorted[2].id);\n        setPodiumThirdDetails(thirdPodiumDetails);\n\n        setIsSet(true);\n      } else {\n        setIsSet(false);\n      }\n    });\n  };\n\n  const onRefresh = React.useCallback(async () => {\n    setIsFetching(true);\n    await updateScore().then(() => wait(500).then(() => setIsFetching(false)));\n  }, []);\n\n  const isFocused = useIsFocused();\n\n  useEffect(() => {\n    if (isFocused) {\n      updatePassedPropositionNumber();\n      updateScore();\n    }\n  }, [scoreCandidats, isFocused, isFetching]);\n\n  useEffect(async () => {\n    try {\n      await AsyncStorage.getItem(\"@hasValidateResultTip\").then((response) => {\n        if (response == null) {\n          setHasValidateTips(false);\n        }\n      });\n    } catch (e) {\n      console.log(e);\n    }\n\n    // console.log(hasValidateTips);\n  }, []);\n\n  const renderCandidateRankCard = (item, index) => {\n    // Récupérer les infos sur le candidat\n\n    return (\n      <ResultCandidateCard\n        position={index + 1}\n        idCandidat={item.id}\n        item={item}\n        focused={isFocused}\n      />\n    );\n  };\n\n  const viewRef = useRef();\n\n  // download image\n  const shareImage = async () => {\n    try {\n      // react-native-view-shot caputures component\n      const uri = await captureRef(viewRef, {\n        format: \"jpg\",\n        quality: 1.0,\n      });\n\n      // console.log(uri);\n\n      if (!(await Sharing.isAvailableAsync())) {\n        alert(\n          `Le partage des résultats n'est pas disponible sur ton appareil 😣`\n        );\n        return;\n      }\n\n      const imageResultsOptions = {\n        mimeType: \"image/jpg\",\n        dialogTitle: \"Mes résultats\",\n      };\n\n      await Sharing.shareAsync(\"file://\" + uri, { imageResultsOptions });\n    } catch (e) {\n      console.log(e);\n    }\n  };\n\n  if (\n    loaded &&\n    isSet &&\n    scoreCandidats !== \"undefined\" &&\n    scoreCandidats !== \"null\" &&\n    podiumSecondDetails !== undefined &&\n    podiumSecondDetails.length !== 0 &&\n    podiumFirstDetails &&\n    podiumFirstDetails.length !== 0 &&\n    podiumThirdDetails &&\n    podiumThirdDetails.length !== 0\n  ) {\n    const fiabilityRating = round((positionsPassedNumber / 450) * 100);\n\n    return (\n      <View style={styles.container}>\n        <View style={styles.headerContainer}>\n          <Text\n            style={{\n              fontSize: Dimensions.get(\"window\").width * 0.085,\n              marginLeft: 25,\n              marginBottom: 20,\n              width: 250,\n              fontWeight: \"bold\",\n            }}\n          >\n            Résultats\n          </Text>\n\n          {/* {positionsPassedNumber > 0 ? (\n            <TouchableOpacity style={styles.shareButton}>\n              <Entypo name={\"share-alternative\"} size={20} color={\"white\"} />\n            </TouchableOpacity>\n          ) : null} */}\n        </View>\n\n        {/* Bouton partage des résultats */}\n        {positionsPassedNumber > 0 ? (\n          <TouchableOpacity\n            onPress={() =>\n              navigation.navigate(\"Share\", {\n                first: podiumFirstDetails[0],\n                second: podiumSecondDetails[0],\n                third: podiumThirdDetails[0],\n                numberOfSwipes: positionsPassedNumber,\n              })\n            }\n            style={{\n              position: \"absolute\",\n              top: -10,\n              right: 25,\n              height: Dimensions.get(\"window\").width * 0.13,\n              width: Dimensions.get(\"window\").width * 0.13,\n              backgroundColor: colors.primary,\n              borderRadius: 55,\n              justifyContent: \"center\",\n              alignItems: \"center\",\n            }}\n          >\n            <Feather\n              name={\"share\"}\n              size={Dimensions.get(\"window\").width * 0.06}\n              color={\"white\"}\n            />\n          </TouchableOpacity>\n        ) : null}\n\n        <View style={styles.podiumContainer}>\n          {\n            // Si aucune proposition n'est swipée\n            positionsPassedNumber == 0 ? (\n              <View style={[styles.secondResults, { marginTop: 50 }]}>\n                <View style={styles.imageContainer}>\n                  <Text\n                    style={[\n                      styles.podiumImage,\n                      { fontSize: 35, textAlign: \"center\" },\n                    ]}\n                  >\n                    🤔\n                  </Text>\n                </View>\n                <View\n                  style={[\n                    styles.rectangleWrapper,\n                    {\n                      height: 100,\n                      backgroundColor: podiumSecondDetails[0].bgColor,\n                    },\n                  ]}\n                >\n                  <View\n                    style={[\n                      styles.numberWrapper,\n                      {\n                        borderWidth: 4,\n                        borderColor: \"lightgray\",\n                        flexDirection: \"row\",\n                      },\n                    ]}\n                  >\n                    <Text style={{ fontSize: 12, fontWeight: \"bold\" }}>#</Text>\n                    <Text style={{ fontSize: 16, fontWeight: \"bold\" }}>2</Text>\n                  </View>\n                </View>\n              </View>\n            ) : (\n              <TouchableOpacity\n                style={[styles.secondResults, { marginTop: 50 }]}\n                onPress={() =>\n                  navigation.navigate(\"CandidateProfile\", {\n                    id: podiumSecondDetails[0].id,\n                  })\n                }\n              >\n                <View style={styles.imageContainer}>\n                  <Image\n                    source={podiumSecondDetails[0].image}\n                    style={styles.podiumImage}\n                  />\n                </View>\n                <View\n                  style={[\n                    styles.rectangleWrapper,\n                    {\n                      height: 100,\n                      backgroundColor: podiumSecondDetails[0].bgColor,\n                    },\n                  ]}\n                >\n                  <View\n                    style={[\n                      styles.numberWrapper,\n                      {\n                        borderWidth: 4,\n                        borderColor: \"lightgray\",\n                        flexDirection: \"row\",\n                      },\n                    ]}\n                  >\n                    <Text style={{ fontSize: 12, fontWeight: \"bold\" }}>#</Text>\n                    <Text style={{ fontSize: 16, fontWeight: \"bold\" }}>\n                      {secondNumeroPodium}\n                    </Text>\n                  </View>\n                </View>\n              </TouchableOpacity>\n            )\n          }\n\n          {\n            // Si aucune proposition n'est swipée\n            positionsPassedNumber == 0 ? (\n              <View style={[styles.firstResults]}>\n                <View style={styles.imageContainer}>\n                  <Text\n                    style={[\n                      styles.podiumImage,\n                      { fontSize: 35, textAlign: \"center\" },\n                    ]}\n                  >\n                    🤔\n                  </Text>\n                </View>\n                <View\n                  style={[\n                    styles.rectangleWrapper,\n                    {\n                      height: 150,\n                      backgroundColor: podiumFirstDetails[0].bgColor,\n                    },\n                  ]}\n                >\n                  <View\n                    style={[\n                      styles.numberWrapper,\n                      {\n                        borderWidth: 4,\n                        borderColor: \"gold\",\n                        flexDirection: \"row\",\n                      },\n                    ]}\n                  >\n                    <Text style={{ fontSize: 12, fontWeight: \"bold\" }}>#</Text>\n                    <Text style={{ fontSize: 16, fontWeight: \"bold\" }}>1</Text>\n                  </View>\n                </View>\n              </View>\n            ) : (\n              <TouchableOpacity\n                style={styles.firstResults}\n                onPress={() =>\n                  navigation.navigate(\"CandidateProfile\", {\n                    id: podiumFirstDetails[0].id,\n                  })\n                }\n              >\n                <View style={styles.imageContainer}>\n                  <Image\n                    source={podiumFirstDetails[0].image}\n                    style={styles.podiumImage}\n                  />\n                </View>\n                <View\n                  style={[\n                    styles.rectangleWrapper,\n                    {\n                      height: 150,\n                      backgroundColor: podiumFirstDetails[0].bgColor,\n                    },\n                  ]}\n                >\n                  <View\n                    style={[\n                      styles.numberWrapper,\n                      {\n                        borderWidth: 4,\n                        borderColor: \"gold\",\n                        flexDirection: \"row\",\n                      },\n                    ]}\n                  >\n                    <Text style={{ fontSize: 12, fontWeight: \"bold\" }}>#</Text>\n                    <Text style={{ fontSize: 16, fontWeight: \"bold\" }}>\n                      {firstNumeroPodium}\n                    </Text>\n                  </View>\n                </View>\n              </TouchableOpacity>\n            )\n          }\n\n          {\n            // Si aucune proposition n'est swipée\n            positionsPassedNumber == 0 ? (\n              <View style={[styles.thirdResults, { marginTop: 70 }]}>\n                <View style={styles.imageContainer}>\n                  <Text\n                    style={[\n                      styles.podiumImage,\n                      { fontSize: 35, textAlign: \"center\" },\n                    ]}\n                  >\n                    🤔\n                  </Text>\n                </View>\n                <View\n                  style={[\n                    styles.rectangleWrapper,\n                    {\n                      height: 80,\n                      backgroundColor: podiumThirdDetails[0].bgColor,\n                    },\n                  ]}\n                >\n                  <View\n                    style={[\n                      styles.numberWrapper,\n                      {\n                        borderWidth: 4,\n                        borderColor: \"#E9AB81\",\n                        flexDirection: \"row\",\n                      },\n                    ]}\n                  >\n                    <Text style={{ fontSize: 12, fontWeight: \"bold\" }}>#</Text>\n                    <Text style={{ fontSize: 16, fontWeight: \"bold\" }}>3</Text>\n                  </View>\n                </View>\n              </View>\n            ) : (\n              <TouchableOpacity\n                style={[styles.thirdResults, { marginTop: 70 }]}\n                onPress={() =>\n                  navigation.navigate(\"CandidateProfile\", {\n                    id: podiumThirdDetails[0].id,\n                  })\n                }\n              >\n                <View style={styles.imageContainer}>\n                  <Image\n                    source={podiumThirdDetails[0].image}\n                    style={styles.podiumImage}\n                  />\n                </View>\n                <View\n                  style={[\n                    styles.rectangleWrapper,\n                    {\n                      height: 80,\n                      backgroundColor: podiumThirdDetails[0].bgColor,\n                    },\n                  ]}\n                >\n                  <View\n                    style={[\n                      styles.numberWrapper,\n                      {\n                        borderWidth: 4,\n                        borderColor: \"#E9AB81\",\n                        flexDirection: \"row\",\n                      },\n                    ]}\n                  >\n                    <Text style={{ fontSize: 12, fontWeight: \"bold\" }}>#</Text>\n                    <Text style={{ fontSize: 16, fontWeight: \"bold\" }}>\n                      {thirdNumeroPodium}\n                    </Text>\n                  </View>\n                </View>\n              </TouchableOpacity>\n            )\n          }\n        </View>\n\n        <View\n          style={{\n            width: Dimensions.get(\"window\").width * 2.5,\n            height: Dimensions.get(\"window\").width * 2.5,\n            borderRadius: (Dimensions.get(\"window\").width * 2.5) / 2,\n            position: \"absolute\",\n            backgroundColor: colors.primary,\n            top: 200,\n            zIndex: -10,\n            alignSelf: \"center\",\n          }}\n        ></View>\n\n        <ScrollView\n          style={styles.listScoreContainer}\n          refreshControl={\n            <RefreshControl refreshing={isFetching} onRefresh={onRefresh} />\n          }\n        >\n          <View collapsable={false} ref={viewRef}>\n            <Text style={styles.allResultsText}>🏆 Tous les résultats</Text>\n            <Image\n              style={{\n                height: 25,\n                width: 100,\n                alignSelf: \"center\",\n                marginBottom: 10,\n              }}\n              source={require(\"../../../assets/images/logo-header.png\")}\n            />\n            <Text style={styles.passedPropositionsText}>\n              Sur {Math.round(positionsPassedNumber)} propositions | Continue à\n              voter pour affiner tes résultats\n            </Text>\n            {positionsPassedNumber > 0 ? (\n              <View\n                style={{\n                  flexDirection: \"row\",\n                  justifyContent: \"center\",\n                  alignItems: \"center\",\n                }}\n              >\n                <Text\n                  style={[\n                    styles.passedPropositionsText,\n                    { fontWeight: \"bold\" },\n                  ]}\n                >\n                  Indice de fiabilité :{\" \"}\n                  {fiabilityRating <= 30\n                    ? \"Faible\"\n                    : fiabilityRating > 30 && fiabilityRating < 70\n                    ? \"Moyen\"\n                    : fiabilityRating >= 70\n                    ? \"Élevé\"\n                    : null}\n                </Text>\n              </View>\n            ) : null}\n            {positionsPassedNumber == 0 ? (\n              <View>\n                <Text\n                  style={{\n                    textAlign: \"center\",\n                    marginTop: 30,\n                    paddingHorizontal: 45,\n                    fontSize: 40,\n                  }}\n                >\n                  🗳\n                </Text>\n                <Text\n                  style={{\n                    textAlign: \"center\",\n                    marginTop: 10,\n                    paddingHorizontal: 45,\n                    fontSize: 25,\n                  }}\n                >\n                  Continue à voter pour découvrir les candidats qui te\n                  correspondent\n                </Text>\n              </View>\n            ) : (\n              <View style={{ alignItems: \"center\" }}>\n                {!hasValidateTips ? (\n                  <View\n                    style={{\n                      backgroundColor: \"#E1C356\",\n                      width: \"87%\",\n                      borderRadius: 10,\n                      justifyContent: \"space-between\",\n                      flexDirection: \"row\",\n                      paddingHorizontal: 10,\n                      paddingVertical: 10,\n                      alignItems: \"center\",\n                      marginBottom: 10,\n                    }}\n                  >\n                    <View\n                      style={{ flexDirection: \"row\", alignItems: \"center\" }}\n                    >\n                      <Text>💡</Text>\n                      <Text\n                        style={{ marginLeft: 10, color: \"white\", width: \"80%\" }}\n                      >\n                        Astuce : pour connaître les détails des résultats pour\n                        un candidat, appuyez sur celui-ci.\n                      </Text>\n                    </View>\n                    <TouchableOpacity\n                      onPress={async () => {\n                        await AsyncStorage.setItem(\n                          \"@hasValidateResultTip\",\n                          \"true\"\n                        ).then(() => {\n                          setHasValidateTips(true);\n                        });\n                      }}\n                      style={{ marginRight: 5 }}\n                    >\n                      <AntDesign\n                        name={\"closecircle\"}\n                        size={20}\n                        color={\"white\"}\n                      />\n                    </TouchableOpacity>\n                  </View>\n                ) : null}\n\n                <FlatList\n                  data={scoreCandidats}\n                  keyExtractor={(item) => item.id}\n                  renderItem={({ item, index }) =>\n                    renderCandidateRankCard(item, index)\n                  }\n                />\n              </View>\n            )}\n          </View>\n        </ScrollView>\n      </View>\n    );\n  } else if (isSet == false) {\n    return (\n      <SafeAreaView style={{ flex: 1 }}>\n        <ResponsiveTitle title={\"Résultats\"} />\n        <View\n          style={{\n            justifyContent: \"center\",\n            alignItems: \"center\",\n            marginTop: Dimensions.get(\"window\").height * 0.2,\n            paddingHorizontal: 10,\n          }}\n        >\n          <Text\n            style={{\n              textAlign: \"center\",\n              fontSize: 35,\n              fontWeight: \"bold\",\n              marginBottom: 5,\n            }}\n          >\n            🗳\n          </Text>\n          <Text\n            style={{\n              textAlign: \"center\",\n              fontSize: 30,\n              fontWeight: \"bold\",\n              marginBottom: 10,\n            }}\n          >\n            Plus que quelques votes !\n          </Text>\n          <Text\n            style={{\n              textAlign: \"center\",\n              fontSize: 20,\n              marginHorizontal: 20,\n            }}\n          >\n            Tu dois répondre à au moins une proposition de chaque candidat pour\n            obtenir vos résultats\n          </Text>\n        </View>\n      </SafeAreaView>\n    );\n  } else {\n    // console.log(isSet);\n\n    // console.log(loaded);\n\n    return (\n      <View style={{ justifyContent: \"center\", alignItems: \"center\" }}>\n        <ActivityIndicator\n          style={{\n            justifyContent: \"center\",\n            alignItems: \"center\",\n            zIndex: 100,\n            marginTop: 400,\n          }}\n          size={\"large\"}\n        />\n      </View>\n    );\n  }\n}\n"
  },
  {
    "path": "src/screens/Results/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get(\"window\").width;\nconst height = Dimensions.get(\"window\").height;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    marginTop: height*0.08,\n  },\n  headerContainer: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    paddingRight: 20\n  },\n  shareButton: {\n    height: width*0.12,\n    width: width*0.12,\n    backgroundColor: colors.primary,\n    alignItems: 'center',\n    justifyContent: 'center',\n    borderRadius: 25\n  },\n  podiumContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-around\",\n    marginHorizontal: 20,\n  },\n  secondResults: {\n    alignItems: \"center\",\n  },\n  firstResults: {\n    alignItems: \"center\",\n  },\n  thirdResults: {\n    alignItems: \"center\",\n  },\n  imageContainer: {},\n  podiumImage: {\n    resizeMode: 'contain',\n    height: 56,\n    width: 65,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 4,\n    },\n    shadowOpacity: 0.3,\n    shadowRadius: 4.65,\n\n    elevation: 8,\n  },\n  rectangleWrapper: {\n    width: 0.27 * width,\n    backgroundColor: \"red\",\n    alignItems: \"center\",\n    borderTopLeftRadius: 10,\n    borderTopRightRadius: 10,\n  },\n  numberWrapper: {\n    height: 40,\n    width: 40,\n    borderRadius: 22,\n    backgroundColor: \"white\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    marginTop: 20,\n  },\n  listScoreContainer: {\n      backgroundColor: '#FFEDF0'\n  },\n  allResultsText: {\n      marginTop: 17,\n      alignSelf: 'center',\n      fontSize: 20,\n      marginBottom: 8\n  },\n  passedPropositionsText: {\n    textAlign: 'center',\n    textTransform: 'uppercase',\n    marginTop: -5,\n    marginBottom: 10,\n    fontSize: width*0.035,\n    color: 'gray',\n    paddingHorizontal: 30\n  }\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Set-upScreens/First/index.js",
    "content": "import { View, Text, Image, Dimensions } from \"react-native\";\nimport React from \"react\";\n\nexport default function FirstScreen() {\n  return (\n    <View style={{ justifyContent: \"center\", alignItems: \"center\" }}>\n      <Image\n        style={{\n          height: Dimensions.get(\"window\").width * 0.15,\n          marginBottom: -25,\n          resizeMode: \"contain\",\n        }}\n        source={require(\"../../../../assets/images/set-up/logo-simple.png\")}\n      />\n      <Text\n        style={{\n          marginTop: Dimensions.get(\"window\").width * 0.09,\n          fontSize: Dimensions.get(\"window\").width * 0.08,\n          marginHorizontal: 30,\n          color: \"white\",\n          fontWeight: \"bold\",\n          marginBottom: Dimensions.get(\"window\").width * 0.08,\n          textAlign: \"center\",\n        }}\n      >\n        Bienvenue sur <Text style={{fontStyle: 'italic'}}>ELYZE</Text>\n      </Text>\n      <Image\n        style={{\n          height: Dimensions.get(\"window\").width * 0.62,\n          resizeMode: \"contain\",\n        }}\n        source={require(\"../../../../assets/images/set-up/step-1.png\")}\n      />\n      <Text\n        style={{\n          marginHorizontal: 45,\n          textAlign: \"center\",\n          color: \"white\",\n          fontSize: Dimensions.get(\"window\").width * 0.06,\n          marginBottom: 50,\n          fontWeight: \"500\",\n          marginTop: Dimensions.get(\"window\").width * 0.08,\n        }}\n      >\n        Juge les propositions et découvre le candidat fait pour toi\n      </Text>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Set-upScreens/First/styles.js",
    "content": ""
  },
  {
    "path": "src/screens/Set-upScreens/Second/index.js",
    "content": "import { View, Text, Image, Dimensions } from \"react-native\";\nimport React from \"react\";\n\nexport default function SecondScreen() {\n  return (\n    <View style={{ justifyContent: \"center\", alignItems: \"center\" }}>\n      <Text\n        style={{\n          marginTop: Dimensions.get(\"window\").width * 0.09,\n          fontSize: Dimensions.get(\"window\").width * 0.08,\n          marginHorizontal: 30,\n          color: \"white\",\n          fontWeight: \"bold\",\n          marginBottom: 10,\n          textAlign: \"center\",\n        }}\n      >\n        🏅\n      </Text>\n      <Text\n        style={{\n          fontSize: Dimensions.get(\"window\").width * 0.08,\n          marginHorizontal: 30,\n          color: \"white\",\n          fontWeight: \"bold\",\n          marginBottom: Dimensions.get(\"window\").width * 0.08,\n          textAlign: \"center\",\n        }}\n      >\n        Accède à un classement détaillé\n      </Text>\n      <Image\n        style={{\n          height: Dimensions.get(\"window\").width * 0.7,\n          resizeMode: \"contain\",\n        }}\n        source={require(\"../../../../assets/images/set-up/step-2.png\")}\n      />\n      <Text\n        style={{\n          marginHorizontal: 45,\n          textAlign: \"center\",\n          color: \"white\",\n          fontSize: Dimensions.get(\"window\").width * 0.06,\n          marginBottom: 50,\n          fontWeight: \"500\",\n          marginTop: Dimensions.get(\"window\").width * 0.08,\n        }}\n      >\n        Découvre tes affinités politiques selon tes choix pour chaque candidat\n      </Text>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Set-upScreens/Second/styles.js",
    "content": ""
  },
  {
    "path": "src/screens/Set-upScreens/Third/index.js",
    "content": "import { View, Text, Image, Dimensions } from \"react-native\";\nimport React from \"react\";\n\nexport default function ThirdScreen() {\n  return (\n    <View style={{ justifyContent: \"center\", alignItems: \"center\" }}>\n      <Text\n        style={{\n          marginTop: Dimensions.get(\"window\").width * 0.09,\n          fontSize: Dimensions.get(\"window\").width * 0.08,\n          marginHorizontal: 30,\n          color: \"white\",\n          fontWeight: \"bold\",\n          marginBottom: 10,\n          textAlign: \"center\",\n        }}\n      >\n        🗳\n      </Text>\n      <Text\n        style={{\n          fontSize: Dimensions.get(\"window\").width * 0.08,\n          marginHorizontal: 30,\n          color: \"white\",\n          fontWeight: \"bold\",\n          marginBottom: Dimensions.get(\"window\").width * 0.08,\n          textAlign: \"center\",\n        }}\n      >\n        Découvre les propositions\n      </Text>\n      <Image\n        style={{\n          height: Dimensions.get(\"window\").width * 0.7,\n          resizeMode: \"contain\",\n        }}\n        source={require(\"../../../../assets/images/set-up/step-3.png\")}\n      />\n      <Text\n        style={{\n          marginHorizontal: 45,\n          textAlign: \"center\",\n          color: \"white\",\n          fontSize: Dimensions.get(\"window\").width * 0.06,\n          marginBottom: 50,\n          fontWeight: \"500\",\n          marginTop: Dimensions.get(\"window\").width * 0.08,\n        }}\n      >\n        Explore l'ensemble des propositions, par thème et par candidat\n      </Text>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Set-upScreens/Third/styles.js",
    "content": "import React from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nconst styles = StyleSheet.create({});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Settings/index.js",
    "content": "import React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  Alert,\n  ScrollView,\n  Image,\n} from \"react-native\";\nimport styles from \"./styles\";\nimport { AntDesign } from \"@expo/vector-icons\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport resetData from \"../../../assets/queries/resetData\";\nimport { Entypo, Feather } from \"@expo/vector-icons\";\nimport * as Linking from \"expo-linking\";\nimport { API, graphqlOperation } from \"aws-amplify\";\nimport TeamCard from \"../../components/teamCard\";\nimport team from \"../../../assets/data/team\";\nimport { FlatList } from \"react-native-gesture-handler\";\n\nexport default function Settings() {\n  const navigation = useNavigation();\n\n  const [founders, setFounders] = useState([]);\n\n  useEffect(() => {\n    const foundersTeam = team.filter((e) => e.role === \"founder\");\n\n    console.log(foundersTeam);\n\n    setFounders(foundersTeam);\n  }, []);\n\n  const deleteData = async () => {\n    Alert.alert(\n      \"Attention\",\n      \"Ceci effacera ton score et tes choix de propositions, es-tu sûr de vouloir continuer ?\",\n      [\n        {\n          text: \"Annuler\",\n          onPress: () => {\n            console.log(\"Données non supprimées\");\n          },\n        },\n        {\n          text: \"Supprimer\",\n          onPress: async () => {\n            try {\n              await resetData().then(() =>\n                Alert.alert(\n                  \"Score réinitialisé\",\n                  \"Ton score a été réinitialisé avec succès\"\n                )\n              );\n            } catch (e) {\n              console.log(e);\n            }\n          },\n        },\n      ]\n    );\n  };\n\n  return (\n    <View style={styles.container}>\n      <View style={styles.headerContainer}>\n        <Text style={styles.titleHeader}>Paramètres</Text>\n        <TouchableOpacity\n          onPress={() => navigation.goBack()}\n          style={styles.closeButton}\n        >\n          <AntDesign name={\"close\"} size={22} color={\"white\"} />\n        </TouchableOpacity>\n      </View>\n\n      <ScrollView>\n        <Text style={styles.settingsCategory}>🗳 MES RÉSULTATS</Text>\n\n        <View style={styles.sectionContainer}>\n          <Text style={[styles.helpText, { paddingHorizontal: 15 }]}>\n            Tes résultats enregistrés sur cet appareil peuvent être\n            réinitialisés en cliquant sur le bouton ci-dessous.\n          </Text>\n          {/* <TouchableOpacity\n            onPress={async () => {\n              await AsyncStorage.removeItem(\"@isSetUp2\");\n            }}\n            style={styles.eraseButton}\n          >\n            <Text style={styles.eraseButtonText}>Recommencer le set up</Text>\n          </TouchableOpacity> */}\n\n          <TouchableOpacity\n            onPress={() => deleteData()}\n            style={styles.eraseButton}\n          >\n            <Text style={styles.eraseButtonText}>\n              Réinitialiser mes résultats\n            </Text>\n          </TouchableOpacity>\n        </View>\n\n        <Text style={styles.settingsCategory}>🙋‍♂️ Aide</Text>\n\n        <View style={[styles.sectionContainer, { paddingHorizontal: 15 }]}>\n          <Text style={styles.helpTitleText}>Comment ça fonctionne ?</Text>\n          <Text style={styles.helpText}>\n            Devant une proposition, glisse ton doigt vers la droite si tu es en\n            accord avec celle-ci, vers la gauche si tu es en désaccord, ou vers\n            le bas si tu n'as pas de préférence. Tu peux également utiliser les\n            boutons en dessous pour chaque choix. Retrouve ensuite tes résultats\n            dans le deuxième onglet.\n          </Text>\n          <Text style={styles.helpTitleText}>\n            Est-ce que ELYZE collecte mes données ?\n          </Text>\n          <Text style={styles.helpText}>\n            Non, ELYZE ne collecte aucune donnée lors de l'utilisation de\n            l'application.\n          </Text>\n          <Text style={styles.helpTitleText}>\n            Comment ELYZE détermine mes résultats ?\n          </Text>\n          <Text style={styles.helpText}>\n            Le score d'un candidat est calculé de la façon suivante : un point\n            pour un \"like\", deux pour un \"super-like\", et moins un pour un\n            \"dislike\" (les votes \"Je ne sais pas\" ne sont pas comptabilisés).\n          </Text>\n          <Text style={styles.helpTitleText}>\n            Mes résultats me paraissent incohérents\n          </Text>\n          <Text style={styles.helpText}>\n            Si tu obtiens des résultats que tu considères comme incohérents,\n            continue à voter pour affiner tes résultats !\n          </Text>\n          <Text style={styles.helpTitleText}>\n            Est-ce que je peux utiliser ELYZE sans connexion internet ?\n          </Text>\n          <Text style={styles.helpText}>\n            Oui ! ELYZE ne nécessite aucune connexion internet pour fonctionner.\n          </Text>\n        </View>\n\n        <Text style={styles.settingsCategory}>👋🏼 À propos</Text>\n        <View style={[styles.sectionContainer, { paddingHorizontal: 15 }]}>\n          <FlatList\n            data={founders}\n            keyExtractor={(item) => item.id}\n            renderItem={({ item }) => (\n              <TeamCard\n                profile={{\n                  id: 1,\n                  firstName: item.firstName,\n                  lastName: item.lastName,\n                  role: \"Co-créateur\",\n                  social: item.social,\n                  imageURI: item.imageURI,\n                }}\n              />\n            )}\n          />\n\n          {/* <TouchableOpacity\n          onPress={() => navigation.navigate('Team')}\n            style={{\n              height: 35,\n              backgroundColor: \"#F33C53\",\n              alignItems: \"center\",\n              justifyContent: \"center\",\n              borderRadius: 8,\n            }}\n          >\n            <Text style={{ color: \"white\", fontWeight: \"bold\" }}>\n              TOUT AFFICHER\n            </Text>\n          </TouchableOpacity> */}\n          <Text style={{ fontSize: 17 }}>\n            ELYZE a été développé avec ❤️ à Paris et Montréal avec les bénévoles\n            du mouvement\n            <Text style={{ fontStyle: \"italic\", fontWeight: \"bold\" }}>\n              {\" \"}\n              Les Engagés !\n            </Text>\n            , <Text style={{ fontWeight: \"bold\" }}>Gaspard G</Text>, et{\" \"}\n            <Text style={{ fontWeight: \"bold\" }}>\n              Wallerand MOULLÉ-BERTEAUX\n            </Text>\n            .\n          </Text>\n        </View>\n\n        <Text style={styles.settingsCategory}>🤗 Remerciements</Text>\n        <View style={styles.sectionContainer}>\n          <Text style={{ marginBottom: 2, paddingHorizontal: 15 }}>\n            Cloé Artaut · Gaston Anton Leon · Victor Barthes · Thibaut Chancy ·\n            Alexis Costa · Louis de Benoist · Enzo Gabriel · Fanny Graffin ·\n            Garance Hablot · Victor Jacquet · Anna Koulakssis · Loup Laurent ·\n            Marie Lafarge · Océanne Lewden · Maxime Mazuel · Octavien Maury ·\n            Camilo Pallasco · Swann Payan · Louison Poilvet · Baptiste Salis ·\n            Julia Thebault Laurier · Julie Wright\n          </Text>\n        </View>\n\n        <Text numberOfLines={1} style={styles.settingsCategory}>\n          Bibliothèques Open Source\n        </Text>\n        <View\n          style={[\n            styles.sectionContainer,\n            { marginBottom: 15, paddingHorizontal: 15 },\n          ]}\n        >\n          <Text>\n            · React Native Deck Swiper © Copyright 2018 Alexandre Brillant\n          </Text>\n          <Text>\n            · React Native Image Header Scroll View © Copyright 2017 BAM\n          </Text>\n          <Text>\n            · React Native Onboarding Swiper © Copyright Johannes Filter, 2017\n          </Text>\n          <Text>· React Native Popup-confirm-toast © 2019 NY Samnang</Text>\n        </View>\n\n        <TouchableOpacity\n          onPress={() => Linking.openURL(\"mailto:salut@elyze.co\")}\n          style={{\n            marginBottom: 10,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingHorizontal: 20,\n          }}\n        >\n          <Feather name={\"mail\"} color={\"#2C6EB9\"} size={15} />\n          <Text style={{ color: \"#2C6EB9\", marginLeft: 5 }}>\n            Nous contacter / Signaler un problème\n          </Text>\n        </TouchableOpacity>\n\n        <TouchableOpacity\n          onPress={() =>\n            Linking.openURL(\n              \"https://nifty-option-15c.notion.site/Mentions-l-gales-d-ELYZE-903b50418a2a4ef59fe9361b37f59c54\"\n            )\n          }\n          style={{\n            marginBottom: 10,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingHorizontal: 20,\n          }}\n        >\n          <Feather name={\"external-link\"} color={\"#2C6EB9\"} size={15} />\n          <Text style={{ color: \"#2C6EB9\", marginLeft: 5 }}>\n            Mentions légales\n          </Text>\n        </TouchableOpacity>\n\n        <TouchableOpacity\n          onPress={() =>\n            Linking.openURL(\n              \"https://nifty-option-15c.notion.site/Politique-de-confidentialit-d-ELYZE-563c3cdb31c9465da8e6749c0c4760d1\"\n            )\n          }\n          style={{\n            marginBottom: 10,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingHorizontal: 20,\n          }}\n        >\n          <Feather name={\"external-link\"} color={\"#2C6EB9\"} size={15} />\n          <Text style={{ color: \"#2C6EB9\", marginLeft: 5 }}>\n            Conditions générales d'utilisation\n          </Text>\n        </TouchableOpacity>\n\n        {/* <TouchableOpacity\n          onPress={async () =>\n            await AsyncStorage.getItem(\"@idUser\").then((res) =>\n              Alert.alert(\"Identifiant unique\", res)\n            )\n          }\n          style={{\n            marginBottom: 5,\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingHorizontal: 20,\n          }}\n        >\n          <Text style={{ color: \"#2C6EB9\", marginLeft: 5 }}>\n            Obtenir mon identifiant unique\n          </Text>\n        </TouchableOpacity> */}\n\n        <Image\n          source={require(\"../../../assets/icon.png\")}\n          style={{\n            height: 40,\n            width: 40,\n            alignSelf: \"center\",\n            borderRadius: 8,\n            marginTop: 10,\n            marginBottom: 10,\n          }}\n        />\n\n        <Text style={{ textAlign: \"center\", marginBottom: 35 }}>\n          © ELYZE APP 2022\n        </Text>\n      </ScrollView>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Settings/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: \"white\",\n  },\n  headerContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n    alignItems: \"center\",\n    paddingHorizontal: 20,\n    paddingBottom: 10,\n  },\n  titleHeader: {\n    marginTop: 40,\n    fontSize: width * 0.085,\n    fontWeight: \"bold\",\n  },\n  closeButton: {\n    marginTop: 20,\n    height: 40,\n    width: 40,\n    backgroundColor: colors.primary,\n    borderRadius: 40,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  settingsCategory: {\n    marginLeft: 20,\n    fontSize: Dimensions.get('window').width*0.05,\n    textTransform: \"uppercase\",\n    marginBottom: 10,\n    marginTop: 15,\n    width: Dimensions.get(\"window\").width * 0.9,\n  },\n  noteContainer: {\n    marginHorizontal: 20,\n    backgroundColor: \"#F0F0F0\",\n    padding: 10,\n    borderRadius: 10,\n  },\n  eraseButton: {\n    marginHorizontal: 20,\n    backgroundColor: \"lightgray\",\n    padding: 10,\n    borderRadius: 10,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    marginTop: 5,\n    backgroundColor: colors.primary,\n    height: 45,\n  },\n  eraseButtonText: {\n    color: \"white\",\n    textTransform: \"uppercase\",\n    fontWeight: \"bold\",\n    fontSize: Dimensions.get('window').width*0.04,\n  },\n  helpTitleText: { fontWeight: \"bold\", marginBottom: 2, fontSize: 16 },\n  helpText: {\n    marginBottom: 5,\n  },\n  sectionContainer: {\n    backgroundColor: '#F0F0F0',\n    marginHorizontal: 20,\n    paddingVertical: 15,\n    borderRadius: 15\n  }\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Share/index.js",
    "content": "import { View, Text, Image, TouchableOpacity, Share } from \"react-native\";\nimport React, { useRef } from \"react\";\nimport styles from \"./styles\";\nimport { captureRef } from \"react-native-view-shot\";\nimport * as Sharing from \"expo-sharing\";\nimport { Feather } from \"@expo/vector-icons\";\nimport { useNavigation } from \"@react-navigation/native\";\n\nexport default function ShareToSocial({ route }) {\n  const navigation = useNavigation();\n\n  console.log(\"Premier : \", route.params.first);\n  console.log(\"Deuxième : \", route.params.second.image);\n  console.log(\"Troisième : \", route.params.third.image);\n\n  const viewRef = useRef();\n\n  // download image\n  const shareImage = async () => {\n    try {\n      // react-native-view-shot caputures component\n      const uri = await captureRef(viewRef, {\n        format: \"jpg\",\n        quality: 1.0,\n      });\n\n      console.log(uri);\n\n      if (!(await Sharing.isAvailableAsync())) {\n        alert(\n          `Le partage des résultats n'est pas disponible sur ton appareil 😣`\n        );\n        return;\n      } else {\n        const imageResultsOptions = {\n          mimeType: \"image/jpeg\",\n          dialogTitle: \"Mes résultats\",\n        };\n\n        Share.share(\n          {\n            message:\n              \"Voici mes résultats avec #Elyze à partir de \" +\n              route.params.numberOfSwipes +\n              \" votes ! @ElyzeApp sur l'App Store et le Play Store https://linktr.ee/elyze.app\",\n            url: \"file://\" + uri,\n            title: \"Wow, did you see that?\",\n          },\n          {\n            // Android only:\n            dialogTitle: \"Share BAM goodness\",\n          }\n        );\n\n        // await Sharing.shareAsync(\"file://\" + uri, imageResultsOptions);\n      }\n    } catch (e) {\n      console.log(e);\n    }\n  };\n\n  return (\n    <View style={styles.container}>\n      <Text style={styles.shareResultsText}>Partager mes résultats</Text>\n      <View ref={viewRef} style={styles.imageToShare}>\n        <View\n          style={{\n            flexDirection: \"column\",\n            alignItems: \"center\",\n          }}\n        >\n          <Image\n            style={styles.logo}\n            source={require(\"../../../assets/images/logo-header.png\")}\n          />\n          <Text>@elyze.app</Text>\n          <Text style={styles.resultsText}>Mes résultats</Text>\n          <Text style={styles.numberOfSwipesText}>\n            À partir de {route.params.numberOfSwipes} votes\n          </Text>\n        </View>\n        <View\n          style={[\n            styles.secondColumn,\n            { backgroundColor: route.params.second.bgColor },\n          ]}\n        >\n          <Image\n            style={[styles.candidateProfilImage, { borderColor: \"lightgray\" }]}\n            source={route.params.second.image}\n          />\n          <Text\n            style={{\n              color: \"white\",\n              marginTop: 5,\n              fontWeight: \"bold\",\n              fontSize: 15,\n            }}\n          >\n            #2\n          </Text>\n        </View>\n        <View\n          style={[\n            styles.firstColumn,\n            { backgroundColor: route.params.first.bgColor },\n          ]}\n        >\n          <Image\n            style={[styles.candidateProfilImage, { borderColor: \"gold\" }]}\n            source={route.params.first.image}\n          />\n          <Text\n            style={{\n              color: \"white\",\n              marginTop: 5,\n              fontWeight: \"bold\",\n              fontSize: 15,\n            }}\n          >\n            #1\n          </Text>\n        </View>\n        <View\n          style={[\n            styles.thirdColumn,\n            { backgroundColor: route.params.third.bgColor },\n          ]}\n        >\n          <Image\n            style={[styles.candidateProfilImage, { borderColor: \"#E9AB81\" }]}\n            source={route.params.third.image}\n          />\n          <Text\n            style={{\n              color: \"white\",\n              marginTop: 5,\n              fontWeight: \"bold\",\n              fontSize: 15,\n            }}\n          >\n            #3\n          </Text>\n        </View>\n      </View>\n      <TouchableOpacity\n        onPress={() => shareImage()}\n        style={styles.moreOptionButton}\n      >\n        <Feather name={\"share\"} size={20} color={\"white\"} />\n        <Text style={styles.moreOptionText}>Partager mes résultats</Text>\n      </TouchableOpacity>\n      <TouchableOpacity\n        onPress={() => navigation.goBack()}\n        style={styles.backButton}\n      >\n        <Text style={styles.moreOptionText}>Annuler</Text>\n      </TouchableOpacity>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Share/styles.js",
    "content": "import React from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst height = Dimensions.get(\"window\").height;\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  shareResultsText: {\n    marginTop: 50,\n    alignSelf: \"center\",\n    fontSize: width * 0.08,\n    paddingHorizontal: 30,\n    fontWeight: \"bold\",\n    textAlign: \"center\",\n  },\n  imageToShare: {\n    position: \"absolute\",\n    top: height * 0.25,\n    alignSelf: \"center\",\n    height: width * 0.75,\n    width: width * 0.75,\n    backgroundColor: \"white\",\n    flexDirection: \"row\",\n    justifyContent: \"center\",\n    // borderRadius: 15,\n    borderWidth: 10,\n    borderColor: \"#516DF5\",\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.23,\n    shadowRadius: 2.62,\n\n    elevation: 4,\n  },\n  logo: {\n    height: width * 0.1,\n    width: width * 0.3,\n    marginTop: 15,\n  },\n  resultsText: {\n    marginTop: 2,\n    fontSize: width * 0.06,\n    fontWeight: \"bold\",\n  },\n  numberOfSwipesText: {\n    textTransform: \"uppercase\",\n    fontSize: width * 0.04,\n    marginTop: 5,\n  },\n  firstColumn: {\n    position: \"absolute\",\n    bottom: 0,\n    // left: 120,\n    width: width * 0.17,\n    height: height * 0.15,\n    borderTopLeftRadius: 10,\n    borderTopRightRadius: 10,\n    alignItems: \"center\",\n  },\n  secondColumn: {\n    position: \"absolute\",\n    bottom: 0,\n    left: width * 0.05,\n    width: width * 0.17,\n    height: height * 0.11,\n    borderTopLeftRadius: 10,\n    borderTopRightRadius: 10,\n    alignItems: \"center\",\n  },\n  thirdColumn: {\n    position: \"absolute\",\n    bottom: 0,\n    right: width * 0.05,\n    width: width * 0.17,\n    height: height * 0.09,\n    borderTopLeftRadius: 10,\n    borderTopRightRadius: 10,\n    alignItems: \"center\",\n  },\n  candidateProfilImage: {\n    height: width * 0.12,\n    width: width * 0.12,\n    marginTop: -height * 0.02,\n    backgroundColor: \"white\",\n    resizeMode: \"contain\",\n    borderWidth: 4,\n    borderColor: \"black\",\n    borderRadius: 50,\n  },\n  moreOptionButton: {\n    position: \"absolute\",\n    bottom: height * 0.15,\n    alignSelf: \"center\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    width: \"80%\",\n    height: width * 0.135,\n    backgroundColor: colors.primary,\n    borderRadius: 10,\n    flexDirection: \"row\",\n  },\n  moreOptionText: {\n    color: \"white\",\n    fontSize: 17,\n    fontWeight: \"bold\",\n    marginLeft: 7,\n  },\n  backButton: {\n    position: \"absolute\",\n    bottom: height * 0.06,\n    alignSelf: \"center\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    width: \"80%\",\n    height: width * 0.135,\n    backgroundColor: colors.primary,\n    borderRadius: 10,\n    flexDirection: \"row\",\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/Team/index.js",
    "content": "import { View, Text, FlatList } from \"react-native\";\nimport React, { useState, useEffect } from \"react\";\nimport team from \"../../../assets/data/team\";\nimport TeamCard from \"../../components/teamCard\";\nimport styles from './styles'\n\nexport default function Team() {\n  const [com, setCom] = useState([]);\n\n  useEffect(() => {\n    const comTeam = team.filter((e) => e.role === \"com\");\n\n    console.log(comTeam);\n\n    setCom(comTeam);\n  }, []);\n\n  return (\n    <View style={styles.container}>\n      <Text style={styles.teamTitle}>L'équipe</Text>\n\n      <FlatList\n        data={com}\n        keyExtractor={(item) => item.id}\n        showsVerticalScrollIndicator={false}\n        renderItem={({ item }) => (\n          <TeamCard\n            profile={{\n              id: 1,\n              firstName: item.firstName,\n              lastName: item.lastName,\n              role: \"Co-créateur\",\n              social: item.social,\n              imageURI: item.imageURI,\n            }}\n\n            showImage={false}\n          />\n        )}\n      />\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/Team/styles.js",
    "content": "import React from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\n\nconst width = Dimensions.get('window').width;\n\nconst styles = StyleSheet.create({\n    container: {\n        flex: 1,\n        paddingHorizontal: 20,\n    },\n    teamTitle: {\n        fontSize: width*0.09,\n        marginBottom: 15,\n        marginTop: 30,\n        fontWeight: 'bold'\n    }\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/ThemeByCandidate/index.js",
    "content": "import React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n  Dimensions,\n  ActivityIndicator,\n  FlatList,\n  TouchableOpacity,\n} from \"react-native\";\nimport findThemeTitle from \"../../../assets/queries/findThemeTitle\";\nimport ThemeHeader from \"../../components/ThemeHeader\";\nimport styles from \"./styles\";\nimport PropositionListCard from \"../../components/PropositionListCard\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport { API, graphqlOperation } from \"aws-amplify\";\n\nimport firstPropositions from \"../../../assets/data/propositions/firstPropositions\";\nimport propositionsList from \"../../../assets/data/propositions/propositionsList\";\n\nvar firstPropositionsArray = JSON.parse(JSON.stringify(firstPropositions));\nvar propositionsListArray = JSON.parse(JSON.stringify(propositionsList));\n\nvar allPropositions = firstPropositionsArray.concat(propositionsListArray);\n\nexport default function ThemeByCandidate({ route }) {\n  const themeDetails = route.params;\n\n  const navigation = useNavigation();\n\n  const [themeInfo, setThemeInfo] = useState([]);\n  const [propositionListForCandidate, setPropositionListForCandidate] =\n    useState([]);\n  const [loaded, setLoaded] = useState(false);\n\n  useEffect(async () => {\n    setThemeInfo(findThemeTitle(themeDetails.idTheme));\n\n    var propositionsForThemeAndCandidate = allPropositions.filter(\n      (proposition) =>\n        proposition.idTheme == themeDetails.idTheme &&\n        proposition.idCandidat == themeDetails.idCandidat\n    );\n\n    propositionsForThemeAndCandidate.sort((a, b) =>\n      a.title.localeCompare(b.title)\n    );\n\n    setPropositionListForCandidate(propositionsForThemeAndCandidate);\n  }, []);\n\n  useEffect(() => {\n    setLoaded(true);\n  }, [propositionListForCandidate]);\n\n  if (loaded) {\n    // console.log(\"Propositions : \", propositionListForCandidate);\n\n    return (\n      <View style={styles.container}>\n        <ThemeHeader\n          title={themeInfo[0].title}\n          iconType={themeInfo[0].iconType}\n          lightColor={themeInfo[0].lightColor}\n          darkColor={themeInfo[0].darkColor}\n          iconTitle={themeInfo[0].iconTitle}\n        />\n\n        <Text\n          style={{\n            textTransform: \"uppercase\",\n            paddingVertical: 15,\n            paddingHorizontal: 20,\n          }}\n        >\n          PROPOSÉ PAR {themeDetails.candidateFirstName}{\" \"}\n          {themeDetails.candidateLastName}\n        </Text>\n\n        <FlatList\n          data={propositionListForCandidate}\n          keyExtractor={(item) => item.id}\n          showsVerticalScrollIndicator={false}\n          renderItem={({ item }) => {\n            console.log('Proposition du candidat : ', item)\n            return (\n            <TouchableOpacity\n              onPress={() =>\n                navigation.navigate(\"PropositionDetails\", {\n                  title: item.title,\n                  theme: item.idTheme,\n                  articleContent: item.articleContent,\n                  idCandidat: item.idCandidat,\n                  source: item.source,\n                  id: item.id,\n                  showCandidateInfo: true,\n                })\n              }\n            >\n              <PropositionListCard proposition={item} />\n            </TouchableOpacity>\n            // <Text>{item.title}</Text>\n          )}}\n        />\n      </View>\n    );\n  } else {\n    return (\n      <View style={{ flex: 1, justifyContent: \"center\", alignItems: \"center\" }}>\n        <ActivityIndicator size={\"large\"} />\n      </View>\n    );\n  }\n}\n"
  },
  {
    "path": "src/screens/ThemeByCandidate/styles.js",
    "content": "import react from \"react\";\nimport { StyleSheet, Dimensions } from \"react-native\";\n\nconst styles = StyleSheet.create({\n    container: {\n        flex: 1,\n    },\n  header: {\n    justifyContent: \"flex-end\",\n    overflow: \"hidden\",\n    height: Dimensions.get(\"window\").height * 0.2,\n  },\n  headerTextAndIconContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n  },\n});\n\nexport default styles;\n"
  },
  {
    "path": "src/screens/UserInfo/index.js",
    "content": "import React, { useEffect, useState } from \"react\";\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  ScrollView,\n  Alert,\n  ActivityIndicator,\n} from \"react-native\";\nimport styles from \"./styles\";\nimport { AntDesign } from \"@expo/vector-icons\";\nimport { useNavigation } from \"@react-navigation/core\";\nimport AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { Entypo } from \"@expo/vector-icons\";\nimport colors from \"../../../assets/colors/colors\";\nimport { Picker } from \"@react-native-picker/picker\";\nimport { API, graphqlOperation } from \"aws-amplify\";\nimport getPropositionDetails from \"../../../assets/queries/getPropositionDetails\";\nimport { Feather } from \"@expo/vector-icons\";\nimport * as Linking from \"expo-linking\";\nimport { isEmpty } from \"lodash\";\n\nexport default function UserInfo({ route }) {\n  const navigation = useNavigation();\n\n  const [totalSwipes, setTotalSwipes] = useState(0);\n  const [mostLikedPropositionDetails, setMostLikedPropositionDetails] =\n    useState([]);\n\n  useEffect(() => {\n    if (route.params) {\n      const { newBirthDay, newBirthMonth, newBirthYear, newPostalCode } =\n        route.params;\n\n      if (newBirthDay) {\n        setUserDayOfBirth(newBirthDay);\n        setUserMonthOfBirth(newBirthMonth);\n        setUserYearOfBirth(newBirthYear);\n      } else if (newPostalCode) {\n        setPostalCode(newPostalCode);\n      }\n    }\n  }, [route.params]);\n\n  function getMostReccurentResult(arr) {\n    return arr\n      .sort(\n        (a, b) =>\n          arr.filter((v) => v === a).length - arr.filter((v) => v === b).length\n      )\n      .pop();\n  }\n\n  const [userDayOfBirth, setUserDayOfBirth] = useState(0);\n  const [userMonthOfBirth, setUserMonthOfBirth] = useState(0);\n  const [userYearOfBirth, setUserYearOfBirth] = useState(0);\n\n  const [userGenre, setUserGenre] = useState(0);\n\n  const [postalCode, setPostalCode] = useState(\"\");\n  const [userID, setUserID] = useState(\"\");\n\n  const [oldVoteDecision, setOldVoteDecision] = useState(\"\");\n  const [oldVoteCandidate, setOldVoteCandidate] = useState(\"\");\n  const [newVoteCandidate, setNewVoteCandidate] = useState(\"\");\n\n  useEffect(async () => {\n    try {\n      await AsyncStorage.getItem(\"@userDayOfBirth\").then((response) =>\n        setUserDayOfBirth(response)\n      );\n\n      await AsyncStorage.getItem(\"@userMonthOfBirth\").then((response) =>\n        setUserMonthOfBirth(response)\n      );\n\n      await AsyncStorage.getItem(\"@userYearOfBirth\").then((response) =>\n        setUserYearOfBirth(response)\n      );\n\n      await AsyncStorage.getItem(\"@userGenre\").then((response) =>\n        setUserGenre(response)\n      );\n\n      await AsyncStorage.getItem(\"@postalCode\").then((response) =>\n        setPostalCode(response)\n      );\n      await AsyncStorage.getItem(\"@idUser\").then(async (responseIDUser) => {\n        setUserID(responseIDUser);\n\n        const getUserOldVote =\n          `query getUserOldVote {\n        getUserInfo(id: \"` +\n          responseIDUser +\n          `\") {\n          haveVoted\n          haveVotedFor\n        }\n      }`;\n\n        await API.graphql(graphqlOperation(getUserOldVote)).then((response) => {\n          if (response.data.getUserInfo.haveVoted !== \"\") {\n            if (response.data.getUserInfo.haveVoted == 1) {\n              setOldVoteDecision(\"haveVoted\");\n              setOldVoteCandidate(response.data.getUserInfo.haveVotedFor);\n            } else if (response.data.getUserInfo.haveVoted == 2) {\n              setOldVoteDecision(\"haventVoted\");\n            } else if (response.data.getUserInfo.haveVoted == 3) {\n              setOldVoteDecision(\"noRight\");\n            }\n          }\n        });\n      });\n\n      await AsyncStorage.getItem(\"@oldVoteDecision\").then((response) => {\n        if (response == null) {\n          console.log(\"N'a pas encore choisi\");\n        } else if (response == \"noRight\") {\n          console.log(\"Il n'avait pas le droit\");\n        } else if (response == \"haveVoted\") {\n          console.log(\"Il avait voté\");\n        } else if (response == \"haventVote\") {\n          console.log(\"N'avait pas voté\");\n        }\n      });\n\n      await AsyncStorage.getItem(\"@oldVoteCandidate\").then((response) => {\n        if (response !== null) {\n          setOldVoteCandidate(response);\n        }\n      });\n\n      await AsyncStorage.getItem(\"@newVoteCandidate\").then((response) => {\n        if (response !== null) {\n          setNewVoteCandidate(response);\n        }\n      });\n    } catch (e) {\n      console.log(e);\n    }\n\n    const getTotalSwipeNumber = `query totalNumberSwipes {\n          listSwipeStats(limit:1000000) {\n            items {\n              id\n            }\n          }\n        }`;\n\n    try {\n      await API.graphql(graphqlOperation(getTotalSwipeNumber)).then(\n        (response) => {\n          setTotalSwipes(response.data.listSwipeStats.items.length);\n          console.log(response.data.listSwipeStats.items.length);\n        }\n      );\n    } catch (e) {\n      console.log(e);\n    }\n\n    const getMostReccuringLikes = `query mostReccuringLikes {\n          listSwipeStats(filter: {rating: {eq: \"like\"}}, limit: 10000000) {\n            items {\n              idProposition\n            }\n          }\n        }`;\n\n    try {\n      await API.graphql(graphqlOperation(getMostReccuringLikes)).then(\n        (response) => {\n          const reccuringPropositionID = getMostReccurentResult(\n            response.data.listSwipeStats.items\n          ).idProposition;\n          const propositionDetails = getPropositionDetails(\n            parseInt(reccuringPropositionID)\n          );\n\n          setMostLikedPropositionDetails(propositionDetails[0]);\n        }\n      );\n    } catch (e) {\n      console.log(e);\n    }\n  }, []);\n\n  const updateOldVote = async () => {\n    if (oldVoteDecision !== \"\") {\n      if (oldVoteDecision == \"haveVoted\") {\n        if (oldVoteCandidate !== null) {\n          // haveVoted : 1 -> Oui, 2 -> Non, 3 -> N'avait pas le droit\n\n          if (oldVoteCandidate == \"\") {\n            setOldVoteCandidate(\"not-shared\");\n          }\n\n          // Met à jour AWS\n\n          const updateUserOldVoteCandidate =\n            `mutation updateUserOldVote {\n                updateUserInfo(input: {id: \"` +\n            userID +\n            `\", haveVotedFor: \"` +\n            oldVoteCandidate +\n            `\", haveVoted: 1}) {\n                  id\n                }\n              }`;\n\n          try {\n            await API.graphql(\n              graphqlOperation(updateUserOldVoteCandidate)\n            ).then(async () => {\n              // Met à jour AsyncStorage\n              await AsyncStorage.setItem(\"@oldVoteDecision\", \"haveVoted\").then(\n                () =>\n                  Alert.alert(\n                    \"Informations mises à jour\",\n                    \"Tes informations ont été mises à jour avec succès\"\n                  )\n              );\n            });\n          } catch (e) {\n            Alert.alert(\n              \"Erreur\",\n              \"Une erreur s'est produite lors de la mise à jour de vos informations\"\n            );\n            console.log(e);\n          }\n        }\n      } else if (oldVoteDecision == \"haventVoted\") {\n        const updateUserOldVoteCandidate =\n          `mutation updateUserOldVote {\n                updateUserInfo(input: {id: \"` +\n          userID +\n          `\", haveVotedFor: \"\", haveVoted: 2}) {\n                  id\n                }\n              }`;\n\n        try {\n          await API.graphql(graphqlOperation(updateUserOldVoteCandidate)).then(\n            async () => {\n              // Met à jour AsyncStorage\n              await AsyncStorage.setItem(\n                \"@oldVoteDecision\",\n                \"haventVoted\"\n              ).then(() =>\n                Alert.alert(\n                  \"Informations mises à jour\",\n                  \"Tes informations ont été mises à jour avec succès\"\n                )\n              );\n            }\n          );\n        } catch (e) {\n          Alert.alert(\n            \"Oups 😖\",\n            \"Une erreur s'est produite lors de la mise à jour de tes informations\"\n          );\n          console.log(e);\n        }\n      } else if (oldVoteDecision == \"noRight\") {\n        const updateUserOldVoteCandidate =\n          `mutation updateUserOldVote {\n              updateUserInfo(input: {id: \"` +\n          userID +\n          `\", haveVotedFor: \"\", haveVoted: 3}) {\n                id\n              }\n            }`;\n\n        try {\n          await API.graphql(graphqlOperation(updateUserOldVoteCandidate)).then(\n            async () => {\n              // Met à jour AsyncStorage\n              await AsyncStorage.setItem(\"@oldVoteDecision\", \"noRight\").then(\n                () =>\n                  Alert.alert(\n                    \"Informations mises à jour\",\n                    \"Tes informations ont été mises à jour avec succès\"\n                  )\n              );\n            }\n          );\n        } catch (e) {\n          Alert.alert(\n            \"Oups 😖\",\n            \"Une erreur s'est produite lors de la mise à jour de tes informations\"\n          );\n          console.log(e);\n        }\n      }\n    }\n  };\n\n  const updateNewVoteCandidate = async () => {\n    console.log(\n      \"Mise à jour du candidat pour qui l'utilisateur veut voter en 2022\"\n    );\n\n    if (newVoteCandidate !== null) {\n      // Update AWS\n\n      const updateNewUserVoteRequest =\n        `mutation updateNewUserVote {\n            updateUserInfo(input: {id: \"` +\n        userID +\n        `\", willVoteFor: \"` +\n        newVoteCandidate +\n        `\"}) {\n              id\n            }\n          }`;\n\n      try {\n        await API.graphql(graphqlOperation(updateNewUserVoteRequest)).then(\n          async () => {\n            // Update AsyncStorage\n            await AsyncStorage.setItem(\n              \"@newVoteCandidate\",\n              newVoteCandidate\n            ).then(() => {\n              Alert.alert(\n                \"Informations mises à jour\",\n                \"Tes informations ont été mises à jour avec succès\"\n              );\n            });\n          }\n        );\n      } catch (e) {\n        Alert.alert(\"Erreur\", \"Réessaye dans quelques instants\");\n      }\n    }\n  };\n\n  return (\n    <View style={styles.container}>\n      <View style={styles.headerContainer}>\n        <Text style={styles.titleHeader}>Mes informations</Text>\n        <TouchableOpacity\n          onPress={() => navigation.goBack()}\n          style={styles.closeButton}\n        >\n          <AntDesign name={\"close\"} size={22} color={\"white\"} />\n        </TouchableOpacity>\n      </View>\n\n      <ScrollView>\n        <Text style={styles.settingsCategory}>INFORMATIONS PERSONNELLES</Text>\n\n        <View\n          style={{\n            width: \"90%\",\n            backgroundColor: \"#F0F0F0\",\n            alignSelf: \"center\",\n            borderRadius: 10,\n            paddingHorizontal: 10,\n            paddingVertical: 15,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            justifyContent: \"space-between\",\n          }}\n        >\n          <Text style={{ fontSize: 15 }}>\n            Date de naissance :{\" \"}\n            {userDayOfBirth == 0 &&\n            userMonthOfBirth == 0 &&\n            userYearOfBirth == 0\n              ? \"non renseigné\"\n              : userDayOfBirth.length == 1\n              ? \"0\" +\n                userDayOfBirth +\n                \"/\" +\n                userMonthOfBirth +\n                \"/\" +\n                userYearOfBirth\n              : userDayOfBirth + \"/\" + userMonthOfBirth + \"/\" + userYearOfBirth}\n          </Text>\n        </View>\n\n        <View\n          style={{\n            width: \"90%\",\n            backgroundColor: \"#F0F0F0\",\n            alignSelf: \"center\",\n            borderRadius: 10,\n            paddingHorizontal: 10,\n            paddingVertical: 15,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            justifyContent: \"space-between\",\n            marginTop: 10,\n          }}\n        >\n          <Text style={{ fontSize: 15 }}>\n            Genre :{\" \"}\n            {userGenre == \"0\"\n              ? \"non renseigné\"\n              : userGenre == \"1\"\n              ? \"Homme\"\n              : userGenre == \"2\"\n              ? \"Femme\"\n              : userGenre == \"3\"\n              ? \"ne souhaite pas répondre\"\n              : null}\n          </Text>\n        </View>\n\n        <TouchableOpacity\n          onPress={() =>\n            navigation.navigate(\"EditUserInfo\", {\n              toEdit: \"postalCode\",\n            })\n          }\n          style={{\n            width: \"90%\",\n            backgroundColor: \"#F0F0F0\",\n            alignSelf: \"center\",\n            borderRadius: 10,\n            paddingHorizontal: 10,\n            paddingVertical: 15,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            justifyContent: \"space-between\",\n            marginTop: 10,\n          }}\n        >\n          <Text style={{ fontSize: 15 }}>\n            Code postal : {postalCode == \"0\" ? \"non renseigné\" : postalCode}\n          </Text>\n          <Entypo name={\"chevron-right\"} size={20} />\n        </TouchableOpacity>\n\n        <Text style={styles.settingsCategory}>MES INTENTIONS DE VOTE</Text>\n\n        <TouchableOpacity\n          onPress={() => {\n            Alert.alert(\n              \"🕵️ Pourquoi ELYZE me demande ces informations ?\",\n              \"Pour te fournir un service davantage personnalisé et efficace, tu peux nous fournir tes intentions de vote pour les élections présidentielles de 2017 et de 2022. Ces données restent anonymes et tu peux les modifier ou les supprimer à tout moment. Pour en savoir plus, tu peux consulter notre politique de confidentialité.\"\n            );\n          }}\n          style={{\n            backgroundColor: \"#E1C356\",\n            width: \"90%\",\n            borderRadius: 10,\n            justifyContent: \"space-between\",\n            flexDirection: \"row\",\n            paddingHorizontal: 10,\n            paddingVertical: 10,\n            alignItems: \"center\",\n            marginBottom: 10,\n            alignSelf: \"center\",\n          }}\n        >\n          <View style={{ flexDirection: \"row\", alignItems: \"center\" }}>\n            <Text>💡</Text>\n            <Text style={{ marginLeft: 10, color: \"white\", width: \"80%\" }}>\n              Tu n'es pas obligé de fournir ces informations : ELYZE ne les\n              récolte qu'à des fins de statistiques. Appuie pour en savoir plus.\n            </Text>\n          </View>\n          <View style={{ marginRight: 5 }}>\n            <AntDesign name={\"pluscircle\"} size={20} color={\"white\"} />\n          </View>\n        </TouchableOpacity>\n\n        <View style={styles.sectionContainer}>\n          <Text style={styles.subCategory}>\n            As-tu voté aux élections présidentielles de 2017 ?\n          </Text>\n\n          <View\n            style={{\n              alignItems: \"center\",\n              justifyContent: \"space-evenly\",\n              flexDirection: \"row\",\n              marginTop: 10,\n            }}\n          >\n            <TouchableOpacity\n              onPress={() => setOldVoteDecision(\"haveVoted\")}\n              style={{\n                width: \"44%\",\n                height: 50,\n                backgroundColor:\n                  oldVoteDecision == \"haveVoted\" ? colors.primary : \"white\",\n                borderRadius: 10,\n                justifyContent: \"center\",\n                alignItems: \"center\",\n              }}\n            >\n              <Text>👍</Text>\n            </TouchableOpacity>\n            <TouchableOpacity\n              onPress={() => {\n                setOldVoteDecision(\"haventVoted\");\n                setOldVoteCandidate(\"\");\n              }}\n              style={{\n                width: \"44%\",\n                height: 50,\n                backgroundColor:\n                  oldVoteDecision == \"haventVoted\" ? colors.primary : \"white\",\n                borderRadius: 10,\n                justifyContent: \"center\",\n                alignItems: \"center\",\n              }}\n            >\n              <Text>👎</Text>\n            </TouchableOpacity>\n          </View>\n          <View>\n            <TouchableOpacity\n              onPress={() => {\n                setOldVoteDecision(\"noRight\");\n                setOldVoteCandidate(\"\");\n              }}\n              style={{\n                width: \"90%\",\n                height: 50,\n                backgroundColor:\n                  oldVoteDecision == \"noRight\" ? colors.primary : \"white\",\n                marginTop: 10,\n                alignSelf: \"center\",\n                borderRadius: 10,\n                justifyContent: \"center\",\n                alignItems: \"center\",\n              }}\n            >\n              <Text\n                style={{\n                  color: oldVoteDecision == \"noRight\" ? \"white\" : \"black\",\n                  fontSize: 15,\n                  fontWeight: \"bold\",\n                }}\n              >\n                JE N'AVAIS PAS LE DROIT 🤷‍♀️\n              </Text>\n            </TouchableOpacity>\n          </View>\n\n          {oldVoteDecision == \"haveVoted\" ? (\n            <View>\n              <Picker\n                style={{ marginHorizontal: 10 }}\n                selectedValue={oldVoteCandidate}\n                onValueChange={(itemValue) => {\n                  setOldVoteCandidate(itemValue);\n                }}\n              >\n                <Picker.Item\n                  label={\"Ne souhaite pas répondre\"}\n                  value={\"not-shared\"}\n                />\n                <Picker.Item label={\"Nathalie Arthaud\"} value={\"arthaud\"} />\n                <Picker.Item\n                  label={\"François Asselineau\"}\n                  value={\"asselineau\"}\n                />\n                <Picker.Item label={\"Jacques Cheminade\"} value={\"cheminade\"} />\n                <Picker.Item\n                  label={\"Nicolas Dupont-Aignan\"}\n                  value={\"dupont-aignan\"}\n                />\n                <Picker.Item label={\"François Fillon\"} value={\"fillon\"} />\n                <Picker.Item label={\"Benoît Hamon\"} value={\"hamont\"} />\n                <Picker.Item label={\"Jean Lassalle\"} value={\"lassalle\"} />\n                <Picker.Item label={\"Marine Le Pen\"} value={\"le-pen\"} />\n                <Picker.Item label={\"Emmanuel Macron\"} value={\"macron\"} />\n                <Picker.Item label={\"Jean-Luc Mélenchon\"} value={\"melenchon\"} />\n                <Picker.Item label={\"Philippe Poutou\"} value={\"poutou\"} />\n              </Picker>\n            </View>\n          ) : null}\n\n          <TouchableOpacity\n            style={{\n              width: \"90%\",\n              height: 50,\n              backgroundColor: colors.primary,\n              marginTop: 10,\n              alignSelf: \"center\",\n              borderRadius: 10,\n              justifyContent: \"center\",\n              alignItems: \"center\",\n            }}\n            onPress={() => {\n              updateOldVote();\n            }}\n          >\n            <Text\n              style={{\n                color: \"white\",\n                fontWeight: \"bold\",\n                fontSize: 20,\n                textTransform: \"uppercase\",\n              }}\n            >\n              Mettre à jour\n            </Text>\n          </TouchableOpacity>\n        </View>\n\n        <View style={[styles.sectionContainer, { marginTop: 15 }]}>\n          <Text style={styles.subCategory}>\n            Pour qui penses-tu voter aux élections présidentielles de 2022 ?\n          </Text>\n\n          <Picker\n            style={{ marginHorizontal: 10 }}\n            selectedValue={newVoteCandidate}\n            onValueChange={(itemValue) => {\n              setNewVoteCandidate(itemValue);\n            }}\n          >\n            <Picker.Item\n              label={\"Ne souhaite pas répondre\"}\n              value={\"not-shared\"}\n            />\n            <Picker.Item label={\"😣 Aucune idée\"} value={\"no-idea\"} />\n            <Picker.Item label={\"Nathalie Arthaud\"} value={\"arthaud\"} />\n            <Picker.Item label={\"François Asselineau\"} value={\"asselineau\"} />\n            <Picker.Item\n              label={\"Nicolas Dupont-Aignan\"}\n              value={\"dupont-aignan\"}\n            />\n            <Picker.Item label={\"Anne Hidalgo\"} value={\"hidalgo\"} />\n            <Picker.Item label={\"Yannick Jadot\"} value={\"jadot\"} />\n            <Picker.Item label={\"Jean Lassalle\"} value={\"lassalle\"} />\n            <Picker.Item label={\"Marine Le Pen\"} value={\"le-pen\"} />\n            <Picker.Item label={\"Emmanuel Macron\"} value={\"macron\"} />\n            <Picker.Item label={\"Jean-Luc Mélenchon\"} value={\"melenchon\"} />\n            <Picker.Item label={\"Arnaud Montebourg\"} value={\"montebourg\"} />\n            <Picker.Item label={\"Valérie Pécresse\"} value={\"pecresse\"} />\n            <Picker.Item label={\"Florian Philippot\"} value={\"philippot\"} />\n            <Picker.Item label={\"Philippe Poutou\"} value={\"poutou\"} />\n            <Picker.Item label={\"Fabien Roussel\"} value={\"roussel\"} />\n            <Picker.Item label={\"Éric Zemmour\"} value={\"zemmour\"} />\n          </Picker>\n\n          <TouchableOpacity\n            onPress={() => updateNewVoteCandidate()}\n            style={{\n              width: \"90%\",\n              height: 50,\n              backgroundColor: colors.primary,\n              marginTop: 10,\n              alignSelf: \"center\",\n              borderRadius: 10,\n              justifyContent: \"center\",\n              alignItems: \"center\",\n            }}\n          >\n            <Text\n              style={{\n                color: \"white\",\n                fontWeight: \"bold\",\n                fontSize: 20,\n                textTransform: \"uppercase\",\n              }}\n            >\n              Mettre à jour\n            </Text>\n          </TouchableOpacity>\n        </View>\n\n        {/* <Text style={styles.settingsCategory}>STATISTIQUES GLOBALES</Text> */}\n\n        {/* <View\n          style={[\n            styles.sectionContainer,\n            { backgroundColor: \"#DCC468\", alignItems: \"center\" },\n          ]}\n        >\n          <Text style={{ fontSize: 35, marginBottom: 10 }}>🗳</Text>\n          <Text style={styles.sectionTitle}>\n            Nombre total de swipes réalisés sur ELYZE par l'ensemble des\n            utilisateurs\n          </Text>\n          {totalSwipes == 0 ? (\n            <ActivityIndicator\n              style={{ marginTop: 20, marginBottom: 20 }}\n              size={\"small\"}\n              color={\"white\"}\n            />\n          ) : (\n            <View style={{ justifyContent: \"center\", alignItems: \"center\" }}>\n              <Text style={styles.dataText}>\n                {totalSwipes == 0 ? \"...\" : totalSwipes} swipes\n              </Text>\n              <Text style={{ marginTop: 5, color: \"white\" }}>\n                (depuis le 31/12/2021)\n              </Text>\n            </View>\n          )}\n        </View>\n\n        <View\n          style={[\n            styles.sectionContainer,\n            { backgroundColor: \"#D85F71\", alignItems: \"center\", marginTop: 15 },\n          ]}\n        >\n          <Text style={{ fontSize: 35, marginBottom: 10 }}>👀</Text>\n          <Text style={styles.sectionTitle}>Proposition la plus populaire</Text>\n          {mostLikedPropositionDetails.title == \"\" ? (\n            <ActivityIndicator size={\"small\"} color={\"white\"} />\n          ) : (\n            <Text\n              style={{\n                textAlign: \"center\",\n                marginTop: 10,\n                fontSize: 18,\n                marginHorizontal: 20,\n                color: \"white\",\n                fontWeight: \"300\",\n              }}\n            >\n              {mostLikedPropositionDetails.title}\n            </Text>\n          )}\n        </View> */}\n\n        <TouchableOpacity\n          onPress={() =>\n            Linking.openURL(\n              \"https://nifty-option-15c.notion.site/Politique-de-confidentialit-d-ELYZE-563c3cdb31c9465da8e6749c0c4760d1\"\n            )\n          }\n          style={{\n            marginTop: 15,\n            marginBottom: 5,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingHorizontal: 20,\n          }}\n        >\n          <Feather name={\"external-link\"} color={\"#2C6EB9\"} size={15} />\n          <Text style={{ color: \"#2C6EB9\", marginLeft: 5 }}>\n            Politique de confidentialité & CGU\n          </Text>\n        </TouchableOpacity>\n\n        <TouchableOpacity\n          onPress={async () =>\n            await AsyncStorage.getItem(\"@idUser\").then((res) => Alert.alert('Identifiant unique', res))\n          }\n          style={{\n            marginTop: 5,\n            marginBottom: 5,\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingHorizontal: 20,\n          }}\n        >\n          <Text style={{ color: \"#2C6EB9\", marginLeft: 5 }}>\n            Obtenir mon identifiant unique\n          </Text>\n        </TouchableOpacity>\n\n        <TouchableOpacity\n          onPress={async () => {\n            if (userID !== \"\") {\n              const deleteDataRequest =\n                `mutation deleteUserInfo {\n                    updateUserInfo(input: {id: \"` +\n                userID +\n                `\", postalCode: \"0\", willVoteFor: \"\", haveVotedFor: \"\", haveVoted: 0, dayBirth: 0, monthBirth: 0, yearBirth: 0, genre: 0}) {\n                      id\n                    }\n                  }\n                  `;\n\n              try {\n                await API.graphql(graphqlOperation(deleteDataRequest)).then(\n                  async () => {\n                    await AsyncStorage.setItem(\"@oldVoteDecision\", \"\");\n                    await AsyncStorage.setItem(\"@oldVoteCandidate\", \"\");\n                    await AsyncStorage.setItem(\"@newVoteCandidate\", \"\");\n                    await AsyncStorage.setItem(\"@postalCode\", \"0\");\n                    await AsyncStorage.setItem(\"@userGenre\", \"0\");\n                    await AsyncStorage.setItem(\"@userDayOfBirth\", \"0\");\n                    await AsyncStorage.setItem(\"@userMonthOfBirth\", \"0\");\n                    await AsyncStorage.setItem(\"@userYearOfBirth\", \"0\").then(\n                      () => {\n                        Alert.alert(\n                          \"Données supprimées\",\n                          \"Tes informations ont bien été supprimées de nos serveurs, il est cependant possible que celles-ci s'affichent toujours pendant un cours instant sur ton écran.\"\n                        );\n                      }\n                    );\n                  }\n                );\n              } catch (e) {\n                Alert.alert(\"Erreur\", \"Réessaye dans quelques instants\");\n              }\n            } else {\n              Alert.alert(\"Erreur\", \"Réessaye dans quelques instants\");\n            }\n          }}\n          style={{ marginTop: 5, marginBottom: 60, marginHorizontal: 10 }}\n        >\n          <Text style={{ textAlign: \"center\", fontSize: 18 }}>\n            Supprimer mes données\n          </Text>\n        </TouchableOpacity>\n      </ScrollView>\n    </View>\n  );\n}\n"
  },
  {
    "path": "src/screens/UserInfo/styles.js",
    "content": "import react from \"react\";\nimport { Dimensions, StyleSheet } from \"react-native\";\nimport colors from \"../../../assets/colors/colors\";\n\nconst width = Dimensions.get(\"window\").width;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: \"white\",\n  },\n  headerContainer: {\n    flexDirection: \"row\",\n    justifyContent: \"space-between\",\n    alignItems: \"center\",\n    paddingHorizontal: 20,\n    paddingBottom: 10,\n  },\n  titleHeader: {\n    marginTop: 40,\n    fontSize: width * 0.085,\n    fontWeight: \"bold\",\n  },\n  closeButton: {\n    marginTop: 20,\n    height: 40,\n    width: 40,\n    backgroundColor: colors.primary,\n    borderRadius: 40,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  settingsCategory: {\n    marginLeft: 20,\n    fontSize: Dimensions.get(\"window\").width * 0.04,\n    textTransform: \"uppercase\",\n    marginBottom: 10,\n    marginTop: 15,\n    width: Dimensions.get(\"window\").width * 0.9,\n  },\n  noteContainer: {\n    marginHorizontal: 20,\n    backgroundColor: \"#F0F0F0\",\n    padding: 10,\n    borderRadius: 10,\n  },\n  subCategory: {\n    marginHorizontal: 20,\n    fontSize: Dimensions.get(\"window\").width * 0.04,\n  },\n  sectionContainer: {\n    backgroundColor: \"#F0F0F0\",\n    marginHorizontal: 20,\n    paddingVertical: 15,\n    borderRadius: 15,\n  },\n  sectionTitle: {\n    marginHorizontal: 20,\n    textAlign: \"center\",\n    fontSize: 20,\n    fontWeight: \"500\",\n    color: \"white\",\n  },\n  dataText: {\n    marginTop: 20,\n    fontSize: 30,\n    fontWeight: \"bold\",\n    color: \"white\",\n  },\n});\n\nexport default styles;\n"
  }
]