Intelligence sur le marché de l'emploi

Avancé

Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 30 nœuds.Utilise principalement des nœuds comme If, Code, Wait, Telegram, HttpRequest. Faire correspondre les offres d'emploi Indeed à votre CV avec Gemini AI et des alertes Telegram

Prérequis
  • Token Bot Telegram
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Clé API Google Gemini
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "potYDGdhPXDUMhZj",
  "meta": {
    "instanceId": "e2a1d0ec98fd0994972a016020dcf90b56d31fa85f2abd02801701fb8fc45e3d",
    "templateCredsSetupCompleted": true
  },
  "name": "Job Market Intelligence",
  "tags": [],
  "nodes": [
    {
      "id": "7ef43820-825a-4e94-a9f2-483376e79768",
      "name": "Lors du clic sur 'Exécuter le workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1376,
        96
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "26c1fd7c-423c-4b36-984b-f4603ea4f1b9",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        -1152,
        96
      ],
      "parameters": {
        "url": "https://api.browseract.com/v2/workflow/run-task",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "workflow_id",
              "value": "52804638608646754"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "x2SDklVkEIBFM56U",
          "name": "BrowserACtaPi"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "id": "3d4b822a-435b-4894-8b39-ca10e4d0140d",
      "name": "HTTP Request1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -672,
        80
      ],
      "parameters": {
        "url": "https://api.browseract.com/v2/workflow/get-task",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "=task_id",
              "value": "={{ $json.id }}"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "x2SDklVkEIBFM56U",
          "name": "BrowserACtaPi"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5550b6de-13b4-4cde-841f-b346cde3f8fe",
      "name": "Attendre",
      "type": "n8n-nodes-base.wait",
      "position": [
        -416,
        352
      ],
      "webhookId": "bb2c5339-e061-499b-9b16-d48f649e6fb9",
      "parameters": {
        "unit": "minutes",
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "70406173-a3d9-4db7-a370-c9bb997800c1",
      "name": "Attendre1",
      "type": "n8n-nodes-base.wait",
      "position": [
        -960,
        352
      ],
      "webhookId": "7593e4d6-e23f-482b-9f7b-d0a24461b3ea",
      "parameters": {
        "unit": "minutes",
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "295fedba-bc49-451a-8b9c-b0dda75e5b51",
      "name": "Si",
      "type": "n8n-nodes-base.if",
      "position": [
        -960,
        96
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "d48ae258-78a0-4b26-923d-2643b6b774c6",
              "operator": {
                "type": "object",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.error }}",
              "rightValue": ""
            },
            {
              "id": "3967a169-8432-45bd-8f89-08795fd12679",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": "null"
            }
          ]
        }
      },
      "retryOnFail": false,
      "typeVersion": 2.2
    },
    {
      "id": "da4a5db4-a2f2-40e7-ae6a-3f46e820fbf3",
      "name": "Si1",
      "type": "n8n-nodes-base.if",
      "position": [
        -400,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "0347a2a2-eb32-414d-9494-4e648078cf40",
              "operator": {
                "type": "object",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.error }}",
              "rightValue": ""
            },
            {
              "id": "99f31959-6f27-40dd-97c3-6ff611da1e0b",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "finished"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "8fc50c6f-8501-49ce-b697-04fa9210ef2a",
      "name": "Envoyer un message texte",
      "type": "n8n-nodes-base.telegram",
      "position": [
        32,
        432
      ],
      "webhookId": "f60ccf5f-b6e2-4d06-8c99-9ae53bde267d",
      "parameters": {
        "text": "=Title: {{ $json.text.Title }}\nSummary :{{ $json.text.Summary }}\nNeeds: {{ $json.text.Needs }}\nEducarion: {{ $json.text.Education }}\n{{ $json.text.Link }}",
        "chatId": "@Test",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "id": "34LCOs7mfDx5vkSV",
          "name": "Telegram account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7fa00942-1d87-44a9-8618-b0d7a4546bb2",
      "name": "Code en JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        -144,
        432
      ],
      "parameters": {
        "jsCode": "// Get the original list from the 'Request' key in the incoming data.\nconst originalList =$input.first().json.output.Request ;\n\n// Create a new array to store the formatted output.\nconst outputItems = [];\n\n// Loop through each item in the original list.\nfor (const item of originalList) {\n  // For each item, create a new object in the desired format.\n  outputItems.push({\n    json: {\n      \"text\": item\n    }\n  });\n}\n\n// Return the new list of formatted objects.\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "5f67b9c3-845f-451b-a314-3ecfbe06d4ef",
      "name": "Agent IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -144,
        64
      ],
      "parameters": {
        "text": "=hello this is my resume \n\n\"\nAge: 30\nExperience: 15 years in programming\nSenior Software Engineer\nEducation: Bachlore in Front-end and Back-end Software engineering \nGender: male\nabilities :Product development, innovation in Human Risk Management.\nSeeking a programming job in financial advising can work remot.\n\"\n\nfrom the  {{ $json.output.string }} add all the job offers which matches my resume to output the output structure is List of texts that looks like this\n\nformat_final_json_response = {\n  \"Request\": [\n    {\n      \"Title\": \"Title\",\n      \"Summary\": \"About\",\n      \"Needs\": \"Needs\",\n      \"Education\": \"degree\",\n      \"Link\": \"Link\"\n    }\n  ]\n}\n\nRemove duplicated offers (if company name and job title is same)\n\n\nfollow the Output exacly and also if no job is avalble add this sned this to output\n\n{\n  \"Request\": [\n    {\n      \"Title\": \"No job Found\",\n      \"Summary\": \"No luck today\",\n      \"Needs\": \"No luck today\",\n      \"Education\": \"No luck today\",\n      \"Link\": \"im so sry to say that no job is aviable for you\"\n    }\n  ]\n}",
        "options": {},
        "promptType": "define",
        "needsFallback": true,
        "hasOutputParser": true
      },
      "typeVersion": 2.2,
      "alwaysOutputData": false
    },
    {
      "id": "4aa9cc49-cc7b-46b0-aa75-04c21be931ac",
      "name": "Analyseur de Sortie Structurée",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        144,
        288
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"Request\": [\n    {\n      \"Title\": \"Title\",\n      \"Summary\": \"About\",\n      \"Needs\": \"Needs\",\n      \"Education\": \"degree\",\n      \"Link\": \"Link\"\n    }\n  ]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "7996bea7-6736-4a77-8fb8-a4f7fdfa9618",
      "name": "Note-Introduction",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        -112
      ],
      "parameters": {
        "width": 592,
        "height": 424,
        "content": "## Try It Out!\n### This n8n template helps you stay on top of the job market by matching scraped job offers with your resume using an AI Agent.\n\n### How it works\n* The workflow is triggered manually You Can make it Automatic too.\n* An **HTTP Request** node starts a web scraping task with the **BrowserAct** API to collect job offers.\n* A series of **If** and **Wait** nodes monitor the scraping job until it's finished.\n* An **AI Agent** node, powered by **Google Gemini**, processes the job listings and filters them to find matches for your resume. It's configured to output the results in a specific format.\n* A **Code** node then transforms the AI's output into a clean format.\n* Finally, the filtered job offers are sent directly to you via **Telegram**.\n\n### Requirements\n* **BrowserAct** API account for web scraping\n* **Gemini** account for the AI Agent\n* **BrowserAct** **“Job Market Intelligence”** Template\n* **Telegram** credentials for sending messages\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/UpnCKd7GaU) or Visit Our [Blog](https://www.browseract.com/blog)!\n"
      },
      "typeVersion": 1
    },
    {
      "id": "647dc8d1-a1f3-436c-bf7e-8d516d183f61",
      "name": "Note-Attente",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        -112
      ],
      "parameters": {
        "color": 5,
        "width": 496,
        "height": 180,
        "content": "## 2. Wait for Scraping to Finish\n\nThese nodes check the status of the scraping task. The `If` node determines if the task is complete. If it's still running, the `Wait` node pauses the workflow for a set period before retrying to check the status."
      },
      "typeVersion": 1
    },
    {
      "id": "42f4cafd-5070-4793-bca9-7e4590a88dd2",
      "name": "Note-IA",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        -112
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "content": "## 3. Use an AI Agent to Find Matching Jobs\n\nThis node uses an AI Agent to find the best job offers for you. It takes the scraped data and your resume, then processes them to find matching jobs. It's configured with a **Structured Output Parser** to ensure the results are always in the correct format.\n\n### Don't forget to Connect your Gemini and Change your resume. "
      },
      "typeVersion": 1
    },
    {
      "id": "6c541147-4d4c-464c-87c5-b55e1333ce06",
      "name": "Note-Notifications",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        576
      ],
      "parameters": {
        "color": 3,
        "width": 512,
        "height": 164,
        "content": "## 4. Send Notifications\n\nThe scraped data is sometimes hard to read. A **Code** node is used here to transform the AI's output into a more readable format. The **Telegram** node then sends the final, filtered job offers directly to you.\n\n### Don't forget to Connect your Telegram and add your Channel ID. "
      },
      "typeVersion": 1
    },
    {
      "id": "f4331db0-9b93-416f-9137-0672798a4cc0",
      "name": "Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        80
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 480,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "7eca99df-860c-409f-bdfb-50150543e302",
      "name": "Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        80
      ],
      "parameters": {
        "color": 5,
        "width": 496,
        "height": 480,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "0edbea28-d451-4a41-8adb-4fd2ea485749",
      "name": "Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        64
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "height": 336,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "b257da41-e8ba-44a0-9aed-bd7479f7019e",
      "name": "Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        416
      ],
      "parameters": {
        "color": 3,
        "width": 512,
        "height": 144,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "57e7a01d-500e-4a54-a32a-88dfdceafb80",
      "name": "Note-Mode d'Emploi",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        320
      ],
      "parameters": {
        "width": 592,
        "height": 216,
        "content": "## How to use\n\n1.  **Set up Credentials:** Add your credentials for **BrowserAct**, **Google Gemini**, and **Telegram** to the workflow. They will be used by the relevant nodes.\n2.  **Set up BrowserAct:** In your **BrowserAct** account, Use **Job Market Intelligence** Template and setup your own template.\n3.  **Add WorkFlow ID:** change the **workflow_id** value inside the **Run WorkFlow** node.\n4.  **Activate Workflow:** To enable the automated schedule, simply activate the workflow. You can also manually trigger it by clicking the 'Execute Workflow' button to test it."
      },
      "typeVersion": 1
    },
    {
      "id": "d2e3a14c-401d-4abd-98c7-7eb4213c277e",
      "name": "Note-Mode d'Emploi1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        544
      ],
      "parameters": {
        "width": 592,
        "height": 104,
        "content": "## Need Help ?\n*  [How to Find Your BrowseAct API Key & Workflow ID](https://www.youtube.com/watch?v=pDjoZWEsZlE)\n* [How to Connect n8n to Browseract](https://www.youtube.com/watch?v=RoYMdJaRdcQ)\n* [How to Use & Customize BrowserAct Templates](https://www.youtube.com/watch?v=CPZHFUASncY)\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "adf794f6-842f-43d0-bc6f-fcaada21bd28",
      "name": "Note-Mode d'Emploi2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1952,
        -384
      ],
      "parameters": {
        "color": 7,
        "width": 2208,
        "height": 112,
        "content": "\n### ******** \n##   Create BrowserAct Workflow -> Add BrowserAct Token to \"Run Node\" -> Change BrowserAct workflow_id in \"Run Node\" -> Connect Gemini & Change you **resume** inside the prompt in \"Agent Node\" \n##  -> Config Telegram Token & Channel ID in \"Send Node\""
      },
      "typeVersion": 1
    },
    {
      "id": "8b7e2e56-cad5-47a2-9723-e4395e733332",
      "name": "Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1104,
        -208
      ],
      "parameters": {
        "color": 5,
        "width": 182,
        "height": 80,
        "content": "## \n# Run Node"
      },
      "typeVersion": 1
    },
    {
      "id": "ea4b3404-9c9e-4823-be35-272afd16c061",
      "name": "Note-Web Scraping",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        -112
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 180,
        "content": "## 1. Trigger the Job Scraper\n\nThis workflow uses an HTTP Request to start a job scraping task via the BrowserAct API. This allows you to collect up-to-date job market data.\n\n### Don't forget to add your BrowserAct Workflow ID. "
      },
      "typeVersion": 1
    },
    {
      "id": "1a24b054-be51-4a4d-9739-19d1f63acdc2",
      "name": "Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        -208
      ],
      "parameters": {
        "color": 5,
        "width": 182,
        "height": 80,
        "content": "## \n# Get Node"
      },
      "typeVersion": 1
    },
    {
      "id": "537e59bb-3129-4bf6-9eaa-67d0ba38d118",
      "name": "Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -208
      ],
      "parameters": {
        "color": 4,
        "width": 230,
        "height": 80,
        "content": "## \n# Agent Node"
      },
      "typeVersion": 1
    },
    {
      "id": "b83141c8-1966-4bd0-aa14-871f44a9e42d",
      "name": "Gemini Backup",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -16,
        288
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.0-flash"
      },
      "credentials": {
        "googlePalmApi": {
          "id": "G8YK0DTLFGi5n0WD",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "da5033b2-0eca-4411-8b79-01742fff27e0",
      "name": "Gemini",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -144,
        288
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "G8YK0DTLFGi5n0WD",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "39563737-09ba-44bf-9ca5-1f072d96daf1",
      "name": "Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        752
      ],
      "parameters": {
        "color": 3,
        "width": 214,
        "height": 80,
        "content": "## \n# Send Node"
      },
      "typeVersion": 1
    },
    {
      "id": "0bc096fe-fa91-4326-873c-d594cbe63b2e",
      "name": "Note-Mode d'Emploi3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        656
      ],
      "parameters": {
        "width": 592,
        "height": 80,
        "content": "## Watch Workflow Guidance and Showcase\n* #### [Never Manually Search for a Job Again (AI Automation Tutorial)](https://youtu.be/mRJw8Jyrizg)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "b4d6b1aa-9052-4a52-8b0b-2d868cf88a37",
  "connections": {
    "295fedba-bc49-451a-8b9c-b0dda75e5b51": {
      "main": [
        [
          {
            "node": "3d4b822a-435b-4894-8b39-ca10e4d0140d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "70406173-a3d9-4db7-a370-c9bb997800c1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "da4a5db4-a2f2-40e7-ae6a-3f46e820fbf3": {
      "main": [
        [
          {
            "node": "5f67b9c3-845f-451b-a314-3ecfbe06d4ef",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "5550b6de-13b4-4cde-841f-b346cde3f8fe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5550b6de-13b4-4cde-841f-b346cde3f8fe": {
      "main": [
        [
          {
            "node": "3d4b822a-435b-4894-8b39-ca10e4d0140d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "70406173-a3d9-4db7-a370-c9bb997800c1": {
      "main": [
        [
          {
            "node": "26c1fd7c-423c-4b36-984b-f4603ea4f1b9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "da5033b2-0eca-4411-8b79-01742fff27e0": {
      "ai_languageModel": [
        [
          {
            "node": "5f67b9c3-845f-451b-a314-3ecfbe06d4ef",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "5f67b9c3-845f-451b-a314-3ecfbe06d4ef": {
      "main": [
        [
          {
            "node": "7fa00942-1d87-44a9-8618-b0d7a4546bb2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "26c1fd7c-423c-4b36-984b-f4603ea4f1b9": {
      "main": [
        [
          {
            "node": "295fedba-bc49-451a-8b9c-b0dda75e5b51",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b83141c8-1966-4bd0-aa14-871f44a9e42d": {
      "ai_languageModel": [
        [
          {
            "node": "5f67b9c3-845f-451b-a314-3ecfbe06d4ef",
            "type": "ai_languageModel",
            "index": 1
          }
        ]
      ]
    },
    "3d4b822a-435b-4894-8b39-ca10e4d0140d": {
      "main": [
        [
          {
            "node": "da4a5db4-a2f2-40e7-ae6a-3f46e820fbf3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7fa00942-1d87-44a9-8618-b0d7a4546bb2": {
      "main": [
        [
          {
            "node": "8fc50c6f-8501-49ce-b697-04fa9210ef2a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4aa9cc49-cc7b-46b0-aa75-04c21be931ac": {
      "ai_outputParser": [
        [
          {
            "node": "5f67b9c3-845f-451b-a314-3ecfbe06d4ef",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "7ef43820-825a-4e94-a9f2-483376e79768": {
      "main": [
        [
          {
            "node": "26c1fd7c-423c-4b36-984b-f4603ea4f1b9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Création de contenu, IA Multimodale

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds30
Catégorie2
Types de nœuds10
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Madame AI Team | Kai

Madame AI Team | Kai

@madame-ai

I’m a PhD in Physics turned AI enthusiast, passionate about uncovering how AI is transforming content creation, business, and daily life.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34