/** * REST API: WP_REST_Post_Types_Controller class * * @package WordPress * @subpackage REST_API * @since 4.7.0 */ /** * Core class to access post types via the REST API. * * @since 4.7.0 * * @see WP_REST_Controller */ class WP_REST_Post_Types_Controller extends WP_REST_Controller { /** * Constructor. * * @since 4.7.0 */ public function __construct() { $this->namespace = 'wp/v2'; $this->rest_base = 'types'; } /** * Registers the routes for post types. * * @since 4.7.0 * * @see register_rest_route() */ public function register_routes() { register_rest_route( $this->namespace, '/' . $this->rest_base, array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_items' ), 'permission_callback' => array( $this, 'get_items_permissions_check' ), 'args' => $this->get_collection_params(), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( 'args' => array( 'type' => array( 'description' => __( 'An alphanumeric identifier for the post type.' ), 'type' => 'string', ), ), array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => '__return_true', 'args' => array( 'context' => $this->get_context_param( array( 'default' => 'view' ) ), ), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); } /** * Checks whether a given request has permission to read types. * * @since 4.7.0 * * @param WP_REST_Request $request Full details about the request. * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function get_items_permissions_check( $request ) { if ( 'edit' === $request['context'] ) { $types = get_post_types( array( 'show_in_rest' => true ), 'objects' ); foreach ( $types as $type ) { if ( current_user_can( $type->cap->edit_posts ) ) { return true; } } return new WP_Error( 'rest_cannot_view', __( 'Sorry, you are not allowed to edit posts in this post type.' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** * Retrieves all public post types. * * @since 4.7.0 * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_items( $request ) { if ( $request->is_method( 'HEAD' ) ) { // Return early as this handler doesn't add any response headers. return new WP_REST_Response( array() ); } $data = array(); $types = get_post_types( array( 'show_in_rest' => true ), 'objects' ); foreach ( $types as $type ) { if ( 'edit' === $request['context'] && ! current_user_can( $type->cap->edit_posts ) ) { continue; } $post_type = $this->prepare_item_for_response( $type, $request ); $data[ $type->name ] = $this->prepare_response_for_collection( $post_type ); } return rest_ensure_response( $data ); } /** * Retrieves a specific post type. * * @since 4.7.0 * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_item( $request ) { $obj = get_post_type_object( $request['type'] ); if ( empty( $obj ) ) { return new WP_Error( 'rest_type_invalid', __( 'Invalid post type.' ), array( 'status' => 404 ) ); } if ( empty( $obj->show_in_rest ) ) { return new WP_Error( 'rest_cannot_read_type', __( 'Cannot view post type.' ), array( 'status' => rest_authorization_required_code() ) ); } if ( 'edit' === $request['context'] && ! current_user_can( $obj->cap->edit_posts ) ) { return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit posts in this post type.' ), array( 'status' => rest_authorization_required_code() ) ); } $data = $this->prepare_item_for_response( $obj, $request ); return rest_ensure_response( $data ); } /** * Prepares a post type object for serialization. * * @since 4.7.0 * @since 5.9.0 Renamed `$post_type` to `$item` to match parent class for PHP 8 named parameter support. * * @param WP_Post_Type $item Post type object. * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response Response object. */ public function prepare_item_for_response( $item, $request ) { // Restores the more descriptive, specific name for use within this method. $post_type = $item; // Don't prepare the response body for HEAD requests. if ( $request->is_method( 'HEAD' ) ) { /** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php */ return apply_filters( 'rest_prepare_post_type', new WP_REST_Response( array() ), $post_type, $request ); } $taxonomies = wp_list_filter( get_object_taxonomies( $post_type->name, 'objects' ), array( 'show_in_rest' => true ) ); $taxonomies = wp_list_pluck( $taxonomies, 'name' ); $base = ! empty( $post_type->rest_base ) ? $post_type->rest_base : $post_type->name; $namespace = ! empty( $post_type->rest_namespace ) ? $post_type->rest_namespace : 'wp/v2'; $supports = get_all_post_type_supports( $post_type->name ); $fields = $this->get_fields_for_response( $request ); $data = array(); if ( rest_is_field_included( 'capabilities', $fields ) ) { $data['capabilities'] = $post_type->cap; } if ( rest_is_field_included( 'description', $fields ) ) { $data['description'] = $post_type->description; } if ( rest_is_field_included( 'hierarchical', $fields ) ) { $data['hierarchical'] = $post_type->hierarchical; } if ( rest_is_field_included( 'has_archive', $fields ) ) { $data['has_archive'] = $post_type->has_archive; } if ( rest_is_field_included( 'visibility', $fields ) ) { $data['visibility'] = array( 'show_in_nav_menus' => (bool) $post_type->show_in_nav_menus, 'show_ui' => (bool) $post_type->show_ui, ); } if ( rest_is_field_included( 'viewable', $fields ) ) { $data['viewable'] = is_post_type_viewable( $post_type ); } if ( rest_is_field_included( 'labels', $fields ) ) { $data['labels'] = $post_type->labels; } if ( rest_is_field_included( 'name', $fields ) ) { $data['name'] = $post_type->label; } if ( rest_is_field_included( 'slug', $fields ) ) { $data['slug'] = $post_type->name; } if ( rest_is_field_included( 'icon', $fields ) ) { $data['icon'] = $post_type->menu_icon; } if ( rest_is_field_included( 'supports', $fields ) ) { $data['supports'] = $supports; } if ( rest_is_field_included( 'taxonomies', $fields ) ) { $data['taxonomies'] = array_values( $taxonomies ); } if ( rest_is_field_included( 'rest_base', $fields ) ) { $data['rest_base'] = $base; } if ( rest_is_field_included( 'rest_namespace', $fields ) ) { $data['rest_namespace'] = $namespace; } if ( rest_is_field_included( 'template', $fields ) ) { $data['template'] = $post_type->template ?? array(); } if ( rest_is_field_included( 'template_lock', $fields ) ) { $data['template_lock'] = ! empty( $post_type->template_lock ) ? $post_type->template_lock : false; } $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; $data = $this->add_additional_fields_to_object( $data, $request ); $data = $this->filter_response_by_context( $data, $context ); // Wrap the data in a response object. $response = rest_ensure_response( $data ); if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) { $response->add_links( $this->prepare_links( $post_type ) ); } /** * Filters a post type returned from the REST API. * * Allows modification of the post type data right before it is returned. * * @since 4.7.0 * * @param WP_REST_Response $response The response object. * @param WP_Post_Type $post_type The original post type object. * @param WP_REST_Request $request Request used to generate the response. */ return apply_filters( 'rest_prepare_post_type', $response, $post_type, $request ); } /** * Prepares links for the request. * * @since 6.1.0 * * @param WP_Post_Type $post_type The post type. * @return array Links for the given post type. */ protected function prepare_links( $post_type ) { return array( 'collection' => array( 'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ), ), 'https://api.w.org/items' => array( 'href' => rest_url( rest_get_route_for_post_type_items( $post_type->name ) ), ), ); } /** * Retrieves the post type's schema, conforming to JSON Schema. * * @since 4.7.0 * @since 4.8.0 The `supports` property was added. * @since 5.9.0 The `visibility` and `rest_namespace` properties were added. * @since 6.1.0 The `icon` property was added. * * @return array Item schema data. */ public function get_item_schema() { if ( $this->schema ) { return $this->add_additional_fields_schema( $this->schema ); } $schema = array( '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'type', 'type' => 'object', 'properties' => array( 'capabilities' => array( 'description' => __( 'All capabilities used by the post type.' ), 'type' => 'object', 'context' => array( 'edit' ), 'readonly' => true, ), 'description' => array( 'description' => __( 'A human-readable description of the post type.' ), 'type' => 'string', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'hierarchical' => array( 'description' => __( 'Whether or not the post type should have children.' ), 'type' => 'boolean', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'viewable' => array( 'description' => __( 'Whether or not the post type can be viewed.' ), 'type' => 'boolean', 'context' => array( 'edit' ), 'readonly' => true, ), 'labels' => array( 'description' => __( 'Human-readable labels for the post type for various contexts.' ), 'type' => 'object', 'context' => array( 'edit' ), 'readonly' => true, ), 'name' => array( 'description' => __( 'The title for the post type.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), 'slug' => array( 'description' => __( 'An alphanumeric identifier for the post type.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), 'supports' => array( 'description' => __( 'All features, supported by the post type.' ), 'type' => 'object', 'context' => array( 'edit' ), 'readonly' => true, ), 'has_archive' => array( 'description' => __( 'If the value is a string, the value will be used as the archive slug. If the value is false the post type has no archive.' ), 'type' => array( 'string', 'boolean' ), 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'taxonomies' => array( 'description' => __( 'Taxonomies associated with post type.' ), 'type' => 'array', 'items' => array( 'type' => 'string', ), 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'rest_base' => array( 'description' => __( 'REST base route for the post type.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), 'rest_namespace' => array( 'description' => __( 'REST route\'s namespace for the post type.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), 'visibility' => array( 'description' => __( 'The visibility settings for the post type.' ), 'type' => 'object', 'context' => array( 'edit' ), 'readonly' => true, 'properties' => array( 'show_ui' => array( 'description' => __( 'Whether to generate a default UI for managing this post type.' ), 'type' => 'boolean', ), 'show_in_nav_menus' => array( 'description' => __( 'Whether to make the post type available for selection in navigation menus.' ), 'type' => 'boolean', ), ), ), 'icon' => array( 'description' => __( 'The icon for the post type.' ), 'type' => array( 'string', 'null' ), 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), 'template' => array( 'type' => array( 'array' ), 'description' => __( 'The block template associated with the post type.' ), 'readonly' => true, 'context' => array( 'view', 'edit', 'embed' ), ), 'template_lock' => array( 'type' => array( 'string', 'boolean' ), 'enum' => array( 'all', 'insert', 'contentOnly', false ), 'description' => __( 'The template_lock associated with the post type, or false if none.' ), 'readonly' => true, 'context' => array( 'view', 'edit', 'embed' ), ), ), ); $this->schema = $schema; return $this->add_additional_fields_schema( $this->schema ); } /** * Retrieves the query params for collections. * * @since 4.7.0 * * @return array Collection parameters. */ public function get_collection_params() { return array( 'context' => $this->get_context_param( array( 'default' => 'view' ) ), ); } } Guide complet du casino en ligne – Tout ce que vous devez savoir – Chambers Of Vikramaditya

Guide complet du casino en ligne – Tout ce que vous devez savoir

Guide complet du casino en ligne – Tout ce que vous devez savoir

Les casinos virtuels ont transformé la façon dont les Français s’amusent autour d’une roulette ou d’une machine à sous. En quelques clics, on accède à des centaines de titres, aux promotions les plus alléchantes et à la promesse d’un gain instantané ! Cette démocratisation s’est accélérée grâce aux smartphones puissants et aux connexions haut débit qui permettent de jouer partout, même dans le métro parisien ou sur la terrasse d’un café du Sud‑Ouest.

Pour aider les joueurs à naviguer dans cet univers dense, nous vous présentons un guide structuré autour des critères les plus fiables : licences reconnues, catalogue de jeux varié, offres promotionnelles claires et outils de jeu responsable. Vous y trouverez également un lien vers nouveau casino en ligne afin de comparer rapidement les plateformes recommandées par l’équipe experte de Basketnews.Net, le site de référence pour identifier le meilleur nouveau casino en ligne chaque mois.

Dans les pages qui suivent nous détaillerons comment choisir un site sécurisé, décrypter les bonus sans se faire piéger par le wagering excessif, maîtriser les titres phares comme les slots à haute volatilité ou le blackjack français, adopter une gestion stricte du budget et optimiser l’expérience sur mobile tout en protégeant vos données personnelles.

Choisir le bon nouveau casino en ligne

Critères de licence et régulation

La première barrière à franchir avant d’inscrire votre premier dépôt est la licence du opérateur. Les juridictions les plus respectées sont la Malta Gaming Authority (MGA), la UK Gambling Commission (UKGC) et Curaçao eGaming ; chacune impose des exigences différentes concernant la protection des joueurs et la transparence financière. Sur le site officiel du régulateur vous pouvez vérifier l’immatriculation grâce au numéro d’autorisation affiché dans le pied‑de‑page du casino : il suffit d’entrer ce code dans leur moteur de recherche public pour confirmer son authenticité.\n\nLes licences MGA ou UKGC garantissent généralement un audit RNG mensuel réalisé par eCOGRA ou iTech Labs ; ces certifications assurent que chaque tirage aléatoire suit strictement le protocole « Random Number Generator ». Un label eCOGRA ajouté aux pages « À propos » est donc un gage sérieux que le jeu n’est pas truqué.\n\n### Sélection des jeux et fournisseurs

Un bon catalogue repose sur des partenariats avec les studios leaders : NetEnt offre Starburst et Gonzo’s Quest, Microgaming propose Mega Moolah avec son jackpot progressif record de plusieurs dizaines de millions d’euros, tandis que Evolution Gaming anime les tables live avec vrais croupiers francophones.\n\nLa diversité compte autant que la qualité : recherchez des machines à sous modernes dotées d’au moins cinq rouleaux, jusqu’à quatre cent vingt‑et‑un lignes payantes (« paylines ») et un RTP moyen supérieur à 96 %. Les variantes classiques comme le blackjack français ou la roulette européenne doivent être visibles dès l’écran principal afin que vous ne perdiez pas de temps à fouiller dans les menus.\n\nAnalyse des méthodes de paiement sécurisées & temps de retrait

Les options bancaires varient selon la zone géographique mais trois familles restent incontournables : cartes Visa/MasterCard®, porte‑feuilles électroniques tels que Skrill ou Neteller, puis cryptomonnaies comme Bitcoin qui offrent parfois zéro frais transactionnel.\n\nEn général une demande de retrait par carte bancaire est traitée sous 24–48 heures ouvrées ; les portefeuilles électroniques peuvent créditer votre compte immédiatement alors que les crypto‑débits demandent quelques confirmations blockchain supplémentaires mais restent rapides.\n\nComparaison rapide des plateformes mobiles vs desktop

Fonctionnalité Mobile Desktop
Temps moyen d’accès < 2 secondes après tap < 1 seconde après clic
Qualité graphique Optimisée HTML5 / résolution auto Résolution native full HD
Navigation Gestes tactile + menu simplifié Menus déroulants + raccourcis clavier
Support client Chat intégré + notifications push Chat web + FAQ étendue

En pratique, si votre priorité est l’ergonomie instantanée lors d’une pause déjeuner courte, choisissez une application native recommandée par Basketnews.Net ; si vous jouez pendant plusieurs heures depuis votre salon il est préférable d’utiliser la version desktop pour profiter pleinement du tableau complet des statistiques RTP.

Comprendre les bonus et promotions offertes

Le paysage promotionnel diffère sensiblement entre chaque nouveau casino en ligne France ; voici comment ne pas se perdre parmi tant d’offres scintillantes :

  • Welcome bonus – généralement un match up to €1000 + 200 tours gratuits sur Starburst.
  • Dépo‑match – souvent proposé chaque semaine sur deux dépôts consécutifs avec multipliers variant entre x50% и x100%.
  • Cash‑back – remboursement quotidien allant jusqu’à 15 % sur vos pertes nettes pendant une période donnée.
  • Bonus sans dépôt – petite somme (€10–€20) créditée immédiatement après inscription sans exigence financière préliminaire ; idéal pour tester une plateforme avant tout engagement réel.« 

Les conditions cachées sont surtout liées au wagering : il faut multiplier le montant reçu par un facteur compris entre 20x et 40x selon la politique du site avant pouvoir retirer quoi que ce soit.
Par exemple un bonus « €50 + 30 tours gratuits » avec wagering x30 signifie qu’il faut générer €1500 en volume misé avant toute liquidation.\n\nCertains programmes VIP transforment chaque euro misé en points cumulables qui débloquent progressivement cash back supplémentaire, invitations à des tournois privés voire voyages tout frais payés vers Las Vegas.
Monter dans ces rangs requiert généralement au moins €5000 dépensés sur six mois — chiffre indiqué clairement dans l’accord VIP disponible sur chaque page “Programme fidélité”.\n\nEnfin gardez toujours un œil sur les dates limites : beaucoup d’offres récurrentes expirent après sept jours calendaires suivant l’activation du bonus.

Maîtriser les jeux phares des casinos en ligne

Les machines à sous modernes

Les slots se déclinent aujourd’hui entre deux pôles opposés : haute volatilité (Dead or Alive II) où rares gains explosifs peuvent atteindre plusieurs milliers fois votre mise initiale versus faible volatilité (Blood Suckers) offrant fréquemment petits paiements mais stables.\n\nLe RTP moyen varie selon la catégorie : slots classiques ≈97 %, slots vidéo ≈96 %, jackpots progressifs peuvent descendre jusqu’à94 %. Avant chaque session consultez le tableau statistique fourni par le développeur – souvent accessible via l’icône “Info” située sous le champ “Mise”.\n\nUn conseil concret : commencez toujours par miser une unité minimale puis augmentez progressivement uniquement lorsque votre bankroll dépasse cinq fois cette mise afin d’atténuer l’effet brutal d’une séquence perdante.\n\n### Les jeux de table classiques

Blackjack français utilise le système “la partage” où votre main vaut neuf ou dix peut être séparée immédiatement – cela diminue légèrement l’avantage maison à environ 0·42 %. La stratégie basique recommande notamment « stand on hard 17 » contre un croupier montrant un As.\n\nEn roulette européenne, seul zéro unique existe ; cela ramène l’avantage maison à 2·7 % contre 5·26 % pour sa version américaine qui comporte double zéro.
Parier « voisinage plein » sur trois numéros adjacents augmente vos chances globales sans changer drastiquement la mise totale.\n\nBaccarat reste simple : misez toujours « banker » car elle possède un edge≈1·06 % contre « player »≈1·24 %. Le craps n’est pas très répandu chez tous les opérateurs mais certaines salles live proposent « Pass Line » où une bonne compréhension du tirage initial maximise vos chances dès le premier lancer.\n\nStratégies rapides pour le vidéo poker & bingo → VPK Jacks or Better conseille “draw four low cards” lorsqu’un pair déjà présent assure ≥99 % RTP ; quant au bingo online , privilégiez les parties à tickets multiples pour augmenter vos probabilités globales sans trop dépenser. »

Ces astuces permettent aux amateurs éclairés d’améliorer leurs performances sans devoir devenir mathématiciens chevronnés.

Jouer responsablement et gérer son budget

Fixer une bankroll réaliste

Adoptez dès votre première session une méthode dite unit betting™ : choisissez une unité équivalente à 1 % voire 2 % de votre capital total dédié au jeu.
Si vous disposez d’un budget mensuel €500 , limitez chaque mise individuelle autour €5–10 selon le type de jeu choisi.
Appliquez ensuite la règle stricte du “20 %” quotidien : ne jamais engager plus qu’un cinquième maximum prévu pour cette journée afin éviter toute perte catastrophique accumulée.\n\n### Outils d’auto‑exclusion et limites personnalisées

La plupart des sites évalués par Basketnews.Net offrent directement dans leur rubrique “responsabilité” trois leviers essentiels :

  • Limite dépôt quotidienne / hebdomadaire fixable via votre profil client.
  • Plafond perte journalier qui bloque automatiquement toutes nouvelles mises dès atteinte.
  • Fonction auto‑block temporel activable après X pertes consécutives – typiquement cinq mains perdues au blackjack déclenchent une pause obligatoire de trente minutes.\n>`Exemple concret` : Jean configure son compte avec stop loss €100 ; après avoir perdu €100 lors d’une soirée poker il voit immédiatement son accès suspendu pendant trente minutes puis doit valider manuellement sa volonté reconduire.*

Ces paramètres permettent ainsi aux joueurs impulsifs voire anxieux garder toujours contrôle dessus leurs comportements compulsifs.\n\nReconnaître les signes d’addiction & ressources d’aide → Les indicateurs majeurs comprennent insomnie récurrente liée aux sessions nocturnes prolongées , dépenses croissantes malgré perte continue , irritabilité quand on ne peut pas jouer.\nPour ceux qui sentent ces signaux apparaître il existe plusieurs organisations francophones telles que SNAAPF+, Gamblers Anonymous France ou encore La Fédération Française Jeux Responsable qui proposent lignes téléphoniques gratuites ainsi qu’un accompagnement psychologique confidentiel.

Optimiser son expérience mobile & sécuriser ses données

Le jeu depuis smartphone offre aujourd’hui davantage qu’une simple commodité ; il devient véritablement stratégique grâce aux notifications push annonçant offres exclusives réservées aux appareils mobiles seulement.
Les applications natives publiées officiellement sur Google Play Store ou Apple App Store utilisent souvent une couche supplémentaire WebGL permettant fluidité supérieure comparée aux navigateurs HTML5 standards où certains effets visuels demeurent limités.\n\nSécurité mobile repose principalement sur deux piliers :

  • Chiffrement SSL/TLS avancé appliqué bout­en­bout entre votre appareil et celui du serveur Casino.
  • Authentification multifacteur via Google Authenticator ou SMS vérifiant chaque connexion nouvelle depuis un dispositif inconnu.\nCes mécanismes sont explicitement décrits dans chaque politique RGPD affichée par nos partenaires évalués comme fiables chez Basketnews.Net.\n\nLorsque vous jouez hors connexion — situation possible grâce au mode offline temporaire offert par certains fournisseurs — vos mises restent stockées localement sous forme chiffrée puis synchronisées automatiquement dès récupération réseau stable via cloud sécurisé certifié ISO27001 .\n\nEnfin quelques conseils pratiques évitent mauvaises surprises liées aux malwares :

  • N’installez jamais aucune application tierce provenant hors store officiel.

  • Maintenez OS Android/iOS ainsi toutes applications bancaires régulièrement mises à jour.
  • Activez uniquement Wi‑Fi sécurisé plutôt qu’un hotspot public non protégé lors du login au compte joueur.

Conclusion

Choisir judicieusement son site repose désormais moins sur l’éclat publicitaire que sur trois critères indiscutables : licence fiable délivrée par une autorité reconnue tel que MGA ou UKGC, compréhension fine tantôt complexe tantôt simple des conditions attachées aux différents bonus proposés ainsi qu’une gestion disciplinée voire automatisée du capital engagé.​ En respectant ces principes fondamentaux vous maximisez non seulement vos chances financières mais surtout assurez une expérience ludique saine et durable.​

Nous vous invitons donc vivement à revisiter régulièrement Basketnews.Net afin demeurer informé(e) des dernières nouveautés concernant tout nouveau casino en ligne français ainsi que leurs évaluations indépendantes – parce qu’un pari gagnant repose avant tout sur un choix éclairé basé sur confiance maximale.​

Leave a Comment

Your email address will not be published. Required fields are marked *